From 16dc363f7718f96063d15f77eecf3db8a19789cc Mon Sep 17 00:00:00 2001
From: Karl Berry
Date: Sat, 2 May 2020 21:00:47 +0000
Subject: luaotfload (2may20)
git-svn-id: svn://tug.org/texlive/trunk@54971 c570f23f-e606-0410-a88d-b1316a301751
---
Master/texmf-dist/doc/luatex/luaotfload/NEWS | 18 +
Master/texmf-dist/doc/luatex/luaotfload/README.md | 11 +-
.../texmf-dist/doc/luatex/luaotfload/filegraph.pdf | Bin 39847 -> 39877 bytes
.../doc/luatex/luaotfload/luaotfload-conf.pdf | Bin 77323 -> 77392 bytes
.../doc/luatex/luaotfload/luaotfload-latex.pdf | Bin 443581 -> 445884 bytes
.../doc/luatex/luaotfload/luaotfload-latex.tex | 4 +-
.../doc/luatex/luaotfload/luaotfload-main.tex | 36 +-
.../doc/luatex/luaotfload/luaotfload-tool.pdf | Bin 76686 -> 76849 bytes
.../doc/luatex/luaotfload/luaotfload-tool.rst | 7 +-
.../doc/luatex/luaotfload/luaotfload.conf.rst | 4 +-
.../doc/luatex/luaotfload/scripts-demo.pdf | Bin 21523 -> 21523 bytes
.../doc/luatex/luaotfload/shaper-demo-graphite.pdf | Bin 8487 -> 8487 bytes
.../doc/luatex/luaotfload/shaper-demo.pdf | Bin 8411 -> 8411 bytes
Master/texmf-dist/doc/man/man1/luaotfload-tool.1 | 7 +-
.../doc/man/man1/luaotfload-tool.man1.pdf | Bin 44157 -> 43727 bytes
Master/texmf-dist/doc/man/man5/luaotfload.conf.5 | 2 +-
.../doc/man/man5/luaotfload.conf.man5.pdf | Bin 45068 -> 44571 bytes
.../scripts/luaotfload/luaotfload-tool.lua | 140 +-
.../luaotfload/fontloader-reference-load-order.lua | 4 +-
.../luatex/luaotfload/fontloader-2020-01-26.lua | 34402 --------------
.../luatex/luaotfload/fontloader-2020-04-30.lua | 34518 ++++++++++++++
.../luatex/luaotfload/fontloader-basics-gen.lua | 2 +-
.../luatex/luaotfload/fontloader-basics-nod.lua | 93 +-
.../tex/luatex/luaotfload/fontloader-font-cff.lua | 9 +
.../tex/luatex/luaotfload/fontloader-font-con.lua | 1 +
.../tex/luatex/luaotfload/fontloader-font-dsp.lua | 57 +-
.../tex/luatex/luaotfload/fontloader-font-map.lua | 264 +-
.../tex/luatex/luaotfload/fontloader-font-ocl.lua | 6 +-
.../tex/luatex/luaotfload/fontloader-font-osd.lua | 97 +-
.../tex/luatex/luaotfload/fontloader-font-ota.lua | 116 +-
.../tex/luatex/luaotfload/fontloader-font-otj.lua | 61 +-
.../tex/luatex/luaotfload/fontloader-font-otl.lua | 5 +-
.../tex/luatex/luaotfload/fontloader-font-ots.lua | 140 +-
.../tex/luatex/luaotfload/fontloader-font-oup.lua | 59 -
.../tex/luatex/luaotfload/fontloader-l-table.lua | 106 +-
.../tex/luatex/luaotfload/fontloader-reference.lua | 542 +-
.../tex/luatex/luaotfload/fontloader-util-str.lua | 7 +-
.../tex/luatex/luaotfload/luaotfload-auxiliary.lua | 10 +-
.../luatex/luaotfload/luaotfload-characters.lua | 45838 +++++++++++--------
.../tex/luatex/luaotfload/luaotfload-colors.lua | 276 +-
.../luatex/luaotfload/luaotfload-configuration.lua | 79 +-
.../tex/luatex/luaotfload/luaotfload-database.lua | 244 +-
.../luatex/luaotfload/luaotfload-diagnostics.lua | 66 +-
.../tex/luatex/luaotfload/luaotfload-embolden.lua | 17 +-
.../tex/luatex/luaotfload/luaotfload-fallback.lua | 14 +-
.../tex/luatex/luaotfload/luaotfload-features.lua | 40 +-
.../tex/luatex/luaotfload/luaotfload-filelist.lua | 6 +-
.../tex/luatex/luaotfload/luaotfload-glyphlist.lua | 4 +-
.../luatex/luaotfload/luaotfload-harf-define.lua | 147 +-
.../tex/luatex/luaotfload/luaotfload-harf-plug.lua | 138 +-
.../tex/luatex/luaotfload/luaotfload-init.lua | 39 +-
.../luatex/luaotfload/luaotfload-letterspace.lua | 32 +-
.../tex/luatex/luaotfload/luaotfload-loaders.lua | 34 +-
.../tex/luatex/luaotfload/luaotfload-log.lua | 32 +-
.../tex/luatex/luaotfload/luaotfload-main.lua | 69 +-
.../luatex/luaotfload/luaotfload-multiscript.lua | 153 +-
.../tex/luatex/luaotfload/luaotfload-notdef.lua | 231 +-
.../tex/luatex/luaotfload/luaotfload-parsers.lua | 45 +-
.../tex/luatex/luaotfload/luaotfload-resolvers.lua | 18 +-
.../tex/luatex/luaotfload/luaotfload-scripts.lua | 4 +-
.../tex/luatex/luaotfload/luaotfload-status.lua | 95 +-
.../tex/luatex/luaotfload/luaotfload-suppress.lua | 89 +
.../tex/luatex/luaotfload/luaotfload-szss.lua | 226 +
.../tex/luatex/luaotfload/luaotfload-tounicode.lua | 4 +-
.../tex/luatex/luaotfload/luaotfload-unicode.lua | 4 +-
.../tex/luatex/luaotfload/luaotfload.sty | 2 +-
66 files changed, 62539 insertions(+), 56135 deletions(-)
delete mode 100644 Master/texmf-dist/tex/luatex/luaotfload/fontloader-2020-01-26.lua
create mode 100644 Master/texmf-dist/tex/luatex/luaotfload/fontloader-2020-04-30.lua
create mode 100644 Master/texmf-dist/tex/luatex/luaotfload/luaotfload-suppress.lua
create mode 100644 Master/texmf-dist/tex/luatex/luaotfload/luaotfload-szss.lua
(limited to 'Master')
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/NEWS b/Master/texmf-dist/doc/luatex/luaotfload/NEWS
index 07855af5016..501af67e471 100644
--- a/Master/texmf-dist/doc/luatex/luaotfload/NEWS
+++ b/Master/texmf-dist/doc/luatex/luaotfload/NEWS
@@ -1,5 +1,23 @@
Change History
--------------
+2020-05-01 luaotfload v3.13
+ * A problem with text fonts with minimal math table has been fixed (issue 148.)
+ In new luaotfload versions, math parameters will only be loaded for fonts with `script=math`.
+ If you do want to set math parameters for fonts with other scripts, add `-nomathparam`.
+ We strongly recommend against setting math parameters for text fonts because
+ these would overwrite parameters from actual math fonts.
+ * A bug in harf-mode that could lead to missing chars and freezing was corrected (issue 141).
+ * A font size problem in harf-mode has been fixed (issue 147).
+ * An error if the main function was called twice has been fixed (issue 145).
+ * Allow .ttf fonts to be loaded with a map file with luahbtex (issue 142) (issue 143).
+ * Fonts installed for a single user on windows are now found (issue 138).
+ * A problem with wrong \TeX-ligatures in harf mode has been fixed (issue 139).
+ * The debugging output has been changed (issue 131).
+ * a missing U+1E9E (Capital ß) in a font is replaced by
+ SS instead of giving a missing character.
+ * extended the color handling to be compatible with the luacolor package
+ * sync with context files from 2020-04-30
+
2020-02-02 luaotfload v3.12
* new experimental feature multiscript
* new experimental feature fallback
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/README.md b/Master/texmf-dist/doc/luatex/luaotfload/README.md
index 94a315839b4..91d1d45acf9 100644
--- a/Master/texmf-dist/doc/luatex/luaotfload/README.md
+++ b/Master/texmf-dist/doc/luatex/luaotfload/README.md
@@ -1,8 +1,8 @@
# The Luaotfload Package
-VERSION: 3.12
+VERSION: 3.13
-DATE: 2020-02-02
+DATE: 2020-05-01
## Description
@@ -23,10 +23,9 @@ Please see the documentation luaotfload.pdf for more information.
## Maintenance
This package is currently maintained at
-.
+.
-Issues can be reported at the issue tracker or at the old issue tracker on
-.
+Issues can be reported at the issue tracker.
The development for LuaLaTeX is discussed on the lualatex-dev mailing list. See
for details.
@@ -58,7 +57,7 @@ The following people have contributed to this package.
If you want to install manually: there is a tds-zip file which can be unpacked in a texmf tree.
2. If you want to try the development version download the texmf folder in the development branch.
- at
+ at
3. Manual installation:
* luaotfload-tool.lua belongs in scripts/luatex/luaotfload
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/filegraph.pdf b/Master/texmf-dist/doc/luatex/luaotfload/filegraph.pdf
index d6202804f9a..76c5754744f 100644
Binary files a/Master/texmf-dist/doc/luatex/luaotfload/filegraph.pdf and b/Master/texmf-dist/doc/luatex/luaotfload/filegraph.pdf differ
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-conf.pdf b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-conf.pdf
index 0bc208e735e..1e112f413f6 100644
Binary files a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-conf.pdf and b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-conf.pdf differ
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.pdf b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.pdf
index f374e6db898..673ae5f9765 100644
Binary files a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.pdf and b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.pdf differ
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.tex b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.tex
index cdcb26e26e0..dcf65078812 100644
--- a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.tex
+++ b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.tex
@@ -311,7 +311,7 @@
"NotoColorEmoji:mode=harf;"
}
)
- }
+ }
\def \listingpar {\endgraf}
\let \endlistingline \relax
@@ -540,7 +540,7 @@ function printctxfontlist ()
end
\end{luacode}
-
+\newcommand\gitissue[1]{\href{https://github.com/latex3/luaotfload/issues/#1}{(issue~\##1)}}
\begin {document}
\input {luaotfload-main.tex}
\clearpage
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-main.tex b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-main.tex
index 79d7411b209..91983354bc4 100644
--- a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-main.tex
+++ b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-main.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2009-2018
+%% Copyright (C) 2009-2020
%%
%% by Elie Roux
%% and Khaled Hosny
@@ -32,7 +32,7 @@
\beginfrontmatter
\setdocumenttitle {The \identifier{luaotfload} package}
- \setdocumentdate {2020-02-02 v3.12}
+ \setdocumentdate {2020-05-01 v3.13}
\setdocumentauthor {LaTeX3 Project\\
Elie Roux · Khaled Hosny · Philipp Gesang · Ulrike Fischer · Marcel Krüger\\
Home: \hyperlink {https://github.com/latex3/luaotfload}}
@@ -62,6 +62,25 @@ Supported is the \identifier{luatex} versions of a current TeXLive 2019 (and a c
\endsection
\beginsection{Changes}
+\beginsubsection {New in version 3.13 (by Ulrike Fischer/Marcel Krüger)}
+\begin{itemize}
+\item A\marginpar{\mbox{}\hfill \textbf{Change!}} problem with text fonts with minimal math table has been fixed \gitissue{148}:
+ In new luaotfload versions, math parameters will only be loaded for fonts with \texttt{script=math}.
+ If you do want to set math parameters for fonts with other scripts, add \texttt{-nomathparam}.
+ We strongly recommend against setting math parameters for text fonts because
+ these would overwrite parameters from actual math fonts.
+\item A bug in harf-mode that could lead to missing chars and freezing was corrected \gitissue{141}.
+\item A font size problem in harf-mode has been fixed \gitissue{147}.
+\item An error if the main function was called twice has been fixed \gitissue{145}.
+\item Allow .ttf fonts to be loaded with a map file with luahbtex \gitissue{142} \gitissue{143}.
+\item Fonts installed for a single user on windows are now found \gitissue{138}.
+\item A problem with wrong \TeX-ligatures in harf mode has been fixed \gitissue{139}.
+\item The debugging output has been changed \gitissue{131}.
+\item A missing \enquote{capital sharp s} (U+1E9E) in a font is replaced by SS instead of giving a missing character message:
+ ^^^^1e9e or {\sffamily ^^^^1e9e}
+\item The color handling has been improved so that it is now compatible with the luacolor package.
+\end{itemize}
+\endsubsection
\beginsubsection {New in version 3.12 (by Ulrike Fischer/Marcel Krüger)}
\begin{itemize}
\item Corrected a number of small bugs in harf mode.
@@ -71,13 +90,14 @@ coloring of specific output glyphs, see page~\pageref{color-glyphs}
\item A\marginpar{Experimental!} new \identifier{multiscript} key to allow to use a font
for more than one script, see page~\pageref{multiscript}
\end{itemize}
-
+\endsubsection
\beginsubsection {New in version 3.11 (by Ulrike Fischer/Marcel Krüger)}
\begin{itemize}
\item Changed the handling of the \identifier{script} key in harf mode to be more compatible with behaviour of the node mode. It now expects the name of a script that is actually in the font instead of a ISO 15924 script tag. See issue 117.
\item Corrected a number of small typos and bugs in harf mode.
\end{itemize}
-\beginsubsection {New in version 3.1 (by Ulrike Fischer/Marcel Krüger)}
+\endsubsection
+\beginsubsection {New in version 3.10 (by Ulrike Fischer/Marcel Krüger)}
\begin{itemize}
\item The package has been moved to the github of the LaTeX3 Project and is now maintained
officially by the LaTeX3 Project team.
@@ -1139,7 +1159,7 @@ obviously, \inlinecode{random}.
{
"DejaVuSans:mode=harf;script=grek;color=FF0000;",
"cmuserif:mode=node;script=cyrl;color=00FF00;",
- "NotoSansBengali:mode=harf;script=bng2;color=0000FF;"
+ "NotoSansBengali:mode=harf;script=bng2;color=0000FF;",
"NotoColorEmoji:mode=harf;"
}
)
@@ -2058,14 +2078,14 @@ are defined for which scripts.
\beginaltitem {aux.slot_of_name(id : int, name : string)}
Translates a name for a glyph in font \luaident{id} to the
corresponding glyph slot which can be used e.g.\ as an argument to
- \inlinecode{\char}. The number is assigned by the \identifier{luaotfload} code
+ \inlinecode{\char}. The number is assigned by the \identifier{luaotfload} code
and not related to the glyph index (GID) of the font as stored in the \identifier{[index]} field
of the lua-file.
\endaltitem
- \beginaltitem {aux.gid_of_name(id : int, name : string)}
+ \beginaltitem {aux.gid_of_name(id : int, name : string)}
Translates\marginpar{New version 3.12} a name for a glyph in font \luaident{id} to the
- corresponding glyph index (GID) as stored in the \identifier{[index]} field.
+ corresponding glyph index (GID) as stored in the \identifier{[index]} field.
\endaltitem
\beginaltitem {aux.name_of_slot(id : int, slot : int)}
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-tool.pdf b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-tool.pdf
index eb2d6463bb7..cbd3cd06b4d 100644
Binary files a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-tool.pdf and b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-tool.pdf differ
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-tool.rst b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-tool.rst
index 35ca1955010..98168422c38 100644
--- a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-tool.rst
+++ b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-tool.rst
@@ -6,9 +6,9 @@
generate and query the Luaotfload font names database
-----------------------------------------------------------------------
-:Date: 2020-02-02
+:Date: 2020-05-01
:Copyright: GPL v2.0
-:Version: 3.12
+:Version: 3.13
:Manual section: 1
:Manual group: text processing
@@ -132,7 +132,8 @@ query mode
containing ``->`` be properly quoted!
3) an expression of the form ``field:value`` to
limit the output to entries whose ``field``
- matches ``value``.
+ matches ``value``. The ``value`` can contain
+ ``*`` to match an arbitrary number of characters.
For example, in order to output file names and
corresponding versions, sorted by the font
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload.conf.rst b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload.conf.rst
index b862c8b9b89..779bcb73705 100644
--- a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload.conf.rst
+++ b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload.conf.rst
@@ -6,9 +6,9 @@
Luaotfload configuration file
-----------------------------------------------------------------------
-:Date: 2020-02-02
+:Date: 2020-05-01
:Copyright: GPL v2.0
-:Version: 3.12
+:Version: 3.13
:Manual section: 5
:Manual group: text processing
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/scripts-demo.pdf b/Master/texmf-dist/doc/luatex/luaotfload/scripts-demo.pdf
index 574765e148e..16e1a6163d6 100644
Binary files a/Master/texmf-dist/doc/luatex/luaotfload/scripts-demo.pdf and b/Master/texmf-dist/doc/luatex/luaotfload/scripts-demo.pdf differ
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/shaper-demo-graphite.pdf b/Master/texmf-dist/doc/luatex/luaotfload/shaper-demo-graphite.pdf
index 49a6e2114f7..285cb48353a 100644
Binary files a/Master/texmf-dist/doc/luatex/luaotfload/shaper-demo-graphite.pdf and b/Master/texmf-dist/doc/luatex/luaotfload/shaper-demo-graphite.pdf differ
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/shaper-demo.pdf b/Master/texmf-dist/doc/luatex/luaotfload/shaper-demo.pdf
index 0148482905e..15775d568b7 100644
Binary files a/Master/texmf-dist/doc/luatex/luaotfload/shaper-demo.pdf and b/Master/texmf-dist/doc/luatex/luaotfload/shaper-demo.pdf differ
diff --git a/Master/texmf-dist/doc/man/man1/luaotfload-tool.1 b/Master/texmf-dist/doc/man/man1/luaotfload-tool.1
index 2d4ce7d16c5..a2ea173474e 100644
--- a/Master/texmf-dist/doc/man/man1/luaotfload-tool.1
+++ b/Master/texmf-dist/doc/man/man1/luaotfload-tool.1
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText.
.
-.TH LUAOTFLOAD-TOOL 1 "2020-02-02" "3.12" "text processing"
+.TH LUAOTFLOAD-TOOL 1 "2020-05-01" "3.13" "text processing"
.SH NAME
luaotfload-tool \- generate and query the Luaotfload font names database
.
@@ -177,7 +177,8 @@ containing \fB\->\fP be properly quoted!
.IP 3. 3
an expression of the form \fBfield:value\fP to
limit the output to entries whose \fBfield\fP
-matches \fBvalue\fP\&.
+matches \fBvalue\fP\&. The \fBvalue\fP can contain
+\fB*\fP to match an arbitrary number of characters.
.UNINDENT
.sp
For example, in order to output file names and
@@ -326,7 +327,7 @@ state.
.SS miscellaneous
.INDENT 0.0
.TP
-.BI \-\-verbose\fB= N\fR,\fB \ \-v
+.BI \-\-verbose\fB= N\fP,\fB \ \-v
Set verbosity level to \fIn\fP or the number of
repetitions of \fB\-v\fP\&.
.TP
diff --git a/Master/texmf-dist/doc/man/man1/luaotfload-tool.man1.pdf b/Master/texmf-dist/doc/man/man1/luaotfload-tool.man1.pdf
index ad7cfbdcd31..8f6a88ceb97 100644
Binary files a/Master/texmf-dist/doc/man/man1/luaotfload-tool.man1.pdf and b/Master/texmf-dist/doc/man/man1/luaotfload-tool.man1.pdf differ
diff --git a/Master/texmf-dist/doc/man/man5/luaotfload.conf.5 b/Master/texmf-dist/doc/man/man5/luaotfload.conf.5
index 9301e95805a..151cc6aea2c 100644
--- a/Master/texmf-dist/doc/man/man5/luaotfload.conf.5
+++ b/Master/texmf-dist/doc/man/man5/luaotfload.conf.5
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText.
.
-.TH LUAOTFLOAD.CONF 5 "2020-02-02" "3.12" "text processing"
+.TH LUAOTFLOAD.CONF 5 "2020-05-01" "3.13" "text processing"
.SH NAME
luaotfload.conf \- Luaotfload configuration file
.
diff --git a/Master/texmf-dist/doc/man/man5/luaotfload.conf.man5.pdf b/Master/texmf-dist/doc/man/man5/luaotfload.conf.man5.pdf
index 23bfd24ae73..d5006501220 100644
Binary files a/Master/texmf-dist/doc/man/man5/luaotfload.conf.man5.pdf and b/Master/texmf-dist/doc/man/man5/luaotfload.conf.man5.pdf differ
diff --git a/Master/texmf-dist/scripts/luaotfload/luaotfload-tool.lua b/Master/texmf-dist/scripts/luaotfload/luaotfload-tool.lua
index de69173ed50..6994bfc7551 100755
--- a/Master/texmf-dist/scripts/luaotfload/luaotfload-tool.lua
+++ b/Master/texmf-dist/scripts/luaotfload/luaotfload-tool.lua
@@ -9,8 +9,8 @@
local ProvidesLuaModule = {
name = "luaotfload-tool",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload-tool / database functionality",
license = "GPL v2.0"
}
@@ -42,7 +42,7 @@ This file is a wrapper for the luaotfload font names module
(luaotfload-database.lua). It is part of the luaotfload bundle, please
see the luaotfload documentation for more info. Report bugs to
- \url{https://github.com/lualatex/luaotfload/issues}.
+ \url{https://github.com/latex3/luaotfload/issues}.
--doc]]--
@@ -141,7 +141,7 @@ this. (Postponing the loading of the lualibs code is not an option
because the functionality is needed by basics-gen itself.)
--doc]]--
-local dummy_function = function ( ) end
+local function dummy_function ( ) end
local backup = {
write = texio.write,
write_nl = texio.write_nl,
@@ -177,7 +177,7 @@ fonts.names = fontsnames
local require_init = { }
-local loadmodule = function (name)
+local function loadmodule (name)
local v = require ("luaotfload-" .. name)
if v then
local mod = { }
@@ -204,7 +204,7 @@ loadmodule "resolvers" --- Font lookup
local logreport
-local init_modules = function ()
+local function init_modules ()
--- NB we don’t command the logger at this point.
local todo = #require_init
local ret = true
@@ -322,7 +322,7 @@ Enter 'luaotfload-tool --help' for a larger list of options.
]]
}
-local help_msg = function (version)
+local function help_msg (version)
local template = help_messages[version]
local paths = config.luaotfload.paths
local names_plain = paths.index_path_lua
@@ -340,10 +340,10 @@ local about = [[
%s:
Luaotfload font management and diagnostic utility.
License: GNU GPL v2.0.
- Report problems to
+ Report problems to
]]
-local version_msg = function ( )
+local function version_msg ( )
local out = function (...) texiowrite_nl (stringformat (...)) end
local uname = os.uname ()
local meta = fonts.names.getmetadata ()
@@ -398,7 +398,7 @@ local currentdepth = 0
local counterstack = { } -- counters per level
local counterformat = "%d"
-local format_counter = function (stack)
+local function format_counter (stack)
local acc = { }
for lvl=1, #stack do
acc[#acc+1] = stringformat(counterformat, stack[lvl])
@@ -406,7 +406,7 @@ local format_counter = function (stack)
return tableconcat(acc, ".")
end
-local print_heading = function (title, level)
+local function print_heading (title, level)
if not title then return end
local structuredata
if currentdepth == level then -- top is current
@@ -447,7 +447,7 @@ local baseindent = " "
--doc]]--
-local show_info_table show_info_table = function (t, depth)
+local function show_info_table (t, depth)
depth = depth or 0
local indent = stringrep (baseindent, depth)
local keys = tablesortedkeys (t)
@@ -466,7 +466,7 @@ local show_info_table show_info_table = function (t, depth)
end
end
-local show_info_items = function (fontinfo)
+local function show_info_items (fontinfo)
print_heading (fontinfo.fullname, 1)
texiowrite_nl ""
show_info_table (fontinfo)
@@ -480,7 +480,7 @@ local p_word = C(p_wordchar^1)
local p_words = Ct(p_word * (p_whitespace * p_word)^0)
--- string -> int -> string list
-local reflow = function (text, width)
+local function reflow (text, width)
local words
local t_text = type (text)
if t_text == "string" then
@@ -521,7 +521,7 @@ local reflow = function (text, width)
end
--- string -> 'a -> string list
-local print_field = function (key, val)
+local function print_field (key, val)
val = tostring(val)
local lhs = stringformat(key_fmt, key) .. fieldseparator .. " "
local wd_lhs = #lhs
@@ -558,7 +558,7 @@ local general_fields = {
{ "capheight", "l", "capital height" },
}
-local display_general = function (fullinfo)
+local function display_general (fullinfo)
texiowrite_nl ""
print_heading("General Information", 2)
texiowrite_nl ""
@@ -609,7 +609,7 @@ local display_general = function (fullinfo)
end
end
-local print_features = function (features)
+local function print_features (features)
for tag, data in next, features do
print_heading(tag, 4)
for script, languages in next, data do
@@ -628,11 +628,11 @@ local print_features = function (features)
end
end
-local display_feature_set = function (set)
+local function display_feature_set (set)
print_features(set)
end
-local display_features_type = function (id, feat)
+local function display_features_type (id, feat)
if feat and next (feat) then
print_heading(id, 3)
display_feature_set(feat)
@@ -641,7 +641,7 @@ local display_features_type = function (id, feat)
return false
end
-local display_features = function (features)
+local function display_features (features)
texiowrite_nl ""
print_heading("Features", 2)
@@ -661,7 +661,7 @@ local display_features = function (features)
end
end
-local show_full_info = function (path, subfont)
+local function show_full_info (path, subfont)
local rawinfo, warn = fonts.handlers.otf.readers.loadfont (path, subfont)
if not rawinfo then
texiowrite_nl(stringformat([[cannot open font %s]], path))
@@ -671,8 +671,7 @@ local show_full_info = function (path, subfont)
display_features(rawinfo.resources.features)
end
-local subfont_by_name
-subfont_by_name = function (lst, askedname, n)
+local function subfont_by_name (lst, askedname, n)
for n = 1, #lst do
local font = lst[n]
if fonts.names.sanitize_fontname (font.fullname) == askedname then
@@ -690,7 +689,7 @@ The font info knows two levels of detail:
returned by readers.loadfont().
--doc]]--
-local show_font_info = function (basename, askedname, detail, subfont)
+local function show_font_info (basename, askedname, detail, subfont)
local filenames = fonts.names.data().files
local index = filenames.base[basename]
local fullname = filenames.full[index]
@@ -763,7 +762,7 @@ action_pending.generate = false --- this is the default action
local actions = { } --- (jobspec -> (bool * bool)) list
-actions.loglevel = function (job)
+function actions.loglevel (job)
local lvl = job.log_level
if lvl then
luaotfload.log.set_loglevel(lvl)
@@ -773,7 +772,7 @@ actions.loglevel = function (job)
return true, true
end
-actions.config = function (job)
+function actions.config (job)
local defaults = luaotfload.default_config
local vars = config.actions.read (job.extra_config)
config.luaotfload = config.actions.apply (defaults, vars)
@@ -787,22 +786,22 @@ actions.config = function (job)
return true, true
end
-actions.version = function (job)
+function actions.version (job)
version_msg()
return true, false
end
-actions.dumpconf = function (job)
+function actions.dumpconf (job)
config.actions.dump ()
return true, false
end
-actions.help = function (job)
+function actions.help (job)
help_msg (job.help_version or "luaotfload-tool")
return true, false
end
-actions.blacklist = function (job)
+function actions.blacklist (job)
fonts.names.read_blacklist()
local n = 0
for n, entry in next, tablesortedkeys(fonts.names.blacklist) do
@@ -811,7 +810,7 @@ actions.blacklist = function (job)
return true, false
end
-actions.generate = function (job)
+function actions.generate (job)
local _ = fonts.names.update ({ }, job.force_reload, job.dry_run)
local namedata = fonts.names.data ()
if namedata then
@@ -847,7 +846,7 @@ local bisect_status_fmt = [[
--doc]]--
--- state list -> bool
-local write_bisect_status = function (data)
+local function write_bisect_status (data)
local payload = tableserialize (data, true)
local status = stringformat (bisect_status_fmt,
osdate ("%Y-%m-d %H:%M:%S", os.time ()),
@@ -871,7 +870,7 @@ end
--doc]]--
--- unit -> state list
-local read_bisect_status = function ()
+local function read_bisect_status ()
logreport ("info", 4, "bisect",
"Testing for status file: %q.",
bisect_status_file)
@@ -900,7 +899,7 @@ end
--doc]]--
-local bisect_start = function ()
+local function bisect_start ()
if lfsisfile (bisect_status_file) then
logreport ("info", 0, "bisect",
"Bisect session in progress.",
@@ -929,7 +928,7 @@ end
--doc]]--
-local bisect_stop = function ()
+local function bisect_stop ()
logreport ("info", 3, "bisect",
"Erasing bisection state at %s.",
bisect_status_file)
@@ -962,7 +961,7 @@ end
--doc]]--
-local bisect_terminate = function (nsteps, culprit)
+local function bisect_terminate (nsteps, culprit)
logreport ("info", 1, "bisect",
"Bisection completed after %d steps.", nsteps)
logreport ("info", 0, "bisect",
@@ -978,7 +977,7 @@ end
--doc]]--
-local list_remainder = function (lo, hi)
+local function list_remainder (lo, hi)
local fonts = fonts.names.font_slice (lo, hi)
logreport ("info", 0, "bisect", "%d fonts left.", hi - lo + 1)
for i = 1, #fonts do
@@ -997,7 +996,7 @@ end
--doc]]--
-local bisect_set = function (outcome)
+local function bisect_set (outcome)
local status = read_bisect_status ()
if not status then
return false, false
@@ -1063,7 +1062,7 @@ end
--doc]]--
-local bisect_status = function ()
+local function bisect_status ()
local status = read_bisect_status ()
if not status then
return false, false
@@ -1092,7 +1091,7 @@ end
--doc]]--
-local bisect_run = function ()
+local function bisect_run ()
local status = read_bisect_status ()
if not status then
return false, false
@@ -1121,7 +1120,7 @@ local bisect_modes = {
run = bisect_run,
}
-actions.bisect = function (job)
+function actions.bisect (job)
local mode = job.bisect
local runner = bisect_modes[mode]
if not runner then
@@ -1131,7 +1130,7 @@ actions.bisect = function (job)
return runner (job)
end
-actions.flush = function (job)
+function actions.flush (job)
local success = fonts.names.flush_lookup_cache()
if success then
local success = fonts.names.save_lookups()
@@ -1143,7 +1142,7 @@ actions.flush = function (job)
return false, false
end
-local cache_directives = function ()
+local function cache_directives ()
--- These exist only after initialization.
return {
["purge"] = fonts.names.purge_cache,
@@ -1152,7 +1151,7 @@ local cache_directives = function ()
}
end
-actions.cache = function (job)
+function actions.cache (job)
local directive = cache_directives()[job.cache]
if not directive or type(directive) ~= "function" then
logreport ("info", 2, "cache",
@@ -1165,7 +1164,7 @@ actions.cache = function (job)
return false, false
end
-actions.query = function (job)
+function actions.query (job)
require "luaotfload-features"
@@ -1239,36 +1238,26 @@ end
---
--- --list= --fields=,,,...
-local get_fields get_fields = function (entry, fields, acc, n)
- if not acc then
- return get_fields (entry, fields, { }, 1)
- end
-
- local field = fields [n]
- if field then
+local function get_fields (entry, fields)
+ local acc = {}
+ for n, field in ipairs(fields) do
local chain = stringsplit (field, "->")
local tmp = entry
- for i = 1, #chain - 1 do
+ for i = 1, #chain do
tmp = tmp [chain [i]]
if not tmp then
--- invalid field
break
end
end
- if tmp then
- local value = tmp [chain [#chain]]
- acc[#acc+1] = value or false
- else
- acc[#acc+1] = false
- end
- return get_fields (entry, fields, acc, n+1)
+ acc[n] = tmp or false
end
return acc
end
local separator = "\t" --- could be “,” for csv
-local format_fields format_fields = function (fields, acc, n)
+local function format_fields (fields, acc, n)
if not acc then
return format_fields(fields, { }, 1)
end
@@ -1285,8 +1274,7 @@ local format_fields format_fields = function (fields, acc, n)
return tableconcat(acc, separator)
end
-local set_primary_field
-set_primary_field = function (fields, addme, acc, n)
+local function set_primary_field (fields, addme, acc, n)
if not acc then
return set_primary_field(fields, addme, { addme }, 1)
end
@@ -1301,7 +1289,17 @@ set_primary_field = function (fields, addme, acc, n)
return acc
end
-actions.list = function (job)
+local function sane_pattern (p)
+ local l = lpeg or require'lpeg'
+ local special = l.Cg(l.P'*' * l.Cc'.*')
+ local pattern = l.Cs(l.Cc'^' * (special + (1 - special)^1/fonts.names.sanitize_fontname)^0 * l.Cc'$')
+ function sane_pattern (p)
+ return pattern:match(p)
+ end
+ return sane_pattern(p)
+end
+
+function actions.list (job)
local criterion = job.criterion
local asked_fields = job.asked_fields
local name_index = fonts.names.data ()
@@ -1336,6 +1334,7 @@ actions.list = function (job)
else
criterion = stringexplode(criterion, ":") --> { field, value }
local asked_value = criterion[2]
+ local sane_asked_pattern = sane_pattern(criterion[2])
criterion = criterion[1]
asked_fields = set_primary_field(asked_fields, criterion)
@@ -1347,8 +1346,9 @@ actions.list = function (job)
logreport (false, 2, "list", "Restricting to value %s", asked_value)
for i=1, nmappings do
local entry = mappings[i]
- if entry[criterion]
- and tostring(entry[criterion]) == asked_value
+ local entryvalue = tostring(entry[criterion])
+ if entryvalue
+ and (entryvalue == asked_value or entryvalue:match(sane_asked_pattern))
then
targets[#targets+1] = entry
end
@@ -1405,7 +1405,7 @@ actions.list = function (job)
return true, true
end
-actions.diagnose = function (job)
+function actions.diagnose (job)
--- diagnostics are loaded on demand
local diagnose = require "luaotfload-diagnostics.lua"
return diagnose (job)
@@ -1417,7 +1417,7 @@ local finalizers = { }
--- returns false if at least one of the actions failed, mainly
--- for closing io channels
-local finalize = function ()
+local function finalize ()
local success = true
for _, fun in next, finalizers do
if type (fun) == "function" then
@@ -1437,7 +1437,7 @@ environment.* namespace that could eliminate the dependency on
alt_getopt.
--]]--
-local process_cmdline = function ( ) -- unit -> jobspec
+local function process_cmdline ( ) -- unit -> jobspec
local result = { -- jobspec
force_reload = nil,
full_info = false,
@@ -1612,7 +1612,7 @@ local process_cmdline = function ( ) -- unit -> jobspec
return result
end
-local main = function ( ) -- unit -> int
+local function main ( ) -- unit -> int
if init_modules () == false then return -42 end
local retval = 0
diff --git a/Master/texmf-dist/source/luatex/luaotfload/fontloader-reference-load-order.lua b/Master/texmf-dist/source/luatex/luaotfload/fontloader-reference-load-order.lua
index 85fe1ae9750..9f45408b1b7 100644
--- a/Master/texmf-dist/source/luatex/luaotfload/fontloader-reference-load-order.lua
+++ b/Master/texmf-dist/source/luatex/luaotfload/fontloader-reference-load-order.lua
@@ -257,7 +257,9 @@ if non_generic_context.luatex_fonts.skip_loading ~= true then
loadmodule('font-vfc.lua')
- -- This is the bulk of opentype code.
+ -- This is the bulk of opentype code. The color and variable font support (as for
+ -- emoji) can (and might) actually go away here because it has never been used
+ -- outside context so in retrospect there was no need for it being generic.
loadmodule('font-otr.lua')
loadmodule('font-oti.lua')
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-2020-01-26.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-2020-01-26.lua
deleted file mode 100644
index be8fefacfe2..00000000000
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-2020-01-26.lua
+++ /dev/null
@@ -1,34402 +0,0 @@
---[[info-----------------------------------------------------------------------
- Luaotfload fontloader package
- build 2020-02-02 22:46:14
--------------------------------------------------------------------------------
-
- © 2020 PRAGMA ADE / ConTeXt Development Team
-
- The code in this file is provided under the GPL v2.0 license. See the
- file COPYING in the Luaotfload repository for details.
-
- Report bugs to github.com/u-fischer/luaotfload
-
- This file has been assembled from components taken from Context. See
- the Luaotfload documentation for details:
-
- $ texdoc luaotfload
- $ man 1 luaotfload-tool
- $ man 5 luaotfload.conf
-
- Included files:
-
- · fontloader-data-con.lua
- · fontloader-basics-nod.lua
- · fontloader-basics-chr.lua
- · fontloader-font-ini.lua
- · fontloader-fonts-mis.lua
- · fontloader-font-con.lua
- · fontloader-fonts-enc.lua
- · fontloader-font-cid.lua
- · fontloader-font-map.lua
- · fontloader-font-vfc.lua
- · fontloader-font-otr.lua
- · fontloader-font-oti.lua
- · fontloader-font-ott.lua
- · fontloader-font-cff.lua
- · fontloader-font-ttf.lua
- · fontloader-font-dsp.lua
- · fontloader-font-oup.lua
- · fontloader-font-otl.lua
- · fontloader-font-oto.lua
- · fontloader-font-otj.lua
- · fontloader-font-ota.lua
- · fontloader-font-ots.lua
- · fontloader-font-osd.lua
- · fontloader-font-ocl.lua
- · fontloader-font-otc.lua
- · fontloader-font-onr.lua
- · fontloader-font-one.lua
- · fontloader-font-afk.lua
- · fontloader-fonts-tfm.lua
- · fontloader-font-lua.lua
- · fontloader-font-def.lua
- · fontloader-fonts-def.lua
- · fontloader-fonts-ext.lua
- · fontloader-font-imp-tex.lua
- · fontloader-font-imp-ligatures.lua
- · fontloader-font-imp-italics.lua
- · fontloader-font-imp-effects.lua
- · fontloader-fonts-lig.lua
- · fontloader-fonts-gbn.lua
-
---info]]-----------------------------------------------------------------------
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “data-con” de6ae0997b0e70a23bcc9afff5d8b072] ---
-
-if not modules then modules={} end modules ['data-con']={
- version=1.100,
- comment="companion to luat-lib.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local setmetatable=setmetatable
-local format,lower,gsub=string.format,string.lower,string.gsub
-local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end)
-local trace_containers=false trackers.register("resolvers.containers",function(v) trace_containers=v end)
-local trace_storage=false trackers.register("resolvers.storage",function(v) trace_storage=v end)
-containers=containers or {}
-local containers=containers
-containers.usecache=true
-local getwritablepath=caches.getwritablepath
-local getreadablepaths=caches.getreadablepaths
-local cacheiswritable=caches.is_writable
-local loaddatafromcache=caches.loaddata
-local savedataincache=caches.savedata
-local report_containers=logs.reporter("resolvers","containers")
-local allocated={}
-local mt={
- __index=function(t,k)
- if k=="writable" then
- local writable=getwritablepath(t.category,t.subcategory) or { "." }
- t.writable=writable
- return writable
- elseif k=="readables" then
- local readables=getreadablepaths(t.category,t.subcategory) or { "." }
- t.readables=readables
- return readables
- end
- end,
- __storage__=true
-}
-function containers.define(category,subcategory,version,enabled)
- if category and subcategory then
- local c=allocated[category]
- if not c then
- c={}
- allocated[category]=c
- end
- local s=c[subcategory]
- if not s then
- s={
- category=category,
- subcategory=subcategory,
- storage={},
- enabled=enabled,
- version=version or math.pi,
- trace=false,
- }
- setmetatable(s,mt)
- c[subcategory]=s
- end
- return s
- end
-end
-function containers.is_usable(container,name)
- return container.enabled and caches and cacheiswritable(container.writable,name)
-end
-function containers.is_valid(container,name)
- if name and name~="" then
- local storage=container.storage[name]
- return storage and storage.cache_version==container.version
- else
- return false
- end
-end
-function containers.read(container,name)
- local storage=container.storage
- local stored=storage[name]
- if not stored and container.enabled and caches and containers.usecache then
- stored=loaddatafromcache(container.readables,name,container.writable)
- if stored and stored.cache_version==container.version then
- if trace_cache or trace_containers then
- report_containers("action %a, category %a, name %a","load",container.subcategory,name)
- end
- else
- stored=nil
- end
- storage[name]=stored
- elseif stored then
- if trace_cache or trace_containers then
- report_containers("action %a, category %a, name %a","reuse",container.subcategory,name)
- end
- end
- return stored
-end
-function containers.write(container,name,data,fast)
- if data then
- data.cache_version=container.version
- if container.enabled and caches then
- local unique=data.unique
- local shared=data.shared
- data.unique=nil
- data.shared=nil
- savedataincache(container.writable,name,data,fast)
- if trace_cache or trace_containers then
- report_containers("action %a, category %a, name %a","save",container.subcategory,name)
- end
- data.unique=unique
- data.shared=shared
- end
- if trace_cache or trace_containers then
- report_containers("action %a, category %a, name %a","store",container.subcategory,name)
- end
- container.storage[name]=data
- end
- return data
-end
-function containers.content(container,name)
- return container.storage[name]
-end
-function containers.cleanname(name)
- return (gsub(lower(name),"[^%w\128-\255]+","-"))
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “data-con”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “basics-nod” 4ce2f7c752fdc4c1d6d9f74e8cd50be8] ---
-
-if not modules then modules={} end modules ['luatex-fonts-nod']={
- version=1.001,
- comment="companion to luatex-fonts.lua",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-if context then
- os.exit()
-end
-if tex.attribute[0]~=0 then
- texio.write_nl("log","!")
- texio.write_nl("log","! Attribute 0 is reserved for ConTeXt's font feature management and has to be")
- texio.write_nl("log","! set to zero. Also, some attributes in the range 1-255 are used for special")
- texio.write_nl("log","! purposes so setting them at the TeX end might break the font handler.")
- texio.write_nl("log","!")
- tex.attribute[0]=0
-end
-attributes=attributes or {}
-attributes.unsetvalue=-0x7FFFFFFF
-local numbers,last={},127
-attributes.private=attributes.private or function(name)
- local number=numbers[name]
- if not number then
- if last<255 then
- last=last+1
- end
- number=last
- numbers[name]=number
- end
- return number
-end
-nodes={}
-nodes.handlers={}
-local nodecodes={}
-local glyphcodes=node.subtypes("glyph")
-local disccodes=node.subtypes("disc")
-for k,v in next,node.types() do
- v=string.gsub(v,"_","")
- nodecodes[k]=v
- nodecodes[v]=k
-end
-for k,v in next,glyphcodes do
- glyphcodes[v]=k
-end
-for k,v in next,disccodes do
- disccodes[v]=k
-end
-nodes.nodecodes=nodecodes
-nodes.glyphcodes=glyphcodes
-nodes.disccodes=disccodes
-nodes.handlers.protectglyphs=node.protect_glyphs
-nodes.handlers.unprotectglyphs=node.unprotect_glyphs
-local direct=node.direct
-local nuts={}
-nodes.nuts=nuts
-local tonode=direct.tonode
-local tonut=direct.todirect
-nodes.tonode=tonode
-nodes.tonut=tonut
-nuts.tonode=tonode
-nuts.tonut=tonut
-nuts.getattr=direct.get_attribute
-nuts.getboth=direct.getboth
-nuts.getchar=direct.getchar
-nuts.getcomponents=direct.getcomponents
-nuts.getdirection=direct.getdirection
-nuts.getdisc=direct.getdisc
-nuts.getreplace=direct.getreplace
-nuts.getfield=direct.getfield
-nuts.getfont=direct.getfont
-nuts.getid=direct.getid
-nuts.getkern=direct.getkern
-nuts.getlist=direct.getlist
-nuts.getnext=direct.getnext
-nuts.getoffsets=direct.getoffsets
-nuts.getprev=direct.getprev
-nuts.getsubtype=direct.getsubtype
-nuts.getwidth=direct.getwidth
-nuts.setattr=direct.setfield
-nuts.setboth=direct.setboth
-nuts.setchar=direct.setchar
-nuts.setcomponents=direct.setcomponents
-nuts.setdirection=direct.setdirection
-nuts.setdisc=direct.setdisc
-nuts.setreplace=direct.setreplace
-nuts.setfield=setfield
-nuts.setkern=direct.setkern
-nuts.setlink=direct.setlink
-nuts.setlist=direct.setlist
-nuts.setnext=direct.setnext
-nuts.setoffsets=direct.setoffsets
-nuts.setprev=direct.setprev
-nuts.setsplit=direct.setsplit
-nuts.setsubtype=direct.setsubtype
-nuts.setwidth=direct.setwidth
-nuts.getglyphdata=nuts.getattr
-nuts.setglyphdata=nuts.setattr
-nuts.ischar=direct.is_char
-nuts.isglyph=direct.is_glyph
-nuts.copy=direct.copy
-nuts.copy_list=direct.copy_list
-nuts.copy_node=direct.copy
-nuts.delete=direct.delete
-nuts.end_of_math=direct.end_of_math
-nuts.flush=direct.flush
-nuts.flush_list=direct.flush_list
-nuts.flush_node=direct.flush_node
-nuts.free=direct.free
-nuts.insert_after=direct.insert_after
-nuts.insert_before=direct.insert_before
-nuts.is_node=direct.is_node
-nuts.kerning=direct.kerning
-nuts.ligaturing=direct.ligaturing
-nuts.new=direct.new
-nuts.remove=direct.remove
-nuts.tail=direct.tail
-nuts.traverse=direct.traverse
-nuts.traverse_char=direct.traverse_char
-nuts.traverse_glyph=direct.traverse_glyph
-nuts.traverse_id=direct.traverse_id
-local propertydata=direct.get_properties_table()
-nodes.properties={ data=propertydata }
-if direct.set_properties_mode then
- direct.set_properties_mode(true,true)
- function direct.set_properties_mode() end
-end
-nuts.getprop=function(n,k)
- local p=propertydata[n]
- if p then
- return p[k]
- end
-end
-nuts.setprop=function(n,k,v)
- if v then
- local p=propertydata[n]
- if p then
- p[k]=v
- else
- propertydata[n]={ [k]=v }
- end
- end
-end
-nodes.setprop=nodes.setproperty
-nodes.getprop=nodes.getproperty
-local setprev=nuts.setprev
-local setnext=nuts.setnext
-local getnext=nuts.getnext
-local setlink=nuts.setlink
-local getfield=nuts.getfield
-local setfield=nuts.setfield
-local getcomponents=nuts.getcomponents
-local setcomponents=nuts.setcomponents
-local find_tail=nuts.tail
-local flush_list=nuts.flush_list
-local flush_node=nuts.flush_node
-local traverse_id=nuts.traverse_id
-local copy_node=nuts.copy_node
-local glyph_code=nodes.nodecodes.glyph
-function nuts.copy_no_components(g,copyinjection)
- local components=getcomponents(g)
- if components then
- setcomponents(g)
- local n=copy_node(g)
- if copyinjection then
- copyinjection(n,g)
- end
- setcomponents(g,components)
- return n
- else
- local n=copy_node(g)
- if copyinjection then
- copyinjection(n,g)
- end
- return n
- end
-end
-function nuts.copy_only_glyphs(current)
- local head=nil
- local previous=nil
- for n in traverse_id(glyph_code,current) do
- n=copy_node(n)
- if head then
- setlink(previous,n)
- else
- head=n
- end
- previous=n
- end
- return head
-end
-nuts.uses_font=direct.uses_font
-do
- local dummy=tonut(node.new("glyph"))
- nuts.traversers={
- glyph=nuts.traverse_id(nodecodes.glyph,dummy),
- glue=nuts.traverse_id(nodecodes.glue,dummy),
- disc=nuts.traverse_id(nodecodes.disc,dummy),
- boundary=nuts.traverse_id(nodecodes.boundary,dummy),
- char=nuts.traverse_char(dummy),
- node=nuts.traverse(dummy),
- }
-end
-if not nuts.setreplace then
- local getdisc=nuts.getdisc
- local setfield=nuts.setfield
- function nuts.getreplace(n)
- local _,_,h,_,_,t=getdisc(n,true)
- return h,t
- end
- function nuts.setreplace(n,h)
- setfield(n,"replace",h)
- end
-end
-do
- local getsubtype=nuts.getsubtype
- function nuts.start_of_par(n)
- local s=getsubtype(n)
- return s==0 or s==2
- end
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “basics-nod”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “basics-chr” 58b7ef0c486e06090b362971b9f85e27] ---
-
-
-characters=characters or {}
-characters.blockrange={}
-characters.classifiers={
- [768]=5,
- [769]=5,
- [770]=5,
- [771]=5,
- [772]=5,
- [773]=5,
- [774]=5,
- [775]=5,
- [776]=5,
- [777]=5,
- [778]=5,
- [779]=5,
- [780]=5,
- [781]=5,
- [782]=5,
- [783]=5,
- [784]=5,
- [785]=5,
- [786]=5,
- [787]=5,
- [788]=5,
- [789]=5,
- [790]=5,
- [791]=5,
- [792]=5,
- [793]=5,
- [794]=5,
- [795]=5,
- [796]=5,
- [797]=5,
- [798]=5,
- [799]=5,
- [800]=5,
- [801]=5,
- [802]=5,
- [803]=5,
- [804]=5,
- [805]=5,
- [806]=5,
- [807]=5,
- [808]=5,
- [809]=5,
- [810]=5,
- [811]=5,
- [812]=5,
- [813]=5,
- [814]=5,
- [815]=5,
- [816]=5,
- [817]=5,
- [818]=5,
- [819]=5,
- [820]=5,
- [821]=5,
- [822]=5,
- [823]=5,
- [824]=5,
- [825]=5,
- [826]=5,
- [827]=5,
- [828]=5,
- [829]=5,
- [830]=5,
- [831]=5,
- [832]=5,
- [833]=5,
- [834]=5,
- [835]=5,
- [836]=5,
- [837]=5,
- [838]=5,
- [839]=5,
- [840]=5,
- [841]=5,
- [842]=5,
- [843]=5,
- [844]=5,
- [845]=5,
- [846]=5,
- [847]=5,
- [848]=5,
- [849]=5,
- [850]=5,
- [851]=5,
- [852]=5,
- [853]=5,
- [854]=5,
- [855]=5,
- [856]=5,
- [857]=5,
- [858]=5,
- [859]=5,
- [860]=5,
- [861]=5,
- [862]=5,
- [863]=5,
- [864]=5,
- [865]=5,
- [866]=5,
- [867]=5,
- [868]=5,
- [869]=5,
- [870]=5,
- [871]=5,
- [872]=5,
- [873]=5,
- [874]=5,
- [875]=5,
- [876]=5,
- [877]=5,
- [878]=5,
- [879]=5,
- [1155]=5,
- [1156]=5,
- [1157]=5,
- [1158]=5,
- [1159]=5,
- [1425]=5,
- [1426]=5,
- [1427]=5,
- [1428]=5,
- [1429]=5,
- [1430]=5,
- [1431]=5,
- [1432]=5,
- [1433]=5,
- [1434]=5,
- [1435]=5,
- [1436]=5,
- [1437]=5,
- [1438]=5,
- [1439]=5,
- [1440]=5,
- [1441]=5,
- [1442]=5,
- [1443]=5,
- [1444]=5,
- [1445]=5,
- [1446]=5,
- [1447]=5,
- [1448]=5,
- [1449]=5,
- [1450]=5,
- [1451]=5,
- [1452]=5,
- [1453]=5,
- [1454]=5,
- [1455]=5,
- [1456]=5,
- [1457]=5,
- [1458]=5,
- [1459]=5,
- [1460]=5,
- [1461]=5,
- [1462]=5,
- [1463]=5,
- [1464]=5,
- [1465]=5,
- [1466]=5,
- [1467]=5,
- [1468]=5,
- [1469]=5,
- [1471]=5,
- [1473]=5,
- [1474]=5,
- [1476]=5,
- [1477]=5,
- [1479]=5,
- [1536]=4,
- [1537]=4,
- [1538]=4,
- [1539]=4,
- [1540]=4,
- [1541]=4,
- [1542]=6,
- [1543]=6,
- [1544]=4,
- [1545]=6,
- [1546]=6,
- [1547]=4,
- [1548]=6,
- [1549]=6,
- [1550]=6,
- [1551]=6,
- [1552]=5,
- [1553]=5,
- [1554]=5,
- [1555]=5,
- [1556]=5,
- [1557]=5,
- [1558]=5,
- [1559]=5,
- [1560]=5,
- [1561]=5,
- [1562]=5,
- [1563]=6,
- [1564]=6,
- [1566]=6,
- [1567]=6,
- [1568]=2,
- [1569]=4,
- [1570]=3,
- [1571]=3,
- [1572]=3,
- [1573]=3,
- [1574]=2,
- [1575]=3,
- [1576]=2,
- [1577]=3,
- [1578]=2,
- [1579]=2,
- [1580]=2,
- [1581]=2,
- [1582]=2,
- [1583]=3,
- [1584]=3,
- [1585]=3,
- [1586]=3,
- [1587]=2,
- [1588]=2,
- [1589]=2,
- [1590]=2,
- [1591]=2,
- [1592]=2,
- [1593]=2,
- [1594]=2,
- [1595]=2,
- [1596]=2,
- [1597]=2,
- [1598]=2,
- [1599]=2,
- [1600]=2,
- [1601]=2,
- [1602]=2,
- [1603]=2,
- [1604]=2,
- [1605]=2,
- [1606]=2,
- [1607]=2,
- [1608]=3,
- [1609]=2,
- [1610]=2,
- [1611]=5,
- [1612]=5,
- [1613]=5,
- [1614]=5,
- [1615]=5,
- [1616]=5,
- [1617]=5,
- [1618]=5,
- [1619]=5,
- [1620]=5,
- [1621]=5,
- [1622]=5,
- [1623]=5,
- [1624]=5,
- [1625]=5,
- [1626]=5,
- [1627]=5,
- [1628]=5,
- [1629]=5,
- [1630]=5,
- [1631]=5,
- [1632]=6,
- [1633]=6,
- [1634]=6,
- [1635]=6,
- [1636]=6,
- [1637]=6,
- [1638]=6,
- [1639]=6,
- [1640]=6,
- [1641]=6,
- [1642]=6,
- [1643]=6,
- [1644]=6,
- [1645]=6,
- [1646]=2,
- [1647]=2,
- [1648]=5,
- [1649]=3,
- [1650]=3,
- [1651]=3,
- [1652]=4,
- [1653]=3,
- [1654]=3,
- [1655]=3,
- [1656]=2,
- [1657]=2,
- [1658]=2,
- [1659]=2,
- [1660]=2,
- [1661]=2,
- [1662]=2,
- [1663]=2,
- [1664]=2,
- [1665]=2,
- [1666]=2,
- [1667]=2,
- [1668]=2,
- [1669]=2,
- [1670]=2,
- [1671]=2,
- [1672]=3,
- [1673]=3,
- [1674]=3,
- [1675]=3,
- [1676]=3,
- [1677]=3,
- [1678]=3,
- [1679]=3,
- [1680]=3,
- [1681]=3,
- [1682]=3,
- [1683]=3,
- [1684]=3,
- [1685]=3,
- [1686]=3,
- [1687]=3,
- [1688]=3,
- [1689]=3,
- [1690]=2,
- [1691]=2,
- [1692]=2,
- [1693]=2,
- [1694]=2,
- [1695]=2,
- [1696]=2,
- [1697]=2,
- [1698]=2,
- [1699]=2,
- [1700]=2,
- [1701]=2,
- [1702]=2,
- [1703]=2,
- [1704]=2,
- [1705]=2,
- [1706]=2,
- [1707]=2,
- [1708]=2,
- [1709]=2,
- [1710]=2,
- [1711]=2,
- [1712]=2,
- [1713]=2,
- [1714]=2,
- [1715]=2,
- [1716]=2,
- [1717]=2,
- [1718]=2,
- [1719]=2,
- [1720]=2,
- [1721]=2,
- [1722]=2,
- [1723]=2,
- [1724]=2,
- [1725]=2,
- [1726]=2,
- [1727]=2,
- [1728]=3,
- [1729]=2,
- [1730]=2,
- [1731]=3,
- [1732]=3,
- [1733]=3,
- [1734]=3,
- [1735]=3,
- [1736]=3,
- [1737]=3,
- [1738]=3,
- [1739]=3,
- [1740]=2,
- [1741]=3,
- [1742]=2,
- [1743]=3,
- [1744]=2,
- [1745]=2,
- [1746]=3,
- [1747]=3,
- [1748]=6,
- [1749]=3,
- [1750]=5,
- [1751]=5,
- [1752]=5,
- [1753]=5,
- [1754]=5,
- [1755]=5,
- [1756]=5,
- [1757]=4,
- [1758]=6,
- [1759]=5,
- [1760]=5,
- [1761]=5,
- [1762]=5,
- [1763]=5,
- [1764]=5,
- [1765]=6,
- [1766]=6,
- [1767]=5,
- [1768]=5,
- [1769]=6,
- [1770]=5,
- [1771]=5,
- [1772]=5,
- [1773]=5,
- [1774]=3,
- [1775]=3,
- [1776]=6,
- [1777]=6,
- [1778]=6,
- [1779]=6,
- [1780]=6,
- [1781]=6,
- [1782]=6,
- [1783]=6,
- [1784]=6,
- [1785]=6,
- [1786]=2,
- [1787]=2,
- [1788]=2,
- [1789]=6,
- [1790]=6,
- [1791]=2,
- [1792]=6,
- [1793]=6,
- [1794]=6,
- [1795]=6,
- [1796]=6,
- [1797]=6,
- [1798]=6,
- [1799]=6,
- [1800]=6,
- [1801]=6,
- [1802]=6,
- [1803]=6,
- [1804]=6,
- [1805]=6,
- [1808]=3,
- [1809]=5,
- [1810]=2,
- [1811]=2,
- [1812]=2,
- [1813]=3,
- [1814]=3,
- [1815]=3,
- [1816]=3,
- [1817]=3,
- [1818]=2,
- [1819]=2,
- [1820]=2,
- [1821]=2,
- [1822]=3,
- [1823]=2,
- [1824]=2,
- [1825]=2,
- [1826]=2,
- [1827]=2,
- [1828]=2,
- [1829]=2,
- [1830]=2,
- [1831]=2,
- [1832]=3,
- [1833]=2,
- [1834]=3,
- [1835]=2,
- [1836]=3,
- [1837]=2,
- [1838]=2,
- [1839]=3,
- [1840]=5,
- [1841]=5,
- [1842]=5,
- [1843]=5,
- [1844]=5,
- [1845]=5,
- [1846]=5,
- [1847]=5,
- [1848]=5,
- [1849]=5,
- [1850]=5,
- [1851]=5,
- [1852]=5,
- [1853]=5,
- [1854]=5,
- [1855]=5,
- [1856]=5,
- [1857]=5,
- [1858]=5,
- [1859]=5,
- [1860]=5,
- [1861]=5,
- [1862]=5,
- [1863]=5,
- [1864]=5,
- [1865]=5,
- [1866]=5,
- [1869]=3,
- [1870]=2,
- [1871]=2,
- [1872]=2,
- [1873]=2,
- [1874]=2,
- [1875]=2,
- [1876]=2,
- [1877]=2,
- [1878]=2,
- [1879]=2,
- [1880]=2,
- [1881]=3,
- [1882]=3,
- [1883]=3,
- [1884]=2,
- [1885]=2,
- [1886]=2,
- [1887]=2,
- [1888]=2,
- [1889]=2,
- [1890]=2,
- [1891]=2,
- [1892]=2,
- [1893]=2,
- [1894]=2,
- [1895]=2,
- [1896]=2,
- [1897]=2,
- [1898]=2,
- [1899]=3,
- [1900]=3,
- [1901]=2,
- [1902]=2,
- [1903]=2,
- [1904]=2,
- [1905]=3,
- [1906]=2,
- [1907]=3,
- [1908]=3,
- [1909]=2,
- [1910]=2,
- [1911]=2,
- [1912]=3,
- [1913]=3,
- [1914]=2,
- [1915]=2,
- [1916]=2,
- [1917]=2,
- [1918]=2,
- [1919]=2,
- [1958]=5,
- [1959]=5,
- [1960]=5,
- [1961]=5,
- [1962]=5,
- [1963]=5,
- [1964]=5,
- [1965]=5,
- [1966]=5,
- [1967]=5,
- [1968]=5,
- [1984]=6,
- [1985]=6,
- [1986]=6,
- [1987]=6,
- [1988]=6,
- [1989]=6,
- [1990]=6,
- [1991]=6,
- [1992]=6,
- [1993]=6,
- [1994]=2,
- [1995]=2,
- [1996]=2,
- [1997]=2,
- [1998]=2,
- [1999]=2,
- [2000]=2,
- [2001]=2,
- [2002]=2,
- [2003]=2,
- [2004]=2,
- [2005]=2,
- [2006]=2,
- [2007]=2,
- [2008]=2,
- [2009]=2,
- [2010]=2,
- [2011]=2,
- [2012]=2,
- [2013]=2,
- [2014]=2,
- [2015]=2,
- [2016]=2,
- [2017]=2,
- [2018]=2,
- [2019]=2,
- [2020]=2,
- [2021]=2,
- [2022]=2,
- [2023]=2,
- [2024]=2,
- [2025]=2,
- [2026]=2,
- [2027]=5,
- [2028]=5,
- [2029]=5,
- [2030]=5,
- [2031]=5,
- [2032]=5,
- [2033]=5,
- [2034]=5,
- [2035]=5,
- [2036]=6,
- [2037]=6,
- [2038]=6,
- [2039]=6,
- [2040]=6,
- [2041]=6,
- [2042]=2,
- [2045]=5,
- [2046]=6,
- [2047]=6,
- [2070]=5,
- [2071]=5,
- [2072]=5,
- [2073]=5,
- [2075]=5,
- [2076]=5,
- [2077]=5,
- [2078]=5,
- [2079]=5,
- [2080]=5,
- [2081]=5,
- [2082]=5,
- [2083]=5,
- [2085]=5,
- [2086]=5,
- [2087]=5,
- [2089]=5,
- [2090]=5,
- [2091]=5,
- [2092]=5,
- [2093]=5,
- [2112]=3,
- [2113]=2,
- [2114]=2,
- [2115]=2,
- [2116]=2,
- [2117]=2,
- [2118]=3,
- [2119]=3,
- [2120]=2,
- [2121]=3,
- [2122]=2,
- [2123]=2,
- [2124]=2,
- [2125]=2,
- [2126]=2,
- [2127]=2,
- [2128]=2,
- [2129]=2,
- [2130]=2,
- [2131]=2,
- [2132]=3,
- [2133]=2,
- [2134]=4,
- [2135]=4,
- [2136]=4,
- [2137]=5,
- [2138]=5,
- [2139]=5,
- [2144]=2,
- [2145]=4,
- [2146]=2,
- [2147]=2,
- [2148]=2,
- [2149]=2,
- [2150]=4,
- [2151]=3,
- [2152]=2,
- [2153]=3,
- [2154]=3,
- [2208]=2,
- [2209]=2,
- [2210]=2,
- [2211]=2,
- [2212]=2,
- [2213]=2,
- [2214]=2,
- [2215]=2,
- [2216]=2,
- [2217]=2,
- [2218]=3,
- [2219]=3,
- [2220]=3,
- [2221]=4,
- [2222]=3,
- [2223]=2,
- [2224]=2,
- [2225]=3,
- [2226]=3,
- [2227]=2,
- [2228]=2,
- [2230]=2,
- [2231]=2,
- [2232]=2,
- [2233]=3,
- [2234]=2,
- [2235]=2,
- [2236]=2,
- [2237]=2,
- [2259]=5,
- [2260]=5,
- [2261]=5,
- [2262]=5,
- [2263]=5,
- [2264]=5,
- [2265]=5,
- [2266]=5,
- [2267]=5,
- [2268]=5,
- [2269]=5,
- [2270]=5,
- [2271]=5,
- [2272]=5,
- [2273]=5,
- [2274]=4,
- [2275]=5,
- [2276]=5,
- [2277]=5,
- [2278]=5,
- [2279]=5,
- [2280]=5,
- [2281]=5,
- [2282]=5,
- [2283]=5,
- [2284]=5,
- [2285]=5,
- [2286]=5,
- [2287]=5,
- [2288]=5,
- [2289]=5,
- [2290]=5,
- [2291]=5,
- [2292]=5,
- [2293]=5,
- [2294]=5,
- [2295]=5,
- [2296]=5,
- [2297]=5,
- [2298]=5,
- [2299]=5,
- [2300]=5,
- [2301]=5,
- [2302]=5,
- [2303]=5,
- [2304]=5,
- [2305]=5,
- [2306]=5,
- [2362]=5,
- [2364]=5,
- [2369]=5,
- [2370]=5,
- [2371]=5,
- [2372]=5,
- [2373]=5,
- [2374]=5,
- [2375]=5,
- [2376]=5,
- [2381]=5,
- [2385]=5,
- [2386]=5,
- [2387]=5,
- [2388]=5,
- [2389]=5,
- [2390]=5,
- [2391]=5,
- [2402]=5,
- [2403]=5,
- [2433]=5,
- [2492]=5,
- [2497]=5,
- [2498]=5,
- [2499]=5,
- [2500]=5,
- [2509]=5,
- [2530]=5,
- [2531]=5,
- [2558]=5,
- [2561]=5,
- [2562]=5,
- [2620]=5,
- [2625]=5,
- [2626]=5,
- [2631]=5,
- [2632]=5,
- [2635]=5,
- [2636]=5,
- [2637]=5,
- [2641]=5,
- [2672]=5,
- [2673]=5,
- [2677]=5,
- [2689]=5,
- [2690]=5,
- [2748]=5,
- [2753]=5,
- [2754]=5,
- [2755]=5,
- [2756]=5,
- [2757]=5,
- [2759]=5,
- [2760]=5,
- [2765]=5,
- [2786]=5,
- [2787]=5,
- [2810]=5,
- [2811]=5,
- [2812]=5,
- [2813]=5,
- [2814]=5,
- [2815]=5,
- [2817]=5,
- [2876]=5,
- [2879]=5,
- [2881]=5,
- [2882]=5,
- [2883]=5,
- [2884]=5,
- [2893]=5,
- [2902]=5,
- [2914]=5,
- [2915]=5,
- [2946]=5,
- [3008]=5,
- [3021]=5,
- [3072]=5,
- [3076]=5,
- [3134]=5,
- [3135]=5,
- [3136]=5,
- [3142]=5,
- [3143]=5,
- [3144]=5,
- [3146]=5,
- [3147]=5,
- [3148]=5,
- [3149]=5,
- [3157]=5,
- [3158]=5,
- [3170]=5,
- [3171]=5,
- [3201]=5,
- [3260]=5,
- [3263]=5,
- [3270]=5,
- [3276]=5,
- [3277]=5,
- [3298]=5,
- [3299]=5,
- [3328]=5,
- [3329]=5,
- [3387]=5,
- [3388]=5,
- [3393]=5,
- [3394]=5,
- [3395]=5,
- [3396]=5,
- [3405]=5,
- [3426]=5,
- [3427]=5,
- [3530]=5,
- [3538]=5,
- [3539]=5,
- [3540]=5,
- [3542]=5,
- [3633]=5,
- [3636]=5,
- [3637]=5,
- [3638]=5,
- [3639]=5,
- [3640]=5,
- [3641]=5,
- [3642]=5,
- [3655]=5,
- [3656]=5,
- [3657]=5,
- [3658]=5,
- [3659]=5,
- [3660]=5,
- [3661]=5,
- [3662]=5,
- [3761]=5,
- [3764]=5,
- [3765]=5,
- [3766]=5,
- [3767]=5,
- [3768]=5,
- [3769]=5,
- [3770]=5,
- [3771]=5,
- [3772]=5,
- [3784]=5,
- [3785]=5,
- [3786]=5,
- [3787]=5,
- [3788]=5,
- [3789]=5,
- [3864]=5,
- [3865]=5,
- [3893]=5,
- [3895]=5,
- [3897]=5,
- [3953]=5,
- [3954]=5,
- [3955]=5,
- [3956]=5,
- [3957]=5,
- [3958]=5,
- [3959]=5,
- [3960]=5,
- [3961]=5,
- [3962]=5,
- [3963]=5,
- [3964]=5,
- [3965]=5,
- [3966]=5,
- [3968]=5,
- [3969]=5,
- [3970]=5,
- [3971]=5,
- [3972]=5,
- [3974]=5,
- [3975]=5,
- [3981]=5,
- [3982]=5,
- [3983]=5,
- [3984]=5,
- [3985]=5,
- [3986]=5,
- [3987]=5,
- [3988]=5,
- [3989]=5,
- [3990]=5,
- [3991]=5,
- [3993]=5,
- [3994]=5,
- [3995]=5,
- [3996]=5,
- [3997]=5,
- [3998]=5,
- [3999]=5,
- [4000]=5,
- [4001]=5,
- [4002]=5,
- [4003]=5,
- [4004]=5,
- [4005]=5,
- [4006]=5,
- [4007]=5,
- [4008]=5,
- [4009]=5,
- [4010]=5,
- [4011]=5,
- [4012]=5,
- [4013]=5,
- [4014]=5,
- [4015]=5,
- [4016]=5,
- [4017]=5,
- [4018]=5,
- [4019]=5,
- [4020]=5,
- [4021]=5,
- [4022]=5,
- [4023]=5,
- [4024]=5,
- [4025]=5,
- [4026]=5,
- [4027]=5,
- [4028]=5,
- [4038]=5,
- [4141]=5,
- [4142]=5,
- [4143]=5,
- [4144]=5,
- [4146]=5,
- [4147]=5,
- [4148]=5,
- [4149]=5,
- [4150]=5,
- [4151]=5,
- [4153]=5,
- [4154]=5,
- [4157]=5,
- [4158]=5,
- [4184]=5,
- [4185]=5,
- [4190]=5,
- [4191]=5,
- [4192]=5,
- [4209]=5,
- [4210]=5,
- [4211]=5,
- [4212]=5,
- [4226]=5,
- [4229]=5,
- [4230]=5,
- [4237]=5,
- [4253]=5,
- [4957]=5,
- [4958]=5,
- [4959]=5,
- [5906]=5,
- [5907]=5,
- [5908]=5,
- [5938]=5,
- [5939]=5,
- [5940]=5,
- [5970]=5,
- [5971]=5,
- [6002]=5,
- [6003]=5,
- [6071]=5,
- [6072]=5,
- [6073]=5,
- [6074]=5,
- [6075]=5,
- [6076]=5,
- [6077]=5,
- [6086]=5,
- [6089]=5,
- [6090]=5,
- [6091]=5,
- [6092]=5,
- [6093]=5,
- [6094]=5,
- [6095]=5,
- [6096]=5,
- [6097]=5,
- [6098]=5,
- [6099]=5,
- [6109]=5,
- [6150]=4,
- [6151]=2,
- [6154]=2,
- [6155]=5,
- [6156]=5,
- [6157]=5,
- [6158]=4,
- [6176]=2,
- [6177]=2,
- [6178]=2,
- [6179]=2,
- [6180]=2,
- [6181]=2,
- [6182]=2,
- [6183]=2,
- [6184]=2,
- [6185]=2,
- [6186]=2,
- [6187]=2,
- [6188]=2,
- [6189]=2,
- [6190]=2,
- [6191]=2,
- [6192]=2,
- [6193]=2,
- [6194]=2,
- [6195]=2,
- [6196]=2,
- [6197]=2,
- [6198]=2,
- [6199]=2,
- [6200]=2,
- [6201]=2,
- [6202]=2,
- [6203]=2,
- [6204]=2,
- [6205]=2,
- [6206]=2,
- [6207]=2,
- [6208]=2,
- [6209]=2,
- [6210]=2,
- [6211]=2,
- [6212]=2,
- [6213]=2,
- [6214]=2,
- [6215]=2,
- [6216]=2,
- [6217]=2,
- [6218]=2,
- [6219]=2,
- [6220]=2,
- [6221]=2,
- [6222]=2,
- [6223]=2,
- [6224]=2,
- [6225]=2,
- [6226]=2,
- [6227]=2,
- [6228]=2,
- [6229]=2,
- [6230]=2,
- [6231]=2,
- [6232]=2,
- [6233]=2,
- [6234]=2,
- [6235]=2,
- [6236]=2,
- [6237]=2,
- [6238]=2,
- [6239]=2,
- [6240]=2,
- [6241]=2,
- [6242]=2,
- [6243]=2,
- [6244]=2,
- [6245]=2,
- [6246]=2,
- [6247]=2,
- [6248]=2,
- [6249]=2,
- [6250]=2,
- [6251]=2,
- [6252]=2,
- [6253]=2,
- [6254]=2,
- [6255]=2,
- [6256]=2,
- [6257]=2,
- [6258]=2,
- [6259]=2,
- [6260]=2,
- [6261]=2,
- [6262]=2,
- [6263]=2,
- [6264]=2,
- [6272]=4,
- [6273]=4,
- [6274]=4,
- [6275]=4,
- [6276]=4,
- [6279]=2,
- [6280]=2,
- [6281]=2,
- [6282]=2,
- [6283]=2,
- [6284]=2,
- [6285]=2,
- [6286]=2,
- [6287]=2,
- [6288]=2,
- [6289]=2,
- [6290]=2,
- [6291]=2,
- [6292]=2,
- [6293]=2,
- [6294]=2,
- [6295]=2,
- [6296]=2,
- [6297]=2,
- [6298]=2,
- [6299]=2,
- [6300]=2,
- [6301]=2,
- [6302]=2,
- [6303]=2,
- [6304]=2,
- [6305]=2,
- [6306]=2,
- [6307]=2,
- [6308]=2,
- [6309]=2,
- [6310]=2,
- [6311]=2,
- [6312]=2,
- [6313]=5,
- [6314]=2,
- [6432]=5,
- [6433]=5,
- [6434]=5,
- [6439]=5,
- [6440]=5,
- [6450]=5,
- [6457]=5,
- [6458]=5,
- [6459]=5,
- [6679]=5,
- [6680]=5,
- [6742]=5,
- [6744]=5,
- [6745]=5,
- [6746]=5,
- [6747]=5,
- [6748]=5,
- [6749]=5,
- [6750]=5,
- [6752]=5,
- [6754]=5,
- [6757]=5,
- [6758]=5,
- [6759]=5,
- [6760]=5,
- [6761]=5,
- [6762]=5,
- [6763]=5,
- [6764]=5,
- [6771]=5,
- [6772]=5,
- [6773]=5,
- [6774]=5,
- [6775]=5,
- [6776]=5,
- [6777]=5,
- [6778]=5,
- [6779]=5,
- [6780]=5,
- [6783]=5,
- [6832]=5,
- [6833]=5,
- [6834]=5,
- [6835]=5,
- [6836]=5,
- [6837]=5,
- [6838]=5,
- [6839]=5,
- [6840]=5,
- [6841]=5,
- [6842]=5,
- [6843]=5,
- [6844]=5,
- [6845]=5,
- [6912]=5,
- [6913]=5,
- [6914]=5,
- [6915]=5,
- [6964]=5,
- [6966]=5,
- [6967]=5,
- [6968]=5,
- [6969]=5,
- [6970]=5,
- [6972]=5,
- [6978]=5,
- [7019]=5,
- [7020]=5,
- [7021]=5,
- [7022]=5,
- [7023]=5,
- [7024]=5,
- [7025]=5,
- [7026]=5,
- [7027]=5,
- [7040]=5,
- [7041]=5,
- [7074]=5,
- [7075]=5,
- [7076]=5,
- [7077]=5,
- [7080]=5,
- [7081]=5,
- [7083]=5,
- [7142]=5,
- [7144]=5,
- [7145]=5,
- [7149]=5,
- [7151]=5,
- [7152]=5,
- [7153]=5,
- [7212]=5,
- [7213]=5,
- [7214]=5,
- [7215]=5,
- [7216]=5,
- [7217]=5,
- [7218]=5,
- [7219]=5,
- [7222]=5,
- [7223]=5,
- [7376]=5,
- [7377]=5,
- [7378]=5,
- [7380]=5,
- [7381]=5,
- [7382]=5,
- [7383]=5,
- [7384]=5,
- [7385]=5,
- [7386]=5,
- [7387]=5,
- [7388]=5,
- [7389]=5,
- [7390]=5,
- [7391]=5,
- [7392]=5,
- [7394]=5,
- [7395]=5,
- [7396]=5,
- [7397]=5,
- [7398]=5,
- [7399]=5,
- [7400]=5,
- [7405]=5,
- [7412]=5,
- [7416]=5,
- [7417]=5,
- [7616]=5,
- [7617]=5,
- [7618]=5,
- [7619]=5,
- [7620]=5,
- [7621]=5,
- [7622]=5,
- [7623]=5,
- [7624]=5,
- [7625]=5,
- [7626]=5,
- [7627]=5,
- [7628]=5,
- [7629]=5,
- [7630]=5,
- [7631]=5,
- [7632]=5,
- [7633]=5,
- [7634]=5,
- [7635]=5,
- [7636]=5,
- [7637]=5,
- [7638]=5,
- [7639]=5,
- [7640]=5,
- [7641]=5,
- [7642]=5,
- [7643]=5,
- [7644]=5,
- [7645]=5,
- [7646]=5,
- [7647]=5,
- [7648]=5,
- [7649]=5,
- [7650]=5,
- [7651]=5,
- [7652]=5,
- [7653]=5,
- [7654]=5,
- [7655]=5,
- [7656]=5,
- [7657]=5,
- [7658]=5,
- [7659]=5,
- [7660]=5,
- [7661]=5,
- [7662]=5,
- [7663]=5,
- [7664]=5,
- [7665]=5,
- [7666]=5,
- [7667]=5,
- [7668]=5,
- [7669]=5,
- [7670]=5,
- [7671]=5,
- [7672]=5,
- [7673]=5,
- [7675]=5,
- [7676]=5,
- [7677]=5,
- [7678]=5,
- [7679]=5,
- [8204]=4,
- [8205]=2,
- [8239]=4,
- [8294]=4,
- [8295]=4,
- [8296]=4,
- [8297]=4,
- [8400]=5,
- [8401]=5,
- [8402]=5,
- [8403]=5,
- [8404]=5,
- [8405]=5,
- [8406]=5,
- [8407]=5,
- [8408]=5,
- [8409]=5,
- [8410]=5,
- [8411]=5,
- [8412]=5,
- [8417]=5,
- [8421]=5,
- [8422]=5,
- [8423]=5,
- [8424]=5,
- [8425]=5,
- [8426]=5,
- [8427]=5,
- [8428]=5,
- [8429]=5,
- [8430]=5,
- [8431]=5,
- [8432]=5,
- [11503]=5,
- [11504]=5,
- [11505]=5,
- [11647]=5,
- [11744]=5,
- [11745]=5,
- [11746]=5,
- [11747]=5,
- [11748]=5,
- [11749]=5,
- [11750]=5,
- [11751]=5,
- [11752]=5,
- [11753]=5,
- [11754]=5,
- [11755]=5,
- [11756]=5,
- [11757]=5,
- [11758]=5,
- [11759]=5,
- [11760]=5,
- [11761]=5,
- [11762]=5,
- [11763]=5,
- [11764]=5,
- [11765]=5,
- [11766]=5,
- [11767]=5,
- [11768]=5,
- [11769]=5,
- [11770]=5,
- [11771]=5,
- [11772]=5,
- [11773]=5,
- [11774]=5,
- [11775]=5,
- [12330]=5,
- [12331]=5,
- [12332]=5,
- [12333]=5,
- [12334]=5,
- [12335]=5,
- [12441]=5,
- [12442]=5,
- [42607]=5,
- [42612]=5,
- [42613]=5,
- [42614]=5,
- [42615]=5,
- [42616]=5,
- [42617]=5,
- [42618]=5,
- [42619]=5,
- [42620]=5,
- [42621]=5,
- [42654]=5,
- [42655]=5,
- [42736]=5,
- [42737]=5,
- [43014]=5,
- [43019]=5,
- [43045]=5,
- [43046]=5,
- [43072]=2,
- [43073]=2,
- [43074]=2,
- [43075]=2,
- [43076]=2,
- [43077]=2,
- [43078]=2,
- [43079]=2,
- [43080]=2,
- [43081]=2,
- [43082]=2,
- [43083]=2,
- [43084]=2,
- [43085]=2,
- [43086]=2,
- [43087]=2,
- [43088]=2,
- [43089]=2,
- [43090]=2,
- [43091]=2,
- [43092]=2,
- [43093]=2,
- [43094]=2,
- [43095]=2,
- [43096]=2,
- [43097]=2,
- [43098]=2,
- [43099]=2,
- [43100]=2,
- [43101]=2,
- [43102]=2,
- [43103]=2,
- [43104]=2,
- [43105]=2,
- [43106]=2,
- [43107]=2,
- [43108]=2,
- [43109]=2,
- [43110]=2,
- [43111]=2,
- [43112]=2,
- [43113]=2,
- [43114]=2,
- [43115]=2,
- [43116]=2,
- [43117]=2,
- [43118]=2,
- [43119]=2,
- [43120]=2,
- [43121]=2,
- [43122]=1,
- [43123]=4,
- [43204]=5,
- [43205]=5,
- [43232]=5,
- [43233]=5,
- [43234]=5,
- [43235]=5,
- [43236]=5,
- [43237]=5,
- [43238]=5,
- [43239]=5,
- [43240]=5,
- [43241]=5,
- [43242]=5,
- [43243]=5,
- [43244]=5,
- [43245]=5,
- [43246]=5,
- [43247]=5,
- [43248]=5,
- [43249]=5,
- [43263]=5,
- [43302]=5,
- [43303]=5,
- [43304]=5,
- [43305]=5,
- [43306]=5,
- [43307]=5,
- [43308]=5,
- [43309]=5,
- [43335]=5,
- [43336]=5,
- [43337]=5,
- [43338]=5,
- [43339]=5,
- [43340]=5,
- [43341]=5,
- [43342]=5,
- [43343]=5,
- [43344]=5,
- [43345]=5,
- [43392]=5,
- [43393]=5,
- [43394]=5,
- [43443]=5,
- [43446]=5,
- [43447]=5,
- [43448]=5,
- [43449]=5,
- [43452]=5,
- [43493]=5,
- [43561]=5,
- [43562]=5,
- [43563]=5,
- [43564]=5,
- [43565]=5,
- [43566]=5,
- [43569]=5,
- [43570]=5,
- [43573]=5,
- [43574]=5,
- [43587]=5,
- [43596]=5,
- [43644]=5,
- [43696]=5,
- [43698]=5,
- [43699]=5,
- [43700]=5,
- [43703]=5,
- [43704]=5,
- [43710]=5,
- [43711]=5,
- [43713]=5,
- [43756]=5,
- [43757]=5,
- [43766]=5,
- [44005]=5,
- [44008]=5,
- [44013]=5,
- [64286]=5,
- [65056]=5,
- [65057]=5,
- [65058]=5,
- [65059]=5,
- [65060]=5,
- [65061]=5,
- [65062]=5,
- [65063]=5,
- [65064]=5,
- [65065]=5,
- [65066]=5,
- [65067]=5,
- [65068]=5,
- [65069]=5,
- [65070]=5,
- [65071]=5,
- [66045]=5,
- [66272]=5,
- [66422]=5,
- [66423]=5,
- [66424]=5,
- [66425]=5,
- [66426]=5,
- [68097]=5,
- [68098]=5,
- [68099]=5,
- [68101]=5,
- [68102]=5,
- [68108]=5,
- [68109]=5,
- [68110]=5,
- [68111]=5,
- [68152]=5,
- [68153]=5,
- [68154]=5,
- [68159]=5,
- [68288]=2,
- [68289]=2,
- [68290]=2,
- [68291]=2,
- [68292]=2,
- [68293]=3,
- [68294]=4,
- [68295]=3,
- [68296]=4,
- [68297]=3,
- [68298]=3,
- [68299]=4,
- [68300]=4,
- [68301]=1,
- [68302]=3,
- [68303]=3,
- [68304]=3,
- [68305]=3,
- [68306]=3,
- [68307]=2,
- [68308]=2,
- [68309]=2,
- [68310]=2,
- [68311]=1,
- [68312]=2,
- [68313]=2,
- [68314]=2,
- [68315]=2,
- [68316]=2,
- [68317]=3,
- [68318]=2,
- [68319]=2,
- [68320]=2,
- [68321]=3,
- [68322]=4,
- [68323]=4,
- [68324]=3,
- [68325]=5,
- [68326]=5,
- [68331]=2,
- [68332]=2,
- [68333]=2,
- [68334]=2,
- [68335]=3,
- [68480]=2,
- [68481]=3,
- [68482]=2,
- [68483]=3,
- [68484]=3,
- [68485]=3,
- [68486]=2,
- [68487]=2,
- [68488]=2,
- [68489]=3,
- [68490]=2,
- [68491]=2,
- [68492]=3,
- [68493]=2,
- [68494]=3,
- [68495]=3,
- [68496]=2,
- [68497]=3,
- [68521]=3,
- [68522]=3,
- [68523]=3,
- [68524]=3,
- [68525]=2,
- [68526]=2,
- [68527]=4,
- [68864]=1,
- [68865]=2,
- [68866]=2,
- [68867]=2,
- [68868]=2,
- [68869]=2,
- [68870]=2,
- [68871]=2,
- [68872]=2,
- [68873]=2,
- [68874]=2,
- [68875]=2,
- [68876]=2,
- [68877]=2,
- [68878]=2,
- [68879]=2,
- [68880]=2,
- [68881]=2,
- [68882]=2,
- [68883]=2,
- [68884]=2,
- [68885]=2,
- [68886]=2,
- [68887]=2,
- [68888]=2,
- [68889]=2,
- [68890]=2,
- [68891]=2,
- [68892]=2,
- [68893]=2,
- [68894]=2,
- [68895]=2,
- [68896]=2,
- [68897]=2,
- [68898]=3,
- [68899]=2,
- [68900]=5,
- [68901]=5,
- [68902]=5,
- [68903]=5,
- [69424]=2,
- [69425]=2,
- [69426]=2,
- [69427]=3,
- [69428]=2,
- [69429]=2,
- [69430]=2,
- [69431]=2,
- [69432]=2,
- [69433]=2,
- [69434]=2,
- [69435]=2,
- [69436]=2,
- [69437]=2,
- [69438]=2,
- [69439]=2,
- [69440]=2,
- [69441]=2,
- [69442]=2,
- [69443]=2,
- [69444]=2,
- [69445]=4,
- [69446]=5,
- [69447]=5,
- [69448]=5,
- [69449]=5,
- [69450]=5,
- [69451]=5,
- [69452]=5,
- [69453]=5,
- [69454]=5,
- [69455]=5,
- [69456]=5,
- [69457]=2,
- [69458]=2,
- [69459]=2,
- [69460]=3,
- [69633]=5,
- [69688]=5,
- [69689]=5,
- [69690]=5,
- [69691]=5,
- [69692]=5,
- [69693]=5,
- [69694]=5,
- [69695]=5,
- [69696]=5,
- [69697]=5,
- [69698]=5,
- [69699]=5,
- [69700]=5,
- [69701]=5,
- [69702]=5,
- [69759]=5,
- [69760]=5,
- [69761]=5,
- [69811]=5,
- [69812]=5,
- [69813]=5,
- [69814]=5,
- [69817]=5,
- [69818]=5,
- [69821]=4,
- [69837]=4,
- [69888]=5,
- [69889]=5,
- [69890]=5,
- [69927]=5,
- [69928]=5,
- [69929]=5,
- [69930]=5,
- [69931]=5,
- [69933]=5,
- [69934]=5,
- [69935]=5,
- [69936]=5,
- [69937]=5,
- [69938]=5,
- [69939]=5,
- [69940]=5,
- [70003]=5,
- [70016]=5,
- [70017]=5,
- [70070]=5,
- [70071]=5,
- [70072]=5,
- [70073]=5,
- [70074]=5,
- [70075]=5,
- [70076]=5,
- [70077]=5,
- [70078]=5,
- [70090]=5,
- [70091]=5,
- [70092]=5,
- [70191]=5,
- [70192]=5,
- [70193]=5,
- [70196]=5,
- [70198]=5,
- [70199]=5,
- [70206]=5,
- [70367]=5,
- [70371]=5,
- [70372]=5,
- [70373]=5,
- [70374]=5,
- [70375]=5,
- [70376]=5,
- [70377]=5,
- [70378]=5,
- [70400]=5,
- [70401]=5,
- [70459]=5,
- [70460]=5,
- [70464]=5,
- [70502]=5,
- [70503]=5,
- [70504]=5,
- [70505]=5,
- [70506]=5,
- [70507]=5,
- [70508]=5,
- [70512]=5,
- [70513]=5,
- [70514]=5,
- [70515]=5,
- [70516]=5,
- [70712]=5,
- [70713]=5,
- [70714]=5,
- [70715]=5,
- [70716]=5,
- [70717]=5,
- [70718]=5,
- [70719]=5,
- [70722]=5,
- [70723]=5,
- [70724]=5,
- [70726]=5,
- [70750]=5,
- [70835]=5,
- [70836]=5,
- [70837]=5,
- [70838]=5,
- [70839]=5,
- [70840]=5,
- [70842]=5,
- [70847]=5,
- [70848]=5,
- [70850]=5,
- [70851]=5,
- [71090]=5,
- [71091]=5,
- [71092]=5,
- [71093]=5,
- [71100]=5,
- [71101]=5,
- [71103]=5,
- [71104]=5,
- [71132]=5,
- [71133]=5,
- [71219]=5,
- [71220]=5,
- [71221]=5,
- [71222]=5,
- [71223]=5,
- [71224]=5,
- [71225]=5,
- [71226]=5,
- [71229]=5,
- [71231]=5,
- [71232]=5,
- [71339]=5,
- [71341]=5,
- [71344]=5,
- [71345]=5,
- [71346]=5,
- [71347]=5,
- [71348]=5,
- [71349]=5,
- [71351]=5,
- [71453]=5,
- [71454]=5,
- [71455]=5,
- [71458]=5,
- [71459]=5,
- [71460]=5,
- [71461]=5,
- [71463]=5,
- [71464]=5,
- [71465]=5,
- [71466]=5,
- [71467]=5,
- [71727]=5,
- [71728]=5,
- [71729]=5,
- [71730]=5,
- [71731]=5,
- [71732]=5,
- [71733]=5,
- [71734]=5,
- [71735]=5,
- [71737]=5,
- [71738]=5,
- [72148]=5,
- [72149]=5,
- [72150]=5,
- [72151]=5,
- [72154]=5,
- [72155]=5,
- [72160]=5,
- [72193]=5,
- [72194]=5,
- [72195]=5,
- [72196]=5,
- [72197]=5,
- [72198]=5,
- [72201]=5,
- [72202]=5,
- [72243]=5,
- [72244]=5,
- [72245]=5,
- [72246]=5,
- [72247]=5,
- [72248]=5,
- [72251]=5,
- [72252]=5,
- [72253]=5,
- [72254]=5,
- [72263]=5,
- [72273]=5,
- [72274]=5,
- [72275]=5,
- [72276]=5,
- [72277]=5,
- [72278]=5,
- [72281]=5,
- [72282]=5,
- [72283]=5,
- [72330]=5,
- [72331]=5,
- [72332]=5,
- [72333]=5,
- [72334]=5,
- [72335]=5,
- [72336]=5,
- [72337]=5,
- [72338]=5,
- [72339]=5,
- [72340]=5,
- [72341]=5,
- [72342]=5,
- [72344]=5,
- [72345]=5,
- [72752]=5,
- [72753]=5,
- [72754]=5,
- [72755]=5,
- [72756]=5,
- [72757]=5,
- [72758]=5,
- [72760]=5,
- [72761]=5,
- [72762]=5,
- [72763]=5,
- [72764]=5,
- [72765]=5,
- [72767]=5,
- [72850]=5,
- [72851]=5,
- [72852]=5,
- [72853]=5,
- [72854]=5,
- [72855]=5,
- [72856]=5,
- [72857]=5,
- [72858]=5,
- [72859]=5,
- [72860]=5,
- [72861]=5,
- [72862]=5,
- [72863]=5,
- [72864]=5,
- [72865]=5,
- [72866]=5,
- [72867]=5,
- [72868]=5,
- [72869]=5,
- [72870]=5,
- [72871]=5,
- [72874]=5,
- [72875]=5,
- [72876]=5,
- [72877]=5,
- [72878]=5,
- [72879]=5,
- [72880]=5,
- [72882]=5,
- [72883]=5,
- [72885]=5,
- [72886]=5,
- [73009]=5,
- [73010]=5,
- [73011]=5,
- [73012]=5,
- [73013]=5,
- [73014]=5,
- [73018]=5,
- [73020]=5,
- [73021]=5,
- [73023]=5,
- [73024]=5,
- [73025]=5,
- [73026]=5,
- [73027]=5,
- [73028]=5,
- [73029]=5,
- [73031]=5,
- [73104]=5,
- [73105]=5,
- [73109]=5,
- [73111]=5,
- [73459]=5,
- [73460]=5,
- [92912]=5,
- [92913]=5,
- [92914]=5,
- [92915]=5,
- [92916]=5,
- [92976]=5,
- [92977]=5,
- [92978]=5,
- [92979]=5,
- [92980]=5,
- [92981]=5,
- [92982]=5,
- [94031]=5,
- [94095]=5,
- [94096]=5,
- [94097]=5,
- [94098]=5,
- [113821]=5,
- [113822]=5,
- [119143]=5,
- [119144]=5,
- [119145]=5,
- [119163]=5,
- [119164]=5,
- [119165]=5,
- [119166]=5,
- [119167]=5,
- [119168]=5,
- [119169]=5,
- [119170]=5,
- [119173]=5,
- [119174]=5,
- [119175]=5,
- [119176]=5,
- [119177]=5,
- [119178]=5,
- [119179]=5,
- [119210]=5,
- [119211]=5,
- [119212]=5,
- [119213]=5,
- [119362]=5,
- [119363]=5,
- [119364]=5,
- [121344]=5,
- [121345]=5,
- [121346]=5,
- [121347]=5,
- [121348]=5,
- [121349]=5,
- [121350]=5,
- [121351]=5,
- [121352]=5,
- [121353]=5,
- [121354]=5,
- [121355]=5,
- [121356]=5,
- [121357]=5,
- [121358]=5,
- [121359]=5,
- [121360]=5,
- [121361]=5,
- [121362]=5,
- [121363]=5,
- [121364]=5,
- [121365]=5,
- [121366]=5,
- [121367]=5,
- [121368]=5,
- [121369]=5,
- [121370]=5,
- [121371]=5,
- [121372]=5,
- [121373]=5,
- [121374]=5,
- [121375]=5,
- [121376]=5,
- [121377]=5,
- [121378]=5,
- [121379]=5,
- [121380]=5,
- [121381]=5,
- [121382]=5,
- [121383]=5,
- [121384]=5,
- [121385]=5,
- [121386]=5,
- [121387]=5,
- [121388]=5,
- [121389]=5,
- [121390]=5,
- [121391]=5,
- [121392]=5,
- [121393]=5,
- [121394]=5,
- [121395]=5,
- [121396]=5,
- [121397]=5,
- [121398]=5,
- [121403]=5,
- [121404]=5,
- [121405]=5,
- [121406]=5,
- [121407]=5,
- [121408]=5,
- [121409]=5,
- [121410]=5,
- [121411]=5,
- [121412]=5,
- [121413]=5,
- [121414]=5,
- [121415]=5,
- [121416]=5,
- [121417]=5,
- [121418]=5,
- [121419]=5,
- [121420]=5,
- [121421]=5,
- [121422]=5,
- [121423]=5,
- [121424]=5,
- [121425]=5,
- [121426]=5,
- [121427]=5,
- [121428]=5,
- [121429]=5,
- [121430]=5,
- [121431]=5,
- [121432]=5,
- [121433]=5,
- [121434]=5,
- [121435]=5,
- [121436]=5,
- [121437]=5,
- [121438]=5,
- [121439]=5,
- [121440]=5,
- [121441]=5,
- [121442]=5,
- [121443]=5,
- [121444]=5,
- [121445]=5,
- [121446]=5,
- [121447]=5,
- [121448]=5,
- [121449]=5,
- [121450]=5,
- [121451]=5,
- [121452]=5,
- [121461]=5,
- [121476]=5,
- [121499]=5,
- [121500]=5,
- [121501]=5,
- [121502]=5,
- [121503]=5,
- [121505]=5,
- [121506]=5,
- [121507]=5,
- [121508]=5,
- [121509]=5,
- [121510]=5,
- [121511]=5,
- [121512]=5,
- [121513]=5,
- [121514]=5,
- [121515]=5,
- [121516]=5,
- [121517]=5,
- [121518]=5,
- [121519]=5,
- [122880]=5,
- [122881]=5,
- [122882]=5,
- [122883]=5,
- [122884]=5,
- [122885]=5,
- [122886]=5,
- [122888]=5,
- [122889]=5,
- [122890]=5,
- [122891]=5,
- [122892]=5,
- [122893]=5,
- [122894]=5,
- [122895]=5,
- [122896]=5,
- [122897]=5,
- [122898]=5,
- [122899]=5,
- [122900]=5,
- [122901]=5,
- [122902]=5,
- [122903]=5,
- [122904]=5,
- [122907]=5,
- [122908]=5,
- [122909]=5,
- [122910]=5,
- [122911]=5,
- [122912]=5,
- [122913]=5,
- [122915]=5,
- [122916]=5,
- [122918]=5,
- [122919]=5,
- [122920]=5,
- [122921]=5,
- [122922]=5,
- [123184]=5,
- [123185]=5,
- [123186]=5,
- [123187]=5,
- [123188]=5,
- [123189]=5,
- [123190]=5,
- [123628]=5,
- [123629]=5,
- [123630]=5,
- [123631]=5,
- [125136]=5,
- [125137]=5,
- [125138]=5,
- [125139]=5,
- [125140]=5,
- [125141]=5,
- [125142]=5,
- [125184]=2,
- [125185]=2,
- [125186]=2,
- [125187]=2,
- [125188]=2,
- [125189]=2,
- [125190]=2,
- [125191]=2,
- [125192]=2,
- [125193]=2,
- [125194]=2,
- [125195]=2,
- [125196]=2,
- [125197]=2,
- [125198]=2,
- [125199]=2,
- [125200]=2,
- [125201]=2,
- [125202]=2,
- [125203]=2,
- [125204]=2,
- [125205]=2,
- [125206]=2,
- [125207]=2,
- [125208]=2,
- [125209]=2,
- [125210]=2,
- [125211]=2,
- [125212]=2,
- [125213]=2,
- [125214]=2,
- [125215]=2,
- [125216]=2,
- [125217]=2,
- [125218]=2,
- [125219]=2,
- [125220]=2,
- [125221]=2,
- [125222]=2,
- [125223]=2,
- [125224]=2,
- [125225]=2,
- [125226]=2,
- [125227]=2,
- [125228]=2,
- [125229]=2,
- [125230]=2,
- [125231]=2,
- [125232]=2,
- [125233]=2,
- [125234]=2,
- [125235]=2,
- [125236]=2,
- [125237]=2,
- [125238]=2,
- [125239]=2,
- [125240]=2,
- [125241]=2,
- [125242]=2,
- [125243]=2,
- [125244]=2,
- [125245]=2,
- [125246]=2,
- [125247]=2,
- [125248]=2,
- [125249]=2,
- [125250]=2,
- [125251]=2,
- [125252]=5,
- [125253]=5,
- [125254]=5,
- [125255]=5,
- [125256]=5,
- [125257]=5,
- [125258]=5,
- [1042752]=5,
-}
-characters.indicgroups={
- ["above_mark"]={
- [2304]=true,
- [2305]=true,
- [2306]=true,
- [2362]=true,
- [2373]=true,
- [2374]=true,
- [2375]=true,
- [2376]=true,
- [2385]=true,
- [2387]=true,
- [2388]=true,
- [2389]=true,
- [2631]=true,
- [2632]=true,
- [2635]=true,
- [2636]=true,
- [2690]=true,
- [2757]=true,
- [2759]=true,
- [2760]=true,
- [2879]=true,
- [3008]=true,
- [3021]=true,
- [3134]=true,
- [3135]=true,
- [3136]=true,
- [3142]=true,
- [3143]=true,
- [3146]=true,
- [3147]=true,
- [3148]=true,
- [3149]=true,
- [3263]=true,
- [3270]=true,
- [3406]=true,
- [4141]=true,
- [4142]=true,
- [4146]=true,
- [4147]=true,
- [4148]=true,
- [4149]=true,
- [4150]=true,
- [4154]=true,
- [4209]=true,
- [4210]=true,
- [4211]=true,
- [4212]=true,
- [4229]=true,
- [4230]=true,
- [4253]=true,
- [43232]=true,
- [43233]=true,
- [43234]=true,
- [43235]=true,
- [43236]=true,
- [43237]=true,
- [43238]=true,
- [43239]=true,
- [43240]=true,
- [43241]=true,
- [43242]=true,
- [43243]=true,
- [43244]=true,
- [43245]=true,
- [43246]=true,
- [43247]=true,
- [43248]=true,
- [43249]=true,
- [43493]=true,
- [43644]=true,
- },
- ["after_half"]={},
- ["after_main"]={
- [2864]=true,
- [2879]=true,
- [2902]=true,
- [3376]=true,
- },
- ["after_postscript"]={
- [2433]=true,
- [2494]=true,
- [2496]=true,
- [2519]=true,
- [2561]=true,
- [2562]=true,
- [2622]=true,
- [2624]=true,
- [2625]=true,
- [2626]=true,
- [2672]=true,
- [2673]=true,
- [2735]=true,
- [2750]=true,
- [2752]=true,
- [2753]=true,
- [2754]=true,
- [2755]=true,
- [2756]=true,
- [2761]=true,
- [2763]=true,
- [2764]=true,
- [2786]=true,
- [2787]=true,
- [2878]=true,
- [2880]=true,
- [2903]=true,
- [2992]=true,
- [3006]=true,
- [3007]=true,
- [3009]=true,
- [3010]=true,
- [3031]=true,
- [3120]=true,
- [3248]=true,
- [3390]=true,
- [3391]=true,
- [3392]=true,
- [3393]=true,
- [3394]=true,
- [3395]=true,
- [3415]=true,
- },
- ["after_subscript"]={
- [2366]=true,
- [2368]=true,
- [2369]=true,
- [2370]=true,
- [2371]=true,
- [2372]=true,
- [2373]=true,
- [2374]=true,
- [2375]=true,
- [2376]=true,
- [2377]=true,
- [2378]=true,
- [2379]=true,
- [2380]=true,
- [2402]=true,
- [2403]=true,
- [2480]=true,
- [2497]=true,
- [2498]=true,
- [2499]=true,
- [2500]=true,
- [2530]=true,
- [2531]=true,
- [2544]=true,
- [2631]=true,
- [2632]=true,
- [2635]=true,
- [2636]=true,
- [2757]=true,
- [2759]=true,
- [2760]=true,
- [2881]=true,
- [2882]=true,
- [2883]=true,
- [3008]=true,
- [3139]=true,
- [3140]=true,
- [3267]=true,
- [3268]=true,
- [3285]=true,
- [3286]=true,
- },
- ["anudatta"]={
- [2386]=true,
- },
- ["before_half"]={
- [2367]=true,
- [2382]=true,
- [2495]=true,
- [2503]=true,
- [2504]=true,
- [2623]=true,
- [2751]=true,
- [2887]=true,
- },
- ["before_main"]={
- [3014]=true,
- [3015]=true,
- [3016]=true,
- [3398]=true,
- [3399]=true,
- [3400]=true,
- },
- ["before_postscript"]={
- [2352]=true,
- [2736]=true,
- },
- ["before_subscript"]={
- [2608]=true,
- [2817]=true,
- [3134]=true,
- [3135]=true,
- [3136]=true,
- [3137]=true,
- [3138]=true,
- [3142]=true,
- [3143]=true,
- [3146]=true,
- [3147]=true,
- [3148]=true,
- [3157]=true,
- [3158]=true,
- [3262]=true,
- [3263]=true,
- [3265]=true,
- [3266]=true,
- [3270]=true,
- [3276]=true,
- [3298]=true,
- [3299]=true,
- },
- ["below_mark"]={
- [2364]=true,
- [2369]=true,
- [2370]=true,
- [2371]=true,
- [2372]=true,
- [2381]=true,
- [2386]=true,
- [2390]=true,
- [2391]=true,
- [2402]=true,
- [2403]=true,
- [2492]=true,
- [2497]=true,
- [2498]=true,
- [2499]=true,
- [2500]=true,
- [2509]=true,
- [2620]=true,
- [2625]=true,
- [2626]=true,
- [2637]=true,
- [2748]=true,
- [2753]=true,
- [2754]=true,
- [2755]=true,
- [2756]=true,
- [2765]=true,
- [2876]=true,
- [2881]=true,
- [2882]=true,
- [2883]=true,
- [2884]=true,
- [2893]=true,
- [2914]=true,
- [2915]=true,
- [3009]=true,
- [3010]=true,
- [3170]=true,
- [3171]=true,
- [3260]=true,
- [3286]=true,
- [3298]=true,
- [3299]=true,
- [3426]=true,
- [3427]=true,
- [4143]=true,
- [4144]=true,
- [4151]=true,
- [4153]=true,
- [4157]=true,
- [4158]=true,
- [4184]=true,
- [4185]=true,
- [4190]=true,
- [4191]=true,
- [4192]=true,
- [4226]=true,
- [4237]=true,
- },
- ["consonant"]={
- [2325]=true,
- [2326]=true,
- [2327]=true,
- [2328]=true,
- [2329]=true,
- [2330]=true,
- [2331]=true,
- [2332]=true,
- [2333]=true,
- [2334]=true,
- [2335]=true,
- [2336]=true,
- [2337]=true,
- [2338]=true,
- [2339]=true,
- [2340]=true,
- [2341]=true,
- [2342]=true,
- [2343]=true,
- [2344]=true,
- [2345]=true,
- [2346]=true,
- [2347]=true,
- [2348]=true,
- [2349]=true,
- [2350]=true,
- [2351]=true,
- [2352]=true,
- [2353]=true,
- [2354]=true,
- [2355]=true,
- [2356]=true,
- [2357]=true,
- [2358]=true,
- [2359]=true,
- [2360]=true,
- [2361]=true,
- [2392]=true,
- [2393]=true,
- [2394]=true,
- [2395]=true,
- [2396]=true,
- [2397]=true,
- [2398]=true,
- [2399]=true,
- [2424]=true,
- [2425]=true,
- [2426]=true,
- [2453]=true,
- [2454]=true,
- [2455]=true,
- [2456]=true,
- [2457]=true,
- [2458]=true,
- [2459]=true,
- [2460]=true,
- [2461]=true,
- [2462]=true,
- [2463]=true,
- [2464]=true,
- [2465]=true,
- [2466]=true,
- [2467]=true,
- [2468]=true,
- [2469]=true,
- [2470]=true,
- [2471]=true,
- [2472]=true,
- [2474]=true,
- [2475]=true,
- [2476]=true,
- [2477]=true,
- [2478]=true,
- [2479]=true,
- [2480]=true,
- [2482]=true,
- [2486]=true,
- [2487]=true,
- [2488]=true,
- [2489]=true,
- [2510]=true,
- [2524]=true,
- [2525]=true,
- [2527]=true,
- [2581]=true,
- [2582]=true,
- [2583]=true,
- [2584]=true,
- [2585]=true,
- [2586]=true,
- [2587]=true,
- [2588]=true,
- [2589]=true,
- [2590]=true,
- [2591]=true,
- [2592]=true,
- [2593]=true,
- [2594]=true,
- [2595]=true,
- [2596]=true,
- [2597]=true,
- [2598]=true,
- [2599]=true,
- [2600]=true,
- [2602]=true,
- [2603]=true,
- [2604]=true,
- [2605]=true,
- [2606]=true,
- [2607]=true,
- [2608]=true,
- [2610]=true,
- [2611]=true,
- [2613]=true,
- [2614]=true,
- [2616]=true,
- [2617]=true,
- [2649]=true,
- [2650]=true,
- [2651]=true,
- [2652]=true,
- [2654]=true,
- [2709]=true,
- [2710]=true,
- [2711]=true,
- [2712]=true,
- [2713]=true,
- [2714]=true,
- [2715]=true,
- [2716]=true,
- [2717]=true,
- [2718]=true,
- [2719]=true,
- [2720]=true,
- [2721]=true,
- [2722]=true,
- [2723]=true,
- [2724]=true,
- [2725]=true,
- [2726]=true,
- [2727]=true,
- [2728]=true,
- [2730]=true,
- [2731]=true,
- [2732]=true,
- [2733]=true,
- [2734]=true,
- [2735]=true,
- [2736]=true,
- [2738]=true,
- [2739]=true,
- [2741]=true,
- [2742]=true,
- [2743]=true,
- [2744]=true,
- [2745]=true,
- [2837]=true,
- [2838]=true,
- [2839]=true,
- [2840]=true,
- [2841]=true,
- [2842]=true,
- [2843]=true,
- [2844]=true,
- [2845]=true,
- [2846]=true,
- [2847]=true,
- [2848]=true,
- [2849]=true,
- [2850]=true,
- [2851]=true,
- [2852]=true,
- [2853]=true,
- [2854]=true,
- [2855]=true,
- [2856]=true,
- [2858]=true,
- [2859]=true,
- [2860]=true,
- [2861]=true,
- [2862]=true,
- [2863]=true,
- [2864]=true,
- [2866]=true,
- [2867]=true,
- [2869]=true,
- [2870]=true,
- [2871]=true,
- [2872]=true,
- [2873]=true,
- [2908]=true,
- [2909]=true,
- [2929]=true,
- [2965]=true,
- [2969]=true,
- [2970]=true,
- [2972]=true,
- [2974]=true,
- [2975]=true,
- [2979]=true,
- [2980]=true,
- [2984]=true,
- [2985]=true,
- [2986]=true,
- [2990]=true,
- [2991]=true,
- [2992]=true,
- [2993]=true,
- [2994]=true,
- [2995]=true,
- [2996]=true,
- [2997]=true,
- [2998]=true,
- [2999]=true,
- [3000]=true,
- [3001]=true,
- [3093]=true,
- [3094]=true,
- [3095]=true,
- [3096]=true,
- [3097]=true,
- [3098]=true,
- [3099]=true,
- [3100]=true,
- [3101]=true,
- [3102]=true,
- [3103]=true,
- [3104]=true,
- [3105]=true,
- [3106]=true,
- [3107]=true,
- [3108]=true,
- [3109]=true,
- [3110]=true,
- [3111]=true,
- [3112]=true,
- [3114]=true,
- [3115]=true,
- [3116]=true,
- [3117]=true,
- [3118]=true,
- [3119]=true,
- [3120]=true,
- [3121]=true,
- [3122]=true,
- [3123]=true,
- [3124]=true,
- [3125]=true,
- [3126]=true,
- [3127]=true,
- [3128]=true,
- [3129]=true,
- [3133]=true,
- [3221]=true,
- [3222]=true,
- [3223]=true,
- [3224]=true,
- [3225]=true,
- [3226]=true,
- [3227]=true,
- [3228]=true,
- [3229]=true,
- [3230]=true,
- [3231]=true,
- [3232]=true,
- [3233]=true,
- [3234]=true,
- [3235]=true,
- [3236]=true,
- [3237]=true,
- [3238]=true,
- [3239]=true,
- [3240]=true,
- [3242]=true,
- [3243]=true,
- [3244]=true,
- [3245]=true,
- [3246]=true,
- [3247]=true,
- [3248]=true,
- [3249]=true,
- [3250]=true,
- [3251]=true,
- [3253]=true,
- [3254]=true,
- [3255]=true,
- [3256]=true,
- [3257]=true,
- [3294]=true,
- [3349]=true,
- [3350]=true,
- [3351]=true,
- [3352]=true,
- [3353]=true,
- [3354]=true,
- [3355]=true,
- [3356]=true,
- [3357]=true,
- [3358]=true,
- [3359]=true,
- [3360]=true,
- [3361]=true,
- [3362]=true,
- [3363]=true,
- [3364]=true,
- [3365]=true,
- [3366]=true,
- [3367]=true,
- [3368]=true,
- [3369]=true,
- [3370]=true,
- [3371]=true,
- [3372]=true,
- [3373]=true,
- [3374]=true,
- [3375]=true,
- [3376]=true,
- [3377]=true,
- [3378]=true,
- [3379]=true,
- [3380]=true,
- [3381]=true,
- [3382]=true,
- [3383]=true,
- [3384]=true,
- [3385]=true,
- [3386]=true,
- [4096]=true,
- [4097]=true,
- [4098]=true,
- [4099]=true,
- [4100]=true,
- [4101]=true,
- [4102]=true,
- [4103]=true,
- [4104]=true,
- [4105]=true,
- [4106]=true,
- [4107]=true,
- [4108]=true,
- [4109]=true,
- [4110]=true,
- [4111]=true,
- [4112]=true,
- [4113]=true,
- [4114]=true,
- [4115]=true,
- [4116]=true,
- [4117]=true,
- [4118]=true,
- [4119]=true,
- [4120]=true,
- [4121]=true,
- [4122]=true,
- [4123]=true,
- [4124]=true,
- [4125]=true,
- [4126]=true,
- [4127]=true,
- [4128]=true,
- [4155]=true,
- [4156]=true,
- [4157]=true,
- [4158]=true,
- [4159]=true,
- [4176]=true,
- [4177]=true,
- [4186]=true,
- [4187]=true,
- [4188]=true,
- [4189]=true,
- [4190]=true,
- [4191]=true,
- [4192]=true,
- [4193]=true,
- [4197]=true,
- [4198]=true,
- [4206]=true,
- [4207]=true,
- [4208]=true,
- [4213]=true,
- [4214]=true,
- [4215]=true,
- [4216]=true,
- [4217]=true,
- [4218]=true,
- [4219]=true,
- [4220]=true,
- [4221]=true,
- [4222]=true,
- [4223]=true,
- [4224]=true,
- [4225]=true,
- [4226]=true,
- [4238]=true,
- [43488]=true,
- [43489]=true,
- [43490]=true,
- [43491]=true,
- [43492]=true,
- [43495]=true,
- [43496]=true,
- [43497]=true,
- [43498]=true,
- [43499]=true,
- [43500]=true,
- [43501]=true,
- [43502]=true,
- [43503]=true,
- [43514]=true,
- [43515]=true,
- [43516]=true,
- [43517]=true,
- [43518]=true,
- [43616]=true,
- [43617]=true,
- [43618]=true,
- [43619]=true,
- [43620]=true,
- [43621]=true,
- [43622]=true,
- [43623]=true,
- [43624]=true,
- [43625]=true,
- [43626]=true,
- [43628]=true,
- [43629]=true,
- [43630]=true,
- [43631]=true,
- [43633]=true,
- [43634]=true,
- [43635]=true,
- [43636]=true,
- [43637]=true,
- [43638]=true,
- [43642]=true,
- [43646]=true,
- [43647]=true,
- },
- ["dependent_vowel"]={
- [2362]=true,
- [2363]=true,
- [2366]=true,
- [2367]=true,
- [2368]=true,
- [2369]=true,
- [2370]=true,
- [2371]=true,
- [2372]=true,
- [2373]=true,
- [2374]=true,
- [2375]=true,
- [2376]=true,
- [2377]=true,
- [2378]=true,
- [2379]=true,
- [2380]=true,
- [2382]=true,
- [2383]=true,
- [2389]=true,
- [2390]=true,
- [2391]=true,
- [2402]=true,
- [2403]=true,
- [2494]=true,
- [2495]=true,
- [2497]=true,
- [2498]=true,
- [2499]=true,
- [2500]=true,
- [2503]=true,
- [2504]=true,
- [2507]=true,
- [2508]=true,
- [2622]=true,
- [2623]=true,
- [2624]=true,
- [2625]=true,
- [2626]=true,
- [2631]=true,
- [2632]=true,
- [2635]=true,
- [2636]=true,
- [2750]=true,
- [2751]=true,
- [2752]=true,
- [2753]=true,
- [2754]=true,
- [2755]=true,
- [2756]=true,
- [2757]=true,
- [2759]=true,
- [2760]=true,
- [2761]=true,
- [2763]=true,
- [2764]=true,
- [2878]=true,
- [2879]=true,
- [2880]=true,
- [2881]=true,
- [2882]=true,
- [2883]=true,
- [2884]=true,
- [2887]=true,
- [2888]=true,
- [2891]=true,
- [2892]=true,
- [2914]=true,
- [2915]=true,
- [3006]=true,
- [3007]=true,
- [3008]=true,
- [3009]=true,
- [3010]=true,
- [3014]=true,
- [3015]=true,
- [3016]=true,
- [3018]=true,
- [3019]=true,
- [3020]=true,
- [3134]=true,
- [3135]=true,
- [3136]=true,
- [3137]=true,
- [3138]=true,
- [3139]=true,
- [3140]=true,
- [3142]=true,
- [3143]=true,
- [3144]=true,
- [3146]=true,
- [3147]=true,
- [3148]=true,
- [3170]=true,
- [3171]=true,
- [3262]=true,
- [3263]=true,
- [3264]=true,
- [3265]=true,
- [3266]=true,
- [3267]=true,
- [3268]=true,
- [3270]=true,
- [3271]=true,
- [3272]=true,
- [3274]=true,
- [3275]=true,
- [3276]=true,
- [3285]=true,
- [3286]=true,
- [3298]=true,
- [3299]=true,
- [3390]=true,
- [3391]=true,
- [3392]=true,
- [3393]=true,
- [3394]=true,
- [3395]=true,
- [3396]=true,
- [3398]=true,
- [3399]=true,
- [3400]=true,
- [3402]=true,
- [3403]=true,
- [3404]=true,
- [3415]=true,
- [3426]=true,
- [3427]=true,
- [4139]=true,
- [4140]=true,
- [4141]=true,
- [4142]=true,
- [4143]=true,
- [4144]=true,
- [4145]=true,
- [4146]=true,
- [4147]=true,
- [4148]=true,
- [4149]=true,
- [4182]=true,
- [4183]=true,
- [4184]=true,
- [4185]=true,
- [4194]=true,
- [4199]=true,
- [4200]=true,
- [4209]=true,
- [4210]=true,
- [4211]=true,
- [4212]=true,
- [4227]=true,
- [4228]=true,
- [4229]=true,
- [4230]=true,
- [4252]=true,
- [4253]=true,
- [43493]=true,
- },
- ["halant"]={
- [2381]=true,
- [2509]=true,
- [2637]=true,
- [2765]=true,
- [2893]=true,
- [3021]=true,
- [3149]=true,
- [3277]=true,
- [3405]=true,
- },
- ["independent_vowel"]={
- [2308]=true,
- [2309]=true,
- [2310]=true,
- [2311]=true,
- [2312]=true,
- [2313]=true,
- [2314]=true,
- [2315]=true,
- [2316]=true,
- [2317]=true,
- [2318]=true,
- [2319]=true,
- [2320]=true,
- [2321]=true,
- [2322]=true,
- [2323]=true,
- [2324]=true,
- [2400]=true,
- [2401]=true,
- [2418]=true,
- [2419]=true,
- [2420]=true,
- [2421]=true,
- [2422]=true,
- [2423]=true,
- [2437]=true,
- [2438]=true,
- [2439]=true,
- [2440]=true,
- [2441]=true,
- [2442]=true,
- [2443]=true,
- [2444]=true,
- [2447]=true,
- [2448]=true,
- [2451]=true,
- [2452]=true,
- [2528]=true,
- [2529]=true,
- [2530]=true,
- [2531]=true,
- [2565]=true,
- [2566]=true,
- [2567]=true,
- [2568]=true,
- [2569]=true,
- [2570]=true,
- [2575]=true,
- [2576]=true,
- [2579]=true,
- [2580]=true,
- [2693]=true,
- [2694]=true,
- [2695]=true,
- [2696]=true,
- [2697]=true,
- [2698]=true,
- [2699]=true,
- [2700]=true,
- [2701]=true,
- [2703]=true,
- [2704]=true,
- [2705]=true,
- [2707]=true,
- [2708]=true,
- [2784]=true,
- [2785]=true,
- [2786]=true,
- [2787]=true,
- [2821]=true,
- [2822]=true,
- [2823]=true,
- [2824]=true,
- [2825]=true,
- [2826]=true,
- [2827]=true,
- [2828]=true,
- [2831]=true,
- [2832]=true,
- [2835]=true,
- [2836]=true,
- [2912]=true,
- [2913]=true,
- [2949]=true,
- [2950]=true,
- [2951]=true,
- [2952]=true,
- [2953]=true,
- [2954]=true,
- [2958]=true,
- [2959]=true,
- [2960]=true,
- [2962]=true,
- [2963]=true,
- [2964]=true,
- [3077]=true,
- [3078]=true,
- [3079]=true,
- [3080]=true,
- [3081]=true,
- [3082]=true,
- [3083]=true,
- [3084]=true,
- [3086]=true,
- [3087]=true,
- [3088]=true,
- [3090]=true,
- [3091]=true,
- [3092]=true,
- [3168]=true,
- [3169]=true,
- [3205]=true,
- [3206]=true,
- [3207]=true,
- [3208]=true,
- [3209]=true,
- [3210]=true,
- [3211]=true,
- [3212]=true,
- [3214]=true,
- [3215]=true,
- [3216]=true,
- [3218]=true,
- [3219]=true,
- [3220]=true,
- [3296]=true,
- [3297]=true,
- [3333]=true,
- [3334]=true,
- [3335]=true,
- [3336]=true,
- [3337]=true,
- [3338]=true,
- [3339]=true,
- [3340]=true,
- [3342]=true,
- [3343]=true,
- [3344]=true,
- [3346]=true,
- [3347]=true,
- [3348]=true,
- [3423]=true,
- [3424]=true,
- [3425]=true,
- [4129]=true,
- [4130]=true,
- [4131]=true,
- [4132]=true,
- [4133]=true,
- [4134]=true,
- [4135]=true,
- [4136]=true,
- [4137]=true,
- [4138]=true,
- [4178]=true,
- [4179]=true,
- [4180]=true,
- [4181]=true,
- },
- ["nukta"]={
- [2364]=true,
- [2492]=true,
- [2620]=true,
- [2748]=true,
- [2876]=true,
- [3260]=true,
- },
- ["post_mark"]={
- [2307]=true,
- [2363]=true,
- [2366]=true,
- [2368]=true,
- [2377]=true,
- [2378]=true,
- [2379]=true,
- [2380]=true,
- [2383]=true,
- [2494]=true,
- [2496]=true,
- [2622]=true,
- [2624]=true,
- [2750]=true,
- [2752]=true,
- [2761]=true,
- [2763]=true,
- [2764]=true,
- [2878]=true,
- [2880]=true,
- [3006]=true,
- [3007]=true,
- [3137]=true,
- [3138]=true,
- [3139]=true,
- [3140]=true,
- [3262]=true,
- [3265]=true,
- [3266]=true,
- [3267]=true,
- [3268]=true,
- [3276]=true,
- [3285]=true,
- [3390]=true,
- [3391]=true,
- [3392]=true,
- [3393]=true,
- [3394]=true,
- [3395]=true,
- [3396]=true,
- [3415]=true,
- [4139]=true,
- [4140]=true,
- [4152]=true,
- [4155]=true,
- [4182]=true,
- [4183]=true,
- [4194]=true,
- [4195]=true,
- [4196]=true,
- [4199]=true,
- [4200]=true,
- [4201]=true,
- [4202]=true,
- [4203]=true,
- [4204]=true,
- [4205]=true,
- [4227]=true,
- [4231]=true,
- [4232]=true,
- [4233]=true,
- [4234]=true,
- [4235]=true,
- [4236]=true,
- [4239]=true,
- [4250]=true,
- [4251]=true,
- [4252]=true,
- [43643]=true,
- [43645]=true,
- },
- ["pre_mark"]={
- [2367]=true,
- [2382]=true,
- [2495]=true,
- [2503]=true,
- [2504]=true,
- [2623]=true,
- [2751]=true,
- [2887]=true,
- [3014]=true,
- [3015]=true,
- [3016]=true,
- [3398]=true,
- [3399]=true,
- [3400]=true,
- [4145]=true,
- [4228]=true,
- },
- ["ra"]={
- [2352]=true,
- [2480]=true,
- [2544]=true,
- [2608]=true,
- [2736]=true,
- [2864]=true,
- [2992]=true,
- [3120]=true,
- [3248]=true,
- [3376]=true,
- },
- ["stress_tone_mark"]={
- [2385]=true,
- [2386]=true,
- [2387]=true,
- [2388]=true,
- [4151]=true,
- [4195]=true,
- [4196]=true,
- [4201]=true,
- [4202]=true,
- [4203]=true,
- [4204]=true,
- [4205]=true,
- [4231]=true,
- [4232]=true,
- [4233]=true,
- [4234]=true,
- [4235]=true,
- [4236]=true,
- [4237]=true,
- [4239]=true,
- [4250]=true,
- [4251]=true,
- [43643]=true,
- [43644]=true,
- [43645]=true,
- },
- ["twopart_mark"]={
- [2507]={ 2503,2494 },
- [2508]={ 2503,2519 },
- [2888]={ 2887,2902 },
- [2891]={ 2887,2878 },
- [2892]={ 2887,2903 },
- [3018]={ 3014,3006 },
- [3019]={ 3015,3006 },
- [3020]={ 3014,3031 },
- [3144]={ 3142,3158 },
- [3264]={ 3263,3285 },
- [3271]={ 3270,3285 },
- [3272]={ 3270,3286 },
- [3274]={ 3270,3266 },
- [3275]={ 3274,3285 },
- [3402]={ 3398,3390 },
- [3403]={ 3399,3390 },
- [3404]={ 3398,3415 },
- },
- ["vowel_modifier"]={
- [2304]=true,
- [2305]=true,
- [2306]=true,
- [2307]=true,
- [2433]=true,
- [3330]=true,
- [3331]=true,
- [4150]=true,
- [4152]=true,
- [4153]=true,
- [4154]=true,
- [43232]=true,
- [43233]=true,
- [43234]=true,
- [43235]=true,
- [43236]=true,
- [43237]=true,
- [43238]=true,
- [43239]=true,
- [43240]=true,
- [43241]=true,
- [43242]=true,
- [43243]=true,
- [43244]=true,
- [43245]=true,
- [43246]=true,
- [43247]=true,
- [43249]=true,
- },
-}
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “basics-chr”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-ini” 4dee96e1e1474d324dd126bd5d375df8] ---
-
-if not modules then modules={} end modules ['font-ini']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local allocate=utilities.storage.allocate
-local sortedhash=table.sortedhash
-fonts=fonts or {}
-local fonts=fonts
-local identifiers=allocate()
-fonts.hashes=fonts.hashes or { identifiers=identifiers }
-fonts.tables=fonts.tables or {}
-fonts.helpers=fonts.helpers or {}
-fonts.tracers=fonts.tracers or {}
-fonts.specifiers=fonts.specifiers or {}
-fonts.analyzers={}
-fonts.readers={}
-fonts.definers={ methods={} }
-fonts.loggers={ register=function() end }
-if context then
- font.originaleach=font.each
- function font.each()
- return sortedhash(identifiers)
- end
- fontloader=nil
-end
-fonts.privateoffsets={
- textbase=0xF0000,
- textextrabase=0xFD000,
- mathextrabase=0xFE000,
- mathbase=0xFF000,
- keepnames=false,
-}
-if node and not tex.getfontoffamily then
- tex.getfontoffamily=node.family_font
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-ini”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “fonts-mis” bc9eb43c27f63ce9d0fff67e104fe1c6] ---
-
-if not modules then modules={} end modules ['luatex-font-mis']={
- version=1.001,
- comment="companion to luatex-*.tex",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-if context then
- os.exit()
-end
-local currentfont=font.current
-local hashes=fonts.hashes
-local identifiers=hashes.identifiers or {}
-local marks=hashes.marks or {}
-hashes.identifiers=identifiers
-hashes.marks=marks
-table.setmetatableindex(marks,function(t,k)
- if k==true then
- return marks[currentfont()]
- else
- local resources=identifiers[k].resources or {}
- local marks=resources.marks or {}
- t[k]=marks
- return marks
- end
-end)
-function font.each()
- return table.sortedhash(fonts.hashes.identifiers)
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “fonts-mis”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-con” b436bf6880a56216445779ac68fee877] ---
-
-if not modules then modules={} end modules ['font-con']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local next,tostring,tonumber,rawget=next,tostring,tonumber,rawget
-local format,match,lower,gsub,find=string.format,string.match,string.lower,string.gsub,string.find
-local sort,insert,concat=table.sort,table.insert,table.concat
-local sortedkeys,sortedhash,serialize,fastcopy=table.sortedkeys,table.sortedhash,table.serialize,table.fastcopy
-local derivetable=table.derive
-local ioflush=io.flush
-local round=math.round
-local setmetatable,getmetatable,rawget,rawset=setmetatable,getmetatable,rawget,rawset
-local trace_defining=false trackers.register("fonts.defining",function(v) trace_defining=v end)
-local trace_scaling=false trackers.register("fonts.scaling",function(v) trace_scaling=v end)
-local report_defining=logs.reporter("fonts","defining")
-local fonts=fonts
-local constructors=fonts.constructors or {}
-fonts.constructors=constructors
-local handlers=fonts.handlers or {}
-fonts.handlers=handlers
-local allocate=utilities.storage.allocate
-local setmetatableindex=table.setmetatableindex
-constructors.dontembed=allocate()
-constructors.namemode="fullpath"
-constructors.version=1.01
-constructors.cache=containers.define("fonts","constructors",constructors.version,false)
-constructors.privateoffset=fonts.privateoffsets.textbase or 0xF0000
-constructors.cacheintex=true
-constructors.addtounicode=true
-constructors.fixprotrusion=true
-local designsizes=allocate()
-constructors.designsizes=designsizes
-local loadedfonts=allocate()
-constructors.loadedfonts=loadedfonts
-local factors={
- pt=65536.0,
- bp=65781.8,
-}
-function constructors.setfactor(f)
- constructors.factor=factors[f or 'pt'] or factors.pt
-end
-constructors.setfactor()
-function constructors.scaled(scaledpoints,designsize)
- if scaledpoints<0 then
- local factor=constructors.factor
- if designsize then
- if designsize>factor then
- return (- scaledpoints/1000)*designsize
- else
- return (- scaledpoints/1000)*designsize*factor
- end
- else
- return (- scaledpoints/1000)*10*factor
- end
- else
- return scaledpoints
- end
-end
-function constructors.getprivate(tfmdata)
- local properties=tfmdata.properties
- local private=properties.private
- properties.private=private+1
- return private
-end
-function constructors.setmathparameter(tfmdata,name,value)
- local m=tfmdata.mathparameters
- local c=tfmdata.MathConstants
- if m then
- m[name]=value
- end
- if c and c~=m then
- c[name]=value
- end
-end
-function constructors.getmathparameter(tfmdata,name)
- local p=tfmdata.mathparameters or tfmdata.MathConstants
- if p then
- return p[name]
- end
-end
-function constructors.cleanuptable(tfmdata)
-end
-function constructors.calculatescale(tfmdata,scaledpoints)
- local parameters=tfmdata.parameters
- if scaledpoints<0 then
- scaledpoints=(- scaledpoints/1000)*(tfmdata.designsize or parameters.designsize)
- end
- return scaledpoints,scaledpoints/(parameters.units or 1000)
-end
-local unscaled={
- ScriptPercentScaleDown=true,
- ScriptScriptPercentScaleDown=true,
- RadicalDegreeBottomRaisePercent=true,
- NoLimitSupFactor=true,
- NoLimitSubFactor=true,
-}
-function constructors.assignmathparameters(target,original)
- local mathparameters=original.mathparameters
- if mathparameters and next(mathparameters) then
- local targetparameters=target.parameters
- local targetproperties=target.properties
- local targetmathparameters={}
- local factor=targetproperties.math_is_scaled and 1 or targetparameters.factor
- for name,value in next,mathparameters do
- if unscaled[name] then
- targetmathparameters[name]=value
- else
- targetmathparameters[name]=value*factor
- end
- end
- if not targetmathparameters.FractionDelimiterSize then
- targetmathparameters.FractionDelimiterSize=1.01*targetparameters.size
- end
- if not mathparameters.FractionDelimiterDisplayStyleSize then
- targetmathparameters.FractionDelimiterDisplayStyleSize=2.40*targetparameters.size
- end
- target.mathparameters=targetmathparameters
- end
-end
-function constructors.beforecopyingcharacters(target,original)
-end
-function constructors.aftercopyingcharacters(target,original)
-end
-constructors.sharefonts=false
-constructors.nofsharedfonts=0
-local sharednames={}
-function constructors.trytosharefont(target,tfmdata)
- if constructors.sharefonts then
- local characters=target.characters
- local n=1
- local t={ target.psname }
- local u=sortedkeys(characters)
- for i=1,#u do
- local k=u[i]
- n=n+1;t[n]=k
- n=n+1;t[n]=characters[k].index or k
- end
- local h=md5.HEX(concat(t," "))
- local s=sharednames[h]
- if s then
- if trace_defining then
- report_defining("font %a uses backend resources of font %a",target.fullname,s)
- end
- target.fullname=s
- constructors.nofsharedfonts=constructors.nofsharedfonts+1
- target.properties.sharedwith=s
- else
- sharednames[h]=target.fullname
- end
- end
-end
-local synonyms={
- exheight="x_height",
- xheight="x_height",
- ex="x_height",
- emwidth="quad",
- em="quad",
- spacestretch="space_stretch",
- stretch="space_stretch",
- spaceshrink="space_shrink",
- shrink="space_shrink",
- extraspace="extra_space",
- xspace="extra_space",
- slantperpoint="slant",
-}
-function constructors.enhanceparameters(parameters)
- local mt=getmetatable(parameters)
- local getter=function(t,k)
- if not k then
- return nil
- end
- local s=synonyms[k]
- if s then
- return rawget(t,s) or (mt and mt[s]) or nil
- end
- if k=="spacing" then
- return {
- width=t.space,
- stretch=t.space_stretch,
- shrink=t.space_shrink,
- extra=t.extra_space,
- }
- end
- return mt and mt[k] or nil
- end
- local setter=function(t,k,v)
- if not k then
- return 0
- end
- local s=synonyms[k]
- if s then
- rawset(t,s,v)
- elseif k=="spacing" then
- if type(v)=="table" then
- rawset(t,"space",v.width or 0)
- rawset(t,"space_stretch",v.stretch or 0)
- rawset(t,"space_shrink",v.shrink or 0)
- rawset(t,"extra_space",v.extra or 0)
- end
- else
- rawset(t,k,v)
- end
- end
- setmetatable(parameters,{
- __index=getter,
- __newindex=setter,
- })
-end
-local function mathkerns(v,vdelta)
- local k={}
- for i=1,#v do
- local entry=v[i]
- local height=entry.height
- local kern=entry.kern
- k[i]={
- height=height and vdelta*height or 0,
- kern=kern and vdelta*kern or 0,
- }
- end
- return k
-end
-local psfake=0
-local function fixedpsname(psname,fallback)
- local usedname=psname
- if psname and psname~="" then
- if find(psname," ",1,true) then
- usedname=gsub(psname,"[%s]+","-")
- else
- end
- elseif not fallback or fallback=="" then
- psfake=psfake+1
- psname="fakename-"..psfake
- else
- psname=fallback
- usedname=gsub(psname,"[^a-zA-Z0-9]+","-")
- end
- return usedname,psname~=usedname
-end
-function constructors.scale(tfmdata,specification)
- local target={}
- if tonumber(specification) then
- specification={ size=specification }
- end
- target.specification=specification
- local scaledpoints=specification.size
- local relativeid=specification.relativeid
- local properties=tfmdata.properties or {}
- local goodies=tfmdata.goodies or {}
- local resources=tfmdata.resources or {}
- local descriptions=tfmdata.descriptions or {}
- local characters=tfmdata.characters or {}
- local changed=tfmdata.changed or {}
- local shared=tfmdata.shared or {}
- local parameters=tfmdata.parameters or {}
- local mathparameters=tfmdata.mathparameters or {}
- local targetcharacters={}
- local targetdescriptions=derivetable(descriptions)
- local targetparameters=derivetable(parameters)
- local targetproperties=derivetable(properties)
- local targetgoodies=goodies
- target.characters=targetcharacters
- target.descriptions=targetdescriptions
- target.parameters=targetparameters
- target.properties=targetproperties
- target.goodies=targetgoodies
- target.shared=shared
- target.resources=resources
- target.unscaled=tfmdata
- local mathsize=tonumber(specification.mathsize) or 0
- local textsize=tonumber(specification.textsize) or scaledpoints
- local forcedsize=tonumber(parameters.mathsize ) or 0
- local extrafactor=tonumber(specification.factor ) or 1
- if (mathsize==2 or forcedsize==2) and parameters.scriptpercentage then
- scaledpoints=parameters.scriptpercentage*textsize/100
- elseif (mathsize==3 or forcedsize==3) and parameters.scriptscriptpercentage then
- scaledpoints=parameters.scriptscriptpercentage*textsize/100
- elseif forcedsize>1000 then
- scaledpoints=forcedsize
- else
- end
- targetparameters.mathsize=mathsize
- targetparameters.textsize=textsize
- targetparameters.forcedsize=forcedsize
- targetparameters.extrafactor=extrafactor
- local addtounicode=constructors.addtounicode
- local tounicode=fonts.mappings.tounicode
- local unknowncode=tounicode(0xFFFD)
- local defaultwidth=resources.defaultwidth or 0
- local defaultheight=resources.defaultheight or 0
- local defaultdepth=resources.defaultdepth or 0
- local units=parameters.units or 1000
- targetproperties.language=properties.language or "dflt"
- targetproperties.script=properties.script or "dflt"
- targetproperties.mode=properties.mode or "base"
- targetproperties.method=properties.method
- local askedscaledpoints=scaledpoints
- local scaledpoints,delta=constructors.calculatescale(tfmdata,scaledpoints,nil,specification)
- local hdelta=delta
- local vdelta=delta
- target.designsize=parameters.designsize
- target.units=units
- target.units_per_em=units
- local direction=properties.direction or tfmdata.direction or 0
- target.direction=direction
- properties.direction=direction
- target.size=scaledpoints
- target.encodingbytes=properties.encodingbytes or 1
- target.subfont=properties.subfont
- target.embedding=properties.embedding or "subset"
- target.tounicode=1
- target.cidinfo=properties.cidinfo
- target.format=properties.format
- target.cache=constructors.cacheintex and "yes" or "renew"
- local fontname=properties.fontname or tfmdata.fontname
- local fullname=properties.fullname or tfmdata.fullname
- local filename=properties.filename or tfmdata.filename
- local psname=properties.psname or tfmdata.psname
- local name=properties.name or tfmdata.name
- local psname,psfixed=fixedpsname(psname,fontname or fullname or file.nameonly(filename))
- target.fontname=fontname
- target.fullname=fullname
- target.filename=filename
- target.psname=psname
- target.name=name
- properties.fontname=fontname
- properties.fullname=fullname
- properties.filename=filename
- properties.psname=psname
- properties.name=name
- local expansion=parameters.expansion
- if expansion then
- target.stretch=expansion.stretch
- target.shrink=expansion.shrink
- target.step=expansion.step
- end
- local slantfactor=parameters.slantfactor or 0
- if slantfactor~=0 then
- target.slant=slantfactor*1000
- else
- target.slant=0
- end
- local extendfactor=parameters.extendfactor or 0
- if extendfactor~=0 and extendfactor~=1 then
- hdelta=hdelta*extendfactor
- target.extend=extendfactor*1000
- else
- target.extend=1000
- end
- local squeezefactor=parameters.squeezefactor or 0
- if squeezefactor~=0 and squeezefactor~=1 then
- vdelta=vdelta*squeezefactor
- target.squeeze=squeezefactor*1000
- else
- target.squeeze=1000
- end
- local mode=parameters.mode or 0
- if mode~=0 then
- target.mode=mode
- end
- local width=parameters.width or 0
- if width~=0 then
- target.width=width*delta*1000/655360
- end
- targetparameters.factor=delta
- targetparameters.hfactor=hdelta
- targetparameters.vfactor=vdelta
- targetparameters.size=scaledpoints
- targetparameters.units=units
- targetparameters.scaledpoints=askedscaledpoints
- targetparameters.mode=mode
- targetparameters.width=width
- local isvirtual=properties.virtualized or tfmdata.type=="virtual"
- local hasquality=parameters.expansion or parameters.protrusion
- local hasitalics=properties.hasitalics
- local autoitalicamount=properties.autoitalicamount
- local stackmath=not properties.nostackmath
- local haskerns=properties.haskerns or properties.mode=="base"
- local hasligatures=properties.hasligatures or properties.mode=="base"
- local realdimensions=properties.realdimensions
- local writingmode=properties.writingmode or "horizontal"
- local identity=properties.identity or "horizontal"
- local vfonts=target.fonts
- if vfonts and #vfonts>0 then
- target.fonts=fastcopy(vfonts)
- elseif isvirtual then
- target.fonts={ { id=0 } }
- end
- if changed and not next(changed) then
- changed=false
- end
- target.type=isvirtual and "virtual" or "real"
- target.writingmode=writingmode=="vertical" and "vertical" or "horizontal"
- target.identity=identity=="vertical" and "vertical" or "horizontal"
- target.postprocessors=tfmdata.postprocessors
- local targetslant=(parameters.slant or parameters[1] or 0)*factors.pt
- local targetspace=(parameters.space or parameters[2] or 0)*hdelta
- local targetspace_stretch=(parameters.space_stretch or parameters[3] or 0)*hdelta
- local targetspace_shrink=(parameters.space_shrink or parameters[4] or 0)*hdelta
- local targetx_height=(parameters.x_height or parameters[5] or 0)*vdelta
- local targetquad=(parameters.quad or parameters[6] or 0)*hdelta
- local targetextra_space=(parameters.extra_space or parameters[7] or 0)*hdelta
- targetparameters.slant=targetslant
- targetparameters.space=targetspace
- targetparameters.space_stretch=targetspace_stretch
- targetparameters.space_shrink=targetspace_shrink
- targetparameters.x_height=targetx_height
- targetparameters.quad=targetquad
- targetparameters.extra_space=targetextra_space
- local ascender=parameters.ascender
- if ascender then
- targetparameters.ascender=delta*ascender
- end
- local descender=parameters.descender
- if descender then
- targetparameters.descender=delta*descender
- end
- constructors.enhanceparameters(targetparameters)
- local protrusionfactor=constructors.fixprotrusion and ((targetquad~=0 and 1000/targetquad) or 1) or 1
- local scaledwidth=defaultwidth*hdelta
- local scaledheight=defaultheight*vdelta
- local scaleddepth=defaultdepth*vdelta
- local hasmath=(properties.hasmath or next(mathparameters)) and true
- if hasmath then
- constructors.assignmathparameters(target,tfmdata)
- properties.hasmath=true
- target.nomath=false
- target.MathConstants=target.mathparameters
- else
- properties.hasmath=false
- target.nomath=true
- target.mathparameters=nil
- end
- if hasmath then
- local mathitalics=properties.mathitalics
- if mathitalics==false then
- if trace_defining then
- report_defining("%s italics %s for font %a, fullname %a, filename %a","math",hasitalics and "ignored" or "disabled",name,fullname,filename)
- end
- hasitalics=false
- autoitalicamount=false
- end
- else
- local textitalics=properties.textitalics
- if textitalics==false then
- if trace_defining then
- report_defining("%s italics %s for font %a, fullname %a, filename %a","text",hasitalics and "ignored" or "disabled",name,fullname,filename)
- end
- hasitalics=false
- autoitalicamount=false
- end
- end
- if trace_defining then
- report_defining("defining tfm, name %a, fullname %a, filename %a, %spsname %a, hscale %a, vscale %a, math %a, italics %a",
- name,fullname,filename,psfixed and "(fixed) " or "",psname,hdelta,vdelta,
- hasmath and "enabled" or "disabled",hasitalics and "enabled" or "disabled")
- end
- constructors.beforecopyingcharacters(target,tfmdata)
- local sharedkerns={}
- for unicode,character in next,characters do
- local chr,description,index
- if changed then
- local c=changed[unicode]
- if c and c~=unicode then
- if c then
- description=descriptions[c] or descriptions[unicode] or character
- character=characters[c] or character
- index=description.index or c
- else
- description=descriptions[unicode] or character
- index=description.index or unicode
- end
- else
- description=descriptions[unicode] or character
- index=description.index or unicode
- end
- else
- description=descriptions[unicode] or character
- index=description.index or unicode
- end
- local width=description.width
- local height=description.height
- local depth=description.depth
- local isunicode=description.unicode
- if realdimensions then
- if not height or height==0 then
- local bb=description.boundingbox
- local ht=bb[4]
- if ht~=0 then
- height=ht
- end
- if not depth or depth==0 then
- local dp=-bb[2]
- if dp~=0 then
- depth=dp
- end
- end
- elseif not depth or depth==0 then
- local dp=-description.boundingbox[2]
- if dp~=0 then
- depth=dp
- end
- end
- end
- if width then width=hdelta*width else width=scaledwidth end
- if height then height=vdelta*height else height=scaledheight end
- if depth and depth~=0 then
- depth=delta*depth
- if isunicode then
- chr={
- index=index,
- height=height,
- depth=depth,
- width=width,
- unicode=isunicode,
- }
- else
- chr={
- index=index,
- height=height,
- depth=depth,
- width=width,
- }
- end
- else
- if isunicode then
- chr={
- index=index,
- height=height,
- width=width,
- unicode=isunicode,
- }
- else
- chr={
- index=index,
- height=height,
- width=width,
- }
- end
- end
- if addtounicode then
- chr.tounicode=isunicode and tounicode(isunicode) or unknowncode
- end
- if hasquality then
- local ve=character.expansion_factor
- if ve then
- chr.expansion_factor=ve*1000
- end
- local vl=character.left_protruding
- if vl then
- chr.left_protruding=protrusionfactor*width*vl
- end
- local vr=character.right_protruding
- if vr then
- chr.right_protruding=protrusionfactor*width*vr
- end
- end
- if hasmath then
- local vn=character.next
- if vn then
- chr.next=vn
- else
- local vv=character.vert_variants
- if vv then
- local t={}
- for i=1,#vv do
- local vvi=vv[i]
- local s=vvi["start"] or 0
- local e=vvi["end"] or 0
- local a=vvi["advance"] or 0
- t[i]={
- ["start"]=s==0 and 0 or s*vdelta,
- ["end"]=e==0 and 0 or e*vdelta,
- ["advance"]=a==0 and 0 or a*vdelta,
- ["extender"]=vvi["extender"],
- ["glyph"]=vvi["glyph"],
- }
- end
- chr.vert_variants=t
- else
- local hv=character.horiz_variants
- if hv then
- local t={}
- for i=1,#hv do
- local hvi=hv[i]
- local s=hvi["start"] or 0
- local e=hvi["end"] or 0
- local a=hvi["advance"] or 0
- t[i]={
- ["start"]=s==0 and 0 or s*hdelta,
- ["end"]=e==0 and 0 or e*hdelta,
- ["advance"]=a==0 and 0 or a*hdelta,
- ["extender"]=hvi["extender"],
- ["glyph"]=hvi["glyph"],
- }
- end
- chr.horiz_variants=t
- end
- end
- end
- local vi=character.vert_italic
- if vi and vi~=0 then
- chr.vert_italic=vi*hdelta
- end
- local va=character.accent
- if va then
- chr.top_accent=vdelta*va
- end
- if stackmath then
- local mk=character.mathkerns
- if mk then
- local tr=mk.topright
- local tl=mk.topleft
- local br=mk.bottomright
- local bl=mk.bottomleft
- chr.mathkern={
- top_right=tr and mathkerns(tr,vdelta) or nil,
- top_left=tl and mathkerns(tl,vdelta) or nil,
- bottom_right=br and mathkerns(br,vdelta) or nil,
- bottom_left=bl and mathkerns(bl,vdelta) or nil,
- }
- end
- end
- if hasitalics then
- local vi=character.italic
- if vi and vi~=0 then
- chr.italic=vi*hdelta
- end
- end
- elseif autoitalicamount then
- local vi=description.italic
- if not vi then
- local bb=description.boundingbox
- if bb then
- local vi=bb[3]-description.width+autoitalicamount
- if vi>0 then
- chr.italic=vi*hdelta
- end
- else
- end
- elseif vi~=0 then
- chr.italic=vi*hdelta
- end
- elseif hasitalics then
- local vi=character.italic
- if vi and vi~=0 then
- chr.italic=vi*hdelta
- end
- end
- if haskerns then
- local vk=character.kerns
- if vk then
- local s=sharedkerns[vk]
- if not s then
- s={}
- for k,v in next,vk do s[k]=v*hdelta end
- sharedkerns[vk]=s
- end
- chr.kerns=s
- end
- end
- if hasligatures then
- local vl=character.ligatures
- if vl then
- if true then
- chr.ligatures=vl
- else
- local tt={}
- for i,l in next,vl do
- tt[i]=l
- end
- chr.ligatures=tt
- end
- end
- end
- if isvirtual then
- local vc=character.commands
- if vc then
- local ok=false
- for i=1,#vc do
- local key=vc[i][1]
- if key=="right" or key=="down" or key=="rule" then
- ok=true
- break
- end
- end
- if ok then
- local tt={}
- for i=1,#vc do
- local ivc=vc[i]
- local key=ivc[1]
- if key=="right" then
- tt[i]={ key,ivc[2]*hdelta }
- elseif key=="down" then
- tt[i]={ key,ivc[2]*vdelta }
- elseif key=="rule" then
- tt[i]={ key,ivc[2]*vdelta,ivc[3]*hdelta }
- else
- tt[i]=ivc
- end
- end
- chr.commands=tt
- else
- chr.commands=vc
- end
- end
- end
- targetcharacters[unicode]=chr
- end
- properties.setitalics=hasitalics
- constructors.aftercopyingcharacters(target,tfmdata)
- constructors.trytosharefont(target,tfmdata)
- local vfonts=target.fonts
- if isvirtual or target.type=="virtual" or properties.virtualized then
- properties.virtualized=true
- target.type="virtual"
- if not vfonts or #vfonts==0 then
- target.fonts={ { id=0 } }
- end
- elseif vfonts then
- properties.virtualized=true
- target.type="virtual"
- if #vfonts==0 then
- target.fonts={ { id=0 } }
- end
- end
- return target
-end
-function constructors.finalize(tfmdata)
- if tfmdata.properties and tfmdata.properties.finalized then
- return
- end
- if not tfmdata.characters then
- return nil
- end
- if not tfmdata.goodies then
- tfmdata.goodies={}
- end
- local parameters=tfmdata.parameters
- if not parameters then
- return nil
- end
- if not parameters.expansion then
- parameters.expansion={
- stretch=tfmdata.stretch or 0,
- shrink=tfmdata.shrink or 0,
- step=tfmdata.step or 0,
- }
- end
- if not parameters.size then
- parameters.size=tfmdata.size
- end
- if not parameters.mode then
- parameters.mode=0
- end
- if not parameters.width then
- parameters.width=0
- end
- if not parameters.slantfactor then
- parameters.slantfactor=(tfmdata.slant or 0)/1000
- end
- if not parameters.extendfactor then
- parameters.extendfactor=(tfmdata.extend or 1000)/1000
- end
- if not parameters.squeezefactor then
- parameters.squeezefactor=(tfmdata.squeeze or 1000)/1000
- end
- local designsize=parameters.designsize
- if designsize then
- parameters.minsize=tfmdata.minsize or designsize
- parameters.maxsize=tfmdata.maxsize or designsize
- else
- designsize=factors.pt*10
- parameters.designsize=designsize
- parameters.minsize=designsize
- parameters.maxsize=designsize
- end
- parameters.minsize=tfmdata.minsize or parameters.designsize
- parameters.maxsize=tfmdata.maxsize or parameters.designsize
- if not parameters.units then
- parameters.units=tfmdata.units or tfmdata.units_per_em or 1000
- end
- if not tfmdata.descriptions then
- local descriptions={}
- setmetatableindex(descriptions,function(t,k) local v={} t[k]=v return v end)
- tfmdata.descriptions=descriptions
- end
- local properties=tfmdata.properties
- if not properties then
- properties={}
- tfmdata.properties=properties
- end
- if not properties.virtualized then
- properties.virtualized=tfmdata.type=="virtual"
- end
- properties.fontname=properties.fontname or tfmdata.fontname
- properties.filename=properties.filename or tfmdata.filename
- properties.fullname=properties.fullname or tfmdata.fullname
- properties.name=properties.name or tfmdata.name
- properties.psname=properties.psname or tfmdata.psname
- properties.encodingbytes=tfmdata.encodingbytes or 1
- properties.subfont=tfmdata.subfont or nil
- properties.embedding=tfmdata.embedding or "subset"
- properties.tounicode=tfmdata.tounicode or 1
- properties.cidinfo=tfmdata.cidinfo or nil
- properties.format=tfmdata.format or "type1"
- properties.direction=tfmdata.direction or 0
- properties.writingmode=tfmdata.writingmode or "horizontal"
- properties.identity=tfmdata.identity or "horizontal"
- properties.usedbitmap=tfmdata.usedbitmap
- if not tfmdata.resources then
- tfmdata.resources={}
- end
- if not tfmdata.shared then
- tfmdata.shared={}
- end
- if not properties.hasmath then
- properties.hasmath=not tfmdata.nomath
- end
- tfmdata.MathConstants=nil
- tfmdata.postprocessors=nil
- tfmdata.fontname=nil
- tfmdata.filename=nil
- tfmdata.fullname=nil
- tfmdata.name=nil
- tfmdata.psname=nil
- tfmdata.encodingbytes=nil
- tfmdata.subfont=nil
- tfmdata.embedding=nil
- tfmdata.tounicode=nil
- tfmdata.cidinfo=nil
- tfmdata.format=nil
- tfmdata.direction=nil
- tfmdata.type=nil
- tfmdata.nomath=nil
- tfmdata.designsize=nil
- tfmdata.size=nil
- tfmdata.stretch=nil
- tfmdata.shrink=nil
- tfmdata.step=nil
- tfmdata.slant=nil
- tfmdata.extend=nil
- tfmdata.squeeze=nil
- tfmdata.mode=nil
- tfmdata.width=nil
- tfmdata.units=nil
- tfmdata.units_per_em=nil
- tfmdata.cache=nil
- properties.finalized=true
- return tfmdata
-end
-local hashmethods={}
-constructors.hashmethods=hashmethods
-function constructors.hashfeatures(specification)
- local features=specification.features
- if features then
- local t,n={},0
- for category,list in sortedhash(features) do
- if next(list) then
- local hasher=hashmethods[category]
- if hasher then
- local hash=hasher(list)
- if hash then
- n=n+1
- t[n]=category..":"..hash
- end
- end
- end
- end
- if n>0 then
- return concat(t," & ")
- end
- end
- return "unknown"
-end
-hashmethods.normal=function(list)
- local s={}
- local n=0
- for k,v in next,list do
- if not k then
- elseif k=="number" or k=="features" then
- else
- n=n+1
- if type(v)=="table" then
- local t={}
- local m=0
- for k,v in next,v do
- m=m+1
- t[m]=k..'='..tostring(v)
- end
- s[n]=k..'={'..concat(t,",").."}"
- else
- s[n]=k..'='..tostring(v)
- end
- end
- end
- if n>0 then
- sort(s)
- return concat(s,"+")
- end
-end
-function constructors.hashinstance(specification,force)
- local hash=specification.hash
- local size=specification.size
- local fallbacks=specification.fallbacks
- if force or not hash then
- hash=constructors.hashfeatures(specification)
- specification.hash=hash
- end
- if size<1000 and designsizes[hash] then
- size=round(constructors.scaled(size,designsizes[hash]))
- else
- size=round(size)
- end
- specification.size=size
- if fallbacks then
- return hash..' @ '..size..' @ '..fallbacks
- else
- return hash..' @ '..size
- end
-end
-function constructors.setname(tfmdata,specification)
- if constructors.namemode=="specification" then
- local specname=specification.specification
- if specname then
- tfmdata.properties.name=specname
- if trace_defining then
- report_otf("overloaded fontname %a",specname)
- end
- end
- end
-end
-function constructors.checkedfilename(data)
- local foundfilename=data.foundfilename
- if not foundfilename then
- local askedfilename=data.filename or ""
- if askedfilename~="" then
- askedfilename=resolvers.resolve(askedfilename)
- foundfilename=resolvers.findbinfile(askedfilename,"") or ""
- if foundfilename=="" then
- report_defining("source file %a is not found",askedfilename)
- foundfilename=resolvers.findbinfile(file.basename(askedfilename),"") or ""
- if foundfilename~="" then
- report_defining("using source file %a due to cache mismatch",foundfilename)
- end
- end
- end
- data.foundfilename=foundfilename
- end
- return foundfilename
-end
-local formats=allocate()
-fonts.formats=formats
-setmetatableindex(formats,function(t,k)
- local l=lower(k)
- if rawget(t,k) then
- t[k]=l
- return l
- end
- return rawget(t,file.suffix(l))
-end)
-do
- local function setindeed(mode,source,target,group,name,position)
- local action=source[mode]
- if not action then
- return
- end
- local t=target[mode]
- if not t then
- report_defining("fatal error in setting feature %a, group %a, mode %a",name,group,mode)
- os.exit()
- elseif position then
- insert(t,position,{ name=name,action=action })
- else
- for i=1,#t do
- local ti=t[i]
- if ti.name==name then
- ti.action=action
- return
- end
- end
- insert(t,{ name=name,action=action })
- end
- end
- local function set(group,name,target,source)
- target=target[group]
- if not target then
- report_defining("fatal target error in setting feature %a, group %a",name,group)
- os.exit()
- end
- local source=source[group]
- if not source then
- report_defining("fatal source error in setting feature %a, group %a",name,group)
- os.exit()
- end
- local position=source.position
- setindeed("node",source,target,group,name,position)
- setindeed("base",source,target,group,name,position)
- setindeed("plug",source,target,group,name,position)
- end
- local function register(where,specification)
- local name=specification.name
- if name and name~="" then
- local default=specification.default
- local description=specification.description
- local initializers=specification.initializers
- local processors=specification.processors
- local manipulators=specification.manipulators
- local modechecker=specification.modechecker
- if default then
- where.defaults[name]=default
- end
- if description and description~="" then
- where.descriptions[name]=description
- end
- if initializers then
- set('initializers',name,where,specification)
- end
- if processors then
- set('processors',name,where,specification)
- end
- if manipulators then
- set('manipulators',name,where,specification)
- end
- if modechecker then
- where.modechecker=modechecker
- end
- end
- end
- constructors.registerfeature=register
- function constructors.getfeatureaction(what,where,mode,name)
- what=handlers[what].features
- if what then
- where=what[where]
- if where then
- mode=where[mode]
- if mode then
- for i=1,#mode do
- local m=mode[i]
- if m.name==name then
- return m.action
- end
- end
- end
- end
- end
- end
- local newfeatures={}
- constructors.newfeatures=newfeatures
- constructors.features=newfeatures
- local function setnewfeatures(what)
- local handler=handlers[what]
- local features=handler.features
- if not features then
- local tables=handler.tables
- local statistics=handler.statistics
- features=allocate {
- defaults={},
- descriptions=tables and tables.features or {},
- used=statistics and statistics.usedfeatures or {},
- initializers={ base={},node={},plug={} },
- processors={ base={},node={},plug={} },
- manipulators={ base={},node={},plug={} },
- }
- features.register=function(specification) return register(features,specification) end
- handler.features=features
- end
- return features
- end
- setmetatable(newfeatures,{
- __call=function(t,k) local v=t[k] return v end,
- __index=function(t,k) local v=setnewfeatures(k) t[k]=v return v end,
- })
-end
-do
- local newhandler={}
- constructors.handlers=newhandler
- constructors.newhandler=newhandler
- local function setnewhandler(what)
- local handler=handlers[what]
- if not handler then
- handler={}
- handlers[what]=handler
- end
- return handler
- end
- setmetatable(newhandler,{
- __call=function(t,k) local v=t[k] return v end,
- __index=function(t,k) local v=setnewhandler(k) t[k]=v return v end,
- })
-end
-do
- local newenhancer={}
- constructors.enhancers=newenhancer
- constructors.newenhancer=newenhancer
- local function setnewenhancer(format)
- local handler=handlers[format]
- local enhancers=handler.enhancers
- if not enhancers then
- local actions=allocate()
- local before=allocate()
- local after=allocate()
- local order=allocate()
- local known={}
- local nofsteps=0
- local patches={ before=before,after=after }
- local trace=false
- local report=logs.reporter("fonts",format.." enhancing")
- trackers.register(format..".loading",function(v) trace=v end)
- local function enhance(name,data,filename,raw)
- local enhancer=actions[name]
- if enhancer then
- if trace then
- report("apply enhancement %a to file %a",name,filename)
- ioflush()
- end
- enhancer(data,filename,raw)
- else
- end
- end
- local function apply(data,filename,raw)
- local basename=file.basename(lower(filename))
- if trace then
- report("%s enhancing file %a","start",filename)
- end
- ioflush()
- for e=1,nofsteps do
- local enhancer=order[e]
- local b=before[enhancer]
- if b then
- for pattern,action in next,b do
- if find(basename,pattern) then
- action(data,filename,raw)
- end
- end
- end
- enhance(enhancer,data,filename,raw)
- local a=after[enhancer]
- if a then
- for pattern,action in next,a do
- if find(basename,pattern) then
- action(data,filename,raw)
- end
- end
- end
- ioflush()
- end
- if trace then
- report("%s enhancing file %a","stop",filename)
- end
- ioflush()
- end
- local function register(what,action)
- if action then
- if actions[what] then
- else
- nofsteps=nofsteps+1
- order[nofsteps]=what
- known[what]=nofsteps
- end
- actions[what]=action
- else
- report("bad enhancer %a",what)
- end
- end
- local function patch(what,where,pattern,action)
- local pw=patches[what]
- if pw then
- local ww=pw[where]
- if ww then
- ww[pattern]=action
- else
- pw[where]={ [pattern]=action }
- if not known[where] then
- nofsteps=nofsteps+1
- order[nofsteps]=where
- known[where]=nofsteps
- end
- end
- end
- end
- enhancers={
- register=register,
- apply=apply,
- patch=patch,
- report=report,
- patches={
- register=patch,
- report=report,
- },
- }
- handler.enhancers=enhancers
- end
- return enhancers
- end
- setmetatable(newenhancer,{
- __call=function(t,k) local v=t[k] return v end,
- __index=function(t,k) local v=setnewenhancer(k) t[k]=v return v end,
- })
-end
-function constructors.checkedfeatures(what,features)
- local defaults=handlers[what].features.defaults
- if features and next(features) then
- features=fastcopy(features)
- for key,value in next,defaults do
- if features[key]==nil then
- features[key]=value
- end
- end
- return features
- else
- return fastcopy(defaults)
- end
-end
-function constructors.initializefeatures(what,tfmdata,features,trace,report)
- if features and next(features) then
- local properties=tfmdata.properties or {}
- local whathandler=handlers[what]
- local whatfeatures=whathandler.features
- local whatmodechecker=whatfeatures.modechecker
- local mode=properties.mode or (whatmodechecker and whatmodechecker(tfmdata,features,features.mode)) or features.mode or "base"
- properties.mode=mode
- features.mode=mode
- local done={}
- while true do
- local redo=false
- local initializers=whatfeatures.initializers[mode]
- if initializers then
- for i=1,#initializers do
- local step=initializers[i]
- local feature=step.name
- local value=features[feature]
- if not value then
- elseif done[feature] then
- else
- local action=step.action
- if trace then
- report("initializing feature %a to %a for mode %a for font %a",feature,
- value,mode,tfmdata.properties.fullname)
- end
- action(tfmdata,value,features)
- if mode~=properties.mode or mode~=features.mode then
- if whatmodechecker then
- properties.mode=whatmodechecker(tfmdata,features,properties.mode)
- features.mode=properties.mode
- end
- if mode~=properties.mode then
- mode=properties.mode
- redo=true
- end
- end
- done[feature]=true
- end
- if redo then
- break
- end
- end
- if not redo then
- break
- end
- else
- break
- end
- end
- properties.mode=mode
- return true
- else
- return false
- end
-end
-function constructors.collectprocessors(what,tfmdata,features,trace,report)
- local processes={}
- local nofprocesses=0
- if features and next(features) then
- local properties=tfmdata.properties
- local whathandler=handlers[what]
- local whatfeatures=whathandler.features
- local whatprocessors=whatfeatures.processors
- local mode=properties.mode
- local processors=whatprocessors[mode]
- if processors then
- for i=1,#processors do
- local step=processors[i]
- local feature=step.name
- if features[feature] then
- local action=step.action
- if trace then
- report("installing feature processor %a for mode %a for font %a",feature,mode,tfmdata.properties.fullname)
- end
- if action then
- nofprocesses=nofprocesses+1
- processes[nofprocesses]=action
- end
- end
- end
- elseif trace then
- report("no feature processors for mode %a for font %a",mode,properties.fullname)
- end
- end
- return processes
-end
-function constructors.applymanipulators(what,tfmdata,features,trace,report)
- if features and next(features) then
- local properties=tfmdata.properties
- local whathandler=handlers[what]
- local whatfeatures=whathandler.features
- local whatmanipulators=whatfeatures.manipulators
- local mode=properties.mode
- local manipulators=whatmanipulators[mode]
- if manipulators then
- for i=1,#manipulators do
- local step=manipulators[i]
- local feature=step.name
- local value=features[feature]
- if value then
- local action=step.action
- if trace then
- report("applying feature manipulator %a for mode %a for font %a",feature,mode,properties.fullname)
- end
- if action then
- action(tfmdata,feature,value)
- end
- end
- end
- end
- end
-end
-function constructors.addcoreunicodes(unicodes)
- if not unicodes then
- unicodes={}
- end
- unicodes.space=0x0020
- unicodes.hyphen=0x002D
- unicodes.zwj=0x200D
- unicodes.zwnj=0x200C
- return unicodes
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-con”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “fonts-enc” 3e71a54297e8f85a1ac438bb0f20dd79] ---
-
-if not modules then modules={} end modules ['luatex-font-enc']={
- version=1.001,
- comment="companion to luatex-*.tex",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-if context then
- os.exit()
-end
-local fonts=fonts
-local encodings={}
-fonts.encodings=encodings
-encodings.agl={}
-encodings.known={}
-setmetatable(encodings.agl,{ __index=function(t,k)
- if k=="unicodes" then
- logs.report("fonts","loading (extended) adobe glyph list")
- local unicodes=dofile(resolvers.findfile("font-age.lua"))
- encodings.agl={ unicodes=unicodes }
- return unicodes
- else
- return nil
- end
-end })
-encodings.cache=containers.define("fonts","enc",encodings.version,true)
-function encodings.load(filename)
- local name=file.removesuffix(filename)
- local data=containers.read(encodings.cache,name)
- if data then
- return data
- end
- local vector,tag,hash,unicodes={},"",{},{}
- local foundname=resolvers.findfile(filename,'enc')
- if foundname and foundname~="" then
- local ok,encoding,size=resolvers.loadbinfile(foundname)
- if ok and encoding then
- encoding=string.gsub(encoding,"%%(.-)\n","")
- local unicoding=encodings.agl.unicodes
- local tag,vec=string.match(encoding,"/(%w+)%s*%[(.*)%]%s*def")
- local i=0
- for ch in string.gmatch(vec,"/([%a%d%.]+)") do
- if ch~=".notdef" then
- vector[i]=ch
- if not hash[ch] then
- hash[ch]=i
- else
- end
- local u=unicoding[ch]
- if u then
- unicodes[u]=i
- end
- end
- i=i+1
- end
- end
- end
- local data={
- name=name,
- tag=tag,
- vector=vector,
- hash=hash,
- unicodes=unicodes
- }
- return containers.write(encodings.cache,name,data)
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “fonts-enc”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-cid” 4d87988efa86020a14708ee03c23415f] ---
-
-if not modules then modules={} end modules ['font-cid']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local format,match,lower=string.format,string.match,string.lower
-local tonumber=tonumber
-local P,S,R,C,V,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.V,lpeg.match
-local fonts,logs,trackers=fonts,logs,trackers
-local trace_loading=false trackers.register("otf.loading",function(v) trace_loading=v end)
-local report_otf=logs.reporter("fonts","otf loading")
-local cid={}
-fonts.cid=cid
-local cidmap={}
-local cidmax=10
-local number=C(R("09","af","AF")^1)
-local space=S(" \n\r\t")
-local spaces=space^0
-local period=P(".")
-local periods=period*period
-local name=P("/")*C((1-space)^1)
-local unicodes,names={},{}
-local function do_one(a,b)
- unicodes[tonumber(a)]=tonumber(b,16)
-end
-local function do_range(a,b,c)
- c=tonumber(c,16)
- for i=tonumber(a),tonumber(b) do
- unicodes[i]=c
- c=c+1
- end
-end
-local function do_name(a,b)
- names[tonumber(a)]=b
-end
-local grammar=P { "start",
- start=number*spaces*number*V("series"),
- series=(spaces*(V("one")+V("range")+V("named")))^1,
- one=(number*spaces*number)/do_one,
- range=(number*periods*number*spaces*number)/do_range,
- named=(number*spaces*name)/do_name
-}
-local function loadcidfile(filename)
- local data=io.loaddata(filename)
- if data then
- unicodes,names={},{}
- lpegmatch(grammar,data)
- local supplement,registry,ordering=match(filename,"^(.-)%-(.-)%-()%.(.-)$")
- return {
- supplement=supplement,
- registry=registry,
- ordering=ordering,
- filename=filename,
- unicodes=unicodes,
- names=names,
- }
- end
-end
-cid.loadfile=loadcidfile
-local template="%s-%s-%s.cidmap"
-local function locate(registry,ordering,supplement)
- local filename=format(template,registry,ordering,supplement)
- local hashname=lower(filename)
- local found=cidmap[hashname]
- if not found then
- if trace_loading then
- report_otf("checking cidmap, registry %a, ordering %a, supplement %a, filename %a",registry,ordering,supplement,filename)
- end
- local fullname=resolvers.findfile(filename,'cid') or ""
- if fullname~="" then
- found=loadcidfile(fullname)
- if found then
- if trace_loading then
- report_otf("using cidmap file %a",filename)
- end
- cidmap[hashname]=found
- found.usedname=file.basename(filename)
- end
- end
- end
- return found
-end
-function cid.getmap(specification)
- if not specification then
- report_otf("invalid cidinfo specification, table expected")
- return
- end
- local registry=specification.registry
- local ordering=specification.ordering
- local supplement=specification.supplement
- local filename=format(registry,ordering,supplement)
- local lowername=lower(filename)
- local found=cidmap[lowername]
- if found then
- return found
- end
- if ordering=="Identity" then
- local found={
- supplement=supplement,
- registry=registry,
- ordering=ordering,
- filename=filename,
- unicodes={},
- names={},
- }
- cidmap[lowername]=found
- return found
- end
- if trace_loading then
- report_otf("cidmap needed, registry %a, ordering %a, supplement %a",registry,ordering,supplement)
- end
- found=locate(registry,ordering,supplement)
- if not found then
- local supnum=tonumber(supplement)
- local cidnum=nil
- if supnum0 then
- for s=supnum-1,0,-1 do
- local c=locate(registry,ordering,s)
- if c then
- found,cidnum=c,s
- break
- end
- end
- end
- registry=lower(registry)
- ordering=lower(ordering)
- if found and cidnum>0 then
- for s=0,cidnum-1 do
- local filename=format(template,registry,ordering,s)
- if not cidmap[filename] then
- cidmap[filename]=found
- end
- end
- end
- end
- return found
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-cid”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-map” f486746e90fe972de4b73e208ac7cbb2] ---
-
-if not modules then modules={} end modules ['font-map']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local tonumber,next,type=tonumber,next,type
-local match,format,find,concat,gsub,lower=string.match,string.format,string.find,table.concat,string.gsub,string.lower
-local P,R,S,C,Ct,Cc,lpegmatch=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Ct,lpeg.Cc,lpeg.match
-local formatters=string.formatters
-local sortedhash,sortedkeys=table.sortedhash,table.sortedkeys
-local rshift=bit32.rshift
-local trace_loading=false trackers.register("fonts.loading",function(v) trace_loading=v end)
-local trace_mapping=false trackers.register("fonts.mapping",function(v) trace_mapping=v end)
-local report_fonts=logs.reporter("fonts","loading")
-local force_ligatures=false directives.register("fonts.mapping.forceligatures",function(v) force_ligatures=v end)
-local fonts=fonts or {}
-local mappings=fonts.mappings or {}
-fonts.mappings=mappings
-local allocate=utilities.storage.allocate
-local hex=R("AF","af","09")
-local hexfour=(hex*hex*hex^-2)/function(s) return tonumber(s,16) end
-local hexsix=(hex*hex*hex^-4)/function(s) return tonumber(s,16) end
-local dec=(R("09")^1)/tonumber
-local period=P(".")
-local unicode=(P("uni")+P("UNI"))*(hexfour*(period+P(-1))*Cc(false)+Ct(hexfour^1)*Cc(true))
-local ucode=(P("u")+P("U") )*(hexsix*(period+P(-1))*Cc(false)+Ct(hexsix^1)*Cc(true))
-local index=P("index")*dec*Cc(false)
-local parser=unicode+ucode+index
-local parsers={}
-local function makenameparser(str)
- if not str or str=="" then
- return parser
- else
- local p=parsers[str]
- if not p then
- p=P(str)*period*dec*Cc(false)
- parsers[str]=p
- end
- return p
- end
-end
-local f_single=formatters["%04X"]
-local f_double=formatters["%04X%04X"]
-local function tounicode16(unicode)
- if unicode<0xD7FF or (unicode>0xDFFF and unicode<=0xFFFF) then
- return f_single(unicode)
- else
- unicode=unicode-0x10000
- return f_double(rshift(unicode,10)+0xD800,unicode%1024+0xDC00)
- end
-end
-local function tounicode16sequence(unicodes)
- local t={}
- for l=1,#unicodes do
- local u=unicodes[l]
- if u<0xD7FF or (u>0xDFFF and u<=0xFFFF) then
- t[l]=f_single(u)
- else
- u=u-0x10000
- t[l]=f_double(rshift(u,10)+0xD800,u%1024+0xDC00)
- end
- end
- return concat(t)
-end
-local unknown=f_single(0xFFFD)
-local hash={}
-local conc={}
-table.setmetatableindex(hash,function(t,k)
- if k<0xD7FF or (k>0xDFFF and k<=0xFFFF) then
- v=f_single(k)
- else
- local k=k-0x10000
- v=f_double(rshift(k,10)+0xD800,k%1024+0xDC00)
- end
- t[k]=v
- return v
-end)
-local function tounicode(k)
- if type(k)=="table" then
- local n=#k
- for l=1,n do
- conc[l]=hash[k[l]]
- end
- return concat(conc,"",1,n)
- elseif k>=0x00E000 and k<=0x00F8FF then
- return unknown
- elseif k>=0x0F0000 and k<=0x0FFFFF then
- return unknown
- elseif k>=0x100000 and k<=0x10FFFF then
- return unknown
- else
- return hash[k]
- end
-end
-local function fromunicode16(str)
- if #str==4 then
- return tonumber(str,16)
- else
- local l,r=match(str,"(....)(....)")
- return 0x10000+(tonumber(l,16)-0xD800)*0x400+tonumber(r,16)-0xDC00
- end
-end
-mappings.makenameparser=makenameparser
-mappings.tounicode=tounicode
-mappings.tounicode16=tounicode16
-mappings.tounicode16sequence=tounicode16sequence
-mappings.fromunicode16=fromunicode16
-local ligseparator=P("_")
-local varseparator=P(".")
-local namesplitter=Ct(C((1-ligseparator-varseparator)^1)*(ligseparator*C((1-ligseparator-varseparator)^1))^0)
-do
- local overloads={
- IJ={ name="I_J",unicode={ 0x49,0x4A },mess=0x0132 },
- ij={ name="i_j",unicode={ 0x69,0x6A },mess=0x0133 },
- ff={ name="f_f",unicode={ 0x66,0x66 },mess=0xFB00 },
- fi={ name="f_i",unicode={ 0x66,0x69 },mess=0xFB01 },
- fl={ name="f_l",unicode={ 0x66,0x6C },mess=0xFB02 },
- ffi={ name="f_f_i",unicode={ 0x66,0x66,0x69 },mess=0xFB03 },
- ffl={ name="f_f_l",unicode={ 0x66,0x66,0x6C },mess=0xFB04 },
- fj={ name="f_j",unicode={ 0x66,0x6A } },
- fk={ name="f_k",unicode={ 0x66,0x6B } },
- }
- local o=allocate {}
- for k,v in next,overloads do
- local name=v.name
- local mess=v.mess
- if name then
- o[name]=v
- end
- if mess then
- o[mess]=v
- end
- o[k]=v
- end
- mappings.overloads=o
-end
-function mappings.addtounicode(data,filename,checklookups,forceligatures)
- local resources=data.resources
- local unicodes=resources.unicodes
- if not unicodes then
- if trace_mapping then
- report_fonts("no unicode list, quitting tounicode for %a",filename)
- end
- return
- end
- local properties=data.properties
- local descriptions=data.descriptions
- local overloads=mappings.overloads
- unicodes['space']=unicodes['space'] or 32
- unicodes['hyphen']=unicodes['hyphen'] or 45
- unicodes['zwj']=unicodes['zwj'] or 0x200D
- unicodes['zwnj']=unicodes['zwnj'] or 0x200C
- local private=fonts.constructors and fonts.constructors.privateoffset or 0xF0000
- local unicodevector=fonts.encodings.agl.unicodes or {}
- local contextvector=fonts.encodings.agl.ctxcodes or {}
- local missing={}
- local nofmissing=0
- local oparser=nil
- local cidnames=nil
- local cidcodes=nil
- local cidinfo=properties.cidinfo
- local usedmap=cidinfo and fonts.cid.getmap(cidinfo)
- local uparser=makenameparser()
- if usedmap then
- oparser=usedmap and makenameparser(cidinfo.ordering)
- cidnames=usedmap.names
- cidcodes=usedmap.unicodes
- end
- local ns=0
- local nl=0
- local dlist=sortedkeys(descriptions)
- for i=1,#dlist do
- local du=dlist[i]
- local glyph=descriptions[du]
- local name=glyph.name
- if name then
- local overload=overloads[name] or overloads[du]
- if overload then
- glyph.unicode=overload.unicode
- else
- local gu=glyph.unicode
- if not gu or gu==-1 or du>=private or (du>=0xE000 and du<=0xF8FF) or du==0xFFFE or du==0xFFFF then
- local unicode=unicodevector[name] or contextvector[name]
- if unicode then
- glyph.unicode=unicode
- ns=ns+1
- end
- if (not unicode) and usedmap then
- local foundindex=lpegmatch(oparser,name)
- if foundindex then
- unicode=cidcodes[foundindex]
- if unicode then
- glyph.unicode=unicode
- ns=ns+1
- else
- local reference=cidnames[foundindex]
- if reference then
- local foundindex=lpegmatch(oparser,reference)
- if foundindex then
- unicode=cidcodes[foundindex]
- if unicode then
- glyph.unicode=unicode
- ns=ns+1
- end
- end
- if not unicode or unicode=="" then
- local foundcodes,multiple=lpegmatch(uparser,reference)
- if foundcodes then
- glyph.unicode=foundcodes
- if multiple then
- nl=nl+1
- unicode=true
- else
- ns=ns+1
- unicode=foundcodes
- end
- end
- end
- end
- end
- end
- end
- if not unicode or unicode=="" then
- local split=lpegmatch(namesplitter,name)
- local nsplit=split and #split or 0
- if nsplit==0 then
- elseif nsplit==1 then
- local base=split[1]
- local u=unicodes[base] or unicodevector[base] or contextvector[name]
- if not u then
- elseif type(u)=="table" then
- if u[1]=private then
- break
- end
- n=n+1
- t[n]=u[1]
- else
- if u>=private then
- break
- end
- n=n+1
- t[n]=u
- end
- end
- if n>0 then
- if n==1 then
- unicode=t[1]
- else
- unicode=t
- end
- glyph.unicode=unicode
- end
- end
- nl=nl+1
- end
- if not unicode or unicode=="" then
- local foundcodes,multiple=lpegmatch(uparser,name)
- if foundcodes then
- glyph.unicode=foundcodes
- if multiple then
- nl=nl+1
- unicode=true
- else
- ns=ns+1
- unicode=foundcodes
- end
- end
- end
- local r=overloads[unicode]
- if r then
- unicode=r.unicode
- glyph.unicode=unicode
- end
- if not unicode then
- missing[du]=true
- nofmissing=nofmissing+1
- end
- else
- end
- end
- else
- local overload=overloads[du]
- if overload then
- glyph.unicode=overload.unicode
- elseif not glyph.unicode then
- missing[du]=true
- nofmissing=nofmissing+1
- end
- end
- end
- if type(checklookups)=="function" then
- checklookups(data,missing,nofmissing)
- end
- local unicoded=0
- local collected=fonts.handlers.otf.readers.getcomponents(data)
- local function resolve(glyph,u)
- local n=#u
- for i=1,n do
- if u[i]>private then
- n=0
- break
- end
- end
- if n>0 then
- if n>1 then
- glyph.unicode=u
- else
- glyph.unicode=u[1]
- end
- unicoded=unicoded+1
- end
- end
- if not collected then
- elseif forceligatures or force_ligatures then
- for i=1,#dlist do
- local du=dlist[i]
- if du>=private or (du>=0xE000 and du<=0xF8FF) then
- local u=collected[du]
- if u then
- resolve(descriptions[du],u)
- end
- end
- end
- else
- for i=1,#dlist do
- local du=dlist[i]
- if du>=private or (du>=0xE000 and du<=0xF8FF) then
- local glyph=descriptions[du]
- if glyph.class=="ligature" and not glyph.unicode then
- local u=collected[du]
- if u then
- resolve(glyph,u)
- end
- end
- end
- end
- end
- if trace_mapping and unicoded>0 then
- report_fonts("%n ligature tounicode mappings deduced from gsub ligature features",unicoded)
- end
- if trace_mapping then
- for i=1,#dlist do
- local du=dlist[i]
- local glyph=descriptions[du]
- local name=glyph.name or "-"
- local index=glyph.index or 0
- local unicode=glyph.unicode
- if unicode then
- if type(unicode)=="table" then
- local unicodes={}
- for i=1,#unicode do
- unicodes[i]=formatters("%U",unicode[i])
- end
- report_fonts("internal slot %U, name %a, unicode %U, tounicode % t",index,name,du,unicodes)
- else
- report_fonts("internal slot %U, name %a, unicode %U, tounicode %U",index,name,du,unicode)
- end
- else
- report_fonts("internal slot %U, name %a, unicode %U",index,name,du)
- end
- end
- end
- if trace_loading and (ns>0 or nl>0) then
- report_fonts("%s tounicode entries added, ligatures %s",nl+ns,ns)
- end
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-map”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-vfc” 94937140f2c909e9c831ba021f1ab303] ---
-
-if not modules then modules={} end modules ['font-vfc']={
- version=1.001,
- comment="companion to font-ini.mkiv and hand-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local select,type=select,type
-local insert=table.insert
-local fonts=fonts
-local helpers=fonts.helpers
-local setmetatableindex=table.setmetatableindex
-local makeweak=table.makeweak
-local push={ "push" }
-local pop={ "pop" }
-local dummy={ "comment" }
-function helpers.prependcommands(commands,...)
- insert(commands,1,push)
- for i=select("#",...),1,-1 do
- local s=(select(i,...))
- if s then
- insert(commands,1,s)
- end
- end
- insert(commands,pop)
- return commands
-end
-function helpers.appendcommands(commands,...)
- insert(commands,1,push)
- insert(commands,pop)
- for i=1,select("#",...) do
- local s=(select(i,...))
- if s then
- insert(commands,s)
- end
- end
- return commands
-end
-function helpers.prependcommandtable(commands,t)
- insert(commands,1,push)
- for i=#t,1,-1 do
- local s=t[i]
- if s then
- insert(commands,1,s)
- end
- end
- insert(commands,pop)
- return commands
-end
-function helpers.appendcommandtable(commands,t)
- insert(commands,1,push)
- insert(commands,pop)
- for i=1,#t do
- local s=t[i]
- if s then
- insert(commands,s)
- end
- end
- return commands
-end
-local char=setmetatableindex(function(t,k)
- local v={ "slot",0,k }
- t[k]=v
- return v
-end)
-local right=setmetatableindex(function(t,k)
- local v={ "right",k }
- t[k]=v
- return v
-end)
-local left=setmetatableindex(function(t,k)
- local v={ "right",-k }
- t[k]=v
- return v
-end)
-local down=setmetatableindex(function(t,k)
- local v={ "down",k }
- t[k]=v
- return v
-end)
-local up=setmetatableindex(function(t,k)
- local v={ "down",-k }
- t[k]=v
- return v
-end)
-helpers.commands=utilities.storage.allocate {
- char=char,
- right=right,
- left=left,
- down=down,
- up=up,
- push=push,
- pop=pop,
- dummy=dummy,
-}
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-vfc”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-otr” d96724dcb40c673ac294df7044a39925] ---
-
-if not modules then modules={} end modules ['font-otr']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local next,type,tonumber,rawget=next,type,tonumber,rawget
-local byte,lower,char,gsub=string.byte,string.lower,string.char,string.gsub
-local fullstrip=string.fullstrip
-local floor,round=math.floor,math.round
-local P,R,S,C,Cs,Cc,Ct,Carg,Cmt=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.Ct,lpeg.Carg,lpeg.Cmt
-local lpegmatch=lpeg.match
-local rshift=bit32.rshift
-local setmetatableindex=table.setmetatableindex
-local sortedkeys=table.sortedkeys
-local sortedhash=table.sortedhash
-local stripstring=string.nospaces
-local utf16_to_utf8_be=utf.utf16_to_utf8_be
-local report=logs.reporter("otf reader")
-local report_cmap=logs.reporter("otf reader","cmap")
-local trace_cmap=false trackers.register("otf.cmap",function(v) trace_cmap=v end)
-local trace_cmap_details=false trackers.register("otf.cmap.details",function(v) trace_cmap_details=v end)
-fonts=fonts or {}
-local handlers=fonts.handlers or {}
-fonts.handlers=handlers
-local otf=handlers.otf or {}
-handlers.otf=otf
-local readers=otf.readers or {}
-otf.readers=readers
-local streamreader=utilities.files
-local streamwriter=utilities.files
-readers.streamreader=streamreader
-readers.streamwriter=streamwriter
-local openfile=streamreader.open
-local closefile=streamreader.close
-local setposition=streamreader.setposition
-local skipshort=streamreader.skipshort
-local readbytes=streamreader.readbytes
-local readstring=streamreader.readstring
-local readbyte=streamreader.readcardinal1
-local readushort=streamreader.readcardinal2
-local readuint=streamreader.readcardinal3
-local readulong=streamreader.readcardinal4
-local readshort=streamreader.readinteger2
-local readlong=streamreader.readinteger4
-local readfixed=streamreader.readfixed4
-local read2dot14=streamreader.read2dot14
-local readfword=readshort
-local readufword=readushort
-local readoffset=readushort
-local readcardinaltable=streamreader.readcardinaltable
-local readintegertable=streamreader.readintegertable
-function streamreader.readtag(f)
- return lower(stripstring(readstring(f,4)))
-end
-local short=2
-local ushort=2
-local ulong=4
-directives.register("fonts.streamreader",function()
- streamreader=utilities.streams
- openfile=streamreader.open
- closefile=streamreader.close
- setposition=streamreader.setposition
- skipshort=streamreader.skipshort
- readbytes=streamreader.readbytes
- readstring=streamreader.readstring
- readbyte=streamreader.readcardinal1
- readushort=streamreader.readcardinal2
- readuint=streamreader.readcardinal3
- readulong=streamreader.readcardinal4
- readshort=streamreader.readinteger2
- readlong=streamreader.readinteger4
- readfixed=streamreader.readfixed4
- read2dot14=streamreader.read2dot14
- readfword=readshort
- readufword=readushort
- readoffset=readushort
- readcardinaltable=streamreader.readcardinaltable
- readintegertable=streamreader.readintegertable
- function streamreader.readtag(f)
- return lower(stripstring(readstring(f,4)))
- end
-end)
-local function readlongdatetime(f)
- local a,b,c,d,e,f,g,h=readbytes(f,8)
- return 0x100000000*d+0x1000000*e+0x10000*f+0x100*g+h
-end
-local tableversion=0.004
-readers.tableversion=tableversion
-local privateoffset=fonts.constructors and fonts.constructors.privateoffset or 0xF0000
-local reservednames={ [0]="copyright",
- "family",
- "subfamily",
- "uniqueid",
- "fullname",
- "version",
- "postscriptname",
- "trademark",
- "manufacturer",
- "designer",
- "description",
- "vendorurl",
- "designerurl",
- "license",
- "licenseurl",
- "reserved",
- "typographicfamily",
- "typographicsubfamily",
- "compatiblefullname",
- "sampletext",
- "cidfindfontname",
- "wwsfamily",
- "wwssubfamily",
- "lightbackgroundpalette",
- "darkbackgroundpalette",
- "variationspostscriptnameprefix",
-}
-local platforms={ [0]="unicode",
- "macintosh",
- "iso",
- "windows",
- "custom",
-}
-local encodings={
- unicode={ [0]="unicode 1.0 semantics",
- "unicode 1.1 semantics",
- "iso/iec 10646",
- "unicode 2.0 bmp",
- "unicode 2.0 full",
- "unicode variation sequences",
- "unicode full repertoire",
- },
- macintosh={ [0]="roman","japanese","chinese (traditional)","korean","arabic","hebrew","greek","russian",
- "rsymbol","devanagari","gurmukhi","gujarati","oriya","bengali","tamil","telugu","kannada",
- "malayalam","sinhalese","burmese","khmer","thai","laotian","georgian","armenian",
- "chinese (simplified)","tibetan","mongolian","geez","slavic","vietnamese","sindhi",
- "uninterpreted",
- },
- iso={ [0]="7-bit ascii",
- "iso 10646",
- "iso 8859-1",
- },
- windows={ [0]="symbol",
- "unicode bmp",
- "shiftjis",
- "prc",
- "big5",
- "wansung",
- "johab",
- "reserved 7",
- "reserved 8",
- "reserved 9",
- "unicode ucs-4",
- },
- custom={
- }
-}
-local decoders={
- unicode={},
- macintosh={},
- iso={},
- windows={
- ["unicode semantics"]=utf16_to_utf8_be,
- ["unicode bmp"]=utf16_to_utf8_be,
- ["unicode full"]=utf16_to_utf8_be,
- ["unicode 1.0 semantics"]=utf16_to_utf8_be,
- ["unicode 1.1 semantics"]=utf16_to_utf8_be,
- ["unicode 2.0 bmp"]=utf16_to_utf8_be,
- ["unicode 2.0 full"]=utf16_to_utf8_be,
- ["unicode variation sequences"]=utf16_to_utf8_be,
- ["unicode full repertoire"]=utf16_to_utf8_be,
- },
- custom={},
-}
-local languages={
- unicode={
- [ 0]="english",
- },
- macintosh={
- [ 0]="english",
- },
- iso={},
- windows={
- [0x0409]="english - united states",
- },
- custom={},
-}
-local standardromanencoding={ [0]=
- "notdef",".null","nonmarkingreturn","space","exclam","quotedbl",
- "numbersign","dollar","percent","ampersand","quotesingle","parenleft",
- "parenright","asterisk","plus","comma","hyphen","period","slash",
- "zero","one","two","three","four","five","six","seven","eight",
- "nine","colon","semicolon","less","equal","greater","question","at",
- "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O",
- "P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft",
- "backslash","bracketright","asciicircum","underscore","grave","a","b",
- "c","d","e","f","g","h","i","j","k","l","m","n","o","p","q",
- "r","s","t","u","v","w","x","y","z","braceleft","bar",
- "braceright","asciitilde","Adieresis","Aring","Ccedilla","Eacute",
- "Ntilde","Odieresis","Udieresis","aacute","agrave","acircumflex",
- "adieresis","atilde","aring","ccedilla","eacute","egrave",
- "ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis",
- "ntilde","oacute","ograve","ocircumflex","odieresis","otilde","uacute",
- "ugrave","ucircumflex","udieresis","dagger","degree","cent","sterling",
- "section","bullet","paragraph","germandbls","registered","copyright",
- "trademark","acute","dieresis","notequal","AE","Oslash","infinity",
- "plusminus","lessequal","greaterequal","yen","mu","partialdiff",
- "summation","product","pi","integral","ordfeminine","ordmasculine",
- "Omega","ae","oslash","questiondown","exclamdown","logicalnot",
- "radical","florin","approxequal","Delta","guillemotleft",
- "guillemotright","ellipsis","nonbreakingspace","Agrave","Atilde",
- "Otilde","OE","oe","endash","emdash","quotedblleft","quotedblright",
- "quoteleft","quoteright","divide","lozenge","ydieresis","Ydieresis",
- "fraction","currency","guilsinglleft","guilsinglright","fi","fl",
- "daggerdbl","periodcentered","quotesinglbase","quotedblbase",
- "perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave",
- "Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex",
- "apple","Ograve","Uacute","Ucircumflex","Ugrave","dotlessi",
- "circumflex","tilde","macron","breve","dotaccent","ring","cedilla",
- "hungarumlaut","ogonek","caron","Lslash","lslash","Scaron","scaron",
- "Zcaron","zcaron","brokenbar","Eth","eth","Yacute","yacute","Thorn",
- "thorn","minus","multiply","onesuperior","twosuperior","threesuperior",
- "onehalf","onequarter","threequarters","franc","Gbreve","gbreve",
- "Idotaccent","Scedilla","scedilla","Cacute","cacute","Ccaron","ccaron",
- "dcroat",
-}
-local weights={
- [100]="thin",
- [200]="extralight",
- [300]="light",
- [400]="normal",
- [500]="medium",
- [600]="semibold",
- [700]="bold",
- [800]="extrabold",
- [900]="black",
-}
-local widths={
- [1]="ultracondensed",
- [2]="extracondensed",
- [3]="condensed",
- [4]="semicondensed",
- [5]="normal",
- [6]="semiexpanded",
- [7]="expanded",
- [8]="extraexpanded",
- [9]="ultraexpanded",
-}
-setmetatableindex(weights,function(t,k)
- local r=floor((k+50)/100)*100
- local v=(r>900 and "black") or rawget(t,r) or "normal"
- return v
-end)
-setmetatableindex(widths,function(t,k)
- return "normal"
-end)
-local panoseweights={
- [ 0]="normal",
- [ 1]="normal",
- [ 2]="verylight",
- [ 3]="light",
- [ 4]="thin",
- [ 5]="book",
- [ 6]="medium",
- [ 7]="demi",
- [ 8]="bold",
- [ 9]="heavy",
- [10]="black",
-}
-local panosewidths={
- [ 0]="normal",
- [ 1]="normal",
- [ 2]="normal",
- [ 3]="normal",
- [ 4]="normal",
- [ 5]="expanded",
- [ 6]="condensed",
- [ 7]="veryexpanded",
- [ 8]="verycondensed",
- [ 9]="monospaced",
-}
-local helpers={}
-readers.helpers=helpers
-local function gotodatatable(f,fontdata,tag,criterium)
- if criterium and f then
- local tables=fontdata.tables
- if tables then
- local datatable=tables[tag]
- if datatable then
- local tableoffset=datatable.offset
- setposition(f,tableoffset)
- return tableoffset
- end
- else
- report("no tables")
- end
- end
-end
-local function reportskippedtable(f,fontdata,tag,criterium)
- if criterium and f then
- local tables=fontdata.tables
- if tables then
- local datatable=tables[tag]
- if datatable then
- report("loading of table %a skipped",tag)
- end
- else
- report("no tables")
- end
- end
-end
-local function setvariabledata(fontdata,tag,data)
- local variabledata=fontdata.variabledata
- if variabledata then
- variabledata[tag]=data
- else
- fontdata.variabledata={ [tag]=data }
- end
-end
-helpers.gotodatatable=gotodatatable
-helpers.setvariabledata=setvariabledata
-helpers.reportskippedtable=reportskippedtable
-local platformnames={
- postscriptname=true,
- fullname=true,
- family=true,
- subfamily=true,
- typographicfamily=true,
- typographicsubfamily=true,
- compatiblefullname=true,
-}
-local platformextras={
- uniqueid=true,
- version=true,
- copyright=true,
- license=true,
- licenseurl=true,
- manufacturer=true,
- vendorurl=true,
-}
-function readers.name(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"name",true)
- if tableoffset then
- local format=readushort(f)
- local nofnames=readushort(f)
- local offset=readushort(f)
- local start=tableoffset+offset
- local namelists={
- unicode={},
- windows={},
- macintosh={},
- }
- for i=1,nofnames do
- local platform=platforms[readushort(f)]
- if platform then
- local namelist=namelists[platform]
- if namelist then
- local encoding=readushort(f)
- local language=readushort(f)
- local encodings=encodings[platform]
- local languages=languages[platform]
- if encodings and languages then
- local encoding=encodings[encoding]
- local language=languages[language]
- if encoding and language then
- local index=readushort(f)
- local name=reservednames[index]
- namelist[#namelist+1]={
- platform=platform,
- encoding=encoding,
- language=language,
- name=name,
- index=index,
- length=readushort(f),
- offset=start+readushort(f),
- }
- else
- skipshort(f,3)
- end
- else
- skipshort(f,3)
- end
- else
- skipshort(f,5)
- end
- else
- skipshort(f,5)
- end
- end
- local names={}
- local done={}
- local extras={}
- local function decoded(platform,encoding,content)
- local decoder=decoders[platform]
- if decoder then
- decoder=decoder[encoding]
- end
- if decoder then
- return decoder(content)
- else
- return content
- end
- end
- local function filter(platform,e,l)
- local namelist=namelists[platform]
- for i=1,#namelist do
- local name=namelist[i]
- local nametag=name.name
- local index=name.index
- if not done[nametag or i] then
- local encoding=name.encoding
- local language=name.language
- if (not e or encoding==e) and (not l or language==l) then
- setposition(f,name.offset)
- local content=decoded(platform,encoding,readstring(f,name.length))
- if nametag then
- names[nametag]={
- content=content,
- platform=platform,
- encoding=encoding,
- language=language,
- }
- end
- extras[index]=content
- done[nametag or i]=true
- end
- end
- end
- end
- filter("windows","unicode bmp","english - united states")
- filter("macintosh","roman","english")
- filter("windows")
- filter("macintosh")
- filter("unicode")
- fontdata.names=names
- fontdata.extras=extras
- if specification.platformnames then
- local collected={}
- local platformextras=specification.platformextras and platformextras
- for platform,namelist in next,namelists do
- local filtered=false
- for i=1,#namelist do
- local entry=namelist[i]
- local name=entry.name
- if platformnames[name] or (platformextras and platformextras[name]) then
- setposition(f,entry.offset)
- local content=decoded(platform,entry.encoding,readstring(f,entry.length))
- if filtered then
- filtered[name]=content
- else
- filtered={ [name]=content }
- end
- end
- end
- if filtered then
- collected[platform]=filtered
- end
- end
- fontdata.platformnames=collected
- end
- else
- fontdata.names={}
- end
-end
-local validutf=lpeg.patterns.validutf8
-local function getname(fontdata,key)
- local names=fontdata.names
- if names then
- local value=names[key]
- if value then
- local content=value.content
- return lpegmatch(validutf,content) and content or nil
- end
- end
-end
-readers["os/2"]=function(f,fontdata)
- local tableoffset=gotodatatable(f,fontdata,"os/2",true)
- if tableoffset then
- local version=readushort(f)
- local windowsmetrics={
- version=version,
- averagewidth=readshort(f),
- weightclass=readushort(f),
- widthclass=readushort(f),
- fstype=readushort(f),
- subscriptxsize=readshort(f),
- subscriptysize=readshort(f),
- subscriptxoffset=readshort(f),
- subscriptyoffset=readshort(f),
- superscriptxsize=readshort(f),
- superscriptysize=readshort(f),
- superscriptxoffset=readshort(f),
- superscriptyoffset=readshort(f),
- strikeoutsize=readshort(f),
- strikeoutpos=readshort(f),
- familyclass=readshort(f),
- panose={ readbytes(f,10) },
- unicoderanges={ readulong(f),readulong(f),readulong(f),readulong(f) },
- vendor=readstring(f,4),
- fsselection=readushort(f),
- firstcharindex=readushort(f),
- lastcharindex=readushort(f),
- typoascender=readshort(f),
- typodescender=readshort(f),
- typolinegap=readshort(f),
- winascent=readushort(f),
- windescent=readushort(f),
- }
- if version>=1 then
- windowsmetrics.codepageranges={ readulong(f),readulong(f) }
- end
- if version>=2 then
- windowsmetrics.xheight=readshort(f)
- windowsmetrics.capheight=readshort(f)
- windowsmetrics.defaultchar=readushort(f)
- windowsmetrics.breakchar=readushort(f)
- end
- windowsmetrics.weight=windowsmetrics.weightclass and weights[windowsmetrics.weightclass]
- windowsmetrics.width=windowsmetrics.widthclass and widths [windowsmetrics.widthclass]
- windowsmetrics.panoseweight=panoseweights[windowsmetrics.panose[3]]
- windowsmetrics.panosewidth=panosewidths [windowsmetrics.panose[4]]
- fontdata.windowsmetrics=windowsmetrics
- else
- fontdata.windowsmetrics={}
- end
-end
-readers.head=function(f,fontdata)
- local tableoffset=gotodatatable(f,fontdata,"head",true)
- if tableoffset then
- local version=readulong(f)
- local fontversion=readulong(f)
- local fontheader={
- version=version,
- fontversion=number.to16dot16(fontversion),
- fontversionnumber=fontversion,
- checksum=readushort(f)*0x10000+readushort(f),
- magic=readulong(f),
- flags=readushort(f),
- units=readushort(f),
- created=readlongdatetime(f),
- modified=readlongdatetime(f),
- xmin=readshort(f),
- ymin=readshort(f),
- xmax=readshort(f),
- ymax=readshort(f),
- macstyle=readushort(f),
- smallpixels=readushort(f),
- directionhint=readshort(f),
- indextolocformat=readshort(f),
- glyphformat=readshort(f),
- }
- fontdata.fontheader=fontheader
- else
- fontdata.fontheader={}
- end
- fontdata.nofglyphs=0
-end
-readers.hhea=function(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"hhea",specification.details)
- if tableoffset then
- fontdata.horizontalheader={
- version=readulong(f),
- ascender=readfword(f),
- descender=readfword(f),
- linegap=readfword(f),
- maxadvancewidth=readufword(f),
- minleftsidebearing=readfword(f),
- minrightsidebearing=readfword(f),
- maxextent=readfword(f),
- caretsloperise=readshort(f),
- caretsloperun=readshort(f),
- caretoffset=readshort(f),
- reserved_1=readshort(f),
- reserved_2=readshort(f),
- reserved_3=readshort(f),
- reserved_4=readshort(f),
- metricdataformat=readshort(f),
- nofmetrics=readushort(f),
- }
- else
- fontdata.horizontalheader={
- nofmetrics=0,
- }
- end
-end
-readers.vhea=function(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"vhea",specification.details)
- if tableoffset then
- fontdata.verticalheader={
- version=readulong(f),
- ascender=readfword(f),
- descender=readfword(f),
- linegap=readfword(f),
- maxadvanceheight=readufword(f),
- mintopsidebearing=readfword(f),
- minbottomsidebearing=readfword(f),
- maxextent=readfword(f),
- caretsloperise=readshort(f),
- caretsloperun=readshort(f),
- caretoffset=readshort(f),
- reserved_1=readshort(f),
- reserved_2=readshort(f),
- reserved_3=readshort(f),
- reserved_4=readshort(f),
- metricdataformat=readshort(f),
- nofmetrics=readushort(f),
- }
- else
- fontdata.verticalheader={
- nofmetrics=0,
- }
- end
-end
-readers.maxp=function(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"maxp",specification.details)
- if tableoffset then
- local version=readulong(f)
- local nofglyphs=readushort(f)
- fontdata.nofglyphs=nofglyphs
- if version==0x00005000 then
- fontdata.maximumprofile={
- version=version,
- nofglyphs=nofglyphs,
- }
- elseif version==0x00010000 then
- fontdata.maximumprofile={
- version=version,
- nofglyphs=nofglyphs,
- points=readushort(f),
- contours=readushort(f),
- compositepoints=readushort(f),
- compositecontours=readushort(f),
- zones=readushort(f),
- twilightpoints=readushort(f),
- storage=readushort(f),
- functiondefs=readushort(f),
- instructiondefs=readushort(f),
- stackelements=readushort(f),
- sizeofinstructions=readushort(f),
- componentelements=readushort(f),
- componentdepth=readushort(f),
- }
- else
- fontdata.maximumprofile={
- version=version,
- nofglyphs=0,
- }
- end
- end
-end
-readers.hmtx=function(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"hmtx",specification.glyphs)
- if tableoffset then
- local horizontalheader=fontdata.horizontalheader
- local nofmetrics=horizontalheader.nofmetrics
- local glyphs=fontdata.glyphs
- local nofglyphs=fontdata.nofglyphs
- local width=0
- local leftsidebearing=0
- for i=0,nofmetrics-1 do
- local glyph=glyphs[i]
- width=readshort(f)
- leftsidebearing=readshort(f)
- if width~=0 then
- glyph.width=width
- end
- end
- for i=nofmetrics,nofglyphs-1 do
- local glyph=glyphs[i]
- if width~=0 then
- glyph.width=width
- end
- end
- end
-end
-readers.vmtx=function(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"vmtx",specification.glyphs)
- if tableoffset then
- local verticalheader=fontdata.verticalheader
- local nofmetrics=verticalheader.nofmetrics
- local glyphs=fontdata.glyphs
- local nofglyphs=fontdata.nofglyphs
- local vheight=0
- local vdefault=verticalheader.ascender-verticalheader.descender
- local topsidebearing=0
- for i=0,nofmetrics-1 do
- local glyph=glyphs[i]
- vheight=readushort(f)
- topsidebearing=readshort(f)
- if vheight~=0 and vheight~=vdefault then
- glyph.vheight=vheight
- end
- if topsidebearing~=0 then
- glyph.tsb=topsidebearing
- end
- end
- for i=nofmetrics,nofglyphs-1 do
- local glyph=glyphs[i]
- if vheight~=0 and vheight~=vdefault then
- glyph.vheight=vheight
- end
- end
- end
-end
-readers.vorg=function(f,fontdata,specification)
- reportskippedtable(f,fontdata,"vorg",specification.glyphs)
-end
-readers.post=function(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"post",true)
- if tableoffset then
- local version=readulong(f)
- fontdata.postscript={
- version=version,
- italicangle=round(1000*readfixed(f))/1000,
- underlineposition=readfword(f),
- underlinethickness=readfword(f),
- monospaced=readulong(f),
- minmemtype42=readulong(f),
- maxmemtype42=readulong(f),
- minmemtype1=readulong(f),
- maxmemtype1=readulong(f),
- }
- if not specification.glyphs then
- elseif version==0x00010000 then
- for index=0,#standardromanencoding do
- glyphs[index].name=standardromanencoding[index]
- end
- elseif version==0x00020000 then
- local glyphs=fontdata.glyphs
- local nofglyphs=readushort(f)
- local indices={}
- local names={}
- local maxnames=0
- for i=0,nofglyphs-1 do
- local nameindex=readushort(f)
- if nameindex>=258 then
- maxnames=maxnames+1
- nameindex=nameindex-257
- indices[nameindex]=i
- else
- glyphs[i].name=standardromanencoding[nameindex]
- end
- end
- for i=1,maxnames do
- local mapping=indices[i]
- if not mapping then
- report("quit post name fetching at %a of %a: %s",i,maxnames,"no index")
- break
- else
- local length=readbyte(f)
- if length>0 then
- glyphs[mapping].name=readstring(f,length)
- else
- report("quit post name fetching at %a of %a: %s",i,maxnames,"overflow")
- break
- end
- end
- end
- end
- else
- fontdata.postscript={}
- end
-end
-readers.cff=function(f,fontdata,specification)
- reportskippedtable(f,fontdata,"cff",specification.glyphs)
-end
-local formatreaders={}
-local duplicatestoo=true
-local sequence={
- { 3,1,4 },
- { 3,10,12 },
- { 0,3,4 },
- { 0,3,12 },
- { 0,1,4 },
- { 0,1,12 },
- { 0,0,6 },
- { 3,0,6 },
- { 3,0,4 },
- { 0,5,14 },
- { 0,4,12 },
- { 3,10,13 },
-}
-local supported={}
-for i=1,#sequence do
- local si=sequence[i]
- local sp,se,sf=si[1],si[2],si[3]
- local p=supported[sp]
- if not p then
- p={}
- supported[sp]=p
- end
- local e=p[se]
- if not e then
- e={}
- p[se]=e
- end
- e[sf]=true
-end
-formatreaders[4]=function(f,fontdata,offset)
- setposition(f,offset+2)
- local length=readushort(f)
- local language=readushort(f)
- local nofsegments=readushort(f)/2
- skipshort(f,3)
- local mapping=fontdata.mapping
- local glyphs=fontdata.glyphs
- local duplicates=fontdata.duplicates
- local nofdone=0
- local endchars=readcardinaltable(f,nofsegments,ushort)
- local reserved=readushort(f)
- local startchars=readcardinaltable(f,nofsegments,ushort)
- local deltas=readcardinaltable(f,nofsegments,ushort)
- local offsets=readcardinaltable(f,nofsegments,ushort)
- local size=(length-2*2-5*2-4*2*nofsegments)/2
- local indices=readcardinaltable(f,size-1,ushort)
- for segment=1,nofsegments do
- local startchar=startchars[segment]
- local endchar=endchars[segment]
- local offset=offsets[segment]
- local delta=deltas[segment]
- if startchar==0xFFFF and endchar==0xFFFF then
- elseif startchar==0xFFFF and offset==0 then
- elseif offset==0xFFFF then
- elseif offset==0 then
- if trace_cmap_details then
- report("format 4.%i segment %2i from %C upto %C at index %H",1,segment,startchar,endchar,(startchar+delta)%65536)
- end
- for unicode=startchar,endchar do
- local index=(unicode+delta)%65536
- if index and index>0 then
- local glyph=glyphs[index]
- if glyph then
- local gu=glyph.unicode
- if not gu then
- glyph.unicode=unicode
- nofdone=nofdone+1
- elseif gu~=unicode then
- if duplicatestoo then
- local d=duplicates[gu]
- if d then
- d[unicode]=true
- else
- duplicates[gu]={ [unicode]=true }
- end
- else
- report("duplicate case 1: %C %04i %s",unicode,index,glyphs[index].name)
- end
- end
- if not mapping[index] then
- mapping[index]=unicode
- end
- end
- end
- end
- else
- local shift=(segment-nofsegments+offset/2)-startchar
- if trace_cmap_details then
- report_cmap("format 4.%i segment %2i from %C upto %C at index %H",0,segment,startchar,endchar,(startchar+delta)%65536)
- end
- for unicode=startchar,endchar do
- local slot=shift+unicode
- local index=indices[slot]
- if index and index>0 then
- index=(index+delta)%65536
- local glyph=glyphs[index]
- if glyph then
- local gu=glyph.unicode
- if not gu then
- glyph.unicode=unicode
- nofdone=nofdone+1
- elseif gu~=unicode then
- if duplicatestoo then
- local d=duplicates[gu]
- if d then
- d[unicode]=true
- else
- duplicates[gu]={ [unicode]=true }
- end
- else
- report("duplicate case 2: %C %04i %s",unicode,index,glyphs[index].name)
- end
- end
- if not mapping[index] then
- mapping[index]=unicode
- end
- end
- end
- end
- end
- end
- return nofdone
-end
-formatreaders[6]=function(f,fontdata,offset)
- setposition(f,offset)
- local format=readushort(f)
- local length=readushort(f)
- local language=readushort(f)
- local mapping=fontdata.mapping
- local glyphs=fontdata.glyphs
- local duplicates=fontdata.duplicates
- local start=readushort(f)
- local count=readushort(f)
- local stop=start+count-1
- local nofdone=0
- if trace_cmap_details then
- report_cmap("format 6 from %C to %C",2,start,stop)
- end
- for unicode=start,stop do
- local index=readushort(f)
- if index>0 then
- local glyph=glyphs[index]
- if glyph then
- local gu=glyph.unicode
- if not gu then
- glyph.unicode=unicode
- nofdone=nofdone+1
- elseif gu~=unicode then
- end
- if not mapping[index] then
- mapping[index]=unicode
- end
- end
- end
- end
- return nofdone
-end
-formatreaders[12]=function(f,fontdata,offset)
- setposition(f,offset+2+2+4+4)
- local mapping=fontdata.mapping
- local glyphs=fontdata.glyphs
- local duplicates=fontdata.duplicates
- local nofgroups=readulong(f)
- local nofdone=0
- for i=1,nofgroups do
- local first=readulong(f)
- local last=readulong(f)
- local index=readulong(f)
- if trace_cmap_details then
- report_cmap("format 12 from %C to %C starts at index %i",first,last,index)
- end
- for unicode=first,last do
- local glyph=glyphs[index]
- if glyph then
- local gu=glyph.unicode
- if not gu then
- glyph.unicode=unicode
- nofdone=nofdone+1
- elseif gu~=unicode then
- local d=duplicates[gu]
- if d then
- d[unicode]=true
- else
- duplicates[gu]={ [unicode]=true }
- end
- end
- if not mapping[index] then
- mapping[index]=unicode
- end
- end
- index=index+1
- end
- end
- return nofdone
-end
-formatreaders[13]=function(f,fontdata,offset)
- setposition(f,offset+2+2+4+4)
- local mapping=fontdata.mapping
- local glyphs=fontdata.glyphs
- local duplicates=fontdata.duplicates
- local nofgroups=readulong(f)
- local nofdone=0
- for i=1,nofgroups do
- local first=readulong(f)
- local last=readulong(f)
- local index=readulong(f)
- if first=privateoffset then
- local limit=privateoffset-1
- report("format 13 from %C to %C pruned to %C",first,last,limit)
- last=limit
- end
- for unicode=first,last do
- list[unicode]=true
- end
- nofdone=nofdone+last-first+1
- else
- report("format 13 from %C to %C ignored",first,last)
- end
- end
- return nofdone
-end
-formatreaders[14]=function(f,fontdata,offset)
- if offset and offset~=0 then
- setposition(f,offset)
- local format=readushort(f)
- local length=readulong(f)
- local nofrecords=readulong(f)
- local records={}
- local variants={}
- local nofdone=0
- fontdata.variants=variants
- for i=1,nofrecords do
- records[i]={
- selector=readuint(f),
- default=readulong(f),
- other=readulong(f),
- }
- end
- for i=1,nofrecords do
- local record=records[i]
- local selector=record.selector
- local default=record.default
- local other=record.other
- local other=record.other
- if other~=0 then
- setposition(f,offset+other)
- local mapping={}
- local count=readulong(f)
- for i=1,count do
- mapping[readuint(f)]=readushort(f)
- end
- nofdone=nofdone+count
- variants[selector]=mapping
- end
- end
- return nofdone
- else
- return 0
- end
-end
-local function checkcmap(f,fontdata,records,platform,encoding,format)
- local pdata=records[platform]
- if not pdata then
- if trace_cmap_details then
- report_cmap("skipped, %s, p=%i e=%i f=%i","no platform",platform,encoding,format)
- end
- return 0
- end
- local edata=pdata[encoding]
- if not edata then
- if trace_cmap_details then
- report_cmap("skipped, %s, p=%i e=%i f=%i","no encoding",platform,encoding,format)
- end
- return 0
- end
- local fdata=edata[format]
- if not fdata then
- if trace_cmap_details then
- report_cmap("skipped, %s, p=%i e=%i f=%i","no format",platform,encoding,format)
- end
- return 0
- elseif type(fdata)~="number" then
- if trace_cmap_details then
- report_cmap("skipped, %s, p=%i e=%i f=%i","already done",platform,encoding,format)
- end
- return 0
- end
- edata[format]=true
- local reader=formatreaders[format]
- if not reader then
- if trace_cmap_details then
- report_cmap("skipped, %s, p=%i e=%i f=%i","unsupported format",platform,encoding,format)
- end
- return 0
- end
- local n=reader(f,fontdata,fdata) or 0
- if trace_cmap_details or trace_cmap then
- local p=platforms[platform]
- local e=encodings[p]
- report_cmap("checked, platform %i (%s), encoding %i (%s), format %i, new unicodes %i",
- platform,p,encoding,e and e[encoding] or "?",format,n)
- end
- return n
-end
-function readers.cmap(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"cmap",specification.glyphs)
- if tableoffset then
- local version=readushort(f)
- local noftables=readushort(f)
- local records={}
- local unicodecid=false
- local variantcid=false
- local variants={}
- local duplicates=fontdata.duplicates or {}
- fontdata.duplicates=duplicates
- for i=1,noftables do
- local platform=readushort(f)
- local encoding=readushort(f)
- local offset=readulong(f)
- local record=records[platform]
- if not record then
- records[platform]={
- [encoding]={
- offsets={ offset },
- formats={},
- }
- }
- else
- local subtables=record[encoding]
- if not subtables then
- record[encoding]={
- offsets={ offset },
- formats={},
- }
- else
- local offsets=subtables.offsets
- offsets[#offsets+1]=offset
- end
- end
- end
- if trace_cmap then
- report("found cmaps:")
- end
- for platform,record in sortedhash(records) do
- local p=platforms[platform]
- local e=encodings[p]
- local sp=supported[platform]
- local ps=p or "?"
- if trace_cmap then
- if sp then
- report(" platform %i: %s",platform,ps)
- else
- report(" platform %i: %s (unsupported)",platform,ps)
- end
- end
- for encoding,subtables in sortedhash(record) do
- local se=sp and sp[encoding]
- local es=e and e[encoding] or "?"
- if trace_cmap then
- if se then
- report(" encoding %i: %s",encoding,es)
- else
- report(" encoding %i: %s (unsupported)",encoding,es)
- end
- end
- local offsets=subtables.offsets
- local formats=subtables.formats
- for i=1,#offsets do
- local offset=tableoffset+offsets[i]
- setposition(f,offset)
- formats[readushort(f)]=offset
- end
- record[encoding]=formats
- if trace_cmap then
- local list=sortedkeys(formats)
- for i=1,#list do
- if not (se and se[list[i]]) then
- list[i]=list[i].." (unsupported)"
- end
- end
- report(" formats: % t",list)
- end
- end
- end
- local ok=false
- for i=1,#sequence do
- local si=sequence[i]
- local sp,se,sf=si[1],si[2],si[3]
- if checkcmap(f,fontdata,records,sp,se,sf)>0 then
- ok=true
- end
- end
- if not ok then
- report("no useable unicode cmap found")
- end
- fontdata.cidmaps={
- version=version,
- noftables=noftables,
- records=records,
- }
- else
- fontdata.cidmaps={}
- end
-end
-function readers.loca(f,fontdata,specification)
- reportskippedtable(f,fontdata,"loca",specification.glyphs)
-end
-function readers.glyf(f,fontdata,specification)
- reportskippedtable(f,fontdata,"glyf",specification.glyphs)
-end
-function readers.colr(f,fontdata,specification)
- reportskippedtable(f,fontdata,"colr",specification.glyphs)
-end
-function readers.cpal(f,fontdata,specification)
- reportskippedtable(f,fontdata,"cpal",specification.glyphs)
-end
-function readers.svg(f,fontdata,specification)
- reportskippedtable(f,fontdata,"svg",specification.glyphs)
-end
-function readers.sbix(f,fontdata,specification)
- reportskippedtable(f,fontdata,"sbix",specification.glyphs)
-end
-function readers.cbdt(f,fontdata,specification)
- reportskippedtable(f,fontdata,"cbdt",specification.glyphs)
-end
-function readers.cblc(f,fontdata,specification)
- reportskippedtable(f,fontdata,"cblc",specification.glyphs)
-end
-function readers.ebdt(f,fontdata,specification)
- reportskippedtable(f,fontdata,"ebdt",specification.glyphs)
-end
-function readers.ebsc(f,fontdata,specification)
- reportskippedtable(f,fontdata,"ebsc",specification.glyphs)
-end
-function readers.eblc(f,fontdata,specification)
- reportskippedtable(f,fontdata,"eblc",specification.glyphs)
-end
-function readers.kern(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"kern",specification.kerns)
- if tableoffset then
- local version=readushort(f)
- local noftables=readushort(f)
- for i=1,noftables do
- local version=readushort(f)
- local length=readushort(f)
- local coverage=readushort(f)
- local format=rshift(coverage,8)
- if format==0 then
- local nofpairs=readushort(f)
- local searchrange=readushort(f)
- local entryselector=readushort(f)
- local rangeshift=readushort(f)
- local kerns={}
- local glyphs=fontdata.glyphs
- for i=1,nofpairs do
- local left=readushort(f)
- local right=readushort(f)
- local kern=readfword(f)
- local glyph=glyphs[left]
- local kerns=glyph.kerns
- if kerns then
- kerns[right]=kern
- else
- glyph.kerns={ [right]=kern }
- end
- end
- elseif format==2 then
- report("todo: kern classes")
- else
- report("todo: kerns")
- end
- end
- end
-end
-function readers.gdef(f,fontdata,specification)
- reportskippedtable(f,fontdata,"gdef",specification.details)
-end
-function readers.gsub(f,fontdata,specification)
- reportskippedtable(f,fontdata,"gsub",specification.details)
-end
-function readers.gpos(f,fontdata,specification)
- reportskippedtable(f,fontdata,"gpos",specification.details)
-end
-function readers.math(f,fontdata,specification)
- reportskippedtable(f,fontdata,"math",specification.details)
-end
-local function getinfo(maindata,sub,platformnames,rawfamilynames,metricstoo,instancenames)
- local fontdata=sub and maindata.subfonts and maindata.subfonts[sub] or maindata
- local names=fontdata.names
- local info=nil
- if names then
- local metrics=fontdata.windowsmetrics or {}
- local postscript=fontdata.postscript or {}
- local fontheader=fontdata.fontheader or {}
- local cffinfo=fontdata.cffinfo or {}
- local verticalheader=fontdata.verticalheader or {}
- local filename=fontdata.filename
- local weight=getname(fontdata,"weight") or (cffinfo and cffinfo.weight) or (metrics and metrics.weight)
- local width=getname(fontdata,"width") or (cffinfo and cffinfo.width ) or (metrics and metrics.width )
- local fontname=getname(fontdata,"postscriptname")
- local fullname=getname(fontdata,"fullname")
- local family=getname(fontdata,"family")
- local subfamily=getname(fontdata,"subfamily")
- local familyname=getname(fontdata,"typographicfamily")
- local subfamilyname=getname(fontdata,"typographicsubfamily")
- local compatiblename=getname(fontdata,"compatiblefullname")
- if rawfamilynames then
- else
- if not familyname then familyname=family end
- if not subfamilyname then subfamilyname=subfamily end
- end
- if platformnames then
- platformnames=fontdata.platformnames
- end
- if instancenames then
- local variabledata=fontdata.variabledata
- if variabledata then
- local instances=variabledata and variabledata.instances
- if instances then
- instancenames={}
- for i=1,#instances do
- instancenames[i]=lower(stripstring(instances[i].subfamily))
- end
- else
- instancenames=nil
- end
- else
- instancenames=nil
- end
- end
- info={
- subfontindex=fontdata.subfontindex or sub or 0,
- version=getname(fontdata,"version"),
- fontname=fontname,
- fullname=fullname,
- family=family,
- subfamily=subfamily,
- familyname=familyname,
- subfamilyname=subfamilyname,
- compatiblename=compatiblename,
- weight=weight and lower(weight),
- width=width and lower(width),
- pfmweight=metrics.weightclass or 400,
- pfmwidth=metrics.widthclass or 5,
- panosewidth=metrics.panosewidth,
- panoseweight=metrics.panoseweight,
- italicangle=postscript.italicangle or 0,
- units=fontheader.units or 0,
- designsize=fontdata.designsize,
- minsize=fontdata.minsize,
- maxsize=fontdata.maxsize,
- boundingbox=fontheader and { fontheader.xmin or 0,fontheader.ymin or 0,fontheader.xmax or 0,fontheader.ymax or 0 } or nil,
- monospaced=(tonumber(postscript.monospaced or 0)>0) or metrics.panosewidth=="monospaced",
- averagewidth=metrics.averagewidth,
- xheight=metrics.xheight,
- capheight=metrics.capheight or fontdata.maxy,
- ascender=metrics.typoascender,
- descender=metrics.typodescender,
- platformnames=platformnames or nil,
- instancenames=instancenames or nil,
- tableoffsets=fontdata.tableoffsets,
- defaultvheight=(verticalheader.ascender or 0)-(verticalheader.descender or 0)
- }
- if metricstoo then
- local keys={
- "version",
- "ascender","descender","linegap",
- "maxadvancewidth","maxadvanceheight","maxextent",
- "minbottomsidebearing","mintopsidebearing",
- }
- local h=fontdata.horizontalheader or {}
- local v=fontdata.verticalheader or {}
- if h then
- local th={}
- local tv={}
- for i=1,#keys do
- local key=keys[i]
- th[key]=h[key] or 0
- tv[key]=v[key] or 0
- end
- info.horizontalmetrics=th
- info.verticalmetrics=tv
- end
- end
- elseif n then
- info={
- filename=fontdata.filename,
- comment="there is no info for subfont "..n,
- }
- else
- info={
- filename=fontdata.filename,
- comment="there is no info",
- }
- end
- return info
-end
-local function loadtables(f,specification,offset)
- if offset then
- setposition(f,offset)
- end
- local tables={}
- local basename=file.basename(specification.filename)
- local filesize=specification.filesize
- local filetime=specification.filetime
- local fontdata={
- filename=basename,
- filesize=filesize,
- filetime=filetime,
- version=readstring(f,4),
- noftables=readushort(f),
- searchrange=readushort(f),
- entryselector=readushort(f),
- rangeshift=readushort(f),
- tables=tables,
- foundtables=false,
- }
- for i=1,fontdata.noftables do
- local tag=lower(stripstring(readstring(f,4)))
- local checksum=readushort(f)*0x10000+readushort(f)
- local offset=readulong(f)
- local length=readulong(f)
- if offset+length>filesize then
- report("bad %a table in file %a",tag,basename)
- end
- tables[tag]={
- checksum=checksum,
- offset=offset,
- length=length,
- }
- end
- fontdata.foundtables=sortedkeys(tables)
- if tables.cff or tables.cff2 then
- fontdata.format="opentype"
- else
- fontdata.format="truetype"
- end
- return fontdata,tables
-end
-local function prepareglyps(fontdata)
- local glyphs=setmetatableindex(function(t,k)
- local v={
- index=k,
- }
- t[k]=v
- return v
- end)
- fontdata.glyphs=glyphs
- fontdata.mapping={}
-end
-local function readtable(tag,f,fontdata,specification,...)
- local reader=readers[tag]
- if reader then
- reader(f,fontdata,specification,...)
- end
-end
-local variablefonts_supported=(context and true) or (logs and logs.application and true) or false
-local function readdata(f,offset,specification)
- local fontdata,tables=loadtables(f,specification,offset)
- if specification.glyphs then
- prepareglyps(fontdata)
- end
- if not variablefonts_supported then
- specification.instance=nil
- specification.variable=nil
- specification.factors=nil
- end
- fontdata.temporary={}
- readtable("name",f,fontdata,specification)
- local askedname=specification.askedname
- if askedname then
- local fullname=getname(fontdata,"fullname") or ""
- local cleanname=gsub(askedname,"[^a-zA-Z0-9]","")
- local foundname=gsub(fullname,"[^a-zA-Z0-9]","")
- if lower(cleanname)~=lower(foundname) then
- return
- end
- end
- readtable("stat",f,fontdata,specification)
- readtable("avar",f,fontdata,specification)
- readtable("fvar",f,fontdata,specification)
- if variablefonts_supported then
- local variabledata=fontdata.variabledata
- if variabledata then
- local instances=variabledata.instances
- local axis=variabledata.axis
- if axis and (not instances or #instances==0) then
- instances={}
- variabledata.instances=instances
- local function add(n,subfamily,value)
- local values={}
- for i=1,#axis do
- local a=axis[i]
- values[i]={
- axis=a.tag,
- value=i==n and value or a.default,
- }
- end
- instances[#instances+1]={
- subfamily=subfamily,
- values=values,
- }
- end
- for i=1,#axis do
- local a=axis[i]
- local tag=a.tag
- add(i,"default"..tag,a.default)
- add(i,"minimum"..tag,a.minimum)
- add(i,"maximum"..tag,a.maximum)
- end
- end
- end
- if not specification.factors then
- local instance=specification.instance
- if type(instance)=="string" then
- local factors=helpers.getfactors(fontdata,instance)
- if factors then
- specification.factors=factors
- fontdata.factors=factors
- fontdata.instance=instance
- report("user instance: %s, factors: % t",instance,factors)
- else
- report("user instance: %s, bad factors",instance)
- end
- end
- end
- if not fontdata.factors then
- if fontdata.variabledata then
- local factors=helpers.getfactors(fontdata,true)
- if factors then
- specification.factors=factors
- fontdata.factors=factors
- end
- else
- end
- end
- end
- readtable("os/2",f,fontdata,specification)
- readtable("head",f,fontdata,specification)
- readtable("maxp",f,fontdata,specification)
- readtable("hhea",f,fontdata,specification)
- readtable("vhea",f,fontdata,specification)
- readtable("hmtx",f,fontdata,specification)
- readtable("vmtx",f,fontdata,specification)
- readtable("vorg",f,fontdata,specification)
- readtable("post",f,fontdata,specification)
- readtable("mvar",f,fontdata,specification)
- readtable("hvar",f,fontdata,specification)
- readtable("vvar",f,fontdata,specification)
- readtable("gdef",f,fontdata,specification)
- readtable("cff",f,fontdata,specification)
- readtable("cff2",f,fontdata,specification)
- readtable("cmap",f,fontdata,specification)
- readtable("loca",f,fontdata,specification)
- readtable("glyf",f,fontdata,specification)
- readtable("colr",f,fontdata,specification)
- readtable("cpal",f,fontdata,specification)
- readtable("svg",f,fontdata,specification)
- readtable("sbix",f,fontdata,specification)
- readtable("cbdt",f,fontdata,specification)
- readtable("cblc",f,fontdata,specification)
- readtable("ebdt",f,fontdata,specification)
- readtable("eblc",f,fontdata,specification)
- readtable("kern",f,fontdata,specification)
- readtable("gsub",f,fontdata,specification)
- readtable("gpos",f,fontdata,specification)
- readtable("math",f,fontdata,specification)
- fontdata.locations=nil
- fontdata.cidmaps=nil
- fontdata.dictionaries=nil
- if specification.tableoffsets then
- fontdata.tableoffsets=tables
- setmetatableindex(tables,{
- version=fontdata.version,
- noftables=fontdata.noftables,
- searchrange=fontdata.searchrange,
- entryselector=fontdata.entryselector,
- rangeshift=fontdata.rangeshift,
- })
- end
- return fontdata
-end
-local function loadfontdata(specification)
- local filename=specification.filename
- local fileattr=lfs.attributes(filename)
- local filesize=fileattr and fileattr.size or 0
- local filetime=fileattr and fileattr.modification or 0
- local f=openfile(filename,true)
- if not f then
- report("unable to open %a",filename)
- elseif filesize==0 then
- report("empty file %a",filename)
- closefile(f)
- else
- specification.filesize=filesize
- specification.filetime=filetime
- local version=readstring(f,4)
- local fontdata=nil
- if version=="OTTO" or version=="true" or version=="\0\1\0\0" then
- fontdata=readdata(f,0,specification)
- elseif version=="ttcf" then
- local subfont=tonumber(specification.subfont)
- local ttcversion=readulong(f)
- local nofsubfonts=readulong(f)
- local offsets=readcardinaltable(f,nofsubfonts,ulong)
- if subfont then
- if subfont>=1 and subfont<=nofsubfonts then
- fontdata=readdata(f,offsets[subfont],specification)
- else
- report("no subfont %a in file %a",subfont,filename)
- end
- else
- subfont=specification.subfont
- if type(subfont)=="string" and subfont~="" then
- specification.askedname=subfont
- for i=1,nofsubfonts do
- fontdata=readdata(f,offsets[i],specification)
- if fontdata then
- fontdata.subfontindex=i
- report("subfont named %a has index %a",subfont,i)
- break
- end
- end
- if not fontdata then
- report("no subfont named %a",subfont)
- end
- else
- local subfonts={}
- fontdata={
- filename=filename,
- filesize=filesize,
- filetime=filetime,
- version=version,
- subfonts=subfonts,
- ttcversion=ttcversion,
- nofsubfonts=nofsubfonts,
- }
- for i=1,nofsubfonts do
- subfonts[i]=readdata(f,offsets[i],specification)
- end
- end
- end
- else
- report("unknown version %a in file %a",version,filename)
- end
- closefile(f)
- return fontdata or {}
- end
-end
-local function loadfont(specification,n,instance)
- if type(specification)=="string" then
- specification={
- filename=specification,
- info=true,
- details=true,
- glyphs=true,
- shapes=true,
- kerns=true,
- variable=true,
- globalkerns=true,
- lookups=true,
- subfont=n or true,
- tounicode=false,
- instance=instance
- }
- end
- if specification.shapes or specification.lookups or specification.kerns then
- specification.glyphs=true
- end
- if specification.glyphs then
- specification.details=true
- end
- if specification.details then
- specification.info=true
- end
- if specification.platformnames then
- specification.platformnames=true
- end
- if specification.instance or instance then
- specification.variable=true
- specification.instance=specification.instance or instance
- end
- local function message(str)
- report("fatal error in file %a: %s\n%s",specification.filename,str,debug and debug.traceback())
- end
- local ok,result=xpcall(loadfontdata,message,specification)
- if ok then
- return result
- end
-end
-function readers.loadshapes(filename,n,instance,streams)
- local fontdata=loadfont {
- filename=filename,
- shapes=true,
- streams=streams,
- variable=true,
- subfont=n,
- instance=instance,
- }
- if fontdata then
- for k,v in next,fontdata.glyphs do
- v.class=nil
- v.index=nil
- v.math=nil
- end
- local names=fontdata.names
- if names then
- for k,v in next,names do
- names[k]=fullstrip(v.content)
- end
- end
- end
- return fontdata and {
- filename=filename,
- format=fontdata.format,
- glyphs=fontdata.glyphs,
- units=fontdata.fontheader.units,
- cffinfo=fontdata.cffinfo,
- fontheader=fontdata.fontheader,
- horizontalheader=fontdata.horizontalheader,
- verticalheader=fontdata.verticalheader,
- maximumprofile=fontdata.maximumprofile,
- names=fontdata.names,
- postscript=fontdata.postscript,
- } or {
- filename=filename,
- format="unknown",
- glyphs={},
- units=0,
- }
-end
-function readers.loadfont(filename,n,instance)
- local fontdata=loadfont {
- filename=filename,
- glyphs=true,
- shapes=false,
- lookups=true,
- variable=true,
- subfont=n,
- instance=instance,
- }
- if fontdata then
- return {
- tableversion=tableversion,
- creator="context mkiv",
- size=fontdata.filesize,
- time=fontdata.filetime,
- glyphs=fontdata.glyphs,
- descriptions=fontdata.descriptions,
- format=fontdata.format,
- goodies={},
- metadata=getinfo(fontdata,n,false,false,true,true),
- properties={
- hasitalics=fontdata.hasitalics or false,
- maxcolorclass=fontdata.maxcolorclass,
- hascolor=fontdata.hascolor or false,
- instance=fontdata.instance,
- factors=fontdata.factors,
- },
- resources={
- filename=filename,
- private=privateoffset,
- duplicates=fontdata.duplicates or {},
- features=fontdata.features or {},
- sublookups=fontdata.sublookups or {},
- marks=fontdata.marks or {},
- markclasses=fontdata.markclasses or {},
- marksets=fontdata.marksets or {},
- sequences=fontdata.sequences or {},
- variants=fontdata.variants,
- version=getname(fontdata,"version"),
- cidinfo=fontdata.cidinfo,
- mathconstants=fontdata.mathconstants,
- colorpalettes=fontdata.colorpalettes,
- svgshapes=fontdata.svgshapes,
- pngshapes=fontdata.pngshapes,
- variabledata=fontdata.variabledata,
- foundtables=fontdata.foundtables,
- },
- }
- end
-end
-function readers.getinfo(filename,specification)
- local subfont=nil
- local platformnames=false
- local rawfamilynames=false
- local instancenames=true
- local tableoffsets=false
- if type(specification)=="table" then
- subfont=tonumber(specification.subfont)
- platformnames=specification.platformnames
- rawfamilynames=specification.rawfamilynames
- tableoffsets=specification.tableoffsets
- else
- subfont=tonumber(specification)
- end
- local fontdata=loadfont {
- filename=filename,
- details=true,
- platformnames=platformnames,
- instancenames=true,
- tableoffsets=tableoffsets,
- }
- if fontdata then
- local subfonts=fontdata.subfonts
- if not subfonts then
- return getinfo(fontdata,nil,platformnames,rawfamilynames,false,instancenames)
- elseif not subfont then
- local info={}
- for i=1,#subfonts do
- info[i]=getinfo(fontdata,i,platformnames,rawfamilynames,false,instancenames)
- end
- return info
- elseif subfont>=1 and subfont<=#subfonts then
- return getinfo(fontdata,subfont,platformnames,rawfamilynames,false,instancenames)
- else
- return {
- filename=filename,
- comment="there is no subfont "..subfont.." in this file"
- }
- end
- else
- return {
- filename=filename,
- comment="the file cannot be opened for reading",
- }
- end
-end
-function readers.rehash(fontdata,hashmethod)
- report("the %a helper is not yet implemented","rehash")
-end
-function readers.checkhash(fontdata)
- report("the %a helper is not yet implemented","checkhash")
-end
-function readers.pack(fontdata,hashmethod)
- report("the %a helper is not yet implemented","pack")
-end
-function readers.unpack(fontdata)
- report("the %a helper is not yet implemented","unpack")
-end
-function readers.expand(fontdata)
- report("the %a helper is not yet implemented","unpack")
-end
-function readers.compact(fontdata)
- report("the %a helper is not yet implemented","compact")
-end
-local extenders={}
-function readers.registerextender(extender)
- extenders[#extenders+1]=extender
-end
-function readers.extend(fontdata)
- for i=1,#extenders do
- local extender=extenders[i]
- local name=extender.name or "unknown"
- local action=extender.action
- if action then
- action(fontdata)
- end
- end
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-otr”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-oti” dbae7722baae24d917a17176553825cf] ---
-
-if not modules then modules={} end modules ['font-oti']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local lower=string.lower
-local fonts=fonts
-local constructors=fonts.constructors
-local otf=constructors.handlers.otf
-local otffeatures=constructors.features.otf
-local registerotffeature=otffeatures.register
-local otftables=otf.tables or {}
-otf.tables=otftables
-local allocate=utilities.storage.allocate
-registerotffeature {
- name="features",
- description="initialization of feature handler",
- default=true,
-}
-local function setmode(tfmdata,value)
- if value then
- tfmdata.properties.mode=lower(value)
- end
-end
-otf.modeinitializer=setmode
-local function setlanguage(tfmdata,value)
- if value then
- local cleanvalue=lower(value)
- local languages=otftables and otftables.languages
- local properties=tfmdata.properties
- if not languages then
- properties.language=cleanvalue
- elseif languages[value] then
- properties.language=cleanvalue
- else
- properties.language="dflt"
- end
- end
-end
-local function setscript(tfmdata,value)
- if value then
- local cleanvalue=lower(value)
- local scripts=otftables and otftables.scripts
- local properties=tfmdata.properties
- if not scripts then
- properties.script=cleanvalue
- elseif scripts[value] then
- properties.script=cleanvalue
- else
- properties.script="dflt"
- end
- end
-end
-registerotffeature {
- name="mode",
- description="mode",
- initializers={
- base=setmode,
- node=setmode,
- plug=setmode,
- }
-}
-registerotffeature {
- name="language",
- description="language",
- initializers={
- base=setlanguage,
- node=setlanguage,
- plug=setlanguage,
- }
-}
-registerotffeature {
- name="script",
- description="script",
- initializers={
- base=setscript,
- node=setscript,
- plug=setscript,
- }
-}
-otftables.featuretypes=allocate {
- gpos_single="position",
- gpos_pair="position",
- gpos_cursive="position",
- gpos_mark2base="position",
- gpos_mark2ligature="position",
- gpos_mark2mark="position",
- gpos_context="position",
- gpos_contextchain="position",
- gsub_single="substitution",
- gsub_multiple="substitution",
- gsub_alternate="substitution",
- gsub_ligature="substitution",
- gsub_context="substitution",
- gsub_contextchain="substitution",
- gsub_reversecontextchain="substitution",
- gsub_reversesub="substitution",
-}
-function otffeatures.checkeddefaultscript(featuretype,autoscript,scripts)
- if featuretype=="position" then
- local default=scripts.dflt
- if default then
- if autoscript=="position" or autoscript==true then
- return default
- else
- report_otf("script feature %s not applied, enable default positioning")
- end
- else
- end
- elseif featuretype=="substitution" then
- local default=scripts.dflt
- if default then
- if autoscript=="substitution" or autoscript==true then
- return default
- end
- end
- end
-end
-function otffeatures.checkeddefaultlanguage(featuretype,autolanguage,languages)
- if featuretype=="position" then
- local default=languages.dflt
- if default then
- if autolanguage=="position" or autolanguage==true then
- return default
- else
- report_otf("language feature %s not applied, enable default positioning")
- end
- else
- end
- elseif featuretype=="substitution" then
- local default=languages.dflt
- if default then
- if autolanguage=="substitution" or autolanguage==true then
- return default
- end
- end
- end
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-oti”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-ott” aba6d8335a5f38a5a62d3631492f3392] ---
-
-if not modules then modules={} end modules ["font-ott"]={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files",
-}
-local type,next,tonumber,tostring,rawget,rawset=type,next,tonumber,tostring,rawget,rawset
-local gsub,lower,format,match,gmatch,find=string.gsub,string.lower,string.format,string.match,string.gmatch,string.find
-local sequenced=table.sequenced
-local is_boolean=string.is_boolean
-local setmetatableindex=table.setmetatableindex
-local setmetatablenewindex=table.setmetatablenewindex
-local allocate=utilities.storage.allocate
-local fonts=fonts
-local otf=fonts.handlers.otf
-local otffeatures=otf.features
-local tables=otf.tables or {}
-otf.tables=tables
-local statistics=otf.statistics or {}
-otf.statistics=statistics
-local scripts=allocate {
- ["adlm"]="adlam",
- ["aghb"]="caucasian albanian",
- ["ahom"]="ahom",
- ["arab"]="arabic",
- ["armi"]="imperial aramaic",
- ["armn"]="armenian",
- ["avst"]="avestan",
- ["bali"]="balinese",
- ["bamu"]="bamum",
- ["bass"]="bassa vah",
- ["batk"]="batak",
- ["beng"]="bengali",
- ["bhks"]="bhaiksuki",
- ["bng2"]="bengali variant 2",
- ["bopo"]="bopomofo",
- ["brah"]="brahmi",
- ["brai"]="braille",
- ["bugi"]="buginese",
- ["buhd"]="buhid",
- ["byzm"]="byzantine music",
- ["cakm"]="chakma",
- ["cans"]="canadian syllabics",
- ["cari"]="carian",
- ["cham"]="cham",
- ["cher"]="cherokee",
- ["copt"]="coptic",
- ["cprt"]="cypriot syllabary",
- ["cyrl"]="cyrillic",
- ["dev2"]="devanagari variant 2",
- ["deva"]="devanagari",
- ["dogr"]="dogra",
- ["dsrt"]="deseret",
- ["dupl"]="duployan",
- ["egyp"]="egyptian heiroglyphs",
- ["elba"]="elbasan",
- ["ethi"]="ethiopic",
- ["geor"]="georgian",
- ["gjr2"]="gujarati variant 2",
- ["glag"]="glagolitic",
- ["gong"]="gunjala gondi",
- ["gonm"]="masaram gondi",
- ["goth"]="gothic",
- ["gran"]="grantha",
- ["grek"]="greek",
- ["gujr"]="gujarati",
- ["gur2"]="gurmukhi variant 2",
- ["guru"]="gurmukhi",
- ["hang"]="hangul",
- ["hani"]="cjk ideographic",
- ["hano"]="hanunoo",
- ["hatr"]="hatran",
- ["hebr"]="hebrew",
- ["hluw"]="anatolian hieroglyphs",
- ["hmng"]="pahawh hmong",
- ["hung"]="old hungarian",
- ["ital"]="old italic",
- ["jamo"]="hangul jamo",
- ["java"]="javanese",
- ["kali"]="kayah li",
- ["kana"]="hiragana and katakana",
- ["khar"]="kharosthi",
- ["khmr"]="khmer",
- ["khoj"]="khojki",
- ["knd2"]="kannada variant 2",
- ["knda"]="kannada",
- ["kthi"]="kaithi",
- ["lana"]="tai tham",
- ["lao" ]="lao",
- ["latn"]="latin",
- ["lepc"]="lepcha",
- ["limb"]="limbu",
- ["lina"]="linear a",
- ["linb"]="linear b",
- ["lisu"]="lisu",
- ["lyci"]="lycian",
- ["lydi"]="lydian",
- ["mahj"]="mahajani",
- ["maka"]="makasar",
- ["mand"]="mandaic and mandaean",
- ["mani"]="manichaean",
- ["marc"]="marchen",
- ["math"]="mathematical alphanumeric symbols",
- ["medf"]="medefaidrin",
- ["mend"]="mende kikakui",
- ["merc"]="meroitic cursive",
- ["mero"]="meroitic hieroglyphs",
- ["mlm2"]="malayalam variant 2",
- ["mlym"]="malayalam",
- ["modi"]="modi",
- ["mong"]="mongolian",
- ["mroo"]="mro",
- ["mtei"]="meitei Mayek",
- ["mult"]="multani",
- ["musc"]="musical symbols",
- ["mym2"]="myanmar variant 2",
- ["mymr"]="myanmar",
- ["narb"]="old north arabian",
- ["nbat"]="nabataean",
- ["newa"]="newa",
- ["nko" ]='n"ko',
- ["nshu"]="nüshu",
- ["ogam"]="ogham",
- ["olck"]="ol chiki",
- ["orkh"]="old turkic and orkhon runic",
- ["ory2"]="odia variant 2",
- ["orya"]="oriya",
- ["osge"]="osage",
- ["osma"]="osmanya",
- ["palm"]="palmyrene",
- ["pauc"]="pau cin hau",
- ["perm"]="old permic",
- ["phag"]="phags-pa",
- ["phli"]="inscriptional pahlavi",
- ["phlp"]="psalter pahlavi",
- ["phnx"]="phoenician",
- ["plrd"]="miao",
- ["prti"]="inscriptional parthian",
- ["rjng"]="rejang",
- ["rohg"]="hanifi rohingya",
- ["runr"]="runic",
- ["samr"]="samaritan",
- ["sarb"]="old south arabian",
- ["saur"]="saurashtra",
- ["sgnw"]="sign writing",
- ["shaw"]="shavian",
- ["shrd"]="sharada",
- ["sidd"]="siddham",
- ["sind"]="khudawadi",
- ["sinh"]="sinhala",
- ["sogd"]="sogdian",
- ["sogo"]="old sogdian",
- ["sora"]="sora sompeng",
- ["soyo"]="soyombo",
- ["sund"]="sundanese",
- ["sylo"]="syloti nagri",
- ["syrc"]="syriac",
- ["tagb"]="tagbanwa",
- ["takr"]="takri",
- ["tale"]="tai le",
- ["talu"]="tai lu",
- ["taml"]="tamil",
- ["tang"]="tangut",
- ["tavt"]="tai viet",
- ["tel2"]="telugu variant 2",
- ["telu"]="telugu",
- ["tfng"]="tifinagh",
- ["tglg"]="tagalog",
- ["thaa"]="thaana",
- ["thai"]="thai",
- ["tibt"]="tibetan",
- ["tirh"]="tirhuta",
- ["tml2"]="tamil variant 2",
- ["ugar"]="ugaritic cuneiform",
- ["vai" ]="vai",
- ["wara"]="warang citi",
- ["xpeo"]="old persian cuneiform",
- ["xsux"]="sumero-akkadian cuneiform",
- ["yi" ]="yi",
- ["zanb"]="zanabazar square",
-}
-local languages=allocate {
- ["aba" ]="abaza",
- ["abk" ]="abkhazian",
- ["ach" ]="acholi",
- ["acr" ]="achi",
- ["ady" ]="adyghe",
- ["afk" ]="afrikaans",
- ["afr" ]="afar",
- ["agw" ]="agaw",
- ["aio" ]="aiton",
- ["aka" ]="akan",
- ["als" ]="alsatian",
- ["alt" ]="altai",
- ["amh" ]="amharic",
- ["ang" ]="anglo-saxon",
- ["apph"]="phonetic transcription—americanist conventions",
- ["ara" ]="arabic",
- ["arg" ]="aragonese",
- ["ari" ]="aari",
- ["ark" ]="rakhine",
- ["asm" ]="assamese",
- ["ast" ]="asturian",
- ["ath" ]="athapaskan",
- ["avr" ]="avar",
- ["awa" ]="awadhi",
- ["aym" ]="aymara",
- ["azb" ]="torki",
- ["aze" ]="azerbaijani",
- ["bad" ]="badaga",
- ["bad0"]="banda",
- ["bag" ]="baghelkhandi",
- ["bal" ]="balkar",
- ["ban" ]="balinese",
- ["bar" ]="bavarian",
- ["bau" ]="baulé",
- ["bbc" ]="batak toba",
- ["bbr" ]="berber",
- ["bch" ]="bench",
- ["bcr" ]="bible cree",
- ["bdy" ]="bandjalang",
- ["bel" ]="belarussian",
- ["bem" ]="bemba",
- ["ben" ]="bengali",
- ["bgc" ]="haryanvi",
- ["bgq" ]="bagri",
- ["bgr" ]="bulgarian",
- ["bhi" ]="bhili",
- ["bho" ]="bhojpuri",
- ["bik" ]="bikol",
- ["bil" ]="bilen",
- ["bis" ]="bislama",
- ["bjj" ]="kanauji",
- ["bkf" ]="blackfoot",
- ["bli" ]="baluchi",
- ["blk" ]="pa'o karen",
- ["bln" ]="balante",
- ["blt" ]="balti",
- ["bmb" ]="bambara (bamanankan)",
- ["bml" ]="bamileke",
- ["bos" ]="bosnian",
- ["bpy" ]="bishnupriya manipuri",
- ["bre" ]="breton",
- ["brh" ]="brahui",
- ["bri" ]="braj bhasha",
- ["brm" ]="burmese",
- ["brx" ]="bodo",
- ["bsh" ]="bashkir",
- ["bsk" ]="burushaski",
- ["bti" ]="beti",
- ["bts" ]="batak simalungun",
- ["bug" ]="bugis",
- ["byv" ]="medumba",
- ["cak" ]="kaqchikel",
- ["cat" ]="catalan",
- ["cbk" ]="zamboanga chavacano",
- ["cchn"]="chinantec",
- ["ceb" ]="cebuano",
- ["cgg" ]="chiga",
- ["cha" ]="chamorro",
- ["che" ]="chechen",
- ["chg" ]="chaha gurage",
- ["chh" ]="chattisgarhi",
- ["chi" ]="chichewa (chewa, nyanja)",
- ["chk" ]="chukchi",
- ["chk0"]="chuukese",
- ["cho" ]="choctaw",
- ["chp" ]="chipewyan",
- ["chr" ]="cherokee",
- ["chu" ]="chuvash",
- ["chy" ]="cheyenne",
- ["cja" ]="western cham",
- ["cjm" ]="eastern cham",
- ["cmr" ]="comorian",
- ["cop" ]="coptic",
- ["cor" ]="cornish",
- ["cos" ]="corsican",
- ["cpp" ]="creoles",
- ["cre" ]="cree",
- ["crr" ]="carrier",
- ["crt" ]="crimean tatar",
- ["csb" ]="kashubian",
- ["csl" ]="church slavonic",
- ["csy" ]="czech",
- ["ctg" ]="chittagonian",
- ["cuk" ]="san blas kuna",
- ["dan" ]="danish",
- ["dar" ]="dargwa",
- ["dax" ]="dayi",
- ["dcr" ]="woods cree",
- ["deu" ]="german",
- ["dgo" ]="dogri",
- ["dgr" ]="dogri",
- ["dhg" ]="dhangu",
- ["dhv" ]="divehi (dhivehi, maldivian)",
- ["diq" ]="dimli",
- ["div" ]="divehi (dhivehi, maldivian)",
- ["djr" ]="zarma",
- ["djr0"]="djambarrpuyngu",
- ["dng" ]="dangme",
- ["dnj" ]="dan",
- ["dnk" ]="dinka",
- ["dri" ]="dari",
- ["duj" ]="dhuwal",
- ["dun" ]="dungan",
- ["dzn" ]="dzongkha",
- ["ebi" ]="ebira",
- ["ecr" ]="eastern cree",
- ["edo" ]="edo",
- ["efi" ]="efik",
- ["ell" ]="greek",
- ["emk" ]="eastern maninkakan",
- ["eng" ]="english",
- ["erz" ]="erzya",
- ["esp" ]="spanish",
- ["esu" ]="central yupik",
- ["eti" ]="estonian",
- ["euq" ]="basque",
- ["evk" ]="evenki",
- ["evn" ]="even",
- ["ewe" ]="ewe",
- ["fan" ]="french antillean",
- ["fan0"]=" fang",
- ["far" ]="persian",
- ["fat" ]="fanti",
- ["fin" ]="finnish",
- ["fji" ]="fijian",
- ["fle" ]="dutch (flemish)",
- ["fmp" ]="fe’fe’",
- ["fne" ]="forest nenets",
- ["fon" ]="fon",
- ["fos" ]="faroese",
- ["fra" ]="french",
- ["frc" ]="cajun french",
- ["fri" ]="frisian",
- ["frl" ]="friulian",
- ["frp" ]="arpitan",
- ["fta" ]="futa",
- ["ful" ]="fulah",
- ["fuv" ]="nigerian fulfulde",
- ["gad" ]="ga",
- ["gae" ]="scottish gaelic (gaelic)",
- ["gag" ]="gagauz",
- ["gal" ]="galician",
- ["gar" ]="garshuni",
- ["gaw" ]="garhwali",
- ["gez" ]="ge'ez",
- ["gih" ]="githabul",
- ["gil" ]="gilyak",
- ["gil0"]="kiribati (gilbertese)",
- ["gkp" ]="kpelle (guinea)",
- ["glk" ]="gilaki",
- ["gmz" ]="gumuz",
- ["gnn" ]="gumatj",
- ["gog" ]="gogo",
- ["gon" ]="gondi",
- ["grn" ]="greenlandic",
- ["gro" ]="garo",
- ["gua" ]="guarani",
- ["guc" ]="wayuu",
- ["guf" ]="gupapuyngu",
- ["guj" ]="gujarati",
- ["guz" ]="gusii",
- ["hai" ]="haitian (haitian creole)",
- ["hal" ]="halam",
- ["har" ]="harauti",
- ["hau" ]="hausa",
- ["haw" ]="hawaiian",
- ["hay" ]="haya",
- ["haz" ]="hazaragi",
- ["hbn" ]="hammer-banna",
- ["her" ]="herero",
- ["hil" ]="hiligaynon",
- ["hin" ]="hindi",
- ["hma" ]="high mari",
- ["hmn" ]="hmong",
- ["hmo" ]="hiri motu",
- ["hnd" ]="hindko",
- ["ho" ]="ho",
- ["hri" ]="harari",
- ["hrv" ]="croatian",
- ["hun" ]="hungarian",
- ["hye" ]="armenian",
- ["hye0"]="armenian east",
- ["iba" ]="iban",
- ["ibb" ]="ibibio",
- ["ibo" ]="igbo",
- ["ido" ]="ido",
- ["ijo" ]="ijo languages",
- ["ile" ]="interlingue",
- ["ilo" ]="ilokano",
- ["ina" ]="interlingua",
- ["ind" ]="indonesian",
- ["ing" ]="ingush",
- ["inu" ]="inuktitut",
- ["ipk" ]="inupiat",
- ["ipph"]="phonetic transcription—ipa conventions",
- ["iri" ]="irish",
- ["irt" ]="irish traditional",
- ["isl" ]="icelandic",
- ["ism" ]="inari sami",
- ["ita" ]="italian",
- ["iwr" ]="hebrew",
- ["jam" ]="jamaican creole",
- ["jan" ]="japanese",
- ["jav" ]="javanese",
- ["jbo" ]="lojban",
- ["jct" ]="krymchak",
- ["jii" ]="yiddish",
- ["jud" ]="ladino",
- ["jul" ]="jula",
- ["kab" ]="kabardian",
- ["kab0"]="kabyle",
- ["kac" ]="kachchi",
- ["kal" ]="kalenjin",
- ["kan" ]="kannada",
- ["kar" ]="karachay",
- ["kat" ]="georgian",
- ["kaz" ]="kazakh",
- ["kde" ]="makonde",
- ["kea" ]="kabuverdianu (crioulo)",
- ["keb" ]="kebena",
- ["kek" ]="kekchi",
- ["kge" ]="khutsuri georgian",
- ["kha" ]="khakass",
- ["khk" ]="khanty-kazim",
- ["khm" ]="khmer",
- ["khs" ]="khanty-shurishkar",
- ["kht" ]="khamti shan",
- ["khv" ]="khanty-vakhi",
- ["khw" ]="khowar",
- ["kik" ]="kikuyu (gikuyu)",
- ["kir" ]="kirghiz (kyrgyz)",
- ["kis" ]="kisii",
- ["kiu" ]="kirmanjki",
- ["kjd" ]="southern kiwai",
- ["kjp" ]="eastern pwo karen",
- ["kjz" ]="bumthangkha",
- ["kkn" ]="kokni",
- ["klm" ]="kalmyk",
- ["kmb" ]="kamba",
- ["kmn" ]="kumaoni",
- ["kmo" ]="komo",
- ["kms" ]="komso",
- ["kmz" ]="khorasani turkic",
- ["knr" ]="kanuri",
- ["kod" ]="kodagu",
- ["koh" ]="korean old hangul",
- ["kok" ]="konkani",
- ["kom" ]="komi",
- ["kon" ]="kikongo",
- ["kon0"]="kongo",
- ["kop" ]="komi-permyak",
- ["kor" ]="korean",
- ["kos" ]="kosraean",
- ["koz" ]="komi-zyrian",
- ["kpl" ]="kpelle",
- ["kri" ]="krio",
- ["krk" ]="karakalpak",
- ["krl" ]="karelian",
- ["krm" ]="karaim",
- ["krn" ]="karen",
- ["krt" ]="koorete",
- ["ksh" ]="kashmiri",
- ["ksh0"]="ripuarian",
- ["ksi" ]="khasi",
- ["ksm" ]="kildin sami",
- ["ksw" ]="s’gaw karen",
- ["kua" ]="kuanyama",
- ["kui" ]="kui",
- ["kul" ]="kulvi",
- ["kum" ]="kumyk",
- ["kur" ]="kurdish",
- ["kuu" ]="kurukh",
- ["kuy" ]="kuy",
- ["kyk" ]="koryak",
- ["kyu" ]="western kayah",
- ["lad" ]="ladin",
- ["lah" ]="lahuli",
- ["lak" ]="lak",
- ["lam" ]="lambani",
- ["lao" ]="lao",
- ["lat" ]="latin",
- ["laz" ]="laz",
- ["lcr" ]="l-cree",
- ["ldk" ]="ladakhi",
- ["lez" ]="lezgi",
- ["lij" ]="ligurian",
- ["lim" ]="limburgish",
- ["lin" ]="lingala",
- ["lis" ]="lisu",
- ["ljp" ]="lampung",
- ["lki" ]="laki",
- ["lma" ]="low mari",
- ["lmb" ]="limbu",
- ["lmo" ]="lombard",
- ["lmw" ]="lomwe",
- ["lom" ]="loma",
- ["lrc" ]="luri",
- ["lsb" ]="lower sorbian",
- ["lsm" ]="lule sami",
- ["lth" ]="lithuanian",
- ["ltz" ]="luxembourgish",
- ["lua" ]="luba-lulua",
- ["lub" ]="luba-katanga",
- ["lug" ]="ganda",
- ["luh" ]="luyia",
- ["luo" ]="luo",
- ["lvi" ]="latvian",
- ["mad" ]="madura",
- ["mag" ]="magahi",
- ["mah" ]="marshallese",
- ["maj" ]="majang",
- ["mak" ]="makhuwa",
- ["mal" ]="malayalam reformed",
- ["mam" ]="mam",
- ["man" ]="mansi",
- ["map" ]="mapudungun",
- ["mar" ]="marathi",
- ["maw" ]="marwari",
- ["mbn" ]="mbundu",
- ["mbo" ]="mbo",
- ["mch" ]="manchu",
- ["mcr" ]="moose cree",
- ["mde" ]="mende",
- ["mdr" ]="mandar",
- ["men" ]="me'en",
- ["mer" ]="meru",
- ["mfa" ]="pattani malay",
- ["mfe" ]="morisyen",
- ["min" ]="minangkabau",
- ["miz" ]="mizo",
- ["mkd" ]="macedonian",
- ["mkr" ]="makasar",
- ["mkw" ]="kituba",
- ["mle" ]="male",
- ["mlg" ]="malagasy",
- ["mln" ]="malinke",
- ["mlr" ]="malayalam reformed",
- ["mly" ]="malay",
- ["mnd" ]="mandinka",
- ["mng" ]="mongolian",
- ["mni" ]="manipuri",
- ["mnk" ]="maninka",
- ["mnx" ]="manx",
- ["moh" ]="mohawk",
- ["mok" ]="moksha",
- ["mol" ]="moldavian",
- ["mon" ]="mon",
- ["mor" ]="moroccan",
- ["mos" ]="mossi",
- ["mri" ]="maori",
- ["mth" ]="maithili",
- ["mts" ]="maltese",
- ["mun" ]="mundari",
- ["mus" ]="muscogee",
- ["mwl" ]="mirandese",
- ["mww" ]="hmong daw",
- ["myn" ]="mayan",
- ["mzn" ]="mazanderani",
- ["nag" ]="naga-assamese",
- ["nah" ]="nahuatl",
- ["nan" ]="nanai",
- ["nap" ]="neapolitan",
- ["nas" ]="naskapi",
- ["nau" ]="nauruan",
- ["nav" ]="navajo",
- ["ncr" ]="n-cree",
- ["ndb" ]="ndebele",
- ["ndc" ]="ndau",
- ["ndg" ]="ndonga",
- ["nds" ]="low saxon",
- ["nep" ]="nepali",
- ["new" ]="newari",
- ["nga" ]="ngbaka",
- ["ngr" ]="nagari",
- ["nhc" ]="norway house cree",
- ["nis" ]="nisi",
- ["niu" ]="niuean",
- ["nkl" ]="nyankole",
- ["nko" ]="n'ko",
- ["nld" ]="dutch",
- ["noe" ]="nimadi",
- ["nog" ]="nogai",
- ["nor" ]="norwegian",
- ["nov" ]="novial",
- ["nsm" ]="northern sami",
- ["nso" ]="sotho, northern",
- ["nta" ]="northern tai",
- ["nto" ]="esperanto",
- ["nym" ]="nyamwezi",
- ["nyn" ]="norwegian nynorsk",
- ["nza" ]="mbembe tigon",
- ["oci" ]="occitan",
- ["ocr" ]="oji-cree",
- ["ojb" ]="ojibway",
- ["ori" ]="odia",
- ["oro" ]="oromo",
- ["oss" ]="ossetian",
- ["paa" ]="palestinian aramaic",
- ["pag" ]="pangasinan",
- ["pal" ]="pali",
- ["pam" ]="pampangan",
- ["pan" ]="punjabi",
- ["pap" ]="palpa",
- ["pap0"]="papiamentu",
- ["pas" ]="pashto",
- ["pau" ]="palauan",
- ["pcc" ]="bouyei",
- ["pcd" ]="picard",
- ["pdc" ]="pennsylvania german",
- ["pgr" ]="polytonic greek",
- ["phk" ]="phake",
- ["pih" ]="norfolk",
- ["pil" ]="filipino",
- ["plg" ]="palaung",
- ["plk" ]="polish",
- ["pms" ]="piemontese",
- ["pnb" ]="western panjabi",
- ["poh" ]="pocomchi",
- ["pon" ]="pohnpeian",
- ["pro" ]="provencal",
- ["ptg" ]="portuguese",
- ["pwo" ]="western pwo karen",
- ["qin" ]="chin",
- ["quc" ]="k’iche’",
- ["quh" ]="quechua (bolivia)",
- ["quz" ]="quechua",
- ["qvi" ]="quechua (ecuador)",
- ["qwh" ]="quechua (peru)",
- ["raj" ]="rajasthani",
- ["rar" ]="rarotongan",
- ["rbu" ]="russian buriat",
- ["rcr" ]="r-cree",
- ["rej" ]="rejang",
- ["ria" ]="riang",
- ["rif" ]="tarifit",
- ["rit" ]="ritarungo",
- ["rkw" ]="arakwal",
- ["rms" ]="romansh",
- ["rmy" ]="vlax romani",
- ["rom" ]="romanian",
- ["roy" ]="romany",
- ["rsy" ]="rusyn",
- ["rtm" ]="rotuman",
- ["rua" ]="kinyarwanda",
- ["run" ]="rundi",
- ["rup" ]="aromanian",
- ["rus" ]="russian",
- ["sad" ]="sadri",
- ["san" ]="sanskrit",
- ["sas" ]="sasak",
- ["sat" ]="santali",
- ["say" ]="sayisi",
- ["scn" ]="sicilian",
- ["sco" ]="scots",
- ["scs" ]="north slavey",
- ["sek" ]="sekota",
- ["sel" ]="selkup",
- ["sga" ]="old irish",
- ["sgo" ]="sango",
- ["sgs" ]="samogitian",
- ["shi" ]="tachelhit",
- ["shn" ]="shan",
- ["sib" ]="sibe",
- ["sid" ]="sidamo",
- ["sig" ]="silte gurage",
- ["sks" ]="skolt sami",
- ["sky" ]="slovak",
- ["sla" ]="slavey",
- ["slv" ]="slovenian",
- ["sml" ]="somali",
- ["smo" ]="samoan",
- ["sna" ]="sena",
- ["sna0"]="shona",
- ["snd" ]="sindhi",
- ["snh" ]="sinhala (sinhalese)",
- ["snk" ]="soninke",
- ["sog" ]="sodo gurage",
- ["sop" ]="songe",
- ["sot" ]="sotho, southern",
- ["sqi" ]="albanian",
- ["srb" ]="serbian",
- ["srd" ]="sardinian",
- ["srk" ]="saraiki",
- ["srr" ]="serer",
- ["ssl" ]="south slavey",
- ["ssm" ]="southern sami",
- ["stq" ]="saterland frisian",
- ["suk" ]="sukuma",
- ["sun" ]="sundanese",
- ["sur" ]="suri",
- ["sva" ]="svan",
- ["sve" ]="swedish",
- ["swa" ]="swadaya aramaic",
- ["swk" ]="swahili",
- ["swz" ]="swati",
- ["sxt" ]="sutu",
- ["sxu" ]="upper saxon",
- ["syl" ]="sylheti",
- ["syr" ]="syriac",
- ["syre"]="estrangela syriac",
- ["syrj"]="western syriac",
- ["syrn"]="eastern syriac",
- ["szl" ]="silesian",
- ["tab" ]="tabasaran",
- ["taj" ]="tajiki",
- ["tam" ]="tamil",
- ["tat" ]="tatar",
- ["tcr" ]="th-cree",
- ["tdd" ]="dehong dai",
- ["tel" ]="telugu",
- ["tet" ]="tetum",
- ["tgl" ]="tagalog",
- ["tgn" ]="tongan",
- ["tgr" ]="tigre",
- ["tgy" ]="tigrinya",
- ["tha" ]="thai",
- ["tht" ]="tahitian",
- ["tib" ]="tibetan",
- ["tiv" ]="tiv",
- ["tkm" ]="turkmen",
- ["tmh" ]="tamashek",
- ["tmn" ]="temne",
- ["tna" ]="tswana",
- ["tne" ]="tundra nenets",
- ["tng" ]="tonga",
- ["tod" ]="todo",
- ["tod0"]="toma",
- ["tpi" ]="tok pisin",
- ["trk" ]="turkish",
- ["tsg" ]="tsonga",
- ["tsj" ]="tshangla",
- ["tua" ]="turoyo aramaic",
- ["tul" ]="tulu",
- ["tum" ]="tulu",
- ["tuv" ]="tuvin",
- ["tvl" ]="tuvalu",
- ["twi" ]="twi",
- ["tyz" ]="tày",
- ["tzm" ]="tamazight",
- ["tzo" ]="tzotzil",
- ["udm" ]="udmurt",
- ["ukr" ]="ukrainian",
- ["umb" ]="umbundu",
- ["urd" ]="urdu",
- ["usb" ]="upper sorbian",
- ["uyg" ]="uyghur",
- ["uzb" ]="uzbek",
- ["vec" ]="venetian",
- ["ven" ]="venda",
- ["vit" ]="vietnamese",
- ["vol" ]="volapük",
- ["vro" ]="võro",
- ["wa" ]="wa",
- ["wag" ]="wagdi",
- ["war" ]="waray-waray",
- ["wcr" ]="west-cree",
- ["wel" ]="welsh",
- ["wlf" ]="wolof",
- ["wln" ]="walloon",
- ["wtm" ]="mewati",
- ["xbd" ]="lü",
- ["xhs" ]="xhosa",
- ["xjb" ]="minjangbal",
- ["xkf" ]="khengkha",
- ["xog" ]="soga",
- ["xpe" ]="kpelle (liberia)",
- ["yak" ]="sakha",
- ["yao" ]="yao",
- ["yap" ]="yapese",
- ["yba" ]="yoruba",
- ["ycr" ]="y-cree",
- ["yic" ]="yi classic",
- ["yim" ]="yi modern",
- ["zea" ]="zealandic",
- ["zgh" ]="standard morrocan tamazigh",
- ["zha" ]="zhuang",
- ["zhh" ]="chinese, hong kong sar",
- ["zhp" ]="chinese phonetic",
- ["zhs" ]="chinese simplified",
- ["zht" ]="chinese traditional",
- ["znd" ]="zande",
- ["zul" ]="zulu",
- ["zza" ]="zazaki",
-}
-local features=allocate {
- ["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",
- ["cfar"]="conjunct form after ro",
- ["cjct"]="conjunct forms",
- ["clig"]="contextual ligatures",
- ["cpct"]="centered cjk punctuation",
- ["cpsp"]="capital spacing",
- ["cswh"]="contextual swash",
- ["curs"]="cursive positioning",
- ["dflt"]="default processing",
- ["dist"]="distances",
- ["dlig"]="discretionary ligatures",
- ["dnom"]="denominators",
- ["dtls"]="dotless forms",
- ["expt"]="expert forms",
- ["falt"]="final glyph alternates",
- ["fin2"]="terminal forms #2",
- ["fin3"]="terminal forms #3",
- ["fina"]="terminal forms",
- ["flac"]="flattened accents over capitals",
- ["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",
- ["ltra"]="left-to-right alternates",
- ["ltrm"]="left-to-right mirrored 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",
- ["pkna"]="proportional kana",
- ["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",
- ["rclt"]="required contextual alternates",
- ["rkrf"]="rakar forms",
- ["rlig"]="required ligatures",
- ["rphf"]="reph form",
- ["rtbd"]="right bounds",
- ["rtla"]="right-to-left alternates",
- ["rtlm"]="right to left mirrored forms",
- ["rvrn"]="required variation alternates",
- ["ruby"]="ruby notation forms",
- ["salt"]="stylistic alternates",
- ["sinf"]="scientific inferiors",
- ["size"]="optical size",
- ["smcp"]="small capitals",
- ["smpl"]="simplified forms",
- ["ssty"]="script style",
- ["stch"]="stretching glyph decomposition",
- ["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",
- ["vrtr"]="vertical alternates for rotation",
- ["vrt2"]="vertical rotation",
- ["zero"]="slashed zero",
- ["trep"]="traditional tex replacements",
- ["tlig"]="traditional tex ligatures",
- ["ss.."]="stylistic set ..",
- ["cv.."]="character variant ..",
- ["js.."]="justification ..",
- ["dv.."]="devanagari ..",
- ["ml.."]="malayalam ..",
-}
-local baselines=allocate {
- ["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"]="mathematical centered baseline",
- ["romn"]="roman baseline"
-}
-tables.scripts=scripts
-tables.languages=languages
-tables.features=features
-tables.baselines=baselines
-local acceptscripts=true directives.register("otf.acceptscripts",function(v) acceptscripts=v end)
-local acceptlanguages=true directives.register("otf.acceptlanguages",function(v) acceptlanguages=v end)
-local report_checks=logs.reporter("fonts","checks")
-if otffeatures.features then
- for k,v in next,otffeatures.features do
- features[k]=v
- end
- otffeatures.features=features
-end
-local function swapped(h)
- local r={}
- for k,v in next,h do
- r[gsub(v,"[^a-z0-9]","")]=k
- end
- return r
-end
-local verbosescripts=allocate(swapped(scripts ))
-local verboselanguages=allocate(swapped(languages))
-local verbosefeatures=allocate(swapped(features ))
-local verbosebaselines=allocate(swapped(baselines))
-local function resolve(t,k)
- if k then
- k=gsub(lower(k),"[^a-z0-9]","")
- local v=rawget(t,k)
- if v then
- return v
- end
- end
-end
-setmetatableindex(verbosescripts,resolve)
-setmetatableindex(verboselanguages,resolve)
-setmetatableindex(verbosefeatures,resolve)
-setmetatableindex(verbosebaselines,resolve)
-setmetatableindex(scripts,function(t,k)
- if k then
- k=lower(k)
- if k=="dflt" then
- return k
- end
- local v=rawget(t,k)
- if v then
- return v
- end
- k=gsub(k," ","")
- v=rawget(t,v)
- if v then
- return v
- elseif acceptscripts then
- report_checks("registering extra script %a",k)
- rawset(t,k,k)
- return k
- end
- end
- return "dflt"
-end)
-setmetatableindex(languages,function(t,k)
- if k then
- k=lower(k)
- if k=="dflt" then
- return k
- end
- local v=rawget(t,k)
- if v then
- return v
- end
- k=gsub(k," ","")
- v=rawget(t,v)
- if v then
- return v
- elseif acceptlanguages then
- report_checks("registering extra language %a",k)
- rawset(t,k,k)
- return k
- end
- end
- return "dflt"
-end)
-if setmetatablenewindex then
- setmetatablenewindex(languages,"ignore")
- setmetatablenewindex(scripts,"ignore")
- setmetatablenewindex(baselines,"ignore")
-end
-local function resolve(t,k)
- if k then
- k=lower(k)
- local v=rawget(t,k)
- if v then
- return v
- end
- k=gsub(k," ","")
- local v=rawget(t,k)
- if v then
- return v
- end
- local tag,dd=match(k,"(..)(%d+)")
- if tag and dd then
- local v=rawget(t,tag)
- if v then
- return v
- else
- local v=rawget(t,tag.."..")
- if v then
- return (gsub(v,"%.%.",tonumber(dd)))
- end
- end
- end
- end
- return k
-end
-setmetatableindex(features,resolve)
-local function assign(t,k,v)
- if k and v then
- v=lower(v)
- rawset(t,k,v)
- end
-end
-if setmetatablenewindex then
- setmetatablenewindex(features,assign)
-end
-local checkers={
- rand=function(v)
- return v==true and "random" or v
- end
-}
-if not storage then
- return
-end
-local usedfeatures=statistics.usedfeatures or {}
-statistics.usedfeatures=usedfeatures
-table.setmetatableindex(usedfeatures,function(t,k) if k then local v={} t[k]=v return v end end)
-storage.register("fonts/otf/usedfeatures",usedfeatures,"fonts.handlers.otf.statistics.usedfeatures" )
-local normalizedaxis=otf.readers.helpers.normalizedaxis or function(s) return s end
-function otffeatures.normalize(features,wrap)
- if features then
- local h={}
- for key,value in next,features do
- local k=lower(key)
- if k=="language" then
- local v=gsub(lower(value),"[^a-z0-9]","")
- h.language=rawget(verboselanguages,v) or (languages[v] and v) or "dflt"
- elseif k=="script" then
- local v=gsub(lower(value),"[^a-z0-9]","")
- h.script=rawget(verbosescripts,v) or (scripts[v] and v) or "dflt"
- elseif k=="axis" then
- h[k]=normalizedaxis(value)
- if not callbacks.supported.glyph_stream_provider then
- h.variableshapes=true
- end
- else
- local uk=usedfeatures[key]
- local uv=uk[value]
- if uv then
- else
- uv=tonumber(value)
- if uv then
- elseif type(value)=="string" then
- local b=is_boolean(value)
- if type(b)=="nil" then
- if wrap and find(value,",") then
- uv="{"..lower(value).."}"
- else
- uv=lower(value)
- end
- else
- uv=b
- end
- elseif type(value)=="table" then
- uv=sequenced(t,",")
- else
- uv=value
- end
- if not rawget(features,k) then
- k=rawget(verbosefeatures,k) or k
- end
- local c=checkers[k]
- if c then
- uv=c(uv) or vc
- end
- uk[value]=uv
- end
- h[k]=uv
- end
- end
- return h
- end
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-ott”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-cff” c769020b41b39418f703347f3d328bc7] ---
-
-if not modules then modules={} end modules ['font-cff']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local next,type,tonumber,rawget=next,type,tonumber,rawget
-local byte,char,gmatch,sub=string.byte,string.char,string.gmatch,string.sub
-local concat,remove,unpack=table.concat,table.remove,table.unpack
-local floor,abs,round,ceil,min,max=math.floor,math.abs,math.round,math.ceil,math.min,math.max
-local P,C,R,S,C,Cs,Ct=lpeg.P,lpeg.C,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Ct
-local lpegmatch=lpeg.match
-local formatters=string.formatters
-local bytetable=string.bytetable
-local idiv=number.idiv
-local rshift,band,extract=bit32.rshift,bit32.band,bit32.extract
-local readers=fonts.handlers.otf.readers
-local streamreader=readers.streamreader
-local readstring=streamreader.readstring
-local readbyte=streamreader.readcardinal1
-local readushort=streamreader.readcardinal2
-local readuint=streamreader.readcardinal3
-local readulong=streamreader.readcardinal4
-local setposition=streamreader.setposition
-local getposition=streamreader.getposition
-local readbytetable=streamreader.readbytetable
-directives.register("fonts.streamreader",function()
- streamreader=utilities.streams
- readstring=streamreader.readstring
- readbyte=streamreader.readcardinal1
- readushort=streamreader.readcardinal2
- readuint=streamreader.readcardinal3
- readulong=streamreader.readcardinal4
- setposition=streamreader.setposition
- getposition=streamreader.getposition
- readbytetable=streamreader.readbytetable
-end)
-local setmetatableindex=table.setmetatableindex
-local trace_charstrings=false trackers.register("fonts.cff.charstrings",function(v) trace_charstrings=v end)
-local report=logs.reporter("otf reader","cff")
-local parsedictionaries
-local parsecharstring
-local parsecharstrings
-local resetcharstrings
-local parseprivates
-local startparsing
-local stopparsing
-local defaultstrings={ [0]=
- ".notdef","space","exclam","quotedbl","numbersign","dollar","percent",
- "ampersand","quoteright","parenleft","parenright","asterisk","plus",
- "comma","hyphen","period","slash","zero","one","two","three","four",
- "five","six","seven","eight","nine","colon","semicolon","less",
- "equal","greater","question","at","A","B","C","D","E","F","G","H",
- "I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W",
- "X","Y","Z","bracketleft","backslash","bracketright","asciicircum",
- "underscore","quoteleft","a","b","c","d","e","f","g","h","i","j",
- "k","l","m","n","o","p","q","r","s","t","u","v","w","x","y",
- "z","braceleft","bar","braceright","asciitilde","exclamdown","cent",
- "sterling","fraction","yen","florin","section","currency",
- "quotesingle","quotedblleft","guillemotleft","guilsinglleft",
- "guilsinglright","fi","fl","endash","dagger","daggerdbl",
- "periodcentered","paragraph","bullet","quotesinglbase","quotedblbase",
- "quotedblright","guillemotright","ellipsis","perthousand","questiondown",
- "grave","acute","circumflex","tilde","macron","breve","dotaccent",
- "dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash",
- "AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae",
- "dotlessi","lslash","oslash","oe","germandbls","onesuperior",
- "logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn",
- "onequarter","divide","brokenbar","degree","thorn","threequarters",
- "twosuperior","registered","minus","eth","multiply","threesuperior",
- "copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring",
- "Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave",
- "Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute",
- "Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute",
- "Ucircumflex","Udieresis","Ugrave","Yacute","Ydieresis","Zcaron",
- "aacute","acircumflex","adieresis","agrave","aring","atilde",
- "ccedilla","eacute","ecircumflex","edieresis","egrave","iacute",
- "icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex",
- "odieresis","ograve","otilde","scaron","uacute","ucircumflex",
- "udieresis","ugrave","yacute","ydieresis","zcaron","exclamsmall",
- "Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall",
- "Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader",
- "onedotenleader","zerooldstyle","oneoldstyle","twooldstyle",
- "threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle",
- "sevenoldstyle","eightoldstyle","nineoldstyle","commasuperior",
- "threequartersemdash","periodsuperior","questionsmall","asuperior",
- "bsuperior","centsuperior","dsuperior","esuperior","isuperior",
- "lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior",
- "tsuperior","ff","ffi","ffl","parenleftinferior","parenrightinferior",
- "Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall",
- "Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall",
- "Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall",
- "Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall",
- "Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah",
- "Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall",
- "Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall",
- "Dotaccentsmall","Macronsmall","figuredash","hypheninferior",
- "Ogoneksmall","Ringsmall","Cedillasmall","questiondownsmall","oneeighth",
- "threeeighths","fiveeighths","seveneighths","onethird","twothirds",
- "zerosuperior","foursuperior","fivesuperior","sixsuperior",
- "sevensuperior","eightsuperior","ninesuperior","zeroinferior",
- "oneinferior","twoinferior","threeinferior","fourinferior",
- "fiveinferior","sixinferior","seveninferior","eightinferior",
- "nineinferior","centinferior","dollarinferior","periodinferior",
- "commainferior","Agravesmall","Aacutesmall","Acircumflexsmall",
- "Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall",
- "Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall",
- "Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall",
- "Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall",
- "Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall",
- "Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall",
- "Thornsmall","Ydieresissmall","001.000","001.001","001.002","001.003",
- "Black","Bold","Book","Light","Medium","Regular","Roman","Semibold",
-}
-local standardnames={ [0]=
- false,false,false,false,false,false,false,false,false,false,false,
- false,false,false,false,false,false,false,false,false,false,false,
- false,false,false,false,false,false,false,false,false,false,
- "space","exclam","quotedbl","numbersign","dollar","percent",
- "ampersand","quoteright","parenleft","parenright","asterisk","plus",
- "comma","hyphen","period","slash","zero","one","two","three","four",
- "five","six","seven","eight","nine","colon","semicolon","less",
- "equal","greater","question","at","A","B","C","D","E","F","G","H",
- "I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W",
- "X","Y","Z","bracketleft","backslash","bracketright","asciicircum",
- "underscore","quoteleft","a","b","c","d","e","f","g","h","i","j",
- "k","l","m","n","o","p","q","r","s","t","u","v","w","x","y",
- "z","braceleft","bar","braceright","asciitilde",false,false,false,
- false,false,false,false,false,false,false,false,false,false,false,
- false,false,false,false,false,false,false,false,false,false,false,
- false,false,false,false,false,false,false,false,false,"exclamdown",
- "cent","sterling","fraction","yen","florin","section","currency",
- "quotesingle","quotedblleft","guillemotleft","guilsinglleft",
- "guilsinglright","fi","fl",false,"endash","dagger","daggerdbl",
- "periodcentered",false,"paragraph","bullet","quotesinglbase",
- "quotedblbase","quotedblright","guillemotright","ellipsis","perthousand",
- false,"questiondown",false,"grave","acute","circumflex","tilde",
- "macron","breve","dotaccent","dieresis",false,"ring","cedilla",false,
- "hungarumlaut","ogonek","caron","emdash",false,false,false,false,
- false,false,false,false,false,false,false,false,false,false,false,
- false,"AE",false,"ordfeminine",false,false,false,false,"Lslash",
- "Oslash","OE","ordmasculine",false,false,false,false,false,"ae",
- false,false,false,"dotlessi",false,false,"lslash","oslash","oe",
- "germandbls",false,false,false,false
-}
-local cffreaders={
- readbyte,
- readushort,
- readuint,
- readulong,
-}
-local function readheader(f)
- local offset=getposition(f)
- local major=readbyte(f)
- local header={
- offset=offset,
- major=major,
- minor=readbyte(f),
- size=readbyte(f),
- }
- if major==1 then
- header.dsize=readbyte(f)
- elseif major==2 then
- header.dsize=readushort(f)
- else
- end
- setposition(f,offset+header.size)
- return header
-end
-local function readlengths(f,longcount)
- local count=longcount and readulong(f) or readushort(f)
- if count==0 then
- return {}
- end
- local osize=readbyte(f)
- local read=cffreaders[osize]
- if not read then
- report("bad offset size: %i",osize)
- return {}
- end
- local lengths={}
- local previous=read(f)
- for i=1,count do
- local offset=read(f)
- local length=offset-previous
- if length<0 then
- report("bad offset: %i",length)
- length=0
- end
- lengths[i]=length
- previous=offset
- end
- return lengths
-end
-local function readfontnames(f)
- local names=readlengths(f)
- for i=1,#names do
- names[i]=readstring(f,names[i])
- end
- return names
-end
-local function readtopdictionaries(f)
- local dictionaries=readlengths(f)
- for i=1,#dictionaries do
- dictionaries[i]=readstring(f,dictionaries[i])
- end
- return dictionaries
-end
-local function readstrings(f)
- local lengths=readlengths(f)
- local strings=setmetatableindex({},defaultstrings)
- local index=#defaultstrings
- for i=1,#lengths do
- index=index+1
- strings[index]=readstring(f,lengths[i])
- end
- return strings
-end
-do
- local stack={}
- local top=0
- local result={}
- local strings={}
- local p_single=P("\00")/function()
- result.version=strings[stack[top]] or "unset"
- top=0
- end+P("\01")/function()
- result.notice=strings[stack[top]] or "unset"
- top=0
- end+P("\02")/function()
- result.fullname=strings[stack[top]] or "unset"
- top=0
- end+P("\03")/function()
- result.familyname=strings[stack[top]] or "unset"
- top=0
- end+P("\04")/function()
- result.weight=strings[stack[top]] or "unset"
- top=0
- end+P("\05")/function()
- result.fontbbox={ unpack(stack,1,4) }
- top=0
- end+P("\06")/function()
- result.bluevalues={ unpack(stack,1,top) }
- top=0
- end+P("\07")/function()
- result.otherblues={ unpack(stack,1,top) }
- top=0
- end+P("\08")/function()
- result.familyblues={ unpack(stack,1,top) }
- top=0
- end+P("\09")/function()
- result.familyotherblues={ unpack(stack,1,top) }
- top=0
- end+P("\10")/function()
- result.strhw=stack[top]
- top=0
- end+P("\11")/function()
- result.strvw=stack[top]
- top=0
- end+P("\13")/function()
- result.uniqueid=stack[top]
- top=0
- end+P("\14")/function()
- result.xuid=concat(stack,"",1,top)
- top=0
- end+P("\15")/function()
- result.charset=stack[top]
- top=0
- end+P("\16")/function()
- result.encoding=stack[top]
- top=0
- end+P("\17")/function()
- result.charstrings=stack[top]
- top=0
- end+P("\18")/function()
- result.private={
- size=stack[top-1],
- offset=stack[top],
- }
- top=0
- end+P("\19")/function()
- result.subroutines=stack[top]
- top=0
- end+P("\20")/function()
- result.defaultwidthx=stack[top]
- top=0
- end+P("\21")/function()
- result.nominalwidthx=stack[top]
- top=0
- end
-+P("\24")/function()
- result.vstore=stack[top]
- top=0
- end+P("\25")/function()
- result.maxstack=stack[top]
- top=0
- end
- local p_double=P("\12")*(
- P("\00")/function()
- result.copyright=stack[top]
- top=0
- end+P("\01")/function()
- result.monospaced=stack[top]==1 and true or false
- top=0
- end+P("\02")/function()
- result.italicangle=stack[top]
- top=0
- end+P("\03")/function()
- result.underlineposition=stack[top]
- top=0
- end+P("\04")/function()
- result.underlinethickness=stack[top]
- top=0
- end+P("\05")/function()
- result.painttype=stack[top]
- top=0
- end+P("\06")/function()
- result.charstringtype=stack[top]
- top=0
- end+P("\07")/function()
- result.fontmatrix={ unpack(stack,1,6) }
- top=0
- end+P("\08")/function()
- result.strokewidth=stack[top]
- top=0
- end+P("\09")/function()
- result.bluescale=stack[top]
- top=0
- end+P("\10")/function()
- result.bluesnap=stack[top]
- top=0
- end+P("\11")/function()
- result.bluefuzz=stack[top]
- top=0
- end+P("\12")/function()
- result.stemsnaph={ unpack(stack,1,top) }
- top=0
- end+P("\13")/function()
- result.stemsnapv={ unpack(stack,1,top) }
- top=0
- end+P("\20")/function()
- result.syntheticbase=stack[top]
- top=0
- end+P("\21")/function()
- result.postscript=strings[stack[top]] or "unset"
- top=0
- end+P("\22")/function()
- result.basefontname=strings[stack[top]] or "unset"
- top=0
- end+P("\21")/function()
- result.basefontblend=stack[top]
- top=0
- end+P("\30")/function()
- result.cid.registry=strings[stack[top-2]] or "unset"
- result.cid.ordering=strings[stack[top-1]] or "unset"
- result.cid.supplement=stack[top]
- top=0
- end+P("\31")/function()
- result.cid.fontversion=stack[top]
- top=0
- end+P("\32")/function()
- result.cid.fontrevision=stack[top]
- top=0
- end+P("\33")/function()
- result.cid.fonttype=stack[top]
- top=0
- end+P("\34")/function()
- result.cid.count=stack[top]
- top=0
- end+P("\35")/function()
- result.cid.uidbase=stack[top]
- top=0
- end+P("\36")/function()
- result.cid.fdarray=stack[top]
- top=0
- end+P("\37")/function()
- result.cid.fdselect=stack[top]
- top=0
- end+P("\38")/function()
- result.cid.fontname=strings[stack[top]] or "unset"
- top=0
- end
- )
- local remap={
- ["\x00"]="00",["\x01"]="01",["\x02"]="02",["\x03"]="03",["\x04"]="04",["\x05"]="05",["\x06"]="06",["\x07"]="07",["\x08"]="08",["\x09"]="09",["\x0A"]="0.",["\x0B"]="0E",["\x0C"]="0E-",["\x0D"]="0",["\x0E"]="0-",["\x0F"]="0",
- ["\x10"]="10",["\x11"]="11",["\x12"]="12",["\x13"]="13",["\x14"]="14",["\x15"]="15",["\x16"]="16",["\x17"]="17",["\x18"]="18",["\x19"]="19",["\x1A"]="1.",["\x1B"]="1E",["\x1C"]="1E-",["\x1D"]="1",["\x1E"]="1-",["\x1F"]="1",
- ["\x20"]="20",["\x21"]="21",["\x22"]="22",["\x23"]="23",["\x24"]="24",["\x25"]="25",["\x26"]="26",["\x27"]="27",["\x28"]="28",["\x29"]="29",["\x2A"]="2.",["\x2B"]="2E",["\x2C"]="2E-",["\x2D"]="2",["\x2E"]="2-",["\x2F"]="2",
- ["\x30"]="30",["\x31"]="31",["\x32"]="32",["\x33"]="33",["\x34"]="34",["\x35"]="35",["\x36"]="36",["\x37"]="37",["\x38"]="38",["\x39"]="39",["\x3A"]="3.",["\x3B"]="3E",["\x3C"]="3E-",["\x3D"]="3",["\x3E"]="3-",["\x3F"]="3",
- ["\x40"]="40",["\x41"]="41",["\x42"]="42",["\x43"]="43",["\x44"]="44",["\x45"]="45",["\x46"]="46",["\x47"]="47",["\x48"]="48",["\x49"]="49",["\x4A"]="4.",["\x4B"]="4E",["\x4C"]="4E-",["\x4D"]="4",["\x4E"]="4-",["\x4F"]="4",
- ["\x50"]="50",["\x51"]="51",["\x52"]="52",["\x53"]="53",["\x54"]="54",["\x55"]="55",["\x56"]="56",["\x57"]="57",["\x58"]="58",["\x59"]="59",["\x5A"]="5.",["\x5B"]="5E",["\x5C"]="5E-",["\x5D"]="5",["\x5E"]="5-",["\x5F"]="5",
- ["\x60"]="60",["\x61"]="61",["\x62"]="62",["\x63"]="63",["\x64"]="64",["\x65"]="65",["\x66"]="66",["\x67"]="67",["\x68"]="68",["\x69"]="69",["\x6A"]="6.",["\x6B"]="6E",["\x6C"]="6E-",["\x6D"]="6",["\x6E"]="6-",["\x6F"]="6",
- ["\x70"]="70",["\x71"]="71",["\x72"]="72",["\x73"]="73",["\x74"]="74",["\x75"]="75",["\x76"]="76",["\x77"]="77",["\x78"]="78",["\x79"]="79",["\x7A"]="7.",["\x7B"]="7E",["\x7C"]="7E-",["\x7D"]="7",["\x7E"]="7-",["\x7F"]="7",
- ["\x80"]="80",["\x81"]="81",["\x82"]="82",["\x83"]="83",["\x84"]="84",["\x85"]="85",["\x86"]="86",["\x87"]="87",["\x88"]="88",["\x89"]="89",["\x8A"]="8.",["\x8B"]="8E",["\x8C"]="8E-",["\x8D"]="8",["\x8E"]="8-",["\x8F"]="8",
- ["\x90"]="90",["\x91"]="91",["\x92"]="92",["\x93"]="93",["\x94"]="94",["\x95"]="95",["\x96"]="96",["\x97"]="97",["\x98"]="98",["\x99"]="99",["\x9A"]="9.",["\x9B"]="9E",["\x9C"]="9E-",["\x9D"]="9",["\x9E"]="9-",["\x9F"]="9",
- ["\xA0"]=".0",["\xA1"]=".1",["\xA2"]=".2",["\xA3"]=".3",["\xA4"]=".4",["\xA5"]=".5",["\xA6"]=".6",["\xA7"]=".7",["\xA8"]=".8",["\xA9"]=".9",["\xAA"]="..",["\xAB"]=".E",["\xAC"]=".E-",["\xAD"]=".",["\xAE"]=".-",["\xAF"]=".",
- ["\xB0"]="E0",["\xB1"]="E1",["\xB2"]="E2",["\xB3"]="E3",["\xB4"]="E4",["\xB5"]="E5",["\xB6"]="E6",["\xB7"]="E7",["\xB8"]="E8",["\xB9"]="E9",["\xBA"]="E.",["\xBB"]="EE",["\xBC"]="EE-",["\xBD"]="E",["\xBE"]="E-",["\xBF"]="E",
- ["\xC0"]="E-0",["\xC1"]="E-1",["\xC2"]="E-2",["\xC3"]="E-3",["\xC4"]="E-4",["\xC5"]="E-5",["\xC6"]="E-6",["\xC7"]="E-7",["\xC8"]="E-8",["\xC9"]="E-9",["\xCA"]="E-.",["\xCB"]="E-E",["\xCC"]="E-E-",["\xCD"]="E-",["\xCE"]="E--",["\xCF"]="E-",
- ["\xD0"]="-0",["\xD1"]="-1",["\xD2"]="-2",["\xD3"]="-3",["\xD4"]="-4",["\xD5"]="-5",["\xD6"]="-6",["\xD7"]="-7",["\xD8"]="-8",["\xD9"]="-9",["\xDA"]="-.",["\xDB"]="-E",["\xDC"]="-E-",["\xDD"]="-",["\xDE"]="--",["\xDF"]="-",
- }
- local p_last=S("\x0F\x1F\x2F\x3F\x4F\x5F\x6F\x7F\x8F\x9F\xAF\xBF")+R("\xF0\xFF")
- local p_nibbles=P("\30")*Cs(((1-p_last)/remap)^0*(P(1)/remap))/function(n)
- top=top+1
- stack[top]=tonumber(n) or 0
- end
- local p_byte=C(R("\32\246"))/function(b0)
- top=top+1
- stack[top]=byte(b0)-139
- end
- local p_positive=C(R("\247\250"))*C(1)/function(b0,b1)
- top=top+1
- stack[top]=(byte(b0)-247)*256+byte(b1)+108
- end
- local p_negative=C(R("\251\254"))*C(1)/function(b0,b1)
- top=top+1
- stack[top]=-(byte(b0)-251)*256-byte(b1)-108
- end
- local p_short=P("\28")*C(1)*C(1)/function(b1,b2)
- top=top+1
- local n=0x100*byte(b1)+byte(b2)
- if n>=0x8000 then
- stack[top]=n-0xFFFF-1
- else
- stack[top]=n
- end
- end
- local p_long=P("\29")*C(1)*C(1)*C(1)*C(1)/function(b1,b2,b3,b4)
- top=top+1
- local n=0x1000000*byte(b1)+0x10000*byte(b2)+0x100*byte(b3)+byte(b4)
- if n>=0x8000000 then
- stack[top]=n-0xFFFFFFFF-1
- else
- stack[top]=n
- end
- end
- local p_unsupported=P(1)/function(detail)
- top=0
- end
- local p_dictionary=(
- p_byte+p_positive+p_negative+p_short+p_long+p_nibbles+p_single+p_double+p_unsupported
- )^1
- parsedictionaries=function(data,dictionaries,what)
- stack={}
- strings=data.strings
- for i=1,#dictionaries do
- top=0
- result=what=="cff" and {
- monospaced=false,
- italicangle=0,
- underlineposition=-100,
- underlinethickness=50,
- painttype=0,
- charstringtype=2,
- fontmatrix={ 0.001,0,0,0.001,0,0 },
- fontbbox={ 0,0,0,0 },
- strokewidth=0,
- charset=0,
- encoding=0,
- cid={
- fontversion=0,
- fontrevision=0,
- fonttype=0,
- count=8720,
- }
- } or {
- charstringtype=2,
- charset=0,
- vstore=0,
- cid={
- },
- }
- lpegmatch(p_dictionary,dictionaries[i])
- dictionaries[i]=result
- end
- result={}
- top=0
- stack={}
- end
- parseprivates=function(data,dictionaries)
- stack={}
- strings=data.strings
- for i=1,#dictionaries do
- local private=dictionaries[i].private
- if private and private.data then
- top=0
- result={
- forcebold=false,
- languagegroup=0,
- expansionfactor=0.06,
- initialrandomseed=0,
- subroutines=0,
- defaultwidthx=0,
- nominalwidthx=0,
- cid={
- },
- }
- lpegmatch(p_dictionary,private.data)
- private.data=result
- end
- end
- result={}
- top=0
- stack={}
- end
- local x=0
- local y=0
- local width=false
- local lsb=0
- local r=0
- local stems=0
- local globalbias=0
- local localbias=0
- local nominalwidth=0
- local defaultwidth=0
- local charset=false
- local globals=false
- local locals=false
- local depth=1
- local xmin=0
- local xmax=0
- local ymin=0
- local ymax=0
- local checked=false
- local keepcurve=false
- local version=2
- local regions=false
- local nofregions=0
- local region=false
- local factors=false
- local axis=false
- local vsindex=0
- local justpass=false
- local seacs={}
- local procidx=nil
- local function showstate(where)
- report("%w%-10s : [%s] n=%i",depth*2,where,concat(stack," ",1,top),top)
- end
- local function showvalue(where,value,showstack)
- if showstack then
- report("%w%-10s : %s : [%s] n=%i",depth*2,where,tostring(value),concat(stack," ",1,top),top)
- else
- report("%w%-10s : %s",depth*2,where,tostring(value))
- end
- end
- local function xymoveto()
- if keepcurve then
- r=r+1
- result[r]={ x,y,"m" }
- end
- if checked then
- if x>xmax then xmax=x elseif xymax then ymax=y elseif yxmax then
- xmax=x
- elseif xymax then
- ymax=y
- elseif yxmax then xmax=x elseif xymax then ymax=y elseif yxmax then
- xmax=x
- elseif xymax then
- ymax=y
- elseif yxmax then xmax=x1 elseif x1ymax then ymax=y1 elseif y1xmax then xmax=x2 elseif x2ymax then ymax=y2 elseif y2xmax then xmax=x3 elseif x3ymax then ymax=y3 elseif y32 then
- width=stack[1]
- if trace_charstrings then
- showvalue("backtrack width",width)
- end
- else
- width=true
- end
- end
- if trace_charstrings then
- showstate("rmoveto")
- end
- x=x+stack[top-1]
- y=y+stack[top]
- top=0
- xymoveto()
- end
- local function hmoveto()
- if not width then
- if top>1 then
- width=stack[1]
- if trace_charstrings then
- showvalue("backtrack width",width)
- end
- else
- width=true
- end
- end
- if trace_charstrings then
- showstate("hmoveto")
- end
- x=x+stack[top]
- top=0
- xmoveto()
- end
- local function vmoveto()
- if not width then
- if top>1 then
- width=stack[1]
- if trace_charstrings then
- showvalue("backtrack width",width)
- end
- else
- width=true
- end
- end
- if trace_charstrings then
- showstate("vmoveto")
- end
- y=y+stack[top]
- top=0
- ymoveto()
- end
- local function rlineto()
- if trace_charstrings then
- showstate("rlineto")
- end
- for i=1,top,2 do
- x=x+stack[i]
- y=y+stack[i+1]
- xylineto()
- end
- top=0
- end
- local function hlineto()
- if trace_charstrings then
- showstate("hlineto")
- end
- if top==1 then
- x=x+stack[1]
- xlineto()
- else
- local swap=true
- for i=1,top do
- if swap then
- x=x+stack[i]
- xlineto()
- swap=false
- else
- y=y+stack[i]
- ylineto()
- swap=true
- end
- end
- end
- top=0
- end
- local function vlineto()
- if trace_charstrings then
- showstate("vlineto")
- end
- if top==1 then
- y=y+stack[1]
- ylineto()
- else
- local swap=false
- for i=1,top do
- if swap then
- x=x+stack[i]
- xlineto()
- swap=false
- else
- y=y+stack[i]
- ylineto()
- swap=true
- end
- end
- end
- top=0
- end
- local function rrcurveto()
- if trace_charstrings then
- showstate("rrcurveto")
- end
- for i=1,top,6 do
- local ax=x+stack[i]
- local ay=y+stack[i+1]
- local bx=ax+stack[i+2]
- local by=ay+stack[i+3]
- x=bx+stack[i+4]
- y=by+stack[i+5]
- xycurveto(ax,ay,bx,by,x,y)
- end
- top=0
- end
- local function hhcurveto()
- if trace_charstrings then
- showstate("hhcurveto")
- end
- local s=1
- if top%2~=0 then
- y=y+stack[1]
- s=2
- end
- for i=s,top,4 do
- local ax=x+stack[i]
- local ay=y
- local bx=ax+stack[i+1]
- local by=ay+stack[i+2]
- x=bx+stack[i+3]
- y=by
- xycurveto(ax,ay,bx,by,x,y)
- end
- top=0
- end
- local function vvcurveto()
- if trace_charstrings then
- showstate("vvcurveto")
- end
- local s=1
- local d=0
- if top%2~=0 then
- d=stack[1]
- s=2
- end
- for i=s,top,4 do
- local ax=x+d
- local ay=y+stack[i]
- local bx=ax+stack[i+1]
- local by=ay+stack[i+2]
- x=bx
- y=by+stack[i+3]
- xycurveto(ax,ay,bx,by,x,y)
- d=0
- end
- top=0
- end
- local function xxcurveto(swap)
- local last=top%4~=0 and stack[top]
- if last then
- top=top-1
- end
- for i=1,top,4 do
- local ax,ay,bx,by
- if swap then
- ax=x+stack[i]
- ay=y
- bx=ax+stack[i+1]
- by=ay+stack[i+2]
- y=by+stack[i+3]
- if last and i+3==top then
- x=bx+last
- else
- x=bx
- end
- swap=false
- else
- ax=x
- ay=y+stack[i]
- bx=ax+stack[i+1]
- by=ay+stack[i+2]
- x=bx+stack[i+3]
- if last and i+3==top then
- y=by+last
- else
- y=by
- end
- swap=true
- end
- xycurveto(ax,ay,bx,by,x,y)
- end
- top=0
- end
- local function hvcurveto()
- if trace_charstrings then
- showstate("hvcurveto")
- end
- xxcurveto(true)
- end
- local function vhcurveto()
- if trace_charstrings then
- showstate("vhcurveto")
- end
- xxcurveto(false)
- end
- local function rcurveline()
- if trace_charstrings then
- showstate("rcurveline")
- end
- for i=1,top-2,6 do
- local ax=x+stack[i]
- local ay=y+stack[i+1]
- local bx=ax+stack[i+2]
- local by=ay+stack[i+3]
- x=bx+stack[i+4]
- y=by+stack[i+5]
- xycurveto(ax,ay,bx,by,x,y)
- end
- x=x+stack[top-1]
- y=y+stack[top]
- xylineto()
- top=0
- end
- local function rlinecurve()
- if trace_charstrings then
- showstate("rlinecurve")
- end
- if top>6 then
- for i=1,top-6,2 do
- x=x+stack[i]
- y=y+stack[i+1]
- xylineto()
- end
- end
- local ax=x+stack[top-5]
- local ay=y+stack[top-4]
- local bx=ax+stack[top-3]
- local by=ay+stack[top-2]
- x=bx+stack[top-1]
- y=by+stack[top]
- xycurveto(ax,ay,bx,by,x,y)
- top=0
- end
- local function flex()
- if trace_charstrings then
- showstate("flex")
- end
- local ax=x+stack[1]
- local ay=y+stack[2]
- local bx=ax+stack[3]
- local by=ay+stack[4]
- local cx=bx+stack[5]
- local cy=by+stack[6]
- xycurveto(ax,ay,bx,by,cx,cy)
- local dx=cx+stack[7]
- local dy=cy+stack[8]
- local ex=dx+stack[9]
- local ey=dy+stack[10]
- x=ex+stack[11]
- y=ey+stack[12]
- xycurveto(dx,dy,ex,ey,x,y)
- top=0
- end
- local function hflex()
- if trace_charstrings then
- showstate("hflex")
- end
- local ax=x+stack[1]
- local ay=y
- local bx=ax+stack[2]
- local by=ay+stack[3]
- local cx=bx+stack[4]
- local cy=by
- xycurveto(ax,ay,bx,by,cx,cy)
- local dx=cx+stack[5]
- local dy=by
- local ex=dx+stack[6]
- local ey=y
- x=ex+stack[7]
- xycurveto(dx,dy,ex,ey,x,y)
- top=0
- end
- local function hflex1()
- if trace_charstrings then
- showstate("hflex1")
- end
- local ax=x+stack[1]
- local ay=y+stack[2]
- local bx=ax+stack[3]
- local by=ay+stack[4]
- local cx=bx+stack[5]
- local cy=by
- xycurveto(ax,ay,bx,by,cx,cy)
- local dx=cx+stack[6]
- local dy=by
- local ex=dx+stack[7]
- local ey=dy+stack[8]
- x=ex+stack[9]
- xycurveto(dx,dy,ex,ey,x,y)
- top=0
- end
- local function flex1()
- if trace_charstrings then
- showstate("flex1")
- end
- local ax=x+stack[1]
- local ay=y+stack[2]
- local bx=ax+stack[3]
- local by=ay+stack[4]
- local cx=bx+stack[5]
- local cy=by+stack[6]
- xycurveto(ax,ay,bx,by,cx,cy)
- local dx=cx+stack[7]
- local dy=cy+stack[8]
- local ex=dx+stack[9]
- local ey=dy+stack[10]
- if abs(ex-x)>abs(ey-y) then
- x=ex+stack[11]
- else
- y=ey+stack[11]
- end
- xycurveto(dx,dy,ex,ey,x,y)
- top=0
- end
- local function getstem()
- if top==0 then
- elseif top%2~=0 then
- if width then
- remove(stack,1)
- else
- width=remove(stack,1)
- if trace_charstrings then
- showvalue("width",width)
- end
- end
- top=top-1
- end
- if trace_charstrings then
- showstate("stem")
- end
- stems=stems+idiv(top,2)
- top=0
- end
- local function getmask()
- if top==0 then
- elseif top%2~=0 then
- if width then
- remove(stack,1)
- else
- width=remove(stack,1)
- if trace_charstrings then
- showvalue("width",width)
- end
- end
- top=top-1
- end
- if trace_charstrings then
- showstate(operator==19 and "hintmark" or "cntrmask")
- end
- stems=stems+idiv(top,2)
- top=0
- if stems==0 then
- elseif stems<=8 then
- return 1
- else
- return idiv(stems+7,8)
- end
- end
- local function unsupported(t)
- if trace_charstrings then
- showstate("unsupported "..t)
- end
- top=0
- end
- local function unsupportedsub(t)
- if trace_charstrings then
- showstate("unsupported sub "..t)
- end
- top=0
- end
- local function getstem3()
- if trace_charstrings then
- showstate("stem3")
- end
- top=0
- end
- local function divide()
- if version=="cff" then
- local d=stack[top]
- top=top-1
- stack[top]=stack[top]/d
- end
- end
- local function closepath()
- if version=="cff" then
- if trace_charstrings then
- showstate("closepath")
- end
- end
- top=0
- end
- local function hsbw()
- if version=="cff" then
- if trace_charstrings then
- showstate("hsbw")
- end
- lsb=stack[top-1] or 0
- width=stack[top]
- end
- top=0
- end
- local function sbw()
- if version=="cff" then
- if trace_charstrings then
- showstate("sbw")
- end
- lsb=stack[top-3]
- width=stack[top-1]
- end
- top=0
- end
- local function seac()
- if version=="cff" then
- if trace_charstrings then
- showstate("seac")
- end
- end
- top=0
- end
- local popped=3
- local hints=3
- local function callothersubr()
- if version=="cff" then
- if trace_charstrings then
- showstate("callothersubr")
- end
- if stack[top]==hints then
- popped=stack[top-2]
- else
- popped=3
- end
- local t=stack[top-1]
- if t then
- top=top-(t+2)
- if top<0 then
- top=0
- end
- else
- top=0
- end
- else
- top=0
- end
- end
- local function pop()
- if version=="cff" then
- if trace_charstrings then
- showstate("pop")
- end
- top=top+1
- stack[top]=popped
- else
- top=0
- end
- end
- local function setcurrentpoint()
- if version=="cff" then
- if trace_charstrings then
- showstate("setcurrentpoint (unsupported)")
- end
- x=x+stack[top-1]
- y=y+stack[top]
- end
- top=0
- end
- local reginit=false
- local function updateregions(n)
- if regions then
- local current=regions[n] or regions[1]
- nofregions=#current
- if axis and n~=reginit then
- factors={}
- for i=1,nofregions do
- local region=current[i]
- local s=1
- for j=1,#axis do
- local f=axis[j]
- local r=region[j]
- local start=r.start
- local peak=r.peak
- local stop=r.stop
- if start>peak or peak>stop then
- elseif start<0 and stop>0 and peak~=0 then
- elseif peak==0 then
- elseif fstop then
- s=0
- break
- elseif fpeak then
- s=s*(stop-f)/(stop-peak)
- else
- end
- end
- factors[i]=s
- end
- end
- end
- reginit=n
- end
- local function setvsindex()
- local vsindex=stack[top]
- if trace_charstrings then
- showstate(formatters["vsindex %i"](vsindex))
- end
- updateregions(vsindex)
- top=top-1
- end
- local function blend()
- local n=stack[top]
- top=top-1
- if axis then
- if trace_charstrings then
- local t=top-nofregions*n
- local m=t-n
- for i=1,n do
- local k=m+i
- local d=m+n+(i-1)*nofregions
- local old=stack[k]
- local new=old
- for r=1,nofregions do
- new=new+stack[d+r]*factors[r]
- end
- stack[k]=new
- showstate(formatters["blend %i of %i: %s -> %s"](i,n,old,new))
- end
- top=t
- elseif n==1 then
- top=top-nofregions
- local v=stack[top]
- for r=1,nofregions do
- v=v+stack[top+r]*factors[r]
- end
- stack[top]=v
- else
- top=top-nofregions*n
- local d=top
- local k=top-n
- for i=1,n do
- k=k+1
- local v=stack[k]
- for r=1,nofregions do
- v=v+stack[d+r]*factors[r]
- end
- stack[k]=v
- d=d+nofregions
- end
- end
- else
- end
- end
- local actions={ [0]=unsupported,
- getstem,
- unsupported,
- getstem,
- vmoveto,
- rlineto,
- hlineto,
- vlineto,
- rrcurveto,
- unsupported,
- unsupported,
- unsupported,
- unsupported,
- hsbw,
- unsupported,
- setvsindex,
- blend,
- unsupported,
- getstem,
- getmask,
- getmask,
- rmoveto,
- hmoveto,
- getstem,
- rcurveline,
- rlinecurve,
- vvcurveto,
- hhcurveto,
- unsupported,
- unsupported,
- vhcurveto,
- hvcurveto,
- }
- local reverse={ [0]="unsupported",
- "getstem",
- "unsupported",
- "getstem",
- "vmoveto",
- "rlineto",
- "hlineto",
- "vlineto",
- "rrcurveto",
- "unsupported",
- "unsupported",
- "unsupported",
- "unsupported",
- "hsbw",
- "unsupported",
- "setvsindex",
- "blend",
- "unsupported",
- "getstem",
- "getmask",
- "getmask",
- "rmoveto",
- "hmoveto",
- "getstem",
- "rcurveline",
- "rlinecurve",
- "vvcurveto",
- "hhcurveto",
- "unsupported",
- "unsupported",
- "vhcurveto",
- "hvcurveto",
- }
- local subactions={
- [000]=dotsection,
- [001]=getstem3,
- [002]=getstem3,
- [006]=seac,
- [007]=sbw,
- [012]=divide,
- [016]=callothersubr,
- [017]=pop,
- [033]=setcurrentpoint,
- [034]=hflex,
- [035]=flex,
- [036]=hflex1,
- [037]=flex1,
- }
- local chars=setmetatableindex(function (t,k)
- local v=char(k)
- t[k]=v
- return v
- end)
- local c_endchar=chars[14]
- local encode={}
- setmetatableindex(encode,function(t,i)
- for i=-2048,-1130 do
- t[i]=char(28,band(rshift(i,8),0xFF),band(i,0xFF))
- end
- for i=-1131,-108 do
- local v=0xFB00-i-108
- t[i]=char(band(rshift(v,8),0xFF),band(v,0xFF))
- end
- for i=-107,107 do
- t[i]=chars[i+139]
- end
- for i=108,1131 do
- local v=0xF700+i-108
- t[i]=char(extract(v,8,8),extract(v,0,8))
- end
- for i=1132,2048 do
- t[i]=char(28,band(rshift(i,8),0xFF),band(i,0xFF))
- end
- setmetatableindex(encode,function(t,k)
- local r=round(k)
- local v=rawget(t,r)
- if v then
- return v
- end
- local v1=floor(k)
- local v2=floor((k-v1)*0x10000)
- return char(255,extract(v1,8,8),extract(v1,0,8),extract(v2,8,8),extract(v2,0,8))
- end)
- return t[i]
- end)
- readers.cffencoder=encode
- local function p_setvsindex()
- local vsindex=stack[top]
- updateregions(vsindex)
- top=top-1
- end
- local function p_blend()
- local n=stack[top]
- top=top-1
- if not axis then
- elseif n==1 then
- top=top-nofregions
- local v=stack[top]
- for r=1,nofregions do
- v=v+stack[top+r]*factors[r]
- end
- stack[top]=round(v)
- else
- top=top-nofregions*n
- local d=top
- local k=top-n
- for i=1,n do
- k=k+1
- local v=stack[k]
- for r=1,nofregions do
- v=v+stack[d+r]*factors[r]
- end
- stack[k]=round(v)
- d=d+nofregions
- end
- end
- end
- local function p_getstem()
- local n=0
- if top%2~=0 then
- n=1
- end
- if top>n then
- stems=stems+idiv(top-n,2)
- end
- end
- local function p_getmask()
- local n=0
- if top%2~=0 then
- n=1
- end
- if top>n then
- stems=stems+idiv(top-n,2)
- end
- if stems==0 then
- return 0
- elseif stems<=8 then
- return 1
- else
- return idiv(stems+7,8)
- end
- end
- local process
- local function call(scope,list,bias)
- depth=depth+1
- if top==0 then
- showstate(formatters["unknown %s call %s, case %s"](scope,"?",1))
- top=0
- else
- local index=stack[top]+bias
- top=top-1
- if trace_charstrings then
- showvalue(scope,index,true)
- end
- local tab=list[index]
- if tab then
- process(tab)
- else
- showstate(formatters["unknown %s call %s, case %s"](scope,index,2))
- top=0
- end
- end
- depth=depth-1
- end
- process=function(tab)
- local i=1
- local n=#tab
- while i<=n do
- local t=tab[i]
- if t>=32 then
- top=top+1
- if t<=246 then
- stack[top]=t-139
- i=i+1
- elseif t<=250 then
- stack[top]=t*256-63124+tab[i+1]
- i=i+2
- elseif t<=254 then
- stack[top]=-t*256+64148-tab[i+1]
- i=i+2
- else
- local n=0x100*tab[i+1]+tab[i+2]
- if n>=0x8000 then
- stack[top]=n-0x10000+(0x100*tab[i+3]+tab[i+4])/0xFFFF
- else
- stack[top]=n+(0x100*tab[i+3]+tab[i+4])/0xFFFF
- end
- i=i+5
- end
- elseif t==28 then
- top=top+1
- local n=0x100*tab[i+1]+tab[i+2]
- if n>=0x8000 then
- stack[top]=n-0x10000
- else
- stack[top]=n
- end
- i=i+3
- elseif t==11 then
- if trace_charstrings then
- showstate("return")
- end
- return
- elseif t==10 then
- call("local",locals,localbias)
- i=i+1
- elseif t==14 then
- if width then
- elseif top>0 then
- width=stack[1]
- if trace_charstrings then
- showvalue("width",width)
- end
- else
- width=true
- end
- if trace_charstrings then
- showstate("endchar")
- end
- return
- elseif t==29 then
- call("global",globals,globalbias)
- i=i+1
- elseif t==12 then
- i=i+1
- local t=tab[i]
- if justpass then
- if t>=34 and t<=37 then
- for i=1,top do
- r=r+1;result[r]=encode[stack[i]]
- end
- r=r+1;result[r]=chars[12]
- r=r+1;result[r]=chars[t]
- top=0
- elseif t==6 then
- seacs[procidx]={
- asb=stack[1],
- adx=stack[2],
- ady=stack[3],
- base=stack[4],
- accent=stack[5],
- width=width,
- lsb=lsb,
- }
- top=0
- else
- local a=subactions[t]
- if a then
- a(t)
- else
- top=0
- end
- end
- else
- local a=subactions[t]
- if a then
- a(t)
- else
- if trace_charstrings then
- showvalue("",t)
- end
- top=0
- end
- end
- i=i+1
- elseif justpass then
- if t==15 then
- p_setvsindex()
- i=i+1
- elseif t==16 then
- local s=p_blend() or 0
- i=i+s+1
- elseif t==1 or t==3 or t==18 or operation==23 then
- p_getstem()
- if true then
- if top>0 then
- for i=1,top do
- r=r+1;result[r]=encode[stack[i]]
- end
- top=0
- end
- r=r+1;result[r]=chars[t]
- else
- top=0
- end
- i=i+1
- elseif t==19 or t==20 then
- local s=p_getmask() or 0
- if true then
- if top>0 then
- for i=1,top do
- r=r+1;result[r]=encode[stack[i]]
- end
- top=0
- end
- r=r+1;result[r]=chars[t]
- for j=1,s do
- i=i+1
- r=r+1;result[r]=chars[tab[i]]
- end
- else
- i=i+s
- top=0
- end
- i=i+1
- elseif t==9 then
- top=0
- i=i+1
- elseif t==13 then
- hsbw()
- if version=="cff" then
- r=r+1;result[r]=encode[lsb]
- r=r+1;result[r]=chars[22]
- else
- end
- i=i+1
- else
- if trace_charstrings then
- showstate(reverse[t] or "")
- end
- if top>0 then
- for i=1,top do
- r=r+1;result[r]=encode[stack[i]]
- end
- top=0
- end
- r=r+1;result[r]=chars[t]
- i=i+1
- end
- else
- local a=actions[t]
- if a then
- local s=a(t)
- if s then
- i=i+s+1
- else
- i=i+1
- end
- else
- if trace_charstrings then
- showstate(reverse[t] or "")
- end
- top=0
- i=i+1
- end
- end
- end
- end
- local function setbias(globals,locals,nobias)
- if nobias then
- return 0,0
- else
- local g=#globals
- local l=#locals
- return
- ((g<1240 and 107) or (g<33900 and 1131) or 32768)+1,
- ((l<1240 and 107) or (l<33900 and 1131) or 32768)+1
- end
- end
- local function processshape(tab,index,hack)
- if not tab then
- glyphs[index]={
- boundingbox={ 0,0,0,0 },
- width=0,
- name=charset and charset[index] or nil,
- }
- return
- end
- tab=bytetable(tab)
- x=0
- y=0
- width=false
- lsb=0
- r=0
- top=0
- stems=0
- result={}
- popped=3
- procidx=index
- xmin=0
- xmax=0
- ymin=0
- ymax=0
- checked=false
- if trace_charstrings then
- report("glyph: %i",index)
- report("data : % t",tab)
- end
- if regions then
- updateregions(vsindex)
- end
- process(tab)
- if hack then
- return x,y
- end
- local boundingbox={
- round(xmin),
- round(ymin),
- round(xmax),
- round(ymax),
- }
- if width==true or width==false then
- width=defaultwidth
- else
- width=nominalwidth+width
- end
- local glyph=glyphs[index]
- if justpass then
- r=r+1
- result[r]=c_endchar
- local stream=concat(result)
- if glyph then
- glyph.stream=stream
- else
- glyphs[index]={ stream=stream }
- end
- elseif glyph then
- glyph.segments=keepcurve~=false and result or nil
- glyph.boundingbox=boundingbox
- if not glyph.width then
- glyph.width=width
- end
- if charset and not glyph.name then
- glyph.name=charset[index]
- end
- elseif keepcurve then
- glyphs[index]={
- segments=result,
- boundingbox=boundingbox,
- width=width,
- name=charset and charset[index] or nil,
- }
- else
- glyphs[index]={
- boundingbox=boundingbox,
- width=width,
- name=charset and charset[index] or nil,
- }
- end
- if trace_charstrings then
- report("width : %s",tostring(width))
- report("boundingbox: % t",boundingbox)
- end
- end
- startparsing=function(fontdata,data,streams)
- reginit=false
- axis=false
- regions=data.regions
- justpass=streams==true
- popped=3
- seacs={}
- if regions then
- regions={ regions }
- axis=data.factors or false
- end
- end
- stopparsing=function(fontdata,data)
- stack={}
- glyphs=false
- result={}
- top=0
- locals=false
- globals=false
- strings=false
- popped=3
- seacs={}
- end
- local function setwidths(private)
- if not private then
- return 0,0
- end
- local privatedata=private.data
- if not privatedata then
- return 0,0
- end
- return privatedata.nominalwidthx or 0,privatedata.defaultwidthx or 0
- end
- parsecharstrings=function(fontdata,data,glphs,doshapes,tversion,streams,nobias)
- local dictionary=data.dictionaries[1]
- local charstrings=dictionary.charstrings
- keepcurve=doshapes
- version=tversion
- strings=data.strings
- globals=data.routines or {}
- locals=dictionary.subroutines or {}
- charset=dictionary.charset
- vsindex=dictionary.vsindex or 0
- glyphs=glphs or {}
- globalbias,localbias=setbias(globals,locals,nobias)
- nominalwidth,defaultwidth=setwidths(dictionary.private)
- if charstrings then
- startparsing(fontdata,data,streams)
- for index=1,#charstrings do
- processshape(charstrings[index],index-1)
- end
- if justpass and next(seacs) then
- local charset=data.dictionaries[1].charset
- if charset then
- local lookup=table.swapped(charset)
- for index,v in next,seacs do
- local bindex=lookup[standardnames[v.base]]
- local aindex=lookup[standardnames[v.accent]]
- local bglyph=bindex and glyphs[bindex]
- local aglyph=aindex and glyphs[aindex]
- if bglyph and aglyph then
- local jp=justpass
- justpass=false
- local x,y=processshape(charstrings[bindex+1],bindex,true)
- justpass=jp
- local base=bglyph.stream
- local accent=aglyph.stream
- local moveto=encode[-x-v.asb+v.adx]..chars[22]..encode[-y+v.ady]..chars[ 4]
- base=sub(base,1,#base-1)
- glyphs[index].stream=base..moveto..accent
- end
- end
- end
- end
- stopparsing(fontdata,data)
- else
- report("no charstrings")
- end
- return glyphs
- end
- parsecharstring=function(fontdata,data,dictionary,tab,glphs,index,doshapes,tversion,streams)
- keepcurve=doshapes
- version=tversion
- strings=data.strings
- globals=data.routines or {}
- locals=dictionary.subroutines or {}
- charset=false
- vsindex=dictionary.vsindex or 0
- glyphs=glphs or {}
- justpass=streams==true
- seacs={}
- globalbias,localbias=setbias(globals,locals,nobias)
- nominalwidth,defaultwidth=setwidths(dictionary.private)
- processshape(tab,index-1)
- end
-end
-local function readglobals(f,data)
- local routines=readlengths(f)
- for i=1,#routines do
- routines[i]=readbytetable(f,routines[i])
- end
- data.routines=routines
-end
-local function readencodings(f,data)
- data.encodings={}
-end
-local function readcharsets(f,data,dictionary)
- local header=data.header
- local strings=data.strings
- local nofglyphs=data.nofglyphs
- local charsetoffset=dictionary.charset
- if charsetoffset and charsetoffset~=0 then
- setposition(f,header.offset+charsetoffset)
- local format=readbyte(f)
- local charset={ [0]=".notdef" }
- dictionary.charset=charset
- if format==0 then
- for i=1,nofglyphs do
- charset[i]=strings[readushort(f)]
- end
- elseif format==1 or format==2 then
- local readcount=format==1 and readbyte or readushort
- local i=1
- while i<=nofglyphs do
- local sid=readushort(f)
- local n=readcount(f)
- for s=sid,sid+n do
- charset[i]=strings[s]
- i=i+1
- if i>nofglyphs then
- break
- end
- end
- end
- else
- report("cff parser: unsupported charset format %a",format)
- end
- else
- dictionary.nocharset=true
- dictionary.charset=nil
- end
-end
-local function readprivates(f,data)
- local header=data.header
- local dictionaries=data.dictionaries
- local private=dictionaries[1].private
- if private then
- setposition(f,header.offset+private.offset)
- private.data=readstring(f,private.size)
- end
-end
-local function readlocals(f,data,dictionary)
- local header=data.header
- local private=dictionary.private
- if private then
- local subroutineoffset=private.data.subroutines
- if subroutineoffset~=0 then
- setposition(f,header.offset+private.offset+subroutineoffset)
- local subroutines=readlengths(f)
- for i=1,#subroutines do
- subroutines[i]=readbytetable(f,subroutines[i])
- end
- dictionary.subroutines=subroutines
- private.data.subroutines=nil
- else
- dictionary.subroutines={}
- end
- else
- dictionary.subroutines={}
- end
-end
-local function readcharstrings(f,data,what)
- local header=data.header
- local dictionaries=data.dictionaries
- local dictionary=dictionaries[1]
- local stringtype=dictionary.charstringtype
- local offset=dictionary.charstrings
- if type(offset)~="number" then
- elseif stringtype==2 then
- setposition(f,header.offset+offset)
- local charstrings=readlengths(f,what=="cff2")
- local nofglyphs=#charstrings
- for i=1,nofglyphs do
- charstrings[i]=readstring(f,charstrings[i])
- end
- data.nofglyphs=nofglyphs
- dictionary.charstrings=charstrings
- else
- report("unsupported charstr type %i",stringtype)
- data.nofglyphs=0
- dictionary.charstrings={}
- end
-end
-local function readcidprivates(f,data)
- local header=data.header
- local dictionaries=data.dictionaries[1].cid.dictionaries
- for i=1,#dictionaries do
- local dictionary=dictionaries[i]
- local private=dictionary.private
- if private then
- setposition(f,header.offset+private.offset)
- private.data=readstring(f,private.size)
- end
- end
- parseprivates(data,dictionaries)
-end
-readers.parsecharstrings=parsecharstrings
-local function readnoselect(f,fontdata,data,glyphs,doshapes,version,streams)
- local dictionaries=data.dictionaries
- local dictionary=dictionaries[1]
- readglobals(f,data)
- readcharstrings(f,data,version)
- if version=="cff2" then
- dictionary.charset=nil
- else
- readencodings(f,data)
- readcharsets(f,data,dictionary)
- end
- readprivates(f,data)
- parseprivates(data,data.dictionaries)
- readlocals(f,data,dictionary)
- startparsing(fontdata,data,streams)
- parsecharstrings(fontdata,data,glyphs,doshapes,version,streams)
- stopparsing(fontdata,data)
-end
-local function readfdselect(f,fontdata,data,glyphs,doshapes,version,streams)
- local header=data.header
- local dictionaries=data.dictionaries
- local dictionary=dictionaries[1]
- local cid=dictionary.cid
- local cidselect=cid and cid.fdselect
- readglobals(f,data)
- readcharstrings(f,data,version)
- if version~="cff2" then
- readencodings(f,data)
- end
- local charstrings=dictionary.charstrings
- local fdindex={}
- local nofglyphs=data.nofglyphs
- local maxindex=-1
- setposition(f,header.offset+cidselect)
- local format=readbyte(f)
- if format==1 then
- for i=0,nofglyphs do
- local index=readbyte(f)
- fdindex[i]=index
- if index>maxindex then
- maxindex=index
- end
- end
- elseif format==3 then
- local nofranges=readushort(f)
- local first=readushort(f)
- local index=readbyte(f)
- while true do
- local last=readushort(f)
- if index>maxindex then
- maxindex=index
- end
- for i=first,last do
- fdindex[i]=index
- end
- if last>=nofglyphs then
- break
- else
- first=last+1
- index=readbyte(f)
- end
- end
- else
- end
- if maxindex>=0 then
- local cidarray=cid.fdarray
- if cidarray then
- setposition(f,header.offset+cidarray)
- local dictionaries=readlengths(f)
- for i=1,#dictionaries do
- dictionaries[i]=readstring(f,dictionaries[i])
- end
- parsedictionaries(data,dictionaries)
- cid.dictionaries=dictionaries
- readcidprivates(f,data)
- for i=1,#dictionaries do
- readlocals(f,data,dictionaries[i])
- end
- startparsing(fontdata,data,streams)
- for i=1,#charstrings do
- parsecharstring(fontdata,data,dictionaries[fdindex[i]+1],charstrings[i],glyphs,i,doshapes,version,streams)
- end
- stopparsing(fontdata,data)
- else
- report("no cid array")
- end
- end
-end
-local gotodatatable=readers.helpers.gotodatatable
-local function cleanup(data,dictionaries)
-end
-function readers.cff(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"cff",specification.details or specification.glyphs)
- if tableoffset then
- local header=readheader(f)
- if header.major~=1 then
- report("only version %s is supported for table %a",1,"cff")
- return
- end
- local glyphs=fontdata.glyphs
- local names=readfontnames(f)
- local dictionaries=readtopdictionaries(f)
- local strings=readstrings(f)
- local data={
- header=header,
- names=names,
- dictionaries=dictionaries,
- strings=strings,
- nofglyphs=fontdata.nofglyphs,
- }
- parsedictionaries(data,dictionaries,"cff")
- local dic=dictionaries[1]
- local cid=dic.cid
- local cffinfo={
- familyname=dic.familyname,
- fullname=dic.fullname,
- boundingbox=dic.boundingbox,
- weight=dic.weight,
- italicangle=dic.italicangle,
- underlineposition=dic.underlineposition,
- underlinethickness=dic.underlinethickness,
- defaultwidth=dic.defaultwidthx,
- nominalwidth=dic.nominalwidthx,
- monospaced=dic.monospaced,
- }
- fontdata.cidinfo=cid and {
- registry=cid.registry,
- ordering=cid.ordering,
- supplement=cid.supplement,
- }
- fontdata.cffinfo=cffinfo
- local all=specification.shapes or specification.streams or false
- if specification.glyphs or all then
- if cid and cid.fdselect then
- readfdselect(f,fontdata,data,glyphs,all,"cff",specification.streams)
- else
- readnoselect(f,fontdata,data,glyphs,all,"cff",specification.streams)
- end
- end
- local private=dic.private
- if private then
- local data=private.data
- if type(data)=="table" then
- cffinfo.defaultwidth=data.defaultwidthx or cffinfo.defaultwidth
- cffinfo.nominalwidth=data.nominalwidthx or cffinfo.nominalwidth
- cffinfo.bluevalues=data.bluevalues
- cffinfo.otherblues=data.otherblues
- cffinfo.familyblues=data.familyblues
- cffinfo.familyotherblues=data.familyotherblues
- cffinfo.bluescale=data.bluescale
- cffinfo.blueshift=data.blueshift
- cffinfo.bluefuzz=data.bluefuzz
- cffinfo.stdhw=data.stdhw
- cffinfo.stdvw=data.stdvw
- end
- end
- cleanup(data,dictionaries)
- end
-end
-function readers.cff2(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"cff2",specification.glyphs)
- if tableoffset then
- local header=readheader(f)
- if header.major~=2 then
- report("only version %s is supported for table %a",2,"cff2")
- return
- end
- local glyphs=fontdata.glyphs
- local dictionaries={ readstring(f,header.dsize) }
- local data={
- header=header,
- dictionaries=dictionaries,
- nofglyphs=fontdata.nofglyphs,
- }
- parsedictionaries(data,dictionaries,"cff2")
- local offset=dictionaries[1].vstore
- if offset>0 then
- local storeoffset=dictionaries[1].vstore+data.header.offset+2
- local regions,deltas=readers.helpers.readvariationdata(f,storeoffset,factors)
- data.regions=regions
- data.deltas=deltas
- else
- data.regions={}
- data.deltas={}
- end
- data.factors=specification.factors
- local cid=data.dictionaries[1].cid
- local all=specification.shapes or specification.streams or false
- if cid and cid.fdselect then
- readfdselect(f,fontdata,data,glyphs,all,"cff2",specification.streams)
- else
- readnoselect(f,fontdata,data,glyphs,all,"cff2",specification.streams)
- end
- cleanup(data,dictionaries)
- end
-end
-function readers.cffcheck(filename)
- local f=io.open(filename,"rb")
- if f then
- local fontdata={
- glyphs={},
- }
- local header=readheader(f)
- if header.major~=1 then
- report("only version %s is supported for table %a",1,"cff")
- return
- end
- local names=readfontnames(f)
- local dictionaries=readtopdictionaries(f)
- local strings=readstrings(f)
- local glyphs={}
- local data={
- header=header,
- names=names,
- dictionaries=dictionaries,
- strings=strings,
- glyphs=glyphs,
- nofglyphs=0,
- }
- parsedictionaries(data,dictionaries,"cff")
- local cid=data.dictionaries[1].cid
- if cid and cid.fdselect then
- readfdselect(f,fontdata,data,glyphs,false)
- else
- readnoselect(f,fontdata,data,glyphs,false)
- end
- return data
- end
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-cff”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-ttf” 44e61cef50dab9b1aaf48130f9367c34] ---
-
-if not modules then modules={} end modules ['font-ttf']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local next,type,unpack=next,type,unpack
-local band,rshift=bit32.band,bit32.rshift
-local sqrt,round=math.sqrt,math.round
-local char,rep=string.char,string.rep
-local concat=table.concat
-local idiv=number.idiv
-local setmetatableindex=table.setmetatableindex
-local report=logs.reporter("otf reader","ttf")
-local trace_deltas=false
-local readers=fonts.handlers.otf.readers
-local streamreader=readers.streamreader
-local setposition=streamreader.setposition
-local getposition=streamreader.getposition
-local skipbytes=streamreader.skip
-local readbyte=streamreader.readcardinal1
-local readushort=streamreader.readcardinal2
-local readulong=streamreader.readcardinal4
-local readchar=streamreader.readinteger1
-local readshort=streamreader.readinteger2
-local read2dot14=streamreader.read2dot14
-local readinteger=streamreader.readinteger1
-local readcardinaltable=streamreader.readcardinaltable
-local readintegertable=streamreader.readintegertable
-directives.register("fonts.streamreader",function()
- streamreader=utilities.streams
- setposition=streamreader.setposition
- getposition=streamreader.getposition
- skipbytes=streamreader.skip
- readbyte=streamreader.readcardinal1
- readushort=streamreader.readcardinal2
- readulong=streamreader.readcardinal4
- readchar=streamreader.readinteger1
- readshort=streamreader.readinteger2
- read2dot14=streamreader.read2dot14
- readinteger=streamreader.readinteger1
- readcardinaltable=streamreader.readcardinaltable
- readintegertable=streamreader.readintegertable
-end)
-local short=2
-local ushort=2
-local ulong=4
-local helpers=readers.helpers
-local gotodatatable=helpers.gotodatatable
-local function mergecomposites(glyphs,shapes)
- local function merge(index,shape,components)
- local contours={}
- local points={}
- local nofcontours=0
- local nofpoints=0
- local offset=0
- local deltas=shape.deltas
- for i=1,#components do
- local component=components[i]
- local subindex=component.index
- local subshape=shapes[subindex]
- local subcontours=subshape.contours
- local subpoints=subshape.points
- if not subcontours then
- local subcomponents=subshape.components
- if subcomponents then
- subcontours,subpoints=merge(subindex,subshape,subcomponents)
- end
- end
- if subpoints then
- local matrix=component.matrix
- local xscale=matrix[1]
- local xrotate=matrix[2]
- local yrotate=matrix[3]
- local yscale=matrix[4]
- local xoffset=matrix[5]
- local yoffset=matrix[6]
- local count=#subpoints
- if xscale==1 and yscale==1 and xrotate==0 and yrotate==0 then
- for i=1,count do
- local p=subpoints[i]
- nofpoints=nofpoints+1
- points[nofpoints]={
- p[1]+xoffset,
- p[2]+yoffset,
- p[3]
- }
- end
- else
- for i=1,count do
- local p=subpoints[i]
- local x=p[1]
- local y=p[2]
- nofpoints=nofpoints+1
- points[nofpoints]={
- xscale*x+xrotate*y+xoffset,
- yscale*y+yrotate*x+yoffset,
- p[3]
- }
- end
- end
- local subcount=#subcontours
- if subcount==1 then
- nofcontours=nofcontours+1
- contours[nofcontours]=offset+subcontours[1]
- else
- for i=1,#subcontours do
- nofcontours=nofcontours+1
- contours[nofcontours]=offset+subcontours[i]
- end
- end
- offset=offset+count
- else
- report("missing contours composite %s, component %s of %s, glyph %s",index,i,#components,subindex)
- end
- end
- shape.points=points
- shape.contours=contours
- shape.components=nil
- return contours,points
- end
- for index=0,#glyphs-1 do
- local shape=shapes[index]
- if shape then
- local components=shape.components
- if components then
- merge(index,shape,components)
- end
- end
- end
-end
-local function readnothing(f)
- return {
- type="nothing",
- }
-end
-local function curveto(m_x,m_y,l_x,l_y,r_x,r_y)
- return
- l_x+2/3*(m_x-l_x),l_y+2/3*(m_y-l_y),
- r_x+2/3*(m_x-r_x),r_y+2/3*(m_y-r_y),
- r_x,r_y,"c"
-end
-local function applyaxis(glyph,shape,deltas,dowidth)
- local points=shape.points
- if points then
- local nofpoints=#points
- local h=nofpoints+2
- local l=nofpoints+1
- local dw=0
- local dl=0
- for i=1,#deltas do
- local deltaset=deltas[i]
- local xvalues=deltaset.xvalues
- local yvalues=deltaset.yvalues
- local dpoints=deltaset.points
- local factor=deltaset.factor
- if dpoints then
- local nofdpoints=#dpoints
- for i=1,nofdpoints do
- local d=dpoints[i]
- local p=points[d]
- if p then
- if xvalues then
- local x=xvalues[i]
- if x and x~=0 then
- p[1]=p[1]+factor*x
- end
- end
- if yvalues then
- local y=yvalues[i]
- if y and y~=0 then
- p[2]=p[2]+factor*y
- end
- end
- elseif dowidth then
- if d==h then
- local x=xvalues[i]
- if x then
- dw=dw+factor*x
- end
- elseif d==l then
- local x=xvalues[i]
- if x then
- dl=dl+factor*x
- end
- end
- end
- end
- else
- for i=1,nofpoints do
- local p=points[i]
- if xvalues then
- local x=xvalues[i]
- if x and x~=0 then
- p[1]=p[1]+factor*x
- end
- end
- if yvalues then
- local y=yvalues[i]
- if y and y~=0 then
- p[2]=p[2]+factor*y
- end
- end
- end
- if dowidth then
- local x=xvalues[h]
- if x then
- dw=dw+factor*x
- end
- local x=xvalues[l]
- if x then
- dl=dl+factor*x
- end
- end
- end
- end
- if dowidth then
- local width=glyph.width or 0
- glyph.width=width+dw-dl
- end
- else
- report("no points for glyph %a",glyph.name)
- end
-end
-local quadratic=false
-local function contours2outlines_normal(glyphs,shapes)
- for index=0,#glyphs-1 do
- local shape=shapes[index]
- if shape then
- local glyph=glyphs[index]
- local contours=shape.contours
- local points=shape.points
- if contours then
- local nofcontours=#contours
- local segments={}
- local nofsegments=0
- glyph.segments=segments
- if nofcontours>0 then
- local px=0
- local py=0
- local first=1
- for i=1,nofcontours do
- local last=contours[i]
- if last>=first then
- local first_pt=points[first]
- local first_on=first_pt[3]
- if first==last then
- first_pt[3]="m"
- nofsegments=nofsegments+1
- segments[nofsegments]=first_pt
- else
- local first_on=first_pt[3]
- local last_pt=points[last]
- local last_on=last_pt[3]
- local start=1
- local control_pt=false
- if first_on then
- start=2
- else
- if last_on then
- first_pt=last_pt
- else
- first_pt={ (first_pt[1]+last_pt[1])/2,(first_pt[2]+last_pt[2])/2,false }
- end
- control_pt=first_pt
- end
- local x=first_pt[1]
- local y=first_pt[2]
- if not done then
- xmin=x
- ymin=y
- xmax=x
- ymax=y
- done=true
- end
- nofsegments=nofsegments+1
- segments[nofsegments]={ x,y,"m" }
- if not quadratic then
- px=x
- py=y
- end
- local previous_pt=first_pt
- for i=first,last do
- local current_pt=points[i]
- local current_on=current_pt[3]
- local previous_on=previous_pt[3]
- if previous_on then
- if current_on then
- local x,y=current_pt[1],current_pt[2]
- nofsegments=nofsegments+1
- segments[nofsegments]={ x,y,"l" }
- if not quadratic then
- px,py=x,y
- end
- else
- control_pt=current_pt
- end
- elseif current_on then
- local x1=control_pt[1]
- local y1=control_pt[2]
- local x2=current_pt[1]
- local y2=current_pt[2]
- nofsegments=nofsegments+1
- if quadratic then
- segments[nofsegments]={ x1,y1,x2,y2,"q" }
- else
- x1,y1,x2,y2,px,py=curveto(x1,y1,px,py,x2,y2)
- segments[nofsegments]={ x1,y1,x2,y2,px,py,"c" }
- end
- control_pt=false
- else
- local x2=(previous_pt[1]+current_pt[1])/2
- local y2=(previous_pt[2]+current_pt[2])/2
- local x1=control_pt[1]
- local y1=control_pt[2]
- nofsegments=nofsegments+1
- if quadratic then
- segments[nofsegments]={ x1,y1,x2,y2,"q" }
- else
- x1,y1,x2,y2,px,py=curveto(x1,y1,px,py,x2,y2)
- segments[nofsegments]={ x1,y1,x2,y2,px,py,"c" }
- end
- control_pt=current_pt
- end
- previous_pt=current_pt
- end
- if first_pt==last_pt then
- else
- nofsegments=nofsegments+1
- local x2=first_pt[1]
- local y2=first_pt[2]
- if not control_pt then
- segments[nofsegments]={ x2,y2,"l" }
- elseif quadratic then
- local x1=control_pt[1]
- local y1=control_pt[2]
- segments[nofsegments]={ x1,y1,x2,y2,"q" }
- else
- local x1=control_pt[1]
- local y1=control_pt[2]
- x1,y1,x2,y2,px,py=curveto(x1,y1,px,py,x2,y2)
- segments[nofsegments]={ x1,y1,x2,y2,px,py,"c" }
- end
- end
- end
- end
- first=last+1
- end
- end
- end
- end
- end
-end
-local function contours2outlines_shaped(glyphs,shapes,keepcurve)
- for index=0,#glyphs-1 do
- local shape=shapes[index]
- if shape then
- local glyph=glyphs[index]
- local contours=shape.contours
- local points=shape.points
- if contours then
- local nofcontours=#contours
- local segments=keepcurve and {} or nil
- local nofsegments=0
- if keepcurve then
- glyph.segments=segments
- end
- if nofcontours>0 then
- local xmin,ymin,xmax,ymax,done=0,0,0,0,false
- local px,py=0,0
- local first=1
- for i=1,nofcontours do
- local last=contours[i]
- if last>=first then
- local first_pt=points[first]
- local first_on=first_pt[3]
- if first==last then
- if keepcurve then
- first_pt[3]="m"
- nofsegments=nofsegments+1
- segments[nofsegments]=first_pt
- end
- else
- local first_on=first_pt[3]
- local last_pt=points[last]
- local last_on=last_pt[3]
- local start=1
- local control_pt=false
- if first_on then
- start=2
- else
- if last_on then
- first_pt=last_pt
- else
- first_pt={ (first_pt[1]+last_pt[1])/2,(first_pt[2]+last_pt[2])/2,false }
- end
- control_pt=first_pt
- end
- local x=first_pt[1]
- local y=first_pt[2]
- if not done then
- xmin,ymin,xmax,ymax=x,y,x,y
- done=true
- else
- if xxmax then xmax=x end
- if yymax then ymax=y end
- end
- if keepcurve then
- nofsegments=nofsegments+1
- segments[nofsegments]={ x,y,"m" }
- end
- if not quadratic then
- px=x
- py=y
- end
- local previous_pt=first_pt
- for i=first,last do
- local current_pt=points[i]
- local current_on=current_pt[3]
- local previous_on=previous_pt[3]
- if previous_on then
- if current_on then
- local x=current_pt[1]
- local y=current_pt[2]
- if xxmax then xmax=x end
- if yymax then ymax=y end
- if keepcurve then
- nofsegments=nofsegments+1
- segments[nofsegments]={ x,y,"l" }
- end
- if not quadratic then
- px=x
- py=y
- end
- else
- control_pt=current_pt
- end
- elseif current_on then
- local x1=control_pt[1]
- local y1=control_pt[2]
- local x2=current_pt[1]
- local y2=current_pt[2]
- if quadratic then
- if x1xmax then xmax=x1 end
- if y1ymax then ymax=y1 end
- if keepcurve then
- nofsegments=nofsegments+1
- segments[nofsegments]={ x1,y1,x2,y2,"q" }
- end
- else
- x1,y1,x2,y2,px,py=curveto(x1,y1,px,py,x2,y2)
- if x1xmax then xmax=x1 end
- if y1ymax then ymax=y1 end
- if x2xmax then xmax=x2 end
- if y2ymax then ymax=y2 end
- if pxxmax then xmax=px end
- if pyymax then ymax=py end
- if keepcurve then
- nofsegments=nofsegments+1
- segments[nofsegments]={ x1,y1,x2,y2,px,py,"c" }
- end
- end
- control_pt=false
- else
- local x2=(previous_pt[1]+current_pt[1])/2
- local y2=(previous_pt[2]+current_pt[2])/2
- local x1=control_pt[1]
- local y1=control_pt[2]
- if quadratic then
- if x1xmax then xmax=x1 end
- if y1ymax then ymax=y1 end
- if keepcurve then
- nofsegments=nofsegments+1
- segments[nofsegments]={ x1,y1,x2,y2,"q" }
- end
- else
- x1,y1,x2,y2,px,py=curveto(x1,y1,px,py,x2,y2)
- if x1xmax then xmax=x1 end
- if y1ymax then ymax=y1 end
- if x2xmax then xmax=x2 end
- if y2ymax then ymax=y2 end
- if pxxmax then xmax=px end
- if pyymax then ymax=py end
- if keepcurve then
- nofsegments=nofsegments+1
- segments[nofsegments]={ x1,y1,x2,y2,px,py,"c" }
- end
- end
- control_pt=current_pt
- end
- previous_pt=current_pt
- end
- if first_pt==last_pt then
- elseif not control_pt then
- if keepcurve then
- nofsegments=nofsegments+1
- segments[nofsegments]={ first_pt[1],first_pt[2],"l" }
- end
- else
- local x1=control_pt[1]
- local y1=control_pt[2]
- local x2=first_pt[1]
- local y2=first_pt[2]
- if x1xmax then xmax=x1 end
- if y1ymax then ymax=y1 end
- if quadratic then
- if keepcurve then
- nofsegments=nofsegments+1
- segments[nofsegments]={ x1,y1,x2,y2,"q" }
- end
- else
- x1,y1,x2,y2,px,py=curveto(x1,y1,px,py,x2,y2)
- if x2xmax then xmax=x2 end
- if y2ymax then ymax=y2 end
- if pxxmax then xmax=px end
- if pyymax then ymax=py end
- if keepcurve then
- nofsegments=nofsegments+1
- segments[nofsegments]={ x1,y1,x2,y2,px,py,"c" }
- end
- end
- end
- end
- end
- first=last+1
- end
- glyph.boundingbox={ round(xmin),round(ymin),round(xmax),round(ymax) }
- end
- end
- end
- end
-end
-local c_zero=char(0)
-local s_zero=char(0,0)
-local function toushort(n)
- return char(band(rshift(n,8),0xFF),band(n,0xFF))
-end
-local function toshort(n)
- if n<0 then
- n=n+0x10000
- end
- return char(band(rshift(n,8),0xFF),band(n,0xFF))
-end
-local chars=setmetatableindex(function(t,k)
- for i=0,255 do local v=char(i) t[i]=v end return t[k]
-end)
-local function repackpoints(glyphs,shapes)
- local noboundingbox={ 0,0,0,0 }
- local result={}
- local xpoints={}
- local ypoints={}
- for index=0,#glyphs-1 do
- local shape=shapes[index]
- if shape then
- local r=0
- local glyph=glyphs[index]
- local contours=shape.contours
- local nofcontours=contours and #contours or 0
- local boundingbox=glyph.boundingbox or noboundingbox
- r=r+1 result[r]=toshort(nofcontours)
- r=r+1 result[r]=toshort(boundingbox[1])
- r=r+1 result[r]=toshort(boundingbox[2])
- r=r+1 result[r]=toshort(boundingbox[3])
- r=r+1 result[r]=toshort(boundingbox[4])
- if nofcontours>0 then
- for i=1,nofcontours do
- r=r+1 result[r]=toshort(contours[i]-1)
- end
- r=r+1 result[r]=s_zero
- local points=shape.points
- local currentx=0
- local currenty=0
- local x=0
- local y=0
- local lastflag=nil
- local nofflags=0
- for i=1,#points do
- local pt=points[i]
- local px=pt[1]
- local py=pt[2]
- local fl=pt[3] and 0x01 or 0x00
- if px==currentx then
- fl=fl+0x10
- else
- local dx=round(px-currentx)
- x=x+1
- if dx<-255 or dx>255 then
- xpoints[x]=toshort(dx)
- elseif dx<0 then
- fl=fl+0x02
- xpoints[x]=chars[-dx]
- elseif dx>0 then
- fl=fl+0x12
- xpoints[x]=chars[dx]
- else
- fl=fl+0x02
- xpoints[x]=c_zero
- end
- end
- if py==currenty then
- fl=fl+0x20
- else
- local dy=round(py-currenty)
- y=y+1
- if dy<-255 or dy>255 then
- ypoints[y]=toshort(dy)
- elseif dy<0 then
- fl=fl+0x04
- ypoints[y]=chars[-dy]
- elseif dy>0 then
- fl=fl+0x24
- ypoints[y]=chars[dy]
- else
- fl=fl+0x04
- ypoints[y]=c_zero
- end
- end
- currentx=px
- currenty=py
- if lastflag==fl then
- if nofflags==255 then
- lastflag=lastflag+0x08
- r=r+1 result[r]=char(lastflag,nofflags-1)
- nofflags=1
- lastflag=fl
- else
- nofflags=nofflags+1
- end
- else
- if nofflags==1 then
- r=r+1 result[r]=chars[lastflag]
- elseif nofflags==2 then
- r=r+1 result[r]=char(lastflag,lastflag)
- elseif nofflags>2 then
- lastflag=lastflag+0x08
- r=r+1 result[r]=char(lastflag,nofflags-1)
- end
- nofflags=1
- lastflag=fl
- end
- end
- if nofflags==1 then
- r=r+1 result[r]=chars[lastflag]
- elseif nofflags==2 then
- r=r+1 result[r]=char(lastflag,lastflag)
- elseif nofflags>2 then
- lastflag=lastflag+0x08
- r=r+1 result[r]=char(lastflag,nofflags-1)
- end
- r=r+1 result[r]=concat(xpoints,"",1,x)
- r=r+1 result[r]=concat(ypoints,"",1,y)
- end
- local stream=concat(result,"",1,r)
- local length=#stream
- local padding=idiv(length+3,4)*4-length
- if padding>0 then
- if padding==1 then
- padding="\0"
- elseif padding==2 then
- padding="\0\0"
- else
- padding="\0\0\0"
- end
- padding=stream..padding
- end
- glyph.stream=stream
- end
- end
-end
-local flags={}
-local function readglyph(f,nofcontours)
- local points={}
- local contours={}
- for i=1,nofcontours do
- contours[i]=readshort(f)+1
- end
- local nofpoints=contours[nofcontours]
- local nofinstructions=readushort(f)
- skipbytes(f,nofinstructions)
- local i=1
- while i<=nofpoints do
- local flag=readbyte(f)
- flags[i]=flag
- if band(flag,0x08)~=0 then
- local n=readbyte(f)
- if n==1 then
- i=i+1
- flags[i]=flag
- else
- for j=1,n do
- i=i+1
- flags[i]=flag
- end
- end
- end
- i=i+1
- end
- local x=0
- for i=1,nofpoints do
- local flag=flags[i]
- if band(flag,0x02)~=0 then
- if band(flag,0x10)~=0 then
- x=x+readbyte(f)
- else
- x=x-readbyte(f)
- end
- elseif band(flag,0x10)~=0 then
- else
- x=x+readshort(f)
- end
- points[i]={ x,0,band(flag,0x01)~=0 }
- end
- local y=0
- for i=1,nofpoints do
- local flag=flags[i]
- if band(flag,0x04)~=0 then
- if band(flag,0x20)~=0 then
- y=y+readbyte(f)
- else
- y=y-readbyte(f)
- end
- elseif band(flag,0x20)~=0 then
- else
- y=y+readshort(f)
- end
- points[i][2]=y
- end
- return {
- type="glyph",
- points=points,
- contours=contours,
- nofpoints=nofpoints,
- }
-end
-local function readcomposite(f)
- local components={}
- local nofcomponents=0
- local instructions=false
- while true do
- local flags=readushort(f)
- local index=readushort(f)
- local f_xyarg=band(flags,0x0002)~=0
- local f_offset=band(flags,0x0800)~=0
- local xscale=1
- local xrotate=0
- local yrotate=0
- local yscale=1
- local xoffset=0
- local yoffset=0
- local base=false
- local reference=false
- if f_xyarg then
- if band(flags,0x0001)~=0 then
- xoffset=readshort(f)
- yoffset=readshort(f)
- else
- xoffset=readchar(f)
- yoffset=readchar(f)
- end
- else
- if band(flags,0x0001)~=0 then
- base=readshort(f)
- reference=readshort(f)
- else
- base=readchar(f)
- reference=readchar(f)
- end
- end
- if band(flags,0x0008)~=0 then
- xscale=read2dot14(f)
- yscale=xscale
- if f_xyarg and f_offset then
- xoffset=xoffset*xscale
- yoffset=yoffset*yscale
- end
- elseif band(flags,0x0040)~=0 then
- xscale=read2dot14(f)
- yscale=read2dot14(f)
- if f_xyarg and f_offset then
- xoffset=xoffset*xscale
- yoffset=yoffset*yscale
- end
- elseif band(flags,0x0080)~=0 then
- xscale=read2dot14(f)
- xrotate=read2dot14(f)
- yrotate=read2dot14(f)
- yscale=read2dot14(f)
- if f_xyarg and f_offset then
- xoffset=xoffset*sqrt(xscale^2+xrotate^2)
- yoffset=yoffset*sqrt(yrotate^2+yscale^2)
- end
- end
- nofcomponents=nofcomponents+1
- components[nofcomponents]={
- index=index,
- usemine=band(flags,0x0200)~=0,
- round=band(flags,0x0006)~=0,
- base=base,
- reference=reference,
- matrix={ xscale,xrotate,yrotate,yscale,xoffset,yoffset },
- }
- if band(flags,0x0100)~=0 then
- instructions=true
- end
- if band(flags,0x0020)==0 then
- break
- end
- end
- return {
- type="composite",
- components=components,
- }
-end
-function readers.loca(f,fontdata,specification)
- if specification.glyphs then
- local datatable=fontdata.tables.loca
- if datatable then
- local offset=fontdata.tables.glyf.offset
- local format=fontdata.fontheader.indextolocformat
- local profile=fontdata.maximumprofile
- local nofglyphs=profile and profile.nofglyphs
- local locations={}
- setposition(f,datatable.offset)
- if format==1 then
- if not nofglyphs then
- nofglyphs=idiv(datatable.length,4)-1
- end
- for i=0,nofglyphs do
- locations[i]=offset+readulong(f)
- end
- fontdata.nofglyphs=nofglyphs
- else
- if not nofglyphs then
- nofglyphs=idiv(datatable.length,2)-1
- end
- for i=0,nofglyphs do
- locations[i]=offset+readushort(f)*2
- end
- end
- fontdata.nofglyphs=nofglyphs
- fontdata.locations=locations
- end
- end
-end
-function readers.glyf(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"glyf",specification.glyphs)
- if tableoffset then
- local locations=fontdata.locations
- if locations then
- local glyphs=fontdata.glyphs
- local nofglyphs=fontdata.nofglyphs
- local filesize=fontdata.filesize
- local nothing={ 0,0,0,0 }
- local shapes={}
- local loadshapes=specification.shapes or specification.instance or specification.streams
- for index=0,nofglyphs-1 do
- local location=locations[index]
- local length=locations[index+1]-location
- if location>=filesize then
- report("discarding %s glyphs due to glyph location bug",nofglyphs-index+1)
- fontdata.nofglyphs=index-1
- fontdata.badfont=true
- break
- elseif length>0 then
- setposition(f,location)
- local nofcontours=readshort(f)
- glyphs[index].boundingbox={
- readshort(f),
- readshort(f),
- readshort(f),
- readshort(f),
- }
- if not loadshapes then
- elseif nofcontours==0 then
- shapes[index]=readnothing(f)
- elseif nofcontours>0 then
- shapes[index]=readglyph(f,nofcontours)
- else
- shapes[index]=readcomposite(f,nofcontours)
- end
- else
- if loadshapes then
- shapes[index]=readnothing(f)
- end
- glyphs[index].boundingbox=nothing
- end
- end
- if loadshapes then
- if readers.gvar then
- readers.gvar(f,fontdata,specification,glyphs,shapes)
- end
- mergecomposites(glyphs,shapes)
- if specification.instance then
- if specification.streams then
- repackpoints(glyphs,shapes)
- else
- contours2outlines_shaped(glyphs,shapes,specification.shapes)
- end
- elseif specification.shapes then
- if specification.streams then
- repackpoints(glyphs,shapes)
- else
- contours2outlines_normal(glyphs,shapes)
- end
- elseif specification.streams then
- repackpoints(glyphs,shapes)
- end
- end
- end
- end
-end
-local function readtuplerecord(f,nofaxis)
- local record={}
- for i=1,nofaxis do
- record[i]=read2dot14(f)
- end
- return record
-end
-local function readpoints(f)
- local count=readbyte(f)
- if count==0 then
- return nil,0
- else
- if count<128 then
- elseif band(count,0x80)~=0 then
- count=band(count,0x7F)*256+readbyte(f)
- else
- end
- local points={}
- local p=0
- local n=1
- while p0 do
- local control=readbyte(f)
-if not control then
- break
-end
- local allzero=band(control,0x80)~=0
- local runlength=band(control,0x3F)+1
- if allzero then
- z=z+runlength
- else
- local runreader=band(control,0x40)~=0 and readshort or readinteger
- if z>0 then
- for i=1,z do
- p=p+1
- deltas[p]=0
- end
- z=0
- end
- for i=1,runlength do
- p=p+1
- deltas[p]=runreader(f)
- end
- end
- nofpoints=nofpoints-runlength
- end
- if p>0 then
- return deltas
- else
- end
-end
-local function readdeltas(f,nofpoints)
- local deltas={}
- local p=0
- while nofpoints>0 do
- local control=readbyte(f)
- if control then
- local allzero=band(control,0x80)~=0
- local runlength=band(control,0x3F)+1
- if allzero then
- for i=1,runlength do
- p=p+1
- deltas[p]=0
- end
- else
- local runreader=band(control,0x40)~=0 and readshort or readinteger
- for i=1,runlength do
- p=p+1
- deltas[p]=runreader(f)
- end
- end
- nofpoints=nofpoints-runlength
- else
- break
- end
- end
- if p>0 then
- return deltas
- else
- end
-end
-function readers.gvar(f,fontdata,specification,glyphdata,shapedata)
- local instance=specification.instance
- if not instance then
- return
- end
- local factors=specification.factors
- if not factors then
- return
- end
- local tableoffset=gotodatatable(f,fontdata,"gvar",specification.variable or specification.shapes)
- if tableoffset then
- local version=readulong(f)
- local nofaxis=readushort(f)
- local noftuples=readushort(f)
- local tupleoffset=tableoffset+readulong(f)
- local nofglyphs=readushort(f)
- local flags=readushort(f)
- local dataoffset=tableoffset+readulong(f)
- local data={}
- local tuples={}
- local glyphdata=fontdata.glyphs
- local dowidth=not fontdata.variabledata.hvarwidths
- if band(flags,0x0001)~=0 then
- for i=1,nofglyphs+1 do
- data[i]=dataoffset+readulong(f)
- end
- else
- for i=1,nofglyphs+1 do
- data[i]=dataoffset+2*readushort(f)
- end
- end
- if noftuples>0 then
- setposition(f,tupleoffset)
- for i=1,noftuples do
- tuples[i]=readtuplerecord(f,nofaxis)
- end
- end
- local nextoffset=false
- local startoffset=data[1]
- for i=1,nofglyphs do
- nextoffset=data[i+1]
- local glyph=glyphdata[i-1]
- local name=trace_deltas and glyph.name
- if startoffset==nextoffset then
- if name then
- report("no deltas for glyph %a",name)
- end
- else
- local shape=shapedata[i-1]
- if not shape then
- if name then
- report("no shape for glyph %a",name)
- end
- else
- lastoffset=startoffset
- setposition(f,startoffset)
- local flags=readushort(f)
- local count=band(flags,0x0FFF)
- local offset=startoffset+readushort(f)
- local deltas={}
- local allpoints=(shape.nofpoints or 0)
- local shared=false
- local nofshared=0
- if band(flags,0x8000)~=0 then
- local current=getposition(f)
- setposition(f,offset)
- shared,nofshared=readpoints(f)
- offset=getposition(f)
- setposition(f,current)
- end
- for j=1,count do
- local size=readushort(f)
- local flags=readushort(f)
- local index=band(flags,0x0FFF)
- local haspeak=band(flags,0x8000)~=0
- local intermediate=band(flags,0x4000)~=0
- local private=band(flags,0x2000)~=0
- local peak=nil
- local start=nil
- local stop=nil
- local xvalues=nil
- local yvalues=nil
- local points=shared
- local nofpoints=nofshared
- if haspeak then
- peak=readtuplerecord(f,nofaxis)
- else
- if index+1>#tuples then
- report("error, bad tuple index",index)
- end
- peak=tuples[index+1]
- end
- if intermediate then
- start=readtuplerecord(f,nofaxis)
- stop=readtuplerecord(f,nofaxis)
- end
- if size>0 then
- local current=getposition(f)
- setposition(f,offset)
- if private then
- points,nofpoints=readpoints(f)
- end
- if nofpoints==0 then
- nofpoints=allpoints+4
- end
- if nofpoints>0 then
- xvalues=readdeltas(f,nofpoints)
- yvalues=readdeltas(f,nofpoints)
- end
- offset=offset+size
- setposition(f,current)
- end
- if not xvalues and not yvalues then
- points=nil
- end
- local s=1
- for i=1,nofaxis do
- local f=factors[i]
- local peak=peak and peak [i] or 0
- local start=start and start[i] or (peak<0 and peak or 0)
- local stop=stop and stop [i] or (peak>0 and peak or 0)
- if start>peak or peak>stop then
- elseif start<0 and stop>0 and peak~=0 then
- elseif peak==0 then
- elseif fstop then
- s=0
- break
- elseif fpeak then
- s=s*(stop-f)/(stop-peak)
- else
- end
- end
- if s==0 then
- if name then
- report("no deltas applied for glyph %a",name)
- end
- else
- deltas[#deltas+1]={
- factor=s,
- points=points,
- xvalues=xvalues,
- yvalues=yvalues,
- }
- end
- end
- if shape.type=="glyph" then
- applyaxis(glyph,shape,deltas,dowidth)
- else
- shape.deltas=deltas
- end
- end
- end
- startoffset=nextoffset
- end
- end
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-ttf”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-dsp” 5d3db0184c903829b2c5bddcb8cdb14c] ---
-
-if not modules then modules={} end modules ['font-dsp']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local next,type,tonumber=next,type,tonumber
-local band=bit32.band
-local extract=bit32.extract
-local bor=bit32.bor
-local lshift=bit32.lshift
-local rshift=bit32.rshift
-local gsub=string.gsub
-local lower=string.lower
-local sub=string.sub
-local strip=string.strip
-local tohash=table.tohash
-local concat=table.concat
-local copy=table.copy
-local reversed=table.reversed
-local sort=table.sort
-local insert=table.insert
-local round=math.round
-local settings_to_hash=utilities.parsers.settings_to_hash_colon_too
-local setmetatableindex=table.setmetatableindex
-local formatters=string.formatters
-local sortedkeys=table.sortedkeys
-local sortedhash=table.sortedhash
-local sequenced=table.sequenced
-local report=logs.reporter("otf reader")
-local readers=fonts.handlers.otf.readers
-local streamreader=readers.streamreader
-local setposition=streamreader.setposition
-local getposition=streamreader.getposition
-local readuinteger=streamreader.readcardinal1
-local readushort=streamreader.readcardinal2
-local readulong=streamreader.readcardinal4
-local readinteger=streamreader.readinteger1
-local readshort=streamreader.readinteger2
-local readstring=streamreader.readstring
-local readtag=streamreader.readtag
-local readbytes=streamreader.readbytes
-local readfixed=streamreader.readfixed4
-local read2dot14=streamreader.read2dot14
-local skipshort=streamreader.skipshort
-local skipbytes=streamreader.skip
-local readbytetable=streamreader.readbytetable
-local readbyte=streamreader.readbyte
-local readcardinaltable=streamreader.readcardinaltable
-local readintegertable=streamreader.readintegertable
-local readfword=readshort
-local short=2
-local ushort=2
-local ulong=4
-directives.register("fonts.streamreader",function()
- streamreader=utilities.streams
- setposition=streamreader.setposition
- getposition=streamreader.getposition
- readuinteger=streamreader.readcardinal1
- readushort=streamreader.readcardinal2
- readulong=streamreader.readcardinal4
- readinteger=streamreader.readinteger1
- readshort=streamreader.readinteger2
- readstring=streamreader.readstring
- readtag=streamreader.readtag
- readbytes=streamreader.readbytes
- readfixed=streamreader.readfixed4
- read2dot14=streamreader.read2dot14
- skipshort=streamreader.skipshort
- skipbytes=streamreader.skip
- readbytetable=streamreader.readbytetable
- readbyte=streamreader.readbyte
- readcardinaltable=streamreader.readcardinaltable
- readintegertable=streamreader.readintegertable
- readfword=readshort
-end)
-local gsubhandlers={}
-local gposhandlers={}
-readers.gsubhandlers=gsubhandlers
-readers.gposhandlers=gposhandlers
-local helpers=readers.helpers
-local gotodatatable=helpers.gotodatatable
-local setvariabledata=helpers.setvariabledata
-local lookupidoffset=-1
-local classes={
- "base",
- "ligature",
- "mark",
- "component",
-}
-local gsubtypes={
- "single",
- "multiple",
- "alternate",
- "ligature",
- "context",
- "chainedcontext",
- "extension",
- "reversechainedcontextsingle",
-}
-local gpostypes={
- "single",
- "pair",
- "cursive",
- "marktobase",
- "marktoligature",
- "marktomark",
- "context",
- "chainedcontext",
- "extension",
-}
-local chaindirections={
- context=0,
- chainedcontext=1,
- reversechainedcontextsingle=-1,
-}
-local function setmetrics(data,where,tag,d)
- local w=data[where]
- if w then
- local v=w[tag]
- if v then
- w[tag]=v+d
- end
- end
-end
-local variabletags={
- hasc=function(data,d) setmetrics(data,"windowsmetrics","typoascender",d) end,
- hdsc=function(data,d) setmetrics(data,"windowsmetrics","typodescender",d) end,
- hlgp=function(data,d) setmetrics(data,"windowsmetrics","typolinegap",d) end,
- hcla=function(data,d) setmetrics(data,"windowsmetrics","winascent",d) end,
- hcld=function(data,d) setmetrics(data,"windowsmetrics","windescent",d) end,
- vasc=function(data,d) setmetrics(data,"vhea not done","ascent",d) end,
- vdsc=function(data,d) setmetrics(data,"vhea not done","descent",d) end,
- vlgp=function(data,d) setmetrics(data,"vhea not done","linegap",d) end,
- xhgt=function(data,d) setmetrics(data,"windowsmetrics","xheight",d) end,
- cpht=function(data,d) setmetrics(data,"windowsmetrics","capheight",d) end,
- sbxs=function(data,d) setmetrics(data,"windowsmetrics","subscriptxsize",d) end,
- sbys=function(data,d) setmetrics(data,"windowsmetrics","subscriptysize",d) end,
- sbxo=function(data,d) setmetrics(data,"windowsmetrics","subscriptxoffset",d) end,
- sbyo=function(data,d) setmetrics(data,"windowsmetrics","subscriptyoffset",d) end,
- spxs=function(data,d) setmetrics(data,"windowsmetrics","superscriptxsize",d) end,
- spys=function(data,d) setmetrics(data,"windowsmetrics","superscriptysize",d) end,
- spxo=function(data,d) setmetrics(data,"windowsmetrics","superscriptxoffset",d) end,
- spyo=function(data,d) setmetrics(data,"windowsmetrics","superscriptyoffset",d) end,
- strs=function(data,d) setmetrics(data,"windowsmetrics","strikeoutsize",d) end,
- stro=function(data,d) setmetrics(data,"windowsmetrics","strikeoutpos",d) end,
- unds=function(data,d) setmetrics(data,"postscript","underlineposition",d) end,
- undo=function(data,d) setmetrics(data,"postscript","underlinethickness",d) end,
-}
-local read_cardinal={
- streamreader.readcardinal1,
- streamreader.readcardinal2,
- streamreader.readcardinal3,
- streamreader.readcardinal4,
-}
-local read_integer={
- streamreader.readinteger1,
- streamreader.readinteger2,
- streamreader.readinteger3,
- streamreader.readinteger4,
-}
-local lookupnames={
- gsub={
- single="gsub_single",
- multiple="gsub_multiple",
- alternate="gsub_alternate",
- ligature="gsub_ligature",
- context="gsub_context",
- chainedcontext="gsub_contextchain",
- reversechainedcontextsingle="gsub_reversecontextchain",
- },
- gpos={
- single="gpos_single",
- pair="gpos_pair",
- cursive="gpos_cursive",
- marktobase="gpos_mark2base",
- marktoligature="gpos_mark2ligature",
- marktomark="gpos_mark2mark",
- context="gpos_context",
- chainedcontext="gpos_contextchain",
- }
-}
-local lookupflags=setmetatableindex(function(t,k)
- local v={
- band(k,0x0008)~=0 and true or false,
- band(k,0x0004)~=0 and true or false,
- band(k,0x0002)~=0 and true or false,
- band(k,0x0001)~=0 and true or false,
- }
- t[k]=v
- return v
-end)
-local function axistofactors(str)
- local t=settings_to_hash(str)
- for k,v in next,t do
- t[k]=tonumber(v) or v
- end
- return t
-end
-local hash=table.setmetatableindex(function(t,k)
- local v=sequenced(axistofactors(k),",")
- t[k]=v
- return v
-end)
-helpers.normalizedaxishash=hash
-local cleanname=fonts.names and fonts.names.cleanname or function(name)
- return name and (gsub(lower(name),"[^%a%d]","")) or nil
-end
-helpers.cleanname=cleanname
-function helpers.normalizedaxis(str)
- return hash[str] or str
-end
-local function getaxisscale(segments,minimum,default,maximum,user)
- if not minimum or not default or not maximum then
- return false
- end
- if usermaximum then
- user=maximum
- end
- if userdefault then
- default=(user-default)/(maximum-default)
- else
- default=0
- end
- if not segments then
- return default
- end
- local e
- for i=1,#segments do
- local s=segments[i]
- if type(s)~="number" then
- report("using default axis scale")
- return default
- elseif s[1]>=default then
- if s[2]==default then
- return default
- else
- e=i
- break
- end
- end
- end
- if e then
- local b=segments[e-1]
- local e=segments[e]
- return b[2]+(e[2]-b[2])*(default-b[1])/(e[1]-b[1])
- else
- return false
- end
-end
-local function getfactors(data,instancespec)
- if instancespec==true then
- elseif type(instancespec)~="string" or instancespec=="" then
- return
- end
- local variabledata=data.variabledata
- if not variabledata then
- return
- end
- local instances=variabledata.instances
- local axis=variabledata.axis
- local segments=variabledata.segments
- if instances and axis then
- local values
- if instancespec==true then
- values={}
- for i=1,#axis do
- values[i]={
- value=axis[i].default,
- }
- end
- else
- for i=1,#instances do
- local instance=instances[i]
- if cleanname(instance.subfamily)==instancespec then
- values=instance.values
- break
- end
- end
- end
- if values then
- local factors={}
- for i=1,#axis do
- local a=axis[i]
- factors[i]=getaxisscale(segments,a.minimum,a.default,a.maximum,values[i].value)
- end
- return factors
- end
- local values=axistofactors(hash[instancespec] or instancespec)
- if values then
- local factors={}
- for i=1,#axis do
- local a=axis[i]
- local d=a.default
- factors[i]=getaxisscale(segments,a.minimum,d,a.maximum,values[a.name or a.tag] or d)
- end
- return factors
- end
- end
-end
-local function getscales(regions,factors)
- local scales={}
- for i=1,#regions do
- local region=regions[i]
- local s=1
- for j=1,#region do
- local axis=region[j]
- local f=factors[j]
- local start=axis.start
- local peak=axis.peak
- local stop=axis.stop
- if start>peak or peak>stop then
- elseif start<0 and stop>0 and peak~=0 then
- elseif peak==0 then
- elseif fstop then
- s=0
- break
- elseif fpeak then
- s=s*(stop-f)/(stop-peak)
- else
- end
- end
- scales[i]=s
- end
- return scales
-end
-helpers.getaxisscale=getaxisscale
-helpers.getfactors=getfactors
-helpers.getscales=getscales
-helpers.axistofactors=axistofactors
-local function readvariationdata(f,storeoffset,factors)
- local position=getposition(f)
- setposition(f,storeoffset)
- local format=readushort(f)
- local regionoffset=storeoffset+readulong(f)
- local nofdeltadata=readushort(f)
- local deltadata=readcardinaltable(f,nofdeltadata,ulong)
- setposition(f,regionoffset)
- local nofaxis=readushort(f)
- local nofregions=readushort(f)
- local regions={}
- for i=1,nofregions do
- local t={}
- for i=1,nofaxis do
- t[i]={
- start=read2dot14(f),
- peak=read2dot14(f),
- stop=read2dot14(f),
- }
- end
- regions[i]=t
- end
- if factors then
- for i=1,nofdeltadata do
- setposition(f,storeoffset+deltadata[i])
- local nofdeltasets=readushort(f)
- local nofshorts=readushort(f)
- local nofregions=readushort(f)
- local usedregions={}
- local deltas={}
- for i=1,nofregions do
- usedregions[i]=regions[readushort(f)+1]
- end
- for i=1,nofdeltasets do
- local t=readintegertable(f,nofshorts,short)
- for i=nofshorts+1,nofregions do
- t[i]=readinteger(f)
- end
- deltas[i]=t
- end
- deltadata[i]={
- regions=usedregions,
- deltas=deltas,
- scales=factors and getscales(usedregions,factors) or nil,
- }
- end
- end
- setposition(f,position)
- return regions,deltadata
-end
-helpers.readvariationdata=readvariationdata
-local function readcoverage(f,offset,simple)
- setposition(f,offset)
- local coverageformat=readushort(f)
- if coverageformat==1 then
- local nofcoverage=readushort(f)
- if simple then
- if nofcoverage==1 then
- return { readushort(f) }
- elseif nofcoverage==2 then
- return { readushort(f),readushort(f) }
- else
- return readcardinaltable(f,nofcoverage,ushort)
- end
- elseif nofcoverage==1 then
- return { [readushort(f)]=0 }
- elseif nofcoverage==2 then
- return { [readushort(f)]=0,[readushort(f)]=1 }
- else
- local coverage={}
- for i=0,nofcoverage-1 do
- coverage[readushort(f)]=i
- end
- return coverage
- end
- elseif coverageformat==2 then
- local nofranges=readushort(f)
- local coverage={}
- local n=simple and 1 or 0
- for i=1,nofranges do
- local firstindex=readushort(f)
- local lastindex=readushort(f)
- local coverindex=readushort(f)
- if simple then
- for i=firstindex,lastindex do
- coverage[n]=i
- n=n+1
- end
- else
- for i=firstindex,lastindex do
- coverage[i]=n
- n=n+1
- end
- end
- end
- return coverage
- else
- report("unknown coverage format %a ",coverageformat)
- return {}
- end
-end
-local function readclassdef(f,offset,preset)
- setposition(f,offset)
- local classdefformat=readushort(f)
- local classdef={}
- if type(preset)=="number" then
- for k=0,preset-1 do
- classdef[k]=1
- end
- end
- if classdefformat==1 then
- local index=readushort(f)
- local nofclassdef=readushort(f)
- for i=1,nofclassdef do
- classdef[index]=readushort(f)+1
- index=index+1
- end
- elseif classdefformat==2 then
- local nofranges=readushort(f)
- local n=0
- for i=1,nofranges do
- local firstindex=readushort(f)
- local lastindex=readushort(f)
- local class=readushort(f)+1
- for i=firstindex,lastindex do
- classdef[i]=class
- end
- end
- else
- report("unknown classdef format %a ",classdefformat)
- end
- if type(preset)=="table" then
- for k in next,preset do
- if not classdef[k] then
- classdef[k]=1
- end
- end
- end
- return classdef
-end
-local function classtocoverage(defs)
- if defs then
- local list={}
- for index,class in next,defs do
- local c=list[class]
- if c then
- c[#c+1]=index
- else
- list[class]={ index }
- end
- end
- return list
- end
-end
-local skips={ [0]=0,
- 1,
- 1,
- 2,
- 1,
- 2,
- 2,
- 3,
- 2,
- 2,
- 3,
- 2,
- 3,
- 3,
- 4,
-}
-local function readvariation(f,offset)
- local p=getposition(f)
- setposition(f,offset)
- local outer=readushort(f)
- local inner=readushort(f)
- local format=readushort(f)
- setposition(f,p)
- if format==0x8000 then
- return outer,inner
- end
-end
-local function readposition(f,format,mainoffset,getdelta)
- if format==0 then
- return false
- end
- if format==0x04 then
- local h=readshort(f)
- if h==0 then
- return true
- else
- return { 0,0,h,0 }
- end
- end
- if format==0x05 then
- local x=readshort(f)
- local h=readshort(f)
- if x==0 and h==0 then
- return true
- else
- return { x,0,h,0 }
- end
- end
- if format==0x44 then
- local h=readshort(f)
- if getdelta then
- local d=readshort(f)
- if d>0 then
- local outer,inner=readvariation(f,mainoffset+d)
- if outer then
- h=h+getdelta(outer,inner)
- end
- end
- else
- skipshort(f,1)
- end
- if h==0 then
- return true
- else
- return { 0,0,h,0 }
- end
- end
- local x=band(format,0x1)~=0 and readshort(f) or 0
- local y=band(format,0x2)~=0 and readshort(f) or 0
- local h=band(format,0x4)~=0 and readshort(f) or 0
- local v=band(format,0x8)~=0 and readshort(f) or 0
- if format>=0x10 then
- local X=band(format,0x10)~=0 and skipshort(f) or 0
- local Y=band(format,0x20)~=0 and skipshort(f) or 0
- local H=band(format,0x40)~=0 and skipshort(f) or 0
- local V=band(format,0x80)~=0 and skipshort(f) or 0
- local s=skips[extract(format,4,4)]
- if s>0 then
- skipshort(f,s)
- end
- if getdelta then
- if X>0 then
- local outer,inner=readvariation(f,mainoffset+X)
- if outer then
- x=x+getdelta(outer,inner)
- end
- end
- if Y>0 then
- local outer,inner=readvariation(f,mainoffset+Y)
- if outer then
- y=y+getdelta(outer,inner)
- end
- end
- if H>0 then
- local outer,inner=readvariation(f,mainoffset+H)
- if outer then
- h=h+getdelta(outer,inner)
- end
- end
- if V>0 then
- local outer,inner=readvariation(f,mainoffset+V)
- if outer then
- v=v+getdelta(outer,inner)
- end
- end
- end
- return { x,y,h,v }
- elseif x==0 and y==0 and h==0 and v==0 then
- return true
- else
- return { x,y,h,v }
- end
-end
-local function readanchor(f,offset,getdelta)
- if not offset or offset==0 then
- return nil
- end
- setposition(f,offset)
- local format=readshort(f)
- local x=readshort(f)
- local y=readshort(f)
- if format==3 then
- if getdelta then
- local X=readshort(f)
- local Y=readshort(f)
- if X>0 then
- local outer,inner=readvariation(f,offset+X)
- if outer then
- x=x+getdelta(outer,inner)
- end
- end
- if Y>0 then
- local outer,inner=readvariation(f,offset+Y)
- if outer then
- y=y+getdelta(outer,inner)
- end
- end
- else
- skipshort(f,2)
- end
- return { x,y }
- else
- return { x,y }
- end
-end
-local function readfirst(f,offset)
- if offset then
- setposition(f,offset)
- end
- return { readushort(f) }
-end
-function readarray(f,offset)
- if offset then
- setposition(f,offset)
- end
- local n=readushort(f)
- if n==1 then
- return { readushort(f) },1
- elseif n>0 then
- return readcardinaltable(f,n,ushort),n
- end
-end
-local function readcoveragearray(f,offset,t,simple)
- if not t then
- return nil
- end
- local n=#t
- if n==0 then
- return nil
- end
- for i=1,n do
- t[i]=readcoverage(f,offset+t[i],simple)
- end
- return t
-end
-local function covered(subset,all)
- local used,u
- for i=1,#subset do
- local s=subset[i]
- if all[s] then
- if used then
- u=u+1
- used[u]=s
- else
- u=1
- used={ s }
- end
- end
- end
- return used
-end
-local function readlookuparray(f,noflookups,nofcurrent)
- local lookups={}
- if noflookups>0 then
- local length=0
- for i=1,noflookups do
- local index=readushort(f)+1
- if index>length then
- length=index
- end
- local lookup=readushort(f)+1
- local list=lookups[index]
- if list then
- list[#list+1]=lookup
- else
- lookups[index]={ lookup }
- end
- end
- for index=1,length do
- if not lookups[index] then
- lookups[index]=false
- end
- end
- end
- return lookups
-end
-local function unchainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,what)
- local tableoffset=lookupoffset+offset
- setposition(f,tableoffset)
- local subtype=readushort(f)
- if subtype==1 then
- local coverage=readushort(f)
- local subclasssets=readarray(f)
- local rules={}
- if subclasssets then
- coverage=readcoverage(f,tableoffset+coverage,true)
- for i=1,#subclasssets do
- local offset=subclasssets[i]
- if offset>0 then
- local firstcoverage=coverage[i]
- local rulesoffset=tableoffset+offset
- local subclassrules=readarray(f,rulesoffset)
- for rule=1,#subclassrules do
- setposition(f,rulesoffset+subclassrules[rule])
- local nofcurrent=readushort(f)
- local noflookups=readushort(f)
- local current={ { firstcoverage } }
- for i=2,nofcurrent do
- current[i]={ readushort(f) }
- end
- local lookups=readlookuparray(f,noflookups,nofcurrent)
- rules[#rules+1]={
- current=current,
- lookups=lookups
- }
- end
- end
- end
- else
- report("empty subclassset in %a subtype %i","unchainedcontext",subtype)
- end
- return {
- format="glyphs",
- rules=rules,
- }
- elseif subtype==2 then
- local coverage=readushort(f)
- local currentclassdef=readushort(f)
- local subclasssets=readarray(f)
- local rules={}
- if subclasssets then
- coverage=readcoverage(f,tableoffset+coverage)
- currentclassdef=readclassdef(f,tableoffset+currentclassdef,coverage)
- local currentclasses=classtocoverage(currentclassdef,fontdata.glyphs)
- for class=1,#subclasssets do
- local offset=subclasssets[class]
- if offset>0 then
- local firstcoverage=currentclasses[class]
- if firstcoverage then
- firstcoverage=covered(firstcoverage,coverage)
- if firstcoverage then
- local rulesoffset=tableoffset+offset
- local subclassrules=readarray(f,rulesoffset)
- for rule=1,#subclassrules do
- setposition(f,rulesoffset+subclassrules[rule])
- local nofcurrent=readushort(f)
- local noflookups=readushort(f)
- local current={ firstcoverage }
- for i=2,nofcurrent do
- current[i]=currentclasses[readushort(f)+1]
- end
- local lookups=readlookuparray(f,noflookups,nofcurrent)
- rules[#rules+1]={
- current=current,
- lookups=lookups
- }
- end
- else
- report("no coverage")
- end
- else
- report("no coverage class")
- end
- end
- end
- else
- report("empty subclassset in %a subtype %i","unchainedcontext",subtype)
- end
- return {
- format="class",
- rules=rules,
- }
- elseif subtype==3 then
- local nofglyphs=readushort(f)
- local noflookups=readushort(f)
- local current=readcardinaltable(f,nofglyphs,ushort)
- local lookups=readlookuparray(f,noflookups,#current)
- current=readcoveragearray(f,tableoffset,current,true)
- return {
- format="coverage",
- rules={
- {
- current=current,
- lookups=lookups,
- }
- }
- }
- else
- report("unsupported subtype %a in %a %s",subtype,"unchainedcontext",what)
- end
-end
-local function chainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,what)
- local tableoffset=lookupoffset+offset
- setposition(f,tableoffset)
- local subtype=readushort(f)
- if subtype==1 then
- local coverage=readushort(f)
- local subclasssets=readarray(f)
- local rules={}
- if subclasssets then
- coverage=readcoverage(f,tableoffset+coverage,true)
- for i=1,#subclasssets do
- local offset=subclasssets[i]
- if offset>0 then
- local firstcoverage=coverage[i]
- local rulesoffset=tableoffset+offset
- local subclassrules=readarray(f,rulesoffset)
- for rule=1,#subclassrules do
- setposition(f,rulesoffset+subclassrules[rule])
- local nofbefore=readushort(f)
- local before
- if nofbefore>0 then
- before={}
- for i=1,nofbefore do
- before[i]={ readushort(f) }
- end
- end
- local nofcurrent=readushort(f)
- local current={ { firstcoverage } }
- for i=2,nofcurrent do
- current[i]={ readushort(f) }
- end
- local nofafter=readushort(f)
- local after
- if nofafter>0 then
- after={}
- for i=1,nofafter do
- after[i]={ readushort(f) }
- end
- end
- local noflookups=readushort(f)
- local lookups=readlookuparray(f,noflookups,nofcurrent)
- rules[#rules+1]={
- before=before,
- current=current,
- after=after,
- lookups=lookups,
- }
- end
- end
- end
- else
- report("empty subclassset in %a subtype %i","chainedcontext",subtype)
- end
- return {
- format="glyphs",
- rules=rules,
- }
- elseif subtype==2 then
- local coverage=readushort(f)
- local beforeclassdef=readushort(f)
- local currentclassdef=readushort(f)
- local afterclassdef=readushort(f)
- local subclasssets=readarray(f)
- local rules={}
- if subclasssets then
- local coverage=readcoverage(f,tableoffset+coverage)
- local beforeclassdef=readclassdef(f,tableoffset+beforeclassdef,nofglyphs)
- local currentclassdef=readclassdef(f,tableoffset+currentclassdef,coverage)
- local afterclassdef=readclassdef(f,tableoffset+afterclassdef,nofglyphs)
- local beforeclasses=classtocoverage(beforeclassdef,fontdata.glyphs)
- local currentclasses=classtocoverage(currentclassdef,fontdata.glyphs)
- local afterclasses=classtocoverage(afterclassdef,fontdata.glyphs)
- for class=1,#subclasssets do
- local offset=subclasssets[class]
- if offset>0 then
- local firstcoverage=currentclasses[class]
- if firstcoverage then
- firstcoverage=covered(firstcoverage,coverage)
- if firstcoverage then
- local rulesoffset=tableoffset+offset
- local subclassrules=readarray(f,rulesoffset)
- for rule=1,#subclassrules do
- setposition(f,rulesoffset+subclassrules[rule])
- local nofbefore=readushort(f)
- local before
- if nofbefore>0 then
- before={}
- for i=1,nofbefore do
- before[i]=beforeclasses[readushort(f)+1]
- end
- end
- local nofcurrent=readushort(f)
- local current={ firstcoverage }
- for i=2,nofcurrent do
- current[i]=currentclasses[readushort(f)+1]
- end
- local nofafter=readushort(f)
- local after
- if nofafter>0 then
- after={}
- for i=1,nofafter do
- after[i]=afterclasses[readushort(f)+1]
- end
- end
- local noflookups=readushort(f)
- local lookups=readlookuparray(f,noflookups,nofcurrent)
- rules[#rules+1]={
- before=before,
- current=current,
- after=after,
- lookups=lookups,
- }
- end
- else
- report("no coverage")
- end
- else
- report("class is not covered")
- end
- end
- end
- else
- report("empty subclassset in %a subtype %i","chainedcontext",subtype)
- end
- return {
- format="class",
- rules=rules,
- }
- elseif subtype==3 then
- local before=readarray(f)
- local current=readarray(f)
- local after=readarray(f)
- local noflookups=readushort(f)
- local lookups=readlookuparray(f,noflookups,#current)
- before=readcoveragearray(f,tableoffset,before,true)
- current=readcoveragearray(f,tableoffset,current,true)
- after=readcoveragearray(f,tableoffset,after,true)
- return {
- format="coverage",
- rules={
- {
- before=before,
- current=current,
- after=after,
- lookups=lookups,
- }
- }
- }
- else
- report("unsupported subtype %a in %a %s",subtype,"chainedcontext",what)
- end
-end
-local function extension(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,types,handlers,what)
- local tableoffset=lookupoffset+offset
- setposition(f,tableoffset)
- local subtype=readushort(f)
- if subtype==1 then
- local lookuptype=types[readushort(f)]
- local faroffset=readulong(f)
- local handler=handlers[lookuptype]
- if handler then
- return handler(f,fontdata,lookupid,tableoffset+faroffset,0,glyphs,nofglyphs),lookuptype
- else
- report("no handler for lookuptype %a subtype %a in %s %s",lookuptype,subtype,what,"extension")
- end
- else
- report("unsupported subtype %a in %s %s",subtype,what,"extension")
- end
-end
-function gsubhandlers.single(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- local tableoffset=lookupoffset+offset
- setposition(f,tableoffset)
- local subtype=readushort(f)
- if subtype==1 then
- local coverage=readushort(f)
- local delta=readshort(f)
- local coverage=readcoverage(f,tableoffset+coverage)
- for index in next,coverage do
- local newindex=(index+delta)%65536
- if index>nofglyphs or newindex>nofglyphs then
- report("invalid index in %s format %i: %i -> %i (max %i)","single",subtype,index,newindex,nofglyphs)
- coverage[index]=nil
- else
- coverage[index]=newindex
- end
- end
- return {
- coverage=coverage
- }
- elseif subtype==2 then
- local coverage=readushort(f)
- local nofreplacements=readushort(f)
- local replacements=readcardinaltable(f,nofreplacements,ushort)
- local coverage=readcoverage(f,tableoffset+coverage)
- for index,newindex in next,coverage do
- newindex=newindex+1
- if index>nofglyphs or newindex>nofglyphs then
- report("invalid index in %s format %i: %i -> %i (max %i)","single",subtype,index,newindex,nofglyphs)
- coverage[index]=nil
- else
- coverage[index]=replacements[newindex]
- end
- end
- return {
- coverage=coverage
- }
- else
- report("unsupported subtype %a in %a substitution",subtype,"single")
- end
-end
-local function sethandler(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,what)
- local tableoffset=lookupoffset+offset
- setposition(f,tableoffset)
- local subtype=readushort(f)
- if subtype==1 then
- local coverage=readushort(f)
- local nofsequence=readushort(f)
- local sequences=readcardinaltable(f,nofsequence,ushort)
- for i=1,nofsequence do
- setposition(f,tableoffset+sequences[i])
- sequences[i]=readcardinaltable(f,readushort(f),ushort)
- end
- local coverage=readcoverage(f,tableoffset+coverage)
- for index,newindex in next,coverage do
- newindex=newindex+1
- if index>nofglyphs or newindex>nofglyphs then
- report("invalid index in %s format %i: %i -> %i (max %i)",what,subtype,index,newindex,nofglyphs)
- coverage[index]=nil
- else
- coverage[index]=sequences[newindex]
- end
- end
- return {
- coverage=coverage
- }
- else
- report("unsupported subtype %a in %a substitution",subtype,what)
- end
-end
-function gsubhandlers.multiple(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- return sethandler(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,"multiple")
-end
-function gsubhandlers.alternate(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- return sethandler(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,"alternate")
-end
-function gsubhandlers.ligature(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- local tableoffset=lookupoffset+offset
- setposition(f,tableoffset)
- local subtype=readushort(f)
- if subtype==1 then
- local coverage=readushort(f)
- local nofsets=readushort(f)
- local ligatures=readcardinaltable(f,nofsets,ushort)
- for i=1,nofsets do
- local offset=lookupoffset+offset+ligatures[i]
- setposition(f,offset)
- local n=readushort(f)
- if n==1 then
- ligatures[i]={ offset+readushort(f) }
- else
- local l={}
- for i=1,n do
- l[i]=offset+readushort(f)
- end
- ligatures[i]=l
- end
- end
- local coverage=readcoverage(f,tableoffset+coverage)
- for index,newindex in next,coverage do
- local hash={}
- local ligatures=ligatures[newindex+1]
- for i=1,#ligatures do
- local offset=ligatures[i]
- setposition(f,offset)
- local lig=readushort(f)
- local cnt=readushort(f)
- local hsh=hash
- for i=2,cnt do
- local c=readushort(f)
- local h=hsh[c]
- if not h then
- h={}
- hsh[c]=h
- end
- hsh=h
- end
- hsh.ligature=lig
- end
- coverage[index]=hash
- end
- return {
- coverage=coverage
- }
- else
- report("unsupported subtype %a in %a substitution",subtype,"ligature")
- end
-end
-function gsubhandlers.context(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- return unchainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,"substitution"),"context"
-end
-function gsubhandlers.chainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- return chainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,"substitution"),"chainedcontext"
-end
-function gsubhandlers.extension(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- return extension(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,gsubtypes,gsubhandlers,"substitution")
-end
-function gsubhandlers.reversechainedcontextsingle(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- local tableoffset=lookupoffset+offset
- setposition(f,tableoffset)
- local subtype=readushort(f)
- if subtype==1 then
- local current=readfirst(f)
- local before=readarray(f)
- local after=readarray(f)
- local replacements=readarray(f)
- current=readcoveragearray(f,tableoffset,current,true)
- before=readcoveragearray(f,tableoffset,before,true)
- after=readcoveragearray(f,tableoffset,after,true)
- return {
- format="reversecoverage",
- rules={
- {
- before=before,
- current=current,
- after=after,
- replacements=replacements,
- }
- }
- },"reversechainedcontextsingle"
- else
- report("unsupported subtype %a in %a substitution",subtype,"reversechainedcontextsingle")
- end
-end
-local function readpairsets(f,tableoffset,sets,format1,format2,mainoffset,getdelta)
- local done={}
- for i=1,#sets do
- local offset=sets[i]
- local reused=done[offset]
- if not reused then
- offset=tableoffset+offset
- setposition(f,offset)
- local n=readushort(f)
- reused={}
- for i=1,n do
- reused[i]={
- readushort(f),
- readposition(f,format1,offset,getdelta),
- readposition(f,format2,offset,getdelta),
- }
- end
- done[offset]=reused
- end
- sets[i]=reused
- end
- return sets
-end
-local function readpairclasssets(f,nofclasses1,nofclasses2,format1,format2,mainoffset,getdelta)
- local classlist1={}
- for i=1,nofclasses1 do
- local classlist2={}
- classlist1[i]=classlist2
- for j=1,nofclasses2 do
- local one=readposition(f,format1,mainoffset,getdelta)
- local two=readposition(f,format2,mainoffset,getdelta)
- if one or two then
- classlist2[j]={ one,two }
- else
- classlist2[j]=false
- end
- end
- end
- return classlist1
-end
-function gposhandlers.single(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- local tableoffset=lookupoffset+offset
- setposition(f,tableoffset)
- local subtype=readushort(f)
- local getdelta=fontdata.temporary.getdelta
- if subtype==1 then
- local coverage=readushort(f)
- local format=readushort(f)
- local value=readposition(f,format,tableoffset,getdelta)
- local coverage=readcoverage(f,tableoffset+coverage)
- for index,newindex in next,coverage do
- coverage[index]=value
- end
- return {
- format="single",
- coverage=coverage,
- }
- elseif subtype==2 then
- local coverage=readushort(f)
- local format=readushort(f)
- local nofvalues=readushort(f)
- local values={}
- for i=1,nofvalues do
- values[i]=readposition(f,format,tableoffset,getdelta)
- end
- local coverage=readcoverage(f,tableoffset+coverage)
- for index,newindex in next,coverage do
- coverage[index]=values[newindex+1]
- end
- return {
- format="single",
- coverage=coverage,
- }
- else
- report("unsupported subtype %a in %a positioning",subtype,"single")
- end
-end
-function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- local tableoffset=lookupoffset+offset
- setposition(f,tableoffset)
- local subtype=readushort(f)
- local getdelta=fontdata.temporary.getdelta
- if subtype==1 then
- local coverage=readushort(f)
- local format1=readushort(f)
- local format2=readushort(f)
- local sets=readarray(f)
- sets=readpairsets(f,tableoffset,sets,format1,format2,mainoffset,getdelta)
- coverage=readcoverage(f,tableoffset+coverage)
- local shared={}
- for index,newindex in next,coverage do
- local set=sets[newindex+1]
- local hash={}
- for i=1,#set do
- local value=set[i]
- if value then
- local other=value[1]
- local share=shared[value]
- if share==nil then
- local first=value[2]
- local second=value[3]
- if first or second then
- share={ first,second or nil }
- else
- share=false
- end
- shared[value]=share
- end
- hash[other]=share or nil
- end
- end
- coverage[index]=hash
- end
- return {
- shared=shared and true or nil,
- format="pair",
- coverage=coverage,
- }
- elseif subtype==2 then
- local coverage=readushort(f)
- local format1=readushort(f)
- local format2=readushort(f)
- local classdef1=readushort(f)
- local classdef2=readushort(f)
- local nofclasses1=readushort(f)
- local nofclasses2=readushort(f)
- local classlist=readpairclasssets(f,nofclasses1,nofclasses2,format1,format2,tableoffset,getdelta)
- coverage=readcoverage(f,tableoffset+coverage)
- classdef1=readclassdef(f,tableoffset+classdef1,coverage)
- classdef2=readclassdef(f,tableoffset+classdef2,nofglyphs)
- local usedcoverage={}
- local shared={}
- for g1,c1 in next,classdef1 do
- if coverage[g1] then
- local l1=classlist[c1]
- if l1 then
- local hash={}
- for paired,class in next,classdef2 do
- local offsets=l1[class]
- if offsets then
- local first=offsets[1]
- local second=offsets[2]
- if first or second then
- local s1=shared[first]
- if s1==nil then
- s1={}
- shared[first]=s1
- end
- local s2=s1[second]
- if s2==nil then
- s2={ first,second or nil }
- s1[second]=s2
- end
- hash[paired]=s2
- end
- end
- end
- usedcoverage[g1]=hash
- end
- end
- end
- return {
- shared=shared and true or nil,
- format="pair",
- coverage=usedcoverage,
- }
- elseif subtype==3 then
- report("yet unsupported subtype %a in %a positioning",subtype,"pair")
- else
- report("unsupported subtype %a in %a positioning",subtype,"pair")
- end
-end
-function gposhandlers.cursive(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- local tableoffset=lookupoffset+offset
- setposition(f,tableoffset)
- local subtype=readushort(f)
- local getdelta=fontdata.temporary.getdelta
- if subtype==1 then
- local coverage=tableoffset+readushort(f)
- local nofrecords=readushort(f)
- local records={}
- for i=1,nofrecords do
- local entry=readushort(f)
- local exit=readushort(f)
- records[i]={
- entry~=0 and (tableoffset+entry) or false,
- exit~=0 and (tableoffset+exit ) or nil,
- }
- end
- local cc=(fontdata.temporary.cursivecount or 0)+1
- fontdata.temporary.cursivecount=cc
- cc="cc-"..cc
- coverage=readcoverage(f,coverage)
- for i=1,nofrecords do
- local r=records[i]
- records[i]={
- cc,
- readanchor(f,r[1],getdelta) or false,
- readanchor(f,r[2],getdelta) or nil,
- }
- end
- for index,newindex in next,coverage do
- coverage[index]=records[newindex+1]
- end
- return {
- coverage=coverage,
- }
- else
- report("unsupported subtype %a in %a positioning",subtype,"cursive")
- end
-end
-local function handlemark(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,ligature)
- local tableoffset=lookupoffset+offset
- setposition(f,tableoffset)
- local subtype=readushort(f)
- local getdelta=fontdata.temporary.getdelta
- if subtype==1 then
- local markcoverage=tableoffset+readushort(f)
- local basecoverage=tableoffset+readushort(f)
- local nofclasses=readushort(f)
- local markoffset=tableoffset+readushort(f)
- local baseoffset=tableoffset+readushort(f)
- local markcoverage=readcoverage(f,markcoverage)
- local basecoverage=readcoverage(f,basecoverage,true)
- setposition(f,markoffset)
- local markclasses={}
- local nofmarkclasses=readushort(f)
- local lastanchor=fontdata.lastanchor or 0
- local usedanchors={}
- for i=1,nofmarkclasses do
- local class=readushort(f)+1
- local offset=readushort(f)
- if offset==0 then
- markclasses[i]=false
- else
- markclasses[i]={ class,markoffset+offset }
- end
- usedanchors[class]=true
- end
- for i=1,nofmarkclasses do
- local mc=markclasses[i]
- if mc then
- mc[2]=readanchor(f,mc[2],getdelta)
- end
- end
- setposition(f,baseoffset)
- local nofbaserecords=readushort(f)
- local baserecords={}
- if ligature then
- for i=1,nofbaserecords do
- local offset=readushort(f)
- if offset==0 then
- baserecords[i]=false
- else
- baserecords[i]=baseoffset+offset
- end
- end
- for i=1,nofbaserecords do
- local recordoffset=baserecords[i]
- if recordoffset then
- setposition(f,recordoffset)
- local nofcomponents=readushort(f)
- local components={}
- for i=1,nofcomponents do
- local classes={}
- for i=1,nofclasses do
- local offset=readushort(f)
- if offset~=0 then
- classes[i]=recordoffset+offset
- else
- classes[i]=false
- end
- end
- components[i]=classes
- end
- baserecords[i]=components
- end
- end
- local baseclasses={}
- for i=1,nofclasses do
- baseclasses[i]={}
- end
- for i=1,nofbaserecords do
- local components=baserecords[i]
- if components then
- local b=basecoverage[i]
- for c=1,#components do
- local classes=components[c]
- if classes then
- for i=1,nofclasses do
- local anchor=readanchor(f,classes[i],getdelta)
- local bclass=baseclasses[i]
- local bentry=bclass[b]
- if bentry then
- bentry[c]=anchor
- else
- bclass[b]={ [c]=anchor }
- end
- end
- end
- end
- end
- end
- for index,newindex in next,markcoverage do
- markcoverage[index]=markclasses[newindex+1] or nil
- end
- return {
- format="ligature",
- baseclasses=baseclasses,
- coverage=markcoverage,
- }
- else
- for i=1,nofbaserecords do
- local r={}
- for j=1,nofclasses do
- local offset=readushort(f)
- if offset==0 then
- r[j]=false
- else
- r[j]=baseoffset+offset
- end
- end
- baserecords[i]=r
- end
- local baseclasses={}
- for i=1,nofclasses do
- baseclasses[i]={}
- end
- for i=1,nofbaserecords do
- local r=baserecords[i]
- local b=basecoverage[i]
- for j=1,nofclasses do
- baseclasses[j][b]=readanchor(f,r[j],getdelta)
- end
- end
- for index,newindex in next,markcoverage do
- markcoverage[index]=markclasses[newindex+1] or nil
- end
- return {
- format="base",
- baseclasses=baseclasses,
- coverage=markcoverage,
- }
- end
- else
- report("unsupported subtype %a in",subtype)
- end
-end
-function gposhandlers.marktobase(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- return handlemark(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
-end
-function gposhandlers.marktoligature(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- return handlemark(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,true)
-end
-function gposhandlers.marktomark(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- return handlemark(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
-end
-function gposhandlers.context(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- return unchainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,"positioning"),"context"
-end
-function gposhandlers.chainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- return chainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,"positioning"),"chainedcontext"
-end
-function gposhandlers.extension(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
- return extension(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,gpostypes,gposhandlers,"positioning")
-end
-do
- local plugins={}
- function plugins.size(f,fontdata,tableoffset,feature)
- if fontdata.designsize then
- else
- local function check(offset)
- setposition(f,offset)
- local designsize=readushort(f)
- if designsize>0 then
- local fontstyleid=readushort(f)
- local guimenuid=readushort(f)
- local minsize=readushort(f)
- local maxsize=readushort(f)
- if minsize==0 and maxsize==0 and fontstyleid==0 and guimenuid==0 then
- minsize=designsize
- maxsize=designsize
- end
- if designsize>=minsize and designsize<=maxsize then
- return minsize,maxsize,designsize
- end
- end
- end
- local minsize,maxsize,designsize=check(tableoffset+feature.offset+feature.parameters)
- if not designsize then
- minsize,maxsize,designsize=check(tableoffset+feature.parameters)
- if designsize then
- report("bad size feature in %a, falling back to wrong offset",fontdata.filename or "?")
- else
- report("bad size feature in %a,",fontdata.filename or "?")
- end
- end
- if designsize then
- fontdata.minsize=minsize
- fontdata.maxsize=maxsize
- fontdata.designsize=designsize
- end
- end
- end
- local function reorderfeatures(fontdata,scripts,features)
- local scriptlangs={}
- local featurehash={}
- local featureorder={}
- for script,languages in next,scripts do
- for language,record in next,languages do
- local hash={}
- local list=record.featureindices
- for k=1,#list do
- local index=list[k]
- local feature=features[index]
- local lookups=feature.lookups
- local tag=feature.tag
- if tag then
- hash[tag]=true
- end
- if lookups then
- for i=1,#lookups do
- local lookup=lookups[i]
- local o=featureorder[lookup]
- if o then
- local okay=true
- for i=1,#o do
- if o[i]==tag then
- okay=false
- break
- end
- end
- if okay then
- o[#o+1]=tag
- end
- else
- featureorder[lookup]={ tag }
- end
- local f=featurehash[lookup]
- if f then
- local h=f[tag]
- if h then
- local s=h[script]
- if s then
- s[language]=true
- else
- h[script]={ [language]=true }
- end
- else
- f[tag]={ [script]={ [language]=true } }
- end
- else
- featurehash[lookup]={ [tag]={ [script]={ [language]=true } } }
- end
- local h=scriptlangs[tag]
- if h then
- local s=h[script]
- if s then
- s[language]=true
- else
- h[script]={ [language]=true }
- end
- else
- scriptlangs[tag]={ [script]={ [language]=true } }
- end
- end
- end
- end
- end
- end
- return scriptlangs,featurehash,featureorder
- end
- local function readscriplan(f,fontdata,scriptoffset)
- setposition(f,scriptoffset)
- local nofscripts=readushort(f)
- local scripts={}
- for i=1,nofscripts do
- scripts[readtag(f)]=scriptoffset+readushort(f)
- end
- local languagesystems=setmetatableindex("table")
- for script,offset in next,scripts do
- setposition(f,offset)
- local defaultoffset=readushort(f)
- local noflanguages=readushort(f)
- local languages={}
- if defaultoffset>0 then
- languages.dflt=languagesystems[offset+defaultoffset]
- end
- for i=1,noflanguages do
- local language=readtag(f)
- local offset=offset+readushort(f)
- languages[language]=languagesystems[offset]
- end
- scripts[script]=languages
- end
- for offset,usedfeatures in next,languagesystems do
- if offset>0 then
- setposition(f,offset)
- local featureindices={}
- usedfeatures.featureindices=featureindices
- usedfeatures.lookuporder=readushort(f)
- usedfeatures.requiredindex=readushort(f)
- local noffeatures=readushort(f)
- for i=1,noffeatures do
- featureindices[i]=readushort(f)+1
- end
- end
- end
- return scripts
- end
- local function readfeatures(f,fontdata,featureoffset)
- setposition(f,featureoffset)
- local features={}
- local noffeatures=readushort(f)
- for i=1,noffeatures do
- features[i]={
- tag=readtag(f),
- offset=readushort(f)
- }
- end
- for i=1,noffeatures do
- local feature=features[i]
- local offset=featureoffset+feature.offset
- setposition(f,offset)
- local parameters=readushort(f)
- local noflookups=readushort(f)
- if noflookups>0 then
- local lookups=readcardinaltable(f,noflookups,ushort)
- feature.lookups=lookups
- for j=1,noflookups do
- lookups[j]=lookups[j]+1
- end
- end
- if parameters>0 then
- feature.parameters=parameters
- local plugin=plugins[feature.tag]
- if plugin then
- plugin(f,fontdata,featureoffset,feature)
- end
- end
- end
- return features
- end
- local function readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder)
- setposition(f,lookupoffset)
- local noflookups=readushort(f)
- local lookups=readcardinaltable(f,noflookups,ushort)
- for lookupid=1,noflookups do
- local offset=lookups[lookupid]
- setposition(f,lookupoffset+offset)
- local subtables={}
- local typebits=readushort(f)
- local flagbits=readushort(f)
- local lookuptype=lookuptypes[typebits]
- local lookupflags=lookupflags[flagbits]
- local nofsubtables=readushort(f)
- for j=1,nofsubtables do
- subtables[j]=offset+readushort(f)
- end
- local markclass=band(flagbits,0x0010)~=0
- if markclass then
- markclass=readushort(f)
- end
- local markset=rshift(flagbits,8)
- if markset>0 then
- markclass=markset
- end
- lookups[lookupid]={
- type=lookuptype,
- flags=lookupflags,
- name=lookupid,
- subtables=subtables,
- markclass=markclass,
- features=featurehash[lookupid],
- order=featureorder[lookupid],
- }
- end
- return lookups
- end
- local f_lookupname=formatters["%s_%s_%s"]
- local function resolvelookups(f,lookupoffset,fontdata,lookups,lookuptypes,lookuphandlers,what,tableoffset)
- local sequences=fontdata.sequences or {}
- local sublookuplist=fontdata.sublookups or {}
- fontdata.sequences=sequences
- fontdata.sublookups=sublookuplist
- local nofsublookups=#sublookuplist
- local nofsequences=#sequences
- local lastsublookup=nofsublookups
- local lastsequence=nofsequences
- local lookupnames=lookupnames[what]
- local sublookuphash={}
- local sublookupcheck={}
- local glyphs=fontdata.glyphs
- local nofglyphs=fontdata.nofglyphs or #glyphs
- local noflookups=#lookups
- local lookupprefix=sub(what,2,2)
- local usedlookups=false
- for lookupid=1,noflookups do
- local lookup=lookups[lookupid]
- local lookuptype=lookup.type
- local subtables=lookup.subtables
- local features=lookup.features
- local handler=lookuphandlers[lookuptype]
- if handler then
- local nofsubtables=#subtables
- local order=lookup.order
- local flags=lookup.flags
- if flags[1] then flags[1]="mark" end
- if flags[2] then flags[2]="ligature" end
- if flags[3] then flags[3]="base" end
- local markclass=lookup.markclass
- if nofsubtables>0 then
- local steps={}
- local nofsteps=0
- local oldtype=nil
- for s=1,nofsubtables do
- local step,lt=handler(f,fontdata,lookupid,lookupoffset,subtables[s],glyphs,nofglyphs)
- if lt then
- lookuptype=lt
- if oldtype and lt~=oldtype then
- report("messy %s lookup type %a and %a",what,lookuptype,oldtype)
- end
- oldtype=lookuptype
- end
- if not step then
- report("unsupported %s lookup type %a",what,lookuptype)
- else
- nofsteps=nofsteps+1
- steps[nofsteps]=step
- local rules=step.rules
- if rules then
- for i=1,#rules do
- local rule=rules[i]
- local before=rule.before
- local current=rule.current
- local after=rule.after
- local replacements=rule.replacements
- if before then
- for i=1,#before do
- before[i]=tohash(before[i])
- end
- rule.before=reversed(before)
- end
- if current then
- if replacements then
- local first=current[1]
- local hash={}
- local repl={}
- for i=1,#first do
- local c=first[i]
- hash[c]=true
- repl[c]=replacements[i]
- end
- rule.current={ hash }
- rule.replacements=repl
- else
- for i=1,#current do
- current[i]=tohash(current[i])
- end
- end
- else
- end
- if after then
- for i=1,#after do
- after[i]=tohash(after[i])
- end
- end
- if usedlookups then
- local lookups=rule.lookups
- if lookups then
- for k,v in next,lookups do
- if v then
- for k,v in next,v do
- usedlookups[v]=usedlookups[v]+1
- end
- end
- end
- end
- end
- end
- end
- end
- end
- if nofsteps~=nofsubtables then
- report("bogus subtables removed in %s lookup type %a",what,lookuptype)
- end
- lookuptype=lookupnames[lookuptype] or lookuptype
- if features then
- nofsequences=nofsequences+1
- local l={
- index=nofsequences,
- name=f_lookupname(lookupprefix,"s",lookupid+lookupidoffset),
- steps=steps,
- nofsteps=nofsteps,
- type=lookuptype,
- markclass=markclass or nil,
- flags=flags,
- order=order,
- features=features,
- }
- sequences[nofsequences]=l
- lookup.done=l
- else
- nofsublookups=nofsublookups+1
- local l={
- index=nofsublookups,
- name=f_lookupname(lookupprefix,"l",lookupid+lookupidoffset),
- steps=steps,
- nofsteps=nofsteps,
- type=lookuptype,
- markclass=markclass or nil,
- flags=flags,
- }
- sublookuplist[nofsublookups]=l
- sublookuphash[lookupid]=nofsublookups
- sublookupcheck[lookupid]=0
- lookup.done=l
- end
- else
- report("no subtables for lookup %a",lookupid)
- end
- else
- report("no handler for lookup %a with type %a",lookupid,lookuptype)
- end
- end
- if usedlookups then
- report("used %s lookups: % t",what,sortedkeys(usedlookups))
- end
- local reported={}
- local function report_issue(i,what,sequence,kind)
- local name=sequence.name
- if not reported[name] then
- report("rule %i in %s lookup %a has %s lookups",i,what,name,kind)
- reported[name]=true
- end
- end
- for i=lastsequence+1,nofsequences do
- local sequence=sequences[i]
- local steps=sequence.steps
- for i=1,#steps do
- local step=steps[i]
- local rules=step.rules
- if rules then
- for i=1,#rules do
- local rule=rules[i]
- local rlookups=rule.lookups
- if not rlookups then
- report_issue(i,what,sequence,"no")
- elseif not next(rlookups) then
- rule.lookups=nil
- else
- local length=#rlookups
- for index=1,length do
- local lookuplist=rlookups[index]
- if lookuplist then
- local length=#lookuplist
- local found={}
- local noffound=0
- for index=1,length do
- local lookupid=lookuplist[index]
- if lookupid then
- local h=sublookuphash[lookupid]
- if not h then
- local lookup=lookups[lookupid]
- if lookup then
- local d=lookup.done
- if d then
- nofsublookups=nofsublookups+1
- local l={
- index=nofsublookups,
- name=f_lookupname(lookupprefix,"d",lookupid+lookupidoffset),
- derived=true,
- steps=d.steps,
- nofsteps=d.nofsteps,
- type=d.lookuptype or "gsub_single",
- markclass=d.markclass or nil,
- flags=d.flags,
- }
- sublookuplist[nofsublookups]=copy(l)
- sublookuphash[lookupid]=nofsublookups
- sublookupcheck[lookupid]=1
- h=nofsublookups
- else
- report_issue(i,what,sequence,"missing")
- rule.lookups=nil
- break
- end
- else
- report_issue(i,what,sequence,"bad")
- rule.lookups=nil
- break
- end
- else
- sublookupcheck[lookupid]=sublookupcheck[lookupid]+1
- end
- if h then
- noffound=noffound+1
- found[noffound]=h
- end
- end
- end
- rlookups[index]=noffound>0 and found or false
- else
- rlookups[index]=false
- end
- end
- end
- end
- end
- end
- end
- for i,n in sortedhash(sublookupcheck) do
- local l=lookups[i]
- local t=l.type
- if n==0 and t~="extension" then
- local d=l.done
- report("%s lookup %s of type %a is not used",what,d and d.name or l.name,t)
- end
- end
- end
- local function loadvariations(f,fontdata,variationsoffset,lookuptypes,featurehash,featureorder)
- setposition(f,variationsoffset)
- local version=readulong(f)
- local nofrecords=readulong(f)
- local records={}
- for i=1,nofrecords do
- records[i]={
- conditions=readulong(f),
- substitutions=readulong(f),
- }
- end
- for i=1,nofrecords do
- local record=records[i]
- local offset=record.conditions
- if offset==0 then
- record.condition=nil
- record.matchtype="always"
- else
- local offset=variationsoffset+offset
- setposition(f,offset)
- local nofconditions=readushort(f)
- local conditions={}
- for i=1,nofconditions do
- conditions[i]=offset+readulong(f)
- end
- record.conditions=conditions
- record.matchtype="condition"
- end
- end
- for i=1,nofrecords do
- local record=records[i]
- if record.matchtype=="condition" then
- local conditions=record.conditions
- for i=1,#conditions do
- setposition(f,conditions[i])
- conditions[i]={
- format=readushort(f),
- axis=readushort(f),
- minvalue=read2dot14(f),
- maxvalue=read2dot14(f),
- }
- end
- end
- end
- for i=1,nofrecords do
- local record=records[i]
- local offset=record.substitutions
- if offset==0 then
- record.substitutions={}
- else
- setposition(f,variationsoffset+offset)
- local version=readulong(f)
- local nofsubstitutions=readushort(f)
- local substitutions={}
- for i=1,nofsubstitutions do
- substitutions[readushort(f)]=readulong(f)
- end
- for index,alternates in sortedhash(substitutions) do
- if index==0 then
- record.substitutions=false
- else
- local tableoffset=variationsoffset+offset+alternates
- setposition(f,tableoffset)
- local parameters=readulong(f)
- local noflookups=readushort(f)
- local lookups=readcardinaltable(f,noflookups,ushort)
- record.substitutions=lookups
- end
- end
- end
- end
- setvariabledata(fontdata,"features",records)
- end
- local function readscripts(f,fontdata,what,lookuptypes,lookuphandlers,lookupstoo)
- local tableoffset=gotodatatable(f,fontdata,what,true)
- if tableoffset then
- local version=readulong(f)
- local scriptoffset=tableoffset+readushort(f)
- local featureoffset=tableoffset+readushort(f)
- local lookupoffset=tableoffset+readushort(f)
- local variationsoffset=version>0x00010000 and (tableoffset+readulong(f)) or 0
- if not scriptoffset then
- return
- end
- local scripts=readscriplan(f,fontdata,scriptoffset)
- local features=readfeatures(f,fontdata,featureoffset)
- local scriptlangs,featurehash,featureorder=reorderfeatures(fontdata,scripts,features)
- if fontdata.features then
- fontdata.features[what]=scriptlangs
- else
- fontdata.features={ [what]=scriptlangs }
- end
- if not lookupstoo then
- return
- end
- local lookups=readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder)
- if lookups then
- resolvelookups(f,lookupoffset,fontdata,lookups,lookuptypes,lookuphandlers,what,tableoffset)
- end
- if variationsoffset>0 then
- loadvariations(f,fontdata,variationsoffset,lookuptypes,featurehash,featureorder)
- end
- end
- end
- local function checkkerns(f,fontdata,specification)
- local datatable=fontdata.tables.kern
- if not datatable then
- return
- end
- local features=fontdata.features
- local gposfeatures=features and features.gpos
- local name
- if not gposfeatures or not gposfeatures.kern then
- name="kern"
- elseif specification.globalkerns then
- name="globalkern"
- else
- report("ignoring global kern table, using gpos kern feature")
- return
- end
- setposition(f,datatable.offset)
- local version=readushort(f)
- local noftables=readushort(f)
- if noftables>1 then
- report("adding global kern table as gpos feature %a",name)
- local kerns=setmetatableindex("table")
- for i=1,noftables do
- local version=readushort(f)
- local length=readushort(f)
- local coverage=readushort(f)
- local format=rshift(coverage,8)
- if format==0 then
- local nofpairs=readushort(f)
- local searchrange=readushort(f)
- local entryselector=readushort(f)
- local rangeshift=readushort(f)
- for i=1,nofpairs do
- kerns[readushort(f)][readushort(f)]=readfword(f)
- end
- elseif format==2 then
- else
- end
- end
- local feature={ dflt={ dflt=true } }
- if not features then
- fontdata.features={ gpos={ [name]=feature } }
- elseif not gposfeatures then
- fontdata.features.gpos={ [name]=feature }
- else
- gposfeatures[name]=feature
- end
- local sequences=fontdata.sequences
- if not sequences then
- sequences={}
- fontdata.sequences=sequences
- end
- local nofsequences=#sequences+1
- sequences[nofsequences]={
- index=nofsequences,
- name=name,
- steps={
- {
- coverage=kerns,
- format="kern",
- },
- },
- nofsteps=1,
- type="gpos_pair",
- flags={ false,false,false,false },
- order={ name },
- features={ [name]=feature },
- }
- else
- report("ignoring empty kern table of feature %a",name)
- end
- end
- function readers.gsub(f,fontdata,specification)
- if specification.details then
- readscripts(f,fontdata,"gsub",gsubtypes,gsubhandlers,specification.lookups)
- end
- end
- function readers.gpos(f,fontdata,specification)
- if specification.details then
- readscripts(f,fontdata,"gpos",gpostypes,gposhandlers,specification.lookups)
- if specification.lookups then
- checkkerns(f,fontdata,specification)
- end
- end
- end
-end
-function readers.gdef(f,fontdata,specification)
- if not specification.glyphs then
- return
- end
- local datatable=fontdata.tables.gdef
- if datatable then
- local tableoffset=datatable.offset
- setposition(f,tableoffset)
- local version=readulong(f)
- local classoffset=readushort(f)
- local attachmentoffset=readushort(f)
- local ligaturecarets=readushort(f)
- local markclassoffset=readushort(f)
- local marksetsoffset=version>=0x00010002 and readushort(f) or 0
- local varsetsoffset=version>=0x00010003 and readulong(f) or 0
- local glyphs=fontdata.glyphs
- local marks={}
- local markclasses=setmetatableindex("table")
- local marksets=setmetatableindex("table")
- fontdata.marks=marks
- fontdata.markclasses=markclasses
- fontdata.marksets=marksets
- if classoffset~=0 then
- setposition(f,tableoffset+classoffset)
- local classformat=readushort(f)
- if classformat==1 then
- local firstindex=readushort(f)
- local lastindex=firstindex+readushort(f)-1
- for index=firstindex,lastindex do
- local class=classes[readushort(f)]
- if class=="mark" then
- marks[index]=true
- end
- glyphs[index].class=class
- end
- elseif classformat==2 then
- local nofranges=readushort(f)
- for i=1,nofranges do
- local firstindex=readushort(f)
- local lastindex=readushort(f)
- local class=classes[readushort(f)]
- if class then
- for index=firstindex,lastindex do
- glyphs[index].class=class
- if class=="mark" then
- marks[index]=true
- end
- end
- end
- end
- end
- end
- if markclassoffset~=0 then
- setposition(f,tableoffset+markclassoffset)
- local classformat=readushort(f)
- if classformat==1 then
- local firstindex=readushort(f)
- local lastindex=firstindex+readushort(f)-1
- for index=firstindex,lastindex do
- markclasses[readushort(f)][index]=true
- end
- elseif classformat==2 then
- local nofranges=readushort(f)
- for i=1,nofranges do
- local firstindex=readushort(f)
- local lastindex=readushort(f)
- local class=markclasses[readushort(f)]
- for index=firstindex,lastindex do
- class[index]=true
- end
- end
- end
- end
- if marksetsoffset~=0 then
- marksetsoffset=tableoffset+marksetsoffset
- setposition(f,marksetsoffset)
- local format=readushort(f)
- if format==1 then
- local nofsets=readushort(f)
- local sets=readcardinaltable(f,nofsets,ulong)
- for i=1,nofsets do
- local offset=sets[i]
- if offset~=0 then
- marksets[i]=readcoverage(f,marksetsoffset+offset)
- end
- end
- end
- end
- local factors=specification.factors
- if (specification.variable or factors) and varsetsoffset~=0 then
- local regions,deltas=readvariationdata(f,tableoffset+varsetsoffset,factors)
- if factors then
- fontdata.temporary.getdelta=function(outer,inner)
- local delta=deltas[outer+1]
- if delta then
- local d=delta.deltas[inner+1]
- if d then
- local scales=delta.scales
- local dd=0
- for i=1,#scales do
- local di=d[i]
- if di then
- dd=dd+scales[i]*di
- else
- break
- end
- end
- return round(dd)
- end
- end
- return 0
- end
- end
- end
- end
-end
-local function readmathvalue(f)
- local v=readshort(f)
- skipshort(f,1)
- return v
-end
-local function readmathconstants(f,fontdata,offset)
- setposition(f,offset)
- fontdata.mathconstants={
- ScriptPercentScaleDown=readshort(f),
- ScriptScriptPercentScaleDown=readshort(f),
- DelimitedSubFormulaMinHeight=readushort(f),
- DisplayOperatorMinHeight=readushort(f),
- MathLeading=readmathvalue(f),
- AxisHeight=readmathvalue(f),
- AccentBaseHeight=readmathvalue(f),
- FlattenedAccentBaseHeight=readmathvalue(f),
- SubscriptShiftDown=readmathvalue(f),
- SubscriptTopMax=readmathvalue(f),
- SubscriptBaselineDropMin=readmathvalue(f),
- SuperscriptShiftUp=readmathvalue(f),
- SuperscriptShiftUpCramped=readmathvalue(f),
- SuperscriptBottomMin=readmathvalue(f),
- SuperscriptBaselineDropMax=readmathvalue(f),
- SubSuperscriptGapMin=readmathvalue(f),
- SuperscriptBottomMaxWithSubscript=readmathvalue(f),
- SpaceAfterScript=readmathvalue(f),
- UpperLimitGapMin=readmathvalue(f),
- UpperLimitBaselineRiseMin=readmathvalue(f),
- LowerLimitGapMin=readmathvalue(f),
- LowerLimitBaselineDropMin=readmathvalue(f),
- StackTopShiftUp=readmathvalue(f),
- StackTopDisplayStyleShiftUp=readmathvalue(f),
- StackBottomShiftDown=readmathvalue(f),
- StackBottomDisplayStyleShiftDown=readmathvalue(f),
- StackGapMin=readmathvalue(f),
- StackDisplayStyleGapMin=readmathvalue(f),
- StretchStackTopShiftUp=readmathvalue(f),
- StretchStackBottomShiftDown=readmathvalue(f),
- StretchStackGapAboveMin=readmathvalue(f),
- StretchStackGapBelowMin=readmathvalue(f),
- FractionNumeratorShiftUp=readmathvalue(f),
- FractionNumeratorDisplayStyleShiftUp=readmathvalue(f),
- FractionDenominatorShiftDown=readmathvalue(f),
- FractionDenominatorDisplayStyleShiftDown=readmathvalue(f),
- FractionNumeratorGapMin=readmathvalue(f),
- FractionNumeratorDisplayStyleGapMin=readmathvalue(f),
- FractionRuleThickness=readmathvalue(f),
- FractionDenominatorGapMin=readmathvalue(f),
- FractionDenominatorDisplayStyleGapMin=readmathvalue(f),
- SkewedFractionHorizontalGap=readmathvalue(f),
- SkewedFractionVerticalGap=readmathvalue(f),
- OverbarVerticalGap=readmathvalue(f),
- OverbarRuleThickness=readmathvalue(f),
- OverbarExtraAscender=readmathvalue(f),
- UnderbarVerticalGap=readmathvalue(f),
- UnderbarRuleThickness=readmathvalue(f),
- UnderbarExtraDescender=readmathvalue(f),
- RadicalVerticalGap=readmathvalue(f),
- RadicalDisplayStyleVerticalGap=readmathvalue(f),
- RadicalRuleThickness=readmathvalue(f),
- RadicalExtraAscender=readmathvalue(f),
- RadicalKernBeforeDegree=readmathvalue(f),
- RadicalKernAfterDegree=readmathvalue(f),
- RadicalDegreeBottomRaisePercent=readshort(f),
- }
-end
-local function readmathglyphinfo(f,fontdata,offset)
- setposition(f,offset)
- local italics=readushort(f)
- local accents=readushort(f)
- local extensions=readushort(f)
- local kerns=readushort(f)
- local glyphs=fontdata.glyphs
- if italics~=0 then
- setposition(f,offset+italics)
- local coverage=readushort(f)
- local nofglyphs=readushort(f)
- coverage=readcoverage(f,offset+italics+coverage,true)
- setposition(f,offset+italics+4)
- for i=1,nofglyphs do
- local italic=readmathvalue(f)
- if italic~=0 then
- local glyph=glyphs[coverage[i]]
- local math=glyph.math
- if not math then
- glyph.math={ italic=italic }
- else
- math.italic=italic
- end
- end
- end
- fontdata.hasitalics=true
- end
- if accents~=0 then
- setposition(f,offset+accents)
- local coverage=readushort(f)
- local nofglyphs=readushort(f)
- coverage=readcoverage(f,offset+accents+coverage,true)
- setposition(f,offset+accents+4)
- for i=1,nofglyphs do
- local accent=readmathvalue(f)
- if accent~=0 then
- local glyph=glyphs[coverage[i]]
- local math=glyph.math
- if not math then
- glyph.math={ accent=accent }
- else
- math.accent=accent
- end
- end
- end
- end
- if extensions~=0 then
- setposition(f,offset+extensions)
- end
- if kerns~=0 then
- local kernoffset=offset+kerns
- setposition(f,kernoffset)
- local coverage=readushort(f)
- local nofglyphs=readushort(f)
- if nofglyphs>0 then
- local function get(offset)
- setposition(f,kernoffset+offset)
- local n=readushort(f)
- if n==0 then
- local k=readmathvalue(f)
- if k==0 then
- else
- return { { kern=k } }
- end
- else
- local l={}
- for i=1,n do
- l[i]={ height=readmathvalue(f) }
- end
- for i=1,n do
- l[i].kern=readmathvalue(f)
- end
- l[n+1]={ kern=readmathvalue(f) }
- return l
- end
- end
- local kernsets={}
- for i=1,nofglyphs do
- local topright=readushort(f)
- local topleft=readushort(f)
- local bottomright=readushort(f)
- local bottomleft=readushort(f)
- kernsets[i]={
- topright=topright~=0 and topright or nil,
- topleft=topleft~=0 and topleft or nil,
- bottomright=bottomright~=0 and bottomright or nil,
- bottomleft=bottomleft~=0 and bottomleft or nil,
- }
- end
- coverage=readcoverage(f,kernoffset+coverage,true)
- for i=1,nofglyphs do
- local kernset=kernsets[i]
- if next(kernset) then
- local k=kernset.topright if k then kernset.topright=get(k) end
- local k=kernset.topleft if k then kernset.topleft=get(k) end
- local k=kernset.bottomright if k then kernset.bottomright=get(k) end
- local k=kernset.bottomleft if k then kernset.bottomleft=get(k) end
- if next(kernset) then
- local glyph=glyphs[coverage[i]]
- local math=glyph.math
- if math then
- math.kerns=kernset
- else
- glyph.math={ kerns=kernset }
- end
- end
- end
- end
- end
- end
-end
-local function readmathvariants(f,fontdata,offset)
- setposition(f,offset)
- local glyphs=fontdata.glyphs
- local minoverlap=readushort(f)
- local vcoverage=readushort(f)
- local hcoverage=readushort(f)
- local vnofglyphs=readushort(f)
- local hnofglyphs=readushort(f)
- local vconstruction=readcardinaltable(f,vnofglyphs,ushort)
- local hconstruction=readcardinaltable(f,hnofglyphs,ushort)
- fontdata.mathconstants.MinConnectorOverlap=minoverlap
- local function get(offset,coverage,nofglyphs,construction,kvariants,kparts,kitalic)
- if coverage~=0 and nofglyphs>0 then
- local coverage=readcoverage(f,offset+coverage,true)
- for i=1,nofglyphs do
- local c=construction[i]
- if c~=0 then
- local index=coverage[i]
- local glyph=glyphs[index]
- local math=glyph.math
- setposition(f,offset+c)
- local assembly=readushort(f)
- local nofvariants=readushort(f)
- if nofvariants>0 then
- local variants,v=nil,0
- for i=1,nofvariants do
- local variant=readushort(f)
- if variant==index then
- elseif variants then
- v=v+1
- variants[v]=variant
- else
- v=1
- variants={ variant }
- end
- skipshort(f)
- end
- if not variants then
- elseif not math then
- math={ [kvariants]=variants }
- glyph.math=math
- else
- math[kvariants]=variants
- end
- end
- if assembly~=0 then
- setposition(f,offset+c+assembly)
- local italic=readmathvalue(f)
- local nofparts=readushort(f)
- local parts={}
- for i=1,nofparts do
- local p={
- glyph=readushort(f),
- start=readushort(f),
- ["end"]=readushort(f),
- advance=readushort(f),
- }
- local flags=readushort(f)
- if band(flags,0x0001)~=0 then
- p.extender=1
- end
- parts[i]=p
- end
- if not math then
- math={
- [kparts]=parts
- }
- glyph.math=math
- else
- math[kparts]=parts
- end
- if italic and italic~=0 then
- math[kitalic]=italic
- end
- end
- end
- end
- end
- end
- get(offset,vcoverage,vnofglyphs,vconstruction,"vvariants","vparts","vitalic")
- get(offset,hcoverage,hnofglyphs,hconstruction,"hvariants","hparts","hitalic")
-end
-function readers.math(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"math",specification.glyphs)
- if tableoffset then
- local version=readulong(f)
- local constants=readushort(f)
- local glyphinfo=readushort(f)
- local variants=readushort(f)
- if constants==0 then
- report("the math table of %a has no constants",fontdata.filename)
- else
- readmathconstants(f,fontdata,tableoffset+constants)
- end
- if glyphinfo~=0 then
- readmathglyphinfo(f,fontdata,tableoffset+glyphinfo)
- end
- if variants~=0 then
- readmathvariants(f,fontdata,tableoffset+variants)
- end
- end
-end
-function readers.colr(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"colr",specification.glyphs)
- if tableoffset then
- local version=readushort(f)
- if version~=0 then
- report("table version %a of %a is not supported (yet), maybe font %s is bad",version,"colr",fontdata.filename)
- return
- end
- if not fontdata.tables.cpal then
- report("color table %a in font %a has no mandate %a table","colr",fontdata.filename,"cpal")
- fontdata.colorpalettes={}
- end
- local glyphs=fontdata.glyphs
- local nofglyphs=readushort(f)
- local baseoffset=readulong(f)
- local layeroffset=readulong(f)
- local noflayers=readushort(f)
- local layerrecords={}
- local maxclass=0
- setposition(f,tableoffset+layeroffset)
- for i=1,noflayers do
- local slot=readushort(f)
- local class=readushort(f)
- if class<0xFFFF then
- class=class+1
- if class>maxclass then
- maxclass=class
- end
- end
- layerrecords[i]={
- slot=slot,
- class=class,
- }
- end
- fontdata.maxcolorclass=maxclass
- setposition(f,tableoffset+baseoffset)
- for i=0,nofglyphs-1 do
- local glyphindex=readushort(f)
- local firstlayer=readushort(f)
- local noflayers=readushort(f)
- local t={}
- for i=1,noflayers do
- t[i]=layerrecords[firstlayer+i]
- end
- glyphs[glyphindex].colors=t
- end
- end
- fontdata.hascolor=true
-end
-function readers.cpal(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"cpal",specification.glyphs)
- if tableoffset then
- local version=readushort(f)
- local nofpaletteentries=readushort(f)
- local nofpalettes=readushort(f)
- local nofcolorrecords=readushort(f)
- local firstcoloroffset=readulong(f)
- local colorrecords={}
- local palettes=readcardinaltable(f,nofpalettes,ushort)
- if version==1 then
- local palettettypesoffset=readulong(f)
- local palettelabelsoffset=readulong(f)
- local paletteentryoffset=readulong(f)
- end
- setposition(f,tableoffset+firstcoloroffset)
- for i=1,nofcolorrecords do
- local b,g,r,a=readbytes(f,4)
- colorrecords[i]={
- r,g,b,a~=255 and a or nil,
- }
- end
- for i=1,nofpalettes do
- local p={}
- local o=palettes[i]
- for j=1,nofpaletteentries do
- p[j]=colorrecords[o+j]
- end
- palettes[i]=p
- end
- fontdata.colorpalettes=palettes
- end
-end
-local compress=gzip and gzip.compress
-local compressed=compress and gzip.compressed
-function readers.svg(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"svg",specification.glyphs)
- if tableoffset then
- local version=readushort(f)
- local glyphs=fontdata.glyphs
- local indexoffset=tableoffset+readulong(f)
- local reserved=readulong(f)
- setposition(f,indexoffset)
- local nofentries=readushort(f)
- local entries={}
- for i=1,nofentries do
- entries[i]={
- first=readushort(f),
- last=readushort(f),
- offset=indexoffset+readulong(f),
- length=readulong(f),
- }
- end
- for i=1,nofentries do
- local entry=entries[i]
- setposition(f,entry.offset)
- local data=readstring(f,entry.length)
- if compressed and not compressed(data) then
- data=compress(data)
- end
- entries[i]={
- first=entry.first,
- last=entry.last,
- data=data
- }
- end
- fontdata.svgshapes=entries
- end
- fontdata.hascolor=true
-end
-function readers.sbix(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"sbix",specification.glyphs)
- if tableoffset then
- local version=readushort(f)
- local flags=readushort(f)
- local nofstrikes=readulong(f)
- local strikes={}
- local nofglyphs=fontdata.nofglyphs
- for i=1,nofstrikes do
- strikes[i]=readulong(f)
- end
- local shapes={}
- local done=0
- for i=1,nofstrikes do
- local strikeoffset=strikes[i]+tableoffset
- setposition(f,strikeoffset)
- strikes[i]={
- ppem=readushort(f),
- ppi=readushort(f),
- offset=strikeoffset
- }
- end
- sort(strikes,function(a,b)
- if b.ppem==a.ppem then
- return b.ppi0 then
- setposition(f,strikeoffset+glyphoffset)
- shapes[i]={
- x=readshort(f),
- y=readshort(f),
- tag=readtag(f),
- data=readstring(f,datasize-8),
- ppem=strikeppem,
- ppi=strikeppi,
- }
- done=done+1
- if done==nofglyphs then
- break
- end
- end
- end
- glyphoffset=nextoffset
- end
- end
- fontdata.pngshapes=shapes
- end
-end
-do
- local function getmetrics(f)
- return {
- ascender=readinteger(f),
- descender=readinteger(f),
- widthmax=readuinteger(f),
- caretslopedumerator=readinteger(f),
- caretslopedenominator=readinteger(f),
- caretoffset=readinteger(f),
- minorigin=readinteger(f),
- minadvance=readinteger(f),
- maxbefore=readinteger(f),
- minafter=readinteger(f),
- pad1=readinteger(f),
- pad2=readinteger(f),
- }
- end
- local function getbigmetrics(f)
- return {
- height=readuinteger(f),
- width=readuinteger(f),
- horiBearingX=readinteger(f),
- horiBearingY=readinteger(f),
- horiAdvance=readuinteger(f),
- vertBearingX=readinteger(f),
- vertBearingY=readinteger(f),
- vertAdvance=readuinteger(f),
- }
- end
- local function getsmallmetrics(f)
- return {
- height=readuinteger(f),
- width=readuinteger(f),
- bearingX=readinteger(f),
- bearingY=readinteger(f),
- advance=readuinteger(f),
- }
- end
- function readers.cblc(f,fontdata,specification)
- local ctdttableoffset=gotodatatable(f,fontdata,"cbdt",specification.glyphs)
- if not ctdttableoffset then
- return
- end
- local cblctableoffset=gotodatatable(f,fontdata,"cblc",specification.glyphs)
- if cblctableoffset then
- local majorversion=readushort(f)
- local minorversion=readushort(f)
- local nofsizetables=readulong(f)
- local sizetables={}
- local shapes={}
- local subtables={}
- for i=1,nofsizetables do
- sizetables[i]={
- subtables=readulong(f),
- indexsize=readulong(f),
- nofsubtables=readulong(f),
- colorref=readulong(f),
- hormetrics=getmetrics(f),
- vermetrics=getmetrics(f),
- firstindex=readushort(f),
- lastindex=readushort(f),
- ppemx=readbyte(f),
- ppemy=readbyte(f),
- bitdepth=readbyte(f),
- flags=readbyte(f),
- }
- end
- sort(sizetables,function(a,b)
- if b.ppemx==a.ppemx then
- return b.bitdepth=lastto then
- else
- values[#values+1]={ from,to }
- lastfrom,lastto=from,to
- end
- end
- nofvalues=#values
- if nofvalues>2 then
- local some=values[1]
- if some[1]==-1 and some[2]==-1 then
- some=values[nofvalues]
- if some[1]==1 and some[2]==1 then
- for i=2,nofvalues-1 do
- some=values[i]
- if some[1]==0 and some[2]==0 then
- return values
- end
- end
- end
- end
- end
- return false
- end
- local version=readulong(f)
- local reserved=readushort(f)
- local nofaxis=readushort(f)
- local segments={}
- for i=1,nofaxis do
- segments[i]=collect()
- end
- setvariabledata(fontdata,"segments",segments)
- end
-end
-function readers.fvar(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"fvar",true)
- if tableoffset then
- local version=readulong(f)
- local offsettoaxis=tableoffset+readushort(f)
- local reserved=skipshort(f)
- local nofaxis=readushort(f)
- local sizeofaxis=readushort(f)
- local nofinstances=readushort(f)
- local sizeofinstances=readushort(f)
- local extras=fontdata.extras
- local axis={}
- local instances={}
- setposition(f,offsettoaxis)
- for i=1,nofaxis do
- axis[i]={
- tag=readtag(f),
- minimum=readfixed(f),
- default=readfixed(f),
- maximum=readfixed(f),
- flags=readushort(f),
- name=lower(extras[readushort(f)] or "bad name"),
- }
- local n=sizeofaxis-20
- if n>0 then
- skipbytes(f,n)
- elseif n<0 then
- end
- end
- local nofbytes=2+2+2+nofaxis*4
- local readpsname=nofbytes<=sizeofinstances
- local skippable=sizeofinstances-nofbytes
- for i=1,nofinstances do
- local subfamid=readushort(f)
- local flags=readushort(f)
- local values={}
- for i=1,nofaxis do
- values[i]={
- axis=axis[i].tag,
- value=readfixed(f),
- }
- end
- local psnameid=readpsname and readushort(f) or 0xFFFF
- if subfamid==2 or subfamid==17 then
- elseif subfamid==0xFFFF then
- subfamid=nil
- elseif subfamid<=256 or subfamid>=32768 then
- subfamid=nil
- end
- if psnameid==6 then
- elseif psnameid==0xFFFF then
- psnameid=nil
- elseif psnameid<=256 or psnameid>=32768 then
- psnameid=nil
- end
- instances[i]={
- subfamily=extras[subfamid],
- psname=psnameid and extras[psnameid] or nil,
- values=values,
- }
- if skippable>0 then
- skipbytes(f,skippable)
- end
- end
- setvariabledata(fontdata,"axis",axis)
- setvariabledata(fontdata,"instances",instances)
- end
-end
-function readers.hvar(f,fontdata,specification)
- local factors=specification.factors
- if not factors then
- return
- end
- local tableoffset=gotodatatable(f,fontdata,"hvar",specification.variable)
- if not tableoffset then
- return
- end
- local version=readulong(f)
- local variationoffset=tableoffset+readulong(f)
- local advanceoffset=tableoffset+readulong(f)
- local lsboffset=tableoffset+readulong(f)
- local rsboffset=tableoffset+readulong(f)
- local regions={}
- local variations={}
- local innerindex={}
- local outerindex={}
- if variationoffset>0 then
- regions,deltas=readvariationdata(f,variationoffset,factors)
- end
- if not regions then
- return
- end
- if advanceoffset>0 then
- setposition(f,advanceoffset)
- local format=readushort(f)
- local mapcount=readushort(f)
- local entrysize=rshift(band(format,0x0030),4)+1
- local nofinnerbits=band(format,0x000F)+1
- local innermask=lshift(1,nofinnerbits)-1
- local readcardinal=read_cardinal[entrysize]
- for i=0,mapcount-1 do
- local mapdata=readcardinal(f)
- outerindex[i]=rshift(mapdata,nofinnerbits)
- innerindex[i]=band(mapdata,innermask)
- end
- setvariabledata(fontdata,"hvarwidths",true)
- local glyphs=fontdata.glyphs
- for i=0,fontdata.nofglyphs-1 do
- local glyph=glyphs[i]
- local width=glyph.width
- if width then
- local outer=outerindex[i] or 0
- local inner=innerindex[i] or i
- if outer and inner then
- local delta=deltas[outer+1]
- if delta then
- local d=delta.deltas[inner+1]
- if d then
- local scales=delta.scales
- local deltaw=0
- for i=1,#scales do
- local di=d[i]
- if di then
- deltaw=deltaw+scales[i]*di
- else
- break
- end
- end
- glyph.width=width+round(deltaw)
- end
- end
- end
- end
- end
- end
-end
-function readers.vvar(f,fontdata,specification)
- if not specification.variable then
- return
- end
-end
-function readers.mvar(f,fontdata,specification)
- local tableoffset=gotodatatable(f,fontdata,"mvar",specification.variable)
- if tableoffset then
- local version=readulong(f)
- local reserved=skipshort(f,1)
- local recordsize=readushort(f)
- local nofrecords=readushort(f)
- local offsettostore=tableoffset+readushort(f)
- local dimensions={}
- local factors=specification.factors
- if factors then
- local regions,deltas=readvariationdata(f,offsettostore,factors)
- for i=1,nofrecords do
- local tag=readtag(f)
- local var=variabletags[tag]
- if var then
- local outer=readushort(f)
- local inner=readushort(f)
- local delta=deltas[outer+1]
- if delta then
- local d=delta.deltas[inner+1]
- if d then
- local scales=delta.scales
- local dd=0
- for i=1,#scales do
- dd=dd+scales[i]*d[i]
- end
- var(fontdata,round(dd))
- end
- end
- else
- skipshort(f,2)
- end
- if recordsize>8 then
- skipbytes(recordsize-8)
- end
- end
- end
- end
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-dsp”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-oup” 0cef35af01739f52fd09feb5401192ae] ---
-
-if not modules then modules={} end modules ['font-oup']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local next,type=next,type
-local P,R,S=lpeg.P,lpeg.R,lpeg.S
-local lpegmatch=lpeg.match
-local insert,remove,copy,unpack=table.insert,table.remove,table.copy,table.unpack
-local formatters=string.formatters
-local sortedkeys=table.sortedkeys
-local sortedhash=table.sortedhash
-local tohash=table.tohash
-local setmetatableindex=table.setmetatableindex
-local report_error=logs.reporter("otf reader","error")
-local report_markwidth=logs.reporter("otf reader","markwidth")
-local report_cleanup=logs.reporter("otf reader","cleanup")
-local report_optimizations=logs.reporter("otf reader","merges")
-local report_unicodes=logs.reporter("otf reader","unicodes")
-local trace_markwidth=false trackers.register("otf.markwidth",function(v) trace_markwidth=v end)
-local trace_cleanup=false trackers.register("otf.cleanups",function(v) trace_cleanups=v end)
-local trace_optimizations=false trackers.register("otf.optimizations",function(v) trace_optimizations=v end)
-local trace_unicodes=false trackers.register("otf.unicodes",function(v) trace_unicodes=v end)
-local readers=fonts.handlers.otf.readers
-local privateoffset=fonts.constructors and fonts.constructors.privateoffset or 0xF0000
-local f_private=formatters["P%05X"]
-local f_unicode=formatters["U%05X"]
-local f_index=formatters["I%05X"]
-local f_character_y=formatters["%C"]
-local f_character_n=formatters["[ %C ]"]
-local check_duplicates=true
-local check_soft_hyphen=true
-directives.register("otf.checksofthyphen",function(v)
- check_soft_hyphen=v
-end)
-local function replaced(list,index,replacement)
- if type(list)=="number" then
- return replacement
- elseif type(replacement)=="table" then
- local t={}
- local n=index-1
- for i=1,n do
- t[i]=list[i]
- end
- for i=1,#replacement do
- n=n+1
- t[n]=replacement[i]
- end
- for i=index+1,#list do
- n=n+1
- t[n]=list[i]
- end
- else
- list[index]=replacement
- return list
- end
-end
-local function unifyresources(fontdata,indices)
- local descriptions=fontdata.descriptions
- local resources=fontdata.resources
- if not descriptions or not resources then
- return
- end
- local nofindices=#indices
- local variants=fontdata.resources.variants
- if variants then
- for selector,unicodes in next,variants do
- for unicode,index in next,unicodes do
- unicodes[unicode]=indices[index]
- end
- end
- end
- local function remark(marks)
- if marks then
- local newmarks={}
- for k,v in next,marks do
- local u=indices[k]
- if u then
- newmarks[u]=v
- elseif trace_optimizations then
- report_optimizations("discarding mark %i",k)
- end
- end
- return newmarks
- end
- end
- local marks=resources.marks
- if marks then
- resources.marks=remark(marks)
- end
- local markclasses=resources.markclasses
- if markclasses then
- for class,marks in next,markclasses do
- markclasses[class]=remark(marks)
- end
- end
- local marksets=resources.marksets
- if marksets then
- for class,marks in next,marksets do
- marksets[class]=remark(marks)
- end
- end
- local done={}
- local duplicates=check_duplicates and resources.duplicates
- if duplicates and not next(duplicates) then
- duplicates=false
- end
- local function recover(cover)
- for i=1,#cover do
- local c=cover[i]
- if not done[c] then
- local t={}
- for k,v in next,c do
- local ug=indices[k]
- if ug then
- t[ug]=v
- else
- report_error("case %i, bad index in unifying %s: %s of %s",1,"coverage",k,nofindices)
- end
- end
- cover[i]=t
- done[c]=d
- end
- end
- end
- local function recursed(c,kind)
- local t={}
- for g,d in next,c do
- if type(d)=="table" then
- local ug=indices[g]
- if ug then
- t[ug]=recursed(d,kind)
- else
- report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g,nofindices)
- end
- else
- t[g]=indices[d]
- end
- end
- return t
- end
- local function unifythem(sequences)
- if not sequences then
- return
- end
- for i=1,#sequences do
- local sequence=sequences[i]
- local kind=sequence.type
- local steps=sequence.steps
- local features=sequence.features
- if steps then
- for i=1,#steps do
- local step=steps[i]
- if kind=="gsub_single" then
- local c=step.coverage
- if c then
- local t1=done[c]
- if not t1 then
- t1={}
- if duplicates then
- for g1,d1 in next,c do
- local ug1=indices[g1]
- if ug1 then
- local ud1=indices[d1]
- if ud1 then
- t1[ug1]=ud1
- local dg1=duplicates[ug1]
- if dg1 then
- for u in next,dg1 do
- t1[u]=ud1
- end
- end
- else
- report_error("case %i, bad index in unifying %s: %s of %s",3,kind,d1,nofindices)
- end
- else
- report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices)
- end
- end
- else
- for g1,d1 in next,c do
- local ug1=indices[g1]
- if ug1 then
- t1[ug1]=indices[d1]
- else
- report_error("fuzzy case %i in unifying %s: %i",2,kind,g1)
- end
- end
- end
- done[c]=t1
- end
- step.coverage=t1
- end
- elseif kind=="gpos_pair" then
- local c=step.coverage
- if c then
- local t1=done[c]
- if not t1 then
- t1={}
- for g1,d1 in next,c do
- local ug1=indices[g1]
- if ug1 then
- local t2=done[d1]
- if not t2 then
- t2={}
- for g2,d2 in next,d1 do
- local ug2=indices[g2]
- if ug2 then
- t2[ug2]=d2
- else
- report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g2,nofindices,nofindices)
- end
- end
- done[d1]=t2
- end
- t1[ug1]=t2
- else
- report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices)
- end
- end
- done[c]=t1
- end
- step.coverage=t1
- end
- elseif kind=="gsub_ligature" then
- local c=step.coverage
- if c then
- step.coverage=recursed(c,kind)
- end
- elseif kind=="gsub_alternate" or kind=="gsub_multiple" then
- local c=step.coverage
- if c then
- local t1=done[c]
- if not t1 then
- t1={}
- if duplicates then
- for g1,d1 in next,c do
- for i=1,#d1 do
- local d1i=d1[i]
- local d1u=indices[d1i]
- if d1u then
- d1[i]=d1u
- else
- report_error("case %i, bad index in unifying %s: %s of %s",1,kind,i,d1i,nofindices)
- end
- end
- local ug1=indices[g1]
- if ug1 then
- t1[ug1]=d1
- local dg1=duplicates[ug1]
- if dg1 then
- for u in next,dg1 do
- t1[u]=copy(d1)
- end
- end
- else
- report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices)
- end
- end
- else
- for g1,d1 in next,c do
- for i=1,#d1 do
- local d1i=d1[i]
- local d1u=indices[d1i]
- if d1u then
- d1[i]=d1u
- else
- report_error("case %i, bad index in unifying %s: %s of %s",2,kind,d1i,nofindices)
- end
- end
- t1[indices[g1]]=d1
- end
- end
- done[c]=t1
- end
- step.coverage=t1
- end
- elseif kind=="gpos_single" then
- local c=step.coverage
- if c then
- local t1=done[c]
- if not t1 then
- t1={}
- if duplicates then
- for g1,d1 in next,c do
- local ug1=indices[g1]
- if ug1 then
- t1[ug1]=d1
- local dg1=duplicates[ug1]
- if dg1 then
- for u in next,dg1 do
- t1[u]=d1
- end
- end
- else
- report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices)
- end
- end
- else
- for g1,d1 in next,c do
- local ug1=indices[g1]
- if ug1 then
- t1[ug1]=d1
- else
- report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices)
- end
- end
- end
- done[c]=t1
- end
- step.coverage=t1
- end
- elseif kind=="gpos_mark2base" or kind=="gpos_mark2mark" or kind=="gpos_mark2ligature" then
- local c=step.coverage
- if c then
- local t1=done[c]
- if not t1 then
- t1={}
- for g1,d1 in next,c do
- local ug1=indices[g1]
- if ug1 then
- t1[ug1]=d1
- else
- report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices)
- end
- end
- done[c]=t1
- end
- step.coverage=t1
- end
- local c=step.baseclasses
- if c then
- local t1=done[c]
- if not t1 then
- for g1,d1 in next,c do
- local t2=done[d1]
- if not t2 then
- t2={}
- for g2,d2 in next,d1 do
- local ug2=indices[g2]
- if ug2 then
- t2[ug2]=d2
- else
- report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g2,nofindices)
- end
- end
- done[d1]=t2
- end
- c[g1]=t2
- end
- done[c]=c
- end
- end
- elseif kind=="gpos_cursive" then
- local c=step.coverage
- if c then
- local t1=done[c]
- if not t1 then
- t1={}
- if duplicates then
- for g1,d1 in next,c do
- local ug1=indices[g1]
- if ug1 then
- t1[ug1]=d1
- local dg1=duplicates[ug1]
- if dg1 then
- for u in next,dg1 do
- t1[u]=copy(d1)
- end
- end
- else
- report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices)
- end
- end
- else
- for g1,d1 in next,c do
- local ug1=indices[g1]
- if ug1 then
- t1[ug1]=d1
- else
- report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices)
- end
- end
- end
- done[c]=t1
- end
- step.coverage=t1
- end
- end
- local rules=step.rules
- if rules then
- for i=1,#rules do
- local rule=rules[i]
- local before=rule.before if before then recover(before) end
- local after=rule.after if after then recover(after) end
- local current=rule.current if current then recover(current) end
- local replacements=rule.replacements
- if replacements then
- if not done[replacements] then
- local r={}
- for k,v in next,replacements do
- r[indices[k]]=indices[v]
- end
- rule.replacements=r
- done[replacements]=r
- end
- end
- end
- end
- end
- end
- end
- end
- unifythem(resources.sequences)
- unifythem(resources.sublookups)
-end
-local function copyduplicates(fontdata)
- if check_duplicates then
- local descriptions=fontdata.descriptions
- local resources=fontdata.resources
- local duplicates=resources.duplicates
- if check_soft_hyphen then
- local ds=descriptions[0xAD]
- if not ds or ds.width==0 then
- if ds then
- descriptions[0xAD]=nil
- if trace_unicodes then
- report_unicodes("patching soft hyphen")
- end
- else
- if trace_unicodes then
- report_unicodes("adding soft hyphen")
- end
- end
- if not duplicates then
- duplicates={}
- resources.duplicates=duplicates
- end
- local dh=duplicates[0x2D]
- if dh then
- dh[#dh+1]={ [0xAD]=true }
- else
- duplicates[0x2D]={ [0xAD]=true }
- end
- end
- end
- if duplicates then
- for u,d in next,duplicates do
- local du=descriptions[u]
- if du then
- local t={ f_character_y(u),"@",f_index(du.index),"->" }
- local n=0
- local m=25
- for u in next,d do
- if descriptions[u] then
- if n0 then
- t={}
- n=0
- local loops=0
- while true do
- loops=loops+1
- local old=nofmissing
- for i=1,#ligatures do
- recursed(ligatures[i])
- end
- if nofmissing<=0 then
- if trace_unicodes then
- report_unicodes("all missings done in %s loops",loops)
- end
- return
- elseif old==nofmissing then
- break
- end
- end
- t=nil
- n=0
- end
- if trace_unicodes and nofmissing>0 then
- local done={}
- for i,r in next,missing do
- if r then
- local data=descriptions[i]
- local name=data and data.name or f_index(i)
- if not ignore[name] then
- done[name]=true
- end
- end
- end
- if next(done) then
- report_unicodes("not unicoded: % t",sortedkeys(done))
- end
- end
-end
-local firstprivate=fonts.privateoffsets and fonts.privateoffsets.textbase or 0xF0000
-local puafirst=0xE000
-local pualast=0xF8FF
-local function unifymissing(fontdata)
- if not fonts.mappings then
- require("font-map")
- require("font-agl")
- end
- local unicodes={}
- local resources=fontdata.resources
- resources.unicodes=unicodes
- for unicode,d in next,fontdata.descriptions do
- if unicode=puafirst and unicode<=pualast then
- else
- local name=d.name
- if name then
- unicodes[name]=unicode
- end
- end
- else
- end
- end
- fonts.mappings.addtounicode(fontdata,fontdata.filename,checklookups)
- resources.unicodes=nil
-end
-local function unifyglyphs(fontdata,usenames)
- local private=fontdata.private or privateoffset
- local glyphs=fontdata.glyphs
- local indices={}
- local descriptions={}
- local names=usenames and {}
- local resources=fontdata.resources
- local zero=glyphs[0]
- local zerocode=zero.unicode
- if not zerocode then
- zerocode=private
- zero.unicode=zerocode
- private=private+1
- end
- descriptions[zerocode]=zero
- if names then
- local name=glyphs[0].name or f_private(zerocode)
- indices[0]=name
- names[name]=zerocode
- else
- indices[0]=zerocode
- end
- if names then
- for index=1,#glyphs do
- local glyph=glyphs[index]
- local unicode=glyph.unicode
- if not unicode then
- unicode=private
- local name=glyph.name or f_private(unicode)
- indices[index]=name
- names[name]=unicode
- private=private+1
- elseif unicode>=firstprivate then
- unicode=private
- local name=glyph.name or f_private(unicode)
- indices[index]=name
- names[name]=unicode
- private=private+1
- elseif unicode>=puafirst and unicode<=pualast then
- local name=glyph.name or f_private(unicode)
- indices[index]=name
- names[name]=unicode
- elseif descriptions[unicode] then
- unicode=private
- local name=glyph.name or f_private(unicode)
- indices[index]=name
- names[name]=unicode
- private=private+1
- else
- local name=glyph.name or f_unicode(unicode)
- indices[index]=name
- names[name]=unicode
- end
- descriptions[unicode]=glyph
- end
- elseif trace_unicodes then
- for index=1,#glyphs do
- local glyph=glyphs[index]
- local unicode=glyph.unicode
- if not unicode then
- unicode=private
- indices[index]=unicode
- private=private+1
- elseif unicode>=firstprivate then
- local name=glyph.name
- if name then
- report_unicodes("moving glyph %a indexed %05X from private %U to %U ",name,index,unicode,private)
- else
- report_unicodes("moving glyph indexed %05X from private %U to %U ",index,unicode,private)
- end
- unicode=private
- indices[index]=unicode
- private=private+1
- elseif unicode>=puafirst and unicode<=pualast then
- local name=glyph.name
- if name then
- report_unicodes("keeping private unicode %U for glyph %a indexed %05X",unicode,name,index)
- else
- report_unicodes("keeping private unicode %U for glyph indexed %05X",unicode,index)
- end
- indices[index]=unicode
- elseif descriptions[unicode] then
- local name=glyph.name
- if name then
- report_unicodes("assigning duplicate unicode %U to %U for glyph %a indexed %05X ",unicode,private,name,index)
- else
- report_unicodes("assigning duplicate unicode %U to %U for glyph indexed %05X ",unicode,private,index)
- end
- unicode=private
- indices[index]=unicode
- private=private+1
- else
- indices[index]=unicode
- end
- descriptions[unicode]=glyph
- end
- else
- for index=1,#glyphs do
- local glyph=glyphs[index]
- local unicode=glyph.unicode
- if not unicode then
- unicode=private
- indices[index]=unicode
- private=private+1
- elseif unicode>=firstprivate then
- local name=glyph.name
- unicode=private
- indices[index]=unicode
- private=private+1
- elseif unicode>=puafirst and unicode<=pualast then
- local name=glyph.name
- indices[index]=unicode
- elseif descriptions[unicode] then
- local name=glyph.name
- unicode=private
- indices[index]=unicode
- private=private+1
- else
- indices[index]=unicode
- end
- descriptions[unicode]=glyph
- end
- end
- for index=1,#glyphs do
- local math=glyphs[index].math
- if math then
- local list=math.vparts
- if list then
- for i=1,#list do local l=list[i] l.glyph=indices[l.glyph] end
- end
- local list=math.hparts
- if list then
- for i=1,#list do local l=list[i] l.glyph=indices[l.glyph] end
- end
- local list=math.vvariants
- if list then
- for i=1,#list do list[i]=indices[list[i]] end
- end
- local list=math.hvariants
- if list then
- for i=1,#list do list[i]=indices[list[i]] end
- end
- end
- end
- local colorpalettes=resources.colorpalettes
- if colorpalettes then
- for index=1,#glyphs do
- local colors=glyphs[index].colors
- if colors then
- for i=1,#colors do
- local c=colors[i]
- c.slot=indices[c.slot]
- end
- end
- end
- end
- fontdata.private=private
- fontdata.glyphs=nil
- fontdata.names=names
- fontdata.descriptions=descriptions
- fontdata.hashmethod=hashmethod
- return indices,names
-end
-local p_crappyname do
- local p_hex=R("af","AF","09")
- local p_digit=R("09")
- local p_done=S("._-")^0+P(-1)
- local p_alpha=R("az","AZ")
- local p_ALPHA=R("AZ")
- p_crappyname=(
- lpeg.utfchartabletopattern({ "uni","u" },true)*S("Xx_")^0*p_hex^1
-+lpeg.utfchartabletopattern({ "identity","glyph","jamo" },true)*p_hex^1
-+lpeg.utfchartabletopattern({ "index","afii" },true)*p_digit^1
-+p_digit*p_hex^3+p_alpha*p_digit^1
-+P("aj")*p_digit^1+P("eh_")*(p_digit^1+p_ALPHA*p_digit^1)+(1-P("_"))^1*P("_uni")*p_hex^1+P("_")*P(1)^1
- )*p_done
-end
-local forcekeep=false
-directives.register("otf.keepnames",function(v)
- report_cleanup("keeping weird glyph names, expect larger files and more memory usage")
- forcekeep=v
-end)
-local function stripredundant(fontdata)
- local descriptions=fontdata.descriptions
- if descriptions then
- local n=0
- local c=0
- if (not context and fonts.privateoffsets.keepnames) or forcekeep then
- for unicode,d in next,descriptions do
- if d.class=="base" then
- d.class=nil
- c=c+1
- end
- end
- else
- for unicode,d in next,descriptions do
- local name=d.name
- if name and lpegmatch(p_crappyname,name) then
- d.name=nil
- n=n+1
- end
- if d.class=="base" then
- d.class=nil
- c=c+1
- end
- end
- end
- if trace_cleanup then
- if n>0 then
- report_cleanup("%s bogus names removed (verbose unicode)",n)
- end
- if c>0 then
- report_cleanup("%s base class tags removed (default is base)",c)
- end
- end
- end
-end
-readers.stripredundant=stripredundant
-function readers.getcomponents(fontdata)
- local resources=fontdata.resources
- if resources then
- local sequences=resources.sequences
- if sequences then
- local collected={}
- for i=1,#sequences do
- local sequence=sequences[i]
- if sequence.type=="gsub_ligature" then
- local steps=sequence.steps
- if steps then
- local l={}
- local function traverse(p,k,v)
- if k=="ligature" then
- collected[v]={ unpack(l) }
- else
- insert(l,k)
- for k,vv in next,v do
- traverse(p,k,vv)
- end
- remove(l)
- end
- end
- for i=1,#steps do
- local c=steps[i].coverage
- if c then
- for k,v in next,c do
- traverse(k,k,v)
- end
- end
- end
- end
- end
- end
- if next(collected) then
- while true do
- local done=false
- for k,v in next,collected do
- for i=1,#v do
- local vi=v[i]
- if vi==k then
- collected[k]=nil
- break
- else
- local c=collected[vi]
- if c then
- done=true
- local t={}
- local n=i-1
- for j=1,n do
- t[j]=v[j]
- end
- for j=1,#c do
- n=n+1
- t[n]=c[j]
- end
- for j=i+1,#v do
- n=n+1
- t[n]=v[j]
- end
- collected[k]=t
- break
- end
- end
- end
- end
- if not done then
- break
- end
- end
- return collected
- end
- end
- end
-end
-readers.unifymissing=unifymissing
-function readers.rehash(fontdata,hashmethod)
- if not (fontdata and fontdata.glyphs) then
- return
- end
- if hashmethod=="indices" then
- fontdata.hashmethod="indices"
- elseif hashmethod=="names" then
- fontdata.hashmethod="names"
- local indices=unifyglyphs(fontdata,true)
- unifyresources(fontdata,indices)
- copyduplicates(fontdata)
- unifymissing(fontdata)
- else
- fontdata.hashmethod="unicodes"
- local indices=unifyglyphs(fontdata)
- unifyresources(fontdata,indices)
- copyduplicates(fontdata)
- unifymissing(fontdata)
- stripredundant(fontdata)
- end
-end
-function readers.checkhash(fontdata)
- local hashmethod=fontdata.hashmethod
- if hashmethod=="unicodes" then
- fontdata.names=nil
- elseif hashmethod=="names" and fontdata.names then
- unifyresources(fontdata,fontdata.names)
- copyduplicates(fontdata)
- fontdata.hashmethod="unicodes"
- fontdata.names=nil
- else
- readers.rehash(fontdata,"unicodes")
- end
-end
-function readers.addunicodetable(fontdata)
- local resources=fontdata.resources
- local unicodes=resources.unicodes
- if not unicodes then
- local descriptions=fontdata.descriptions
- if descriptions then
- unicodes={}
- resources.unicodes=unicodes
- for u,d in next,descriptions do
- local n=d.name
- if n then
- unicodes[n]=u
- end
- end
- end
- end
-end
-local concat,sort=table.concat,table.sort
-local next,type,tostring=next,type,tostring
-local criterium=1
-local threshold=0
-local trace_packing=false trackers.register("otf.packing",function(v) trace_packing=v end)
-local trace_loading=false trackers.register("otf.loading",function(v) trace_loading=v end)
-local report_otf=logs.reporter("fonts","otf loading")
-local function tabstr_normal(t)
- local s={}
- local n=0
- for k,v in next,t do
- n=n+1
- if type(v)=="table" then
- s[n]=k..">"..tabstr_normal(v)
- elseif v==true then
- s[n]=k.."+"
- elseif v then
- s[n]=k.."="..v
- else
- s[n]=k.."-"
- end
- end
- if n==0 then
- return ""
- elseif n==1 then
- return s[1]
- else
- sort(s)
- return concat(s,",")
- end
-end
-local function tabstr_flat(t)
- local s={}
- local n=0
- for k,v in next,t do
- n=n+1
- s[n]=k.."="..v
- end
- if n==0 then
- return ""
- elseif n==1 then
- return s[1]
- else
- sort(s)
- return concat(s,",")
- end
-end
-local function tabstr_mixed(t)
- local s={}
- local n=#t
- if n==0 then
- return ""
- elseif n==1 then
- local k=t[1]
- if k==true then
- return "++"
- elseif k==false then
- return "--"
- else
- return tostring(k)
- end
- else
- for i=1,n do
- local k=t[i]
- if k==true then
- s[i]="++"
- elseif k==false then
- s[i]="--"
- else
- s[i]=k
- end
- end
- return concat(s,",")
- end
-end
-local function tabstr_boolean(t)
- local s={}
- local n=0
- for k,v in next,t do
- n=n+1
- if v then
- s[n]=k.."+"
- else
- s[n]=k.."-"
- end
- end
- if n==0 then
- return ""
- elseif n==1 then
- return s[1]
- else
- sort(s)
- return concat(s,",")
- end
-end
-function readers.pack(data)
- if data then
- local h,t,c={},{},{}
- local hh,tt,cc={},{},{}
- local nt,ntt=0,0
- local function pack_normal(v)
- local tag=tabstr_normal(v)
- local ht=h[tag]
- if ht then
- c[ht]=c[ht]+1
- return ht
- else
- nt=nt+1
- t[nt]=v
- h[tag]=nt
- c[nt]=1
- return nt
- end
- end
- local function pack_normal_cc(v)
- local tag=tabstr_normal(v)
- local ht=h[tag]
- if ht then
- c[ht]=c[ht]+1
- return ht
- else
- v[1]=0
- nt=nt+1
- t[nt]=v
- h[tag]=nt
- c[nt]=1
- return nt
- end
- end
- local function pack_flat(v)
- local tag=tabstr_flat(v)
- local ht=h[tag]
- if ht then
- c[ht]=c[ht]+1
- return ht
- else
- nt=nt+1
- t[nt]=v
- h[tag]=nt
- c[nt]=1
- return nt
- end
- end
- local function pack_indexed(v)
- local tag=concat(v," ")
- local ht=h[tag]
- if ht then
- c[ht]=c[ht]+1
- return ht
- else
- nt=nt+1
- t[nt]=v
- h[tag]=nt
- c[nt]=1
- return nt
- end
- end
- local function pack_mixed(v)
- local tag=tabstr_mixed(v)
- local ht=h[tag]
- if ht then
- c[ht]=c[ht]+1
- return ht
- else
- nt=nt+1
- t[nt]=v
- h[tag]=nt
- c[nt]=1
- return nt
- end
- end
- local function pack_boolean(v)
- local tag=tabstr_boolean(v)
- local ht=h[tag]
- if ht then
- c[ht]=c[ht]+1
- return ht
- else
- nt=nt+1
- t[nt]=v
- h[tag]=nt
- c[nt]=1
- return nt
- end
- end
- local function pack_final(v)
- if c[v]<=criterium then
- return t[v]
- else
- local hv=hh[v]
- if hv then
- return hv
- else
- ntt=ntt+1
- tt[ntt]=t[v]
- hh[v]=ntt
- cc[ntt]=c[v]
- return ntt
- end
- end
- end
- local function pack_final_cc(v)
- if c[v]<=criterium then
- return t[v]
- else
- local hv=hh[v]
- if hv then
- return hv
- else
- ntt=ntt+1
- tt[ntt]=t[v]
- hh[v]=ntt
- cc[ntt]=c[v]
- return ntt
- end
- end
- end
- local function success(stage,pass)
- if nt==0 then
- if trace_loading or trace_packing then
- report_otf("pack quality: nothing to pack")
- end
- return false
- elseif nt>=threshold then
- local one=0
- local two=0
- local rest=0
- if pass==1 then
- for k,v in next,c do
- if v==1 then
- one=one+1
- elseif v==2 then
- two=two+1
- else
- rest=rest+1
- end
- end
- else
- for k,v in next,cc do
- if v>20 then
- rest=rest+1
- elseif v>10 then
- two=two+1
- else
- one=one+1
- end
- end
- data.tables=tt
- end
- if trace_loading or trace_packing then
- report_otf("pack quality: stage %s, pass %s, %s packed, 1-10:%s, 11-20:%s, rest:%s (criterium: %s)",
- stage,pass,one+two+rest,one,two,rest,criterium)
- end
- return true
- else
- if trace_loading or trace_packing then
- report_otf("pack quality: stage %s, pass %s, %s packed, aborting pack (threshold: %s)",
- stage,pass,nt,threshold)
- end
- return false
- end
- end
- local function packers(pass)
- if pass==1 then
- return pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed,pack_normal_cc
- else
- return pack_final,pack_final,pack_final,pack_final,pack_final,pack_final_cc
- end
- end
- local resources=data.resources
- local sequences=resources.sequences
- local sublookups=resources.sublookups
- local features=resources.features
- local palettes=resources.colorpalettes
- local variable=resources.variabledata
- local chardata=characters and characters.data
- local descriptions=data.descriptions or data.glyphs
- if not descriptions then
- return
- end
- for pass=1,2 do
- if trace_packing then
- report_otf("start packing: stage 1, pass %s",pass)
- end
- local pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed,pack_normal_cc=packers(pass)
- for unicode,description in next,descriptions do
- local boundingbox=description.boundingbox
- if boundingbox then
- description.boundingbox=pack_indexed(boundingbox)
- end
- local math=description.math
- if math then
- local kerns=math.kerns
- if kerns then
- for tag,kern in next,kerns do
- kerns[tag]=pack_normal(kern)
- end
- end
- end
- end
- local function packthem(sequences)
- for i=1,#sequences do
- local sequence=sequences[i]
- local kind=sequence.type
- local steps=sequence.steps
- local order=sequence.order
- local features=sequence.features
- local flags=sequence.flags
- if steps then
- for i=1,#steps do
- local step=steps[i]
- if kind=="gpos_pair" then
- local c=step.coverage
- if c then
- if step.format~="pair" then
- for g1,d1 in next,c do
- c[g1]=pack_normal(d1)
- end
- elseif step.shared then
- local shared={}
- for g1,d1 in next,c do
- for g2,d2 in next,d1 do
- if not shared[d2] then
- local f=d2[1] if f and f~=true then d2[1]=pack_indexed(f) end
- local s=d2[2] if s and s~=true then d2[2]=pack_indexed(s) end
- shared[d2]=true
- end
- end
- end
- if pass==2 then
- step.shared=nil
- end
- else
- for g1,d1 in next,c do
- for g2,d2 in next,d1 do
- local f=d2[1] if f and f~=true then d2[1]=pack_indexed(f) end
- local s=d2[2] if s and s~=true then d2[2]=pack_indexed(s) end
- end
- end
- end
- end
- elseif kind=="gpos_single" then
- local c=step.coverage
- if c then
- if step.format=="single" then
- for g1,d1 in next,c do
- if d1 and d1~=true then
- c[g1]=pack_indexed(d1)
- end
- end
- else
- step.coverage=pack_normal(c)
- end
- end
- elseif kind=="gpos_cursive" then
- local c=step.coverage
- if c then
- for g1,d1 in next,c do
- local f=d1[2] if f then d1[2]=pack_indexed(f) end
- local s=d1[3] if s then d1[3]=pack_indexed(s) end
- end
- end
- elseif kind=="gpos_mark2base" or kind=="gpos_mark2mark" then
- local c=step.baseclasses
- if c then
- for g1,d1 in next,c do
- for g2,d2 in next,d1 do
- d1[g2]=pack_indexed(d2)
- end
- end
- end
- local c=step.coverage
- if c then
- for g1,d1 in next,c do
- d1[2]=pack_indexed(d1[2])
- end
- end
- elseif kind=="gpos_mark2ligature" then
- local c=step.baseclasses
- if c then
- for g1,d1 in next,c do
- for g2,d2 in next,d1 do
- for g3,d3 in next,d2 do
- d2[g3]=pack_indexed(d3)
- end
- end
- end
- end
- local c=step.coverage
- if c then
- for g1,d1 in next,c do
- d1[2]=pack_indexed(d1[2])
- end
- end
- end
- local rules=step.rules
- if rules then
- for i=1,#rules do
- local rule=rules[i]
- local r=rule.before if r then for i=1,#r do r[i]=pack_boolean(r[i]) end end
- local r=rule.after if r then for i=1,#r do r[i]=pack_boolean(r[i]) end end
- local r=rule.current if r then for i=1,#r do r[i]=pack_boolean(r[i]) end end
- local r=rule.replacements if r then rule.replacements=pack_flat (r) end
- end
- end
- end
- end
- if order then
- sequence.order=pack_indexed(order)
- end
- if features then
- for script,feature in next,features do
- features[script]=pack_normal(feature)
- end
- end
- if flags then
- sequence.flags=pack_normal(flags)
- end
- end
- end
- if sequences then
- packthem(sequences)
- end
- if sublookups then
- packthem(sublookups)
- end
- if features then
- for k,list in next,features do
- for feature,spec in next,list do
- list[feature]=pack_normal(spec)
- end
- end
- end
- if palettes then
- for i=1,#palettes do
- local p=palettes[i]
- for j=1,#p do
- p[j]=pack_indexed(p[j])
- end
- end
- end
- if variable then
- local instances=variable.instances
- if instances then
- for i=1,#instances do
- local v=instances[i].values
- for j=1,#v do
- v[j]=pack_normal(v[j])
- end
- end
- end
- local function packdeltas(main)
- if main then
- local deltas=main.deltas
- if deltas then
- for i=1,#deltas do
- local di=deltas[i]
- local d=di.deltas
- for j=1,#d do
- d[j]=pack_indexed(d[j])
- end
- di.regions=pack_indexed(di.regions)
- end
- end
- local regions=main.regions
- if regions then
- for i=1,#regions do
- local r=regions[i]
- for j=1,#r do
- r[j]=pack_normal(r[j])
- end
- end
- end
- end
- end
- packdeltas(variable.global)
- packdeltas(variable.horizontal)
- packdeltas(variable.vertical)
- packdeltas(variable.metrics)
- end
- if not success(1,pass) then
- return
- end
- end
- if nt>0 then
- for pass=1,2 do
- if trace_packing then
- report_otf("start packing: stage 2, pass %s",pass)
- end
- local pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed,pack_normal_cc=packers(pass)
- for unicode,description in next,descriptions do
- local math=description.math
- if math then
- local kerns=math.kerns
- if kerns then
- math.kerns=pack_normal(kerns)
- end
- end
- end
- local function packthem(sequences)
- for i=1,#sequences do
- local sequence=sequences[i]
- local kind=sequence.type
- local steps=sequence.steps
- local features=sequence.features
- if steps then
- for i=1,#steps do
- local step=steps[i]
- if kind=="gpos_pair" then
- local c=step.coverage
- if c then
- if step.format=="pair" then
- for g1,d1 in next,c do
- for g2,d2 in next,d1 do
- d1[g2]=pack_normal(d2)
- end
- end
- end
- end
- elseif kind=="gpos_mark2ligature" then
- local c=step.baseclasses
- if c then
- for g1,d1 in next,c do
- for g2,d2 in next,d1 do
- d1[g2]=pack_normal(d2)
- end
- end
- end
- end
- local rules=step.rules
- if rules then
- for i=1,#rules do
- local rule=rules[i]
- local r=rule.before if r then rule.before=pack_normal(r) end
- local r=rule.after if r then rule.after=pack_normal(r) end
- local r=rule.current if r then rule.current=pack_normal(r) end
- end
- end
- end
- end
- if features then
- sequence.features=pack_normal(features)
- end
- end
- end
- if sequences then
- packthem(sequences)
- end
- if sublookups then
- packthem(sublookups)
- end
- if variable then
- local function unpackdeltas(main)
- if main then
- local regions=main.regions
- if regions then
- main.regions=pack_normal(regions)
- end
- end
- end
- unpackdeltas(variable.global)
- unpackdeltas(variable.horizontal)
- unpackdeltas(variable.vertical)
- unpackdeltas(variable.metrics)
- end
- end
- for pass=1,2 do
- if trace_packing then
- report_otf("start packing: stage 3, pass %s",pass)
- end
- local pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed,pack_normal_cc=packers(pass)
- local function packthem(sequences)
- for i=1,#sequences do
- local sequence=sequences[i]
- local kind=sequence.type
- local steps=sequence.steps
- local features=sequence.features
- if steps then
- for i=1,#steps do
- local step=steps[i]
- if kind=="gpos_pair" then
- local c=step.coverage
- if c then
- if step.format=="pair" then
- for g1,d1 in next,c do
- c[g1]=pack_normal(d1)
- end
- end
- end
- elseif kind=="gpos_cursive" then
- local c=step.coverage
- if c then
- for g1,d1 in next,c do
- c[g1]=pack_normal_cc(d1)
- end
- end
- end
- end
- end
- end
- end
- if sequences then
- packthem(sequences)
- end
- if sublookups then
- packthem(sublookups)
- end
- end
- end
- end
-end
-local unpacked_mt={
- __index=function(t,k)
- t[k]=false
- return k
- end
-}
-function readers.unpack(data)
- if data then
- local tables=data.tables
- if tables then
- local resources=data.resources
- local descriptions=data.descriptions or data.glyphs
- local sequences=resources.sequences
- local sublookups=resources.sublookups
- local features=resources.features
- local palettes=resources.colorpalettes
- local variable=resources.variabledata
- local unpacked={}
- setmetatable(unpacked,unpacked_mt)
- for unicode,description in next,descriptions do
- local tv=tables[description.boundingbox]
- if tv then
- description.boundingbox=tv
- end
- local math=description.math
- if math then
- local kerns=math.kerns
- if kerns then
- local tm=tables[kerns]
- if tm then
- math.kerns=tm
- kerns=unpacked[tm]
- end
- if kerns then
- for k,kern in next,kerns do
- local tv=tables[kern]
- if tv then
- kerns[k]=tv
- end
- end
- end
- end
- end
- end
- local function unpackthem(sequences)
- for i=1,#sequences do
- local sequence=sequences[i]
- local kind=sequence.type
- local steps=sequence.steps
- local order=sequence.order
- local features=sequence.features
- local flags=sequence.flags
- local markclass=sequence.markclass
- if features then
- local tv=tables[features]
- if tv then
- sequence.features=tv
- features=tv
- end
- for script,feature in next,features do
- local tv=tables[feature]
- if tv then
- features[script]=tv
- end
- end
- end
- if steps then
- for i=1,#steps do
- local step=steps[i]
- if kind=="gpos_pair" then
- local c=step.coverage
- if c then
- if step.format=="pair" then
- for g1,d1 in next,c do
- local tv=tables[d1]
- if tv then
- c[g1]=tv
- d1=tv
- end
- for g2,d2 in next,d1 do
- local tv=tables[d2]
- if tv then
- d1[g2]=tv
- d2=tv
- end
- local f=tables[d2[1]] if f then d2[1]=f end
- local s=tables[d2[2]] if s then d2[2]=s end
- end
- end
- else
- for g1,d1 in next,c do
- local tv=tables[d1]
- if tv then
- c[g1]=tv
- end
- end
- end
- end
- elseif kind=="gpos_single" then
- local c=step.coverage
- if c then
- if step.format=="single" then
- for g1,d1 in next,c do
- local tv=tables[d1]
- if tv then
- c[g1]=tv
- end
- end
- else
- local tv=tables[c]
- if tv then
- step.coverage=tv
- end
- end
- end
- elseif kind=="gpos_cursive" then
- local c=step.coverage
- if c then
- for g1,d1 in next,c do
- local tv=tables[d1]
- if tv then
- d1=tv
- c[g1]=d1
- end
- local f=tables[d1[2]] if f then d1[2]=f end
- local s=tables[d1[3]] if s then d1[3]=s end
- end
- end
- elseif kind=="gpos_mark2base" or kind=="gpos_mark2mark" then
- local c=step.baseclasses
- if c then
- for g1,d1 in next,c do
- for g2,d2 in next,d1 do
- local tv=tables[d2]
- if tv then
- d1[g2]=tv
- end
- end
- end
- end
- local c=step.coverage
- if c then
- for g1,d1 in next,c do
- local tv=tables[d1[2]]
- if tv then
- d1[2]=tv
- end
- end
- end
- elseif kind=="gpos_mark2ligature" then
- local c=step.baseclasses
- if c then
- for g1,d1 in next,c do
- for g2,d2 in next,d1 do
- local tv=tables[d2]
- if tv then
- d2=tv
- d1[g2]=d2
- end
- for g3,d3 in next,d2 do
- local tv=tables[d2[g3]]
- if tv then
- d2[g3]=tv
- end
- end
- end
- end
- end
- local c=step.coverage
- if c then
- for g1,d1 in next,c do
- local tv=tables[d1[2]]
- if tv then
- d1[2]=tv
- end
- end
- end
- end
- local rules=step.rules
- if rules then
- for i=1,#rules do
- local rule=rules[i]
- local before=rule.before
- if before then
- local tv=tables[before]
- if tv then
- rule.before=tv
- before=tv
- end
- for i=1,#before do
- local tv=tables[before[i]]
- if tv then
- before[i]=tv
- end
- end
- end
- local after=rule.after
- if after then
- local tv=tables[after]
- if tv then
- rule.after=tv
- after=tv
- end
- for i=1,#after do
- local tv=tables[after[i]]
- if tv then
- after[i]=tv
- end
- end
- end
- local current=rule.current
- if current then
- local tv=tables[current]
- if tv then
- rule.current=tv
- current=tv
- end
- for i=1,#current do
- local tv=tables[current[i]]
- if tv then
- current[i]=tv
- end
- end
- end
- local replacements=rule.replacements
- if replacements then
- local tv=tables[replacements]
- if tv then
- rule.replacements=tv
- end
- end
- end
- end
- end
- end
- if order then
- local tv=tables[order]
- if tv then
- sequence.order=tv
- end
- end
- if flags then
- local tv=tables[flags]
- if tv then
- sequence.flags=tv
- end
- end
- end
- end
- if sequences then
- unpackthem(sequences)
- end
- if sublookups then
- unpackthem(sublookups)
- end
- if features then
- for k,list in next,features do
- for feature,spec in next,list do
- local tv=tables[spec]
- if tv then
- list[feature]=tv
- end
- end
- end
- end
- if palettes then
- for i=1,#palettes do
- local p=palettes[i]
- for j=1,#p do
- local tv=tables[p[j]]
- if tv then
- p[j]=tv
- end
- end
- end
- end
- if variable then
- local instances=variable.instances
- if instances then
- for i=1,#instances do
- local v=instances[i].values
- for j=1,#v do
- local tv=tables[v[j]]
- if tv then
- v[j]=tv
- end
- end
- end
- end
- local function unpackdeltas(main)
- if main then
- local deltas=main.deltas
- if deltas then
- for i=1,#deltas do
- local di=deltas[i]
- local d=di.deltas
- local r=di.regions
- for j=1,#d do
- local tv=tables[d[j]]
- if tv then
- d[j]=tv
- end
- end
- local tv=di.regions
- if tv then
- di.regions=tv
- end
- end
- end
- local regions=main.regions
- if regions then
- local tv=tables[regions]
- if tv then
- main.regions=tv
- regions=tv
- end
- for i=1,#regions do
- local r=regions[i]
- for j=1,#r do
- local tv=tables[r[j]]
- if tv then
- r[j]=tv
- end
- end
- end
- end
- end
- end
- unpackdeltas(variable.global)
- unpackdeltas(variable.horizontal)
- unpackdeltas(variable.vertical)
- unpackdeltas(variable.metrics)
- end
- data.tables=nil
- end
- end
-end
-local mt={
- __index=function(t,k)
- if k=="height" then
- local ht=t.boundingbox[4]
- return ht<0 and 0 or ht
- elseif k=="depth" then
- local dp=-t.boundingbox[2]
- return dp<0 and 0 or dp
- elseif k=="width" then
- return 0
- elseif k=="name" then
- return forcenotdef and ".notdef"
- end
- end
-}
-local function sameformat(sequence,steps,first,nofsteps,kind)
- return true
-end
-local function mergesteps_1(lookup,strict)
- local steps=lookup.steps
- local nofsteps=lookup.nofsteps
- local first=steps[1]
- if strict then
- local f=first.format
- for i=2,nofsteps do
- if steps[i].format~=f then
- if trace_optimizations then
- report_optimizations("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name)
- end
- return 0
- end
- end
- end
- if trace_optimizations then
- report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name)
- end
- local target=first.coverage
- for i=2,nofsteps do
- local c=steps[i].coverage
- if c then
- for k,v in next,c do
- if not target[k] then
- target[k]=v
- end
- end
- end
- end
- lookup.nofsteps=1
- lookup.merged=true
- lookup.steps={ first }
- return nofsteps-1
-end
-local function mergesteps_2(lookup)
- local steps=lookup.steps
- local nofsteps=lookup.nofsteps
- local first=steps[1]
- if strict then
- local f=first.format
- for i=2,nofsteps do
- if steps[i].format~=f then
- if trace_optimizations then
- report_optimizations("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name)
- end
- return 0
- end
- end
- end
- if trace_optimizations then
- report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name)
- end
- local target=first.coverage
- for i=2,nofsteps do
- local c=steps[i].coverage
- if c then
- for k,v in next,c do
- local tk=target[k]
- if tk then
- for kk,vv in next,v do
- if tk[kk]==nil then
- tk[kk]=vv
- end
- end
- else
- target[k]=v
- end
- end
- end
- end
- lookup.nofsteps=1
- lookup.merged=true
- lookup.steps={ first }
- return nofsteps-1
-end
-local function mergesteps_3(lookup,strict)
- local steps=lookup.steps
- local nofsteps=lookup.nofsteps
- if trace_optimizations then
- report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name)
- end
- local coverage={}
- for i=1,nofsteps do
- local c=steps[i].coverage
- if c then
- for k,v in next,c do
- local tk=coverage[k]
- if tk then
- if trace_optimizations then
- report_optimizations("quitting merge due to multiple checks")
- end
- return nofsteps
- else
- coverage[k]=v
- end
- end
- end
- end
- local first=steps[1]
- local baseclasses={}
- for i=1,nofsteps do
- local offset=i*10
- local step=steps[i]
- for k,v in sortedhash(step.baseclasses) do
- baseclasses[offset+k]=v
- end
- for k,v in next,step.coverage do
- v[1]=offset+v[1]
- end
- end
- first.baseclasses=baseclasses
- first.coverage=coverage
- lookup.nofsteps=1
- lookup.merged=true
- lookup.steps={ first }
- return nofsteps-1
-end
-local function nested(old,new)
- for k,v in next,old do
- if k=="ligature" then
- if not new.ligature then
- new.ligature=v
- end
- else
- local n=new[k]
- if n then
- nested(v,n)
- else
- new[k]=v
- end
- end
- end
-end
-local function mergesteps_4(lookup)
- local steps=lookup.steps
- local nofsteps=lookup.nofsteps
- local first=steps[1]
- if trace_optimizations then
- report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name)
- end
- local target=first.coverage
- for i=2,nofsteps do
- local c=steps[i].coverage
- if c then
- for k,v in next,c do
- local tk=target[k]
- if tk then
- nested(v,tk)
- else
- target[k]=v
- end
- end
- end
- end
- lookup.nofsteps=1
- lookup.steps={ first }
- return nofsteps-1
-end
-local function mergesteps_5(lookup)
- local steps=lookup.steps
- local nofsteps=lookup.nofsteps
- local first=steps[1]
- if trace_optimizations then
- report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name)
- end
- local target=first.coverage
- local hash=nil
- for k,v in next,target do
- hash=v[1]
- break
- end
- for i=2,nofsteps do
- local c=steps[i].coverage
- if c then
- for k,v in next,c do
- local tk=target[k]
- if tk then
- if not tk[2] then
- tk[2]=v[2]
- end
- if not tk[3] then
- tk[3]=v[3]
- end
- else
- target[k]=v
- v[1]=hash
- end
- end
- end
- end
- lookup.nofsteps=1
- lookup.merged=true
- lookup.steps={ first }
- return nofsteps-1
-end
-local function checkkerns(lookup)
- local steps=lookup.steps
- local nofsteps=lookup.nofsteps
- local kerned=0
- for i=1,nofsteps do
- local step=steps[i]
- if step.format=="pair" then
- local coverage=step.coverage
- local kerns=true
- for g1,d1 in next,coverage do
- if d1==true then
- elseif not d1 then
- elseif d1[1]~=0 or d1[2]~=0 or d1[4]~=0 then
- kerns=false
- break
- end
- end
- if kerns then
- if trace_optimizations then
- report_optimizations("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name)
- end
- local c={}
- for g1,d1 in next,coverage do
- if d1 and d1~=true then
- c[g1]=d1[3]
- end
- end
- step.coverage=c
- step.format="move"
- kerned=kerned+1
- end
- end
- end
- return kerned
-end
-local function checkpairs(lookup)
- local steps=lookup.steps
- local nofsteps=lookup.nofsteps
- local kerned=0
- local function onlykerns(step)
- local coverage=step.coverage
- for g1,d1 in next,coverage do
- for g2,d2 in next,d1 do
- if d2[2] then
- return false
- else
- local v=d2[1]
- if v==true then
- elseif v and (v[1]~=0 or v[2]~=0 or v[4]~=0) then
- return false
- end
- end
- end
- end
- return coverage
- end
- for i=1,nofsteps do
- local step=steps[i]
- if step.format=="pair" then
- local coverage=onlykerns(step)
- if coverage then
- if trace_optimizations then
- report_optimizations("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name)
- end
- for g1,d1 in next,coverage do
- local d={}
- for g2,d2 in next,d1 do
- local v=d2[1]
- if v==true then
- elseif v then
- d[g2]=v[3]
- end
- end
- coverage[g1]=d
- end
- step.format="move"
- kerned=kerned+1
- end
- end
- end
- return kerned
-end
-local compact_pairs=true
-local compact_singles=true
-local merge_pairs=true
-local merge_singles=true
-local merge_substitutions=true
-local merge_alternates=true
-local merge_multiples=true
-local merge_ligatures=true
-local merge_cursives=true
-local merge_marks=true
-directives.register("otf.compact.pairs",function(v) compact_pairs=v end)
-directives.register("otf.compact.singles",function(v) compact_singles=v end)
-directives.register("otf.merge.pairs",function(v) merge_pairs=v end)
-directives.register("otf.merge.singles",function(v) merge_singles=v end)
-directives.register("otf.merge.substitutions",function(v) merge_substitutions=v end)
-directives.register("otf.merge.alternates",function(v) merge_alternates=v end)
-directives.register("otf.merge.multiples",function(v) merge_multiples=v end)
-directives.register("otf.merge.ligatures",function(v) merge_ligatures=v end)
-directives.register("otf.merge.cursives",function(v) merge_cursives=v end)
-directives.register("otf.merge.marks",function(v) merge_marks=v end)
-function readers.compact(data)
- if not data or data.compacted then
- return
- else
- data.compacted=true
- end
- local resources=data.resources
- local merged=0
- local kerned=0
- local allsteps=0
- local function compact(what)
- local lookups=resources[what]
- if lookups then
- for i=1,#lookups do
- local lookup=lookups[i]
- local nofsteps=lookup.nofsteps
- local kind=lookup.type
- allsteps=allsteps+nofsteps
- if nofsteps>1 then
- local merg=merged
- if kind=="gsub_single" then
- if merge_substitutions then
- merged=merged+mergesteps_1(lookup)
- end
- elseif kind=="gsub_alternate" then
- if merge_alternates then
- merged=merged+mergesteps_1(lookup)
- end
- elseif kind=="gsub_multiple" then
- if merge_multiples then
- merged=merged+mergesteps_1(lookup)
- end
- elseif kind=="gsub_ligature" then
- if merge_ligatures then
- merged=merged+mergesteps_4(lookup)
- end
- elseif kind=="gpos_single" then
- if merge_singles then
- merged=merged+mergesteps_1(lookup,true)
- end
- if compact_singles then
- kerned=kerned+checkkerns(lookup)
- end
- elseif kind=="gpos_pair" then
- if merge_pairs then
- merged=merged+mergesteps_2(lookup)
- end
- if compact_pairs then
- kerned=kerned+checkpairs(lookup)
- end
- elseif kind=="gpos_cursive" then
- if merge_cursives then
- merged=merged+mergesteps_5(lookup)
- end
- elseif kind=="gpos_mark2mark" or kind=="gpos_mark2base" or kind=="gpos_mark2ligature" then
- if merge_marks then
- merged=merged+mergesteps_3(lookup)
- end
- end
- if merg~=merged then
- lookup.merged=true
- end
- elseif nofsteps==1 then
- local kern=kerned
- if kind=="gpos_single" then
- if compact_singles then
- kerned=kerned+checkkerns(lookup)
- end
- elseif kind=="gpos_pair" then
- if compact_pairs then
- kerned=kerned+checkpairs(lookup)
- end
- end
- if kern~=kerned then
- end
- end
- end
- elseif trace_optimizations then
- report_optimizations("no lookups in %a",what)
- end
- end
- compact("sequences")
- compact("sublookups")
- if trace_optimizations then
- if merged>0 then
- report_optimizations("%i steps of %i removed due to merging",merged,allsteps)
- end
- if kerned>0 then
- report_optimizations("%i steps of %i steps turned from pairs into kerns",kerned,allsteps)
- end
- end
-end
-local function mergesteps(t,k)
- if k=="merged" then
- local merged={}
- for i=1,#t do
- local step=t[i]
- local coverage=step.coverage
- for k in next,coverage do
- local m=merged[k]
- if m then
- m[2]=i
- else
- merged[k]={ i,i }
- end
- end
- end
- t.merged=merged
- return merged
- end
-end
-local function checkmerge(sequence)
- local steps=sequence.steps
- if steps then
- setmetatableindex(steps,mergesteps)
- end
-end
-local function checkflags(sequence,resources)
- if not sequence.skiphash then
- local flags=sequence.flags
- if flags then
- local skipmark=flags[1]
- local skipligature=flags[2]
- local skipbase=flags[3]
- local markclass=sequence.markclass
- local skipsome=skipmark or skipligature or skipbase or markclass or false
- if skipsome then
- sequence.skiphash=setmetatableindex(function(t,k)
- local c=resources.classes[k]
- local v=c==skipmark
- or (markclass and c=="mark" and not markclass[k])
- or c==skipligature
- or c==skipbase
- or false
- t[k]=v
- return v
- end)
- else
- sequence.skiphash=false
- end
- else
- sequence.skiphash=false
- end
- end
-end
-local function checksteps(sequence)
- local steps=sequence.steps
- if steps then
- for i=1,#steps do
- steps[i].index=i
- end
- end
-end
-if fonts.helpers then
- fonts.helpers.checkmerge=checkmerge
- fonts.helpers.checkflags=checkflags
- fonts.helpers.checksteps=checksteps
-end
-function readers.expand(data)
- if not data or data.expanded then
- return
- else
- data.expanded=true
- end
- local resources=data.resources
- local sublookups=resources.sublookups
- local sequences=resources.sequences
- local markclasses=resources.markclasses
- local descriptions=data.descriptions
- if descriptions then
- local defaultwidth=resources.defaultwidth or 0
- local defaultheight=resources.defaultheight or 0
- local defaultdepth=resources.defaultdepth or 0
- local basename=trace_markwidth and file.basename(resources.filename)
- for u,d in next,descriptions do
- local bb=d.boundingbox
- local wd=d.width
- if not wd then
- d.width=defaultwidth
- elseif trace_markwidth and wd~=0 and d.class=="mark" then
- report_markwidth("mark %a with width %b found in %a",d.name or "",wd,basename)
- end
- if bb then
- local ht=bb[4]
- local dp=-bb[2]
- if ht==0 or ht<0 then
- else
- d.height=ht
- end
- if dp==0 or dp<0 then
- else
- d.depth=dp
- end
- end
- end
- end
- local function expandlookups(sequences)
- if sequences then
- for i=1,#sequences do
- local sequence=sequences[i]
- local steps=sequence.steps
- if steps then
- local nofsteps=sequence.nofsteps
- local kind=sequence.type
- local markclass=sequence.markclass
- if markclass then
- if not markclasses then
- report_warning("missing markclasses")
- sequence.markclass=false
- else
- sequence.markclass=markclasses[markclass]
- end
- end
- for i=1,nofsteps do
- local step=steps[i]
- local baseclasses=step.baseclasses
- if baseclasses then
- local coverage=step.coverage
- for k,v in next,coverage do
- v[1]=baseclasses[v[1]]
- end
- elseif kind=="gpos_cursive" then
- local coverage=step.coverage
- for k,v in next,coverage do
- v[1]=coverage
- end
- end
- local rules=step.rules
- if rules then
- local rulehash={ n=0 }
- local rulesize=0
- local coverage={}
- local lookuptype=sequence.type
- local nofrules=#rules
- step.coverage=coverage
- for currentrule=1,nofrules do
- local rule=rules[currentrule]
- local current=rule.current
- local before=rule.before
- local after=rule.after
- local replacements=rule.replacements or false
- local sequence={}
- local nofsequences=0
- if before then
- for n=1,#before do
- nofsequences=nofsequences+1
- sequence[nofsequences]=before[n]
- end
- end
- local start=nofsequences+1
- for n=1,#current do
- nofsequences=nofsequences+1
- sequence[nofsequences]=current[n]
- end
- local stop=nofsequences
- if after then
- for n=1,#after do
- nofsequences=nofsequences+1
- sequence[nofsequences]=after[n]
- end
- end
- local lookups=rule.lookups or false
- local subtype=nil
- if lookups then
- for i=1,#lookups do
- local lookups=lookups[i]
- if lookups then
- for k,v in next,lookups do
- local lookup=sublookups[v]
- if lookup then
- lookups[k]=lookup
- if not subtype then
- subtype=lookup.type
- end
- else
- end
- end
- end
- end
- end
- if sequence[1] then
- sequence.n=#sequence
- local ruledata={
- currentrule,
- lookuptype,
- sequence,
- start,
- stop,
- lookups,
- replacements,
- subtype,
- }
- rulesize=rulesize+1
- rulehash[rulesize]=ruledata
- rulehash.n=rulesize
- if true then
- for unic in next,sequence[start] do
- local cu=coverage[unic]
- if cu then
- local n=#cu+1
- cu[n]=ruledata
- cu.n=n
- else
- coverage[unic]={ ruledata,n=1 }
- end
- end
- else
- for unic in next,sequence[start] do
- local cu=coverage[unic]
- if cu then
- else
- coverage[unic]=rulehash
- end
- end
- end
- end
- end
- end
- end
- checkmerge(sequence)
- checkflags(sequence,resources)
- checksteps(sequence)
- end
- end
- end
- end
- expandlookups(sequences)
- expandlookups(sublookups)
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-oup”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-otl” ec0241b7465a7713e53c246e8e9fb2a8] ---
-
-if not modules then modules={} end modules ['font-otl']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files",
-}
-local lower=string.lower
-local type,next,tonumber,tostring,unpack=type,next,tonumber,tostring,unpack
-local abs=math.abs
-local derivetable=table.derive
-local formatters=string.formatters
-local setmetatableindex=table.setmetatableindex
-local allocate=utilities.storage.allocate
-local registertracker=trackers.register
-local registerdirective=directives.register
-local starttiming=statistics.starttiming
-local stoptiming=statistics.stoptiming
-local elapsedtime=statistics.elapsedtime
-local findbinfile=resolvers.findbinfile
-local trace_loading=false registertracker("otf.loading",function(v) trace_loading=v end)
-local trace_features=false registertracker("otf.features",function(v) trace_features=v end)
-local trace_defining=false registertracker("fonts.defining",function(v) trace_defining=v end)
-local report_otf=logs.reporter("fonts","otf loading")
-local fonts=fonts
-local otf=fonts.handlers.otf
-otf.version=3.110
-otf.cache=containers.define("fonts","otl",otf.version,true)
-otf.svgcache=containers.define("fonts","svg",otf.version,true)
-otf.pngcache=containers.define("fonts","png",otf.version,true)
-otf.pdfcache=containers.define("fonts","pdf",otf.version,true)
-otf.mpscache=containers.define("fonts","mps",otf.version,true)
-otf.svgenabled=false
-otf.pngenabled=false
-local otfreaders=otf.readers
-local hashes=fonts.hashes
-local definers=fonts.definers
-local readers=fonts.readers
-local constructors=fonts.constructors
-local otffeatures=constructors.features.otf
-local registerotffeature=otffeatures.register
-local otfenhancers=constructors.enhancers.otf
-local registerotfenhancer=otfenhancers.register
-local forceload=false
-local cleanup=0
-local syncspace=true
-local forcenotdef=false
-local privateoffset=fonts.constructors and fonts.constructors.privateoffset or 0xF0000
-local applyruntimefixes=fonts.treatments and fonts.treatments.applyfixes
-local wildcard="*"
-local default="dflt"
-local formats=fonts.formats
-formats.otf="opentype"
-formats.ttf="truetype"
-formats.ttc="truetype"
-registerdirective("fonts.otf.loader.cleanup",function(v) cleanup=tonumber(v) or (v and 1) or 0 end)
-registerdirective("fonts.otf.loader.force",function(v) forceload=v end)
-registerdirective("fonts.otf.loader.syncspace",function(v) syncspace=v end)
-registerdirective("fonts.otf.loader.forcenotdef",function(v) forcenotdef=v end)
-registerotfenhancer("check extra features",function() end)
-local checkmemory=utilities.lua and utilities.lua.checkmemory
-local threshold=100
-local tracememory=false
-registertracker("fonts.otf.loader.memory",function(v) tracememory=v end)
-if not checkmemory then
- local collectgarbage=collectgarbage
- checkmemory=function(previous,threshold)
- local current=collectgarbage("count")
- if previous then
- local checked=(threshold or 64)*1024
- if current-previous>checked then
- collectgarbage("collect")
- current=collectgarbage("count")
- end
- end
- return current
- end
-end
-function otf.load(filename,sub,instance)
- local base=file.basename(file.removesuffix(filename))
- local name=file.removesuffix(base)
- local attr=lfs.attributes(filename)
- local size=attr and attr.size or 0
- local time=attr and attr.modification or 0
- if sub=="" then
- sub=false
- end
- local hash=name
- if sub then
- hash=hash.."-"..sub
- end
- if instance then
- hash=hash.."-"..instance
- end
- hash=containers.cleanname(hash)
- local data=containers.read(otf.cache,hash)
- local reload=not data or data.size~=size or data.time~=time or data.tableversion~=otfreaders.tableversion
- if forceload then
- report_otf("forced reload of %a due to hard coded flag",filename)
- reload=true
- end
- if reload then
- report_otf("loading %a, hash %a",filename,hash)
- starttiming(otfreaders,true)
- data=otfreaders.loadfont(filename,sub or 1,instance)
- if data then
- local used=checkmemory()
- local resources=data.resources
- local svgshapes=resources.svgshapes
- local pngshapes=resources.pngshapes
- if cleanup==0 then
- checkmemory(used,threshold,tracememory)
- end
- if svgshapes then
- resources.svgshapes=nil
- if otf.svgenabled then
- local timestamp=os.date()
- containers.write(otf.svgcache,hash,{
- svgshapes=svgshapes,
- timestamp=timestamp,
- })
- data.properties.svg={
- hash=hash,
- timestamp=timestamp,
- }
- end
- if cleanup>1 then
- collectgarbage("collect")
- else
- checkmemory(used,threshold,tracememory)
- end
- end
- if pngshapes then
- resources.pngshapes=nil
- if otf.pngenabled then
- local timestamp=os.date()
- containers.write(otf.pngcache,hash,{
- pngshapes=pngshapes,
- timestamp=timestamp,
- })
- data.properties.png={
- hash=hash,
- timestamp=timestamp,
- }
- end
- if cleanup>1 then
- collectgarbage("collect")
- else
- checkmemory(used,threshold,tracememory)
- end
- end
- otfreaders.compact(data)
- if cleanup==0 then
- checkmemory(used,threshold,tracememory)
- end
- otfreaders.rehash(data,"unicodes")
- otfreaders.addunicodetable(data)
- otfreaders.extend(data)
- if cleanup==0 then
- checkmemory(used,threshold,tracememory)
- end
- otfreaders.pack(data)
- report_otf("loading done")
- report_otf("saving %a in cache",filename)
- data=containers.write(otf.cache,hash,data)
- if cleanup>1 then
- collectgarbage("collect")
- else
- checkmemory(used,threshold,tracememory)
- end
- stoptiming(otfreaders)
- if elapsedtime then
- report_otf("loading, optimizing, packing and caching time %s",elapsedtime(otfreaders))
- end
- if cleanup>3 then
- collectgarbage("collect")
- else
- checkmemory(used,threshold,tracememory)
- end
- data=containers.read(otf.cache,hash)
- if cleanup>2 then
- collectgarbage("collect")
- else
- checkmemory(used,threshold,tracememory)
- end
- else
- stoptiming(otfreaders)
- data=nil
- report_otf("loading failed due to read error")
- end
- end
- if data then
- if trace_defining then
- report_otf("loading from cache using hash %a",hash)
- end
- otfreaders.unpack(data)
- otfreaders.expand(data)
- otfreaders.addunicodetable(data)
- otfenhancers.apply(data,filename,data)
- if applyruntimefixes then
- applyruntimefixes(filename,data)
- end
- data.metadata.math=data.resources.mathconstants
- local classes=data.resources.classes
- if not classes then
- local descriptions=data.descriptions
- classes=setmetatableindex(function(t,k)
- local d=descriptions[k]
- local v=(d and d.class or "base") or false
- t[k]=v
- return v
- end)
- data.resources.classes=classes
- end
- end
- return data
-end
-function otf.setfeatures(tfmdata,features)
- local okay=constructors.initializefeatures("otf",tfmdata,features,trace_features,report_otf)
- if okay then
- return constructors.collectprocessors("otf",tfmdata,features,trace_features,report_otf)
- else
- return {}
- end
-end
-local function copytotfm(data,cache_id)
- if data then
- local metadata=data.metadata
- local properties=derivetable(data.properties)
- local descriptions=derivetable(data.descriptions)
- local goodies=derivetable(data.goodies)
- local characters={}
- local parameters={}
- local mathparameters={}
- local resources=data.resources
- local unicodes=resources.unicodes
- local spaceunits=500
- local spacer="space"
- local designsize=metadata.designsize or 100
- local minsize=metadata.minsize or designsize
- local maxsize=metadata.maxsize or designsize
- local mathspecs=metadata.math
- if designsize==0 then
- designsize=100
- minsize=100
- maxsize=100
- end
- if mathspecs then
- for name,value in next,mathspecs do
- mathparameters[name]=value
- end
- end
- for unicode in next,data.descriptions do
- characters[unicode]={}
- end
- if mathspecs then
- for unicode,character in next,characters do
- local d=descriptions[unicode]
- local m=d.math
- if m then
- local italic=m.italic
- local vitalic=m.vitalic
- local variants=m.hvariants
- local parts=m.hparts
- if variants then
- local c=character
- for i=1,#variants do
- local un=variants[i]
- c.next=un
- c=characters[un]
- end
- c.horiz_variants=parts
- elseif parts then
- character.horiz_variants=parts
- italic=m.hitalic
- end
- local variants=m.vvariants
- local parts=m.vparts
- if variants then
- local c=character
- for i=1,#variants do
- local un=variants[i]
- c.next=un
- c=characters[un]
- end
- c.vert_variants=parts
- elseif parts then
- character.vert_variants=parts
- end
- if italic and italic~=0 then
- character.italic=italic
- end
- if vitalic and vitalic~=0 then
- character.vert_italic=vitalic
- end
- local accent=m.accent
- if accent then
- character.accent=accent
- end
- local kerns=m.kerns
- if kerns then
- character.mathkerns=kerns
- end
- end
- end
- end
- local filename=constructors.checkedfilename(resources)
- local fontname=metadata.fontname
- local fullname=metadata.fullname or fontname
- local psname=fontname or fullname
- local subfont=metadata.subfontindex
- local units=metadata.units or 1000
- if units==0 then
- units=1000
- metadata.units=1000
- report_otf("changing %a units to %a",0,units)
- end
- local monospaced=metadata.monospaced
- local charwidth=metadata.averagewidth
- local charxheight=metadata.xheight
- local italicangle=metadata.italicangle
- local hasitalics=metadata.hasitalics
- properties.monospaced=monospaced
- properties.hasitalics=hasitalics
- parameters.italicangle=italicangle
- parameters.charwidth=charwidth
- parameters.charxheight=charxheight
- local space=0x0020
- local emdash=0x2014
- if monospaced then
- if descriptions[space] then
- spaceunits,spacer=descriptions[space].width,"space"
- end
- if not spaceunits and descriptions[emdash] then
- spaceunits,spacer=descriptions[emdash].width,"emdash"
- end
- if not spaceunits and charwidth then
- spaceunits,spacer=charwidth,"charwidth"
- end
- else
- if descriptions[space] then
- spaceunits,spacer=descriptions[space].width,"space"
- end
- if not spaceunits and descriptions[emdash] then
- spaceunits,spacer=descriptions[emdash].width/2,"emdash/2"
- end
- if not spaceunits and charwidth then
- spaceunits,spacer=charwidth,"charwidth"
- end
- end
- spaceunits=tonumber(spaceunits) or units/2
- parameters.slant=0
- parameters.space=spaceunits
- parameters.space_stretch=1*units/2
- parameters.space_shrink=1*units/3
- parameters.x_height=2*units/5
- parameters.quad=units
- if spaceunits<2*units/5 then
- end
- if italicangle and italicangle~=0 then
- parameters.italicangle=italicangle
- parameters.italicfactor=math.cos(math.rad(90+italicangle))
- parameters.slant=- math.tan(italicangle*math.pi/180)
- end
- if monospaced then
- parameters.space_stretch=0
- parameters.space_shrink=0
- elseif syncspace then
- parameters.space_stretch=spaceunits/2
- parameters.space_shrink=spaceunits/3
- end
- parameters.extra_space=parameters.space_shrink
- if charxheight then
- parameters.x_height=charxheight
- else
- local x=0x0078
- if x then
- local x=descriptions[x]
- if x then
- parameters.x_height=x.height
- end
- end
- end
- parameters.designsize=(designsize/10)*65536
- parameters.minsize=(minsize/10)*65536
- parameters.maxsize=(maxsize/10)*65536
- parameters.ascender=abs(metadata.ascender or 0)
- parameters.descender=abs(metadata.descender or 0)
- parameters.units=units
- parameters.vheight=metadata.defaultvheight
- properties.space=spacer
- properties.encodingbytes=2
- properties.format=data.format or formats.otf
- properties.filename=filename
- properties.fontname=fontname
- properties.fullname=fullname
- properties.psname=psname
- properties.name=filename or fullname
- properties.subfont=subfont
- properties.private=properties.private or data.private or privateoffset
- return {
- characters=characters,
- descriptions=descriptions,
- parameters=parameters,
- mathparameters=mathparameters,
- resources=resources,
- properties=properties,
- goodies=goodies,
- }
- end
-end
-local converters={
- woff={
- cachename="webfonts",
- action=otf.readers.woff2otf,
- }
-}
-local function checkconversion(specification)
- local filename=specification.filename
- local converter=converters[lower(file.suffix(filename))]
- if converter then
- local base=file.basename(filename)
- local name=file.removesuffix(base)
- local attr=lfs.attributes(filename)
- local size=attr and attr.size or 0
- local time=attr and attr.modification or 0
- if size>0 then
- local cleanname=containers.cleanname(name)
- local cachename=caches.setfirstwritablefile(cleanname,converter.cachename)
- if not io.exists(cachename) or (time~=lfs.attributes(cachename).modification) then
- report_otf("caching font %a in %a",filename,cachename)
- converter.action(filename,cachename)
- lfs.touch(cachename,time,time)
- end
- specification.filename=cachename
- end
- end
-end
-local function otftotfm(specification)
- local cache_id=specification.hash
- local tfmdata=containers.read(constructors.cache,cache_id)
- if not tfmdata then
- checkconversion(specification)
- local name=specification.name
- local sub=specification.sub
- local subindex=specification.subindex
- local filename=specification.filename
- local features=specification.features.normal
- local instance=specification.instance or (features and features.axis)
- local rawdata=otf.load(filename,sub,instance)
- if rawdata and next(rawdata) then
- local descriptions=rawdata.descriptions
- rawdata.lookuphash={}
- tfmdata=copytotfm(rawdata,cache_id)
- if tfmdata and next(tfmdata) then
- local features=constructors.checkedfeatures("otf",features)
- local shared=tfmdata.shared
- if not shared then
- shared={}
- tfmdata.shared=shared
- end
- shared.rawdata=rawdata
- shared.dynamics={}
- tfmdata.changed={}
- shared.features=features
- shared.processes=otf.setfeatures(tfmdata,features)
- end
- end
- containers.write(constructors.cache,cache_id,tfmdata)
- end
- return tfmdata
-end
-local function read_from_otf(specification)
- local tfmdata=otftotfm(specification)
- if tfmdata then
- tfmdata.properties.name=specification.name
- tfmdata.properties.sub=specification.sub
- tfmdata=constructors.scale(tfmdata,specification)
- local allfeatures=tfmdata.shared.features or specification.features.normal
- constructors.applymanipulators("otf",tfmdata,allfeatures,trace_features,report_otf)
- constructors.setname(tfmdata,specification)
- fonts.loggers.register(tfmdata,file.suffix(specification.filename),specification)
- end
- return tfmdata
-end
-local function checkmathsize(tfmdata,mathsize)
- local mathdata=tfmdata.shared.rawdata.metadata.math
- local mathsize=tonumber(mathsize)
- if mathdata then
- local parameters=tfmdata.parameters
- parameters.scriptpercentage=mathdata.ScriptPercentScaleDown
- parameters.scriptscriptpercentage=mathdata.ScriptScriptPercentScaleDown
- parameters.mathsize=mathsize
- end
-end
-registerotffeature {
- name="mathsize",
- description="apply mathsize specified in the font",
- initializers={
- base=checkmathsize,
- node=checkmathsize,
- }
-}
-function otf.collectlookups(rawdata,kind,script,language)
- if not kind then
- return
- end
- if not script then
- script=default
- end
- if not language then
- language=default
- end
- local lookupcache=rawdata.lookupcache
- if not lookupcache then
- lookupcache={}
- rawdata.lookupcache=lookupcache
- end
- local kindlookup=lookupcache[kind]
- if not kindlookup then
- kindlookup={}
- lookupcache[kind]=kindlookup
- end
- local scriptlookup=kindlookup[script]
- if not scriptlookup then
- scriptlookup={}
- kindlookup[script]=scriptlookup
- end
- local languagelookup=scriptlookup[language]
- if not languagelookup then
- local sequences=rawdata.resources.sequences
- local featuremap={}
- local featurelist={}
- if sequences then
- for s=1,#sequences do
- local sequence=sequences[s]
- local features=sequence.features
- if features then
- features=features[kind]
- if features then
- features=features[script] or features[wildcard]
- if features then
- features=features[language] or features[wildcard]
- if features then
- if not featuremap[sequence] then
- featuremap[sequence]=true
- featurelist[#featurelist+1]=sequence
- end
- end
- end
- end
- end
- end
- if #featurelist==0 then
- featuremap,featurelist=false,false
- end
- else
- featuremap,featurelist=false,false
- end
- languagelookup={ featuremap,featurelist }
- scriptlookup[language]=languagelookup
- end
- return unpack(languagelookup)
-end
-local function getgsub(tfmdata,k,kind,value)
- local shared=tfmdata.shared
- local rawdata=shared and shared.rawdata
- if rawdata then
- local sequences=rawdata.resources.sequences
- if sequences then
- local properties=tfmdata.properties
- local validlookups,lookuplist=otf.collectlookups(rawdata,kind,properties.script,properties.language)
- if validlookups then
- for i=1,#lookuplist do
- local lookup=lookuplist[i]
- local steps=lookup.steps
- local nofsteps=lookup.nofsteps
- for i=1,nofsteps do
- local coverage=steps[i].coverage
- if coverage then
- local found=coverage[k]
- if found then
- return found,lookup.type
- end
- end
- end
- end
- end
- end
- end
-end
-otf.getgsub=getgsub
-function otf.getsubstitution(tfmdata,k,kind,value)
- local found,kind=getgsub(tfmdata,k,kind,value)
- if not found then
- elseif kind=="gsub_single" then
- return found
- elseif kind=="gsub_alternate" then
- local choice=tonumber(value) or 1
- return found[choice] or found[1] or k
- end
- return k
-end
-otf.getalternate=otf.getsubstitution
-function otf.getmultiple(tfmdata,k,kind)
- local found,kind=getgsub(tfmdata,k,kind)
- if found and kind=="gsub_multiple" then
- return found
- end
- return { k }
-end
-function otf.getkern(tfmdata,left,right,kind)
- local kerns=getgsub(tfmdata,left,kind or "kern",true)
- if kerns then
- local found=kerns[right]
- local kind=type(found)
- if kind=="table" then
- found=found[1][3]
- elseif kind~="number" then
- found=false
- end
- if found then
- return found*tfmdata.parameters.factor
- end
- end
- return 0
-end
-local function check_otf(forced,specification,suffix)
- local name=specification.name
- if forced then
- name=specification.forcedname
- end
- local fullname=findbinfile(name,suffix) or ""
- if fullname=="" then
- fullname=fonts.names.getfilename(name,suffix) or ""
- end
- if fullname~="" and not fonts.names.ignoredfile(fullname) then
- specification.filename=fullname
- return read_from_otf(specification)
- end
-end
-local function opentypereader(specification,suffix)
- local forced=specification.forced or ""
- if formats[forced] then
- return check_otf(true,specification,forced)
- else
- return check_otf(false,specification,suffix)
- end
-end
-readers.opentype=opentypereader
-function readers.otf(specification) return opentypereader(specification,"otf") end
-function readers.ttf(specification) return opentypereader(specification,"ttf") end
-function readers.ttc(specification) return opentypereader(specification,"ttf") end
-function readers.woff(specification)
- checkconversion(specification)
- opentypereader(specification,"")
-end
-function otf.scriptandlanguage(tfmdata,attr)
- local properties=tfmdata.properties
- return properties.script or "dflt",properties.language or "dflt"
-end
-local function justset(coverage,unicode,replacement)
- coverage[unicode]=replacement
-end
-otf.coverup={
- stepkey="steps",
- actions={
- chainsubstitution=justset,
- chainposition=justset,
- substitution=justset,
- alternate=justset,
- multiple=justset,
- kern=justset,
- pair=justset,
- single=justset,
- ligature=function(coverage,unicode,ligature)
- local first=ligature[1]
- local tree=coverage[first]
- if not tree then
- tree={}
- coverage[first]=tree
- end
- for i=2,#ligature do
- local l=ligature[i]
- local t=tree[l]
- if not t then
- t={}
- tree[l]=t
- end
- tree=t
- end
- tree.ligature=unicode
- end,
- },
- register=function(coverage,featuretype,format)
- return {
- format=format,
- coverage=coverage,
- }
- end
-}
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-otl”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-oto” 24238a7c600d090a8ee88312321dd9b3] ---
-
-if not modules then modules={} end modules ['font-oto']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local concat,unpack=table.concat,table.unpack
-local insert,remove=table.insert,table.remove
-local format,gmatch,gsub,find,match,lower,strip=string.format,string.gmatch,string.gsub,string.find,string.match,string.lower,string.strip
-local type,next,tonumber,tostring=type,next,tonumber,tostring
-local trace_baseinit=false trackers.register("otf.baseinit",function(v) trace_baseinit=v end)
-local trace_singles=false trackers.register("otf.singles",function(v) trace_singles=v end)
-local trace_multiples=false trackers.register("otf.multiples",function(v) trace_multiples=v end)
-local trace_alternatives=false trackers.register("otf.alternatives",function(v) trace_alternatives=v end)
-local trace_ligatures=false trackers.register("otf.ligatures",function(v) trace_ligatures=v end)
-local trace_kerns=false trackers.register("otf.kerns",function(v) trace_kerns=v end)
-local trace_preparing=false trackers.register("otf.preparing",function(v) trace_preparing=v end)
-local report_prepare=logs.reporter("fonts","otf prepare")
-local fonts=fonts
-local otf=fonts.handlers.otf
-local otffeatures=otf.features
-local registerotffeature=otffeatures.register
-otf.defaultbasealternate="none"
-local getprivate=fonts.constructors.getprivate
-local wildcard="*"
-local default="dflt"
-local formatters=string.formatters
-local f_unicode=formatters["%U"]
-local f_uniname=formatters["%U (%s)"]
-local f_unilist=formatters["% t (% t)"]
-local function gref(descriptions,n)
- if type(n)=="number" then
- local name=descriptions[n].name
- if name then
- return f_uniname(n,name)
- else
- return f_unicode(n)
- end
- elseif n then
- local num={}
- local nam={}
- local j=0
- for i=1,#n do
- local ni=n[i]
- if tonumber(ni) then
- j=j+1
- local di=descriptions[ni]
- num[j]=f_unicode(ni)
- nam[j]=di and di.name or "-"
- end
- end
- return f_unilist(num,nam)
- else
- return ""
- end
-end
-local function cref(feature,sequence)
- return formatters["feature %a, type %a, chain lookup %a"](feature,sequence.type,sequence.name)
-end
-local function report_substitution(feature,sequence,descriptions,unicode,substitution)
- if unicode==substitution then
- report_prepare("%s: base substitution %s maps onto itself",
- cref(feature,sequence),
- gref(descriptions,unicode))
- else
- report_prepare("%s: base substitution %s => %S",
- cref(feature,sequence),
- gref(descriptions,unicode),
- gref(descriptions,substitution))
- end
-end
-local function report_alternate(feature,sequence,descriptions,unicode,replacement,value,comment)
- if unicode==replacement then
- report_prepare("%s: base alternate %s maps onto itself",
- cref(feature,sequence),
- gref(descriptions,unicode))
- else
- report_prepare("%s: base alternate %s => %s (%S => %S)",
- cref(feature,sequence),
- gref(descriptions,unicode),
- replacement and gref(descriptions,replacement),
- value,
- comment)
- end
-end
-local function report_ligature(feature,sequence,descriptions,unicode,ligature)
- report_prepare("%s: base ligature %s => %S",
- cref(feature,sequence),
- gref(descriptions,ligature),
- gref(descriptions,unicode))
-end
-local function report_kern(feature,sequence,descriptions,unicode,otherunicode,value)
- report_prepare("%s: base kern %s + %s => %S",
- cref(feature,sequence),
- gref(descriptions,unicode),
- gref(descriptions,otherunicode),
- value)
-end
-local basehash,basehashes,applied={},1,{}
-local function registerbasehash(tfmdata)
- local properties=tfmdata.properties
- local hash=concat(applied," ")
- local base=basehash[hash]
- if not base then
- basehashes=basehashes+1
- base=basehashes
- basehash[hash]=base
- end
- properties.basehash=base
- properties.fullname=(properties.fullname or properties.name).."-"..base
- applied={}
-end
-local function registerbasefeature(feature,value)
- applied[#applied+1]=feature.."="..tostring(value)
-end
-local function makefake(tfmdata,name,present)
- local private=getprivate(tfmdata)
- local character={ intermediate=true,ligatures={} }
- resources.unicodes[name]=private
- tfmdata.characters[private]=character
- tfmdata.descriptions[private]={ name=name }
- present[name]=private
- return character
-end
-local function make_1(present,tree,name)
- for k,v in next,tree do
- if k=="ligature" then
- present[name]=v
- else
- make_1(present,v,name.."_"..k)
- end
- end
-end
-local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,done)
- for k,v in next,tree do
- if k=="ligature" then
- local character=characters[preceding]
- if not character then
- if trace_baseinit then
- report_prepare("weird ligature in lookup %a, current %C, preceding %C",sequence.name,v,preceding)
- end
- character=makefake(tfmdata,name,present)
- end
- local ligatures=character.ligatures
- if ligatures then
- ligatures[unicode]={ char=v }
- else
- character.ligatures={ [unicode]={ char=v } }
- end
- if done then
- local d=done[name]
- if not d then
- done[name]={ "dummy",v }
- else
- d[#d+1]=v
- end
- end
- else
- local code=present[name] or unicode
- local name=name.."_"..k
- make_2(present,tfmdata,characters,v,name,code,k,done)
- end
- end
-end
-local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplist)
- local characters=tfmdata.characters
- local descriptions=tfmdata.descriptions
- local resources=tfmdata.resources
- local changed=tfmdata.changed
- local ligatures={}
- local alternate=tonumber(value) or true and 1
- local defaultalt=otf.defaultbasealternate
- local trace_singles=trace_baseinit and trace_singles
- local trace_alternatives=trace_baseinit and trace_alternatives
- local trace_ligatures=trace_baseinit and trace_ligatures
- if not changed then
- changed={}
- tfmdata.changed=changed
- end
- for i=1,#lookuplist do
- local sequence=lookuplist[i]
- local steps=sequence.steps
- local kind=sequence.type
- if kind=="gsub_single" then
- for i=1,#steps do
- for unicode,data in next,steps[i].coverage do
- if unicode~=data then
- changed[unicode]=data
- end
- if trace_singles then
- report_substitution(feature,sequence,descriptions,unicode,data)
- end
- end
- end
- elseif kind=="gsub_alternate" then
- for i=1,#steps do
- for unicode,data in next,steps[i].coverage do
- local replacement=data[alternate]
- if replacement then
- if unicode~=replacement then
- changed[unicode]=replacement
- end
- if trace_alternatives then
- report_alternate(feature,sequence,descriptions,unicode,replacement,value,"normal")
- end
- elseif defaultalt=="first" then
- replacement=data[1]
- if unicode~=replacement then
- changed[unicode]=replacement
- end
- if trace_alternatives then
- report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt)
- end
- elseif defaultalt=="last" then
- replacement=data[#data]
- if unicode~=replacement then
- changed[unicode]=replacement
- end
- if trace_alternatives then
- report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt)
- end
- else
- if trace_alternatives then
- report_alternate(feature,sequence,descriptions,unicode,replacement,value,"unknown")
- end
- end
- end
- end
- elseif kind=="gsub_ligature" then
- for i=1,#steps do
- for unicode,data in next,steps[i].coverage do
- ligatures[#ligatures+1]={ unicode,data,"" }
- if trace_ligatures then
- report_ligature(feature,sequence,descriptions,unicode,data)
- end
- end
- end
- end
- end
- local nofligatures=#ligatures
- if nofligatures>0 then
- local characters=tfmdata.characters
- local present={}
- local done=trace_baseinit and trace_ligatures and {}
- for i=1,nofligatures do
- local ligature=ligatures[i]
- local unicode=ligature[1]
- local tree=ligature[2]
- make_1(present,tree,"ctx_"..unicode)
- end
- for i=1,nofligatures do
- local ligature=ligatures[i]
- local unicode=ligature[1]
- local tree=ligature[2]
- local lookupname=ligature[3]
- make_2(present,tfmdata,characters,tree,"ctx_"..unicode,unicode,unicode,done,sequence)
- end
- end
-end
-local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist)
- local characters=tfmdata.characters
- local descriptions=tfmdata.descriptions
- local resources=tfmdata.resources
- local properties=tfmdata.properties
- local traceindeed=trace_baseinit and trace_kerns
- for i=1,#lookuplist do
- local sequence=lookuplist[i]
- local steps=sequence.steps
- local kind=sequence.type
- local format=sequence.format
- if kind=="gpos_pair" then
- for i=1,#steps do
- local step=steps[i]
- local format=step.format
- if format=="kern" or format=="move" then
- for unicode,data in next,steps[i].coverage do
- local character=characters[unicode]
- local kerns=character.kerns
- if not kerns then
- kerns={}
- character.kerns=kerns
- end
- if traceindeed then
- for otherunicode,kern in next,data do
- if not kerns[otherunicode] and kern~=0 then
- kerns[otherunicode]=kern
- report_kern(feature,sequence,descriptions,unicode,otherunicode,kern)
- end
- end
- else
- for otherunicode,kern in next,data do
- if not kerns[otherunicode] and kern~=0 then
- kerns[otherunicode]=kern
- end
- end
- end
- end
- else
- for unicode,data in next,steps[i].coverage do
- local character=characters[unicode]
- local kerns=character.kerns
- for otherunicode,kern in next,data do
- local other=kern[2]
- if other==true or (not other and not (kerns and kerns[otherunicode])) then
- local kern=kern[1]
- if kern==true then
- elseif kern[1]~=0 or kern[2]~=0 or kern[4]~=0 then
- else
- kern=kern[3]
- if kern~=0 then
- if kerns then
- kerns[otherunicode]=kern
- else
- kerns={ [otherunicode]=kern }
- character.kerns=kerns
- end
- if traceindeed then
- report_kern(feature,sequence,descriptions,unicode,otherunicode,kern)
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
-end
-local function initializehashes(tfmdata)
-end
-local function checkmathreplacements(tfmdata,fullname,fixitalics)
- if tfmdata.mathparameters then
- local characters=tfmdata.characters
- local changed=tfmdata.changed
- if next(changed) then
- if trace_preparing or trace_baseinit then
- report_prepare("checking math replacements for %a",fullname)
- end
- for unicode,replacement in next,changed do
- local u=characters[unicode]
- local r=characters[replacement]
- if u and r then
- local n=u.next
- local v=u.vert_variants
- local h=u.horiz_variants
- if fixitalics then
- local ui=u.italic
- if ui and not r.italic then
- if trace_preparing then
- report_prepare("using %i units of italic correction from %C for %U",ui,unicode,replacement)
- end
- r.italic=ui
- end
- end
- if n and not r.next then
- if trace_preparing then
- report_prepare("forcing %s for %C substituted by %U","incremental step",unicode,replacement)
- end
- r.next=n
- end
- if v and not r.vert_variants then
- if trace_preparing then
- report_prepare("forcing %s for %C substituted by %U","vertical variants",unicode,replacement)
- end
- r.vert_variants=v
- end
- if h and not r.horiz_variants then
- if trace_preparing then
- report_prepare("forcing %s for %C substituted by %U","horizontal variants",unicode,replacement)
- end
- r.horiz_variants=h
- end
- else
- if trace_preparing then
- report_prepare("error replacing %C by %U",unicode,replacement)
- end
- end
- end
- end
- end
-end
-local function featuresinitializer(tfmdata,value)
- if true then
- local starttime=trace_preparing and os.clock()
- local features=tfmdata.shared.features
- local fullname=tfmdata.properties.fullname or "?"
- if features then
- initializehashes(tfmdata)
- local collectlookups=otf.collectlookups
- local rawdata=tfmdata.shared.rawdata
- local properties=tfmdata.properties
- local script=properties.script
- local language=properties.language
- local rawresources=rawdata.resources
- local rawfeatures=rawresources and rawresources.features
- local basesubstitutions=rawfeatures and rawfeatures.gsub
- local basepositionings=rawfeatures and rawfeatures.gpos
- local substitutionsdone=false
- local positioningsdone=false
- if basesubstitutions or basepositionings then
- local sequences=tfmdata.resources.sequences
- for s=1,#sequences do
- local sequence=sequences[s]
- local sfeatures=sequence.features
- if sfeatures then
- local order=sequence.order
- if order then
- for i=1,#order do
- local feature=order[i]
- local value=features[feature]
- if value then
- local validlookups,lookuplist=collectlookups(rawdata,feature,script,language)
- if not validlookups then
- elseif basesubstitutions and basesubstitutions[feature] then
- if trace_preparing then
- report_prepare("filtering base %s feature %a for %a with value %a","sub",feature,fullname,value)
- end
- preparesubstitutions(tfmdata,feature,value,validlookups,lookuplist)
- registerbasefeature(feature,value)
- substitutionsdone=true
- elseif basepositionings and basepositionings[feature] then
- if trace_preparing then
- report_prepare("filtering base %a feature %a for %a with value %a","pos",feature,fullname,value)
- end
- preparepositionings(tfmdata,feature,value,validlookups,lookuplist)
- registerbasefeature(feature,value)
- positioningsdone=true
- end
- end
- end
- end
- end
- end
- end
- if substitutionsdone then
- checkmathreplacements(tfmdata,fullname,features.fixitalics)
- end
- registerbasehash(tfmdata)
- end
- if trace_preparing then
- report_prepare("preparation time is %0.3f seconds for %a",os.clock()-starttime,fullname)
- end
- end
-end
-registerotffeature {
- name="features",
- description="features",
- default=true,
- initializers={
- base=featuresinitializer,
- }
-}
-otf.basemodeinitializer=featuresinitializer
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-oto”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-otj” 66c7a910d95d4a52b81061de776898e1] ---
-
-if not modules then modules={} end modules ['font-otj']={
- version=1.001,
- comment="companion to font-lib.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files",
-}
-if not nodes.properties then return end
-local next,rawget,tonumber=next,rawget,tonumber
-local fastcopy=table.fastcopy
-local registertracker=trackers.register
-local registerdirective=directives.register
-local trace_injections=false registertracker("fonts.injections",function(v) trace_injections=v end)
-local trace_marks=false registertracker("fonts.injections.marks",function(v) trace_marks=v end)
-local trace_cursive=false registertracker("fonts.injections.cursive",function(v) trace_cursive=v end)
-local trace_spaces=false registertracker("fonts.injections.spaces",function(v) trace_spaces=v end)
-local report_injections=logs.reporter("fonts","injections")
-local report_spaces=logs.reporter("fonts","spaces")
-local attributes,nodes,node=attributes,nodes,node
-fonts=fonts
-local hashes=fonts.hashes
-local fontdata=hashes.identifiers
-local fontmarks=hashes.marks
-nodes.injections=nodes.injections or {}
-local injections=nodes.injections
-local tracers=nodes.tracers
-local setcolor=tracers and tracers.colors.set
-local resetcolor=tracers and tracers.colors.reset
-local nodecodes=nodes.nodecodes
-local glyph_code=nodecodes.glyph
-local disc_code=nodecodes.disc
-local kern_code=nodecodes.kern
-local glue_code=nodecodes.glue
-local nuts=nodes.nuts
-local nodepool=nuts.pool
-local tonode=nuts.tonode
-local tonut=nuts.tonut
-local setfield=nuts.setfield
-local getnext=nuts.getnext
-local getprev=nuts.getprev
-local getid=nuts.getid
-local getfont=nuts.getfont
-local getchar=nuts.getchar
-local getoffsets=nuts.getoffsets
-local getboth=nuts.getboth
-local getdisc=nuts.getdisc
-local setdisc=nuts.setdisc
-local setoffsets=nuts.setoffsets
-local ischar=nuts.ischar
-local getkern=nuts.getkern
-local setkern=nuts.setkern
-local setlink=nuts.setlink
-local setwidth=nuts.setwidth
-local getwidth=nuts.getwidth
-local nextchar=nuts.traversers.char
-local nextglue=nuts.traversers.glue
-local insert_node_before=nuts.insert_before
-local insert_node_after=nuts.insert_after
-local properties=nodes.properties.data
-local fontkern=nuts.pool and nuts.pool.fontkern
-local italickern=nuts.pool and nuts.pool.italickern
-local useitalickerns=false
-directives.register("fonts.injections.useitalics",function(v)
- if v then
- report_injections("using italics for space kerns (tracing only)")
- end
- useitalickerns=v
-end)
-do if not fontkern then
- local thekern=nuts.new("kern",0)
- local setkern=nuts.setkern
- local copy_node=nuts.copy_node
- fontkern=function(k)
- local n=copy_node(thekern)
- setkern(n,k)
- return n
- end
-end end
-do if not italickern then
- local thekern=nuts.new("kern",3)
- local setkern=nuts.setkern
- local copy_node=nuts.copy_node
- italickern=function(k)
- local n=copy_node(thekern)
- setkern(n,k)
- return n
- end
-end end
-function injections.installnewkern() end
-local nofregisteredkerns=0
-local nofregisteredpositions=0
-local nofregisteredmarks=0
-local nofregisteredcursives=0
-local keepregisteredcounts=false
-function injections.keepcounts()
- keepregisteredcounts=true
-end
-function injections.resetcounts()
- nofregisteredkerns=0
- nofregisteredpositions=0
- nofregisteredmarks=0
- nofregisteredcursives=0
- keepregisteredcounts=false
-end
-function injections.reset(n)
- local p=rawget(properties,n)
- if p then
- p.injections=false
- else
- properties[n]=false
- end
-end
-function injections.copy(target,source)
- local sp=rawget(properties,source)
- if sp then
- local tp=rawget(properties,target)
- local si=sp.injections
- if si then
- si=fastcopy(si)
- if tp then
- tp.injections=si
- else
- properties[target]={
- injections=si,
- }
- end
- elseif tp then
- tp.injections=false
- else
- properties[target]={ injections={} }
- end
- else
- local tp=rawget(properties,target)
- if tp then
- tp.injections=false
- else
- properties[target]=false
- end
- end
-end
-function injections.setligaindex(n,index)
- local p=rawget(properties,n)
- if p then
- local i=p.injections
- if i then
- i.ligaindex=index
- else
- p.injections={
- ligaindex=index
- }
- end
- else
- properties[n]={
- injections={
- ligaindex=index
- }
- }
- end
-end
-function injections.getligaindex(n,default)
- local p=rawget(properties,n)
- if p then
- local i=p.injections
- if i then
- return i.ligaindex or default
- end
- end
- return default
-end
-function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext,r2lflag)
- local dx=factor*(exit[1]-entry[1])
- local dy=-factor*(exit[2]-entry[2])
- local ws=tfmstart.width
- local wn=tfmnext.width
- nofregisteredcursives=nofregisteredcursives+1
- if rlmode<0 then
- dx=-(dx+wn)
- else
- dx=dx-ws
- end
- if dx==0 then
- dx=0
- end
- local p=rawget(properties,start)
- if p then
- local i=p.injections
- if i then
- i.cursiveanchor=true
- else
- p.injections={
- cursiveanchor=true,
- }
- end
- else
- properties[start]={
- injections={
- cursiveanchor=true,
- },
- }
- end
- local p=rawget(properties,nxt)
- if p then
- local i=p.injections
- if i then
- i.cursivex=dx
- i.cursivey=dy
- else
- p.injections={
- cursivex=dx,
- cursivey=dy,
- }
- end
- else
- properties[nxt]={
- injections={
- cursivex=dx,
- cursivey=dy,
- },
- }
- end
- return dx,dy,nofregisteredcursives
-end
-function injections.setposition(kind,current,factor,rlmode,spec,injection)
- local x=factor*(spec[1] or 0)
- local y=factor*(spec[2] or 0)
- local w=factor*(spec[3] or 0)
- local h=factor*(spec[4] or 0)
- if x~=0 or w~=0 or y~=0 or h~=0 then
- local yoffset=y-h
- local leftkern=x
- local rightkern=w-x
- if leftkern~=0 or rightkern~=0 or yoffset~=0 then
- nofregisteredpositions=nofregisteredpositions+1
- if rlmode and rlmode<0 then
- leftkern,rightkern=rightkern,leftkern
- end
- if not injection then
- injection="injections"
- end
- local p=rawget(properties,current)
- if p then
- local i=p[injection]
- if i then
- if leftkern~=0 then
- i.leftkern=(i.leftkern or 0)+leftkern
- end
- if rightkern~=0 then
- i.rightkern=(i.rightkern or 0)+rightkern
- end
- if yoffset~=0 then
- i.yoffset=(i.yoffset or 0)+yoffset
- end
- elseif leftkern~=0 or rightkern~=0 then
- p[injection]={
- leftkern=leftkern,
- rightkern=rightkern,
- yoffset=yoffset,
- }
- else
- p[injection]={
- yoffset=yoffset,
- }
- end
- elseif leftkern~=0 or rightkern~=0 then
- properties[current]={
- [injection]={
- leftkern=leftkern,
- rightkern=rightkern,
- yoffset=yoffset,
- },
- }
- else
- properties[current]={
- [injection]={
- yoffset=yoffset,
- },
- }
- end
- return x,y,w,h,nofregisteredpositions
- end
- end
- return x,y,w,h
-end
-function injections.setkern(current,factor,rlmode,x,injection)
- local dx=factor*x
- if dx~=0 then
- nofregisteredkerns=nofregisteredkerns+1
- local p=rawget(properties,current)
- if not injection then
- injection="injections"
- end
- if p then
- local i=p[injection]
- if i then
- i.leftkern=dx+(i.leftkern or 0)
- else
- p[injection]={
- leftkern=dx,
- }
- end
- else
- properties[current]={
- [injection]={
- leftkern=dx,
- },
- }
- end
- return dx,nofregisteredkerns
- else
- return 0,0
- end
-end
-function injections.setmove(current,factor,rlmode,x,injection)
- local dx=factor*x
- if dx~=0 then
- nofregisteredkerns=nofregisteredkerns+1
- local p=rawget(properties,current)
- if not injection then
- injection="injections"
- end
- if rlmode and rlmode<0 then
- if p then
- local i=p[injection]
- if i then
- i.rightkern=dx+(i.rightkern or 0)
- else
- p[injection]={
- rightkern=dx,
- }
- end
- else
- properties[current]={
- [injection]={
- rightkern=dx,
- },
- }
- end
- else
- if p then
- local i=p[injection]
- if i then
- i.leftkern=dx+(i.leftkern or 0)
- else
- p[injection]={
- leftkern=dx,
- }
- end
- else
- properties[current]={
- [injection]={
- leftkern=dx,
- },
- }
- end
- end
- return dx,nofregisteredkerns
- else
- return 0,0
- end
-end
-function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase,mkmk,checkmark)
- local dx=factor*(ba[1]-ma[1])
- local dy=factor*(ba[2]-ma[2])
- nofregisteredmarks=nofregisteredmarks+1
- if rlmode>=0 then
- dx=tfmbase.width-dx
- end
- local p=rawget(properties,start)
- if p then
- local i=p.injections
- if i then
- if i.markmark then
- else
- i.markx=dx
- i.marky=dy
- i.markdir=rlmode or 0
- i.markbase=nofregisteredmarks
- i.markbasenode=base
- i.markmark=mkmk
- i.checkmark=checkmark
- end
- else
- p.injections={
- markx=dx,
- marky=dy,
- markdir=rlmode or 0,
- markbase=nofregisteredmarks,
- markbasenode=base,
- markmark=mkmk,
- checkmark=checkmark,
- }
- end
- else
- properties[start]={
- injections={
- markx=dx,
- marky=dy,
- markdir=rlmode or 0,
- markbase=nofregisteredmarks,
- markbasenode=base,
- markmark=mkmk,
- checkmark=checkmark,
- },
- }
- end
- return dx,dy,nofregisteredmarks
-end
-local function dir(n)
- return (n and n<0 and "r-to-l") or (n and n>0 and "l-to-r") or "unset"
-end
-local function showchar(n,nested)
- local char=getchar(n)
- report_injections("%wfont %s, char %U, glyph %c",nested and 2 or 0,getfont(n),char,char)
-end
-local function show(n,what,nested,symbol)
- if n then
- local p=rawget(properties,n)
- if p then
- local i=p[what]
- if i then
- local leftkern=i.leftkern or 0
- local rightkern=i.rightkern or 0
- local yoffset=i.yoffset or 0
- local markx=i.markx or 0
- local marky=i.marky or 0
- local markdir=i.markdir or 0
- local markbase=i.markbase or 0
- local cursivex=i.cursivex or 0
- local cursivey=i.cursivey or 0
- local ligaindex=i.ligaindex or 0
- local cursbase=i.cursiveanchor
- local margin=nested and 4 or 2
- if rightkern~=0 or yoffset~=0 then
- report_injections("%w%s pair: lx %p, rx %p, dy %p",margin,symbol,leftkern,rightkern,yoffset)
- elseif leftkern~=0 then
- report_injections("%w%s kern: dx %p",margin,symbol,leftkern)
- end
- if markx~=0 or marky~=0 or markbase~=0 then
- report_injections("%w%s mark: dx %p, dy %p, dir %s, base %s",margin,symbol,markx,marky,markdir,markbase~=0 and "yes" or "no")
- end
- if cursivex~=0 or cursivey~=0 then
- if cursbase then
- report_injections("%w%s curs: base dx %p, dy %p",margin,symbol,cursivex,cursivey)
- else
- report_injections("%w%s curs: dx %p, dy %p",margin,symbol,cursivex,cursivey)
- end
- elseif cursbase then
- report_injections("%w%s curs: base",margin,symbol)
- end
- if ligaindex~=0 then
- report_injections("%w%s liga: index %i",margin,symbol,ligaindex)
- end
- end
- end
- end
-end
-local function showsub(n,what,where)
- report_injections("begin subrun: %s",where)
- for n in nextchar,n do
- showchar(n,where)
- show(n,what,where," ")
- end
- report_injections("end subrun")
-end
-local function trace(head,where)
- report_injections()
- report_injections("begin run %s: %s kerns, %s positions, %s marks and %s cursives registered",
- where or "",nofregisteredkerns,nofregisteredpositions,nofregisteredmarks,nofregisteredcursives)
- local n=head
- while n do
- local id=getid(n)
- if id==glyph_code then
- showchar(n)
- show(n,"injections",false," ")
- show(n,"preinjections",false,"<")
- show(n,"postinjections",false,">")
- show(n,"replaceinjections",false,"=")
- show(n,"emptyinjections",false,"*")
- elseif id==disc_code then
- local pre,post,replace=getdisc(n)
- if pre then
- showsub(pre,"preinjections","pre")
- end
- if post then
- showsub(post,"postinjections","post")
- end
- if replace then
- showsub(replace,"replaceinjections","replace")
- end
- show(n,"emptyinjections",false,"*")
- end
- n=getnext(n)
- end
- report_injections("end run")
-end
-local function show_result(head)
- local current=head
- local skipping=false
- while current do
- local id=getid(current)
- if id==glyph_code then
- local w=getwidth(current)
- local x,y=getoffsets(current)
- report_injections("char: %C, width %p, xoffset %p, yoffset %p",getchar(current),w,x,y)
- skipping=false
- elseif id==kern_code then
- report_injections("kern: %p",getkern(current))
- skipping=false
- elseif not skipping then
- report_injections()
- skipping=true
- end
- current=getnext(current)
- end
- report_injections()
-end
-local function inject_kerns_only(head,where)
- if trace_injections then
- trace(head,"kerns")
- end
- local current=head
- local prev=nil
- local next=nil
- local prevdisc=nil
- local pre=nil
- local post=nil
- local replace=nil
- local pretail=nil
- local posttail=nil
- local replacetail=nil
- while current do
- local next=getnext(current)
- local char,id=ischar(current)
- if char then
- local p=rawget(properties,current)
- if p then
- local i=p.injections
- if i then
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- head=insert_node_before(head,current,fontkern(leftkern))
- end
- end
- if prevdisc then
- local done=false
- if post then
- local i=p.postinjections
- if i then
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- setlink(posttail,fontkern(leftkern))
- done=true
- end
- end
- end
- if replace then
- local i=p.replaceinjections
- if i then
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- setlink(replacetail,fontkern(leftkern))
- done=true
- end
- end
- else
- local i=p.emptyinjections
- if i then
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- replace=fontkern(leftkern)
- done=true
- end
- end
- end
- if done then
- setdisc(prevdisc,pre,post,replace)
- end
- end
- end
- prevdisc=nil
- elseif char==false then
- prevdisc=nil
- elseif id==disc_code then
- pre,post,replace,pretail,posttail,replacetail=getdisc(current,true)
- local done=false
- if pre then
- for n in nextchar,pre do
- local p=rawget(properties,n)
- if p then
- local i=p.injections or p.preinjections
- if i then
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- pre=insert_node_before(pre,n,fontkern(leftkern))
- done=true
- end
- end
- end
- end
- end
- if post then
- for n in nextchar,post do
- local p=rawget(properties,n)
- if p then
- local i=p.injections or p.postinjections
- if i then
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- post=insert_node_before(post,n,fontkern(leftkern))
- done=true
- end
- end
- end
- end
- end
- if replace then
- for n in nextchar,replace do
- local p=rawget(properties,n)
- if p then
- local i=p.injections or p.replaceinjections
- if i then
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- replace=insert_node_before(replace,n,fontkern(leftkern))
- done=true
- end
- end
- end
- end
- end
- if done then
- setdisc(current,pre,post,replace)
- end
- prevdisc=current
- else
- prevdisc=nil
- end
- prev=current
- current=next
- end
- if keepregisteredcounts then
- keepregisteredcounts=false
- else
- nofregisteredkerns=0
- end
- if trace_injections then
- show_result(head)
- end
- return head
-end
-local function inject_positions_only(head,where)
- if trace_injections then
- trace(head,"positions")
- end
- local current=head
- local prev=nil
- local next=nil
- local prevdisc=nil
- local prevglyph=nil
- local pre=nil
- local post=nil
- local replace=nil
- local pretail=nil
- local posttail=nil
- local replacetail=nil
- while current do
- local next=getnext(current)
- local char,id=ischar(current)
- if char then
- local p=rawget(properties,current)
- if p then
- local i=p.injections
- if i then
- local yoffset=i.yoffset
- if yoffset and yoffset~=0 then
- setoffsets(current,false,yoffset)
- end
- local leftkern=i.leftkern
- local rightkern=i.rightkern
- if leftkern and leftkern~=0 then
- if rightkern and leftkern==-rightkern then
- setoffsets(current,leftkern,false)
- rightkern=0
- else
- head=insert_node_before(head,current,fontkern(leftkern))
- end
- end
- if rightkern and rightkern~=0 then
- insert_node_after(head,current,fontkern(rightkern))
- end
- else
- local i=p.emptyinjections
- if i then
- local rightkern=i.rightkern
- if rightkern and rightkern~=0 then
- if next and getid(next)==disc_code then
- if replace then
- else
- replace=fontkern(rightkern)
- done=true
- end
- end
- end
- end
- end
- if prevdisc then
- local done=false
- if post then
- local i=p.postinjections
- if i then
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- setlink(posttail,fontkern(leftkern))
- done=true
- end
- end
- end
- if replace then
- local i=p.replaceinjections
- if i then
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- setlink(replacetail,fontkern(leftkern))
- done=true
- end
- end
- else
- local i=p.emptyinjections
- if i then
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- replace=fontkern(leftkern)
- done=true
- end
- end
- end
- if done then
- setdisc(prevdisc,pre,post,replace)
- end
- end
- end
- prevdisc=nil
- prevglyph=current
- elseif char==false then
- prevdisc=nil
- prevglyph=current
- elseif id==disc_code then
- pre,post,replace,pretail,posttail,replacetail=getdisc(current,true)
- local done=false
- if pre then
- for n in nextchar,pre do
- local p=rawget(properties,n)
- if p then
- local i=p.injections or p.preinjections
- if i then
- local yoffset=i.yoffset
- if yoffset and yoffset~=0 then
- setoffsets(n,false,yoffset)
- end
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- pre=insert_node_before(pre,n,fontkern(leftkern))
- done=true
- end
- local rightkern=i.rightkern
- if rightkern and rightkern~=0 then
- insert_node_after(pre,n,fontkern(rightkern))
- done=true
- end
- end
- end
- end
- end
- if post then
- for n in nextchar,post do
- local p=rawget(properties,n)
- if p then
- local i=p.injections or p.postinjections
- if i then
- local yoffset=i.yoffset
- if yoffset and yoffset~=0 then
- setoffsets(n,false,yoffset)
- end
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- post=insert_node_before(post,n,fontkern(leftkern))
- done=true
- end
- local rightkern=i.rightkern
- if rightkern and rightkern~=0 then
- insert_node_after(post,n,fontkern(rightkern))
- done=true
- end
- end
- end
- end
- end
- if replace then
- for n in nextchar,replace do
- local p=rawget(properties,n)
- if p then
- local i=p.injections or p.replaceinjections
- if i then
- local yoffset=i.yoffset
- if yoffset and yoffset~=0 then
- setoffsets(n,false,yoffset)
- end
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- replace=insert_node_before(replace,n,fontkern(leftkern))
- done=true
- end
- local rightkern=i.rightkern
- if rightkern and rightkern~=0 then
- insert_node_after(replace,n,fontkern(rightkern))
- done=true
- end
- end
- end
- end
- end
- if prevglyph then
- if pre then
- local p=rawget(properties,prevglyph)
- if p then
- local i=p.preinjections
- if i then
- local rightkern=i.rightkern
- if rightkern and rightkern~=0 then
- pre=insert_node_before(pre,pre,fontkern(rightkern))
- done=true
- end
- end
- end
- end
- if replace then
- local p=rawget(properties,prevglyph)
- if p then
- local i=p.replaceinjections
- if i then
- local rightkern=i.rightkern
- if rightkern and rightkern~=0 then
- replace=insert_node_before(replace,replace,fontkern(rightkern))
- done=true
- end
- end
- end
- end
- end
- if done then
- setdisc(current,pre,post,replace)
- end
- prevglyph=nil
- prevdisc=current
- else
- prevglyph=nil
- prevdisc=nil
- end
- prev=current
- current=next
- end
- if keepregisteredcounts then
- keepregisteredcounts=false
- else
- nofregisteredpositions=0
- end
- if trace_injections then
- show_result(head)
- end
- return head
-end
-local function showoffset(n,flag)
- local x,y=getoffsets(n)
- if x~=0 or y~=0 then
- setcolor(n,"darkgray")
- end
-end
-local function inject_everything(head,where)
- if trace_injections then
- trace(head,"everything")
- end
- local hascursives=nofregisteredcursives>0
- local hasmarks=nofregisteredmarks>0
- local current=head
- local last=nil
- local prev=nil
- local next=nil
- local prevdisc=nil
- local prevglyph=nil
- local pre=nil
- local post=nil
- local replace=nil
- local pretail=nil
- local posttail=nil
- local replacetail=nil
- local cursiveanchor=nil
- local minc=0
- local maxc=0
- local glyphs={}
- local marks={}
- local nofmarks=0
- local function processmark(p,n,pn)
- local px,py=getoffsets(p)
- local nx,ny=getoffsets(n)
- local ox=0
- local rightkern=nil
- local pp=rawget(properties,p)
- if pp then
- pp=pp.injections
- if pp then
- rightkern=pp.rightkern
- end
- end
- local markdir=pn.markdir
- if rightkern then
- ox=px-(pn.markx or 0)-rightkern
- if markdir and markdir<0 then
- if not pn.markmark then
- ox=ox+(pn.leftkern or 0)
- end
- else
- if false then
- local leftkern=pp.leftkern
- if leftkern then
- ox=ox-leftkern
- end
- end
- end
- else
- ox=px-(pn.markx or 0)
- if markdir and markdir<0 then
- if not pn.markmark then
- local leftkern=pn.leftkern
- if leftkern then
- ox=ox+leftkern
- end
- end
- end
- if pn.checkmark then
- local wn=getwidth(n)
- if wn and wn~=0 then
- wn=wn/2
- if trace_injections then
- report_injections("correcting non zero width mark %C",getchar(n))
- end
- insert_node_before(n,n,fontkern(-wn))
- insert_node_after(n,n,fontkern(-wn))
- end
- end
- end
- local oy=ny+py+(pn.marky or 0)
- if not pn.markmark then
- local yoffset=pn.yoffset
- if yoffset then
- oy=oy+yoffset
- end
- end
- setoffsets(n,ox,oy)
- if trace_marks then
- showoffset(n,true)
- end
- end
- while current do
- local next=getnext(current)
- local char,id=ischar(current)
- if char then
- local p=rawget(properties,current)
- if p then
- local i=p.injections
- if i then
- local pm=i.markbasenode
- if pm then
- nofmarks=nofmarks+1
- marks[nofmarks]=current
- else
- local yoffset=i.yoffset
- if yoffset and yoffset~=0 then
- setoffsets(current,false,yoffset)
- end
- if hascursives then
- local cursivex=i.cursivex
- if cursivex then
- if cursiveanchor then
- if cursivex~=0 then
- i.leftkern=(i.leftkern or 0)+cursivex
- end
- if maxc==0 then
- minc=1
- maxc=1
- glyphs[1]=cursiveanchor
- else
- maxc=maxc+1
- glyphs[maxc]=cursiveanchor
- end
- properties[cursiveanchor].cursivedy=i.cursivey
- last=current
- else
- maxc=0
- end
- elseif maxc>0 then
- local nx,ny=getoffsets(current)
- for i=maxc,minc,-1 do
- local ti=glyphs[i]
- ny=ny+properties[ti].cursivedy
- setoffsets(ti,false,ny)
- if trace_cursive then
- showoffset(ti)
- end
- end
- maxc=0
- cursiveanchor=nil
- end
- if i.cursiveanchor then
- cursiveanchor=current
- else
- if maxc>0 then
- local nx,ny=getoffsets(current)
- for i=maxc,minc,-1 do
- local ti=glyphs[i]
- ny=ny+properties[ti].cursivedy
- setoffsets(ti,false,ny)
- if trace_cursive then
- showoffset(ti)
- end
- end
- maxc=0
- end
- cursiveanchor=nil
- end
- end
- local leftkern=i.leftkern
- local rightkern=i.rightkern
- if leftkern and leftkern~=0 then
- if rightkern and leftkern==-rightkern then
- setoffsets(current,leftkern,false)
- rightkern=0
- else
- head=insert_node_before(head,current,fontkern(leftkern))
- end
- end
- if rightkern and rightkern~=0 then
- insert_node_after(head,current,fontkern(rightkern))
- end
- end
- else
- local i=p.emptyinjections
- if i then
- local rightkern=i.rightkern
- if rightkern and rightkern~=0 then
- if next and getid(next)==disc_code then
- if replace then
- else
- replace=fontkern(rightkern)
- done=true
- end
- end
- end
- end
- end
- if prevdisc then
- if p then
- local done=false
- if post then
- local i=p.postinjections
- if i then
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- setlink(posttail,fontkern(leftkern))
- done=true
- end
- end
- end
- if replace then
- local i=p.replaceinjections
- if i then
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- setlink(replacetail,fontkern(leftkern))
- done=true
- end
- end
- else
- local i=p.emptyinjections
- if i then
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- replace=fontkern(leftkern)
- done=true
- end
- end
- end
- if done then
- setdisc(prevdisc,pre,post,replace)
- end
- end
- end
- else
- if hascursives and maxc>0 then
- local nx,ny=getoffsets(current)
- for i=maxc,minc,-1 do
- local ti=glyphs[i]
- ny=ny+properties[ti].cursivedy
- local xi,yi=getoffsets(ti)
- setoffsets(ti,xi,yi+ny)
- end
- maxc=0
- cursiveanchor=nil
- end
- end
- prevdisc=nil
- prevglyph=current
- elseif char==false then
- prevdisc=nil
- prevglyph=current
- elseif id==disc_code then
- pre,post,replace,pretail,posttail,replacetail=getdisc(current,true)
- local done=false
- if pre then
- for n in nextchar,pre do
- local p=rawget(properties,n)
- if p then
- local i=p.injections or p.preinjections
- if i then
- local yoffset=i.yoffset
- if yoffset and yoffset~=0 then
- setoffsets(n,false,yoffset)
- end
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- pre=insert_node_before(pre,n,fontkern(leftkern))
- done=true
- end
- local rightkern=i.rightkern
- if rightkern and rightkern~=0 then
- insert_node_after(pre,n,fontkern(rightkern))
- done=true
- end
- if hasmarks then
- local pm=i.markbasenode
- if pm then
- processmark(pm,n,i)
- end
- end
- end
- end
- end
- end
- if post then
- for n in nextchar,post do
- local p=rawget(properties,n)
- if p then
- local i=p.injections or p.postinjections
- if i then
- local yoffset=i.yoffset
- if yoffset and yoffset~=0 then
- setoffsets(n,false,yoffset)
- end
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- post=insert_node_before(post,n,fontkern(leftkern))
- done=true
- end
- local rightkern=i.rightkern
- if rightkern and rightkern~=0 then
- insert_node_after(post,n,fontkern(rightkern))
- done=true
- end
- if hasmarks then
- local pm=i.markbasenode
- if pm then
- processmark(pm,n,i)
- end
- end
- end
- end
- end
- end
- if replace then
- for n in nextchar,replace do
- local p=rawget(properties,n)
- if p then
- local i=p.injections or p.replaceinjections
- if i then
- local yoffset=i.yoffset
- if yoffset and yoffset~=0 then
- setoffsets(n,false,yoffset)
- end
- local leftkern=i.leftkern
- if leftkern and leftkern~=0 then
- replace=insert_node_before(replace,n,fontkern(leftkern))
- done=true
- end
- local rightkern=i.rightkern
- if rightkern and rightkern~=0 then
- insert_node_after(replace,n,fontkern(rightkern))
- done=true
- end
- if hasmarks then
- local pm=i.markbasenode
- if pm then
- processmark(pm,n,i)
- end
- end
- end
- end
- end
- end
- if prevglyph then
- if pre then
- local p=rawget(properties,prevglyph)
- if p then
- local i=p.preinjections
- if i then
- local rightkern=i.rightkern
- if rightkern and rightkern~=0 then
- pre=insert_node_before(pre,pre,fontkern(rightkern))
- done=true
- end
- end
- end
- end
- if replace then
- local p=rawget(properties,prevglyph)
- if p then
- local i=p.replaceinjections
- if i then
- local rightkern=i.rightkern
- if rightkern and rightkern~=0 then
- replace=insert_node_before(replace,replace,fontkern(rightkern))
- done=true
- end
- end
- end
- end
- end
- if done then
- setdisc(current,pre,post,replace)
- end
- prevglyph=nil
- prevdisc=current
- else
- prevglyph=nil
- prevdisc=nil
- end
- prev=current
- current=next
- end
- if hascursives and maxc>0 then
- local nx,ny=getoffsets(last)
- for i=maxc,minc,-1 do
- local ti=glyphs[i]
- ny=ny+properties[ti].cursivedy
- setoffsets(ti,false,ny)
- if trace_cursive then
- showoffset(ti)
- end
- end
- end
- if nofmarks>0 then
- for i=1,nofmarks do
- local m=marks[i]
- local p=rawget(properties,m)
- local i=p.injections
- local b=i.markbasenode
- processmark(b,m,i)
- end
- elseif hasmarks then
- end
- if keepregisteredcounts then
- keepregisteredcounts=false
- else
- nofregisteredkerns=0
- nofregisteredpositions=0
- nofregisteredmarks=0
- nofregisteredcursives=0
- end
- if trace_injections then
- show_result(head)
- end
- return head
-end
-local triggers=false
-function nodes.injections.setspacekerns(font,sequence)
- if triggers then
- triggers[font]=sequence
- else
- triggers={ [font]=sequence }
- end
-end
-local getthreshold
-if context then
- local threshold=1
- local parameters=fonts.hashes.parameters
- directives.register("otf.threshold",function(v) threshold=tonumber(v) or 1 end)
- getthreshold=function(font)
- local p=parameters[font]
- local f=p.factor
- local s=p.spacing
- local t=threshold*(s and s.width or p.space or 0)-2
- return t>0 and t or 0,f
- end
-else
- injections.threshold=0
- getthreshold=function(font)
- local p=fontdata[font].parameters
- local f=p.factor
- local s=p.spacing
- local t=injections.threshold*(s and s.width or p.space or 0)-2
- return t>0 and t or 0,f
- end
-end
-injections.getthreshold=getthreshold
-function injections.isspace(n,threshold,id)
- if (id or getid(n))==glue_code then
- local w=getwidth(n)
- if threshold and w>threshold then
- return 32
- end
- end
-end
-local getspaceboth=getboth
-function injections.installgetspaceboth(gb)
- getspaceboth=gb or getboth
-end
-local function injectspaces(head)
- if not triggers then
- return head
- end
- local lastfont=nil
- local spacekerns=nil
- local leftkerns=nil
- local rightkerns=nil
- local factor=0
- local threshold=0
- local leftkern=false
- local rightkern=false
- local function updatefont(font,trig)
- leftkerns=trig.left
- rightkerns=trig.right
- lastfont=font
- threshold,
- factor=getthreshold(font)
- end
- for n in nextglue,head do
- local prev,next=getspaceboth(n)
- local prevchar=prev and ischar(prev)
- local nextchar=next and ischar(next)
- if nextchar then
- local font=getfont(next)
- local trig=triggers[font]
- if trig then
- if lastfont~=font then
- updatefont(font,trig)
- end
- if rightkerns then
- rightkern=rightkerns[nextchar]
- end
- end
- end
- if prevchar then
- local font=getfont(prev)
- local trig=triggers[font]
- if trig then
- if lastfont~=font then
- updatefont(font,trig)
- end
- if leftkerns then
- leftkern=leftkerns[prevchar]
- end
- end
- end
- if leftkern then
- local old=getwidth(n)
- if old>threshold then
- if rightkern then
- if useitalickerns then
- local lnew=leftkern*factor
- local rnew=rightkern*factor
- if trace_spaces then
- report_spaces("%C [%p + %p + %p] %C",prevchar,lnew,old,rnew,nextchar)
- end
- head=insert_node_before(head,n,italickern(lnew))
- insert_node_after(head,n,italickern(rnew))
- else
- local new=old+(leftkern+rightkern)*factor
- if trace_spaces then
- report_spaces("%C [%p -> %p] %C",prevchar,old,new,nextchar)
- end
- setwidth(n,new)
- end
- rightkern=false
- else
- if useitalickerns then
- local new=leftkern*factor
- if trace_spaces then
- report_spaces("%C [%p + %p]",prevchar,old,new)
- end
- insert_node_after(head,n,italickern(new))
- else
- local new=old+leftkern*factor
- if trace_spaces then
- report_spaces("%C [%p -> %p]",prevchar,old,new)
- end
- setwidth(n,new)
- end
- end
- end
- leftkern=false
- elseif rightkern then
- local old=getwidth(n)
- if old>threshold then
- if useitalickerns then
- local new=rightkern*factor
- if trace_spaces then
- report_spaces("%C [%p + %p]",nextchar,old,new)
- end
- insert_node_after(head,n,italickern(new))
- else
- local new=old+rightkern*factor
- if trace_spaces then
- report_spaces("[%p -> %p] %C",nextchar,old,new)
- end
- setwidth(n,new)
- end
- end
- rightkern=false
- end
- end
- triggers=false
- return head
-end
-function injections.handler(head,where)
- if triggers then
- head=injectspaces(head)
- end
- if nofregisteredmarks>0 or nofregisteredcursives>0 then
- if trace_injections then
- report_injections("injection variant %a","everything")
- end
- return inject_everything(head,where)
- elseif nofregisteredpositions>0 then
- if trace_injections then
- report_injections("injection variant %a","positions")
- end
- return inject_positions_only(head,where)
- elseif nofregisteredkerns>0 then
- if trace_injections then
- report_injections("injection variant %a","kerns")
- end
- return inject_kerns_only(head,where)
- else
- return head
- end
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-otj”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-ota” d6dfb94563d6a52675e274b2e673e4a6] ---
-
-if not modules then modules={} end modules ['font-ota']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local type=type
-if not trackers then trackers={ register=function() end } end
-local fonts,nodes,node=fonts,nodes,node
-local allocate=utilities.storage.allocate
-local otf=fonts.handlers.otf
-local analyzers=fonts.analyzers
-local initializers=allocate()
-local methods=allocate()
-analyzers.initializers=initializers
-analyzers.methods=methods
-local a_state=attributes.private('state')
-local nuts=nodes.nuts
-local tonut=nuts.tonut
-local getnext=nuts.getnext
-local getprev=nuts.getprev
-local getprev=nuts.getprev
-local getprop=nuts.getprop
-local setprop=nuts.setprop
-local getsubtype=nuts.getsubtype
-local getchar=nuts.getchar
-local ischar=nuts.ischar
-local end_of_math=nuts.end_of_math
-local nodecodes=nodes.nodecodes
-local disc_code=nodecodes.disc
-local math_code=nodecodes.math
-local fontdata=fonts.hashes.identifiers
-local categories=characters and characters.categories or {}
-local chardata=characters and characters.data
-local otffeatures=fonts.constructors.features.otf
-local registerotffeature=otffeatures.register
-local s_init=1 local s_rphf=7
-local s_medi=2 local s_half=8
-local s_fina=3 local s_pref=9
-local s_isol=4 local s_blwf=10
-local s_mark=5 local s_pstf=11
-local s_rest=6
-local states=allocate {
- init=s_init,
- medi=s_medi,
- med2=s_medi,
- fina=s_fina,
- fin2=s_fina,
- fin3=s_fina,
- isol=s_isol,
- mark=s_mark,
- rest=s_rest,
- rphf=s_rphf,
- half=s_half,
- pref=s_pref,
- blwf=s_blwf,
- pstf=s_pstf,
-}
-local features=allocate {
- init=s_init,
- medi=s_medi,
- med2=s_medi,
- fina=s_fina,
- fin2=s_fina,
- fin3=s_fina,
- isol=s_isol,
- rphf=s_rphf,
- half=s_half,
- pref=s_pref,
- blwf=s_blwf,
- pstf=s_pstf,
-}
-analyzers.states=states
-analyzers.features=features
-analyzers.useunicodemarks=false
-function analyzers.setstate(head,font)
- local useunicodemarks=analyzers.useunicodemarks
- local tfmdata=fontdata[font]
- local descriptions=tfmdata.descriptions
- local first,last,current,n,done=nil,nil,head,0,false
- current=tonut(current)
- while current do
- local char,id=ischar(current,font)
- if char and not getprop(current,a_state) then
- done=true
- local d=descriptions[char]
- if d then
- if d.class=="mark" then
- done=true
- setprop(current,a_state,s_mark)
- elseif useunicodemarks and categories[char]=="mn" then
- done=true
- setprop(current,a_state,s_mark)
- elseif n==0 then
- first,last,n=current,current,1
- setprop(current,a_state,s_init)
- else
- last,n=current,n+1
- setprop(current,a_state,s_medi)
- end
- else
- if first and first==last then
- setprop(last,a_state,s_isol)
- elseif last then
- setprop(last,a_state,s_fina)
- end
- first,last,n=nil,nil,0
- end
- elseif char==false then
- if first and first==last then
- setprop(last,a_state,s_isol)
- elseif last then
- setprop(last,a_state,s_fina)
- end
- first,last,n=nil,nil,0
- if id==math_code then
- current=end_of_math(current)
- end
- elseif id==disc_code then
- setprop(current,a_state,s_medi)
- last=current
- else
- if first and first==last then
- setprop(last,a_state,s_isol)
- elseif last then
- setprop(last,a_state,s_fina)
- end
- first,last,n=nil,nil,0
- if id==math_code then
- current=end_of_math(current)
- end
- end
- current=getnext(current)
- end
- if first and first==last then
- setprop(last,a_state,s_isol)
- elseif last then
- setprop(last,a_state,s_fina)
- end
- return head,done
-end
-local function analyzeinitializer(tfmdata,value)
- local script,language=otf.scriptandlanguage(tfmdata)
- local action=initializers[script]
- if not action then
- elseif type(action)=="function" then
- return action(tfmdata,value)
- else
- local action=action[language]
- if action then
- return action(tfmdata,value)
- end
- end
-end
-local function analyzeprocessor(head,font,attr)
- local tfmdata=fontdata[font]
- local script,language=otf.scriptandlanguage(tfmdata,attr)
- local action=methods[script]
- if not action then
- elseif type(action)=="function" then
- return action(head,font,attr)
- else
- action=action[language]
- if action then
- return action(head,font,attr)
- end
- end
- return head,false
-end
-registerotffeature {
- name="analyze",
- description="analysis of character classes",
- default=true,
- initializers={
- node=analyzeinitializer,
- },
- processors={
- position=1,
- node=analyzeprocessor,
- }
-}
-methods.latn=analyzers.setstate
-local arab_warned={}
-local function warning(current,what)
- local char=getchar(current)
- if not arab_warned[char] then
- log.report("analyze","arab: character %C has no %a class",char,what)
- arab_warned[char]=true
- end
-end
-local mappers=allocate {
- l=s_init,
- d=s_medi,
- c=s_medi,
- r=s_fina,
- u=s_isol,
-}
-local classifiers=characters.classifiers
-if not classifiers then
- local f_arabic,l_arabic=characters.blockrange("arabic")
- local f_syriac,l_syriac=characters.blockrange("syriac")
- local f_mandiac,l_mandiac=characters.blockrange("mandiac")
- local f_nko,l_nko=characters.blockrange("nko")
- local f_ext_a,l_ext_a=characters.blockrange("arabicextendeda")
- classifiers=table.setmetatableindex(function(t,k)
- if type(k)=="number" then
- local c=chardata[k]
- local v=false
- if c then
- local arabic=c.arabic
- if arabic then
- v=mappers[arabic]
- if not v then
- log.report("analyze","error in mapping arabic %C",k)
- v=false
- end
- elseif (k>=f_arabic and k<=l_arabic) or
- (k>=f_syriac and k<=l_syriac) or
- (k>=f_mandiac and k<=l_mandiac) or
- (k>=f_nko and k<=l_nko) or
- (k>=f_ext_a and k<=l_ext_a) then
- if categories[k]=="mn" then
- v=s_mark
- else
- v=s_rest
- end
- end
- end
- t[k]=v
- return v
- end
- end)
- characters.classifiers=classifiers
-end
-function methods.arab(head,font,attr)
- local first,last,c_first,c_last
- local current=head
- local done=false
- current=tonut(current)
- while current do
- local char,id=ischar(current,font)
- if char and not getprop(current,a_state) then
- done=true
- local classifier=classifiers[char]
- if not classifier then
- if last then
- if c_last==s_medi or c_last==s_fina then
- setprop(last,a_state,s_fina)
- else
- warning(last,"fina")
- setprop(last,a_state,s_error)
- end
- first,last=nil,nil
- elseif first then
- if c_first==s_medi or c_first==s_fina then
- setprop(first,a_state,s_isol)
- else
- warning(first,"isol")
- setprop(first,a_state,s_error)
- end
- first=nil
- end
- elseif classifier==s_mark then
- setprop(current,a_state,s_mark)
- elseif classifier==s_isol then
- if last then
- if c_last==s_medi or c_last==s_fina then
- setprop(last,a_state,s_fina)
- else
- warning(last,"fina")
- setprop(last,a_state,s_error)
- end
- first,last=nil,nil
- elseif first then
- if c_first==s_medi or c_first==s_fina then
- setprop(first,a_state,s_isol)
- else
- warning(first,"isol")
- setprop(first,a_state,s_error)
- end
- first=nil
- end
- setprop(current,a_state,s_isol)
- elseif classifier==s_medi then
- if first then
- last=current
- c_last=classifier
- setprop(current,a_state,s_medi)
- else
- setprop(current,a_state,s_init)
- first=current
- c_first=classifier
- end
- elseif classifier==s_fina then
- if last then
- if getprop(last,a_state)~=s_init then
- setprop(last,a_state,s_medi)
- end
- setprop(current,a_state,s_fina)
- first,last=nil,nil
- elseif first then
- setprop(current,a_state,s_fina)
- first=nil
- else
- setprop(current,a_state,s_isol)
- end
- else
- setprop(current,a_state,s_rest)
- if last then
- if c_last==s_medi or c_last==s_fina then
- setprop(last,a_state,s_fina)
- else
- warning(last,"fina")
- setprop(last,a_state,s_error)
- end
- first,last=nil,nil
- elseif first then
- if c_first==s_medi or c_first==s_fina then
- setprop(first,a_state,s_isol)
- else
- warning(first,"isol")
- setprop(first,a_state,s_error)
- end
- first=nil
- end
- end
- else
- if last then
- if c_last==s_medi or c_last==s_fina then
- setprop(last,a_state,s_fina)
- else
- warning(last,"fina")
- setprop(last,a_state,s_error)
- end
- first,last=nil,nil
- elseif first then
- if c_first==s_medi or c_first==s_fina then
- setprop(first,a_state,s_isol)
- else
- warning(first,"isol")
- setprop(first,a_state,s_error)
- end
- first=nil
- end
- if id==math_code then
- current=end_of_math(current)
- end
- end
- current=getnext(current)
- end
- if last then
- if c_last==s_medi or c_last==s_fina then
- setprop(last,a_state,s_fina)
- else
- warning(last,"fina")
- setprop(last,a_state,s_error)
- end
- elseif first then
- if c_first==s_medi or c_first==s_fina then
- setprop(first,a_state,s_isol)
- else
- warning(first,"isol")
- setprop(first,a_state,s_error)
- end
- end
- return head,done
-end
-methods.syrc=methods.arab
-methods.mand=methods.arab
-methods.nko=methods.arab
-directives.register("otf.analyze.useunicodemarks",function(v)
- analyzers.useunicodemarks=v
-end)
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-ota”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-ots” d0107799ec82da7f96dafe9626c5ee7f] ---
-
-if not modules then modules={} end modules ['font-ots']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files",
-}
-local type,next,tonumber=type,next,tonumber
-local random=math.random
-local formatters=string.formatters
-local insert=table.insert
-local registertracker=trackers.register
-local logs=logs
-local trackers=trackers
-local nodes=nodes
-local attributes=attributes
-local fonts=fonts
-local otf=fonts.handlers.otf
-local tracers=nodes.tracers
-local trace_singles=false registertracker("otf.singles",function(v) trace_singles=v end)
-local trace_multiples=false registertracker("otf.multiples",function(v) trace_multiples=v end)
-local trace_alternatives=false registertracker("otf.alternatives",function(v) trace_alternatives=v end)
-local trace_ligatures=false registertracker("otf.ligatures",function(v) trace_ligatures=v end)
-local trace_contexts=false registertracker("otf.contexts",function(v) trace_contexts=v end)
-local trace_marks=false registertracker("otf.marks",function(v) trace_marks=v end)
-local trace_kerns=false registertracker("otf.kerns",function(v) trace_kerns=v end)
-local trace_cursive=false registertracker("otf.cursive",function(v) trace_cursive=v end)
-local trace_preparing=false registertracker("otf.preparing",function(v) trace_preparing=v end)
-local trace_bugs=false registertracker("otf.bugs",function(v) trace_bugs=v end)
-local trace_details=false registertracker("otf.details",function(v) trace_details=v end)
-local trace_steps=false registertracker("otf.steps",function(v) trace_steps=v end)
-local trace_skips=false registertracker("otf.skips",function(v) trace_skips=v end)
-local trace_plugins=false registertracker("otf.plugins",function(v) trace_plugins=v end)
-local trace_chains=false registertracker("otf.chains",function(v) trace_chains=v end)
-local trace_kernruns=false registertracker("otf.kernruns",function(v) trace_kernruns=v end)
-local trace_compruns=false registertracker("otf.compruns",function(v) trace_compruns=v end)
-local trace_testruns=false registertracker("otf.testruns",function(v) trace_testruns=v end)
-local forcediscretionaries=false
-local forcepairadvance=false
-directives.register("otf.forcediscretionaries",function(v)
- forcediscretionaries=v
-end)
-directives.register("otf.forcepairadvance",function(v)
- forcepairadvance=v
-end)
-local report_direct=logs.reporter("fonts","otf direct")
-local report_subchain=logs.reporter("fonts","otf subchain")
-local report_chain=logs.reporter("fonts","otf chain")
-local report_process=logs.reporter("fonts","otf process")
-local report_warning=logs.reporter("fonts","otf warning")
-local report_run=logs.reporter("fonts","otf run")
-registertracker("otf.substitutions","otf.singles","otf.multiples","otf.alternatives","otf.ligatures")
-registertracker("otf.positions","otf.marks","otf.kerns","otf.cursive")
-registertracker("otf.actions","otf.substitutions","otf.positions")
-registertracker("otf.sample","otf.steps","otf.substitutions","otf.positions","otf.analyzing")
-registertracker("otf.sample.silent","otf.steps=silent","otf.substitutions","otf.positions","otf.analyzing")
-local nuts=nodes.nuts
-local getnext=nuts.getnext
-local setnext=nuts.setnext
-local getprev=nuts.getprev
-local setprev=nuts.setprev
-local getboth=nuts.getboth
-local setboth=nuts.setboth
-local getid=nuts.getid
-local getprop=nuts.getprop
-local setprop=nuts.setprop
-local getsubtype=nuts.getsubtype
-local setsubtype=nuts.setsubtype
-local getchar=nuts.getchar
-local setchar=nuts.setchar
-local getdisc=nuts.getdisc
-local setdisc=nuts.setdisc
-local getreplace=nuts.getreplace
-local setlink=nuts.setlink
-local getcomponents=nuts.getcomponents
-local setcomponents=nuts.setcomponents
-local getwidth=nuts.getwidth
-local getattr=nuts.getattr
-local getglyphdata=nuts.getglyphdata
-local ischar=nuts.ischar
-local isglyph=nuts.isglyph
-local usesfont=nuts.uses_font
-local insert_node_after=nuts.insert_after
-local copy_node=nuts.copy
-local copy_node_list=nuts.copy_list
-local remove_node=nuts.remove
-local find_node_tail=nuts.tail
-local flush_node_list=nuts.flush_list
-local flush_node=nuts.flush_node
-local end_of_math=nuts.end_of_math
-local start_of_par=nuts.start_of_par
-local setmetatable=setmetatable
-local setmetatableindex=table.setmetatableindex
-local nextnode=nuts.traversers.node
-local nodecodes=nodes.nodecodes
-local glyphcodes=nodes.glyphcodes
-local disccodes=nodes.disccodes
-local glyph_code=nodecodes.glyph
-local glue_code=nodecodes.glue
-local disc_code=nodecodes.disc
-local math_code=nodecodes.math
-local dir_code=nodecodes.dir
-local localpar_code=nodecodes.localpar
-local discretionarydisc_code=disccodes.discretionary
-local ligatureglyph_code=glyphcodes.ligature
-local a_state=attributes.private('state')
-local a_noligature=attributes.private("noligature")
-local injections=nodes.injections
-local setmark=injections.setmark
-local setcursive=injections.setcursive
-local setkern=injections.setkern
-local setmove=injections.setmove
-local setposition=injections.setposition
-local resetinjection=injections.reset
-local copyinjection=injections.copy
-local setligaindex=injections.setligaindex
-local getligaindex=injections.getligaindex
-local fontdata=fonts.hashes.identifiers
-local fontfeatures=fonts.hashes.features
-local otffeatures=fonts.constructors.features.otf
-local registerotffeature=otffeatures.register
-local onetimemessage=fonts.loggers.onetimemessage or function() end
-local getrandom=utilities and utilities.randomizer and utilities.randomizer.get
-otf.defaultnodealternate="none"
-local tfmdata=false
-local characters=false
-local descriptions=false
-local marks=false
-local classes=false
-local currentfont=false
-local factor=0
-local threshold=0
-local checkmarks=false
-local discs=false
-local spaces=false
-local sweepnode=nil
-local sweephead={}
-local notmatchpre={}
-local notmatchpost={}
-local notmatchreplace={}
-local handlers={}
-local isspace=injections.isspace
-local getthreshold=injections.getthreshold
-local checkstep=(tracers and tracers.steppers.check) or function() end
-local registerstep=(tracers and tracers.steppers.register) or function() end
-local registermessage=(tracers and tracers.steppers.message) or function() end
-local function logprocess(...)
- if trace_steps then
- registermessage(...)
- if trace_steps=="silent" then
- return
- end
- end
- report_direct(...)
-end
-local function logwarning(...)
- report_direct(...)
-end
-local gref do
- local f_unicode=formatters["U+%X"]
- local f_uniname=formatters["U+%X (%s)"]
- local f_unilist=formatters["% t"]
- gref=function(n)
- if type(n)=="number" then
- local description=descriptions[n]
- local name=description and description.name
- if name then
- return f_uniname(n,name)
- else
- return f_unicode(n)
- end
- elseif n then
- local t={}
- for i=1,#n do
- local ni=n[i]
- if tonumber(ni) then
- local di=descriptions[ni]
- local nn=di and di.name
- if nn then
- t[#t+1]=f_uniname(ni,nn)
- else
- t[#t+1]=f_unicode(ni)
- end
- end
- end
- return f_unilist(t)
- else
- return ""
- end
- end
-end
-local function cref(dataset,sequence,index)
- if not dataset then
- return "no valid dataset"
- end
- local merged=sequence.merged and "merged " or ""
- if index then
- return formatters["feature %a, type %a, %schain lookup %a, index %a"](
- dataset[4],sequence.type,merged,sequence.name,index)
- else
- return formatters["feature %a, type %a, %schain lookup %a"](
- dataset[4],sequence.type,merged,sequence.name)
- end
-end
-local function pref(dataset,sequence)
- return formatters["feature %a, type %a, %slookup %a"](
- dataset[4],sequence.type,sequence.merged and "merged " or "",sequence.name)
-end
-local function mref(rlmode)
- if not rlmode or rlmode>=0 then
- return "l2r"
- else
- return "r2l"
- end
-end
-local function flattendisk(head,disc)
- local pre,post,replace,pretail,posttail,replacetail=getdisc(disc,true)
- local prev,next=getboth(disc)
- local ishead=head==disc
- setdisc(disc)
- flush_node(disc)
- if pre then
- flush_node_list(pre)
- end
- if post then
- flush_node_list(post)
- end
- if ishead then
- if replace then
- if next then
- setlink(replacetail,next)
- end
- return replace,replace
- elseif next then
- return next,next
- else
- end
- else
- if replace then
- if next then
- setlink(replacetail,next)
- end
- setlink(prev,replace)
- return head,replace
- else
- setlink(prev,next)
- return head,next
- end
- end
-end
-local function appenddisc(disc,list)
- local pre,post,replace,pretail,posttail,replacetail=getdisc(disc,true)
- local posthead=list
- local replacehead=copy_node_list(list)
- if post then
- setlink(posttail,posthead)
- else
- post=posthead
- end
- if replace then
- setlink(replacetail,replacehead)
- else
- replace=replacehead
- end
- setdisc(disc,pre,post,replace)
-end
-local copy_no_components=nuts.copy_no_components
-local copy_only_glyphs=nuts.copy_only_glyphs
-local set_components=setcomponents
-local take_components=getcomponents
-local function count_components(start,marks)
- local char=isglyph(start)
- if char then
- if getsubtype(start)==ligatureglyph_code then
- local i=0
- local components=getcomponents(start)
- while components do
- i=i+count_components(components,marks)
- components=getnext(components)
- end
- return i
- elseif not marks[char] then
- return 1
- end
- end
- return 0
-end
-local function markstoligature(head,start,stop,char)
- if start==stop and getchar(start)==char then
- return head,start
- else
- local prev=getprev(start)
- local next=getnext(stop)
- setprev(start)
- setnext(stop)
- local base=copy_no_components(start,copyinjection)
- if head==start then
- head=base
- end
- resetinjection(base)
- setchar(base,char)
- setsubtype(base,ligatureglyph_code)
- set_components(base,start)
- setlink(prev,base,next)
- return head,base
- end
-end
-local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfound,hasmarks)
- if getattr(start,a_noligature)==1 then
- return head,start
- end
- if start==stop and getchar(start)==char then
- resetinjection(start)
- setchar(start,char)
- return head,start
- end
- local prev=getprev(start)
- local next=getnext(stop)
- local comp=start
- setprev(start)
- setnext(stop)
- local base=copy_no_components(start,copyinjection)
- if start==head then
- head=base
- end
- resetinjection(base)
- setchar(base,char)
- setsubtype(base,ligatureglyph_code)
- set_components(base,comp)
- setlink(prev,base,next)
- if not discfound then
- local deletemarks=not skiphash or hasmarks
- local components=start
- local baseindex=0
- local componentindex=0
- local head=base
- local current=base
- while start do
- local char=getchar(start)
- if not marks[char] then
- baseindex=baseindex+componentindex
- componentindex=count_components(start,marks)
- elseif not deletemarks then
- setligaindex(start,baseindex+getligaindex(start,componentindex))
- if trace_marks then
- logwarning("%s: keep mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start))
- end
- local n=copy_node(start)
- copyinjection(n,start)
- head,current=insert_node_after(head,current,n)
- elseif trace_marks then
- logwarning("%s: delete mark %s",pref(dataset,sequence),gref(char))
- end
- start=getnext(start)
- end
- local start=getnext(current)
- while start do
- local char=ischar(start)
- if char then
- if marks[char] then
- setligaindex(start,baseindex+getligaindex(start,componentindex))
- if trace_marks then
- logwarning("%s: set mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start))
- end
- start=getnext(start)
- else
- break
- end
- else
- break
- end
- end
- else
- local discprev,discnext=getboth(discfound)
- if discprev and discnext then
- local pre,post,replace,pretail,posttail,replacetail=getdisc(discfound,true)
- if not replace then
- local prev=getprev(base)
- local comp=take_components(base)
- local copied=copy_only_glyphs(comp)
- if pre then
- setlink(discprev,pre)
- else
- setnext(discprev)
- end
- pre=comp
- if post then
- setlink(posttail,discnext)
- setprev(post)
- else
- post=discnext
- setprev(discnext)
- end
- setlink(prev,discfound,next)
- setboth(base)
- set_components(base,copied)
- replace=base
- if forcediscretionaries then
- setdisc(discfound,pre,post,replace,discretionarydisc_code)
- else
- setdisc(discfound,pre,post,replace)
- end
- base=prev
- end
- end
- end
- return head,base
-end
-local function multiple_glyphs(head,start,multiple,skiphash,what,stop)
- local nofmultiples=#multiple
- if nofmultiples>0 then
- resetinjection(start)
- setchar(start,multiple[1])
- if nofmultiples>1 then
- local sn=getnext(start)
- for k=2,nofmultiples do
- local n=copy_node(start)
- resetinjection(n)
- setchar(n,multiple[k])
- insert_node_after(head,start,n)
- start=n
- end
- if what==true then
- elseif what>1 then
- local m=multiple[nofmultiples]
- for i=2,what do
- local n=copy_node(start)
- resetinjection(n)
- setchar(n,m)
- insert_node_after(head,start,n)
- start=n
- end
- end
- end
- return head,start,true
- else
- if trace_multiples then
- logprocess("no multiple for %s",gref(getchar(start)))
- end
- return head,start,false
- end
-end
-local function get_alternative_glyph(start,alternatives,value)
- local n=#alternatives
- if n==1 then
- return alternatives[1],trace_alternatives and "1 (only one present)"
- elseif value=="random" then
- local r=getrandom and getrandom("glyph",1,n) or random(1,n)
- return alternatives[r],trace_alternatives and formatters["value %a, taking %a"](value,r)
- elseif value=="first" then
- return alternatives[1],trace_alternatives and formatters["value %a, taking %a"](value,1)
- elseif value=="last" then
- return alternatives[n],trace_alternatives and formatters["value %a, taking %a"](value,n)
- end
- value=value==true and 1 or tonumber(value)
- if type(value)~="number" then
- return alternatives[1],trace_alternatives and formatters["invalid value %s, taking %a"](value,1)
- end
- if value>n then
- local defaultalt=otf.defaultnodealternate
- if defaultalt=="first" then
- return alternatives[n],trace_alternatives and formatters["invalid value %s, taking %a"](value,1)
- elseif defaultalt=="last" then
- return alternatives[1],trace_alternatives and formatters["invalid value %s, taking %a"](value,n)
- else
- return false,trace_alternatives and formatters["invalid value %a, %s"](value,"out of range")
- end
- elseif value==0 then
- return getchar(start),trace_alternatives and formatters["invalid value %a, %s"](value,"no change")
- elseif value<1 then
- return alternatives[1],trace_alternatives and formatters["invalid value %a, taking %a"](value,1)
- else
- return alternatives[value],trace_alternatives and formatters["value %a, taking %a"](value,value)
- end
-end
-function handlers.gsub_single(head,start,dataset,sequence,replacement)
- if trace_singles then
- logprocess("%s: replacing %s by single %s",pref(dataset,sequence),gref(getchar(start)),gref(replacement))
- end
- resetinjection(start)
- setchar(start,replacement)
- return head,start,true
-end
-function handlers.gsub_alternate(head,start,dataset,sequence,alternative)
- local kind=dataset[4]
- local what=dataset[1]
- local value=what==true and tfmdata.shared.features[kind] or what
- local choice,comment=get_alternative_glyph(start,alternative,value)
- if choice then
- if trace_alternatives then
- logprocess("%s: replacing %s by alternative %a to %s, %s",pref(dataset,sequence),gref(getchar(start)),gref(choice),comment)
- end
- resetinjection(start)
- setchar(start,choice)
- else
- if trace_alternatives then
- logwarning("%s: no variant %a for %s, %s",pref(dataset,sequence),value,gref(getchar(start)),comment)
- end
- end
- return head,start,true
-end
-function handlers.gsub_multiple(head,start,dataset,sequence,multiple,rlmode,skiphash)
- if trace_multiples then
- logprocess("%s: replacing %s by multiple %s",pref(dataset,sequence),gref(getchar(start)),gref(multiple))
- end
- return multiple_glyphs(head,start,multiple,skiphash,dataset[1])
-end
-function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skiphash)
- local current=getnext(start)
- if not current then
- return head,start,false,nil
- end
- local stop=nil
- local startchar=getchar(start)
- if skiphash and skiphash[startchar] then
- while current do
- local char=ischar(current,currentfont)
- if char then
- local lg=ligature[char]
- if lg then
- stop=current
- ligature=lg
- current=getnext(current)
- else
- break
- end
- else
- break
- end
- end
- if stop then
- local lig=ligature.ligature
- if lig then
- if trace_ligatures then
- local stopchar=getchar(stop)
- head,start=markstoligature(head,start,stop,lig)
- logprocess("%s: replacing %s upto %s by ligature %s case 1",pref(dataset,sequence),gref(startchar),gref(stopchar),gref(getchar(start)))
- else
- head,start=markstoligature(head,start,stop,lig)
- end
- return head,start,true,false
- else
- end
- end
- else
- local discfound=false
- local hasmarks=marks[startchar]
- while current do
- local char,id=ischar(current,currentfont)
- if char then
- if skiphash and skiphash[char] then
- current=getnext(current)
- else
- local lg=ligature[char]
- if lg then
- if marks[char] then
- hasmarks=true
- end
- stop=current
- ligature=lg
- current=getnext(current)
- else
- break
- end
- end
- elseif char==false then
- break
- elseif id==disc_code then
- discfound=current
- break
- else
- break
- end
- end
- if discfound then
- local pre,post,replace=getdisc(discfound)
- local match
- if replace then
- local char=ischar(replace,currentfont)
- if char and ligature[char] then
- match=true
- end
- end
- if not match and pre then
- local char=ischar(pre,currentfont)
- if char and ligature[char] then
- match=true
- end
- end
- if not match and not pre or not replace then
- local n=getnext(discfound)
- local char=ischar(n,currentfont)
- if char and ligature[char] then
- match=true
- end
- end
- if match then
- local ishead=head==start
- local prev=getprev(start)
- if stop then
- setnext(stop)
- local copy=copy_node_list(start)
- local tail=stop
- local liat=find_node_tail(copy)
- if pre then
- setlink(liat,pre)
- end
- if replace then
- setlink(tail,replace)
- end
- pre=copy
- replace=start
- else
- setnext(start)
- local copy=copy_node(start)
- if pre then
- setlink(copy,pre)
- end
- if replace then
- setlink(start,replace)
- end
- pre=copy
- replace=start
- end
- setdisc(discfound,pre,post,replace)
- if prev then
- setlink(prev,discfound)
- else
- setprev(discfound)
- head=discfound
- end
- start=discfound
- return head,start,true,true
- end
- end
- local lig=ligature.ligature
- if lig then
- if stop then
- if trace_ligatures then
- local stopchar=getchar(stop)
- head,start=toligature(head,start,stop,lig,dataset,sequence,skiphash,false,hasmarks)
- logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(dataset,sequence),gref(startchar),gref(stopchar),gref(lig))
- else
- head,start=toligature(head,start,stop,lig,dataset,sequence,skiphash,false,hasmarks)
- end
- else
- resetinjection(start)
- setchar(start,lig)
- if trace_ligatures then
- logprocess("%s: replacing %s by (no real) ligature %s case 3",pref(dataset,sequence),gref(startchar),gref(lig))
- end
- end
- return head,start,true,false
- else
- end
- end
- return head,start,false,false
-end
-function handlers.gpos_single(head,start,dataset,sequence,kerns,rlmode,skiphash,step,injection)
- local startchar=getchar(start)
- local format=step.format
- if format=="single" or type(kerns)=="table" then
- local dx,dy,w,h=setposition(0,start,factor,rlmode,kerns,injection)
- if trace_kerns then
- logprocess("%s: shifting single %s by %s xy (%p,%p) and wh (%p,%p)",pref(dataset,sequence),gref(startchar),format,dx,dy,w,h)
- end
- else
- local k=(format=="move" and setmove or setkern)(start,factor,rlmode,kerns,injection)
- if trace_kerns then
- logprocess("%s: shifting single %s by %s %p",pref(dataset,sequence),gref(startchar),format,k)
- end
- end
- return head,start,true
-end
-function handlers.gpos_pair(head,start,dataset,sequence,kerns,rlmode,skiphash,step,injection)
- local snext=getnext(start)
- if not snext then
- return head,start,false
- else
- local prev=start
- while snext do
- local nextchar=ischar(snext,currentfont)
- if nextchar then
- if skiphash and skiphash[nextchar] then
- prev=snext
- snext=getnext(snext)
- else
- local krn=kerns[nextchar]
- if not krn then
- break
- end
- local format=step.format
- if format=="pair" then
- local a=krn[1]
- local b=krn[2]
- if a==true then
- elseif a then
- local x,y,w,h=setposition(1,start,factor,rlmode,a,injection)
- if trace_kerns then
- local startchar=getchar(start)
- logprocess("%s: shifting first of pair %s and %s by xy (%p,%p) and wh (%p,%p) as %s",pref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h,injection or "injections")
- end
- end
- if b==true then
- start=snext
- elseif b then
- local x,y,w,h=setposition(2,snext,factor,rlmode,b,injection)
- if trace_kerns then
- local startchar=getchar(start)
- logprocess("%s: shifting second of pair %s and %s by xy (%p,%p) and wh (%p,%p) as %s",pref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h,injection or "injections")
- end
- start=snext
- elseif forcepairadvance then
- start=snext
- end
- return head,start,true
- elseif krn~=0 then
- local k=(format=="move" and setmove or setkern)(snext,factor,rlmode,krn,injection)
- if trace_kerns then
- logprocess("%s: inserting %s %p between %s and %s as %s",pref(dataset,sequence),format,k,gref(getchar(prev)),gref(nextchar),injection or "injections")
- end
- return head,start,true
- else
- break
- end
- end
- else
- break
- end
- end
- return head,start,false
- end
-end
-function handlers.gpos_mark2base(head,start,dataset,sequence,markanchors,rlmode,skiphash)
- local markchar=getchar(start)
- if marks[markchar] then
- local base=getprev(start)
- if base then
- local basechar=ischar(base,currentfont)
- if basechar then
- if marks[basechar] then
- while base do
- base=getprev(base)
- if base then
- basechar=ischar(base,currentfont)
- if basechar then
- if not marks[basechar] then
- break
- end
- else
- if trace_bugs then
- logwarning("%s: no base for mark %s, case %i",pref(dataset,sequence),gref(markchar),1)
- end
- return head,start,false
- end
- else
- if trace_bugs then
- logwarning("%s: no base for mark %s, case %i",pref(dataset,sequence),gref(markchar),2)
- end
- return head,start,false
- end
- end
- end
- local ba=markanchors[1][basechar]
- if ba then
- local ma=markanchors[2]
- local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks)
- if trace_marks then
- logprocess("%s, bound %s, anchoring mark %s to basechar %s => (%p,%p)",
- pref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy)
- end
- return head,start,true
- elseif trace_bugs then
- logwarning("%s: mark %s is not anchored to %s",pref(dataset,sequence),gref(markchar),gref(basechar))
- end
- elseif trace_bugs then
- logwarning("%s: nothing preceding, case %i",pref(dataset,sequence),1)
- end
- elseif trace_bugs then
- logwarning("%s: nothing preceding, case %i",pref(dataset,sequence),2)
- end
- elseif trace_bugs then
- logwarning("%s: mark %s is no mark",pref(dataset,sequence),gref(markchar))
- end
- return head,start,false
-end
-function handlers.gpos_mark2ligature(head,start,dataset,sequence,markanchors,rlmode,skiphash)
- local markchar=getchar(start)
- if marks[markchar] then
- local base=getprev(start)
- if base then
- local basechar=ischar(base,currentfont)
- if basechar then
- if marks[basechar] then
- while base do
- base=getprev(base)
- if base then
- basechar=ischar(base,currentfont)
- if basechar then
- if not marks[basechar] then
- break
- end
- else
- if trace_bugs then
- logwarning("%s: no base for mark %s, case %i",pref(dataset,sequence),gref(markchar),1)
- end
- return head,start,false
- end
- else
- if trace_bugs then
- logwarning("%s: no base for mark %s, case %i",pref(dataset,sequence),gref(markchar),2)
- end
- return head,start,false
- end
- end
- end
- local ba=markanchors[1][basechar]
- if ba then
- local ma=markanchors[2]
- if ma then
- local index=getligaindex(start)
- ba=ba[index]
- if ba then
- local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks)
- if trace_marks then
- logprocess("%s, index %s, bound %s, anchoring mark %s to baselig %s at index %s => (%p,%p)",
- pref(dataset,sequence),index,bound,gref(markchar),gref(basechar),index,dx,dy)
- end
- return head,start,true
- else
- if trace_bugs then
- logwarning("%s: no matching anchors for mark %s and baselig %s with index %a",pref(dataset,sequence),gref(markchar),gref(basechar),index)
- end
- end
- end
- elseif trace_bugs then
- onetimemessage(currentfont,basechar,"no base anchors",report_fonts)
- end
- elseif trace_bugs then
- logwarning("%s: prev node is no char, case %i",pref(dataset,sequence),1)
- end
- elseif trace_bugs then
- logwarning("%s: prev node is no char, case %i",pref(dataset,sequence),2)
- end
- elseif trace_bugs then
- logwarning("%s: mark %s is no mark",pref(dataset,sequence),gref(markchar))
- end
- return head,start,false
-end
-function handlers.gpos_mark2mark(head,start,dataset,sequence,markanchors,rlmode,skiphash)
- local markchar=getchar(start)
- if marks[markchar] then
- local base=getprev(start)
- local slc=getligaindex(start)
- if slc then
- while base do
- local blc=getligaindex(base)
- if blc and blc~=slc then
- base=getprev(base)
- else
- break
- end
- end
- end
- if base then
- local basechar=ischar(base,currentfont)
- if basechar then
- local ba=markanchors[1][basechar]
- if ba then
- local ma=markanchors[2]
- local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],true,checkmarks)
- if trace_marks then
- logprocess("%s, bound %s, anchoring mark %s to basemark %s => (%p,%p)",
- pref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy)
- end
- return head,start,true
- end
- end
- end
- elseif trace_bugs then
- logwarning("%s: mark %s is no mark",pref(dataset,sequence),gref(markchar))
- end
- return head,start,false
-end
-function handlers.gpos_cursive(head,start,dataset,sequence,exitanchors,rlmode,skiphash,step)
- local startchar=getchar(start)
- if marks[startchar] then
- if trace_cursive then
- logprocess("%s: ignoring cursive for mark %s",pref(dataset,sequence),gref(startchar))
- end
- else
- local nxt=getnext(start)
- while nxt do
- local nextchar=ischar(nxt,currentfont)
- if not nextchar then
- break
- elseif marks[nextchar] then
- nxt=getnext(nxt)
- else
- local exit=exitanchors[3]
- if exit then
- local entry=exitanchors[1][nextchar]
- if entry then
- entry=entry[2]
- if entry then
- local r2lflag=sequence.flags[4]
- local dx,dy,bound=setcursive(start,nxt,factor,rlmode,exit,entry,characters[startchar],characters[nextchar],r2lflag)
- if trace_cursive then
- logprocess("%s: moving %s to %s cursive (%p,%p) using bound %s in %s mode",pref(dataset,sequence),gref(startchar),gref(nextchar),dx,dy,bound,mref(rlmode))
- end
- return head,start,true
- end
- end
- end
- break
- end
- end
- end
- return head,start,false
-end
-local chainprocs={}
-local function logprocess(...)
- if trace_steps then
- registermessage(...)
- if trace_steps=="silent" then
- return
- end
- end
- report_subchain(...)
-end
-local logwarning=report_subchain
-local function logprocess(...)
- if trace_steps then
- registermessage(...)
- if trace_steps=="silent" then
- return
- end
- end
- report_chain(...)
-end
-local logwarning=report_chain
-local function reversesub(head,start,stop,dataset,sequence,replacements,rlmode,skiphash)
- local char=getchar(start)
- local replacement=replacements[char]
- if replacement then
- if trace_singles then
- logprocess("%s: single reverse replacement of %s by %s",cref(dataset,sequence),gref(char),gref(replacement))
- end
- resetinjection(start)
- setchar(start,replacement)
- return head,start,true
- else
- return head,start,false
- end
-end
-chainprocs.reversesub=reversesub
-local function reportzerosteps(dataset,sequence)
- logwarning("%s: no steps",cref(dataset,sequence))
-end
-local function reportmoresteps(dataset,sequence)
- logwarning("%s: more than 1 step",cref(dataset,sequence))
-end
-local function getmapping(dataset,sequence,currentlookup)
- local steps=currentlookup.steps
- local nofsteps=currentlookup.nofsteps
- if nofsteps==0 then
- reportzerosteps(dataset,sequence)
- currentlookup.mapping=false
- return false
- else
- if nofsteps>1 then
- reportmoresteps(dataset,sequence)
- end
- local mapping=steps[1].coverage
- currentlookup.mapping=mapping
- currentlookup.format=steps[1].format
- return mapping
- end
-end
-function chainprocs.gsub_remove(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
- if trace_chains then
- logprocess("%s: removing character %s",cref(dataset,sequence,chainindex),gref(getchar(start)))
- end
- head,start=remove_node(head,start,true)
- return head,getprev(start),true
-end
-function chainprocs.gsub_single(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
- local mapping=currentlookup.mapping
- if mapping==nil then
- mapping=getmapping(dataset,sequence,currentlookup)
- end
- if mapping then
- local current=start
- while current do
- local currentchar=ischar(current)
- if currentchar then
- local replacement=mapping[currentchar]
- if not replacement or replacement=="" then
- if trace_bugs then
- logwarning("%s: no single for %s",cref(dataset,sequence,chainindex),gref(currentchar))
- end
- else
- if trace_singles then
- logprocess("%s: replacing single %s by %s",cref(dataset,sequence,chainindex),gref(currentchar),gref(replacement))
- end
- resetinjection(current)
- setchar(current,replacement)
- end
- return head,start,true
- elseif currentchar==false then
- break
- elseif current==stop then
- break
- else
- current=getnext(current)
- end
- end
- end
- return head,start,false
-end
-function chainprocs.gsub_alternate(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
- local mapping=currentlookup.mapping
- if mapping==nil then
- mapping=getmapping(dataset,sequence,currentlookup)
- end
- if mapping then
- local kind=dataset[4]
- local what=dataset[1]
- local value=what==true and tfmdata.shared.features[kind] or what
- local current=start
- while current do
- local currentchar=ischar(current)
- if currentchar then
- local alternatives=mapping[currentchar]
- if alternatives then
- local choice,comment=get_alternative_glyph(current,alternatives,value)
- if choice then
- if trace_alternatives then
- logprocess("%s: replacing %s by alternative %a to %s, %s",cref(dataset,sequence),gref(currentchar),choice,gref(choice),comment)
- end
- resetinjection(start)
- setchar(start,choice)
- else
- if trace_alternatives then
- logwarning("%s: no variant %a for %s, %s",cref(dataset,sequence),value,gref(currentchar),comment)
- end
- end
- end
- return head,start,true
- elseif currentchar==false then
- break
- elseif current==stop then
- break
- else
- current=getnext(current)
- end
- end
- end
- return head,start,false
-end
-function chainprocs.gsub_multiple(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
- local mapping=currentlookup.mapping
- if mapping==nil then
- mapping=getmapping(dataset,sequence,currentlookup)
- end
- if mapping then
- local startchar=getchar(start)
- local replacement=mapping[startchar]
- if not replacement or replacement=="" then
- if trace_bugs then
- logwarning("%s: no multiple for %s",cref(dataset,sequence),gref(startchar))
- end
- else
- if trace_multiples then
- logprocess("%s: replacing %s by multiple characters %s",cref(dataset,sequence),gref(startchar),gref(replacement))
- end
- return multiple_glyphs(head,start,replacement,skiphash,dataset[1],stop)
- end
- end
- return head,start,false
-end
-function chainprocs.gsub_ligature(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
- local mapping=currentlookup.mapping
- if mapping==nil then
- mapping=getmapping(dataset,sequence,currentlookup)
- end
- if mapping then
- local startchar=getchar(start)
- local ligatures=mapping[startchar]
- if not ligatures then
- if trace_bugs then
- logwarning("%s: no ligatures starting with %s",cref(dataset,sequence,chainindex),gref(startchar))
- end
- else
- local hasmarks=marks[startchar]
- local current=getnext(start)
- local discfound=false
- local last=stop
- local nofreplacements=1
- while current do
- local id=getid(current)
- if id==disc_code then
- if not discfound then
- discfound=current
- end
- if current==stop then
- break
- else
- current=getnext(current)
- end
- else
- local schar=getchar(current)
- if skiphash and skiphash[schar] then
- current=getnext(current)
- else
- local lg=ligatures[schar]
- if lg then
- ligatures=lg
- last=current
- nofreplacements=nofreplacements+1
- if marks[char] then
- hasmarks=true
- end
- if current==stop then
- break
- else
- current=getnext(current)
- end
- else
- break
- end
- end
- end
- end
- local ligature=ligatures.ligature
- if ligature then
- if chainindex then
- stop=last
- end
- if trace_ligatures then
- if start==stop then
- logprocess("%s: replacing character %s by ligature %s case 3",cref(dataset,sequence,chainindex),gref(startchar),gref(ligature))
- else
- logprocess("%s: replacing character %s upto %s by ligature %s case 4",cref(dataset,sequence,chainindex),gref(startchar),gref(getchar(stop)),gref(ligature))
- end
- end
- head,start=toligature(head,start,stop,ligature,dataset,sequence,skiphash,discfound,hasmarks)
- return head,start,true,nofreplacements,discfound
- elseif trace_bugs then
- if start==stop then
- logwarning("%s: replacing character %s by ligature fails",cref(dataset,sequence,chainindex),gref(startchar))
- else
- logwarning("%s: replacing character %s upto %s by ligature fails",cref(dataset,sequence,chainindex),gref(startchar),gref(getchar(stop)))
- end
- end
- end
- end
- return head,start,false,0,false
-end
-function chainprocs.gpos_single(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
- local mapping=currentlookup.mapping
- if mapping==nil then
- mapping=getmapping(dataset,sequence,currentlookup)
- end
- if mapping then
- local startchar=getchar(start)
- local kerns=mapping[startchar]
- if kerns then
- local format=currentlookup.format
- if format=="single" then
- local dx,dy,w,h=setposition(0,start,factor,rlmode,kerns)
- if trace_kerns then
- logprocess("%s: shifting single %s by %s (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),format,dx,dy,w,h)
- end
- else
- local k=(format=="move" and setmove or setkern)(start,factor,rlmode,kerns,injection)
- if trace_kerns then
- logprocess("%s: shifting single %s by %s %p",cref(dataset,sequence),gref(startchar),format,k)
- end
- end
- return head,start,true
- end
- end
- return head,start,false
-end
-function chainprocs.gpos_pair(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
- local mapping=currentlookup.mapping
- if mapping==nil then
- mapping=getmapping(dataset,sequence,currentlookup)
- end
- if mapping then
- local snext=getnext(start)
- if snext then
- local startchar=getchar(start)
- local kerns=mapping[startchar]
- if kerns then
- local prev=start
- while snext do
- local nextchar=ischar(snext,currentfont)
- if not nextchar then
- break
- end
- if skiphash and skiphash[nextchar] then
- prev=snext
- snext=getnext(snext)
- else
- local krn=kerns[nextchar]
- if not krn then
- break
- end
- local format=currentlookup.format
- if format=="pair" then
- local a=krn[1]
- local b=krn[2]
- if a==true then
- elseif a then
- local x,y,w,h=setposition(1,start,factor,rlmode,a,"injections")
- if trace_kerns then
- local startchar=getchar(start)
- logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h)
- end
- end
- if b==true then
- start=snext
- elseif b then
- local x,y,w,h=setposition(2,snext,factor,rlmode,b,"injections")
- if trace_kerns then
- local startchar=getchar(start)
- logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h)
- end
- start=snext
- elseif forcepairadvance then
- start=snext
- end
- return head,start,true
- elseif krn~=0 then
- local k=(format=="move" and setmove or setkern)(snext,factor,rlmode,krn)
- if trace_kerns then
- logprocess("%s: inserting %s %p between %s and %s",cref(dataset,sequence),format,k,gref(getchar(prev)),gref(nextchar))
- end
- return head,start,true
- else
- break
- end
- end
- end
- end
- end
- end
- return head,start,false
-end
-function chainprocs.gpos_mark2base(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
- local mapping=currentlookup.mapping
- if mapping==nil then
- mapping=getmapping(dataset,sequence,currentlookup)
- end
- if mapping then
- local markchar=getchar(start)
- if marks[markchar] then
- local markanchors=mapping[markchar]
- if markanchors then
- local base=getprev(start)
- if base then
- local basechar=ischar(base,currentfont)
- if basechar then
- if marks[basechar] then
- while base do
- base=getprev(base)
- if base then
- local basechar=ischar(base,currentfont)
- if basechar then
- if not marks[basechar] then
- break
- end
- else
- if trace_bugs then
- logwarning("%s: no base for mark %s, case %i",pref(dataset,sequence),gref(markchar),1)
- end
- return head,start,false
- end
- else
- if trace_bugs then
- logwarning("%s: no base for mark %s, case %i",pref(dataset,sequence),gref(markchar),2)
- end
- return head,start,false
- end
- end
- end
- local ba=markanchors[1][basechar]
- if ba then
- local ma=markanchors[2]
- if ma then
- local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks)
- if trace_marks then
- logprocess("%s, bound %s, anchoring mark %s to basechar %s => (%p,%p)",
- cref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy)
- end
- return head,start,true
- end
- end
- elseif trace_bugs then
- logwarning("%s: prev node is no char, case %i",cref(dataset,sequence),1)
- end
- elseif trace_bugs then
- logwarning("%s: prev node is no char, case %i",cref(dataset,sequence),2)
- end
- elseif trace_bugs then
- logwarning("%s: mark %s has no anchors",cref(dataset,sequence),gref(markchar))
- end
- elseif trace_bugs then
- logwarning("%s: mark %s is no mark",cref(dataset,sequence),gref(markchar))
- end
- end
- return head,start,false
-end
-function chainprocs.gpos_mark2ligature(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
- local mapping=currentlookup.mapping
- if mapping==nil then
- mapping=getmapping(dataset,sequence,currentlookup)
- end
- if mapping then
- local markchar=getchar(start)
- if marks[markchar] then
- local markanchors=mapping[markchar]
- if markanchors then
- local base=getprev(start)
- if base then
- local basechar=ischar(base,currentfont)
- if basechar then
- if marks[basechar] then
- while base do
- base=getprev(base)
- if base then
- local basechar=ischar(base,currentfont)
- if basechar then
- if not marks[basechar] then
- break
- end
- else
- if trace_bugs then
- logwarning("%s: no base for mark %s, case %i",cref(dataset,sequence),markchar,1)
- end
- return head,start,false
- end
- else
- if trace_bugs then
- logwarning("%s: no base for mark %s, case %i",cref(dataset,sequence),markchar,2)
- end
- return head,start,false
- end
- end
- end
- local ba=markanchors[1][basechar]
- if ba then
- local ma=markanchors[2]
- if ma then
- local index=getligaindex(start)
- ba=ba[index]
- if ba then
- local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks)
- if trace_marks then
- logprocess("%s, bound %s, anchoring mark %s to baselig %s at index %s => (%p,%p)",
- cref(dataset,sequence),a or bound,gref(markchar),gref(basechar),index,dx,dy)
- end
- return head,start,true
- end
- end
- end
- elseif trace_bugs then
- logwarning("%s, prev node is no char, case %i",cref(dataset,sequence),1)
- end
- elseif trace_bugs then
- logwarning("%s, prev node is no char, case %i",cref(dataset,sequence),2)
- end
- elseif trace_bugs then
- logwarning("%s, mark %s has no anchors",cref(dataset,sequence),gref(markchar))
- end
- elseif trace_bugs then
- logwarning("%s, mark %s is no mark",cref(dataset,sequence),gref(markchar))
- end
- end
- return head,start,false
-end
-function chainprocs.gpos_mark2mark(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
- local mapping=currentlookup.mapping
- if mapping==nil then
- mapping=getmapping(dataset,sequence,currentlookup)
- end
- if mapping then
- local markchar=getchar(start)
- if marks[markchar] then
- local markanchors=mapping[markchar]
- if markanchors then
- local base=getprev(start)
- local slc=getligaindex(start)
- if slc then
- while base do
- local blc=getligaindex(base)
- if blc and blc~=slc then
- base=getprev(base)
- else
- break
- end
- end
- end
- if base then
- local basechar=ischar(base,currentfont)
- if basechar then
- local ba=markanchors[1][basechar]
- if ba then
- local ma=markanchors[2]
- if ma then
- local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],true,checkmarks)
- if trace_marks then
- logprocess("%s, bound %s, anchoring mark %s to basemark %s => (%p,%p)",
- cref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy)
- end
- return head,start,true
- end
- end
- elseif trace_bugs then
- logwarning("%s: prev node is no mark, case %i",cref(dataset,sequence),1)
- end
- elseif trace_bugs then
- logwarning("%s: prev node is no mark, case %i",cref(dataset,sequence),2)
- end
- elseif trace_bugs then
- logwarning("%s: mark %s has no anchors",cref(dataset,sequence),gref(markchar))
- end
- elseif trace_bugs then
- logwarning("%s: mark %s is no mark",cref(dataset,sequence),gref(markchar))
- end
- end
- return head,start,false
-end
-function chainprocs.gpos_cursive(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
- local mapping=currentlookup.mapping
- if mapping==nil then
- mapping=getmapping(dataset,sequence,currentlookup)
- end
- if mapping then
- local startchar=getchar(start)
- local exitanchors=mapping[startchar]
- if exitanchors then
- if marks[startchar] then
- if trace_cursive then
- logprocess("%s: ignoring cursive for mark %s",pref(dataset,sequence),gref(startchar))
- end
- else
- local nxt=getnext(start)
- while nxt do
- local nextchar=ischar(nxt,currentfont)
- if not nextchar then
- break
- elseif marks[nextchar] then
- nxt=getnext(nxt)
- else
- local exit=exitanchors[3]
- if exit then
- local entry=exitanchors[1][nextchar]
- if entry then
- entry=entry[2]
- if entry then
- local r2lflag=sequence.flags[4]
- local dx,dy,bound=setcursive(start,nxt,factor,rlmode,exit,entry,characters[startchar],characters[nextchar],r2lflag)
- if trace_cursive then
- logprocess("%s: moving %s to %s cursive (%p,%p) using bound %s in %s mode",pref(dataset,sequence),gref(startchar),gref(nextchar),dx,dy,bound,mref(rlmode))
- end
- return head,start,true
- end
- end
- elseif trace_bugs then
- onetimemessage(currentfont,startchar,"no entry anchors",report_fonts)
- end
- break
- end
- end
- end
- elseif trace_cursive and trace_details then
- logprocess("%s, cursive %s is already done",pref(dataset,sequence),gref(getchar(start)),alreadydone)
- end
- end
- return head,start,false
-end
-local function show_skip(dataset,sequence,char,ck,class)
- logwarning("%s: skipping char %s, class %a, rule %a, lookuptype %a",cref(dataset,sequence),gref(char),class,ck[1],ck[8] or ck[2])
-end
-local userkern=nuts.pool and nuts.pool.newkern
-do if not userkern then
- local thekern=nuts.new("kern",1)
- local setkern=nuts.setkern
- userkern=function(k)
- local n=copy_node(thekern)
- setkern(n,k)
- return n
- end
-end end
-local function checked(head)
- local current=head
- while current do
- if getid(current)==glue_code then
- local kern=userkern(getwidth(current))
- if head==current then
- local next=getnext(current)
- if next then
- setlink(kern,next)
- end
- flush_node(current)
- head=kern
- current=next
- else
- local prev,next=getboth(current)
- setlink(prev,kern,next)
- flush_node(current)
- current=next
- end
- else
- current=getnext(current)
- end
- end
- return head
-end
-local function setdiscchecked(d,pre,post,replace)
- if pre then pre=checked(pre) end
- if post then post=checked(post) end
- if replace then replace=checked(replace) end
- setdisc(d,pre,post,replace)
-end
-local noflags={ false,false,false,false }
-local function chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck)
- local size=ck[5]-ck[4]+1
- local chainlookups=ck[6]
- local done=false
- if chainlookups then
- if size==1 then
- local chainlookup=chainlookups[1]
- for j=1,#chainlookup do
- local chainstep=chainlookup[j]
- local chainkind=chainstep.type
- local chainproc=chainprocs[chainkind]
- if chainproc then
- local ok
- head,start,ok=chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash)
- if ok then
- done=true
- end
- else
- logprocess("%s: %s is not yet supported (1)",cref(dataset,sequence),chainkind)
- end
- end
- else
- local i=1
- local laststart=start
- local nofchainlookups=#chainlookups
- while start do
- if skiphash then
- while start do
- local char=ischar(start,currentfont)
- if char then
- if skiphash and skiphash[char] then
- start=getnext(start)
- else
- break
- end
- else
- break
- end
- end
- end
- local chainlookup=chainlookups[i]
- if chainlookup then
- for j=1,#chainlookup do
- local chainstep=chainlookup[j]
- local chainkind=chainstep.type
- local chainproc=chainprocs[chainkind]
- if chainproc then
- local ok,n
- head,start,ok,n=chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash,i)
- if ok then
- done=true
- if n and n>1 and i+n>nofchainlookups then
- i=size
- break
- end
- end
- else
- logprocess("%s: %s is not yet supported (2)",cref(dataset,sequence),chainkind)
- end
- end
- else
- end
- i=i+1
- if i>size or not start then
- break
- elseif start then
- laststart=start
- start=getnext(start)
- end
- end
- if not start then
- start=laststart
- end
- end
- else
- local replacements=ck[7]
- if replacements then
- head,start,done=reversesub(head,start,last,dataset,sequence,replacements,rlmode,skiphash)
- else
- done=true
- if trace_contexts then
- logprocess("%s: skipping match",cref(dataset,sequence))
- end
- end
- end
- return head,start,done
-end
-local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
- if not start then
- return head,start,false
- end
- local startishead=start==head
- local seq=ck[3]
- local f=ck[4]
- local l=ck[5]
- local s=#seq
- local done=false
- local sweepnode=sweepnode
- local sweeptype=sweeptype
- local sweepoverflow=false
- local keepdisc=not sweepnode
- local lookaheaddisc=nil
- local backtrackdisc=nil
- local current=start
- local last=start
- local prev=getprev(start)
- local hasglue=false
- local i=f
- while i<=l do
- local id=getid(current)
- if id==glyph_code then
- i=i+1
- last=current
- current=getnext(current)
- elseif id==glue_code then
- i=i+1
- last=current
- current=getnext(current)
- hasglue=true
- elseif id==disc_code then
- if keepdisc then
- keepdisc=false
- lookaheaddisc=current
- local replace=getreplace(current)
- if not replace then
- sweepoverflow=true
- sweepnode=current
- current=getnext(current)
- else
- while replace and i<=l do
- if getid(replace)==glyph_code then
- i=i+1
- end
- replace=getnext(replace)
- end
- current=getnext(replace)
- end
- last=current
- else
- head,current=flattendisk(head,current)
- end
- else
- last=current
- current=getnext(current)
- end
- if current then
- elseif sweepoverflow then
- break
- elseif sweeptype=="post" or sweeptype=="replace" then
- current=getnext(sweepnode)
- if current then
- sweeptype=nil
- sweepoverflow=true
- else
- break
- end
- else
- break
- end
- end
- if sweepoverflow then
- local prev=current and getprev(current)
- if not current or prev~=sweepnode then
- local head=getnext(sweepnode)
- local tail=nil
- if prev then
- tail=prev
- setprev(current,sweepnode)
- else
- tail=find_node_tail(head)
- end
- setnext(sweepnode,current)
- setprev(head)
- setnext(tail)
- appenddisc(sweepnode,head)
- end
- end
- if l1 then
- local current=prev
- local i=f
- local t=sweeptype=="pre" or sweeptype=="replace"
- if not current and t and current==checkdisk then
- current=getprev(sweepnode)
- end
- while current and i>1 do
- local id=getid(current)
- if id==glyph_code then
- i=i-1
- elseif id==glue_code then
- i=i-1
- hasglue=true
- elseif id==disc_code then
- if keepdisc then
- keepdisc=false
- if notmatchpost[current]~=notmatchreplace[current] then
- backtrackdisc=current
- end
- local replace=getreplace(current)
- while replace and i>1 do
- if getid(replace)==glyph_code then
- i=i-1
- end
- replace=getnext(replace)
- end
- elseif notmatchpost[current]~=notmatchreplace[current] then
- head,current=flattendisk(head,current)
- end
- end
- current=getprev(current)
- if t and current==checkdisk then
- current=getprev(sweepnode)
- end
- end
- end
- local done=false
- if lookaheaddisc then
- local cf=start
- local cl=getprev(lookaheaddisc)
- local cprev=getprev(start)
- local insertedmarks=0
- while cprev do
- local char=ischar(cf,currentfont)
- if char and marks[char] then
- insertedmarks=insertedmarks+1
- cf=cprev
- startishead=cf==head
- cprev=getprev(cprev)
- else
- break
- end
- end
- setlink(cprev,lookaheaddisc)
- setprev(cf)
- setnext(cl)
- if startishead then
- head=lookaheaddisc
- end
- local pre,post,replace=getdisc(lookaheaddisc)
- local new=copy_node_list(cf)
- local cnew=new
- if pre then
- setlink(find_node_tail(cf),pre)
- end
- if replace then
- local tail=find_node_tail(new)
- setlink(tail,replace)
- end
- for i=1,insertedmarks do
- cnew=getnext(cnew)
- end
- cl=start
- local clast=cnew
- for i=f,l do
- cl=getnext(cl)
- clast=getnext(clast)
- end
- if not notmatchpre[lookaheaddisc] then
- local ok=false
- cf,start,ok=chainrun(cf,start,cl,dataset,sequence,rlmode,skiphash,ck)
- if ok then
- done=true
- end
- end
- if not notmatchreplace[lookaheaddisc] then
- local ok=false
- new,cnew,ok=chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck)
- if ok then
- done=true
- end
- end
- if hasglue then
- setdiscchecked(lookaheaddisc,cf,post,new)
- else
- setdisc(lookaheaddisc,cf,post,new)
- end
- start=getprev(lookaheaddisc)
- sweephead[cf]=getnext(clast) or false
- sweephead[new]=getnext(cl) or false
- elseif backtrackdisc then
- local cf=getnext(backtrackdisc)
- local cl=start
- local cnext=getnext(start)
- local insertedmarks=0
- while cnext do
- local char=ischar(cnext,currentfont)
- if char and marks[char] then
- insertedmarks=insertedmarks+1
- cl=cnext
- cnext=getnext(cnext)
- else
- break
- end
- end
- setlink(backtrackdisc,cnext)
- setprev(cf)
- setnext(cl)
- local pre,post,replace,pretail,posttail,replacetail=getdisc(backtrackdisc,true)
- local new=copy_node_list(cf)
- local cnew=find_node_tail(new)
- for i=1,insertedmarks do
- cnew=getprev(cnew)
- end
- local clast=cnew
- for i=f,l do
- clast=getnext(clast)
- end
- if not notmatchpost[backtrackdisc] then
- local ok=false
- cf,start,ok=chainrun(cf,start,last,dataset,sequence,rlmode,skiphash,ck)
- if ok then
- done=true
- end
- end
- if not notmatchreplace[backtrackdisc] then
- local ok=false
- new,cnew,ok=chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck)
- if ok then
- done=true
- end
- end
- if post then
- setlink(posttail,cf)
- else
- post=cf
- end
- if replace then
- setlink(replacetail,new)
- else
- replace=new
- end
- if hasglue then
- setdiscchecked(backtrackdisc,pre,post,replace)
- else
- setdisc(backtrackdisc,pre,post,replace)
- end
- start=getprev(backtrackdisc)
- sweephead[post]=getnext(clast) or false
- sweephead[replace]=getnext(last) or false
- else
- local ok=false
- head,start,ok=chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck)
- if ok then
- done=true
- end
- end
- return head,start,done
-end
-local function chaintrac(head,start,dataset,sequence,rlmode,skiphash,ck,match,discseen,sweepnode)
- local rule=ck[1]
- local lookuptype=ck[8] or ck[2]
- local nofseq=#ck[3]
- local first=ck[4]
- local last=ck[5]
- local char=getchar(start)
- logwarning("%s: rule %s %s at char %s for (%s,%s,%s) chars, lookuptype %a, %sdisc seen, %ssweeping",
- cref(dataset,sequence),rule,match and "matches" or "nomatch",
- gref(char),first-1,last-first+1,nofseq-last,lookuptype,
- discseen and "" or "no ",sweepnode and "" or "not ")
-end
-local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,skiphash)
- local sweepnode=sweepnode
- local sweeptype=sweeptype
- local postreplace
- local prereplace
- local checkdisc
- local discseen
- if sweeptype then
- if sweeptype=="replace" then
- postreplace=true
- prereplace=true
- else
- postreplace=sweeptype=="post"
- prereplace=sweeptype=="pre"
- end
- checkdisc=getprev(head)
- end
- local currentfont=currentfont
- local skipped
- local startprev,
- startnext=getboth(start)
- local done
- local nofcontexts=contexts.n
- local startchar=nofcontext==1 or ischar(start,currentfont)
- for k=1,nofcontexts do
- local ck=contexts[k]
- local seq=ck[3]
- local f=ck[4]
- if not startchar or not seq[f][startchar] then
- goto next
- end
- local s=seq.n
- local l=ck[5]
- local current=start
- local last=start
- if l>f then
- local discfound
- local n=f+1
- last=startnext
- while n<=l do
- if postreplace and not last then
- last=getnext(sweepnode)
- sweeptype=nil
- end
- if last then
- local char,id=ischar(last,currentfont)
- if char then
- if skiphash and skiphash[char] then
- skipped=true
- if trace_skips then
- show_skip(dataset,sequence,char,ck,classes[char])
- end
- last=getnext(last)
- elseif seq[n][char] then
- if nl then
- break
- end
- pre=getnext(pre)
- else
- notmatchpre[last]=true
- break
- end
- end
- else
- notmatchpre[last]=true
- end
- if replace then
- while replace do
- if seq[n][getchar(replace)] then
- n=n+1
- if n>l then
- break
- end
- replace=getnext(replace)
- else
- notmatchreplace[last]=true
- if notmatchpre[last] then
- goto next
- else
- break
- end
- end
- end
- if notmatchpre[last] then
- goto next
- end
- end
- last=getnext(last)
- else
- goto next
- end
- else
- goto next
- end
- end
- end
- if f>1 then
- if startprev then
- local prev=startprev
- if prereplace and prev==checkdisc then
- prev=getprev(sweepnode)
- end
- if prev then
- local discfound
- local n=f-1
- while n>=1 do
- if prev then
- local char,id=ischar(prev,currentfont)
- if char then
- if skiphash and skiphash[char] then
- skipped=true
- if trace_skips then
- show_skip(dataset,sequence,char,ck,classes[char])
- end
- prev=getprev(prev)
- elseif seq[n][char] then
- if n>1 then
- prev=getprev(prev)
- end
- n=n-1
- elseif discfound then
- notmatchreplace[discfound]=true
- if notmatchpost[discfound] then
- goto next
- else
- break
- end
- else
- goto next
- end
- elseif char==false then
- if discfound then
- notmatchreplace[discfound]=true
- if notmatchpost[discfound] then
- goto next
- end
- else
- goto next
- end
- break
- elseif id==disc_code then
- discseen=true
- discfound=prev
- notmatchpre[prev]=true
- notmatchpost[prev]=nil
- notmatchreplace[prev]=nil
- local pre,post,replace,pretail,posttail,replacetail=getdisc(prev,true)
- if pre~=start and post~=start and replace~=start then
- if post then
- local n=n
- while posttail do
- if seq[n][getchar(posttail)] then
- n=n-1
- if posttail==post or n<1 then
- break
- else
- posttail=getprev(posttail)
- end
- else
- notmatchpost[prev]=true
- break
- end
- end
- if n>=1 then
- notmatchpost[prev]=true
- end
- else
- notmatchpost[prev]=true
- end
- if replace then
- while replacetail do
- if seq[n][getchar(replacetail)] then
- n=n-1
- if replacetail==replace or n<1 then
- break
- else
- replacetail=getprev(replacetail)
- end
- else
- notmatchreplace[prev]=true
- if notmatchpost[prev] then
- goto next
- else
- break
- end
- end
- end
- else
- end
- end
- prev=getprev(prev)
- elseif id==glue_code then
- local sn=seq[n]
- if (sn[32] and spaces[prev]) or sn[0xFFFC] then
- n=n-1
- prev=getprev(prev)
- else
- goto next
- end
- elseif seq[n][0xFFFC] then
- n=n-1
- prev=getprev(prev)
- else
- goto next
- end
- else
- goto next
- end
- end
- else
- goto next
- end
- else
- goto next
- end
- end
- if s>l then
- local current=last and getnext(last)
- if not current and postreplace then
- current=getnext(sweepnode)
- end
- if current then
- local discfound
- local n=l+1
- while n<=s do
- if current then
- local char,id=ischar(current,currentfont)
- if char then
- if skiphash and skiphash[char] then
- skipped=true
- if trace_skips then
- show_skip(dataset,sequence,char,ck,classes[char])
- end
- current=getnext(current)
- elseif seq[n][char] then
- if ns then
- break
- else
- pre=getnext(pre)
- end
- else
- notmatchpre[current]=true
- break
- end
- end
- if n<=s then
- notmatchpre[current]=true
- end
- else
- notmatchpre[current]=true
- end
- if replace then
- while replace do
- if seq[n][getchar(replace)] then
- n=n+1
- if n>s then
- break
- else
- replace=getnext(replace)
- end
- else
- notmatchreplace[current]=true
- if notmatchpre[current] then
- goto next
- else
- break
- end
- end
- end
- else
- end
- current=getnext(current)
- elseif id==glue_code then
- local sn=seq[n]
- if (sn[32] and spaces[current]) or sn[0xFFFC] then
- n=n+1
- current=getnext(current)
- else
- goto next
- end
- elseif seq[n][0xFFFC] then
- n=n+1
- current=getnext(current)
- else
- goto next
- end
- else
- goto next
- end
- end
- else
- goto next
- end
- end
- if trace_contexts then
- chaintrac(head,start,dataset,sequence,rlmode,skipped and skiphash,ck,true,discseen,sweepnode)
- end
- if discseen or sweepnode then
- head,start,done=chaindisk(head,start,dataset,sequence,rlmode,skipped and skiphash,ck)
- else
- head,start,done=chainrun(head,start,last,dataset,sequence,rlmode,skipped and skiphash,ck)
- end
- if done then
- break
- end
- ::next::
- end
- if discseen then
- notmatchpre={}
- notmatchpost={}
- notmatchreplace={}
- end
- return head,start,done
-end
-handlers.gsub_context=handle_contextchain
-handlers.gsub_contextchain=handle_contextchain
-handlers.gsub_reversecontextchain=handle_contextchain
-handlers.gpos_contextchain=handle_contextchain
-handlers.gpos_context=handle_contextchain
-local function chained_contextchain(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash)
- local steps=currentlookup.steps
- local nofsteps=currentlookup.nofsteps
- if nofsteps>1 then
- reportmoresteps(dataset,sequence)
- end
- local l=steps[1].coverage[getchar(start)]
- if l then
- return handle_contextchain(head,start,dataset,sequence,l,rlmode,skiphash)
- else
- return head,start,false
- end
-end
-chainprocs.gsub_context=chained_contextchain
-chainprocs.gsub_contextchain=chained_contextchain
-chainprocs.gsub_reversecontextchain=chained_contextchain
-chainprocs.gpos_contextchain=chained_contextchain
-chainprocs.gpos_context=chained_contextchain
-local missing=setmetatableindex("table")
-local logwarning=report_process
-local resolved={}
-local function logprocess(...)
- if trace_steps then
- registermessage(...)
- if trace_steps=="silent" then
- return
- end
- end
- report_process(...)
-end
-local sequencelists=setmetatableindex(function(t,font)
- local sequences=fontdata[font].resources.sequences
- if not sequences or not next(sequences) then
- sequences=false
- end
- t[font]=sequences
- return sequences
-end)
-do
- local autofeatures=fonts.analyzers.features
- local featuretypes=otf.tables.featuretypes
- local defaultscript=otf.features.checkeddefaultscript
- local defaultlanguage=otf.features.checkeddefaultlanguage
- local wildcard="*"
- local default="dflt"
- local function initialize(sequence,script,language,enabled,autoscript,autolanguage)
- local features=sequence.features
- if features then
- local order=sequence.order
- if order then
- local featuretype=featuretypes[sequence.type or "unknown"]
- for i=1,#order do
- local kind=order[i]
- local valid=enabled[kind]
- if valid then
- local scripts=features[kind]
- local languages=scripts and (
- scripts[script] or
- scripts[wildcard] or
- (autoscript and defaultscript(featuretype,autoscript,scripts))
- )
- local enabled=languages and (
- languages[language] or
- languages[wildcard] or
- (autolanguage and defaultlanguage(featuretype,autolanguage,languages))
- )
- if enabled then
- return { valid,autofeatures[kind] or false,sequence,kind }
- end
- end
- end
- else
- end
- end
- return false
- end
- function otf.dataset(tfmdata,font)
- local shared=tfmdata.shared
- local properties=tfmdata.properties
- local language=properties.language or "dflt"
- local script=properties.script or "dflt"
- local enabled=shared.features
- local autoscript=enabled and enabled.autoscript
- local autolanguage=enabled and enabled.autolanguage
- local res=resolved[font]
- if not res then
- res={}
- resolved[font]=res
- end
- local rs=res[script]
- if not rs then
- rs={}
- res[script]=rs
- end
- local rl=rs[language]
- if not rl then
- rl={
- }
- rs[language]=rl
- local sequences=tfmdata.resources.sequences
- if sequences then
- for s=1,#sequences do
- local v=enabled and initialize(sequences[s],script,language,enabled,autoscript,autolanguage)
- if v then
- rl[#rl+1]=v
- end
- end
- end
- end
- return rl
- end
-end
-local function report_disc(what,n)
- report_run("%s: %s > %s",what,n,languages.serializediscretionary(n))
-end
-local function kernrun(disc,k_run,font,attr,...)
- if trace_kernruns then
- report_disc("kern",disc)
- end
- local prev,next=getboth(disc)
- local nextstart=next
- local done=false
- local pre,post,replace,pretail,posttail,replacetail=getdisc(disc,true)
- local prevmarks=prev
- while prevmarks do
- local char=ischar(prevmarks,font)
- if char and marks[char] then
- prevmarks=getprev(prevmarks)
- else
- break
- end
- end
- if prev and not ischar(prev,font) then
- prev=false
- end
- if next and not ischar(next,font) then
- next=false
- end
- if pre then
- if k_run(pre,"injections",nil,font,attr,...) then
- done=true
- end
- if prev then
- setlink(prev,pre)
- if k_run(prevmarks,"preinjections",pre,font,attr,...) then
- done=true
- end
- setprev(pre)
- setlink(prev,disc)
- end
- end
- if post then
- if k_run(post,"injections",nil,font,attr,...) then
- done=true
- end
- if next then
- setlink(posttail,next)
- if k_run(posttail,"postinjections",next,font,attr,...) then
- done=true
- end
- setnext(posttail)
- setlink(disc,next)
- end
- end
- if replace then
- if k_run(replace,"injections",nil,font,attr,...) then
- done=true
- end
- if prev then
- setlink(prev,replace)
- if k_run(prevmarks,"replaceinjections",replace,font,attr,...) then
- done=true
- end
- setprev(replace)
- setlink(prev,disc)
- end
- if next then
- setlink(replacetail,next)
- if k_run(replacetail,"replaceinjections",next,font,attr,...) then
- done=true
- end
- setnext(replacetail)
- setlink(disc,next)
- end
- elseif prev and next then
- setlink(prev,next)
- if k_run(prevmarks,"emptyinjections",next,font,attr,...) then
- done=true
- end
- setlink(prev,disc,next)
- end
- if done and trace_testruns then
- report_disc("done",disc)
- end
- return nextstart,done
-end
-local function comprun(disc,c_run,...)
- if trace_compruns then
- report_disc("comp",disc)
- end
- local pre,post,replace=getdisc(disc)
- local renewed=false
- if pre then
- sweepnode=disc
- sweeptype="pre"
- local new,done=c_run(pre,...)
- if done then
- pre=new
- renewed=true
- end
- end
- if post then
- sweepnode=disc
- sweeptype="post"
- local new,done=c_run(post,...)
- if done then
- post=new
- renewed=true
- end
- end
- if replace then
- sweepnode=disc
- sweeptype="replace"
- local new,done=c_run(replace,...)
- if done then
- replace=new
- renewed=true
- end
- end
- sweepnode=nil
- sweeptype=nil
- if renewed then
- if trace_testruns then
- report_disc("done",disc)
- end
- setdisc(disc,pre,post,replace)
- end
- return getnext(disc),renewed
-end
-local function testrun(disc,t_run,c_run,...)
- if trace_testruns then
- report_disc("test",disc)
- end
- local prev,next=getboth(disc)
- if not next then
- return
- end
- local pre,post,replace,pretail,posttail,replacetail=getdisc(disc,true)
- local renewed=false
- if (post or replace) then
- if post then
- setlink(posttail,next)
- else
- post=next
- end
- if replace then
- setlink(replacetail,next)
- else
- replace=next
- end
- local d_post=t_run(post,next,...)
- local d_replace=t_run(replace,next,...)
- if d_post>0 or d_replace>0 then
- local d=d_replace>d_post and d_replace or d_post
- local head=getnext(disc)
- local tail=head
- for i=2,d do
- local nx=getnext(tail)
- local id=getid(nx)
- if id==disc_code then
- head,tail=flattendisk(head,nx)
- elseif id==glyph_code then
- tail=nx
- else
- break
- end
- end
- next=getnext(tail)
- setnext(tail)
- setprev(head)
- local new=copy_node_list(head)
- if posttail then
- setlink(posttail,head)
- else
- post=head
- end
- if replacetail then
- setlink(replacetail,new)
- else
- replace=new
- end
- else
- if posttail then
- setnext(posttail)
- else
- post=nil
- end
- if replacetail then
- setnext(replacetail)
- else
- replace=nil
- end
- end
- setlink(disc,next)
- end
- if trace_testruns then
- report_disc("more",disc)
- end
- if pre then
- sweepnode=disc
- sweeptype="pre"
- local new,ok=c_run(pre,...)
- if ok then
- pre=new
- renewed=true
- end
- end
- if post then
- sweepnode=disc
- sweeptype="post"
- local new,ok=c_run(post,...)
- if ok then
- post=new
- renewed=true
- end
- end
- if replace then
- sweepnode=disc
- sweeptype="replace"
- local new,ok=c_run(replace,...)
- if ok then
- replace=new
- renewed=true
- end
- end
- sweepnode=nil
- sweeptype=nil
- if renewed then
- setdisc(disc,pre,post,replace)
- if trace_testruns then
- report_disc("done",disc)
- end
- end
- return getnext(disc),renewed
-end
-local nesting=0
-local function c_run_single(head,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler)
- local done=false
- local sweep=sweephead[head]
- if sweep then
- start=sweep
- sweephead[head]=false
- else
- start=head
- end
- while start do
- local char,id=ischar(start,font)
- if char then
- local a
- if attr then
- a=getglyphdata(start)
- end
- if not a or (a==attr) then
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- local ok
- head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
- if ok then
- done=true
- end
- end
- if start then
- start=getnext(start)
- end
- else
- start=getnext(start)
- end
- elseif char==false then
- return head,done
- elseif sweep then
- return head,done
- else
- start=getnext(start)
- end
- end
- return head,done
-end
-local function t_run_single(start,stop,font,attr,lookupcache)
- local lastd=nil
- while start~=stop do
- local char=ischar(start,font)
- if char then
- local a
- if attr then
- a=getglyphdata(start)
- end
- local startnext=getnext(start)
- if not a or (a==attr) then
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- local s=startnext
- local ss=nil
- local sstop=s==stop
- if not s then
- s=ss
- ss=nil
- end
- while getid(s)==disc_code do
- ss=getnext(s)
- s=getreplace(s)
- if not s then
- s=ss
- ss=nil
- end
- end
- local l=nil
- local d=0
- while s do
- local char=ischar(s,font)
- if char then
- local lg=lookupmatch[char]
- if lg then
- if sstop then
- d=1
- elseif d>0 then
- d=d+1
- end
- l=lg
- s=getnext(s)
- sstop=s==stop
- if not s then
- s=ss
- ss=nil
- end
- while getid(s)==disc_code do
- ss=getnext(s)
- s=getreplace(s)
- if not s then
- s=ss
- ss=nil
- end
- end
-lookupmatch=lg
- else
- break
- end
- else
- break
- end
- end
- if l and l.ligature then
- lastd=d
- end
- else
- end
- else
- end
- if lastd then
- return lastd
- end
- start=startnext
- else
- break
- end
- end
- return 0
-end
-local function k_run_single(sub,injection,last,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler)
- local a
- if attr then
- a=getglyphdata(sub)
- end
- if not a or (a==attr) then
- for n in nextnode,sub do
- if n==last then
- break
- end
- local char=ischar(n)
- if char then
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- local h,d,ok=handler(sub,n,dataset,sequence,lookupmatch,rlmode,skiphash,step,injection)
- if ok then
- return true
- end
- end
- end
- end
- end
-end
-local function c_run_multiple(head,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler)
- local done=false
- local sweep=sweephead[head]
- if sweep then
- start=sweep
- sweephead[head]=false
- else
- start=head
- end
- while start do
- local char=ischar(start,font)
- if char then
- local a
- if attr then
- a=getglyphdata(start)
- end
- if not a or (a==attr) then
- for i=1,nofsteps do
- local step=steps[i]
- local lookupcache=step.coverage
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- local ok
- head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
- if ok then
- done=true
- break
- elseif not start then
- break
- end
- end
- end
- if start then
- start=getnext(start)
- end
- else
- start=getnext(start)
- end
- elseif char==false then
- return head,done
- elseif sweep then
- return head,done
- else
- start=getnext(start)
- end
- end
- return head,done
-end
-local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
- local lastd=nil
- while start~=stop do
- local char=ischar(start,font)
- if char then
- local a
- if attr then
- a=getglyphdata(start)
- end
- local startnext=getnext(start)
- if not a or (a==attr) then
- for i=1,nofsteps do
- local step=steps[i]
- local lookupcache=step.coverage
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- local s=startnext
- local ss=nil
- local sstop=s==stop
- if not s then
- s=ss
- ss=nil
- end
- while getid(s)==disc_code do
- ss=getnext(s)
- s=getreplace(s)
- if not s then
- s=ss
- ss=nil
- end
- end
- local l=nil
- local d=0
- while s do
- local char=ischar(s)
- if char then
- local lg=lookupmatch[char]
- if lg then
- if sstop then
- d=1
- elseif d>0 then
- d=d+1
- end
- l=lg
- s=getnext(s)
- sstop=s==stop
- if not s then
- s=ss
- ss=nil
- end
- while getid(s)==disc_code do
- ss=getnext(s)
- s=getreplace(s)
- if not s then
- s=ss
- ss=nil
- end
- end
-lookupmatch=lg
- else
- break
- end
- else
- break
- end
- end
- if l and l.ligature then
- lastd=d
- end
- end
- end
- else
- end
- if lastd then
- return lastd
- end
- start=startnext
- else
- break
- end
- end
- return 0
-end
-local function k_run_multiple(sub,injection,last,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler)
- local a
- if attr then
- a=getglyphdata(sub)
- end
- if not a or (a==attr) then
- for n in nextnode,sub do
- if n==last then
- break
- end
- local char=ischar(n)
- if char then
- for i=1,nofsteps do
- local step=steps[i]
- local lookupcache=step.coverage
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- local h,d,ok=handler(sub,n,dataset,sequence,lookupmatch,rlmode,skiphash,step,injection)
- if ok then
- return true
- end
- end
- end
- end
- end
- end
-end
-local txtdirstate,pardirstate do
- local getdirection=nuts.getdirection
- local lefttoright=0
- local righttoleft=1
- txtdirstate=function(start,stack,top,rlparmode)
- local dir,pop=getdirection(start)
- if pop then
- if top==1 then
- return 0,rlparmode
- else
- top=top-1
- if stack[top]==righttoleft then
- return top,-1
- else
- return top,1
- end
- end
- elseif dir==lefttoright then
- top=top+1
- stack[top]=lefttoright
- return top,1
- elseif dir==righttoleft then
- top=top+1
- stack[top]=righttoleft
- return top,-1
- else
- return top,rlparmode
- end
- end
- pardirstate=function(start)
- local dir=getdirection(start)
- if dir==lefttoright then
- return 1,1
- elseif dir==righttoleft then
- return -1,-1
- elseif dir=="TLT" then
- return 1,1
- elseif dir=="TRT" then
- return -1,-1
- else
- return 0,0
- end
- end
-end
-otf.helpers=otf.helpers or {}
-otf.helpers.txtdirstate=txtdirstate
-otf.helpers.pardirstate=pardirstate
-do
- local fastdisc=true
- local testdics=false
- directives.register("otf.fastdisc",function(v) fastdisc=v end)
- local otfdataset=nil
- local getfastdisc={ __index=function(t,k)
- local v=usesfont(k,currentfont)
- t[k]=v
- return v
- end }
- local getfastspace={ __index=function(t,k)
- local v=isspace(k,threshold) or false
- t[k]=v
- return v
- end }
- function otf.featuresprocessor(head,font,attr,direction,n)
- local sequences=sequencelists[font]
- nesting=nesting+1
- if nesting==1 then
- currentfont=font
- tfmdata=fontdata[font]
- descriptions=tfmdata.descriptions
- characters=tfmdata.characters
- local resources=tfmdata.resources
- marks=resources.marks
- classes=resources.classes
- threshold,
- factor=getthreshold(font)
- checkmarks=tfmdata.properties.checkmarks
- if not otfdataset then
- otfdataset=otf.dataset
- end
- discs=fastdisc and n and n>1 and setmetatable({},getfastdisc)
- spaces=setmetatable({},getfastspace)
- elseif currentfont~=font then
- report_warning("nested call with a different font, level %s, quitting",nesting)
- nesting=nesting-1
- return head,false
- end
- if trace_steps then
- checkstep(head)
- end
- local initialrl=0
- if getid(head)==localpar_code and start_of_par(head) then
- initialrl=pardirstate(head)
- elseif direction==1 or direction=="TRT" then
- initialrl=-1
- end
- local datasets=otfdataset(tfmdata,font,attr)
- local dirstack={ nil }
- sweephead={}
- for s=1,#datasets do
- local dataset=datasets[s]
- local attribute=dataset[2]
- local sequence=dataset[3]
- local rlparmode=initialrl
- local topstack=0
- local typ=sequence.type
- local gpossing=typ=="gpos_single" or typ=="gpos_pair"
- local forcetestrun=typ=="gsub_ligature"
- local handler=handlers[typ]
- local steps=sequence.steps
- local nofsteps=sequence.nofsteps
- local skiphash=sequence.skiphash
- if not steps then
- local h,ok=handler(head,dataset,sequence,initialrl,font,attr)
- if h and h~=head then
- head=h
- end
- elseif typ=="gsub_reversecontextchain" then
- local start=find_node_tail(head)
- local rlmode=0
- local merged=steps.merged
- while start do
- local char=ischar(start,font)
- if char then
- local m=merged[char]
- if m then
- local a
- if attr then
- a=getglyphdata(start)
- end
- if not a or (a==attr) then
- for i=m[1],m[2] do
- local step=steps[i]
- local lookupcache=step.coverage
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- local ok
- head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
- if ok then
- break
- end
- end
- end
- if start then
- start=getprev(start)
- end
- else
- start=getprev(start)
- end
- else
- start=getprev(start)
- end
- else
- start=getprev(start)
- end
- end
- else
- local start=head
- local rlmode=initialrl
- if nofsteps==1 then
- local step=steps[1]
- local lookupcache=step.coverage
- while start do
- local char,id=ischar(start,font)
- if char then
- if skiphash and skiphash[char] then
- start=getnext(start)
- else
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- local a
- if attr then
- if getglyphdata(start)==attr and (not attribute or getprop(start,a_state)==attribute) then
- a=true
- end
- elseif not attribute or getprop(start,a_state)==attribute then
- a=true
- end
- if a then
- local ok,df
- head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
- if df then
- elseif start then
- start=getnext(start)
- end
- else
- start=getnext(start)
- end
- else
- start=getnext(start)
- end
- end
- elseif char==false or id==glue_code then
- start=getnext(start)
- elseif id==disc_code then
- if not discs or discs[start]==true then
- local ok
- if gpossing then
- start,ok=kernrun(start,k_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler)
- elseif forcetestrun then
- start,ok=testrun(start,t_run_single,c_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler)
- else
- start,ok=comprun(start,c_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler)
- end
- else
- start=getnext(start)
- end
- elseif id==math_code then
- start=getnext(end_of_math(start))
- elseif id==dir_code then
- topstack,rlmode=txtdirstate(start,dirstack,topstack,rlparmode)
- start=getnext(start)
- else
- start=getnext(start)
- end
- end
- else
- local merged=steps.merged
- while start do
- local char,id=ischar(start,font)
- if char then
- if skiphash and skiphash[char] then
- start=getnext(start)
- else
- local m=merged[char]
- if m then
- local a
- if attr then
- if getglyphdata(start)==attr and (not attribute or getprop(start,a_state)==attribute) then
- a=true
- end
- elseif not attribute or getprop(start,a_state)==attribute then
- a=true
- end
- if a then
- local ok,df
- for i=m[1],m[2] do
- local step=steps[i]
- local lookupcache=step.coverage
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
- if df then
- break
- elseif ok then
- break
- elseif not start then
- break
- end
- end
- end
- if df then
- elseif start then
- start=getnext(start)
- end
- else
- start=getnext(start)
- end
- else
- start=getnext(start)
- end
- end
- elseif char==false or id==glue_code then
- start=getnext(start)
- elseif id==disc_code then
- if not discs or discs[start]==true then
- local ok
- if gpossing then
- start,ok=kernrun(start,k_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler)
- elseif forcetestrun then
- start,ok=testrun(start,t_run_multiple,c_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler)
- else
- start,ok=comprun(start,c_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler)
- end
- else
- start=getnext(start)
- end
- elseif id==math_code then
- start=getnext(end_of_math(start))
- elseif id==dir_code then
- topstack,rlmode=txtdirstate(start,dirstack,topstack,rlparmode)
- start=getnext(start)
- else
- start=getnext(start)
- end
- end
- end
- end
- if trace_steps then
- registerstep(head)
- end
- end
- nesting=nesting-1
- return head
- end
- function otf.datasetpositionprocessor(head,font,direction,dataset)
- currentfont=font
- tfmdata=fontdata[font]
- descriptions=tfmdata.descriptions
- characters=tfmdata.characters
- local resources=tfmdata.resources
- marks=resources.marks
- classes=resources.classes
- threshold,
- factor=getthreshold(font)
- checkmarks=tfmdata.properties.checkmarks
- if type(dataset)=="number" then
- dataset=otfdataset(tfmdata,font,0)[dataset]
- end
- local sequence=dataset[3]
- local typ=sequence.type
- local handler=handlers[typ]
- local steps=sequence.steps
- local nofsteps=sequence.nofsteps
- local done=false
- local dirstack={ nil }
- local start=head
- local initialrl=(direction==1 or direction=="TRT") and -1 or 0
- local rlmode=initialrl
- local rlparmode=initialrl
- local topstack=0
- local merged=steps.merged
- local position=0
- while start do
- local char,id=ischar(start,font)
- if char then
- position=position+1
- local m=merged[char]
- if m then
- if skiphash and skiphash[char] then
- start=getnext(start)
- else
- for i=m[1],m[2] do
- local step=steps[i]
- local lookupcache=step.coverage
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- local ok
- head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
- if ok then
- break
- elseif not start then
- break
- end
- end
- end
- if start then
- start=getnext(start)
- end
- end
- else
- start=getnext(start)
- end
- elseif char==false or id==glue_code then
- start=getnext(start)
- elseif id==math_code then
- start=getnext(end_of_math(start))
- elseif id==dir_code then
- topstack,rlmode=txtdirstate(start,dirstack,topstack,rlparmode)
- start=getnext(start)
- else
- start=getnext(start)
- end
- end
- return head
- end
-end
-local plugins={}
-otf.plugins=plugins
-local report=logs.reporter("fonts")
-function otf.registerplugin(name,f)
- if type(name)=="string" and type(f)=="function" then
- plugins[name]={ name,f }
- report()
- report("plugin %a has been loaded, please be aware of possible side effects",name)
- report()
- if logs.pushtarget then
- logs.pushtarget("log")
- end
- report("Plugins are not officially supported unless stated otherwise. This is because")
- report("they bypass the regular font handling and therefore some features in ConTeXt")
- report("(especially those related to fonts) might not work as expected or might not work")
- report("at all. Some plugins are for testing and development only and might change")
- report("whenever we feel the need for it.")
- report()
- if logs.poptarget then
- logs.poptarget()
- end
- end
-end
-function otf.plugininitializer(tfmdata,value)
- if type(value)=="string" then
- tfmdata.shared.plugin=plugins[value]
- end
-end
-function otf.pluginprocessor(head,font,attr,direction)
- local s=fontdata[font].shared
- local p=s and s.plugin
- if p then
- if trace_plugins then
- report_process("applying plugin %a",p[1])
- end
- return p[2](head,font,attr,direction)
- else
- return head,false
- end
-end
-function otf.featuresinitializer(tfmdata,value)
-end
-registerotffeature {
- name="features",
- description="features",
- default=true,
- initializers={
- position=1,
- node=otf.featuresinitializer,
- plug=otf.plugininitializer,
- },
- processors={
- node=otf.featuresprocessor,
- plug=otf.pluginprocessor,
- }
-}
-local function markinitializer(tfmdata,value)
- local properties=tfmdata.properties
- properties.checkmarks=value
-end
-registerotffeature {
- name="checkmarks",
- description="check mark widths",
- default=true,
- initializers={
- node=markinitializer,
- },
-}
-otf.handlers=handlers
-if context then
- return
-else
-end
-local setspacekerns=nodes.injections.setspacekerns if not setspacekerns then os.exit() end
-local tag="kern"
- function handlers.trigger_space_kerns(head,dataset,sequence,initialrl,font,attr)
- local shared=fontdata[font].shared
- local features=shared and shared.features
- local enabled=features and features.spacekern and features[tag]
- if enabled then
- setspacekerns(font,sequence)
- end
- return head,enabled
- end
-local function hasspacekerns(data)
- local resources=data.resources
- local sequences=resources.sequences
- local validgpos=resources.features.gpos
- if validgpos and sequences then
- for i=1,#sequences do
- local sequence=sequences[i]
- local steps=sequence.steps
- if steps and sequence.features[tag] then
- local kind=sequence.type
- if kind=="gpos_pair" or kind=="gpos_single" then
- for i=1,#steps do
- local step=steps[i]
- local coverage=step.coverage
- local rules=step.rules
- if rules then
- elseif not coverage then
- elseif kind=="gpos_single" then
- elseif kind=="gpos_pair" then
- local format=step.format
- if format=="move" or format=="kern" then
- local kerns=coverage[32]
- if kerns then
- return true
- end
- for k,v in next,coverage do
- if v[32] then
- return true
- end
- end
- elseif format=="pair" then
- local kerns=coverage[32]
- if kerns then
- for k,v in next,kerns do
- local one=v[1]
- if one and one~=true then
- return true
- end
- end
- end
- for k,v in next,coverage do
- local kern=v[32]
- if kern then
- local one=kern[1]
- if one and one~=true then
- return true
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- return false
-end
-otf.readers.registerextender {
- name="spacekerns",
- action=function(data)
- data.properties.hasspacekerns=hasspacekerns(data)
- end
-}
-local function spaceinitializer(tfmdata,value)
- local resources=tfmdata.resources
- local spacekerns=resources and resources.spacekerns
- if value and spacekerns==nil then
- local rawdata=tfmdata.shared and tfmdata.shared.rawdata
- local properties=rawdata.properties
- if properties and properties.hasspacekerns then
- local sequences=resources.sequences
- local validgpos=resources.features.gpos
- if validgpos and sequences then
- local left={}
- local right={}
- local last=0
- local feat=nil
- for i=1,#sequences do
- local sequence=sequences[i]
- local steps=sequence.steps
- if steps then
- local kern=sequence.features[tag]
- if kern then
- local kind=sequence.type
- if kind=="gpos_pair" or kind=="gpos_single" then
- if feat then
- for script,languages in next,kern do
- local f=feat[script]
- if f then
- for l in next,languages do
- f[l]=true
- end
- else
- feat[script]=languages
- end
- end
- else
- feat=kern
- end
- for i=1,#steps do
- local step=steps[i]
- local coverage=step.coverage
- local rules=step.rules
- if rules then
- elseif not coverage then
- elseif kind=="gpos_single" then
- elseif kind=="gpos_pair" then
- local format=step.format
- if format=="move" or format=="kern" then
- local kerns=coverage[32]
- if kerns then
- for k,v in next,kerns do
- right[k]=v
- end
- end
- for k,v in next,coverage do
- local kern=v[32]
- if kern then
- left[k]=kern
- end
- end
- elseif format=="pair" then
- local kerns=coverage[32]
- if kerns then
- for k,v in next,kerns do
- local one=v[1]
- if one and one~=true then
- right[k]=one[3]
- end
- end
- end
- for k,v in next,coverage do
- local kern=v[32]
- if kern then
- local one=kern[1]
- if one and one~=true then
- left[k]=one[3]
- end
- end
- end
- end
- end
- end
- last=i
- end
- else
- end
- end
- end
- left=next(left) and left or false
- right=next(right) and right or false
- if left or right then
- spacekerns={
- left=left,
- right=right,
- }
- if last>0 then
- local triggersequence={
- features={ [tag]=feat or { dflt={ dflt=true,} } },
- flags=noflags,
- name="trigger_space_kerns",
- order={ tag },
- type="trigger_space_kerns",
- left=left,
- right=right,
- }
- insert(sequences,last,triggersequence)
- end
- end
- end
- end
- resources.spacekerns=spacekerns
- end
- return spacekerns
-end
-registerotffeature {
- name="spacekern",
- description="space kern injection",
- default=true,
- initializers={
- node=spaceinitializer,
- },
-}
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-ots”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-osd” 39e92f6e575741646d75ea79e3be87f3] ---
-
-if not modules then modules={} end modules ['font-osd']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Kai Eigner, TAT Zetwerk / Hans Hagen, PRAGMA ADE",
- copyright="TAT Zetwerk / PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local insert,imerge,copy,tohash=table.insert,table.imerge,table.copy,table.tohash
-local next,type=next,type
-local report=logs.reporter("otf","devanagari")
-fonts=fonts or {}
-fonts.analyzers=fonts.analyzers or {}
-fonts.analyzers.methods=fonts.analyzers.methods or { node={ otf={} } }
-local otf=fonts.handlers.otf
-local handlers=otf.handlers
-local methods=fonts.analyzers.methods
-local otffeatures=fonts.constructors.features.otf
-local registerotffeature=otffeatures.register
-local nuts=nodes.nuts
-local getnext=nuts.getnext
-local getprev=nuts.getprev
-local getboth=nuts.getboth
-local getid=nuts.getid
-local getchar=nuts.getchar
-local getfont=nuts.getfont
-local getsubtype=nuts.getsubtype
-local setlink=nuts.setlink
-local setnext=nuts.setnext
-local setprev=nuts.setprev
-local setchar=nuts.setchar
-local getprop=nuts.getprop
-local setprop=nuts.setprop
-local ischar=nuts.ischar
-local insert_node_after=nuts.insert_after
-local copy_node=nuts.copy
-local remove_node=nuts.remove
-local flush_list=nuts.flush_list
-local flush_node=nuts.flush_node
-local copyinjection=nodes.injections.copy
-local unsetvalue=attributes.unsetvalue
-local fontdata=fonts.hashes.identifiers
-local a_state=attributes.private('state')
-local a_syllabe=attributes.private('syllabe')
-local dotted_circle=0x25CC
-local c_nbsp=0x00A0
-local c_zwnj=0x200C
-local c_zwj=0x200D
-local states=fonts.analyzers.states
-local s_rphf=states.rphf
-local s_half=states.half
-local s_pref=states.pref
-local s_blwf=states.blwf
-local s_pstf=states.pstf
-local s_init=states.init
-local replace_all_nbsp=nil
-replace_all_nbsp=function(head)
- replace_all_nbsp=typesetters and typesetters.characters and typesetters.characters.replacenbspaces or function(head)
- return head
- end
- return replace_all_nbsp(head)
-end
-local processcharacters=nil
-if context then
- local fontprocesses=fonts.hashes.processes
- function processcharacters(head,font)
- local processors=fontprocesses[font]
- for i=1,#processors do
- head=processors[i](head,font,0)
- end
- return head
- end
-else
- function processcharacters(head,font)
- local processors=fontdata[font].shared.processes
- for i=1,#processors do
- head=processors[i](head,font,0)
- end
- return head
- end
-end
-local indicgroups=characters and characters.indicgroups
-if not indicgroups and characters then
- local indic={
- c={},
- i={},
- d={},
- m={},
- s={},
- o={},
- }
- local indicmarks={
- l={},
- t={},
- b={},
- r={},
- s={},
- }
- local indicclasses={
- nukta={},
- halant={},
- ra={},
- anudatta={},
- }
- local indicorders={
- bp={},
- ap={},
- bs={},
- as={},
- bh={},
- ah={},
- bm={},
- am={},
- }
- for k,v in next,characters.data do
- local i=v.indic
- if i then
- indic[i][k]=true
- i=v.indicmark
- if i then
- if i=="s" then
- local s=v.specials
- indicmarks[i][k]={ s[2],s[3] }
- else
- indicmarks[i][k]=true
- end
- end
- i=v.indicclass
- if i then
- indicclasses[i][k]=true
- end
- i=v.indicorder
- if i then
- indicorders[i][k]=true
- end
- end
- end
- indicgroups={
- consonant=indic.c,
- independent_vowel=indic.i,
- dependent_vowel=indic.d,
- vowel_modifier=indic.m,
- stress_tone_mark=indic.s,
- pre_mark=indicmarks.l,
- above_mark=indicmarks.t,
- below_mark=indicmarks.b,
- post_mark=indicmarks.r,
- twopart_mark=indicmarks.s,
- nukta=indicclasses.nukta,
- halant=indicclasses.halant,
- ra=indicclasses.ra,
- anudatta=indicclasses.anudatta,
- before_postscript=indicorders.bp,
- after_postscript=indicorders.ap,
- before_half=indicorders.bh,
- after_half=indicorders.ah,
- before_subscript=indicorders.bs,
- after_subscript=indicorders.as,
- before_main=indicorders.bm,
- after_main=indicorders.am,
- }
- indic=nil
- indicmarks=nil
- indicclasses=nil
- indicorders=nil
- characters.indicgroups=indicgroups
-end
-local consonant=indicgroups.consonant
-local independent_vowel=indicgroups.independent_vowel
-local dependent_vowel=indicgroups.dependent_vowel
-local vowel_modifier=indicgroups.vowel_modifier
-local stress_tone_mark=indicgroups.stress_tone_mark
-local pre_mark=indicgroups.pre_mark
-local above_mark=indicgroups.above_mark
-local below_mark=indicgroups.below_mark
-local post_mark=indicgroups.post_mark
-local twopart_mark=indicgroups.twopart_mark
-local nukta=indicgroups.nukta
-local halant=indicgroups.halant
-local ra=indicgroups.ra
-local anudatta=indicgroups.anudatta
-local before_postscript=indicgroups.before_postscript
-local after_postscript=indicgroups.after_postscript
-local before_half=indicgroups.before_half
-local after_half=indicgroups.after_half
-local before_subscript=indicgroups.before_subscript
-local after_subscript=indicgroups.after_subscript
-local before_main=indicgroups.before_main
-local after_main=indicgroups.after_main
-local mark_four=table.merged (
- pre_mark,
- above_mark,
- below_mark,
- post_mark
-)
-local mark_above_below_post=table.merged (
- above_mark,
- below_mark,
- post_mark
-)
-local zw_char={
- [c_zwnj]=true,
- [c_zwj ]=true,
-}
-local dflt_true={
- dflt=true,
-}
-local two_defaults={}
-local one_defaults={}
-local false_flags={ false,false,false,false }
-local sequence_reorder_matras={
- features={ dv01=two_defaults },
- flags=false_flags,
- name="dv01_reorder_matras",
- order={ "dv01" },
- type="devanagari_reorder_matras",
- nofsteps=1,
- steps={
- {
- coverage=pre_mark,
- }
- }
-}
-local sequence_reorder_reph={
- features={ dv02=two_defaults },
- flags=false_flags,
- name="dv02_reorder_reph",
- order={ "dv02" },
- type="devanagari_reorder_reph",
- nofsteps=1,
- steps={
- {
- coverage={},
- }
- }
-}
-local sequence_reorder_pre_base_reordering_consonants={
- features={ dv03=one_defaults },
- flags=false_flags,
- name="dv03_reorder_pre_base_reordering_consonants",
- order={ "dv03" },
- type="devanagari_reorder_pre_base_reordering_consonants",
- nofsteps=1,
- steps={
- {
- coverage={},
- }
- }
-}
-local sequence_remove_joiners={
- features={ dv04=one_defaults },
- flags=false_flags,
- name="dv04_remove_joiners",
- order={ "dv04" },
- type="devanagari_remove_joiners",
- nofsteps=1,
- steps={
- {
- coverage=zw_char,
- },
- }
-}
-local basic_shaping_forms={
- akhn=true,
- blwf=true,
- cjct=true,
- half=true,
- nukt=true,
- pref=true,
- pstf=true,
- rkrf=true,
- rphf=true,
- vatu=true,
- locl=true,
-}
-local valid={
- abvs=true,
- akhn=true,
- blwf=true,
- calt=true,
- cjct=true,
- half=true,
- haln=true,
- nukt=true,
- pref=true,
- pres=true,
- pstf=true,
- psts=true,
- rkrf=true,
- rphf=true,
- vatu=true,
- pres=true,
- abvs=true,
- blws=true,
- psts=true,
- haln=true,
- calt=true,
- locl=true,
-}
-local scripts={}
-local scripts_one={ "deva","mlym","beng","gujr","guru","knda","orya","taml","telu" }
-local scripts_two={ "dev2","mlm2","bng2","gjr2","gur2","knd2","ory2","tml2","tel2" }
-local nofscripts=#scripts_one
-for i=1,nofscripts do
- local one=scripts_one[i]
- local two=scripts_two[i]
- scripts[one]=true
- scripts[two]=true
- two_defaults[two]=dflt_true
- one_defaults[one]=dflt_true
- one_defaults[two]=dflt_true
-end
-local function valid_one(s) for i=1,nofscripts do if s[scripts_one[i]] then return true end end end
-local function valid_two(s) for i=1,nofscripts do if s[scripts_two[i]] then return true end end end
-local function initializedevanagi(tfmdata)
- local script,language=otf.scriptandlanguage(tfmdata,attr)
- if scripts[script] then
- local resources=tfmdata.resources
- local devanagari=resources.devanagari
- if not devanagari then
- report("adding devanagari features to font")
- local gsubfeatures=resources.features.gsub
- local sequences=resources.sequences
- local sharedfeatures=tfmdata.shared.features
- gsubfeatures["dv01"]=two_defaults
- gsubfeatures["dv02"]=two_defaults
- gsubfeatures["dv03"]=one_defaults
- gsubfeatures["dv04"]=one_defaults
- local reorder_pre_base_reordering_consonants=copy(sequence_reorder_pre_base_reordering_consonants)
- local reorder_reph=copy(sequence_reorder_reph)
- local reorder_matras=copy(sequence_reorder_matras)
- local remove_joiners=copy(sequence_remove_joiners)
- local lastmatch=0
- for s=1,#sequences do
- local features=sequences[s].features
- if features then
- for k,v in next,features do
- if k=="locl" then
- local steps=sequences[s].steps
- local nofsteps=sequences[s].nofsteps
- for i=1,nofsteps do
- local step=steps[i]
- local coverage=step.coverage
- if coverage then
- for k,v in next,pre_mark do
- local locl=coverage[k]
- if locl then
- if #locl>0 then
- for j=1,#locl do
- local ck=locl[j]
- local f=ck[4]
- local chainlookups=ck[6]
- if chainlookups then
- local chainlookup=chainlookups[f]
- for j=1,#chainlookup do
- local chainstep=chainlookup[j]
- local steps=chainstep.steps
- local nofsteps=chainstep.nofsteps
- for i=1,nofsteps do
- local step=steps[i]
- local coverage=step.coverage
- if coverage then
- locl=coverage[k]
- end
- end
- end
- end
- end
- end
- if locl then
- reorder_matras.steps[1].coverage[locl]=true
- end
- end
- end
- end
- end
- end
- if basic_shaping_forms[k] then
- lastmatch=lastmatch+1
- if s~=lastmatch then
- table.insert(sequences,lastmatch,table.remove(sequences,s))
- end
- end
- end
- end
- end
- local insertindex=lastmatch+1
- if tfmdata.properties.language then
- dflt_true[tfmdata.properties.language]=true
- end
- insert(sequences,insertindex,reorder_pre_base_reordering_consonants)
- insert(sequences,insertindex,reorder_reph)
- insert(sequences,insertindex,reorder_matras)
- insert(sequences,insertindex,remove_joiners)
- local blwfcache={}
- local vatucache={}
- local pstfcache={}
- local seqsubset={}
- local rephstep={
- coverage={}
- }
- local devanagari={
- reph=false,
- vattu=false,
- blwfcache=blwfcache,
- vatucache=vatucache,
- pstfcache=pstfcache,
- seqsubset=seqsubset,
- reorderreph=rephstep,
- }
- reorder_reph.steps={ rephstep }
- local pre_base_reordering_consonants={}
- reorder_pre_base_reordering_consonants.steps[1].coverage=pre_base_reordering_consonants
- resources.devanagari=devanagari
- for s=1,#sequences do
- local sequence=sequences[s]
- local steps=sequence.steps
- local nofsteps=sequence.nofsteps
- local features=sequence.features
- local has_rphf=features.rphf
- local has_blwf=features.blwf
- local has_vatu=features.vatu
- local has_pstf=features.pstf
- if has_rphf and has_rphf[script] then
- devanagari.reph=true
- elseif (has_blwf and has_blwf[script] ) or (has_vatu and has_vatu[script] ) then
- devanagari.vattu=true
- for i=1,nofsteps do
- local step=steps[i]
- local coverage=step.coverage
- if coverage then
- for k,v in next,coverage do
- for h,w in next,halant do
- if v[h] then
- if not blwfcache[k] then
- blwfcache[k]=v
- end
- end
- if has_vatu and has_vatu[script] and not vatucache[k] then
- vatucache[k]=v
- end
- end
- end
- end
- end
- elseif has_pstf and has_pstf[script] then
- for i=1,nofsteps do
- local step=steps[i]
- local coverage=step.coverage
- if coverage then
- for k,v in next,coverage do
- if not pstfcache[k] then
- pstfcache[k]=v
- end
- end
- for k,v in next,ra do
- local r=coverage[k]
- if r then
- local found=false
- if #r>0 then
- for j=1,#r do
- local ck=r[j]
- local f=ck[4]
- local chainlookups=ck[6]
- if chainlookups and chainlookups[f] then
- local chainlookup=chainlookups[f]
- for j=1,#chainlookup do
- local chainstep=chainlookup[j]
- local steps=chainstep.steps
- local nofsteps=chainstep.nofsteps
- for i=1,nofsteps do
- local step=steps[i]
- local coverage=step.coverage
- if coverage then
- local h=coverage[k]
- if h then
- for k,v in next,h do
- found=v and v.ligature
- if found then
- pre_base_reordering_consonants[found]=true
- break
- end
- end
- if found then
- break
- end
- end
- end
- end
- end
- end
- end
- else
- for k,v in next,r do
- found=v and v.ligature
- if found then
- pre_base_reordering_consonants[found]=true
- break
- end
- end
- end
- if found then
- break
- end
- end
- end
- end
- end
- end
- for kind,spec in next,features do
- if valid[kind] and valid_two(spec)then
- for i=1,nofsteps do
- local step=steps[i]
- local coverage=step.coverage
- if coverage then
- local reph,rephbase=false,false
- if kind=="rphf" then
- for k,v in next,ra do
- local r=coverage[k]
- if r then
- rephbase=k
- local h=false
- if #r>0 then
- for j=1,#r do
- local ck=r[j]
- local f=ck[4]
- local chainlookups=ck[6]
- if chainlookups then
- local chainlookup=chainlookups[f]
- for j=1,#chainlookup do
- local chainstep=chainlookup[j]
- local steps=chainstep.steps
- local nofsteps=chainstep.nofsteps
- for i=1,nofsteps do
- local step=steps[i]
- local coverage=step.coverage
- if coverage then
- local r=coverage[k]
- if r then
- for k,v in next,halant do
- local h=r[k]
- if h then
- reph=h.ligature or false
- break
- end
- end
- if h then
- break
- end
- end
- end
- end
- end
- end
- end
- else
- for k,v in next,halant do
- local h=r[k]
- if h then
- reph=h.ligature or false
- break
- end
- end
- end
- if reph then
- break
- end
- end
- end
- end
- seqsubset[#seqsubset+1]={ kind,coverage,reph,rephbase }
- end
- end
- end
- if kind=="pref" then
- local steps=sequence.steps
- local nofsteps=sequence.nofsteps
- for i=1,nofsteps do
- local step=steps[i]
- local coverage=step.coverage
- if coverage then
- for k,v in next,halant do
- local h=coverage[k]
- if h then
- local found=false
- if #h>0 then
- for j=1,#h do
- local ck=h[j]
- local f=ck[4]
- local chainlookups=ck[6]
- if chainlookups then
- local chainlookup=chainlookups[f]
- for j=1,#chainlookup do
- local chainstep=chainlookup[j]
- local steps=chainstep.steps
- local nofsteps=chainstep.nofsteps
- for i=1,nofsteps do
- local step=steps[i]
- local coverage=step.coverage
- if coverage then
- local h=coverage[k]
- if h then
- for k,v in next,h do
- found=v and v.ligature
- if found then
- pre_base_reordering_consonants[found]=true
- break
- end
- end
- if found then
- break
- end
- end
- end
- end
- end
- end
- end
- else
- for k,v in next,h do
- found=v and v.ligature
- if found then
- pre_base_reordering_consonants[found]=true
- break
- end
- end
- end
- if found then
- break
- end
- end
- end
- end
- end
- end
- end
- end
- if two_defaults[script] then
- sharedfeatures["dv01"]=true
- sharedfeatures["dv02"]=true
- sharedfeatures["dv03"]=true
- sharedfeatures["dv04"]=true
- elseif one_defaults[script] then
- sharedfeatures["dv03"]=true
- sharedfeatures["dv04"]=true
- end
- if script=="mlym" or script=="taml" then
- devanagari.left_matra_before_base=true
- end
- end
- end
-end
-registerotffeature {
- name="devanagari",
- description="inject additional features",
- default=true,
- initializers={
- node=initializedevanagi,
- },
-}
-local show_syntax_errors=false
-local function inject_syntax_error(head,current,char)
- local signal=copy_node(current)
- copyinjection(signal,current)
- if pre_mark[char] then
- setchar(signal,dotted_circle)
- else
- setchar(current,dotted_circle)
- end
- return insert_node_after(head,current,signal)
-end
-local function initialize_one(font,attr)
- local tfmdata=fontdata[font]
- local datasets=otf.dataset(tfmdata,font,attr)
- local devanagaridata=datasets.devanagari
- if not devanagaridata then
- devanagaridata={
- reph=false,
- vattu=false,
- blwfcache={},
- vatucache={},
- pstfcache={},
- }
- datasets.devanagari=devanagaridata
- local resources=tfmdata.resources
- local devanagari=resources.devanagari
- for s=1,#datasets do
- local dataset=datasets[s]
- if dataset and dataset[1] then
- local kind=dataset[4]
- if kind=="rphf" then
- devanagaridata.reph=true
- elseif kind=="blwf" or kind=="vatu" then
- devanagaridata.vattu=true
- devanagaridata.blwfcache=devanagari.blwfcache
- devanagaridata.vatucache=devanagari.vatucache
- devanagaridata.pstfcache=devanagari.pstfcache
- end
- end
- end
- end
- return devanagaridata.reph,devanagaridata.vattu,devanagaridata.blwfcache,devanagaridata.vatucache,devanagaridata.pstfcache
-end
-local function contextchain(contexts,n)
- local char=getchar(n)
- for k=1,#contexts do
- local ck=contexts[k]
- local seq=ck[3]
- local f=ck[4]
- local l=ck[5]
- if (l-f)==1 and seq[f+1][char] then
- local ok=true
- local c=n
- for i=l+1,#seq do
- c=getnext(c)
- if not c or not seq[i][ischar(c)] then
- ok=false
- break
- end
- end
- if ok then
- c=getprev(n)
- for i=1,f-1 do
- c=getprev(c)
- if not c or not seq[f-i][ischar(c)] then
- ok=false
- end
- end
- end
- if ok then
- return true
- end
- end
- end
- return false
-end
-local function order_matras(c)
- local cn=getnext(c)
- local char=getchar(cn)
- while dependent_vowel[char] do
- local next=getnext(cn)
- local cc=c
- local cchar=getchar(cc)
- while cc~=cn do
- if (above_mark[char] and (below_mark[cchar] or post_mark[cchar])) or (below_mark[char] and (post_mark[cchar])) then
- local prev,next=getboth(cn)
- if next then
- setprev(next,prev)
- end
- setnext(prev,next)
- setnext(getprev(cc),cn)
- setprev(cn,getprev(cc))
- setnext(cn,cc)
- setprev(cc,cn)
- break
- end
- cc=getnext(cc)
- cchar=getchar(cc)
- end
- cn=next
- char=getchar(cn)
- end
-end
-local function reorder_one(head,start,stop,font,attr,nbspaces)
- local reph,vattu,blwfcache,vatucache,pstfcache=initialize_one(font,attr)
- local devanagari=fontdata[font].resources.devanagari
- local current=start
- local n=getnext(start)
- local base=nil
- local firstcons=nil
- local lastcons=nil
- local basefound=false
- if reph and ra[getchar(start)] and halant[getchar(n)] then
- if n==stop then
- return head,stop,nbspaces
- end
- if getchar(getnext(n))==c_zwj then
- current=start
- else
- current=getnext(n)
- setprop(start,a_state,s_rphf)
- end
- end
- if getchar(current)==c_nbsp then
- if current==stop then
- stop=getprev(stop)
- head=remove_node(head,current)
- flush_node(current)
- return head,stop,nbspaces
- else
- nbspaces=nbspaces+1
- base=current
- firstcons=current
- lastcons=current
- current=getnext(current)
- if current~=stop then
- local char=getchar(current)
- if nukta[char] then
- current=getnext(current)
- char=getchar(current)
- end
- if char==c_zwj and current~=stop then
- local next=getnext(current)
- if next~=stop and halant[getchar(next)] then
- current=next
- next=getnext(current)
- local tmp=next and getnext(next) or nil
- local changestop=next==stop
- local tempcurrent=copy_node(next)
- copyinjection(tempcurrent,next)
- local nextcurrent=copy_node(current)
- copyinjection(nextcurrent,current)
- setlink(tempcurrent,nextcurrent)
- setprop(tempcurrent,a_state,s_blwf)
- tempcurrent=processcharacters(tempcurrent,font)
- setprop(tempcurrent,a_state,unsetvalue)
- if getchar(next)==getchar(tempcurrent) then
- flush_list(tempcurrent)
- if show_syntax_errors then
- head,current=inject_syntax_error(head,current,char)
- end
- else
- setchar(current,getchar(tempcurrent))
- local freenode=getnext(current)
- setlink(current,tmp)
- flush_node(freenode)
- flush_list(tempcurrent)
- if changestop then
- stop=current
- end
- end
- end
- end
- end
- end
- end
- while not basefound do
- local char=getchar(current)
- if consonant[char] then
- setprop(current,a_state,s_half)
- if not firstcons then
- firstcons=current
- end
- lastcons=current
- if not base then
- base=current
- elseif blwfcache[char] then
- setprop(current,a_state,s_blwf)
- elseif pstfcache[char] then
- setprop(current,a_state,s_pstf)
- else
- base=current
- end
- end
- basefound=current==stop
- current=getnext(current)
- end
- if base~=lastcons then
- local np=base
- local n=getnext(base)
- local ch=getchar(n)
- if nukta[ch] then
- np=n
- n=getnext(n)
- ch=getchar(n)
- end
- if halant[ch] then
- if lastcons~=stop then
- local ln=getnext(lastcons)
- if nukta[getchar(ln)] then
- lastcons=ln
- end
- end
- local nn=getnext(n)
- local ln=getnext(lastcons)
- setlink(np,nn)
- setnext(lastcons,n)
- if ln then
- setprev(ln,n)
- end
- setnext(n,ln)
- setprev(n,lastcons)
- if lastcons==stop then
- stop=n
- end
- end
- end
- n=getnext(start)
- if n~=stop and ra[getchar(start)] and halant[getchar(n)] and not zw_char[getchar(getnext(n))] then
- local matra=base
- if base~=stop then
- local next=getnext(base)
- if dependent_vowel[getchar(next)] then
- matra=next
- end
- end
- local sp=getprev(start)
- local nn=getnext(n)
- local mn=getnext(matra)
- setlink(sp,nn)
- setlink(matra,start)
- setlink(n,mn)
- if head==start then
- head=nn
- end
- start=nn
- if matra==stop then
- stop=n
- end
- end
- local current=start
- while current~=stop do
- local next=getnext(current)
- if next~=stop and halant[getchar(next)] and getchar(getnext(next))==c_zwnj then
- setprop(current,a_state,unsetvalue)
- end
- current=next
- end
- if base~=stop and getprop(base,a_state) then
- local next=getnext(base)
- if halant[getchar(next)] and not (next~=stop and getchar(getnext(next))==c_zwj) then
- setprop(base,a_state,unsetvalue)
- end
- end
- local current,allreordered,moved=start,false,{ [base]=true }
- local a,b,p,bn=base,base,base,getnext(base)
- if base~=stop and nukta[getchar(bn)] then
- a,b,p=bn,bn,bn
- end
- while not allreordered do
- local c=current
- local n=getnext(current)
- local l=nil
- if c~=stop then
- local ch=getchar(n)
- if nukta[ch] then
- c=n
- n=getnext(n)
- ch=getchar(n)
- end
- if c~=stop then
- if halant[ch] then
- c=n
- n=getnext(n)
- ch=getchar(n)
- end
- local tpm=twopart_mark[ch]
- while tpm do
- local extra=copy_node(n)
- copyinjection(extra,n)
- ch=tpm[1]
- setchar(n,ch)
- setchar(extra,tpm[2])
- head=insert_node_after(head,current,extra)
- tpm=twopart_mark[ch]
- end
- while c~=stop and dependent_vowel[ch] do
- c=n
- n=getnext(n)
- ch=getchar(n)
- end
- if c~=stop then
- if vowel_modifier[ch] then
- c=n
- n=getnext(n)
- ch=getchar(n)
- end
- if c~=stop and stress_tone_mark[ch] then
- c=n
- n=getnext(n)
- end
- end
- end
- end
- local bp=getprev(firstcons)
- local cn=getnext(current)
- local last=getnext(c)
- while cn~=last do
- if pre_mark[getchar(cn)] then
- if devanagari.left_matra_before_base then
- local prev,next=getboth(cn)
- setlink(prev,next)
- if cn==stop then
- stop=getprev(cn)
- end
- if base==start then
- if head==start then
- head=cn
- end
- start=cn
- end
- setlink(getprev(base),cn)
- setlink(cn,base)
- cn=next
- else
- if bp then
- setnext(bp,cn)
- end
- local prev,next=getboth(cn)
- if next then
- setprev(next,prev)
- end
- setnext(prev,next)
- if cn==stop then
- stop=prev
- end
- setprev(cn,bp)
- setlink(cn,firstcons)
- if firstcons==start then
- if head==start then
- head=cn
- end
- start=cn
- end
- cn=next
- end
- elseif current~=base and dependent_vowel[getchar(cn)] then
- local prev,next=getboth(cn)
- if next then
- setprev(next,prev)
- end
- setnext(prev,next)
- if cn==stop then
- stop=prev
- end
- setlink(b,cn,getnext(b))
- order_matras(cn)
- cn=next
- elseif current==base and dependent_vowel[getchar(cn)] then
- local cnn=getnext(cn)
- order_matras(cn)
- cn=cnn
- while cn~=last and dependent_vowel[getchar(cn)] do
- cn=getnext(cn)
- end
- else
- cn=getnext(cn)
- end
- end
- allreordered=c==stop
- current=getnext(c)
- end
- if reph or vattu then
- local current,cns=start,nil
- while current~=stop do
- local c=current
- local n=getnext(current)
- if ra[getchar(current)] and halant[getchar(n)] then
- c=n
- n=getnext(n)
- local b,bn=base,base
- while bn~=stop do
- local next=getnext(bn)
- if dependent_vowel[getchar(next)] then
- b=next
- end
- bn=next
- end
- if getprop(current,a_state)==s_rphf then
- if b~=current then
- if current==start then
- if head==start then
- head=n
- end
- start=n
- end
- if b==stop then
- stop=c
- end
- local prev=getprev(current)
- setlink(prev,n)
- local next=getnext(b)
- setlink(c,next)
- setlink(b,current)
- end
- elseif cns and getnext(cns)~=current then
- local cp=getprev(current)
- local cnsn=getnext(cns)
- setlink(cp,n)
- setlink(cns,current)
- setlink(c,cnsn)
- if c==stop then
- stop=cp
- break
- end
- current=getprev(n)
- end
- else
- local char=getchar(current)
- if consonant[char] then
- cns=current
- local next=getnext(cns)
- if halant[getchar(next)] then
- cns=next
- end
- if not vatucache[char] then
- next=getnext(cns)
- while dependent_vowel[getchar(next)] do
- cns=next
- next=getnext(cns)
- end
- end
- elseif char==c_nbsp then
- nbspaces=nbspaces+1
- cns=current
- local next=getnext(cns)
- if halant[getchar(next)] then
- cns=next
- end
- if not vatucache[char] then
- next=getnext(cns)
- while dependent_vowel[getchar(next)] do
- cns=next
- next=getnext(cns)
- end
- end
- end
- end
- current=getnext(current)
- end
- end
- if getchar(base)==c_nbsp then
- nbspaces=nbspaces-1
- if base==stop then
- stop=getprev(stop)
- end
- head=remove_node(head,base)
- flush_node(base)
- end
- return head,stop,nbspaces
-end
-function handlers.devanagari_reorder_matras(head,start)
- local current=start
- local startfont=getfont(start)
- local startattr=getprop(start,a_syllabe)
- while current do
- local char=ischar(current,startfont)
- local next=getnext(current)
- if char and getprop(current,a_syllabe)==startattr then
- if halant[char] then
- if next then
- local char=ischar(next,startfont)
- if char and zw_char[char] and getprop(next,a_syllabe)==startattr then
- current=next
- next=getnext(current)
- end
- end
- local startnext=getnext(start)
- head=remove_node(head,start)
- setlink(start,next)
- setlink(current,start)
- start=startnext
- break
- end
- else
- break
- end
- current=next
- end
- return head,start,true
-end
-local rephbase={}
-function handlers.devanagari_reorder_reph(head,start)
- local current=getnext(start)
- local startnext=nil
- local startprev=nil
- local startfont=getfont(start)
- local startattr=getprop(start,a_syllabe)
- ::step_1::
- local char=ischar(start,startfont)
- local rephbase=rephbase[startfont][char]
- if char and after_subscript[rephbase] then
- goto step_5
- end
- ::step_2::
- if char and not after_postscript[rephbase] then
- while current do
- local char=ischar(current,startfont)
- if char and getprop(current,a_syllabe)==startattr then
- if halant[char] then
- local next=getnext(current)
- if next then
- local nextchar=ischar(next,startfont)
- if nextchar and zw_char[nextchar] and getprop(next,a_syllabe)==startattr then
- current=next
- next=getnext(current)
- end
- end
- startnext=getnext(start)
- head=remove_node(head,start)
- setlink(start,next)
- setlink(current,start)
- start=startnext
- startattr=getprop(start,a_syllabe)
- break
- end
- current=getnext(current)
- else
- break
- end
- end
- end
- ::step_3::
- if not startnext then
- if char and after_main[rephbase] then
- current=getnext(start)
- while current do
- local char=ischar(current,startfont)
- if char and getprop(current,a_syllabe)==startattr then
- if consonant[char] and not getprop(current,a_state)==s_pref then
- startnext=getnext(start)
- head=remove_node(head,start)
- setlink(current,start)
- setlink(start,getnext(current))
- start=startnext
- startattr=getprop(start,a_syllabe)
- break
- end
- current=getnext(current)
- else
- break
- end
- end
- end
- end
- ::step_4::
- if not startnext then
- if char and before_postscript[rephbase] then
- current=getnext(start)
- local c=nil
- while current do
- local char=ischar(current,startfont)
- if char and getprop(current,a_syllabe)==startattr then
- if getprop(current,a_state)==s_pstf then
- startnext=getnext(start)
- head=remove_node(head,start)
- setlink(getprev(current),start)
- setlink(start,current)
- start=startnext
- startattr=getprop(start,a_syllabe)
- break
- elseif not c and (vowel_modifier[char] or stress_tone_mark[char] ) then
- c=current
- end
- current=getnext(current)
- else
- if c then
- startnext=getnext(start)
- head=remove_node(head,start)
- setlink(getprev(c),start)
- setlink(start,c)
- start=startnext
- startattr=getprop(start,a_syllabe)
- end
- break
- end
- end
- end
- end
- ::step_5::
- if not startnext then
- current=getnext(start)
- local c=nil
- while current do
- local char=ischar(current,startfont)
- if char and getprop(current,a_syllabe)==startattr then
- local state=getprop(current,a_state)
- if before_subscript[rephbase] and (state==s_blwf or state==s_pstf) then
- c=current
- elseif after_subscript[rephbase] and (state==s_pstf) then
- c=current
- end
- current=getnext(current)
- else
- break
- end
- end
- if c then
- startnext=getnext(start)
- head=remove_node(head,start)
- setlink(getprev(c),start)
- setlink(start,c)
- start=startnext
- startattr=getprop(start,a_syllabe)
- end
- end
- ::step_6::
- if not startnext then
- current=start
- local next=getnext(current)
- while next do
- local nextchar=ischar(next,startfont)
- if nextchar and getprop(next,a_syllabe)==startattr then
- current=next
- next=getnext(current)
- else
- break
- end
- end
- if start~=current then
- startnext=getnext(start)
- head=remove_node(head,start)
- setlink(start,getnext(current))
- setlink(current,start)
- start=startnext
- end
- end
- return head,start,true
-end
-local reordered_pre_base_reordering_consonants={}
-function handlers.devanagari_reorder_pre_base_reordering_consonants(head,start)
- if reordered_pre_base_reordering_consonants[start] then
- return head,start,true
- end
- local current=start
- local startfont=getfont(start)
- local startattr=getprop(start,a_syllabe)
- while current do
- local char=ischar(current,startfont)
- local next=getnext(current)
- if char and getprop(current,a_syllabe)==startattr then
- if halant[char] then
- if next then
- local char=ischar(next,startfont)
- if char and zw_char[char] and getprop(next,a_syllabe)==startattr then
- current=next
- next=getnext(current)
- end
- end
- local startnext=getnext(start)
- head=remove_node(head,start)
- setlink(start,next)
- setlink(current,start)
- reordered_pre_base_reordering_consonants[start]=true
- start=startnext
- return head,start,true
- end
- else
- break
- end
- current=next
- end
- local startattr=getprop(start,a_syllabe)
- local current=getprev(start)
- while current and getprop(current,a_syllabe)==startattr do
- local char=ischar(current)
- if (not dependent_vowel[char] and not getprop(current,a_state) or getprop(current,a_state)==s_init) then
- startnext=getnext(start)
- head=remove_node(head,start)
- if current==head then
- setlink(start,current)
- head=start
- else
- setlink(getprev(current),start)
- setlink(start,current)
- end
- reordered_pre_base_reordering_consonants[start]=true
- start=startnext
- break
- end
- current=getprev(current)
- end
- return head,start,true
-end
-function handlers.devanagari_remove_joiners(head,start,kind,lookupname,replacement)
- local stop=getnext(start)
- local font=getfont(start)
- local last=start
- while stop do
- local char=ischar(stop,font)
- if char and (char==c_zwnj or char==c_zwj) then
- last=stop
- stop=getnext(stop)
- else
- break
- end
- end
- local prev=getprev(start)
- if stop then
- setnext(last)
- setlink(prev,stop)
- elseif prev then
- setnext(prev)
- end
- if head==start then
- head=stop
- end
- flush_list(start)
- return head,stop,true
-end
-local function initialize_two(font,attr)
- local devanagari=fontdata[font].resources.devanagari
- if devanagari then
- return devanagari.seqsubset or {},devanagari.reorderreph or {}
- else
- return {},{}
- end
-end
-local function reorder_two(head,start,stop,font,attr,nbspaces)
- local seqsubset,reorderreph=initialize_two(font,attr)
- local halfpos=nil
- local basepos=nil
- local subpos=nil
- local postpos=nil
- reorderreph.coverage={}
- rephbase[font]={}
- for i=1,#seqsubset do
- local subset=seqsubset[i]
- local kind=subset[1]
- local lookupcache=subset[2]
- if kind=="rphf" then
- reorderreph.coverage[subset[3]]=true
- rephbase[font][subset[3]]=subset[4]
- local current=start
- local last=getnext(stop)
- while current~=last do
- if current~=stop then
- local c=getchar(current)
- local found=lookupcache[c]
- if found then
- local next=getnext(current)
- if found[getchar(next)] or contextchain(found,next) then
- local afternext=next~=stop and getnext(next)
- if afternext and zw_char[getchar(afternext)] then
- current=afternext
- elseif current==start then
- setprop(current,a_state,s_rphf)
- current=next
- else
- current=next
- end
- end
- end
- end
- current=getnext(current)
- end
- elseif kind=="pref" then
- local current=start
- local last=getnext(stop)
- while current~=last do
- if current~=stop then
- local c=getchar(current)
- local found=lookupcache[c]
- if found then
- local next=getnext(current)
- if found[getchar(next)] or contextchain(found,next) then
- if (not getprop(current,a_state) and not getprop(next,a_state)) then
- setprop(current,a_state,s_pref)
- setprop(next,a_state,s_pref)
- current=next
- end
- end
- end
- end
- current=getnext(current)
- end
- elseif kind=="half" then
- local current=start
- local last=getnext(stop)
- while current~=last do
- if current~=stop then
- local c=getchar(current)
- local found=lookupcache[c]
- if found then
- local next=getnext(current)
- if found[getchar(next)] or contextchain(found,next) then
- if next~=stop and getchar(getnext(next))==c_zwnj then
- current=next
- elseif (not getprop(current,a_state)) then
- setprop(current,a_state,s_half)
- if not halfpos then
- halfpos=current
- end
- end
- current=getnext(current)
- end
- end
- end
- current=getnext(current)
- end
- elseif kind=="blwf" or kind=="vatu" then
- local current=start
- local last=getnext(stop)
- while current~=last do
- if current~=stop then
- local c=getchar(current)
- local found=lookupcache[c]
- if found then
- local next=getnext(current)
- if found[getchar(next)] or contextchain(found,next) then
- if (not getprop(current,a_state) and not getprop(next,a_state)) then
- setprop(current,a_state,s_blwf)
- setprop(next,a_state,s_blwf)
- current=next
- subpos=current
- end
- end
- end
- end
- current=getnext(current)
- end
- elseif kind=="pstf" then
- local current=start
- local last=getnext(stop)
- while current~=last do
- if current~=stop then
- local c=getchar(current)
- local found=lookupcache[c]
- if found then
- local next=getnext(current)
- if found[getchar(next)] or contextchain(found,next) then
- if (not getprop(current,a_state) and not getprop(next,a_state)) then
- setprop(current,a_state,s_pstf)
- setprop(next,a_state,s_pstf)
- current=next
- postpos=current
- end
- end
- end
- end
- current=getnext(current)
- end
- end
- end
- local current,base,firstcons=start,nil,nil
- if getprop(start,a_state)==s_rphf then
- current=getnext(getnext(start))
- end
- if current~=getnext(stop) and getchar(current)==c_nbsp then
- if current==stop then
- stop=getprev(stop)
- head=remove_node(head,current)
- flush_node(current)
- return head,stop,nbspaces
- else
- nbspaces=nbspaces+1
- base=current
- current=getnext(current)
- if current~=stop then
- local char=getchar(current)
- if nukta[char] then
- current=getnext(current)
- char=getchar(current)
- end
- if char==c_zwj then
- local next=getnext(current)
- if current~=stop and next~=stop and halant[getchar(next)] then
- current=next
- next=getnext(current)
- local tmp=getnext(next)
- local changestop=next==stop
- setnext(next)
- setprop(current,a_state,s_pref)
- current=processcharacters(current,font)
- setprop(current,a_state,s_blwf)
- current=processcharacters(current,font)
- setprop(current,a_state,s_pstf)
- current=processcharacters(current,font)
- setprop(current,a_state,unsetvalue)
- if halant[getchar(current)] then
- setnext(getnext(current),tmp)
- if show_syntax_errors then
- head,current=inject_syntax_error(head,current,char)
- end
- else
- setnext(current,tmp)
- if changestop then
- stop=current
- end
- end
- end
- end
- end
- end
- else
- local last=getnext(stop)
- while current~=last do
- local next=getnext(current)
- if consonant[getchar(current)] then
- if not (current~=stop and next~=stop and halant[getchar(next)] and getchar(getnext(next))==c_zwj) then
- if not firstcons then
- firstcons=current
- end
- local a=getprop(current,a_state)
- if not (a==s_blwf or a==s_pstf or (a~=s_rphf and a~=s_blwf and ra[getchar(current)])) then
- base=current
- end
- end
- end
- current=next
- end
- if not base then
- base=firstcons
- end
- end
- if not base then
- if getprop(start,a_state)==s_rphf then
- setprop(start,a_state,unsetvalue)
- end
- return head,stop,nbspaces
- else
- if getprop(base,a_state) then
- setprop(base,a_state,unsetvalue)
- end
- basepos=base
- end
- if not halfpos then
- halfpos=base
- end
- if not subpos then
- subpos=base
- end
- if not postpos then
- postpos=subpos or base
- end
- local moved={}
- local current=start
- local last=getnext(stop)
- while current~=last do
- local char=getchar(current)
- local target=nil
- local cn=getnext(current)
- local tpm=twopart_mark[char]
- while tpm do
- local extra=copy_node(current)
- copyinjection(extra,current)
- char=tpm[1]
- setchar(current,char)
- setchar(extra,tpm[2])
- head=insert_node_after(head,current,extra)
- tpm=twopart_mark[char]
- end
- if not moved[current] and dependent_vowel[char] then
- if pre_mark[char] then
- moved[current]=true
- local prev,next=getboth(current)
- setlink(prev,next)
- if current==stop then
- stop=getprev(current)
- end
- local pos
- if before_main[char] then
- pos=basepos
- else
- pos=halfpos
- end
- local ppos=getprev(pos)
- while ppos and getprop(ppos,a_syllabe)==getprop(pos,a_syllabe) do
- if getprop(ppos,a_state)==s_pref then
- pos=ppos
- end
- ppos=getprev(ppos)
- end
- local ppos=getprev(pos)
- while ppos and getprop(ppos,a_syllabe)==getprop(pos,a_syllabe) and halant[ischar(ppos)] do
- ppos=getprev(ppos)
- if ppos and getprop(ppos,a_syllabe)==getprop(pos,a_syllabe) and consonant[ischar(ppos)] then
- pos=ppos
- ppos=getprev(ppos)
- else
- break
- end
- end
- if pos==start then
- if head==start then
- head=current
- end
- start=current
- end
- setlink(getprev(pos),current)
- setlink(current,pos)
- elseif above_mark[char] then
- target=basepos
- if subpos==basepos then
- subpos=current
- end
- if postpos==basepos then
- postpos=current
- end
- basepos=current
- elseif below_mark[char] then
- target=subpos
- if postpos==subpos then
- postpos=current
- end
- subpos=current
- elseif post_mark[char] then
- local n=getnext(postpos)
- while n do
- local v=ischar(n,font)
- if nukta[v] or stress_tone_mark[v] or vowel_modifier[v] then
- postpos=n
- else
- break
- end
- n=getnext(n)
- end
- target=postpos
- postpos=current
- end
- if mark_above_below_post[char] then
- local prev=getprev(current)
- if prev~=target then
- local next=getnext(current)
- setlink(prev,next)
- if current==stop then
- stop=prev
- end
- setlink(current,getnext(target))
- setlink(target,current)
- end
- end
- end
- current=cn
- end
- local current=getnext(start)
- local last=getnext(stop)
- while current~=last do
- local char=getchar(current)
- local cn=getnext(current)
- if halant[char] and ra[ischar(cn)] and getprop(cn,a_state)~=s_rphf and getprop(cn,a_state)~=s_blwf then
- if after_main[ischar(cn)] then
- local prev=getprev(current)
- local next=getnext(cn)
- local bpn=getnext(basepos)
- while bpn and dependent_vowel[ischar(bpn)] do
- basepos=bpn
- bpn=getnext(bpn)
- end
- if basepos~=prev then
- setlink(prev,next)
- setlink(cn,getnext(basepos))
- setlink(basepos,current)
- if cn==stop then
- stop=prev
- end
- cn=next
- end
- end
- end
- current=cn
- end
- local current=start
- local c=nil
- while current~=stop do
- local char=getchar(current)
- if halant[char] or stress_tone_mark[char] then
- if not c then
- c=current
- end
- else
- c=nil
- end
- local next=getnext(current)
- if c and nukta[getchar(next)] then
- if head==c then
- head=next
- end
- if stop==next then
- stop=current
- end
- setlink(getprev(c),next)
- local nextnext=getnext(next)
- setnext(current,nextnext)
- local nextnextnext=getnext(nextnext)
- if nextnextnext then
- setprev(nextnextnext,current)
- end
- setlink(nextnext,c)
- end
- if stop==current then break end
- current=getnext(current)
- end
- if getchar(base)==c_nbsp then
- if base==stop then
- stop=getprev(stop)
- end
- nbspaces=nbspaces-1
- head=remove_node(head,base)
- flush_node(base)
- end
- return head,stop,nbspaces
-end
-local separator={}
-imerge(separator,consonant)
-imerge(separator,independent_vowel)
-imerge(separator,dependent_vowel)
-imerge(separator,vowel_modifier)
-imerge(separator,stress_tone_mark)
-for k,v in next,nukta do separator[k]=true end
-for k,v in next,halant do separator[k]=true end
-local function analyze_next_chars_one(c,font,variant)
- local n=getnext(c)
- if not n then
- return c
- end
- if variant==1 then
- local v=ischar(n,font)
- if v and nukta[v] then
- n=getnext(n)
- if n then
- v=ischar(n,font)
- end
- end
- if n and v then
- local nn=getnext(n)
- if nn then
- local vv=ischar(nn,font)
- if vv then
- local nnn=getnext(nn)
- if nnn then
- local vvv=ischar(nnn,font)
- if vvv then
- if vv==c_zwj and consonant[vvv] then
- c=nnn
- elseif (vv==c_zwnj or vv==c_zwj) and halant[vvv] then
- local nnnn=getnext(nnn)
- if nnnn then
- local vvvv=ischar(nnnn,font)
- if vvvv and consonant[vvvv] then
- c=nnnn
- end
- end
- end
- end
- end
- end
- end
- end
- elseif variant==2 then
- local v=ischar(n,font)
- if v and nukta[v] then
- c=n
- end
- n=getnext(c)
- if n then
- v=ischar(n,font)
- if v then
- local nn=getnext(n)
- if nn then
- local vv=ischar(nn,font)
- if vv and zw_char[v] then
- n=nn
- v=vv
- nn=getnext(nn)
- vv=nn and ischar(nn,font)
- end
- if vv and halant[v] and consonant[vv] then
- c=nn
- end
- end
- end
- end
- end
- local n=getnext(c)
- if not n then
- return c
- end
- local v=ischar(n,font)
- if not v then
- return c
- end
- local already_pre_mark
- local already_above_mark
- local already_below_mark
- local already_post_mark
- while dependent_vowel[v] do
- local vowels=twopart_mark[v] or { v }
- for k,v in next,vowels do
- if pre_mark[v] and not already_pre_mark then
- already_pre_mark=true
- elseif above_mark[v] and not already_above_mark then
- already_above_mark=true
- elseif below_mark[v] and not already_below_mark then
- already_below_mark=true
- elseif post_mark[v] and not already_post_mark then
- already_post_mark=true
- else
- return c
- end
- end
- c=getnext(c)
- n=getnext(c)
- if not n then
- return c
- end
- v=ischar(n,font)
- if not v then
- return c
- end
- end
- if nukta[v] then
- c=getnext(c)
- n=getnext(c)
- if not n then
- return c
- end
- v=ischar(n,font)
- if not v then
- return c
- end
- end
- if halant[v] then
- c=getnext(c)
- n=getnext(c)
- if not n then
- return c
- end
- v=ischar(n,font)
- if not v then
- return c
- end
- end
- if vowel_modifier[v] then
- c=getnext(c)
- n=getnext(c)
- if not n then
- return c
- end
- v=ischar(n,font)
- if not v then
- return c
- end
- end
- if stress_tone_mark[v] then
- c=getnext(c)
- n=getnext(c)
- if not n then
- return c
- end
- v=ischar(n,font)
- if not v then
- return c
- end
- end
- if stress_tone_mark[v] then
- return n
- else
- return c
- end
-end
-local function analyze_next_chars_two(c,font)
- local n=getnext(c)
- if not n then
- return c
- end
- local v=ischar(n,font)
- if v and nukta[v] then
- c=n
- end
- n=c
- while true do
- local nn=getnext(n)
- if nn then
- local vv=ischar(nn,font)
- if vv then
- if halant[vv] then
- n=nn
- local nnn=getnext(nn)
- if nnn then
- local vvv=ischar(nnn,font)
- if vvv and zw_char[vvv] then
- n=nnn
- end
- end
- elseif vv==c_zwnj or vv==c_zwj then
- local nnn=getnext(nn)
- if nnn then
- local vvv=ischar(nnn,font)
- if vvv and halant[vvv] then
- n=nnn
- end
- end
- else
- break
- end
- local nn=getnext(n)
- if nn then
- local vv=ischar(nn,font)
- if vv and consonant[vv] then
- n=nn
- local nnn=getnext(nn)
- if nnn then
- local vvv=ischar(nnn,font)
- if vvv and nukta[vvv] then
- n=nnn
- end
- end
- c=n
- else
- break
- end
- else
- break
- end
- else
- break
- end
- else
- break
- end
- end
- if not c then
- return
- end
- local n=getnext(c)
- if not n then
- return c
- end
- local v=ischar(n,font)
- if not v then
- return c
- end
- if anudatta[v] then
- c=n
- n=getnext(c)
- if not n then
- return c
- end
- v=ischar(n,font)
- if not v then
- return c
- end
- end
- if halant[v] then
- c=n
- n=getnext(c)
- if not n then
- return c
- end
- v=ischar(n,font)
- if not v then
- return c
- end
- if v==c_zwnj or v==c_zwj then
- c=n
- n=getnext(c)
- if not n then
- return c
- end
- v=ischar(n,font)
- if not v then
- return c
- end
- end
- else
- local already_pre_mark
- local already_above_mark
- local already_below_mark
- local already_post_mark
- while dependent_vowel[v] do
- local vowels=twopart_mark[v] or { v }
- for k,v in next,vowels do
- if pre_mark[v] and not already_pre_mark then
- already_pre_mark=true
- elseif above_mark[v] and not already_above_mark then
- already_above_mark=true
- elseif below_mark[v] and not already_below_mark then
- already_below_mark=true
- elseif post_mark[v] and not already_post_mark then
- already_post_mark=true
- else
- return c
- end
- end
- c=n
- n=getnext(c)
- if not n then
- return c
- end
- v=ischar(n,font)
- if not v then
- return c
- end
- end
- if nukta[v] then
- c=n
- n=getnext(c)
- if not n then
- return c
- end
- v=ischar(n,font)
- if not v then
- return c
- end
- end
- if halant[v] then
- c=n
- n=getnext(c)
- if not n then
- return c
- end
- v=ischar(n,font)
- if not v then
- return c
- end
- end
- end
- if vowel_modifier[v] then
- c=n
- n=getnext(c)
- if not n then
- return c
- end
- v=ischar(n,font)
- if not v then
- return c
- end
- end
- if stress_tone_mark[v] then
- c=n
- n=getnext(c)
- if not n then
- return c
- end
- v=ischar(n,font)
- if not v then
- return c
- end
- end
- if stress_tone_mark[v] then
- return n
- else
- return c
- end
-end
-local function method_one(head,font,attr)
- local current=head
- local start=true
- local done=false
- local nbspaces=0
- local syllabe=0
- while current do
- local char=ischar(current,font)
- if char then
- done=true
- local syllablestart=current
- local syllableend=nil
- local c=current
- local n=getnext(c)
- local first=char
- if n and ra[first] then
- local second=ischar(n,font)
- if second and halant[second] then
- local n=getnext(n)
- if n then
- local third=ischar(n,font)
- if third then
- c=n
- first=third
- end
- end
- end
- end
- local standalone=first==c_nbsp
- if standalone then
- local prev=getprev(current)
- if prev then
- local prevchar=ischar(prev,font)
- if not prevchar then
- elseif not separator[prevchar] then
- else
- standalone=false
- end
- else
- end
- end
- if standalone then
- local syllableend=analyze_next_chars_one(c,font,2)
- current=getnext(syllableend)
- if syllablestart~=syllableend then
- head,current,nbspaces=reorder_one(head,syllablestart,syllableend,font,attr,nbspaces)
- current=getnext(current)
- end
- else
- if consonant[char] then
- local prevc=true
- while prevc do
- prevc=false
- local n=getnext(current)
- if not n then
- break
- end
- local v=ischar(n,font)
- if not v then
- break
- end
- if nukta[v] then
- n=getnext(n)
- if not n then
- break
- end
- v=ischar(n,font)
- if not v then
- break
- end
- end
- if halant[v] then
- n=getnext(n)
- if not n then
- break
- end
- v=ischar(n,font)
- if not v then
- break
- end
- if v==c_zwnj or v==c_zwj then
- n=getnext(n)
- if not n then
- break
- end
- v=ischar(n,font)
- if not v then
- break
- end
- end
- if consonant[v] then
- prevc=true
- current=n
- end
- end
- end
- local n=getnext(current)
- if n then
- local v=ischar(n,font)
- if v and nukta[v] then
- current=n
- n=getnext(current)
- end
- end
- syllableend=current
- current=n
- if current then
- local v=ischar(current,font)
- if not v then
- elseif halant[v] then
- local n=getnext(current)
- if n then
- local v=ischar(n,font)
- if v and zw_char[v] then
- syllableend=n
- current=getnext(n)
- else
- syllableend=current
- current=n
- end
- else
- syllableend=current
- current=n
- end
- else
- if dependent_vowel[v] then
- syllableend=current
- current=getnext(current)
- v=ischar(current,font)
- end
- if v and vowel_modifier[v] then
- syllableend=current
- current=getnext(current)
- v=ischar(current,font)
- end
- if v and stress_tone_mark[v] then
- syllableend=current
- current=getnext(current)
- end
- end
- end
- if syllablestart~=syllableend then
- if syllableend then
- syllabe=syllabe+1
- local c=syllablestart
- local n=getnext(syllableend)
- while c~=n do
- setprop(c,a_syllabe,syllabe)
- c=getnext(c)
- end
- end
- head,current,nbspaces=reorder_one(head,syllablestart,syllableend,font,attr,nbspaces)
- current=getnext(current)
- end
- elseif independent_vowel[char] then
- syllableend=current
- current=getnext(current)
- if current then
- local v=ischar(current,font)
- if v then
- if vowel_modifier[v] then
- syllableend=current
- current=getnext(current)
- v=ischar(current,font)
- end
- if v and stress_tone_mark[v] then
- syllableend=current
- current=getnext(current)
- end
- end
- end
- else
- if show_syntax_errors then
- local mark=mark_four[char]
- if mark then
- head,current=inject_syntax_error(head,current,char)
- end
- end
- current=getnext(current)
- end
- end
- else
- current=getnext(current)
- end
- start=false
- end
- if nbspaces>0 then
- head=replace_all_nbsp(head)
- end
- current=head
- local n=0
- while current do
- local char=ischar(current,font)
- if char then
- if n==0 and not getprop(current,a_state) then
- setprop(current,a_state,s_init)
- end
- n=n+1
- else
- n=0
- end
- current=getnext(current)
- end
- return head,done
-end
-local function method_two(head,font,attr)
- local current=head
- local start=true
- local done=false
- local syllabe=0
- local nbspaces=0
- while current do
- local syllablestart=nil
- local syllableend=nil
- local char=ischar(current,font)
- if char then
- done=true
- syllablestart=current
- local c=current
- local n=getnext(current)
- if n and ra[char] then
- local nextchar=ischar(n,font)
- if nextchar and halant[nextchar] then
- local n=getnext(n)
- if n then
- local nextnextchar=ischar(n,font)
- if nextnextchar then
- c=n
- char=nextnextchar
- end
- end
- end
- end
- if independent_vowel[char] then
- current=analyze_next_chars_one(c,font,1)
- syllableend=current
- else
- local standalone=char==c_nbsp
- if standalone then
- nbspaces=nbspaces+1
- local p=getprev(current)
- if not p then
- elseif ischar(p,font) then
- elseif not separator[getchar(p)] then
- else
- standalone=false
- end
- end
- if standalone then
- current=analyze_next_chars_one(c,font,2)
- syllableend=current
- elseif consonant[getchar(current)] then
- current=analyze_next_chars_two(current,font)
- syllableend=current
- end
- end
- end
- if syllableend then
- syllabe=syllabe+1
- local c=syllablestart
- local n=getnext(syllableend)
- while c~=n do
- setprop(c,a_syllabe,syllabe)
- c=getnext(c)
- end
- end
- if syllableend and syllablestart~=syllableend then
- head,current,nbspaces=reorder_two(head,syllablestart,syllableend,font,attr,nbspaces)
- end
- if not syllableend and show_syntax_errors then
- local char=ischar(current,font)
- if char and not getprop(current,a_state) then
- local mark=mark_four[char]
- if mark then
- head,current=inject_syntax_error(head,current,char)
- end
- end
- end
- start=false
- current=getnext(current)
- end
- if nbspaces>0 then
- head=replace_all_nbsp(head)
- end
- current=head
- local n=0
- while current do
- local char=ischar(current,font)
- if char then
- if n==0 and not getprop(current,a_state) then
- setprop(current,a_state,s_init)
- end
- n=n+1
- else
- n=0
- end
- current=getnext(current)
- end
- return head,done
-end
-for i=1,nofscripts do
- methods[scripts_one[i]]=method_one
- methods[scripts_two[i]]=method_two
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-osd”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-ocl” c1f4cbea3c4ec5002a04fc637b135711] ---
-
-if not modules then modules={} end modules ['font-ocl']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-if CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 then
- return
-end
-local tostring,tonumber,next=tostring,tonumber,next
-local round,max=math.round,math.round
-local gsub,find=string.gsub,string.find
-local sortedkeys,sortedhash,concat=table.sortedkeys,table.sortedhash,table.concat
-local setmetatableindex=table.setmetatableindex
-local formatters=string.formatters
-local tounicode=fonts.mappings.tounicode
-local helpers=fonts.helpers
-local charcommand=helpers.commands.char
-local rightcommand=helpers.commands.right
-local leftcommand=helpers.commands.left
-local downcommand=helpers.commands.down
-local otf=fonts.handlers.otf
-local otfregister=otf.features.register
-local f_color=formatters["%.3f %.3f %.3f rg"]
-local f_gray=formatters["%.3f g"]
-if context then
- local startactualtext=nil
- local stopactualtext=nil
- function otf.getactualtext(s)
- if not startactualtext then
- startactualtext=backends.codeinjections.startunicodetoactualtextdirect
- stopactualtext=backends.codeinjections.stopunicodetoactualtextdirect
- end
- return startactualtext(s),stopactualtext()
- end
-else
- local tounicode=fonts.mappings.tounicode16
- function otf.getactualtext(s)
- return
- "/Span << /ActualText >> BDC",
- "EMC"
- end
-end
-local sharedpalettes={}
-local hash=setmetatableindex(function(t,k)
- local v={ "pdf","direct",k }
- t[k]=v
- return v
-end)
-if context then
- local colors=attributes.list[attributes.private('color')] or {}
- local transparencies=attributes.list[attributes.private('transparency')] or {}
- function otf.registerpalette(name,values)
- sharedpalettes[name]=values
- local color=lpdf.color
- local transparency=lpdf.transparency
- local register=colors.register
- for i=1,#values do
- local v=values[i]
- if v=="textcolor" then
- values[i]=false
- else
- local c=nil
- local t=nil
- if type(v)=="table" then
- c=register(name,"rgb",
- max(round((v.r or 0)*255),255)/255,
- max(round((v.g or 0)*255),255)/255,
- max(round((v.b or 0)*255),255)/255
- )
- else
- c=colors[v]
- t=transparencies[v]
- end
- if c and t then
- values[i]=hash[color(1,c).." "..transparency(t)]
- elseif c then
- values[i]=hash[color(1,c)]
- elseif t then
- values[i]=hash[color(1,t)]
- end
- end
- end
- end
-else
- function otf.registerpalette(name,values)
- sharedpalettes[name]=values
- for i=1,#values do
- local v=values[i]
- if v then
- values[i]=hash[f_color(
- max(round((v.r or 0)*255),255)/255,
- max(round((v.g or 0)*255),255)/255,
- max(round((v.b or 0)*255),255)/255
- )]
- end
- end
- end
-end
-local function convert(t,k)
- local v={}
- for i=1,#k do
- local p=k[i]
- local r,g,b=p[1],p[2],p[3]
- if r==g and g==b then
- v[i]=hash[f_gray(r/255)]
- else
- v[i]=hash[f_color(r/255,g/255,b/255)]
- end
- end
- t[k]=v
- return v
-end
-local start={ "pdf","mode","font" }
-local push={ "pdf","page","q" }
-local pop={ "pdf","page","Q" }
-local function initializeoverlay(tfmdata,kind,value)
- if value then
- local resources=tfmdata.resources
- local palettes=resources.colorpalettes
- if palettes then
- local converted=resources.converted
- if not converted then
- converted=setmetatableindex(convert)
- resources.converted=converted
- end
- local colorvalues=sharedpalettes[value]
- local default=false
- if colorvalues then
- default=colorvalues[#colorvalues]
- else
- colorvalues=converted[palettes[tonumber(value) or 1] or palettes[1]] or {}
- end
- local classes=#colorvalues
- if classes==0 then
- return
- end
- local characters=tfmdata.characters
- local descriptions=tfmdata.descriptions
- local properties=tfmdata.properties
- properties.virtualized=true
- tfmdata.fonts={
- { id=0 }
- }
- local getactualtext=otf.getactualtext
- local b,e=getactualtext(tounicode(0xFFFD))
- local actualb={ "pdf","page",b }
- local actuale={ "pdf","page",e }
- for unicode,character in next,characters do
- local description=descriptions[unicode]
- if description then
- local colorlist=description.colors
- if colorlist then
- local u=description.unicode or characters[unicode].unicode
- local w=character.width or 0
- local s=#colorlist
- local goback=w~=0 and leftcommand[w] or nil
- local t={
- not u and actualb or { "pdf","page",(getactualtext(tounicode(u))) },
- push,
- }
- local n=2
- local l=nil
- for i=1,s do
- local entry=colorlist[i]
- local v=colorvalues[entry.class] or default
- if v and l~=v then
- n=n+1 t[n]=v
- l=v
- end
- n=n+1 t[n]=charcommand[entry.slot]
- if s>1 and i temp-otf-svg-shape.log","w")
- end
- end
- function otfsvg.topdf(svgshapes,tfmdata)
- local pdfshapes={}
- local inkscape=runner()
- if inkscape then
- local descriptions=tfmdata.descriptions
- local nofshapes=#svgshapes
- local f_svgfile=formatters["temp-otf-svg-shape-%i.svg"]
- local f_pdffile=formatters["temp-otf-svg-shape-%i.pdf"]
- local f_convert=formatters["%s --export-pdf=%s\n"]
- local filterglyph=otfsvg.filterglyph
- local nofdone=0
- local processed={}
- report_svg("processing %i svg containers",nofshapes)
- statistics.starttiming()
- for i=1,nofshapes do
- local entry=svgshapes[i]
- for index=entry.first,entry.last do
- local data=filterglyph(entry,index)
- if data and data~="" then
- local svgfile=f_svgfile(index)
- local pdffile=f_pdffile(index)
- savedata(svgfile,data)
- inkscape:write(f_convert(svgfile,pdffile))
- processed[index]=true
- nofdone=nofdone+1
- if nofdone%25==0 then
- report_svg("%i shapes submitted",nofdone)
- end
- end
- end
- end
- if nofdone%25~=0 then
- report_svg("%i shapes submitted",nofdone)
- end
- report_svg("processing can be going on for a while")
- inkscape:write("quit\n")
- inkscape:close()
- report_svg("processing %i pdf results",nofshapes)
- for index in next,processed do
- local svgfile=f_svgfile(index)
- local pdffile=f_pdffile(index)
- local pdfdata=loaddata(pdffile)
- if pdfdata and pdfdata~="" then
- pdfshapes[index]={
- data=pdfdata,
- }
- end
- remove(svgfile)
- remove(pdffile)
- end
- local characters=tfmdata.characters
- for k,v in next,characters do
- local d=descriptions[k]
- local i=d.index
- if i then
- local p=pdfshapes[i]
- if p then
- local w=d.width
- local l=d.boundingbox[1]
- local r=d.boundingbox[3]
- p.scale=(r-l)/w
- p.x=l
- end
- end
- end
- if not next(pdfshapes) then
- report_svg("there are no converted shapes, fix your setup")
- end
- statistics.stoptiming()
- if statistics.elapsedseconds then
- report_svg("svg conversion time %s",statistics.elapsedseconds() or "-")
- end
- end
- return pdfshapes
- end
-end
-local function initializesvg(tfmdata,kind,value)
- if value and otf.svgenabled then
- local svg=tfmdata.properties.svg
- local hash=svg and svg.hash
- local timestamp=svg and svg.timestamp
- if not hash then
- return
- end
- local pdffile=containers.read(otf.pdfcache,hash)
- local pdfshapes=pdffile and pdffile.pdfshapes
- if not pdfshapes or pdffile.timestamp~=timestamp or not next(pdfshapes) then
- local svgfile=containers.read(otf.svgcache,hash)
- local svgshapes=svgfile and svgfile.svgshapes
- pdfshapes=svgshapes and otfsvg.topdf(svgshapes,tfmdata,otf.pdfcache.writable,hash) or {}
- containers.write(otf.pdfcache,hash,{
- pdfshapes=pdfshapes,
- timestamp=timestamp,
- })
- end
- pdftovirtual(tfmdata,pdfshapes,"svg")
- return true
- end
-end
-otfregister {
- name="svg",
- description="svg glyphs",
- manipulators={
- base=initializesvg,
- node=initializesvg,
- }
-}
-local otfpng=otf.png or {}
-otf.png=otfpng
-otf.pngenabled=true
-do
- local report_png=logs.reporter("fonts","png conversion")
- local loaddata=io.loaddata
- local savedata=io.savedata
- local remove=os.remove
- local runner=sandbox and sandbox.registerrunner {
- name="otfpng",
- program="gm",
- template="convert -quality 100 temp-otf-png-shape.png temp-otf-png-shape.pdf > temp-otf-svg-shape.log",
- }
- if not runner then
- runner=function()
- return os.execute("gm convert -quality 100 temp-otf-png-shape.png temp-otf-png-shape.pdf > temp-otf-svg-shape.log")
- end
- end
- function otfpng.topdf(pngshapes)
- local pdfshapes={}
- local pngfile="temp-otf-png-shape.png"
- local pdffile="temp-otf-png-shape.pdf"
- local nofdone=0
- local indices=sortedkeys(pngshapes)
- local nofindices=#indices
- report_png("processing %i png containers",nofindices)
- statistics.starttiming()
- for i=1,nofindices do
- local index=indices[i]
- local entry=pngshapes[index]
- local data=entry.data
- local x=entry.x
- local y=entry.y
- savedata(pngfile,data)
- runner()
- pdfshapes[index]={
- x=x~=0 and x or nil,
- y=y~=0 and y or nil,
- data=loaddata(pdffile),
- }
- nofdone=nofdone+1
- if nofdone%100==0 then
- report_png("%i shapes processed",nofdone)
- end
- end
- report_png("processing %i pdf results",nofindices)
- remove(pngfile)
- remove(pdffile)
- statistics.stoptiming()
- if statistics.elapsedseconds then
- report_png("png conversion time %s",statistics.elapsedseconds() or "-")
- end
- return pdfshapes
- end
-end
-local function initializepng(tfmdata,kind,value)
- if value and otf.pngenabled then
- local png=tfmdata.properties.png
- local hash=png and png.hash
- local timestamp=png and png.timestamp
- if not hash then
- return
- end
- local pdffile=containers.read(otf.pdfcache,hash)
- local pdfshapes=pdffile and pdffile.pdfshapes
- if not pdfshapes or pdffile.timestamp~=timestamp then
- local pngfile=containers.read(otf.pngcache,hash)
- local pngshapes=pngfile and pngfile.pngshapes
- pdfshapes=pngshapes and otfpng.topdf(pngshapes) or {}
- containers.write(otf.pdfcache,hash,{
- pdfshapes=pdfshapes,
- timestamp=timestamp,
- })
- end
- pdftovirtual(tfmdata,pdfshapes,"png")
- return true
- end
-end
-otfregister {
- name="sbix",
- description="sbix glyphs",
- manipulators={
- base=initializepng,
- node=initializepng,
- }
-}
-otfregister {
- name="cblc",
- description="cblc glyphs",
- manipulators={
- base=initializepng,
- node=initializepng,
- }
-}
-if context then
- local function initializecolor(tfmdata,kind,value)
- if value=="auto" then
- return
- initializeoverlay(tfmdata,kind,value) or
- initializesvg(tfmdata,kind,value) or
- initializepng(tfmdata,kind,value)
- elseif value=="overlay" then
- return initializeoverlay(tfmdata,kind,value)
- elseif value=="svg" then
- return initializesvg(tfmdata,kind,value)
- elseif value=="png" or value=="bitmap" then
- return initializepng(tfmdata,kind,value)
- else
- end
- end
- otfregister {
- name="color",
- description="color glyphs",
- manipulators={
- base=initializecolor,
- node=initializecolor,
- }
- }
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-ocl”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-otc” 1204a2fdc436e644127c0aa38ab69607] ---
-
-if not modules then modules={} end modules ['font-otc']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local insert,sortedkeys,sortedhash,tohash=table.insert,table.sortedkeys,table.sortedhash,table.tohash
-local type,next,tonumber=type,next,tonumber
-local lpegmatch=lpeg.match
-local utfbyte,utflen=utf.byte,utf.len
-local sortedhash=table.sortedhash
-local trace_loading=false trackers.register("otf.loading",function(v) trace_loading=v end)
-local report_otf=logs.reporter("fonts","otf loading")
-local fonts=fonts
-local otf=fonts.handlers.otf
-local registerotffeature=otf.features.register
-local setmetatableindex=table.setmetatableindex
-local fonthelpers=fonts.helpers
-local checkmerge=fonthelpers.checkmerge
-local checkflags=fonthelpers.checkflags
-local checksteps=fonthelpers.checksteps
-local normalized={
- substitution="substitution",
- single="substitution",
- ligature="ligature",
- alternate="alternate",
- multiple="multiple",
- kern="kern",
- pair="pair",
- single="single",
- chainsubstitution="chainsubstitution",
- chainposition="chainposition",
-}
-local types={
- substitution="gsub_single",
- ligature="gsub_ligature",
- alternate="gsub_alternate",
- multiple="gsub_multiple",
- kern="gpos_pair",
- pair="gpos_pair",
- single="gpos_single",
- chainsubstitution="gsub_contextchain",
- chainposition="gpos_contextchain",
-}
-local names={
- gsub_single="gsub",
- gsub_multiple="gsub",
- gsub_alternate="gsub",
- gsub_ligature="gsub",
- gsub_context="gsub",
- gsub_contextchain="gsub",
- gsub_reversecontextchain="gsub",
- gpos_single="gpos",
- gpos_pair="gpos",
- gpos_cursive="gpos",
- gpos_mark2base="gpos",
- gpos_mark2ligature="gpos",
- gpos_mark2mark="gpos",
- gpos_context="gpos",
- gpos_contextchain="gpos",
-}
-setmetatableindex(types,function(t,k) t[k]=k return k end)
-local everywhere={ ["*"]={ ["*"]=true } }
-local noflags={ false,false,false,false }
-local function getrange(sequences,category)
- local count=#sequences
- local first=nil
- local last=nil
- for i=1,count do
- local t=sequences[i].type
- if t and names[t]==category then
- if not first then
- first=i
- end
- last=i
- end
- end
- return first or 1,last or count
-end
-local function validspecification(specification,name)
- local dataset=specification.dataset
- if dataset then
- elseif specification[1] then
- dataset=specification
- specification={ dataset=dataset }
- else
- dataset={ { data=specification.data } }
- specification.data=nil
- specification.dataset=dataset
- end
- local first=dataset[1]
- if first then
- first=first.data
- end
- if not first then
- report_otf("invalid feature specification, no dataset")
- return
- end
- if type(name)~="string" then
- name=specification.name or first.name
- end
- if type(name)~="string" then
- report_otf("invalid feature specification, no name")
- return
- end
- local n=#dataset
- if n>0 then
- for i=1,n do
- setmetatableindex(dataset[i],specification)
- end
- return specification,name
- end
-end
-local function addfeature(data,feature,specifications)
- if not specifications then
- report_otf("missing specification")
- return
- end
- local descriptions=data.descriptions
- local resources=data.resources
- local features=resources.features
- local sequences=resources.sequences
- if not features or not sequences then
- report_otf("missing specification")
- return
- end
- local alreadydone=resources.alreadydone
- if not alreadydone then
- alreadydone={}
- resources.alreadydone=alreadydone
- end
- if alreadydone[specifications] then
- return
- else
- alreadydone[specifications]=true
- end
- local fontfeatures=resources.features or everywhere
- local unicodes=resources.unicodes
- local splitter=lpeg.splitter(" ",unicodes)
- local done=0
- local skip=0
- local aglunicodes=false
- local privateslot=fonthelpers.privateslot
- local specifications=validspecification(specifications,feature)
- if not specifications then
- return
- end
- local p=lpeg.P("P")*(lpeg.patterns.hexdigit^1/function(s) return tonumber(s,16) end)*lpeg.P(-1)
- local function tounicode(code)
- if not code then
- return
- end
- if type(code)=="number" then
- return code
- end
- local u=unicodes[code]
- if u then
- return u
- end
- if utflen(code)==1 then
- u=utfbyte(code)
- if u then
- return u
- end
- end
- if privateslot then
- u=privateslot(code)
- if u then
- return u
- end
- end
- local u=lpegmatch(p,code)
- if u then
- return u
- end
- if not aglunicodes then
- aglunicodes=fonts.encodings.agl.unicodes
- end
- local u=aglunicodes[code]
- if u then
- return u
- end
- end
- local coverup=otf.coverup
- local coveractions=coverup.actions
- local stepkey=coverup.stepkey
- local register=coverup.register
- local function prepare_substitution(list,featuretype,nocheck)
- local coverage={}
- local cover=coveractions[featuretype]
- for code,replacement in next,list do
- local unicode=tounicode(code)
- local description=descriptions[unicode]
- if not nocheck and not description then
- skip=skip+1
- else
- if type(replacement)=="table" then
- replacement=replacement[1]
- end
- replacement=tounicode(replacement)
- if replacement and (nocheck or descriptions[replacement]) then
- cover(coverage,unicode,replacement)
- done=done+1
- else
- skip=skip+1
- end
- end
- end
- return coverage
- end
- local function prepare_alternate(list,featuretype,nocheck)
- local coverage={}
- local cover=coveractions[featuretype]
- for code,replacement in next,list do
- local unicode=tounicode(code)
- local description=descriptions[unicode]
- if not nocheck and not description then
- skip=skip+1
- elseif type(replacement)=="table" then
- local r={}
- for i=1,#replacement do
- local u=tounicode(replacement[i])
- r[i]=(nocheck or descriptions[u]) and u or unicode
- end
- cover(coverage,unicode,r)
- done=done+1
- else
- local u=tounicode(replacement)
- if u then
- cover(coverage,unicode,{ u })
- done=done+1
- else
- skip=skip+1
- end
- end
- end
- return coverage
- end
- local function prepare_multiple(list,featuretype,nocheck)
- local coverage={}
- local cover=coveractions[featuretype]
- for code,replacement in next,list do
- local unicode=tounicode(code)
- local description=descriptions[unicode]
- if not nocheck and not description then
- skip=skip+1
- elseif type(replacement)=="table" then
- local r={}
- local n=0
- for i=1,#replacement do
- local u=tounicode(replacement[i])
- if nocheck or descriptions[u] then
- n=n+1
- r[n]=u
- end
- end
- if n>0 then
- cover(coverage,unicode,r)
- done=done+1
- else
- skip=skip+1
- end
- else
- local u=tounicode(replacement)
- if u then
- cover(coverage,unicode,{ u })
- done=done+1
- else
- skip=skip+1
- end
- end
- end
- return coverage
- end
- local function prepare_ligature(list,featuretype,nocheck)
- local coverage={}
- local cover=coveractions[featuretype]
- for code,ligature in next,list do
- local unicode=tounicode(code)
- local description=descriptions[unicode]
- if not nocheck and not description then
- skip=skip+1
- else
- if type(ligature)=="string" then
- ligature={ lpegmatch(splitter,ligature) }
- end
- local present=true
- for i=1,#ligature do
- local l=ligature[i]
- local u=tounicode(l)
- if nocheck or descriptions[u] then
- ligature[i]=u
- else
- present=false
- break
- end
- end
- if present then
- cover(coverage,unicode,ligature)
- done=done+1
- else
- skip=skip+1
- end
- end
- end
- return coverage
- end
- local function resetspacekerns()
- data.properties.hasspacekerns=true
- data.resources .spacekerns=nil
- end
- local function prepare_kern(list,featuretype)
- local coverage={}
- local cover=coveractions[featuretype]
- local isspace=false
- for code,replacement in next,list do
- local unicode=tounicode(code)
- local description=descriptions[unicode]
- if description and type(replacement)=="table" then
- local r={}
- for k,v in next,replacement do
- local u=tounicode(k)
- if u then
- r[u]=v
- if u==32 then
- isspace=true
- end
- end
- end
- if next(r) then
- cover(coverage,unicode,r)
- done=done+1
- if unicode==32 then
- isspace=true
- end
- else
- skip=skip+1
- end
- else
- skip=skip+1
- end
- end
- if isspace then
- resetspacekerns()
- end
- return coverage
- end
- local function prepare_pair(list,featuretype)
- local coverage={}
- local cover=coveractions[featuretype]
- if cover then
- for code,replacement in next,list do
- local unicode=tounicode(code)
- local description=descriptions[unicode]
- if description and type(replacement)=="table" then
- local r={}
- for k,v in next,replacement do
- local u=tounicode(k)
- if u then
- r[u]=v
- if u==32 then
- isspace=true
- end
- end
- end
- if next(r) then
- cover(coverage,unicode,r)
- done=done+1
- if unicode==32 then
- isspace=true
- end
- else
- skip=skip+1
- end
- else
- skip=skip+1
- end
- end
- if isspace then
- resetspacekerns()
- end
- else
- report_otf("unknown cover type %a",featuretype)
- end
- return coverage
- end
- local prepare_single=prepare_pair
- local function prepare_chain(list,featuretype,sublookups)
- local rules=list.rules
- local coverage={}
- if rules then
- local rulehash={}
- local rulesize=0
- local lookuptype=types[featuretype]
- for nofrules=1,#rules do
- local rule=rules[nofrules]
- local current=rule.current
- local before=rule.before
- local after=rule.after
- local replacements=rule.replacements or false
- local sequence={}
- local nofsequences=0
- if before then
- for n=1,#before do
- nofsequences=nofsequences+1
- sequence[nofsequences]=before[n]
- end
- end
- local start=nofsequences+1
- for n=1,#current do
- nofsequences=nofsequences+1
- sequence[nofsequences]=current[n]
- end
- local stop=nofsequences
- if after then
- for n=1,#after do
- nofsequences=nofsequences+1
- sequence[nofsequences]=after[n]
- end
- end
- local lookups=rule.lookups or false
- local subtype=nil
- if lookups and sublookups then
- for k,v in sortedhash(lookups) do
- local t=type(v)
- if t=="table" then
- for i=1,#v do
- local vi=v[i]
- if type(vi)~="table" then
- v[i]={ vi }
- end
- end
- elseif t=="number" then
- local lookup=sublookups[v]
- if lookup then
- lookups[k]={ lookup }
- if not subtype then
- subtype=lookup.type
- end
- elseif v==0 then
- lookups[k]={ { type="gsub_remove" } }
- else
- lookups[k]=false
- end
- else
- lookups[k]=false
- end
- end
- end
- if nofsequences>0 then
- local hashed={}
- for i=1,nofsequences do
- local t={}
- local s=sequence[i]
- for i=1,#s do
- local u=tounicode(s[i])
- if u then
- t[u]=true
- end
- end
- hashed[i]=t
- end
- sequence=hashed
- rulesize=rulesize+1
- rulehash[rulesize]={
- nofrules,
- lookuptype,
- sequence,
- start,
- stop,
- lookups,
- replacements,
- subtype,
- }
- for unic in sortedhash(sequence[start]) do
- local cu=coverage[unic]
- if not cu then
- coverage[unic]=rulehash
- end
- end
- sequence.n=nofsequences
- end
- end
- rulehash.n=rulesize
- end
- return coverage
- end
- local dataset=specifications.dataset
- local function report(name,category,position,first,last,sequences)
- report_otf("injecting name %a of category %a at position %i in [%i,%i] of [%i,%i]",
- name,category,position,first,last,1,#sequences)
- end
- local function inject(specification,sequences,sequence,first,last,category,name)
- local position=specification.position or false
- if not position then
- position=specification.prepend
- if position==true then
- if trace_loading then
- report(name,category,first,first,last,sequences)
- end
- insert(sequences,first,sequence)
- return
- end
- end
- if not position then
- position=specification.append
- if position==true then
- if trace_loading then
- report(name,category,last+1,first,last,sequences)
- end
- insert(sequences,last+1,sequence)
- return
- end
- end
- local kind=type(position)
- if kind=="string" then
- local index=false
- for i=first,last do
- local s=sequences[i]
- local f=s.features
- if f then
- for k in sortedhash(f) do
- if k==position then
- index=i
- break
- end
- end
- if index then
- break
- end
- end
- end
- if index then
- position=index
- else
- position=last+1
- end
- elseif kind=="number" then
- if position<0 then
- position=last-position+1
- end
- if position>last then
- position=last+1
- elseif position0 then
- for k,v in next,askedfeatures do
- if v[1] then
- askedfeatures[k]=tohash(v)
- end
- end
- if featureflags[1] then featureflags[1]="mark" end
- if featureflags[2] then featureflags[2]="ligature" end
- if featureflags[3] then featureflags[3]="base" end
- local steptype=types[featuretype]
- local sequence={
- chain=featurechain,
- features={ [feature]=askedfeatures },
- flags=featureflags,
- name=feature,
- order=featureorder,
- [stepkey]=steps,
- nofsteps=nofsteps,
- type=steptype,
- }
- checkflags(sequence,resources)
- checkmerge(sequence)
- checksteps(sequence)
- local first,last=getrange(sequences,category)
- inject(specification,sequences,sequence,first,last,category,feature)
- local features=fontfeatures[category]
- if not features then
- features={}
- fontfeatures[category]=features
- end
- local k=features[feature]
- if not k then
- k={}
- features[feature]=k
- end
- for script,languages in next,askedfeatures do
- local kk=k[script]
- if not kk then
- kk={}
- k[script]=kk
- end
- for language,value in next,languages do
- kk[language]=value
- end
- end
- end
- end
- end
- if trace_loading then
- report_otf("registering feature %a, affected glyphs %a, skipped glyphs %a",feature,done,skip)
- end
-end
-otf.enhancers.addfeature=addfeature
-local extrafeatures={}
-local knownfeatures={}
-function otf.addfeature(name,specification)
- if type(name)=="table" then
- specification=name
- end
- if type(specification)~="table" then
- report_otf("invalid feature specification, no valid table")
- return
- end
- specification,name=validspecification(specification,name)
- if name and specification then
- local slot=knownfeatures[name]
- if not slot then
- slot=#extrafeatures+1
- knownfeatures[name]=slot
- elseif specification.overload==false then
- slot=#extrafeatures+1
- knownfeatures[name]=slot
- else
- end
- specification.name=name
- extrafeatures[slot]=specification
- end
-end
-local function enhance(data,filename,raw)
- for slot=1,#extrafeatures do
- local specification=extrafeatures[slot]
- addfeature(data,specification.name,specification)
- end
-end
-otf.enhancers.enhance=enhance
-otf.enhancers.register("check extra features",enhance)
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-otc”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-onr” 22572ec0f86f53631e14b6d1ed43ee51] ---
-
-if not modules then modules={} end modules ['font-onr']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local fonts,logs,trackers,resolvers=fonts,logs,trackers,resolvers
-local next,type,tonumber,rawset=next,type,tonumber,rawset
-local match,lower,gsub,strip,find=string.match,string.lower,string.gsub,string.strip,string.find
-local char,byte,sub=string.char,string.byte,string.sub
-local abs=math.abs
-local bxor,rshift=bit32.bxor,bit32.rshift
-local P,S,R,V,Cmt,C,Ct,Cs,Carg,Cf,Cg,Cc=lpeg.P,lpeg.S,lpeg.R,lpeg.V,lpeg.Cmt,lpeg.C,lpeg.Ct,lpeg.Cs,lpeg.Carg,lpeg.Cf,lpeg.Cg,lpeg.Cc
-local lpegmatch,patterns=lpeg.match,lpeg.patterns
-local trace_indexing=false trackers.register("afm.indexing",function(v) trace_indexing=v end)
-local trace_loading=false trackers.register("afm.loading",function(v) trace_loading=v end)
-local report_afm=logs.reporter("fonts","afm loading")
-local report_pfb=logs.reporter("fonts","pfb loading")
-local handlers=fonts.handlers
-local afm=handlers.afm or {}
-handlers.afm=afm
-local readers=afm.readers or {}
-afm.readers=readers
-afm.version=1.513
-local get_indexes,get_shapes
-do
- local decrypt
- do
- local r,c1,c2,n=0,0,0,0
- local function step(c)
- local cipher=byte(c)
- local plain=bxor(cipher,rshift(r,8))
- r=((cipher+r)*c1+c2)%65536
- return char(plain)
- end
- decrypt=function(binary,initial,seed)
- r,c1,c2,n=initial,52845,22719,seed
- binary=gsub(binary,".",step)
- return sub(binary,n+1)
- end
- end
- local charstrings=P("/CharStrings")
- local subroutines=P("/Subrs")
- local encoding=P("/Encoding")
- local dup=P("dup")
- local put=P("put")
- local array=P("array")
- local name=P("/")*C((R("az","AZ","09")+S("-_."))^1)
- local digits=R("09")^1
- local cardinal=digits/tonumber
- local spaces=P(" ")^1
- local spacing=patterns.whitespace^0
- local routines,vector,chars,n,m
- local initialize=function(str,position,size)
- n=0
- m=size
- return position+1
- end
- local setroutine=function(str,position,index,size,filename)
- if routines[index] then
- return false
- end
- local forward=position+size
- local stream=decrypt(sub(str,position+1,forward),4330,4)
- routines[index]={ byte(stream,1,#stream) }
- n=n+1
- if n>=m then
- return #str
- end
- return forward+1
- end
- local setvector=function(str,position,name,size,filename)
- local forward=position+tonumber(size)
- if n>=m then
- return #str
- elseif forward<#str then
- if n==0 and name~=".notdef" then
- report_pfb("reserving .notdef at index 0 in %a",filename)
- n=n+1
- end
- vector[n]=name
- n=n+1
- return forward
- else
- return #str
- end
- end
- local setshapes=function(str,position,name,size,filename)
- local forward=position+tonumber(size)
- local stream=sub(str,position+1,forward)
- if n>m then
- return #str
- elseif forward<#str then
- if n==0 and name~=".notdef" then
- report_pfb("reserving .notdef at index 0 in %a",filename)
- n=n+1
- end
- vector[n]=name
- n=n+1
- chars [n]=decrypt(stream,4330,4)
- return forward
- else
- return #str
- end
- end
- local p_rd=spacing*(P("RD")+P("-|"))
- local p_np=spacing*(P("NP")+P("|"))
- local p_nd=spacing*(P("ND")+P("|"))
- local p_filterroutines=
- (1-subroutines)^0*subroutines*spaces*Cmt(cardinal,initialize)*(Cmt(cardinal*spaces*cardinal*p_rd*Carg(1),setroutine)*p_np+(1-p_nd))^1
- local p_filtershapes=
- (1-charstrings)^0*charstrings*spaces*Cmt(cardinal,initialize)*(Cmt(name*spaces*cardinal*p_rd*Carg(1),setshapes)*p_nd+P(1))^1
- local p_filternames=Ct (
- (1-charstrings)^0*charstrings*spaces*Cmt(cardinal,initialize)*(Cmt(name*spaces*cardinal*Carg(1),setvector)+P(1))^1
- )
- local p_filterencoding=(1-encoding)^0*encoding*spaces*digits*spaces*array*(1-dup)^0*Cf(
- Ct("")*Cg(spacing*dup*spaces*cardinal*spaces*name*spaces*put)^1
-,rawset)
- local key=spacing*P("/")*R("az","AZ")
- local str=spacing*Cs { (P("(")/"")*((1-P("\\(")-P("\\)")-S("()"))+V(1))^0*(P(")")/"") }
- local num=spacing*(R("09")+S("+-."))^1/tonumber
- local arr=spacing*Ct (S("[{")*(num)^0*spacing*S("]}"))
- local boo=spacing*(P("true")*Cc(true)+P("false")*Cc(false))
- local nam=spacing*P("/")*Cs(R("az","AZ")^1)
- local p_filtermetadata=(
- P("/")*Carg(1)*((
- C("version")*str+C("Copyright")*str+C("Notice")*str+C("FullName")*str+C("FamilyName")*str+C("Weight")*str+C("ItalicAngle")*num+C("isFixedPitch")*boo+C("UnderlinePosition")*num+C("UnderlineThickness")*num+C("FontName")*nam+C("FontMatrix")*arr+C("FontBBox")*arr
- ) )/function(t,k,v) t[lower(k)]=v end+P(1)
- )^0*Carg(1)
- local function loadpfbvector(filename,shapestoo,streams)
- local data=io.loaddata(resolvers.findfile(filename))
- if not data then
- report_pfb("no data in %a",filename)
- return
- end
- if not (find(data,"!PS-AdobeFont-",1,true) or find(data,"%!FontType1",1,true)) then
- report_pfb("no font in %a",filename)
- return
- end
- local ascii,binary=match(data,"(.*)eexec%s+......(.*)")
- if not binary then
- report_pfb("no binary data in %a",filename)
- return
- end
- binary=decrypt(binary,55665,4)
- local names={}
- local encoding=lpegmatch(p_filterencoding,ascii)
- local metadata=lpegmatch(p_filtermetadata,ascii,1,{})
- local glyphs={}
- routines,vector,chars={},{},{}
- if shapestoo or streams then
- lpegmatch(p_filterroutines,binary,1,filename)
- lpegmatch(p_filtershapes,binary,1,filename)
- local data={
- dictionaries={
- {
- charstrings=chars,
- charset=vector,
- subroutines=routines,
- }
- },
- }
- fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,"cff",streams,true)
- else
- lpegmatch(p_filternames,binary,1,filename)
- end
- names=vector
- routines,vector,chars=nil,nil,nil
- return names,encoding,glyphs,metadata
- end
- local pfb=handlers.pfb or {}
- handlers.pfb=pfb
- pfb.loadvector=loadpfbvector
- get_indexes=function(data,pfbname)
- local vector=loadpfbvector(pfbname)
- if vector then
- local characters=data.characters
- if trace_loading then
- report_afm("getting index data from %a",pfbname)
- end
- for index=0,#vector do
- local name=vector[index]
- local char=characters[name]
- if char then
- if trace_indexing then
- report_afm("glyph %a has index %a",name,index)
- end
- char.index=index
- else
- if trace_indexing then
- report_afm("glyph %a has index %a but no data",name,index)
- end
- end
- end
- end
- end
- get_shapes=function(pfbname)
- local vector,encoding,glyphs=loadpfbvector(pfbname,true)
- return glyphs
- end
-end
-local spacer=patterns.spacer
-local whitespace=patterns.whitespace
-local lineend=patterns.newline
-local spacing=spacer^0
-local number=spacing*S("+-")^-1*(R("09")+S("."))^1/tonumber
-local name=spacing*C((1-whitespace)^1)
-local words=spacing*((1-lineend)^1/strip)
-local rest=(1-lineend)^0
-local fontdata=Carg(1)
-local semicolon=spacing*P(";")
-local plus=spacing*P("plus")*number
-local minus=spacing*P("minus")*number
-local function addkernpair(data,one,two,value)
- local chr=data.characters[one]
- if chr then
- local kerns=chr.kerns
- if kerns then
- kerns[two]=tonumber(value)
- else
- chr.kerns={ [two]=tonumber(value) }
- end
- end
-end
-local p_kernpair=(fontdata*P("KPX")*name*name*number)/addkernpair
-local chr=false
-local ind=0
-local function start(data,version)
- data.metadata.afmversion=version
- ind=0
- chr={}
-end
-local function stop()
- ind=0
- chr=false
-end
-local function setindex(i)
- if i<0 then
- ind=ind+1
- else
- ind=i
- end
- chr={
- index=ind
- }
-end
-local function setwidth(width)
- chr.width=width
-end
-local function setname(data,name)
- data.characters[name]=chr
-end
-local function setboundingbox(boundingbox)
- chr.boundingbox=boundingbox
-end
-local function setligature(plus,becomes)
- local ligatures=chr.ligatures
- if ligatures then
- ligatures[plus]=becomes
- else
- chr.ligatures={ [plus]=becomes }
- end
-end
-local p_charmetric=((
- P("C")*number/setindex+P("WX")*number/setwidth+P("N")*fontdata*name/setname+P("B")*Ct((number)^4)/setboundingbox+P("L")*(name)^2/setligature
- )*semicolon )^1
-local p_charmetrics=P("StartCharMetrics")*number*(p_charmetric+(1-P("EndCharMetrics")))^0*P("EndCharMetrics")
-local p_kernpairs=P("StartKernPairs")*number*(p_kernpair+(1-P("EndKernPairs" )))^0*P("EndKernPairs" )
-local function set_1(data,key,a) data.metadata[lower(key)]=a end
-local function set_2(data,key,a,b) data.metadata[lower(key)]={ a,b } end
-local function set_3(data,key,a,b,c) data.metadata[lower(key)]={ a,b,c } end
-local p_parameters=P(false)+fontdata*((P("FontName")+P("FullName")+P("FamilyName"))/lower)*words/function(data,key,value)
- data.metadata[key]=value
- end+fontdata*((P("Weight")+P("Version"))/lower)*name/function(data,key,value)
- data.metadata[key]=value
- end+fontdata*P("IsFixedPitch")*name/function(data,pitch)
- data.metadata.monospaced=toboolean(pitch,true)
- end+fontdata*P("FontBBox")*Ct(number^4)/function(data,boundingbox)
- data.metadata.boundingbox=boundingbox
- end+fontdata*((P("CharWidth")+P("CapHeight")+P("XHeight")+P("Descender")+P("Ascender")+P("ItalicAngle"))/lower)*number/function(data,key,value)
- data.metadata[key]=value
- end+P("Comment")*spacing*(P(false)+(fontdata*C("DESIGNSIZE")*number*rest)/set_1
-+(fontdata*C("TFM designsize")*number*rest)/set_1+(fontdata*C("DesignSize")*number*rest)/set_1+(fontdata*C("CODINGSCHEME")*words*rest)/set_1
-+(fontdata*C("CHECKSUM")*number*words*rest)/set_1
-+(fontdata*C("SPACE")*number*plus*minus*rest)/set_3
-+(fontdata*C("QUAD")*number*rest)/set_1
-+(fontdata*C("EXTRASPACE")*number*rest)/set_1
-+(fontdata*C("NUM")*number*number*number*rest)/set_3
-+(fontdata*C("DENOM")*number*number*rest)/set_2
-+(fontdata*C("SUP")*number*number*number*rest)/set_3
-+(fontdata*C("SUB")*number*number*rest)/set_2
-+(fontdata*C("SUPDROP")*number*rest)/set_1
-+(fontdata*C("SUBDROP")*number*rest)/set_1
-+(fontdata*C("DELIM")*number*number*rest)/set_2
-+(fontdata*C("AXISHEIGHT")*number*rest)/set_1
- )
-local fullparser=(P("StartFontMetrics")*fontdata*name/start )*(p_charmetrics+p_kernpairs+p_parameters+(1-P("EndFontMetrics")) )^0*(P("EndFontMetrics")/stop )
-local infoparser=(P("StartFontMetrics")*fontdata*name/start )*(p_parameters+(1-P("EndFontMetrics")) )^0*(P("EndFontMetrics")/stop )
-local function read(filename,parser)
- local afmblob=io.loaddata(filename)
- if afmblob then
- local data={
- resources={
- filename=resolvers.unresolve(filename),
- version=afm.version,
- creator="context mkiv",
- },
- properties={
- hasitalics=false,
- },
- goodies={},
- metadata={
- filename=file.removesuffix(file.basename(filename))
- },
- characters={
- },
- descriptions={
- },
- }
- if trace_loading then
- report_afm("parsing afm file %a",filename)
- end
- lpegmatch(parser,afmblob,1,data)
- return data
- else
- if trace_loading then
- report_afm("no valid afm file %a",filename)
- end
- return nil
- end
-end
-function readers.loadfont(afmname,pfbname)
- local data=read(resolvers.findfile(afmname),fullparser)
- if data then
- if not pfbname or pfbname=="" then
- pfbname=resolvers.findfile(file.replacesuffix(file.nameonly(afmname),"pfb"))
- end
- if pfbname and pfbname~="" then
- data.resources.filename=resolvers.unresolve(pfbname)
- get_indexes(data,pfbname)
- return data
- else
- report_afm("no pfb file for %a",afmname)
- end
- end
-end
-function readers.loadshapes(filename)
- local fullname=resolvers.findfile(filename) or ""
- if fullname=="" then
- return {
- filename="not found: "..filename,
- glyphs={}
- }
- else
- return {
- filename=fullname,
- format="opentype",
- glyphs=get_shapes(fullname) or {},
- units=1000,
- }
- end
-end
-function readers.getinfo(filename)
- local data=read(resolvers.findfile(filename),infoparser)
- if data then
- return data.metadata
- end
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-onr”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-one” 987c5c5ed3754ad2feab80985067d59e] ---
-
-if not modules then modules={} end modules ['font-one']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local fonts,logs,trackers,containers,resolvers=fonts,logs,trackers,containers,resolvers
-local next,type,tonumber,rawget=next,type,tonumber,rawget
-local match,gsub=string.match,string.gsub
-local abs=math.abs
-local P,S,R,Cmt,C,Ct,Cs,Carg=lpeg.P,lpeg.S,lpeg.R,lpeg.Cmt,lpeg.C,lpeg.Ct,lpeg.Cs,lpeg.Carg
-local lpegmatch,patterns=lpeg.match,lpeg.patterns
-local sortedhash=table.sortedhash
-local trace_features=false trackers.register("afm.features",function(v) trace_features=v end)
-local trace_indexing=false trackers.register("afm.indexing",function(v) trace_indexing=v end)
-local trace_loading=false trackers.register("afm.loading",function(v) trace_loading=v end)
-local trace_defining=false trackers.register("fonts.defining",function(v) trace_defining=v end)
-local report_afm=logs.reporter("fonts","afm loading")
-local setmetatableindex=table.setmetatableindex
-local derivetable=table.derive
-local findbinfile=resolvers.findbinfile
-local privateoffset=fonts.constructors and fonts.constructors.privateoffset or 0xF0000
-local definers=fonts.definers
-local readers=fonts.readers
-local constructors=fonts.constructors
-local afm=constructors.handlers.afm
-local pfb=constructors.handlers.pfb
-local otf=fonts.handlers.otf
-local otfreaders=otf.readers
-local otfenhancers=otf.enhancers
-local afmfeatures=constructors.features.afm
-local registerafmfeature=afmfeatures.register
-local afmenhancers=constructors.enhancers.afm
-local registerafmenhancer=afmenhancers.register
-afm.version=1.513
-afm.cache=containers.define("fonts","one",afm.version,true)
-afm.autoprefixed=true
-afm.helpdata={}
-afm.syncspace=true
-local overloads=fonts.mappings.overloads
-local applyruntimefixes=fonts.treatments and fonts.treatments.applyfixes
-function afm.load(filename)
- filename=resolvers.findfile(filename,'afm') or ""
- if filename~="" and not fonts.names.ignoredfile(filename) then
- local name=file.removesuffix(file.basename(filename))
- local data=containers.read(afm.cache,name)
- local attr=lfs.attributes(filename)
- local size=attr and attr.size or 0
- local time=attr and attr.modification or 0
- local pfbfile=file.replacesuffix(name,"pfb")
- local pfbname=resolvers.findfile(pfbfile,"pfb") or ""
- if pfbname=="" then
- pfbname=resolvers.findfile(file.basename(pfbfile),"pfb") or ""
- end
- local pfbsize=0
- local pfbtime=0
- if pfbname~="" then
- local attr=lfs.attributes(pfbname)
- pfbsize=attr.size or 0
- pfbtime=attr.modification or 0
- end
- if not data or data.size~=size or data.time~=time or data.pfbsize~=pfbsize or data.pfbtime~=pfbtime then
- report_afm("reading %a",filename)
- data=afm.readers.loadfont(filename,pfbname)
- if data then
- afmenhancers.apply(data,filename)
- fonts.mappings.addtounicode(data,filename)
- otfreaders.stripredundant(data)
- otfreaders.pack(data)
- data.size=size
- data.time=time
- data.pfbsize=pfbsize
- data.pfbtime=pfbtime
- report_afm("saving %a in cache",name)
- data=containers.write(afm.cache,name,data)
- data=containers.read(afm.cache,name)
- end
- end
- if data then
- otfreaders.unpack(data)
- otfreaders.expand(data)
- otfreaders.addunicodetable(data)
- otfenhancers.apply(data,filename,data)
- if applyruntimefixes then
- applyruntimefixes(filename,data)
- end
- end
- return data
- end
-end
-local uparser=fonts.mappings.makenameparser()
-local function enhance_unify_names(data,filename)
- local unicodevector=fonts.encodings.agl.unicodes
- local unicodes={}
- local names={}
- local private=data.private or privateoffset
- local descriptions=data.descriptions
- for name,blob in sortedhash(data.characters) do
- local code=unicodevector[name]
- if not code then
- code=lpegmatch(uparser,name)
- if type(code)~="number" then
- code=private
- private=private+1
- report_afm("assigning private slot %U for unknown glyph name %a",code,name)
- end
- end
- local index=blob.index
- unicodes[name]=code
- names[name]=index
- blob.name=name
- descriptions[code]={
- boundingbox=blob.boundingbox,
- width=blob.width,
- kerns=blob.kerns,
- index=index,
- name=name,
- }
- end
- for unicode,description in next,descriptions do
- local kerns=description.kerns
- if kerns then
- local krn={}
- for name,kern in next,kerns do
- local unicode=unicodes[name]
- if unicode then
- krn[unicode]=kern
- else
- end
- end
- description.kerns=krn
- end
- end
- data.characters=nil
- data.private=private
- local resources=data.resources
- local filename=resources.filename or file.removesuffix(file.basename(filename))
- resources.filename=resolvers.unresolve(filename)
- resources.unicodes=unicodes
- resources.marks={}
-end
-local everywhere={ ["*"]={ ["*"]=true } }
-local noflags={ false,false,false,false }
-local function enhance_normalize_features(data)
- local ligatures=setmetatableindex("table")
- local kerns=setmetatableindex("table")
- local extrakerns=setmetatableindex("table")
- for u,c in next,data.descriptions do
- local l=c.ligatures
- local k=c.kerns
- local e=c.extrakerns
- if l then
- ligatures[u]=l
- for u,v in next,l do
- l[u]={ ligature=v }
- end
- c.ligatures=nil
- end
- if k then
- kerns[u]=k
- for u,v in next,k do
- k[u]=v
- end
- c.kerns=nil
- end
- if e then
- extrakerns[u]=e
- for u,v in next,e do
- e[u]=v
- end
- c.extrakerns=nil
- end
- end
- local features={
- gpos={},
- gsub={},
- }
- local sequences={
- }
- if next(ligatures) then
- features.gsub.liga=everywhere
- data.properties.hasligatures=true
- sequences[#sequences+1]={
- features={
- liga=everywhere,
- },
- flags=noflags,
- name="s_s_0",
- nofsteps=1,
- order={ "liga" },
- type="gsub_ligature",
- steps={
- {
- coverage=ligatures,
- },
- },
- }
- end
- if next(kerns) then
- features.gpos.kern=everywhere
- data.properties.haskerns=true
- sequences[#sequences+1]={
- features={
- kern=everywhere,
- },
- flags=noflags,
- name="p_s_0",
- nofsteps=1,
- order={ "kern" },
- type="gpos_pair",
- steps={
- {
- format="kern",
- coverage=kerns,
- },
- },
- }
- end
- if next(extrakerns) then
- features.gpos.extrakerns=everywhere
- data.properties.haskerns=true
- sequences[#sequences+1]={
- features={
- extrakerns=everywhere,
- },
- flags=noflags,
- name="p_s_1",
- nofsteps=1,
- order={ "extrakerns" },
- type="gpos_pair",
- steps={
- {
- format="kern",
- coverage=extrakerns,
- },
- },
- }
- end
- data.resources.features=features
- data.resources.sequences=sequences
-end
-local function enhance_fix_names(data)
- for k,v in next,data.descriptions do
- local n=v.name
- local r=overloads[n]
- if r then
- local name=r.name
- if trace_indexing then
- report_afm("renaming characters %a to %a",n,name)
- end
- v.name=name
- v.unicode=r.unicode
- end
- end
-end
-local addthem=function(rawdata,ligatures)
- if ligatures then
- local descriptions=rawdata.descriptions
- local resources=rawdata.resources
- local unicodes=resources.unicodes
- for ligname,ligdata in next,ligatures do
- local one=descriptions[unicodes[ligname]]
- if one then
- for _,pair in next,ligdata do
- local two=unicodes[pair[1]]
- local three=unicodes[pair[2]]
- if two and three then
- local ol=one.ligatures
- if ol then
- if not ol[two] then
- ol[two]=three
- end
- else
- one.ligatures={ [two]=three }
- end
- end
- end
- end
- end
- end
-end
-local function enhance_add_ligatures(rawdata)
- addthem(rawdata,afm.helpdata.ligatures)
-end
-local function enhance_add_extra_kerns(rawdata)
- local descriptions=rawdata.descriptions
- local resources=rawdata.resources
- local unicodes=resources.unicodes
- local function do_it_left(what)
- if what then
- for unicode,description in next,descriptions do
- local kerns=description.kerns
- if kerns then
- local extrakerns
- for complex,simple in next,what do
- complex=unicodes[complex]
- simple=unicodes[simple]
- if complex and simple then
- local ks=kerns[simple]
- if ks and not kerns[complex] then
- if extrakerns then
- extrakerns[complex]=ks
- else
- extrakerns={ [complex]=ks }
- end
- end
- end
- end
- if extrakerns then
- description.extrakerns=extrakerns
- end
- end
- end
- end
- end
- local function do_it_copy(what)
- if what then
- for complex,simple in next,what do
- complex=unicodes[complex]
- simple=unicodes[simple]
- if complex and simple then
- local complexdescription=descriptions[complex]
- if complexdescription then
- local simpledescription=descriptions[complex]
- if simpledescription then
- local extrakerns
- local kerns=simpledescription.kerns
- if kerns then
- for unicode,kern in next,kerns do
- if extrakerns then
- extrakerns[unicode]=kern
- else
- extrakerns={ [unicode]=kern }
- end
- end
- end
- local extrakerns=simpledescription.extrakerns
- if extrakerns then
- for unicode,kern in next,extrakerns do
- if extrakerns then
- extrakerns[unicode]=kern
- else
- extrakerns={ [unicode]=kern }
- end
- end
- end
- if extrakerns then
- complexdescription.extrakerns=extrakerns
- end
- end
- end
- end
- end
- end
- end
- do_it_left(afm.helpdata.leftkerned)
- do_it_left(afm.helpdata.bothkerned)
- do_it_copy(afm.helpdata.bothkerned)
- do_it_copy(afm.helpdata.rightkerned)
-end
-local function adddimensions(data)
- if data then
- for unicode,description in next,data.descriptions do
- local bb=description.boundingbox
- if bb then
- local ht=bb[4]
- local dp=-bb[2]
- if ht==0 or ht<0 then
- else
- description.height=ht
- end
- if dp==0 or dp<0 then
- else
- description.depth=dp
- end
- end
- end
- end
-end
-local function copytotfm(data)
- if data and data.descriptions then
- local metadata=data.metadata
- local resources=data.resources
- local properties=derivetable(data.properties)
- local descriptions=derivetable(data.descriptions)
- local goodies=derivetable(data.goodies)
- local characters={}
- local parameters={}
- local unicodes=resources.unicodes
- for unicode,description in next,data.descriptions do
- characters[unicode]={}
- end
- local filename=constructors.checkedfilename(resources)
- local fontname=metadata.fontname or metadata.fullname
- local fullname=metadata.fullname or metadata.fontname
- local endash=0x2013
- local emdash=0x2014
- local space=0x0020
- local spacer="space"
- local spaceunits=500
- local monospaced=metadata.monospaced
- local charwidth=metadata.charwidth
- local italicangle=metadata.italicangle
- local charxheight=metadata.xheight and metadata.xheight>0 and metadata.xheight
- properties.monospaced=monospaced
- parameters.italicangle=italicangle
- parameters.charwidth=charwidth
- parameters.charxheight=charxheight
- local d_endash=descriptions[endash]
- local d_emdash=descriptions[emdash]
- local d_space=descriptions[space]
- if not d_space or d_space==0 then
- d_space=d_endash
- end
- if d_space then
- spaceunits,spacer=d_space.width or 0,"space"
- end
- if properties.monospaced then
- if spaceunits==0 and d_emdash then
- spaceunits,spacer=d_emdash.width or 0,"emdash"
- end
- else
- if spaceunits==0 and d_endash then
- spaceunits,spacer=d_emdash.width or 0,"endash"
- end
- end
- if spaceunits==0 and charwidth then
- spaceunits,spacer=charwidth or 0,"charwidth"
- end
- if spaceunits==0 then
- spaceunits=tonumber(spaceunits) or 500
- end
- if spaceunits==0 then
- spaceunits=500
- end
- parameters.slant=0
- parameters.space=spaceunits
- parameters.space_stretch=500
- parameters.space_shrink=333
- parameters.x_height=400
- parameters.quad=1000
- if italicangle and italicangle~=0 then
- parameters.italicangle=italicangle
- parameters.italicfactor=math.cos(math.rad(90+italicangle))
- parameters.slant=- math.tan(italicangle*math.pi/180)
- end
- if monospaced then
- parameters.space_stretch=0
- parameters.space_shrink=0
- elseif afm.syncspace then
- parameters.space_stretch=spaceunits/2
- parameters.space_shrink=spaceunits/3
- end
- parameters.extra_space=parameters.space_shrink
- if charxheight then
- parameters.x_height=charxheight
- else
- local x=0x0078
- if x then
- local x=descriptions[x]
- if x then
- parameters.x_height=x.height
- end
- end
- end
- if metadata.sup then
- local dummy={ 0,0,0 }
- parameters[ 1]=metadata.designsize or 0
- parameters[ 2]=metadata.checksum or 0
- parameters[ 3],
- parameters[ 4],
- parameters[ 5]=unpack(metadata.space or dummy)
- parameters[ 6]=metadata.quad or 0
- parameters[ 7]=metadata.extraspace or 0
- parameters[ 8],
- parameters[ 9],
- parameters[10]=unpack(metadata.num or dummy)
- parameters[11],
- parameters[12]=unpack(metadata.denom or dummy)
- parameters[13],
- parameters[14],
- parameters[15]=unpack(metadata.sup or dummy)
- parameters[16],
- parameters[17]=unpack(metadata.sub or dummy)
- parameters[18]=metadata.supdrop or 0
- parameters[19]=metadata.subdrop or 0
- parameters[20],
- parameters[21]=unpack(metadata.delim or dummy)
- parameters[22]=metadata.axisheight or 0
- end
- parameters.designsize=(metadata.designsize or 10)*65536
- parameters.ascender=abs(metadata.ascender or 0)
- parameters.descender=abs(metadata.descender or 0)
- parameters.units=1000
- properties.spacer=spacer
- properties.encodingbytes=2
- properties.format=fonts.formats[filename] or "type1"
- properties.filename=filename
- properties.fontname=fontname
- properties.fullname=fullname
- properties.psname=fullname
- properties.name=filename or fullname or fontname
- properties.private=properties.private or data.private or privateoffset
- if next(characters) then
- return {
- characters=characters,
- descriptions=descriptions,
- parameters=parameters,
- resources=resources,
- properties=properties,
- goodies=goodies,
- }
- end
- end
- return nil
-end
-function afm.setfeatures(tfmdata,features)
- local okay=constructors.initializefeatures("afm",tfmdata,features,trace_features,report_afm)
- if okay then
- return constructors.collectprocessors("afm",tfmdata,features,trace_features,report_afm)
- else
- return {}
- end
-end
-local function addtables(data)
- local resources=data.resources
- local lookuptags=resources.lookuptags
- local unicodes=resources.unicodes
- if not lookuptags then
- lookuptags={}
- resources.lookuptags=lookuptags
- end
- setmetatableindex(lookuptags,function(t,k)
- local v=type(k)=="number" and ("lookup "..k) or k
- t[k]=v
- return v
- end)
- if not unicodes then
- unicodes={}
- resources.unicodes=unicodes
- setmetatableindex(unicodes,function(t,k)
- setmetatableindex(unicodes,nil)
- for u,d in next,data.descriptions do
- local n=d.name
- if n then
- t[n]=u
- end
- end
- return rawget(t,k)
- end)
- end
- constructors.addcoreunicodes(unicodes)
-end
-local function afmtotfm(specification)
- local afmname=specification.filename or specification.name
- if specification.forced=="afm" or specification.format=="afm" then
- if trace_loading then
- report_afm("forcing afm format for %a",afmname)
- end
- else
- local tfmname=findbinfile(afmname,"ofm") or ""
- if tfmname~="" then
- if trace_loading then
- report_afm("fallback from afm to tfm for %a",afmname)
- end
- return
- end
- end
- if afmname~="" then
- local features=constructors.checkedfeatures("afm",specification.features.normal)
- specification.features.normal=features
- constructors.hashinstance(specification,true)
- specification=definers.resolve(specification)
- local cache_id=specification.hash
- local tfmdata=containers.read(constructors.cache,cache_id)
- if not tfmdata then
- local rawdata=afm.load(afmname)
- if rawdata and next(rawdata) then
- addtables(rawdata)
- adddimensions(rawdata)
- tfmdata=copytotfm(rawdata)
- if tfmdata and next(tfmdata) then
- local shared=tfmdata.shared
- if not shared then
- shared={}
- tfmdata.shared=shared
- end
- shared.rawdata=rawdata
- shared.dynamics={}
- tfmdata.changed={}
- shared.features=features
- shared.processes=afm.setfeatures(tfmdata,features)
- end
- elseif trace_loading then
- report_afm("no (valid) afm file found with name %a",afmname)
- end
- tfmdata=containers.write(constructors.cache,cache_id,tfmdata)
- end
- return tfmdata
- end
-end
-local function read_from_afm(specification)
- local tfmdata=afmtotfm(specification)
- if tfmdata then
- tfmdata.properties.name=specification.name
- tfmdata=constructors.scale(tfmdata,specification)
- local allfeatures=tfmdata.shared.features or specification.features.normal
- constructors.applymanipulators("afm",tfmdata,allfeatures,trace_features,report_afm)
- fonts.loggers.register(tfmdata,'afm',specification)
- end
- return tfmdata
-end
-registerafmfeature {
- name="mode",
- description="mode",
- initializers={
- base=otf.modeinitializer,
- node=otf.modeinitializer,
- }
-}
-registerafmfeature {
- name="features",
- description="features",
- default=true,
- initializers={
- node=otf.nodemodeinitializer,
- base=otf.basemodeinitializer,
- },
- processors={
- node=otf.featuresprocessor,
- }
-}
-fonts.formats.afm="type1"
-fonts.formats.pfb="type1"
-local function check_afm(specification,fullname)
- local foundname=findbinfile(fullname,'afm') or ""
- if foundname=="" then
- foundname=fonts.names.getfilename(fullname,"afm") or ""
- end
- if fullname and foundname=="" and afm.autoprefixed then
- local encoding,shortname=match(fullname,"^(.-)%-(.*)$")
- if encoding and shortname and fonts.encodings.known[encoding] then
- shortname=findbinfile(shortname,'afm') or ""
- if shortname~="" then
- foundname=shortname
- if trace_defining then
- report_afm("stripping encoding prefix from filename %a",afmname)
- end
- end
- end
- end
- if foundname~="" then
- specification.filename=foundname
- specification.format="afm"
- return read_from_afm(specification)
- end
-end
-function readers.afm(specification,method)
- local fullname=specification.filename or ""
- local tfmdata=nil
- if fullname=="" then
- local forced=specification.forced or ""
- if forced~="" then
- tfmdata=check_afm(specification,specification.name.."."..forced)
- end
- if not tfmdata then
- local check_tfm=readers.check_tfm
- method=(check_tfm and (method or definers.method or "afm or tfm")) or "afm"
- if method=="tfm" then
- tfmdata=check_tfm(specification,specification.name)
- elseif method=="afm" then
- tfmdata=check_afm(specification,specification.name)
- elseif method=="tfm or afm" then
- tfmdata=check_tfm(specification,specification.name) or check_afm(specification,specification.name)
- else
- tfmdata=check_afm(specification,specification.name) or check_tfm(specification,specification.name)
- end
- end
- else
- tfmdata=check_afm(specification,fullname)
- end
- return tfmdata
-end
-function readers.pfb(specification,method)
- local original=specification.specification
- if trace_defining then
- report_afm("using afm reader for %a",original)
- end
- specification.forced="afm"
- local function swap(name)
- local value=specification[swap]
- if value then
- specification[swap]=gsub("%.pfb",".afm",1)
- end
- end
- swap("filename")
- swap("fullname")
- swap("forcedname")
- swap("specification")
- return readers.afm(specification,method)
-end
-registerafmenhancer("unify names",enhance_unify_names)
-registerafmenhancer("add ligatures",enhance_add_ligatures)
-registerafmenhancer("add extra kerns",enhance_add_extra_kerns)
-registerafmenhancer("normalize features",enhance_normalize_features)
-registerafmenhancer("check extra features",otfenhancers.enhance)
-registerafmenhancer("fix names",enhance_fix_names)
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-one”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-afk” 54d554530e75c57c56ee76234724e26d] ---
-
-if not modules then modules={} end modules ['font-afk']={
- version=1.001,
- comment="companion to font-lib.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files",
- dataonly=true,
-}
-local allocate=utilities.storage.allocate
-fonts.handlers.afm.helpdata={
- ligatures=allocate {
- ['f']={
- { 'f','ff' },
- { 'i','fi' },
- { 'l','fl' },
- },
- ['ff']={
- { 'i','ffi' }
- },
- ['fi']={
- { 'i','fii' }
- },
- ['fl']={
- { 'i','fli' }
- },
- ['s']={
- { 't','st' }
- },
- ['i']={
- { 'j','ij' }
- },
- },
- texligatures=allocate {
- ['quoteleft']={
- { 'quoteleft','quotedblleft' }
- },
- ['quoteright']={
- { 'quoteright','quotedblright' }
- },
- ['hyphen']={
- { 'hyphen','endash' }
- },
- ['endash']={
- { 'hyphen','emdash' }
- }
- },
- leftkerned=allocate {
- 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",
- },
- rightkerned=allocate {
- 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",
- },
- bothkerned=allocate {
- 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",
- }
-}
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-afk”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “fonts-tfm” 3bbba3214fd0b8c6f35ad85592fc2917] ---
-
-if not modules then modules={} end modules ['luatex-fonts-tfm']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local next,type=next,type
-local match,format=string.match,string.format
-local concat,sortedhash=table.concat,table.sortedhash
-local idiv=number.idiv
-local trace_defining=false trackers.register("fonts.defining",function(v) trace_defining=v end)
-local trace_features=false trackers.register("tfm.features",function(v) trace_features=v end)
-local report_defining=logs.reporter("fonts","defining")
-local report_tfm=logs.reporter("fonts","tfm loading")
-local findbinfile=resolvers.findbinfile
-local setmetatableindex=table.setmetatableindex
-local fonts=fonts
-local handlers=fonts.handlers
-local helpers=fonts.helpers
-local readers=fonts.readers
-local constructors=fonts.constructors
-local encodings=fonts.encodings
-local tfm=constructors.handlers.tfm
-tfm.version=1.000
-tfm.maxnestingdepth=5
-tfm.maxnestingsize=65536*1024
-local otf=fonts.handlers.otf
-local otfenhancers=otf.enhancers
-local tfmfeatures=constructors.features.tfm
-local registertfmfeature=tfmfeatures.register
-local tfmenhancers=constructors.enhancers.tfm
-local registertfmenhancer=tfmenhancers.register
-local charcommand=helpers.commands.char
-constructors.resolvevirtualtoo=false
-fonts.formats.tfm="type1"
-fonts.formats.ofm="type1"
-function tfm.setfeatures(tfmdata,features)
- local okay=constructors.initializefeatures("tfm",tfmdata,features,trace_features,report_tfm)
- if okay then
- return constructors.collectprocessors("tfm",tfmdata,features,trace_features,report_tfm)
- else
- return {}
- end
-end
-local depth={}
-local loadtfm=font.read_tfm
-local loadvf=font.read_vf
-local function read_from_tfm(specification)
- local filename=specification.filename
- local size=specification.size
- depth[filename]=(depth[filename] or 0)+1
- if trace_defining then
- report_defining("loading tfm file %a at size %s",filename,size)
- end
- local tfmdata=loadtfm(filename,size)
- if tfmdata then
- local features=specification.features and specification.features.normal or {}
- local features=constructors.checkedfeatures("tfm",features)
- specification.features.normal=features
- local newtfmdata=(depth[filename]==1) and tfm.reencode(tfmdata,specification)
- if newtfmdata then
- tfmdata=newtfmdata
- end
- local resources=tfmdata.resources or {}
- local properties=tfmdata.properties or {}
- local parameters=tfmdata.parameters or {}
- local shared=tfmdata.shared or {}
- shared.features=features
- shared.resources=resources
- properties.name=tfmdata.name
- properties.fontname=tfmdata.fontname
- properties.psname=tfmdata.psname
- properties.fullname=tfmdata.fullname
- properties.filename=specification.filename
- properties.format=tfmdata.format or fonts.formats.tfm
- properties.usedbitmap=tfmdata.usedbitmap
- tfmdata.properties=properties
- tfmdata.resources=resources
- tfmdata.parameters=parameters
- tfmdata.shared=shared
- shared.rawdata={ resources=resources }
- shared.features=features
- if newtfmdata then
- if not resources.marks then
- resources.marks={}
- end
- if not resources.sequences then
- resources.sequences={}
- end
- if not resources.features then
- resources.features={
- gsub={},
- gpos={},
- }
- end
- if not tfmdata.changed then
- tfmdata.changed={}
- end
- if not tfmdata.descriptions then
- tfmdata.descriptions=tfmdata.characters
- end
- otf.readers.addunicodetable(tfmdata)
- tfmenhancers.apply(tfmdata,filename)
- constructors.applymanipulators("tfm",tfmdata,features,trace_features,report_tfm)
- otf.readers.unifymissing(tfmdata)
- fonts.mappings.addtounicode(tfmdata,filename)
- tfmdata.tounicode=1
- local tounicode=fonts.mappings.tounicode
- for unicode,v in next,tfmdata.characters do
- local u=v.unicode
- if u then
- v.tounicode=tounicode(u)
- end
- end
- if tfmdata.usedbitmap then
- tfm.addtounicode(tfmdata)
- end
- end
- shared.processes=next(features) and tfm.setfeatures(tfmdata,features) or nil
- if size<0 then
- size=idiv(65536*-size,100)
- end
- parameters.factor=1
- parameters.units=1000
- parameters.size=size
- parameters.slant=parameters.slant or parameters[1] or 0
- parameters.space=parameters.space or parameters[2] or 0
- parameters.space_stretch=parameters.space_stretch or parameters[3] or 0
- parameters.space_shrink=parameters.space_shrink or parameters[4] or 0
- parameters.x_height=parameters.x_height or parameters[5] or 0
- parameters.quad=parameters.quad or parameters[6] or 0
- parameters.extra_space=parameters.extra_space or parameters[7] or 0
- constructors.enhanceparameters(parameters)
- properties.private=properties.private or tfmdata.private or privateoffset
- if newtfmdata then
- elseif constructors.resolvevirtualtoo then
- fonts.loggers.register(tfmdata,file.suffix(filename),specification)
- local vfname=findbinfile(specification.name,'ovf')
- if vfname and vfname~="" then
- local vfdata=loadvf(vfname,size)
- if vfdata then
- local chars=tfmdata.characters
- for k,v in next,vfdata.characters do
- chars[k].commands=v.commands
- end
- properties.virtualized=true
- tfmdata.fonts=vfdata.fonts
- tfmdata.type="virtual"
- local fontlist=vfdata.fonts
- local name=file.nameonly(filename)
- for i=1,#fontlist do
- local n=fontlist[i].name
- local s=fontlist[i].size
- local d=depth[filename]
- s=constructors.scaled(s,vfdata.designsize)
- if d>tfm.maxnestingdepth then
- report_defining("too deeply nested virtual font %a with size %a, max nesting depth %s",n,s,tfm.maxnestingdepth)
- fontlist[i]={ id=0 }
- elseif (d>1) and (s>tfm.maxnestingsize) then
- report_defining("virtual font %a exceeds size %s",n,s)
- fontlist[i]={ id=0 }
- else
- local t,id=constructors.readanddefine(n,s)
- fontlist[i]={ id=id }
- end
- end
- end
- end
- end
- properties.haskerns=true
- properties.hasligatures=true
- properties.hasitalics=true
- resources.unicodes={}
- resources.lookuptags={}
- depth[filename]=depth[filename]-1
- return tfmdata
- else
- depth[filename]=depth[filename]-1
- end
-end
-local function check_tfm(specification,fullname)
- local foundname=findbinfile(fullname,'tfm') or ""
- if foundname=="" then
- foundname=findbinfile(fullname,'ofm') or ""
- end
- if foundname=="" then
- foundname=fonts.names.getfilename(fullname,"tfm") or ""
- end
- if foundname~="" then
- specification.filename=foundname
- specification.format="ofm"
- return read_from_tfm(specification)
- elseif trace_defining then
- report_defining("loading tfm with name %a fails",specification.name)
- end
-end
-readers.check_tfm=check_tfm
-function readers.tfm(specification)
- local fullname=specification.filename or ""
- if fullname=="" then
- local forced=specification.forced or ""
- if forced~="" then
- fullname=specification.name.."."..forced
- else
- fullname=specification.name
- end
- end
- return check_tfm(specification,fullname)
-end
-readers.ofm=readers.tfm
-do
- local outfiles={}
- local tfmcache=table.setmetatableindex(function(t,tfmdata)
- local id=font.define(tfmdata)
- t[tfmdata]=id
- return id
- end)
- local encdone=table.setmetatableindex("table")
- function tfm.reencode(tfmdata,specification)
- local features=specification.features
- if not features then
- return
- end
- local features=features.normal
- if not features then
- return
- end
- local tfmfile=file.basename(tfmdata.name)
- local encfile=features.reencode
- local pfbfile=features.pfbfile
- local bitmap=features.bitmap
- if not encfile then
- return
- end
- local pfbfile=outfiles[tfmfile]
- if pfbfile==nil then
- if bitmap then
- pfbfile=false
- elseif type(pfbfile)~="string" then
- pfbfile=tfmfile
- end
- if type(pfbfile)=="string" then
- pfbfile=file.addsuffix(pfbfile,"pfb")
- report_tfm("using type1 shapes from %a for %a",pfbfile,tfmfile)
- else
- report_tfm("using bitmap shapes for %a",tfmfile)
- pfbfile=false
- end
- outfiles[tfmfile]=pfbfile
- end
- local encoding=false
- local vector=false
- if type(pfbfile)=="string" then
- local pfb=constructors.handlers.pfb
- if pfb and pfb.loadvector then
- local v,e=pfb.loadvector(pfbfile)
- if v then
- vector=v
- end
- if e then
- encoding=e
- end
- end
- end
- if type(encfile)=="string" and encfile~="auto" then
- encoding=fonts.encodings.load(file.addsuffix(encfile,"enc"))
- if encoding then
- encoding=encoding.vector
- end
- end
- if not encoding then
- report_tfm("bad encoding for %a, quitting",tfmfile)
- return
- end
- local unicoding=fonts.encodings.agl and fonts.encodings.agl.unicodes
- local virtualid=tfmcache[tfmdata]
- local tfmdata=table.copy(tfmdata)
- local characters={}
- local originals=tfmdata.characters
- local indices={}
- local parentfont={ "font",1 }
- local private=tfmdata.privateoffset or constructors.privateoffset
- local reported=encdone[tfmfile][encfile]
- local backmap=vector and table.swapped(vector)
- local done={}
- for index,name in sortedhash(encoding) do
- local unicode=unicoding[name]
- local original=originals[index]
- if original then
- if unicode then
- original.unicode=unicode
- else
- unicode=private
- private=private+1
- if not reported then
- report_tfm("glyph %a in font %a with encoding %a gets unicode %U",name,tfmfile,encfile,unicode)
- end
- end
- characters[unicode]=original
- indices[index]=unicode
- original.name=name
- if backmap then
- original.index=backmap[name]
- else
- original.commands={ parentfont,charcommand[index] }
- original.oindex=index
- end
- done[name]=true
- elseif not done[name] then
- report_tfm("bad index %a in font %a with name %a",index,tfmfile,name)
- end
- end
- encdone[tfmfile][encfile]=true
- for k,v in next,characters do
- local kerns=v.kerns
- if kerns then
- local t={}
- for k,v in next,kerns do
- local i=indices[k]
- if i then
- t[i]=v
- end
- end
- v.kerns=next(t) and t or nil
- end
- local ligatures=v.ligatures
- if ligatures then
- local t={}
- for k,v in next,ligatures do
- local i=indices[k]
- if i then
- t[i]=v
- v.char=indices[v.char]
- end
- end
- v.ligatures=next(t) and t or nil
- end
- end
- tfmdata.fonts={ { id=virtualid } }
- tfmdata.characters=characters
- tfmdata.fullname=tfmdata.fullname or tfmdata.name
- tfmdata.psname=file.nameonly(pfbfile or tfmdata.name)
- tfmdata.filename=pfbfile
- tfmdata.encodingbytes=2
- tfmdata.format="type1"
- tfmdata.tounicode=1
- tfmdata.embedding="subset"
- tfmdata.usedbitmap=bitmap and virtualid
- tfmdata.private=private
- return tfmdata
- end
-end
-do
- local template=[[
-/CIDInit /ProcSet findresource begin
- 12 dict begin
- begincmap
- /CIDSystemInfo << /Registry (TeX) /Ordering (bitmap-%s) /Supplement 0 >> def
- /CMapName /TeX-bitmap-%s def
- /CMapType 2 def
- 1 begincodespacerange
- <00>
- endcodespacerange
- %s beginbfchar
-%s
- endbfchar
- endcmap
-CMapName currentdict /CMap defineresource pop end
-end
-end
-]]
- local flushstreamobject=lpdf and lpdf.flushstreamobject
- local setfontattributes=lpdf and lpdf.setfontattributes
- if not flushstreamobject then
- flushstreamobject=function(data)
- return pdf.obj { immediate=true,type="stream",string=data }
- end
- end
- if not setfontattributes then
- setfontattributes=function(id,data)
- return pdf.setfontattributes(id,data)
- end
- end
- function tfm.addtounicode(tfmdata)
- local id=tfmdata.usedbitmap
- local map={}
- local char={}
- for k,v in next,tfmdata.characters do
- local index=v.oindex
- local tounicode=v.tounicode
- if index and tounicode then
- map[index]=tounicode
- end
- end
- for k,v in sortedhash(map) do
- char[#char+1]=format("<%02X> <%s>",k,v)
- end
- char=concat(char,"\n")
- local stream=format(template,id,id,#char,char)
- local reference=flushstreamobject(stream,nil,true)
- setfontattributes(id,format("/ToUnicode %i 0 R",reference))
- end
-end
-do
- local everywhere={ ["*"]={ ["*"]=true } }
- local noflags={ false,false,false,false }
- local function enhance_normalize_features(data)
- local ligatures=setmetatableindex("table")
- local kerns=setmetatableindex("table")
- local characters=data.characters
- for u,c in next,characters do
- local l=c.ligatures
- local k=c.kerns
- if l then
- ligatures[u]=l
- for u,v in next,l do
- l[u]={ ligature=v.char }
- end
- c.ligatures=nil
- end
- if k then
- kerns[u]=k
- for u,v in next,k do
- k[u]=v
- end
- c.kerns=nil
- end
- end
- for u,l in next,ligatures do
- for k,v in next,l do
- local vl=v.ligature
- local dl=ligatures[vl]
- if dl then
- for kk,vv in next,dl do
- v[kk]=vv
- end
- end
- end
- end
- local features={
- gpos={},
- gsub={},
- }
- local sequences={
- }
- if next(ligatures) then
- features.gsub.liga=everywhere
- data.properties.hasligatures=true
- sequences[#sequences+1]={
- features={
- liga=everywhere,
- },
- flags=noflags,
- name="s_s_0",
- nofsteps=1,
- order={ "liga" },
- type="gsub_ligature",
- steps={
- {
- coverage=ligatures,
- },
- },
- }
- end
- if next(kerns) then
- features.gpos.kern=everywhere
- data.properties.haskerns=true
- sequences[#sequences+1]={
- features={
- kern=everywhere,
- },
- flags=noflags,
- name="p_s_0",
- nofsteps=1,
- order={ "kern" },
- type="gpos_pair",
- steps={
- {
- format="kern",
- coverage=kerns,
- },
- },
- }
- end
- data.resources.features=features
- data.resources.sequences=sequences
- data.shared.resources=data.shared.resources or resources
- end
- registertfmenhancer("normalize features",enhance_normalize_features)
- registertfmenhancer("check extra features",otfenhancers.enhance)
-end
-registertfmfeature {
- name="mode",
- description="mode",
- initializers={
- base=otf.modeinitializer,
- node=otf.modeinitializer,
- }
-}
-registertfmfeature {
- name="features",
- description="features",
- default=true,
- initializers={
- base=otf.basemodeinitializer,
- node=otf.nodemodeinitializer,
- },
- processors={
- node=otf.featuresprocessor,
- }
-}
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “fonts-tfm”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-lua” 55b281fb98f7bd848fc19928f376f647] ---
-
-if not modules then modules={} end modules ['font-lua']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local trace_defining=false trackers.register("fonts.defining",function(v) trace_defining=v end)
-local report_lua=logs.reporter("fonts","lua loading")
-local fonts=fonts
-local readers=fonts.readers
-fonts.formats.lua="lua"
-local function check_lua(specification,fullname)
- local fullname=resolvers.findfile(fullname) or ""
- if fullname~="" then
- local loader=loadfile(fullname)
- loader=loader and loader()
- return loader and loader(specification)
- end
-end
-readers.check_lua=check_lua
-function readers.lua(specification)
- local original=specification.specification
- if trace_defining then
- report_lua("using lua reader for %a",original)
- end
- local fullname=specification.filename or ""
- if fullname=="" then
- local forced=specification.forced or ""
- if forced~="" then
- fullname=specification.name.."."..forced
- else
- fullname=specification.name
- end
- end
- return check_lua(specification,fullname)
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-lua”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-def” c525b9f55da1c736a1f6939c0a6f8f00] ---
-
-if not modules then modules={} end modules ['font-def']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local lower,gsub=string.lower,string.gsub
-local tostring,next=tostring,next
-local lpegmatch=lpeg.match
-local suffixonly,removesuffix,basename=file.suffix,file.removesuffix,file.basename
-local formatters=string.formatters
-local sortedhash,sortedkeys=table.sortedhash,table.sortedkeys
-local allocate=utilities.storage.allocate
-local trace_defining=false trackers .register("fonts.defining",function(v) trace_defining=v end)
-local directive_embedall=false directives.register("fonts.embedall",function(v) directive_embedall=v end)
-trackers.register("fonts.loading","fonts.defining","otf.loading","afm.loading","tfm.loading")
-local report_defining=logs.reporter("fonts","defining")
-local fonts=fonts
-local fontdata=fonts.hashes.identifiers
-local readers=fonts.readers
-local definers=fonts.definers
-local specifiers=fonts.specifiers
-local constructors=fonts.constructors
-local fontgoodies=fonts.goodies
-readers.sequence=allocate { 'otf','ttf','afm','tfm','lua' }
-local variants=allocate()
-specifiers.variants=variants
-definers.methods=definers.methods or {}
-local internalized=allocate()
-local loadedfonts=constructors.loadedfonts
-local designsizes=constructors.designsizes
-local resolvefile=fontgoodies and fontgoodies.filenames and fontgoodies.filenames.resolve or function(s) return s end
-local function makespecification(specification,lookup,name,sub,method,detail,size)
- size=size or 655360
- if not lookup or lookup=="" then
- lookup=definers.defaultlookup
- end
- if trace_defining then
- report_defining("specification %a, lookup %a, name %a, sub %a, method %a, detail %a",
- specification,lookup,name,sub,method,detail)
- end
- local t={
- lookup=lookup,
- specification=specification,
- size=size,
- name=name,
- sub=sub,
- method=method,
- detail=detail,
- resolved="",
- forced="",
- features={},
- }
- return t
-end
-definers.makespecification=makespecification
-if context then
- local splitter,splitspecifiers=nil,""
- local P,C,S,Cc,Cs=lpeg.P,lpeg.C,lpeg.S,lpeg.Cc,lpeg.Cs
- local left=P("(")
- local right=P(")")
- local colon=P(":")
- local space=P(" ")
- local lbrace=P("{")
- local rbrace=P("}")
- definers.defaultlookup="file"
- local prefixpattern=P(false)
- local function addspecifier(symbol)
- splitspecifiers=splitspecifiers..symbol
- local method=S(splitspecifiers)
- local lookup=C(prefixpattern)*colon
- local sub=left*C(P(1-left-right-method)^1)*right
- local specification=C(method)*C(P(1)^1)
- local name=Cs((lbrace/"")*(1-rbrace)^1*(rbrace/"")+(1-sub-specification)^1)
- splitter=P((lookup+Cc(""))*name*(sub+Cc(""))*(specification+Cc("")))
- end
- local function addlookup(str)
- prefixpattern=prefixpattern+P(str)
- end
- definers.addlookup=addlookup
- addlookup("file")
- addlookup("name")
- addlookup("spec")
- local function getspecification(str)
- return lpegmatch(splitter,str or "")
- end
- definers.getspecification=getspecification
- function definers.registersplit(symbol,action,verbosename)
- addspecifier(symbol)
- variants[symbol]=action
- if verbosename then
- variants[verbosename]=action
- end
- end
- function definers.analyze(specification,size)
- local lookup,name,sub,method,detail=getspecification(specification or "")
- return makespecification(specification,lookup,name,sub,method,detail,size)
- end
-end
-definers.resolvers=definers.resolvers or {}
-local resolvers=definers.resolvers
-function resolvers.file(specification)
- local name=resolvefile(specification.name)
- local suffix=lower(suffixonly(name))
- if fonts.formats[suffix] then
- specification.forced=suffix
- specification.forcedname=name
- specification.name=removesuffix(name)
- else
- specification.name=name
- end
-end
-function resolvers.name(specification)
- local resolve=fonts.names.resolve
- if resolve then
- local resolved,sub,subindex,instance=resolve(specification.name,specification.sub,specification)
- if resolved then
- specification.resolved=resolved
- specification.sub=sub
- specification.subindex=subindex
- if instance then
- specification.instance=instance
- local features=specification.features
- if not features then
- features={}
- specification.features=features
- end
- local normal=features.normal
- if not normal then
- normal={}
- features.normal=normal
- end
- normal.instance=instance
- end
- local suffix=lower(suffixonly(resolved))
- if fonts.formats[suffix] then
- specification.forced=suffix
- specification.forcedname=resolved
- specification.name=removesuffix(resolved)
- else
- specification.name=resolved
- end
- end
- else
- resolvers.file(specification)
- end
-end
-function resolvers.spec(specification)
- local resolvespec=fonts.names.resolvespec
- if resolvespec then
- local resolved,sub,subindex=resolvespec(specification.name,specification.sub,specification)
- if resolved then
- specification.resolved=resolved
- specification.sub=sub
- specification.subindex=subindex
- specification.forced=lower(suffixonly(resolved))
- specification.forcedname=resolved
- specification.name=removesuffix(resolved)
- end
- else
- resolvers.name(specification)
- end
-end
-function definers.resolve(specification)
- if not specification.resolved or specification.resolved=="" then
- local r=resolvers[specification.lookup]
- if r then
- r(specification)
- end
- end
- if specification.forced=="" then
- specification.forced=nil
- specification.forcedname=nil
- end
- specification.hash=lower(specification.name..' @ '..constructors.hashfeatures(specification))
- if specification.sub and specification.sub~="" then
- specification.hash=specification.sub..' @ '..specification.hash
- end
- return specification
-end
-function definers.applypostprocessors(tfmdata)
- local postprocessors=tfmdata.postprocessors
- if postprocessors then
- local properties=tfmdata.properties
- for i=1,#postprocessors do
- local extrahash=postprocessors[i](tfmdata)
- if type(extrahash)=="string" and extrahash~="" then
- extrahash=gsub(lower(extrahash),"[^a-z]","-")
- properties.fullname=formatters["%s-%s"](properties.fullname,extrahash)
- end
- end
- end
- return tfmdata
-end
-local function checkembedding(tfmdata)
- local properties=tfmdata.properties
- local embedding
- if directive_embedall then
- embedding="full"
- elseif properties and properties.filename and constructors.dontembed[properties.filename] then
- embedding="no"
- else
- embedding="subset"
- end
- if properties then
- properties.embedding=embedding
- else
- tfmdata.properties={ embedding=embedding }
- end
- tfmdata.embedding=embedding
-end
-local function checkfeatures(tfmdata)
- local resources=tfmdata.resources
- local shared=tfmdata.shared
- if resources and shared then
- local features=resources.features
- local usedfeatures=shared.features
- if features and usedfeatures then
- local usedlanguage=usedfeatures.language or "dflt"
- local usedscript=usedfeatures.script or "dflt"
- local function check(what)
- if what then
- local foundlanguages={}
- for feature,scripts in next,what do
- if usedscript=="auto" or scripts["*"] then
- elseif not scripts[usedscript] then
- else
- for script,languages in next,scripts do
- if languages["*"] then
- elseif context and not languages[usedlanguage] then
- report_defining("font %!font:name!, feature %a, script %a, no language %a",
- tfmdata,feature,script,usedlanguage)
- end
- end
- end
- for script,languages in next,scripts do
- for language in next,languages do
- foundlanguages[language]=true
- end
- end
- end
- if false then
- foundlanguages["*"]=nil
- foundlanguages=sortedkeys(foundlanguages)
- for feature,scripts in sortedhash(what) do
- for script,languages in next,scripts do
- if not languages["*"] then
- for i=1,#foundlanguages do
- local language=foundlanguages[i]
- if context and not languages[language] then
- report_defining("font %!font:name!, feature %a, script %a, no language %a",
- tfmdata,feature,script,language)
- end
- end
- end
- end
- end
- end
- end
- end
- check(features.gsub)
- check(features.gpos)
- end
- end
-end
-function definers.loadfont(specification)
- local hash=constructors.hashinstance(specification)
- local tfmdata=loadedfonts[hash]
- if not tfmdata then
- local forced=specification.forced or ""
- if forced~="" then
- local reader=readers[lower(forced)]
- tfmdata=reader and reader(specification)
- if not tfmdata then
- report_defining("forced type %a of %a not found",forced,specification.name)
- end
- else
- local sequence=readers.sequence
- for s=1,#sequence do
- local reader=sequence[s]
- if readers[reader] then
- if trace_defining then
- report_defining("trying (reader sequence driven) type %a for %a with file %a",reader,specification.name,specification.filename)
- end
- tfmdata=readers[reader](specification)
- if tfmdata then
- break
- else
- specification.filename=nil
- end
- end
- end
- end
- if tfmdata then
- tfmdata=definers.applypostprocessors(tfmdata)
- checkembedding(tfmdata)
- loadedfonts[hash]=tfmdata
- designsizes[specification.hash]=tfmdata.parameters.designsize
- checkfeatures(tfmdata)
- end
- end
- if not tfmdata then
- report_defining("font with asked name %a is not found using lookup %a",specification.name,specification.lookup)
- end
- return tfmdata
-end
-function constructors.readanddefine(name,size)
- local specification=definers.analyze(name,size)
- local method=specification.method
- if method and variants[method] then
- specification=variants[method](specification)
- end
- specification=definers.resolve(specification)
- local hash=constructors.hashinstance(specification)
- local id=definers.registered(hash)
- if not id then
- local tfmdata=definers.loadfont(specification)
- if tfmdata then
- tfmdata.properties.hash=hash
- id=font.define(tfmdata)
- definers.register(tfmdata,id)
- else
- id=0
- end
- end
- return fontdata[id],id
-end
-function definers.registered(hash)
- local id=internalized[hash]
- return id,id and fontdata[id]
-end
-function definers.register(tfmdata,id)
- if tfmdata and id then
- local hash=tfmdata.properties.hash
- if not hash then
- report_defining("registering font, id %a, name %a, invalid hash",id,tfmdata.properties.filename or "?")
- elseif not internalized[hash] then
- internalized[hash]=id
- if trace_defining then
- report_defining("registering font, id %s, hash %a",id,hash)
- end
- fontdata[id]=tfmdata
- end
- end
-end
-function definers.read(specification,size,id)
- statistics.starttiming(fonts)
- if type(specification)=="string" then
- specification=definers.analyze(specification,size)
- end
- local method=specification.method
- if method and variants[method] then
- specification=variants[method](specification)
- end
- specification=definers.resolve(specification)
- local hash=constructors.hashinstance(specification)
- local tfmdata=definers.registered(hash)
- if tfmdata then
- if trace_defining then
- report_defining("already hashed: %s",hash)
- end
- else
- tfmdata=definers.loadfont(specification)
- if tfmdata then
- if trace_defining then
- report_defining("loaded and hashed: %s",hash)
- end
- tfmdata.properties.hash=hash
- if id then
- definers.register(tfmdata,id)
- end
- else
- if trace_defining then
- report_defining("not loaded and hashed: %s",hash)
- end
- end
- end
- if not tfmdata then
- report_defining("unknown font %a, loading aborted",specification.name)
- elseif trace_defining and type(tfmdata)=="table" then
- local properties=tfmdata.properties or {}
- local parameters=tfmdata.parameters or {}
- report_defining("using %a font with id %a, name %a, size %a, bytes %a, encoding %a, fullname %a, filename %a",
- properties.format or "unknown",id or "-",properties.name,parameters.size,properties.encodingbytes,
- properties.encodingname,properties.fullname,basename(properties.filename))
- end
- statistics.stoptiming(fonts)
- return tfmdata
-end
-function font.getfont(id)
- return fontdata[id]
-end
-if not context then
- callbacks.register('define_font',definers.read,"definition of fonts (tfmdata preparation)")
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-def”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “fonts-def” 5ad79120ebc5e60f4d322fb3ee13bffe] ---
-
-if not modules then modules={} end modules ['luatex-fonts-def']={
- version=1.001,
- comment="companion to luatex-*.tex",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-if context then
- os.exit()
-end
-local fonts=fonts
-fonts.constructors.namemode="specification"
-function fonts.definers.getspecification(str)
- return "",str,"",":",str
-end
-local list={}
-local function issome () list.lookup='name' end
-local function isfile () list.lookup='file' end
-local function isname () list.lookup='name' end
-local function thename(s) list.name=s end
-local function issub (v) list.sub=v end
-local function iscrap (s) list.crap=string.lower(s) end
-local function iskey (k,v) list[k]=v end
-local function istrue (s) list[s]=true end
-local function isfalse(s) list[s]=false end
-local P,S,R,C,Cs=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs
-local spaces=P(" ")^0
-local namespec=Cs((P("{")/"")*(1-S("}"))^0*(P("}")/"")+(1-S("/:("))^0)
-local crapspec=spaces*P("/")*(((1-P(":"))^0)/iscrap)*spaces
-local filename_1=P("file:")/isfile*(namespec/thename)
-local filename_2=P("[")*P(true)/isfile*(((1-P("]"))^0)/thename)*P("]")
-local fontname_1=P("name:")/isname*(namespec/thename)
-local fontname_2=P(true)/issome*(namespec/thename)
-local sometext=R("az","AZ","09")^1
-local somekey=R("az","AZ","09")^1
-local somevalue=(P("{")/"")*(1-P("}"))^0*(P("}")/"")+(1-S(";"))^1
-local truevalue=P("+")*spaces*(sometext/istrue)
-local falsevalue=P("-")*spaces*(sometext/isfalse)
-local keyvalue=(C(somekey)*spaces*P("=")*spaces*C(somevalue))/iskey
-local somevalue=sometext/istrue
-local subvalue=P("(")*(C(P(1-S("()"))^1)/issub)*P(")")
-local option=spaces*(keyvalue+falsevalue+truevalue+somevalue)*spaces
-local options=P(":")*spaces*(P(";")^0*option)^0
-local pattern=(filename_1+filename_2+fontname_1+fontname_2)*subvalue^0*crapspec^0*options^0
-function fonts.definers.analyze(str,size)
- local specification=fonts.definers.makespecification(str,nil,nil,nil,":",nil,size)
- list={}
- lpeg.match(pattern,str)
- list.crap=nil
- if list.name then
- specification.name=list.name
- list.name=nil
- end
- if list.lookup then
- specification.lookup=list.lookup
- list.lookup=nil
- end
- if list.sub then
- specification.sub=list.sub
- list.sub=nil
- end
- specification.features.normal=fonts.handlers.otf.features.normalize(list)
- list=nil
- return specification
-end
-function fonts.definers.applypostprocessors(tfmdata)
- local postprocessors=tfmdata.postprocessors
- if postprocessors then
- for i=1,#postprocessors do
- local extrahash=postprocessors[i](tfmdata)
- if type(extrahash)=="string" and extrahash~="" then
- extrahash=string.gsub(lower(extrahash),"[^a-z]","-")
- tfmdata.properties.fullname=format("%s-%s",tfmdata.properties.fullname,extrahash)
- end
- end
- end
- return tfmdata
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “fonts-def”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “fonts-ext” 01015ab3758cdc2af29394e6d502a91a] ---
-
-if not modules then modules={} end modules ['luatex-fonts-ext']={
- version=1.001,
- comment="companion to luatex-*.tex",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-if context then
- os.exit()
-end
-local byte=string.byte
-local fonts=fonts
-local handlers=fonts.handlers
-local otf=handlers.otf
-local afm=handlers.afm
-local registerotffeature=otf.features.register
-local registerafmfeature=afm.features.register
-function fonts.loggers.onetimemessage() end
-fonts.protrusions=fonts.protrusions or {}
-fonts.protrusions.setups=fonts.protrusions.setups or {}
-local setups=fonts.protrusions.setups
-setups['default']={
- factor=1,
- left=1,
- right=1,
- [0x002C]={ 0,1 },
- [0x002E]={ 0,1 },
- [0x003A]={ 0,1 },
- [0x003B]={ 0,1 },
- [0x002D]={ 0,1 },
- [0x2013]={ 0,0.50 },
- [0x2014]={ 0,0.33 },
- [0x3001]={ 0,1 },
- [0x3002]={ 0,1 },
- [0x060C]={ 0,1 },
- [0x061B]={ 0,1 },
- [0x06D4]={ 0,1 },
-}
-local function initializeprotrusion(tfmdata,value)
- if value then
- local setup=setups[value]
- if setup then
- local factor,left,right=setup.factor or 1,setup.left or 1,setup.right or 1
- local emwidth=tfmdata.parameters.quad
- tfmdata.parameters.protrusion={
- auto=true,
- }
- for i,chr in next,tfmdata.characters do
- local v,pl,pr=setup[i],nil,nil
- if v then
- pl,pr=v[1],v[2]
- end
- if pl and pl~=0 then chr.left_protruding=left*pl*factor end
- if pr and pr~=0 then chr.right_protruding=right*pr*factor end
- end
- end
- end
-end
-local specification={
- name="protrusion",
- description="shift characters into the left and or right margin",
- initializers={
- base=initializeprotrusion,
- node=initializeprotrusion,
- }
-}
-registerotffeature(specification)
-registerafmfeature(specification)
-fonts.expansions=fonts.expansions or {}
-fonts.expansions.setups=fonts.expansions.setups or {}
-local setups=fonts.expansions.setups
-setups['default']={
- stretch=2,
- shrink=2,
- step=.5,
- factor=1,
- [byte('A')]=0.5,[byte('B')]=0.7,[byte('C')]=0.7,[byte('D')]=0.5,[byte('E')]=0.7,
- [byte('F')]=0.7,[byte('G')]=0.5,[byte('H')]=0.7,[byte('K')]=0.7,[byte('M')]=0.7,
- [byte('N')]=0.7,[byte('O')]=0.5,[byte('P')]=0.7,[byte('Q')]=0.5,[byte('R')]=0.7,
- [byte('S')]=0.7,[byte('U')]=0.7,[byte('W')]=0.7,[byte('Z')]=0.7,
- [byte('a')]=0.7,[byte('b')]=0.7,[byte('c')]=0.7,[byte('d')]=0.7,[byte('e')]=0.7,
- [byte('g')]=0.7,[byte('h')]=0.7,[byte('k')]=0.7,[byte('m')]=0.7,[byte('n')]=0.7,
- [byte('o')]=0.7,[byte('p')]=0.7,[byte('q')]=0.7,[byte('s')]=0.7,[byte('u')]=0.7,
- [byte('w')]=0.7,[byte('z')]=0.7,
- [byte('2')]=0.7,[byte('3')]=0.7,[byte('6')]=0.7,[byte('8')]=0.7,[byte('9')]=0.7,
-}
-local function initializeexpansion(tfmdata,value)
- if value then
- local setup=setups[value]
- if setup then
- local factor=setup.factor or 1
- tfmdata.parameters.expansion={
- stretch=10*(setup.stretch or 0),
- shrink=10*(setup.shrink or 0),
- step=10*(setup.step or 0),
- auto=true,
- }
- for i,chr in next,tfmdata.characters do
- local v=setup[i]
- if v and v~=0 then
- chr.expansion_factor=v*factor
- else
- chr.expansion_factor=factor
- end
- end
- end
- end
-end
-local specification={
- name="expansion",
- description="apply hz optimization",
- initializers={
- base=initializeexpansion,
- node=initializeexpansion,
- }
-}
-registerotffeature(specification)
-registerafmfeature(specification)
-if not otf.features.normalize then
- otf.features.normalize=function(t)
- if t.rand then
- t.rand="random"
- end
- return t
- end
-end
-function fonts.helpers.nametoslot(name)
- local t=type(name)
- if t=="string" then
- local tfmdata=fonts.hashes.identifiers[currentfont()]
- local shared=tfmdata and tfmdata.shared
- local fntdata=shared and shared.rawdata
- return fntdata and fntdata.resources.unicodes[name]
- elseif t=="number" then
- return n
- end
-end
-fonts.encodings=fonts.encodings or {}
-local reencodings={}
-fonts.encodings.reencodings=reencodings
-local function specialreencode(tfmdata,value)
- local encoding=value and reencodings[value]
- if encoding then
- local temp={}
- local char=tfmdata.characters
- for k,v in next,encoding do
- temp[k]=char[v]
- end
- for k,v in next,temp do
- char[k]=temp[k]
- end
- return string.format("reencoded:%s",value)
- end
-end
-local function initialize(tfmdata,value)
- tfmdata.postprocessors=tfmdata.postprocessors or {}
- table.insert(tfmdata.postprocessors,
- function(tfmdata)
- return specialreencode(tfmdata,value)
- end
- )
-end
-registerotffeature {
- name="reencode",
- description="reencode characters",
- manipulators={
- base=initialize,
- node=initialize,
- }
-}
-local function initialize(tfmdata,key,value)
- if value then
- tfmdata.mathparameters=nil
- end
-end
-registerotffeature {
- name="ignoremathconstants",
- description="ignore math constants table",
- initializers={
- base=initialize,
- node=initialize,
- }
-}
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “fonts-ext”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-imp-tex” 77c374b0ef00c2fb12188ec42beb4257] ---
-
-if not modules then modules={} end modules ['font-imp-tex']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local next=next
-local fonts=fonts
-local otf=fonts.handlers.otf
-local registerotffeature=otf.features.register
-local addotffeature=otf.addfeature
-local specification={
- type="ligature",
- order={ "tlig" },
- prepend=true,
- data={
- [0x2013]={ 0x002D,0x002D },
- [0x2014]={ 0x002D,0x002D,0x002D },
- },
-}
-addotffeature("tlig",specification)
-registerotffeature {
- name="tlig",
- description="tex ligatures",
-}
-local specification={
- type="substitution",
- order={ "trep" },
- prepend=true,
- data={
- [0x0027]=0x2019,
- },
-}
-addotffeature("trep",specification)
-registerotffeature {
- name="trep",
- description="tex replacements",
-}
-local anum_arabic={
- [0x0030]=0x0660,
- [0x0031]=0x0661,
- [0x0032]=0x0662,
- [0x0033]=0x0663,
- [0x0034]=0x0664,
- [0x0035]=0x0665,
- [0x0036]=0x0666,
- [0x0037]=0x0667,
- [0x0038]=0x0668,
- [0x0039]=0x0669,
-}
-local anum_persian={
- [0x0030]=0x06F0,
- [0x0031]=0x06F1,
- [0x0032]=0x06F2,
- [0x0033]=0x06F3,
- [0x0034]=0x06F4,
- [0x0035]=0x06F5,
- [0x0036]=0x06F6,
- [0x0037]=0x06F7,
- [0x0038]=0x06F8,
- [0x0039]=0x06F9,
-}
-local function valid(data)
- local features=data.resources.features
- if features then
- for k,v in next,features do
- for k,v in next,v do
- if v.arab then
- return true
- end
- end
- end
- end
-end
-local specification={
- {
- type="substitution",
- features={ arab={ urd=true,dflt=true } },
- order={ "anum" },
- data=anum_arabic,
- valid=valid,
- },
- {
- type="substitution",
- features={ arab={ urd=true } },
- order={ "anum" },
- data=anum_persian,
- valid=valid,
- },
-}
-addotffeature("anum",specification)
-registerotffeature {
- name="anum",
- description="arabic digits",
-}
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-imp-tex”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-imp-ligatures” 043daa4fcccf2560868da359d71d3a4a] ---
-
-if not modules then modules={} end modules ['font-imp-ligatures']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local lpegmatch=lpeg.match
-local utfsplit=utf.split
-local settings_to_array=utilities.parsers.settings_to_array
-local fonts=fonts
-local otf=fonts.handlers.otf
-local registerotffeature=otf.features.register
-local addotffeature=otf.addfeature
-local lookups={}
-local protect={}
-local revert={}
-local zwjchar=0x200C
-local zwj={ zwjchar }
-addotffeature {
- name="blockligatures",
- type="chainsubstitution",
- nocheck=true,
- prepend=true,
- future=true,
- lookups={
- {
- type="multiple",
- data=lookups,
- },
- },
- data={
- rules=protect,
- }
-}
-addotffeature {
- name="blockligatures",
- type="chainsubstitution",
- nocheck=true,
- append=true,
- overload=false,
- lookups={
- {
- type="ligature",
- data=lookups,
- },
- },
- data={
- rules=revert,
- }
-}
-registerotffeature {
- name='blockligatures',
- description='block certain ligatures',
-}
-local splitter=lpeg.splitat(":")
-local function blockligatures(str)
- local t=settings_to_array(str)
- for i=1,#t do
- local ti=t[i]
- local before,current,after=lpegmatch(splitter,ti)
- if current and after then
- if before then
- before=utfsplit(before)
- for i=1,#before do
- before[i]={ before[i] }
- end
- end
- if current then
- current=utfsplit(current)
- end
- if after then
- after=utfsplit(after)
- for i=1,#after do
- after[i]={ after[i] }
- end
- end
- else
- before=nil
- current=utfsplit(ti)
- after=nil
- end
- if #current>1 then
- local one=current[1]
- local two=current[2]
- lookups[one]={ one,zwjchar }
- local one={ one }
- local two={ two }
- local new=#protect+1
- protect[new]={
- before=before,
- current={ one,two },
- after=after,
- lookups={ 1 },
- }
- revert[new]={
- current={ one,zwj },
- after={ two },
- lookups={ 1 },
- }
- end
- end
-end
-otf.helpers.blockligatures=blockligatures
-if context then
- interfaces.implement {
- name="blockligatures",
- arguments="string",
- actions=blockligatures,
- }
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-imp-ligatures”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-imp-italics” fe1ca80fb5ea4a2f8d2d5c484e7ba913] ---
-
-if not modules then modules={} end modules ['font-imp-italics']={
- version=1.001,
- comment="companion to font-ini.mkiv and hand-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local next=next
-local fonts=fonts
-local handlers=fonts.handlers
-local registerotffeature=handlers.otf.features.register
-local registerafmfeature=handlers.afm.features.register
-local function initialize(tfmdata,key,value)
- for unicode,character in next,tfmdata.characters do
- local olditalic=character.italic
- if olditalic and olditalic~=0 then
- character.width=character.width+olditalic
- character.italic=0
- end
- end
-end
-local specification={
- name="italicwidths",
- description="add italic to width",
- manipulators={
- base=initialize,
- node=initialize,
- }
-}
-registerotffeature(specification)
-registerafmfeature(specification)
-local function initialize(tfmdata,value)
- if value then
- local parameters=tfmdata.parameters
- local italicangle=parameters.italicangle
- if italicangle and italicangle~=0 then
- local properties=tfmdata.properties
- local factor=tonumber(value) or 1
- properties.hasitalics=true
- properties.autoitalicamount=factor*(parameters.uwidth or 40)/2
- end
- end
-end
-local specification={
- name="itlc",
- description="italic correction",
- initializers={
- base=initialize,
- node=initialize,
- }
-}
-registerotffeature(specification)
-registerafmfeature(specification)
-if context then
- local function initialize(tfmdata,value)
- tfmdata.properties.textitalics=toboolean(value)
- end
- local specification={
- name="textitalics",
- description="use alternative text italic correction",
- initializers={
- base=initialize,
- node=initialize,
- }
- }
- registerotffeature(specification)
- registerafmfeature(specification)
-end
-if context then
- local letter=characters.is_letter
- local always=true
- local function collapseitalics(tfmdata,key,value)
- local threshold=value==true and 100 or tonumber(value)
- if threshold and threshold>0 then
- if threshold>100 then
- threshold=100
- end
- for unicode,data in next,tfmdata.characters do
- if always or letter[unicode] or letter[data.unicode] then
- local italic=data.italic
- if italic and italic~=0 then
- local width=data.width
- if width and width~=0 then
- local delta=threshold*italic/100
- data.width=width+delta
- data.italic=italic-delta
- end
- end
- end
- end
- end
- end
- local dimensions_specification={
- name="collapseitalics",
- description="collapse italics",
- manipulators={
- base=collapseitalics,
- node=collapseitalics,
- }
- }
- registerotffeature(dimensions_specification)
- registerafmfeature(dimensions_specification)
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-imp-italics”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “font-imp-effects” 73a660359a0ec71e44cc2b7225a715ac] ---
-
-if not modules then modules={} end modules ['font-imp-effects']={
- version=1.001,
- comment="companion to font-ini.mkiv",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-local next,type,tonumber=next,type,tonumber
-local is_boolean=string.is_boolean
-local fonts=fonts
-local handlers=fonts.handlers
-local registerotffeature=handlers.otf.features.register
-local registerafmfeature=handlers.afm.features.register
-local settings_to_hash=utilities.parsers.settings_to_hash_colon_too
-local helpers=fonts.helpers
-local prependcommands=helpers.prependcommands
-local charcommand=helpers.commands.char
-local leftcommand=helpers.commands.left
-local rightcommand=helpers.commands.right
-local upcommand=helpers.commands.up
-local downcommand=helpers.commands.down
-local dummycommand=helpers.commands.dummy
-local report_effect=logs.reporter("fonts","effect")
-local report_slant=logs.reporter("fonts","slant")
-local report_extend=logs.reporter("fonts","extend")
-local report_squeeze=logs.reporter("fonts","squeeze")
-local trace=false
-trackers.register("fonts.effect",function(v) trace=v end)
-trackers.register("fonts.slant",function(v) trace=v end)
-trackers.register("fonts.extend",function(v) trace=v end)
-trackers.register("fonts.squeeze",function(v) trace=v end)
-local function initializeslant(tfmdata,value)
- value=tonumber(value)
- if not value then
- value=0
- elseif value>1 then
- value=1
- elseif value<-1 then
- value=-1
- end
- if trace then
- report_slant("applying %0.3f",value)
- end
- tfmdata.parameters.slantfactor=value
-end
-local specification={
- name="slant",
- description="slant glyphs",
- initializers={
- base=initializeslant,
- node=initializeslant,
- }
-}
-registerotffeature(specification)
-registerafmfeature(specification)
-local function initializeextend(tfmdata,value)
- value=tonumber(value)
- if not value then
- value=0
- elseif value>10 then
- value=10
- elseif value<-10 then
- value=-10
- end
- if trace then
- report_extend("applying %0.3f",value)
- end
- tfmdata.parameters.extendfactor=value
-end
-local specification={
- name="extend",
- description="scale glyphs horizontally",
- initializers={
- base=initializeextend,
- node=initializeextend,
- }
-}
-registerotffeature(specification)
-registerafmfeature(specification)
-local function initializesqueeze(tfmdata,value)
- value=tonumber(value)
- if not value then
- value=0
- elseif value>10 then
- value=10
- elseif value<-10 then
- value=-10
- end
- if trace then
- report_squeeze("applying %0.3f",value)
- end
- tfmdata.parameters.squeezefactor=value
-end
-local specification={
- name="squeeze",
- description="scale glyphs vertically",
- initializers={
- base=initializesqueeze,
- node=initializesqueeze,
- }
-}
-registerotffeature(specification)
-registerafmfeature(specification)
-local effects={
- inner=0,
- normal=0,
- outer=1,
- outline=1,
- both=2,
- hidden=3,
-}
-local function initializeeffect(tfmdata,value)
- local spec
- if type(value)=="number" then
- spec={ width=value }
- else
- spec=settings_to_hash(value)
- end
- local effect=spec.effect or "both"
- local width=tonumber(spec.width) or 0
- local mode=effects[effect]
- if not mode then
- report_effect("invalid effect %a",effect)
- elseif width==0 and mode==0 then
- report_effect("invalid width %a for effect %a",width,effect)
- else
- local parameters=tfmdata.parameters
- local properties=tfmdata.properties
- parameters.mode=mode
- parameters.width=width*1000
- if is_boolean(spec.auto)==true then
- local squeeze=1-width/20
- local average=(1-squeeze)*width*100
- spec.squeeze=squeeze
- spec.extend=1+width/2
- spec.wdelta=average
- spec.hdelta=average/2
- spec.ddelta=average/2
- spec.vshift=average/2
- end
- local factor=tonumber(spec.factor) or 0
- local hfactor=tonumber(spec.hfactor) or factor
- local vfactor=tonumber(spec.vfactor) or factor
- local delta=tonumber(spec.delta) or 1
- local wdelta=tonumber(spec.wdelta) or delta
- local hdelta=tonumber(spec.hdelta) or delta
- local ddelta=tonumber(spec.ddelta) or hdelta
- local vshift=tonumber(spec.vshift) or 0
- local slant=spec.slant
- local extend=spec.extend
- local squeeze=spec.squeeze
- if slant then
- initializeslant(tfmdata,slant)
- end
- if extend then
- initializeextend(tfmdata,extend)
- end
- if squeeze then
- initializesqueeze(tfmdata,squeeze)
- end
- properties.effect={
- effect=effect,
- width=width,
- factor=factor,
- hfactor=hfactor,
- vfactor=vfactor,
- wdelta=wdelta,
- hdelta=hdelta,
- ddelta=ddelta,
- vshift=vshift,
- slant=tfmdata.parameters.slantfactor,
- extend=tfmdata.parameters.extendfactor,
- squeeze=tfmdata.parameters.squeezefactor,
- }
- end
-end
-local rules={
- "RadicalRuleThickness",
- "OverbarRuleThickness",
- "FractionRuleThickness",
- "UnderbarRuleThickness",
-}
-local function setmathparameters(tfmdata,characters,mathparameters,dx,dy,squeeze)
- if delta~=0 then
- for i=1,#rules do
- local name=rules[i]
- local value=mathparameters[name]
- if value then
- mathparameters[name]=(squeeze or 1)*(value+dx)
- end
- end
- end
-end
-local function setmathcharacters(tfmdata,characters,mathparameters,dx,dy,squeeze,wdelta,hdelta,ddelta)
- local function wdpatch(char)
- if wsnap~=0 then
- char.width=char.width+wdelta/2
- end
- end
- local function htpatch(char)
- if hsnap~=0 then
- local height=char.height
- if height then
- char.height=char.height+2*dy
- end
- end
- end
- local character=characters[0x221A]
- if character and character.next then
- local char=character
- local next=character.next
- wdpatch(char)
- htpatch(char)
- while next do
- char=characters[next]
- wdpatch(char)
- htpatch(char)
- next=char.next
- end
- if char then
- local v=char.vert_variants
- if v then
- local top=v[#v]
- if top then
- local char=characters[top.glyph]
- htpatch(char)
- end
- end
- end
- end
-end
-local function manipulateeffect(tfmdata)
- local effect=tfmdata.properties.effect
- if effect then
- local characters=tfmdata.characters
- local parameters=tfmdata.parameters
- local mathparameters=tfmdata.mathparameters
- local multiplier=effect.width*100
- local factor=parameters.factor
- local hfactor=parameters.hfactor
- local vfactor=parameters.vfactor
- local wdelta=effect.wdelta*hfactor*multiplier
- local hdelta=effect.hdelta*vfactor*multiplier
- local ddelta=effect.ddelta*vfactor*multiplier
- local vshift=effect.vshift*vfactor*multiplier
- local squeeze=effect.squeeze
- local hshift=wdelta/2
- local dx=multiplier*vfactor
- local dy=vshift
- local factor=(1+effect.factor)*factor
- local hfactor=(1+effect.hfactor)*hfactor
- local vfactor=(1+effect.vfactor)*vfactor
- local vshift=vshift~=0 and upcommand[vshift] or false
- for unicode,character in next,characters do
- local oldwidth=character.width
- local oldheight=character.height
- local olddepth=character.depth
- if oldwidth and oldwidth>0 then
- character.width=oldwidth+wdelta
- local commands=character.commands
- local hshift=rightcommand[hshift]
- if vshift then
- if commands then
- prependcommands (commands,
- hshift,
- vshift
- )
- else
- character.commands={
- hshift,
- vshift,
- charcommand[unicode]
- }
- end
- else
- if commands then
- prependcommands (commands,
- hshift
- )
- else
- character.commands={
- hshift,
- charcommand[unicode]
- }
- end
- end
- end
- if oldheight and oldheight>0 then
- character.height=oldheight+hdelta
- end
- if olddepth and olddepth>0 then
- character.depth=olddepth+ddelta
- end
- end
- if mathparameters then
- setmathparameters(tfmdata,characters,mathparameters,dx,dy,squeeze)
- setmathcharacters(tfmdata,characters,mathparameters,dx,dy,squeeze,wdelta,hdelta,ddelta)
- end
- parameters.factor=factor
- parameters.hfactor=hfactor
- parameters.vfactor=vfactor
- if trace then
- report_effect("applying")
- report_effect(" effect : %s",effect.effect)
- report_effect(" width : %s => %s",effect.width,multiplier)
- report_effect(" factor : %s => %s",effect.factor,factor )
- report_effect(" hfactor : %s => %s",effect.hfactor,hfactor)
- report_effect(" vfactor : %s => %s",effect.vfactor,vfactor)
- report_effect(" wdelta : %s => %s",effect.wdelta,wdelta)
- report_effect(" hdelta : %s => %s",effect.hdelta,hdelta)
- report_effect(" ddelta : %s => %s",effect.ddelta,ddelta)
- end
- end
-end
-local specification={
- name="effect",
- description="apply effects to glyphs",
- initializers={
- base=initializeeffect,
- node=initializeeffect,
- },
- manipulators={
- base=manipulateeffect,
- node=manipulateeffect,
- },
-}
-registerotffeature(specification)
-registerafmfeature(specification)
-local function initializeoutline(tfmdata,value)
- value=tonumber(value)
- if not value then
- value=0
- else
- value=tonumber(value) or 0
- end
- local parameters=tfmdata.parameters
- local properties=tfmdata.properties
- parameters.mode=effects.outline
- parameters.width=value*1000
- properties.effect={
- effect=effect,
- width=width,
- }
-end
-local specification={
- name="outline",
- description="outline glyphs",
- initializers={
- base=initializeoutline,
- node=initializeoutline,
- }
-}
-registerotffeature(specification)
-registerafmfeature(specification)
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “font-imp-effects”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “fonts-lig” b9dbe77ce747d4c35bb2a20ffbe5aa51] ---
-
-
-fonts.handlers.otf.addfeature {
- ["dataset"]={
- {
- ["data"]={
- ["À"]={ "A","̀" },
- ["Á"]={ "A","́" },
- ["Â"]={ "A","̂" },
- ["Ã"]={ "A","̃" },
- ["Ä"]={ "A","̈" },
- ["Å"]={ "A","̊" },
- ["Ç"]={ "C","̧" },
- ["È"]={ "E","̀" },
- ["É"]={ "E","́" },
- ["Ê"]={ "E","̂" },
- ["Ë"]={ "E","̈" },
- ["Ì"]={ "I","̀" },
- ["Í"]={ "I","́" },
- ["Î"]={ "I","̂" },
- ["Ï"]={ "I","̈" },
- ["Ñ"]={ "N","̃" },
- ["Ò"]={ "O","̀" },
- ["Ó"]={ "O","́" },
- ["Ô"]={ "O","̂" },
- ["Õ"]={ "O","̃" },
- ["Ö"]={ "O","̈" },
- ["Ù"]={ "U","̀" },
- ["Ú"]={ "U","́" },
- ["Û"]={ "U","̂" },
- ["Ü"]={ "U","̈" },
- ["Ý"]={ "Y","́" },
- ["à"]={ "a","̀" },
- ["á"]={ "a","́" },
- ["â"]={ "a","̂" },
- ["ã"]={ "a","̃" },
- ["ä"]={ "a","̈" },
- ["å"]={ "a","̊" },
- ["ç"]={ "c","̧" },
- ["è"]={ "e","̀" },
- ["é"]={ "e","́" },
- ["ê"]={ "e","̂" },
- ["ë"]={ "e","̈" },
- ["ì"]={ "i","̀" },
- ["í"]={ "i","́" },
- ["î"]={ "i","̂" },
- ["ï"]={ "i","̈" },
- ["ñ"]={ "n","̃" },
- ["ò"]={ "o","̀" },
- ["ó"]={ "o","́" },
- ["ô"]={ "o","̂" },
- ["õ"]={ "o","̃" },
- ["ö"]={ "o","̈" },
- ["ù"]={ "u","̀" },
- ["ú"]={ "u","́" },
- ["û"]={ "u","̂" },
- ["ü"]={ "u","̈" },
- ["ý"]={ "y","́" },
- ["ÿ"]={ "y","̈" },
- ["Ā"]={ "A","̄" },
- ["ā"]={ "a","̄" },
- ["Ă"]={ "A","̆" },
- ["ă"]={ "a","̆" },
- ["Ą"]={ "A","̨" },
- ["ą"]={ "a","̨" },
- ["Ć"]={ "C","́" },
- ["ć"]={ "c","́" },
- ["Ĉ"]={ "C","̂" },
- ["ĉ"]={ "c","̂" },
- ["Ċ"]={ "C","̇" },
- ["ċ"]={ "c","̇" },
- ["Č"]={ "C","̌" },
- ["č"]={ "c","̌" },
- ["Ď"]={ "D","̌" },
- ["ď"]={ "d","̌" },
- ["Ē"]={ "E","̄" },
- ["ē"]={ "e","̄" },
- ["Ĕ"]={ "E","̆" },
- ["ĕ"]={ "e","̆" },
- ["Ė"]={ "E","̇" },
- ["ė"]={ "e","̇" },
- ["Ę"]={ "E","̨" },
- ["ę"]={ "e","̨" },
- ["Ě"]={ "E","̌" },
- ["ě"]={ "e","̌" },
- ["Ĝ"]={ "G","̂" },
- ["ĝ"]={ "g","̂" },
- ["Ğ"]={ "G","̆" },
- ["ğ"]={ "g","̆" },
- ["Ġ"]={ "G","̇" },
- ["ġ"]={ "g","̇" },
- ["Ģ"]={ "G","̧" },
- ["ģ"]={ "g","̧" },
- ["Ĥ"]={ "H","̂" },
- ["ĥ"]={ "h","̂" },
- ["Ĩ"]={ "I","̃" },
- ["ĩ"]={ "i","̃" },
- ["Ī"]={ "I","̄" },
- ["ī"]={ "i","̄" },
- ["Ĭ"]={ "I","̆" },
- ["ĭ"]={ "i","̆" },
- ["Į"]={ "I","̨" },
- ["į"]={ "i","̨" },
- ["İ"]={ "I","̇" },
- ["Ĵ"]={ "J","̂" },
- ["ĵ"]={ "j","̂" },
- ["Ķ"]={ "K","̧" },
- ["ķ"]={ "k","̧" },
- ["Ĺ"]={ "L","́" },
- ["ĺ"]={ "l","́" },
- ["Ļ"]={ "L","̧" },
- ["ļ"]={ "l","̧" },
- ["Ľ"]={ "L","̌" },
- ["ľ"]={ "l","̌" },
- ["Ń"]={ "N","́" },
- ["ń"]={ "n","́" },
- ["Ņ"]={ "N","̧" },
- ["ņ"]={ "n","̧" },
- ["Ň"]={ "N","̌" },
- ["ň"]={ "n","̌" },
- ["Ō"]={ "O","̄" },
- ["ō"]={ "o","̄" },
- ["Ŏ"]={ "O","̆" },
- ["ŏ"]={ "o","̆" },
- ["Ő"]={ "O","̋" },
- ["ő"]={ "o","̋" },
- ["Ŕ"]={ "R","́" },
- ["ŕ"]={ "r","́" },
- ["Ŗ"]={ "R","̧" },
- ["ŗ"]={ "r","̧" },
- ["Ř"]={ "R","̌" },
- ["ř"]={ "r","̌" },
- ["Ś"]={ "S","́" },
- ["ś"]={ "s","́" },
- ["Ŝ"]={ "S","̂" },
- ["ŝ"]={ "s","̂" },
- ["Ş"]={ "S","̧" },
- ["ş"]={ "s","̧" },
- ["Š"]={ "S","̌" },
- ["š"]={ "s","̌" },
- ["Ţ"]={ "T","̧" },
- ["ţ"]={ "t","̧" },
- ["Ť"]={ "T","̌" },
- ["ť"]={ "t","̌" },
- ["Ũ"]={ "U","̃" },
- ["ũ"]={ "u","̃" },
- ["Ū"]={ "U","̄" },
- ["ū"]={ "u","̄" },
- ["Ŭ"]={ "U","̆" },
- ["ŭ"]={ "u","̆" },
- ["Ů"]={ "U","̊" },
- ["ů"]={ "u","̊" },
- ["Ű"]={ "U","̋" },
- ["ű"]={ "u","̋" },
- ["Ų"]={ "U","̨" },
- ["ų"]={ "u","̨" },
- ["Ŵ"]={ "W","̂" },
- ["ŵ"]={ "w","̂" },
- ["Ŷ"]={ "Y","̂" },
- ["ŷ"]={ "y","̂" },
- ["Ÿ"]={ "Y","̈" },
- ["Ź"]={ "Z","́" },
- ["ź"]={ "z","́" },
- ["Ż"]={ "Z","̇" },
- ["ż"]={ "z","̇" },
- ["Ž"]={ "Z","̌" },
- ["ž"]={ "z","̌" },
- ["Ơ"]={ "O","̛" },
- ["ơ"]={ "o","̛" },
- ["Ư"]={ "U","̛" },
- ["ư"]={ "u","̛" },
- ["Ǎ"]={ "A","̌" },
- ["ǎ"]={ "a","̌" },
- ["Ǐ"]={ "I","̌" },
- ["ǐ"]={ "i","̌" },
- ["Ǒ"]={ "O","̌" },
- ["ǒ"]={ "o","̌" },
- ["Ǔ"]={ "U","̌" },
- ["ǔ"]={ "u","̌" },
- ["Ǖ"]={ "Ü","̄" },
- ["ǖ"]={ "ü","̄" },
- ["Ǘ"]={ "Ü","́" },
- ["ǘ"]={ "ü","́" },
- ["Ǚ"]={ "Ü","̌" },
- ["ǚ"]={ "ü","̌" },
- ["Ǜ"]={ "Ü","̀" },
- ["ǜ"]={ "ü","̀" },
- ["Ǟ"]={ "Ä","̄" },
- ["ǟ"]={ "ä","̄" },
- ["Ǡ"]={ "Ȧ","̄" },
- ["ǡ"]={ "ȧ","̄" },
- ["Ǣ"]={ "Æ","̄" },
- ["ǣ"]={ "æ","̄" },
- ["Ǧ"]={ "G","̌" },
- ["ǧ"]={ "g","̌" },
- ["Ǩ"]={ "K","̌" },
- ["ǩ"]={ "k","̌" },
- ["Ǫ"]={ "O","̨" },
- ["ǫ"]={ "o","̨" },
- ["Ǭ"]={ "Ǫ","̄" },
- ["ǭ"]={ "ǫ","̄" },
- ["Ǯ"]={ "Ʒ","̌" },
- ["ǯ"]={ "ʒ","̌" },
- ["ǰ"]={ "j","̌" },
- ["Ǵ"]={ "G","́" },
- ["ǵ"]={ "g","́" },
- ["Ǹ"]={ "N","̀" },
- ["ǹ"]={ "n","̀" },
- ["Ǻ"]={ "Å","́" },
- ["ǻ"]={ "å","́" },
- ["Ǽ"]={ "Æ","́" },
- ["ǽ"]={ "æ","́" },
- ["Ǿ"]={ "Ø","́" },
- ["ǿ"]={ "ø","́" },
- ["Ȁ"]={ "A","̏" },
- ["ȁ"]={ "a","̏" },
- ["Ȃ"]={ "A","̑" },
- ["ȃ"]={ "a","̑" },
- ["Ȅ"]={ "E","̏" },
- ["ȅ"]={ "e","̏" },
- ["Ȇ"]={ "E","̑" },
- ["ȇ"]={ "e","̑" },
- ["Ȉ"]={ "I","̏" },
- ["ȉ"]={ "i","̏" },
- ["Ȋ"]={ "I","̑" },
- ["ȋ"]={ "i","̑" },
- ["Ȍ"]={ "O","̏" },
- ["ȍ"]={ "o","̏" },
- ["Ȏ"]={ "O","̑" },
- ["ȏ"]={ "o","̑" },
- ["Ȑ"]={ "R","̏" },
- ["ȑ"]={ "r","̏" },
- ["Ȓ"]={ "R","̑" },
- ["ȓ"]={ "r","̑" },
- ["Ȕ"]={ "U","̏" },
- ["ȕ"]={ "u","̏" },
- ["Ȗ"]={ "U","̑" },
- ["ȗ"]={ "u","̑" },
- ["Ș"]={ "S","̦" },
- ["ș"]={ "s","̦" },
- ["Ț"]={ "T","̦" },
- ["ț"]={ "t","̦" },
- ["Ȟ"]={ "H","̌" },
- ["ȟ"]={ "h","̌" },
- ["Ȧ"]={ "A","̇" },
- ["ȧ"]={ "a","̇" },
- ["Ȩ"]={ "E","̧" },
- ["ȩ"]={ "e","̧" },
- ["Ȫ"]={ "Ö","̄" },
- ["ȫ"]={ "ö","̄" },
- ["Ȭ"]={ "Õ","̄" },
- ["ȭ"]={ "õ","̄" },
- ["Ȯ"]={ "O","̇" },
- ["ȯ"]={ "o","̇" },
- ["Ȱ"]={ "Ȯ","̄" },
- ["ȱ"]={ "ȯ","̄" },
- ["Ȳ"]={ "Y","̄" },
- ["ȳ"]={ "y","̄" },
- ["̈́"]={ "̈","́" },
- ["΅"]={ "¨","́" },
- ["Ά"]={ "Α","́" },
- ["Έ"]={ "Ε","́" },
- ["Ή"]={ "Η","́" },
- ["Ί"]={ "Ι","́" },
- ["Ό"]={ "Ο","́" },
- ["Ύ"]={ "Υ","́" },
- ["Ώ"]={ "Ω","́" },
- ["ΐ"]={ "ϊ","́" },
- ["Ϊ"]={ "Ι","̈" },
- ["Ϋ"]={ "Υ","̈" },
- ["ά"]={ "α","́" },
- ["έ"]={ "ε","́" },
- ["ή"]={ "η","́" },
- ["ί"]={ "ι","́" },
- ["ΰ"]={ "ϋ","́" },
- ["ϊ"]={ "ι","̈" },
- ["ϋ"]={ "υ","̈" },
- ["ό"]={ "ο","́" },
- ["ύ"]={ "υ","́" },
- ["ώ"]={ "ω","́" },
- ["ϓ"]={ "ϒ","́" },
- ["ϔ"]={ "ϒ","̈" },
- ["Ѐ"]={ "Е","̀" },
- ["Ё"]={ "Е","̈" },
- ["Ѓ"]={ "Г","́" },
- ["Ї"]={ "І","̈" },
- ["Ќ"]={ "К","́" },
- ["Ѝ"]={ "И","̀" },
- ["Ў"]={ "У","̆" },
- ["Й"]={ "И","̆" },
- ["й"]={ "и","̆" },
- ["ѐ"]={ "е","̀" },
- ["ё"]={ "е","̈" },
- ["ѓ"]={ "г","́" },
- ["ї"]={ "і","̈" },
- ["ќ"]={ "к","́" },
- ["ѝ"]={ "и","̀" },
- ["ў"]={ "у","̆" },
- ["Ѷ"]={ "Ѵ","̏" },
- ["ѷ"]={ "ѵ","̏" },
- ["Ӂ"]={ "Ж","̆" },
- ["ӂ"]={ "ж","̆" },
- ["Ӑ"]={ "А","̆" },
- ["ӑ"]={ "а","̆" },
- ["Ӓ"]={ "А","̈" },
- ["ӓ"]={ "а","̈" },
- ["Ӗ"]={ "Е","̆" },
- ["ӗ"]={ "е","̆" },
- ["Ӛ"]={ "Ә","̈" },
- ["ӛ"]={ "ә","̈" },
- ["Ӝ"]={ "Ж","̈" },
- ["ӝ"]={ "ж","̈" },
- ["Ӟ"]={ "З","̈" },
- ["ӟ"]={ "з","̈" },
- ["Ӣ"]={ "И","̄" },
- ["ӣ"]={ "и","̄" },
- ["Ӥ"]={ "И","̈" },
- ["ӥ"]={ "и","̈" },
- ["Ӧ"]={ "О","̈" },
- ["ӧ"]={ "о","̈" },
- ["Ӫ"]={ "Ө","̈" },
- ["ӫ"]={ "ө","̈" },
- ["Ӭ"]={ "Э","̈" },
- ["ӭ"]={ "э","̈" },
- ["Ӯ"]={ "У","̄" },
- ["ӯ"]={ "у","̄" },
- ["Ӱ"]={ "У","̈" },
- ["ӱ"]={ "у","̈" },
- ["Ӳ"]={ "У","̋" },
- ["ӳ"]={ "у","̋" },
- ["Ӵ"]={ "Ч","̈" },
- ["ӵ"]={ "ч","̈" },
- ["Ӹ"]={ "Ы","̈" },
- ["ӹ"]={ "ы","̈" },
- ["آ"]={ "ا","ٓ" },
- ["أ"]={ "ا","ٔ" },
- ["ؤ"]={ "و","ٔ" },
- ["إ"]={ "ا","ٕ" },
- ["ئ"]={ "ي","ٔ" },
- ["ۀ"]={ "ە","ٔ" },
- ["ۂ"]={ "ہ","ٔ" },
- ["ۓ"]={ "ے","ٔ" },
- ["ऩ"]={ "न","़" },
- ["ऱ"]={ "र","़" },
- ["ऴ"]={ "ळ","़" },
- ["क़"]={ "क","़" },
- ["ख़"]={ "ख","़" },
- ["ग़"]={ "ग","़" },
- ["ज़"]={ "ज","़" },
- ["ड़"]={ "ड","़" },
- ["ढ़"]={ "ढ","़" },
- ["फ़"]={ "फ","़" },
- ["य़"]={ "य","़" },
- ["ো"]={ "ে","া" },
- ["ৌ"]={ "ে","ৗ" },
- ["ড়"]={ "ড","়" },
- ["ঢ়"]={ "ঢ","়" },
- ["য়"]={ "য","়" },
- ["ਲ਼"]={ "ਲ","਼" },
- ["ਸ਼"]={ "ਸ","਼" },
- ["ਖ਼"]={ "ਖ","਼" },
- ["ਗ਼"]={ "ਗ","਼" },
- ["ਜ਼"]={ "ਜ","਼" },
- ["ਫ਼"]={ "ਫ","਼" },
- ["ୈ"]={ "େ","ୖ" },
- ["ୋ"]={ "େ","ା" },
- ["ୌ"]={ "େ","ୗ" },
- ["ଡ଼"]={ "ଡ","଼" },
- ["ଢ଼"]={ "ଢ","଼" },
- ["ஔ"]={ "ஒ","ௗ" },
- ["ொ"]={ "ெ","ா" },
- ["ோ"]={ "ே","ா" },
- ["ௌ"]={ "ெ","ௗ" },
- ["ై"]={ "ె","ౖ" },
- ["ೀ"]={ "ಿ","ೕ" },
- ["ೇ"]={ "ೆ","ೕ" },
- ["ೈ"]={ "ೆ","ೖ" },
- ["ೊ"]={ "ೆ","ೂ" },
- ["ೋ"]={ "ೊ","ೕ" },
- ["ൊ"]={ "െ","ാ" },
- ["ോ"]={ "േ","ാ" },
- ["ൌ"]={ "െ","ൗ" },
- ["ේ"]={ "ෙ","්" },
- ["ො"]={ "ෙ","ා" },
- ["ෝ"]={ "ො","්" },
- ["ෞ"]={ "ෙ","ෟ" },
- ["གྷ"]={ "ག","ྷ" },
- ["ཌྷ"]={ "ཌ","ྷ" },
- ["དྷ"]={ "ད","ྷ" },
- ["བྷ"]={ "བ","ྷ" },
- ["ཛྷ"]={ "ཛ","ྷ" },
- ["ཀྵ"]={ "ཀ","ྵ" },
- ["ཱི"]={ "ཱ","ི" },
- ["ཱུ"]={ "ཱ","ུ" },
- ["ྲྀ"]={ "ྲ","ྀ" },
- ["ླྀ"]={ "ླ","ྀ" },
- ["ཱྀ"]={ "ཱ","ྀ" },
- ["ྒྷ"]={ "ྒ","ྷ" },
- ["ྜྷ"]={ "ྜ","ྷ" },
- ["ྡྷ"]={ "ྡ","ྷ" },
- ["ྦྷ"]={ "ྦ","ྷ" },
- ["ྫྷ"]={ "ྫ","ྷ" },
- ["ྐྵ"]={ "ྐ","ྵ" },
- ["ဦ"]={ "ဥ","ီ" },
- ["ᬆ"]={ "ᬅ","ᬵ" },
- ["ᬈ"]={ "ᬇ","ᬵ" },
- ["ᬊ"]={ "ᬉ","ᬵ" },
- ["ᬌ"]={ "ᬋ","ᬵ" },
- ["ᬎ"]={ "ᬍ","ᬵ" },
- ["ᬒ"]={ "ᬑ","ᬵ" },
- ["ᬻ"]={ "ᬺ","ᬵ" },
- ["ᬽ"]={ "ᬼ","ᬵ" },
- ["ᭀ"]={ "ᬾ","ᬵ" },
- ["ᭁ"]={ "ᬿ","ᬵ" },
- ["ᭃ"]={ "ᭂ","ᬵ" },
- ["Ḁ"]={ "A","̥" },
- ["ḁ"]={ "a","̥" },
- ["Ḃ"]={ "B","̇" },
- ["ḃ"]={ "b","̇" },
- ["Ḅ"]={ "B","̣" },
- ["ḅ"]={ "b","̣" },
- ["Ḇ"]={ "B","̱" },
- ["ḇ"]={ "b","̱" },
- ["Ḉ"]={ "Ç","́" },
- ["ḉ"]={ "ç","́" },
- ["Ḋ"]={ "D","̇" },
- ["ḋ"]={ "d","̇" },
- ["Ḍ"]={ "D","̣" },
- ["ḍ"]={ "d","̣" },
- ["Ḏ"]={ "D","̱" },
- ["ḏ"]={ "d","̱" },
- ["Ḑ"]={ "D","̧" },
- ["ḑ"]={ "d","̧" },
- ["Ḓ"]={ "D","̭" },
- ["ḓ"]={ "d","̭" },
- ["Ḕ"]={ "Ē","̀" },
- ["ḕ"]={ "ē","̀" },
- ["Ḗ"]={ "Ē","́" },
- ["ḗ"]={ "ē","́" },
- ["Ḙ"]={ "E","̭" },
- ["ḙ"]={ "e","̭" },
- ["Ḛ"]={ "E","̰" },
- ["ḛ"]={ "e","̰" },
- ["Ḝ"]={ "Ȩ","̆" },
- ["ḝ"]={ "ȩ","̆" },
- ["Ḟ"]={ "F","̇" },
- ["ḟ"]={ "f","̇" },
- ["Ḡ"]={ "G","̄" },
- ["ḡ"]={ "g","̄" },
- ["Ḣ"]={ "H","̇" },
- ["ḣ"]={ "h","̇" },
- ["Ḥ"]={ "H","̣" },
- ["ḥ"]={ "h","̣" },
- ["Ḧ"]={ "H","̈" },
- ["ḧ"]={ "h","̈" },
- ["Ḩ"]={ "H","̧" },
- ["ḩ"]={ "h","̧" },
- ["Ḫ"]={ "H","̮" },
- ["ḫ"]={ "h","̮" },
- ["Ḭ"]={ "I","̰" },
- ["ḭ"]={ "i","̰" },
- ["Ḯ"]={ "Ï","́" },
- ["ḯ"]={ "ï","́" },
- ["Ḱ"]={ "K","́" },
- ["ḱ"]={ "k","́" },
- ["Ḳ"]={ "K","̣" },
- ["ḳ"]={ "k","̣" },
- ["Ḵ"]={ "K","̱" },
- ["ḵ"]={ "k","̱" },
- ["Ḷ"]={ "L","̣" },
- ["ḷ"]={ "l","̣" },
- ["Ḹ"]={ "Ḷ","̄" },
- ["ḹ"]={ "ḷ","̄" },
- ["Ḻ"]={ "L","̱" },
- ["ḻ"]={ "l","̱" },
- ["Ḽ"]={ "L","̭" },
- ["ḽ"]={ "l","̭" },
- ["Ḿ"]={ "M","́" },
- ["ḿ"]={ "m","́" },
- ["Ṁ"]={ "M","̇" },
- ["ṁ"]={ "m","̇" },
- ["Ṃ"]={ "M","̣" },
- ["ṃ"]={ "m","̣" },
- ["Ṅ"]={ "N","̇" },
- ["ṅ"]={ "n","̇" },
- ["Ṇ"]={ "N","̣" },
- ["ṇ"]={ "n","̣" },
- ["Ṉ"]={ "N","̱" },
- ["ṉ"]={ "n","̱" },
- ["Ṋ"]={ "N","̭" },
- ["ṋ"]={ "n","̭" },
- ["Ṍ"]={ "Õ","́" },
- ["ṍ"]={ "õ","́" },
- ["Ṏ"]={ "Õ","̈" },
- ["ṏ"]={ "õ","̈" },
- ["Ṑ"]={ "Ō","̀" },
- ["ṑ"]={ "ō","̀" },
- ["Ṓ"]={ "Ō","́" },
- ["ṓ"]={ "ō","́" },
- ["Ṕ"]={ "P","́" },
- ["ṕ"]={ "p","́" },
- ["Ṗ"]={ "P","̇" },
- ["ṗ"]={ "p","̇" },
- ["Ṙ"]={ "R","̇" },
- ["ṙ"]={ "r","̇" },
- ["Ṛ"]={ "R","̣" },
- ["ṛ"]={ "r","̣" },
- ["Ṝ"]={ "Ṛ","̄" },
- ["ṝ"]={ "ṛ","̄" },
- ["Ṟ"]={ "R","̱" },
- ["ṟ"]={ "r","̱" },
- ["Ṡ"]={ "S","̇" },
- ["ṡ"]={ "s","̇" },
- ["Ṣ"]={ "S","̣" },
- ["ṣ"]={ "s","̣" },
- ["Ṥ"]={ "Ś","̇" },
- ["ṥ"]={ "ś","̇" },
- ["Ṧ"]={ "Š","̇" },
- ["ṧ"]={ "š","̇" },
- ["Ṩ"]={ "Ṣ","̇" },
- ["ṩ"]={ "ṣ","̇" },
- ["Ṫ"]={ "T","̇" },
- ["ṫ"]={ "t","̇" },
- ["Ṭ"]={ "T","̣" },
- ["ṭ"]={ "t","̣" },
- ["Ṯ"]={ "T","̱" },
- ["ṯ"]={ "t","̱" },
- ["Ṱ"]={ "T","̭" },
- ["ṱ"]={ "t","̭" },
- ["Ṳ"]={ "U","̤" },
- ["ṳ"]={ "u","̤" },
- ["Ṵ"]={ "U","̰" },
- ["ṵ"]={ "u","̰" },
- ["Ṷ"]={ "U","̭" },
- ["ṷ"]={ "u","̭" },
- ["Ṹ"]={ "Ũ","́" },
- ["ṹ"]={ "ũ","́" },
- ["Ṻ"]={ "Ū","̈" },
- ["ṻ"]={ "ū","̈" },
- ["Ṽ"]={ "V","̃" },
- ["ṽ"]={ "v","̃" },
- ["Ṿ"]={ "V","̣" },
- ["ṿ"]={ "v","̣" },
- ["Ẁ"]={ "W","̀" },
- ["ẁ"]={ "w","̀" },
- ["Ẃ"]={ "W","́" },
- ["ẃ"]={ "w","́" },
- ["Ẅ"]={ "W","̈" },
- ["ẅ"]={ "w","̈" },
- ["Ẇ"]={ "W","̇" },
- ["ẇ"]={ "w","̇" },
- ["Ẉ"]={ "W","̣" },
- ["ẉ"]={ "w","̣" },
- ["Ẋ"]={ "X","̇" },
- ["ẋ"]={ "x","̇" },
- ["Ẍ"]={ "X","̈" },
- ["ẍ"]={ "x","̈" },
- ["Ẏ"]={ "Y","̇" },
- ["ẏ"]={ "y","̇" },
- ["Ẑ"]={ "Z","̂" },
- ["ẑ"]={ "z","̂" },
- ["Ẓ"]={ "Z","̣" },
- ["ẓ"]={ "z","̣" },
- ["Ẕ"]={ "Z","̱" },
- ["ẕ"]={ "z","̱" },
- ["ẖ"]={ "h","̱" },
- ["ẗ"]={ "t","̈" },
- ["ẘ"]={ "w","̊" },
- ["ẙ"]={ "y","̊" },
- ["ẛ"]={ "ſ","̇" },
- ["Ạ"]={ "A","̣" },
- ["ạ"]={ "a","̣" },
- ["Ả"]={ "A","̉" },
- ["ả"]={ "a","̉" },
- ["Ấ"]={ "Â","́" },
- ["ấ"]={ "â","́" },
- ["Ầ"]={ "Â","̀" },
- ["ầ"]={ "â","̀" },
- ["Ẩ"]={ "Â","̉" },
- ["ẩ"]={ "â","̉" },
- ["Ẫ"]={ "Â","̃" },
- ["ẫ"]={ "â","̃" },
- ["Ậ"]={ "Ạ","̂" },
- ["ậ"]={ "ạ","̂" },
- ["Ắ"]={ "Ă","́" },
- ["ắ"]={ "ă","́" },
- ["Ằ"]={ "Ă","̀" },
- ["ằ"]={ "ă","̀" },
- ["Ẳ"]={ "Ă","̉" },
- ["ẳ"]={ "ă","̉" },
- ["Ẵ"]={ "Ă","̃" },
- ["ẵ"]={ "ă","̃" },
- ["Ặ"]={ "Ạ","̆" },
- ["ặ"]={ "ạ","̆" },
- ["Ẹ"]={ "E","̣" },
- ["ẹ"]={ "e","̣" },
- ["Ẻ"]={ "E","̉" },
- ["ẻ"]={ "e","̉" },
- ["Ẽ"]={ "E","̃" },
- ["ẽ"]={ "e","̃" },
- ["Ế"]={ "Ê","́" },
- ["ế"]={ "ê","́" },
- ["Ề"]={ "Ê","̀" },
- ["ề"]={ "ê","̀" },
- ["Ể"]={ "Ê","̉" },
- ["ể"]={ "ê","̉" },
- ["Ễ"]={ "Ê","̃" },
- ["ễ"]={ "ê","̃" },
- ["Ệ"]={ "Ẹ","̂" },
- ["ệ"]={ "ẹ","̂" },
- ["Ỉ"]={ "I","̉" },
- ["ỉ"]={ "i","̉" },
- ["Ị"]={ "I","̣" },
- ["ị"]={ "i","̣" },
- ["Ọ"]={ "O","̣" },
- ["ọ"]={ "o","̣" },
- ["Ỏ"]={ "O","̉" },
- ["ỏ"]={ "o","̉" },
- ["Ố"]={ "Ô","́" },
- ["ố"]={ "ô","́" },
- ["Ồ"]={ "Ô","̀" },
- ["ồ"]={ "ô","̀" },
- ["Ổ"]={ "Ô","̉" },
- ["ổ"]={ "ô","̉" },
- ["Ỗ"]={ "Ô","̃" },
- ["ỗ"]={ "ô","̃" },
- ["Ộ"]={ "Ọ","̂" },
- ["ộ"]={ "ọ","̂" },
- ["Ớ"]={ "Ơ","́" },
- ["ớ"]={ "ơ","́" },
- ["Ờ"]={ "Ơ","̀" },
- ["ờ"]={ "ơ","̀" },
- ["Ở"]={ "Ơ","̉" },
- ["ở"]={ "ơ","̉" },
- ["Ỡ"]={ "Ơ","̃" },
- ["ỡ"]={ "ơ","̃" },
- ["Ợ"]={ "Ơ","̣" },
- ["ợ"]={ "ơ","̣" },
- ["Ụ"]={ "U","̣" },
- ["ụ"]={ "u","̣" },
- ["Ủ"]={ "U","̉" },
- ["ủ"]={ "u","̉" },
- ["Ứ"]={ "Ư","́" },
- ["ứ"]={ "ư","́" },
- ["Ừ"]={ "Ư","̀" },
- ["ừ"]={ "ư","̀" },
- ["Ử"]={ "Ư","̉" },
- ["ử"]={ "ư","̉" },
- ["Ữ"]={ "Ư","̃" },
- ["ữ"]={ "ư","̃" },
- ["Ự"]={ "Ư","̣" },
- ["ự"]={ "ư","̣" },
- ["Ỳ"]={ "Y","̀" },
- ["ỳ"]={ "y","̀" },
- ["Ỵ"]={ "Y","̣" },
- ["ỵ"]={ "y","̣" },
- ["Ỷ"]={ "Y","̉" },
- ["ỷ"]={ "y","̉" },
- ["Ỹ"]={ "Y","̃" },
- ["ỹ"]={ "y","̃" },
- ["ἀ"]={ "α","̓" },
- ["ἁ"]={ "α","̔" },
- ["ἂ"]={ "ἀ","̀" },
- ["ἃ"]={ "ἁ","̀" },
- ["ἄ"]={ "ἀ","́" },
- ["ἅ"]={ "ἁ","́" },
- ["ἆ"]={ "ἀ","͂" },
- ["ἇ"]={ "ἁ","͂" },
- ["Ἀ"]={ "Α","̓" },
- ["Ἁ"]={ "Α","̔" },
- ["Ἂ"]={ "Ἀ","̀" },
- ["Ἃ"]={ "Ἁ","̀" },
- ["Ἄ"]={ "Ἀ","́" },
- ["Ἅ"]={ "Ἁ","́" },
- ["Ἆ"]={ "Ἀ","͂" },
- ["Ἇ"]={ "Ἁ","͂" },
- ["ἐ"]={ "ε","̓" },
- ["ἑ"]={ "ε","̔" },
- ["ἒ"]={ "ἐ","̀" },
- ["ἓ"]={ "ἑ","̀" },
- ["ἔ"]={ "ἐ","́" },
- ["ἕ"]={ "ἑ","́" },
- ["Ἐ"]={ "Ε","̓" },
- ["Ἑ"]={ "Ε","̔" },
- ["Ἒ"]={ "Ἐ","̀" },
- ["Ἓ"]={ "Ἑ","̀" },
- ["Ἔ"]={ "Ἐ","́" },
- ["Ἕ"]={ "Ἑ","́" },
- ["ἠ"]={ "η","̓" },
- ["ἡ"]={ "η","̔" },
- ["ἢ"]={ "ἠ","̀" },
- ["ἣ"]={ "ἡ","̀" },
- ["ἤ"]={ "ἠ","́" },
- ["ἥ"]={ "ἡ","́" },
- ["ἦ"]={ "ἠ","͂" },
- ["ἧ"]={ "ἡ","͂" },
- ["Ἠ"]={ "Η","̓" },
- ["Ἡ"]={ "Η","̔" },
- ["Ἢ"]={ "Ἠ","̀" },
- ["Ἣ"]={ "Ἡ","̀" },
- ["Ἤ"]={ "Ἠ","́" },
- ["Ἥ"]={ "Ἡ","́" },
- ["Ἦ"]={ "Ἠ","͂" },
- ["Ἧ"]={ "Ἡ","͂" },
- ["ἰ"]={ "ι","̓" },
- ["ἱ"]={ "ι","̔" },
- ["ἲ"]={ "ἰ","̀" },
- ["ἳ"]={ "ἱ","̀" },
- ["ἴ"]={ "ἰ","́" },
- ["ἵ"]={ "ἱ","́" },
- ["ἶ"]={ "ἰ","͂" },
- ["ἷ"]={ "ἱ","͂" },
- ["Ἰ"]={ "Ι","̓" },
- ["Ἱ"]={ "Ι","̔" },
- ["Ἲ"]={ "Ἰ","̀" },
- ["Ἳ"]={ "Ἱ","̀" },
- ["Ἴ"]={ "Ἰ","́" },
- ["Ἵ"]={ "Ἱ","́" },
- ["Ἶ"]={ "Ἰ","͂" },
- ["Ἷ"]={ "Ἱ","͂" },
- ["ὀ"]={ "ο","̓" },
- ["ὁ"]={ "ο","̔" },
- ["ὂ"]={ "ὀ","̀" },
- ["ὃ"]={ "ὁ","̀" },
- ["ὄ"]={ "ὀ","́" },
- ["ὅ"]={ "ὁ","́" },
- ["Ὀ"]={ "Ο","̓" },
- ["Ὁ"]={ "Ο","̔" },
- ["Ὂ"]={ "Ὀ","̀" },
- ["Ὃ"]={ "Ὁ","̀" },
- ["Ὄ"]={ "Ὀ","́" },
- ["Ὅ"]={ "Ὁ","́" },
- ["ὐ"]={ "υ","̓" },
- ["ὑ"]={ "υ","̔" },
- ["ὒ"]={ "ὐ","̀" },
- ["ὓ"]={ "ὑ","̀" },
- ["ὔ"]={ "ὐ","́" },
- ["ὕ"]={ "ὑ","́" },
- ["ὖ"]={ "ὐ","͂" },
- ["ὗ"]={ "ὑ","͂" },
- ["Ὑ"]={ "Υ","̔" },
- ["Ὓ"]={ "Ὑ","̀" },
- ["Ὕ"]={ "Ὑ","́" },
- ["Ὗ"]={ "Ὑ","͂" },
- ["ὠ"]={ "ω","̓" },
- ["ὡ"]={ "ω","̔" },
- ["ὢ"]={ "ὠ","̀" },
- ["ὣ"]={ "ὡ","̀" },
- ["ὤ"]={ "ὠ","́" },
- ["ὥ"]={ "ὡ","́" },
- ["ὦ"]={ "ὠ","͂" },
- ["ὧ"]={ "ὡ","͂" },
- ["Ὠ"]={ "Ω","̓" },
- ["Ὡ"]={ "Ω","̔" },
- ["Ὢ"]={ "Ὠ","̀" },
- ["Ὣ"]={ "Ὡ","̀" },
- ["Ὤ"]={ "Ὠ","́" },
- ["Ὥ"]={ "Ὡ","́" },
- ["Ὦ"]={ "Ὠ","͂" },
- ["Ὧ"]={ "Ὡ","͂" },
- ["ὰ"]={ "α","̀" },
- ["ὲ"]={ "ε","̀" },
- ["ὴ"]={ "η","̀" },
- ["ὶ"]={ "ι","̀" },
- ["ὸ"]={ "ο","̀" },
- ["ὺ"]={ "υ","̀" },
- ["ὼ"]={ "ω","̀" },
- ["ᾀ"]={ "ἀ","ͅ" },
- ["ᾁ"]={ "ἁ","ͅ" },
- ["ᾂ"]={ "ἂ","ͅ" },
- ["ᾃ"]={ "ἃ","ͅ" },
- ["ᾄ"]={ "ἄ","ͅ" },
- ["ᾅ"]={ "ἅ","ͅ" },
- ["ᾆ"]={ "ἆ","ͅ" },
- ["ᾇ"]={ "ἇ","ͅ" },
- ["ᾈ"]={ "Ἀ","ͅ" },
- ["ᾉ"]={ "Ἁ","ͅ" },
- ["ᾊ"]={ "Ἂ","ͅ" },
- ["ᾋ"]={ "Ἃ","ͅ" },
- ["ᾌ"]={ "Ἄ","ͅ" },
- ["ᾍ"]={ "Ἅ","ͅ" },
- ["ᾎ"]={ "Ἆ","ͅ" },
- ["ᾏ"]={ "Ἇ","ͅ" },
- ["ᾐ"]={ "ἠ","ͅ" },
- ["ᾑ"]={ "ἡ","ͅ" },
- ["ᾒ"]={ "ἢ","ͅ" },
- ["ᾓ"]={ "ἣ","ͅ" },
- ["ᾔ"]={ "ἤ","ͅ" },
- ["ᾕ"]={ "ἥ","ͅ" },
- ["ᾖ"]={ "ἦ","ͅ" },
- ["ᾗ"]={ "ἧ","ͅ" },
- ["ᾘ"]={ "Ἠ","ͅ" },
- ["ᾙ"]={ "Ἡ","ͅ" },
- ["ᾚ"]={ "Ἢ","ͅ" },
- ["ᾛ"]={ "Ἣ","ͅ" },
- ["ᾜ"]={ "Ἤ","ͅ" },
- ["ᾝ"]={ "Ἥ","ͅ" },
- ["ᾞ"]={ "Ἦ","ͅ" },
- ["ᾟ"]={ "Ἧ","ͅ" },
- ["ᾠ"]={ "ὠ","ͅ" },
- ["ᾡ"]={ "ὡ","ͅ" },
- ["ᾢ"]={ "ὢ","ͅ" },
- ["ᾣ"]={ "ὣ","ͅ" },
- ["ᾤ"]={ "ὤ","ͅ" },
- ["ᾥ"]={ "ὥ","ͅ" },
- ["ᾦ"]={ "ὦ","ͅ" },
- ["ᾧ"]={ "ὧ","ͅ" },
- ["ᾨ"]={ "Ὠ","ͅ" },
- ["ᾩ"]={ "Ὡ","ͅ" },
- ["ᾪ"]={ "Ὢ","ͅ" },
- ["ᾫ"]={ "Ὣ","ͅ" },
- ["ᾬ"]={ "Ὤ","ͅ" },
- ["ᾭ"]={ "Ὥ","ͅ" },
- ["ᾮ"]={ "Ὦ","ͅ" },
- ["ᾯ"]={ "Ὧ","ͅ" },
- ["ᾰ"]={ "α","̆" },
- ["ᾱ"]={ "α","̄" },
- ["ᾲ"]={ "ὰ","ͅ" },
- ["ᾳ"]={ "α","ͅ" },
- ["ᾴ"]={ "ά","ͅ" },
- ["ᾶ"]={ "α","͂" },
- ["ᾷ"]={ "ᾶ","ͅ" },
- ["Ᾰ"]={ "Α","̆" },
- ["Ᾱ"]={ "Α","̄" },
- ["Ὰ"]={ "Α","̀" },
- ["ᾼ"]={ "Α","ͅ" },
- ["῁"]={ "¨","͂" },
- ["ῂ"]={ "ὴ","ͅ" },
- ["ῃ"]={ "η","ͅ" },
- ["ῄ"]={ "ή","ͅ" },
- ["ῆ"]={ "η","͂" },
- ["ῇ"]={ "ῆ","ͅ" },
- ["Ὲ"]={ "Ε","̀" },
- ["Ὴ"]={ "Η","̀" },
- ["ῌ"]={ "Η","ͅ" },
- ["῍"]={ "᾿","̀" },
- ["῎"]={ "᾿","́" },
- ["῏"]={ "᾿","͂" },
- ["ῐ"]={ "ι","̆" },
- ["ῑ"]={ "ι","̄" },
- ["ῒ"]={ "ϊ","̀" },
- ["ῖ"]={ "ι","͂" },
- ["ῗ"]={ "ϊ","͂" },
- ["Ῐ"]={ "Ι","̆" },
- ["Ῑ"]={ "Ι","̄" },
- ["Ὶ"]={ "Ι","̀" },
- ["῝"]={ "῾","̀" },
- ["῞"]={ "῾","́" },
- ["῟"]={ "῾","͂" },
- ["ῠ"]={ "υ","̆" },
- ["ῡ"]={ "υ","̄" },
- ["ῢ"]={ "ϋ","̀" },
- ["ῤ"]={ "ρ","̓" },
- ["ῥ"]={ "ρ","̔" },
- ["ῦ"]={ "υ","͂" },
- ["ῧ"]={ "ϋ","͂" },
- ["Ῠ"]={ "Υ","̆" },
- ["Ῡ"]={ "Υ","̄" },
- ["Ὺ"]={ "Υ","̀" },
- ["Ῥ"]={ "Ρ","̔" },
- ["῭"]={ "¨","̀" },
- ["ῲ"]={ "ὼ","ͅ" },
- ["ῳ"]={ "ω","ͅ" },
- ["ῴ"]={ "ώ","ͅ" },
- ["ῶ"]={ "ω","͂" },
- ["ῷ"]={ "ῶ","ͅ" },
- ["Ὸ"]={ "Ο","̀" },
- ["Ὼ"]={ "Ω","̀" },
- ["ῼ"]={ "Ω","ͅ" },
- ["↚"]={ "←","̸" },
- ["↛"]={ "→","̸" },
- ["↮"]={ "↔","̸" },
- ["⇍"]={ "⇐","̸" },
- ["⇎"]={ "⇔","̸" },
- ["⇏"]={ "⇒","̸" },
- ["∄"]={ "∃","̸" },
- ["∉"]={ "∈","̸" },
- ["∌"]={ "∋","̸" },
- ["∤"]={ "∣","̸" },
- ["∦"]={ "∥","̸" },
- ["≁"]={ "∼","̸" },
- ["≄"]={ "≃","̸" },
- ["≇"]={ "≅","̸" },
- ["≉"]={ "≈","̸" },
- ["≠"]={ "=","̸" },
- ["≢"]={ "≡","̸" },
- ["≭"]={ "≍","̸" },
- ["≮"]={ "<","̸" },
- ["≯"]={ ">","̸" },
- ["≰"]={ "≤","̸" },
- ["≱"]={ "≥","̸" },
- ["≴"]={ "≲","̸" },
- ["≵"]={ "≳","̸" },
- ["≸"]={ "≶","̸" },
- ["≹"]={ "≷","̸" },
- ["⊀"]={ "≺","̸" },
- ["⊁"]={ "≻","̸" },
- ["⊄"]={ "⊂","̸" },
- ["⊅"]={ "⊃","̸" },
- ["⊈"]={ "⊆","̸" },
- ["⊉"]={ "⊇","̸" },
- ["⊬"]={ "⊢","̸" },
- ["⊭"]={ "⊨","̸" },
- ["⊮"]={ "⊩","̸" },
- ["⊯"]={ "⊫","̸" },
- ["⋠"]={ "≼","̸" },
- ["⋡"]={ "≽","̸" },
- ["⋢"]={ "⊑","̸" },
- ["⋣"]={ "⊒","̸" },
- ["⋪"]={ "⊲","̸" },
- ["⋫"]={ "⊳","̸" },
- ["⋬"]={ "⊴","̸" },
- ["⋭"]={ "⊵","̸" },
- ["⫝̸"]={ "⫝","̸" },
- ["が"]={ "か","゙" },
- ["ぎ"]={ "き","゙" },
- ["ぐ"]={ "く","゙" },
- ["げ"]={ "け","゙" },
- ["ご"]={ "こ","゙" },
- ["ざ"]={ "さ","゙" },
- ["じ"]={ "し","゙" },
- ["ず"]={ "す","゙" },
- ["ぜ"]={ "せ","゙" },
- ["ぞ"]={ "そ","゙" },
- ["だ"]={ "た","゙" },
- ["ぢ"]={ "ち","゙" },
- ["づ"]={ "つ","゙" },
- ["で"]={ "て","゙" },
- ["ど"]={ "と","゙" },
- ["ば"]={ "は","゙" },
- ["ぱ"]={ "は","゚" },
- ["び"]={ "ひ","゙" },
- ["ぴ"]={ "ひ","゚" },
- ["ぶ"]={ "ふ","゙" },
- ["ぷ"]={ "ふ","゚" },
- ["べ"]={ "へ","゙" },
- ["ぺ"]={ "へ","゚" },
- ["ぼ"]={ "ほ","゙" },
- ["ぽ"]={ "ほ","゚" },
- ["ゔ"]={ "う","゙" },
- ["ゞ"]={ "ゝ","゙" },
- ["ガ"]={ "カ","゙" },
- ["ギ"]={ "キ","゙" },
- ["グ"]={ "ク","゙" },
- ["ゲ"]={ "ケ","゙" },
- ["ゴ"]={ "コ","゙" },
- ["ザ"]={ "サ","゙" },
- ["ジ"]={ "シ","゙" },
- ["ズ"]={ "ス","゙" },
- ["ゼ"]={ "セ","゙" },
- ["ゾ"]={ "ソ","゙" },
- ["ダ"]={ "タ","゙" },
- ["ヂ"]={ "チ","゙" },
- ["ヅ"]={ "ツ","゙" },
- ["デ"]={ "テ","゙" },
- ["ド"]={ "ト","゙" },
- ["バ"]={ "ハ","゙" },
- ["パ"]={ "ハ","゚" },
- ["ビ"]={ "ヒ","゙" },
- ["ピ"]={ "ヒ","゚" },
- ["ブ"]={ "フ","゙" },
- ["プ"]={ "フ","゚" },
- ["ベ"]={ "ヘ","゙" },
- ["ペ"]={ "ヘ","゚" },
- ["ボ"]={ "ホ","゙" },
- ["ポ"]={ "ホ","゚" },
- ["ヴ"]={ "ウ","゙" },
- ["ヷ"]={ "ワ","゙" },
- ["ヸ"]={ "ヰ","゙" },
- ["ヹ"]={ "ヱ","゙" },
- ["ヺ"]={ "ヲ","゙" },
- ["ヾ"]={ "ヽ","゙" },
- ["יִ"]={ "י","ִ" },
- ["ײַ"]={ "ײ","ַ" },
- ["שׁ"]={ "ש","ׁ" },
- ["שׂ"]={ "ש","ׂ" },
- ["שּׁ"]={ "שּ","ׁ" },
- ["שּׂ"]={ "שּ","ׂ" },
- ["אַ"]={ "א","ַ" },
- ["אָ"]={ "א","ָ" },
- ["אּ"]={ "א","ּ" },
- ["בּ"]={ "ב","ּ" },
- ["גּ"]={ "ג","ּ" },
- ["דּ"]={ "ד","ּ" },
- ["הּ"]={ "ה","ּ" },
- ["וּ"]={ "ו","ּ" },
- ["זּ"]={ "ז","ּ" },
- ["טּ"]={ "ט","ּ" },
- ["יּ"]={ "י","ּ" },
- ["ךּ"]={ "ך","ּ" },
- ["כּ"]={ "כ","ּ" },
- ["לּ"]={ "ל","ּ" },
- ["מּ"]={ "מ","ּ" },
- ["נּ"]={ "נ","ּ" },
- ["סּ"]={ "ס","ּ" },
- ["ףּ"]={ "ף","ּ" },
- ["פּ"]={ "פ","ּ" },
- ["צּ"]={ "צ","ּ" },
- ["קּ"]={ "ק","ּ" },
- ["רּ"]={ "ר","ּ" },
- ["שּ"]={ "ש","ּ" },
- ["תּ"]={ "ת","ּ" },
- ["וֹ"]={ "ו","ֹ" },
- ["בֿ"]={ "ב","ֿ" },
- ["כֿ"]={ "כ","ֿ" },
- ["פֿ"]={ "פ","ֿ" },
- ["𑂚"]={ "𑂙","𑂺" },
- ["𑂜"]={ "𑂛","𑂺" },
- ["𑂫"]={ "𑂥","𑂺" },
- ["𑄮"]={ "𑄱","𑄧" },
- ["𑄯"]={ "𑄲","𑄧" },
- ["𑍋"]={ "𑍇","𑌾" },
- ["𑍌"]={ "𑍇","𑍗" },
- ["𑒻"]={ "𑒹","𑒺" },
- ["𑒼"]={ "𑒹","𑒰" },
- ["𑒾"]={ "𑒹","𑒽" },
- ["𑖺"]={ "𑖸","𑖯" },
- ["𑖻"]={ "𑖹","𑖯" },
- ["𝅗𝅥"]={ "𝅗","𝅥" },
- ["𝅘𝅥"]={ "𝅘","𝅥" },
- ["𝅘𝅥𝅮"]={ "𝅘𝅥","𝅮" },
- ["𝅘𝅥𝅯"]={ "𝅘𝅥","𝅯" },
- ["𝅘𝅥𝅰"]={ "𝅘𝅥","𝅰" },
- ["𝅘𝅥𝅱"]={ "𝅘𝅥","𝅱" },
- ["𝅘𝅥𝅲"]={ "𝅘𝅥","𝅲" },
- ["𝆹𝅥"]={ "𝆹","𝅥" },
- ["𝆺𝅥"]={ "𝆺","𝅥" },
- ["𝆹𝅥𝅮"]={ "𝆹𝅥","𝅮" },
- ["𝆺𝅥𝅮"]={ "𝆺𝅥","𝅮" },
- ["𝆹𝅥𝅯"]={ "𝆹𝅥","𝅯" },
- ["𝆺𝅥𝅯"]={ "𝆺𝅥","𝅯" },
- },
- },
- {
- ["data"]={
- ["À"]={ "A","̀" },
- ["Á"]={ "A","́" },
- ["Â"]={ "A","̂" },
- ["Ã"]={ "A","̃" },
- ["Ä"]={ "A","̈" },
- ["Å"]={ "A","̊" },
- ["Ç"]={ "C","̧" },
- ["È"]={ "E","̀" },
- ["É"]={ "E","́" },
- ["Ê"]={ "E","̂" },
- ["Ë"]={ "E","̈" },
- ["Ì"]={ "I","̀" },
- ["Í"]={ "I","́" },
- ["Î"]={ "I","̂" },
- ["Ï"]={ "I","̈" },
- ["Ñ"]={ "N","̃" },
- ["Ò"]={ "O","̀" },
- ["Ó"]={ "O","́" },
- ["Ô"]={ "O","̂" },
- ["Õ"]={ "O","̃" },
- ["Ö"]={ "O","̈" },
- ["Ù"]={ "U","̀" },
- ["Ú"]={ "U","́" },
- ["Û"]={ "U","̂" },
- ["Ü"]={ "U","̈" },
- ["Ý"]={ "Y","́" },
- ["à"]={ "a","̀" },
- ["á"]={ "a","́" },
- ["â"]={ "a","̂" },
- ["ã"]={ "a","̃" },
- ["ä"]={ "a","̈" },
- ["å"]={ "a","̊" },
- ["ç"]={ "c","̧" },
- ["è"]={ "e","̀" },
- ["é"]={ "e","́" },
- ["ê"]={ "e","̂" },
- ["ë"]={ "e","̈" },
- ["ì"]={ "i","̀" },
- ["í"]={ "i","́" },
- ["î"]={ "i","̂" },
- ["ï"]={ "i","̈" },
- ["ñ"]={ "n","̃" },
- ["ò"]={ "o","̀" },
- ["ó"]={ "o","́" },
- ["ô"]={ "o","̂" },
- ["õ"]={ "o","̃" },
- ["ö"]={ "o","̈" },
- ["ù"]={ "u","̀" },
- ["ú"]={ "u","́" },
- ["û"]={ "u","̂" },
- ["ü"]={ "u","̈" },
- ["ý"]={ "y","́" },
- ["ÿ"]={ "y","̈" },
- ["Ā"]={ "A","̄" },
- ["ā"]={ "a","̄" },
- ["Ă"]={ "A","̆" },
- ["ă"]={ "a","̆" },
- ["Ą"]={ "A","̨" },
- ["ą"]={ "a","̨" },
- ["Ć"]={ "C","́" },
- ["ć"]={ "c","́" },
- ["Ĉ"]={ "C","̂" },
- ["ĉ"]={ "c","̂" },
- ["Ċ"]={ "C","̇" },
- ["ċ"]={ "c","̇" },
- ["Č"]={ "C","̌" },
- ["č"]={ "c","̌" },
- ["Ď"]={ "D","̌" },
- ["ď"]={ "d","̌" },
- ["Ē"]={ "E","̄" },
- ["ē"]={ "e","̄" },
- ["Ĕ"]={ "E","̆" },
- ["ĕ"]={ "e","̆" },
- ["Ė"]={ "E","̇" },
- ["ė"]={ "e","̇" },
- ["Ę"]={ "E","̨" },
- ["ę"]={ "e","̨" },
- ["Ě"]={ "E","̌" },
- ["ě"]={ "e","̌" },
- ["Ĝ"]={ "G","̂" },
- ["ĝ"]={ "g","̂" },
- ["Ğ"]={ "G","̆" },
- ["ğ"]={ "g","̆" },
- ["Ġ"]={ "G","̇" },
- ["ġ"]={ "g","̇" },
- ["Ģ"]={ "G","̧" },
- ["ģ"]={ "g","̧" },
- ["Ĥ"]={ "H","̂" },
- ["ĥ"]={ "h","̂" },
- ["Ĩ"]={ "I","̃" },
- ["ĩ"]={ "i","̃" },
- ["Ī"]={ "I","̄" },
- ["ī"]={ "i","̄" },
- ["Ĭ"]={ "I","̆" },
- ["ĭ"]={ "i","̆" },
- ["Į"]={ "I","̨" },
- ["į"]={ "i","̨" },
- ["İ"]={ "I","̇" },
- ["Ĵ"]={ "J","̂" },
- ["ĵ"]={ "j","̂" },
- ["Ķ"]={ "K","̧" },
- ["ķ"]={ "k","̧" },
- ["Ĺ"]={ "L","́" },
- ["ĺ"]={ "l","́" },
- ["Ļ"]={ "L","̧" },
- ["ļ"]={ "l","̧" },
- ["Ľ"]={ "L","̌" },
- ["ľ"]={ "l","̌" },
- ["Ń"]={ "N","́" },
- ["ń"]={ "n","́" },
- ["Ņ"]={ "N","̧" },
- ["ņ"]={ "n","̧" },
- ["Ň"]={ "N","̌" },
- ["ň"]={ "n","̌" },
- ["Ō"]={ "O","̄" },
- ["ō"]={ "o","̄" },
- ["Ŏ"]={ "O","̆" },
- ["ŏ"]={ "o","̆" },
- ["Ő"]={ "O","̋" },
- ["ő"]={ "o","̋" },
- ["Ŕ"]={ "R","́" },
- ["ŕ"]={ "r","́" },
- ["Ŗ"]={ "R","̧" },
- ["ŗ"]={ "r","̧" },
- ["Ř"]={ "R","̌" },
- ["ř"]={ "r","̌" },
- ["Ś"]={ "S","́" },
- ["ś"]={ "s","́" },
- ["Ŝ"]={ "S","̂" },
- ["ŝ"]={ "s","̂" },
- ["Ş"]={ "S","̧" },
- ["ş"]={ "s","̧" },
- ["Š"]={ "S","̌" },
- ["š"]={ "s","̌" },
- ["Ţ"]={ "T","̧" },
- ["ţ"]={ "t","̧" },
- ["Ť"]={ "T","̌" },
- ["ť"]={ "t","̌" },
- ["Ũ"]={ "U","̃" },
- ["ũ"]={ "u","̃" },
- ["Ū"]={ "U","̄" },
- ["ū"]={ "u","̄" },
- ["Ŭ"]={ "U","̆" },
- ["ŭ"]={ "u","̆" },
- ["Ů"]={ "U","̊" },
- ["ů"]={ "u","̊" },
- ["Ű"]={ "U","̋" },
- ["ű"]={ "u","̋" },
- ["Ų"]={ "U","̨" },
- ["ų"]={ "u","̨" },
- ["Ŵ"]={ "W","̂" },
- ["ŵ"]={ "w","̂" },
- ["Ŷ"]={ "Y","̂" },
- ["ŷ"]={ "y","̂" },
- ["Ÿ"]={ "Y","̈" },
- ["Ź"]={ "Z","́" },
- ["ź"]={ "z","́" },
- ["Ż"]={ "Z","̇" },
- ["ż"]={ "z","̇" },
- ["Ž"]={ "Z","̌" },
- ["ž"]={ "z","̌" },
- ["Ơ"]={ "O","̛" },
- ["ơ"]={ "o","̛" },
- ["Ư"]={ "U","̛" },
- ["ư"]={ "u","̛" },
- ["Ǎ"]={ "A","̌" },
- ["ǎ"]={ "a","̌" },
- ["Ǐ"]={ "I","̌" },
- ["ǐ"]={ "i","̌" },
- ["Ǒ"]={ "O","̌" },
- ["ǒ"]={ "o","̌" },
- ["Ǔ"]={ "U","̌" },
- ["ǔ"]={ "u","̌" },
- ["Ǖ"]={ "Ü","̄" },
- ["ǖ"]={ "ü","̄" },
- ["Ǘ"]={ "Ü","́" },
- ["ǘ"]={ "ü","́" },
- ["Ǚ"]={ "Ü","̌" },
- ["ǚ"]={ "ü","̌" },
- ["Ǜ"]={ "Ü","̀" },
- ["ǜ"]={ "ü","̀" },
- ["Ǟ"]={ "Ä","̄" },
- ["ǟ"]={ "ä","̄" },
- ["Ǡ"]={ "Ȧ","̄" },
- ["ǡ"]={ "ȧ","̄" },
- ["Ǣ"]={ "Æ","̄" },
- ["ǣ"]={ "æ","̄" },
- ["Ǧ"]={ "G","̌" },
- ["ǧ"]={ "g","̌" },
- ["Ǩ"]={ "K","̌" },
- ["ǩ"]={ "k","̌" },
- ["Ǫ"]={ "O","̨" },
- ["ǫ"]={ "o","̨" },
- ["Ǭ"]={ "Ǫ","̄" },
- ["ǭ"]={ "ǫ","̄" },
- ["Ǯ"]={ "Ʒ","̌" },
- ["ǯ"]={ "ʒ","̌" },
- ["ǰ"]={ "j","̌" },
- ["Ǵ"]={ "G","́" },
- ["ǵ"]={ "g","́" },
- ["Ǹ"]={ "N","̀" },
- ["ǹ"]={ "n","̀" },
- ["Ǻ"]={ "Å","́" },
- ["ǻ"]={ "å","́" },
- ["Ǽ"]={ "Æ","́" },
- ["ǽ"]={ "æ","́" },
- ["Ǿ"]={ "Ø","́" },
- ["ǿ"]={ "ø","́" },
- ["Ȁ"]={ "A","̏" },
- ["ȁ"]={ "a","̏" },
- ["Ȃ"]={ "A","̑" },
- ["ȃ"]={ "a","̑" },
- ["Ȅ"]={ "E","̏" },
- ["ȅ"]={ "e","̏" },
- ["Ȇ"]={ "E","̑" },
- ["ȇ"]={ "e","̑" },
- ["Ȉ"]={ "I","̏" },
- ["ȉ"]={ "i","̏" },
- ["Ȋ"]={ "I","̑" },
- ["ȋ"]={ "i","̑" },
- ["Ȍ"]={ "O","̏" },
- ["ȍ"]={ "o","̏" },
- ["Ȏ"]={ "O","̑" },
- ["ȏ"]={ "o","̑" },
- ["Ȑ"]={ "R","̏" },
- ["ȑ"]={ "r","̏" },
- ["Ȓ"]={ "R","̑" },
- ["ȓ"]={ "r","̑" },
- ["Ȕ"]={ "U","̏" },
- ["ȕ"]={ "u","̏" },
- ["Ȗ"]={ "U","̑" },
- ["ȗ"]={ "u","̑" },
- ["Ș"]={ "S","̦" },
- ["ș"]={ "s","̦" },
- ["Ț"]={ "T","̦" },
- ["ț"]={ "t","̦" },
- ["Ȟ"]={ "H","̌" },
- ["ȟ"]={ "h","̌" },
- ["Ȧ"]={ "A","̇" },
- ["ȧ"]={ "a","̇" },
- ["Ȩ"]={ "E","̧" },
- ["ȩ"]={ "e","̧" },
- ["Ȫ"]={ "Ö","̄" },
- ["ȫ"]={ "ö","̄" },
- ["Ȭ"]={ "Õ","̄" },
- ["ȭ"]={ "õ","̄" },
- ["Ȯ"]={ "O","̇" },
- ["ȯ"]={ "o","̇" },
- ["Ȱ"]={ "Ȯ","̄" },
- ["ȱ"]={ "ȯ","̄" },
- ["Ȳ"]={ "Y","̄" },
- ["ȳ"]={ "y","̄" },
- ["̈́"]={ "̈","́" },
- ["΅"]={ "¨","́" },
- ["Ά"]={ "Α","́" },
- ["Έ"]={ "Ε","́" },
- ["Ή"]={ "Η","́" },
- ["Ί"]={ "Ι","́" },
- ["Ό"]={ "Ο","́" },
- ["Ύ"]={ "Υ","́" },
- ["Ώ"]={ "Ω","́" },
- ["ΐ"]={ "ϊ","́" },
- ["Ϊ"]={ "Ι","̈" },
- ["Ϋ"]={ "Υ","̈" },
- ["ά"]={ "α","́" },
- ["έ"]={ "ε","́" },
- ["ή"]={ "η","́" },
- ["ί"]={ "ι","́" },
- ["ΰ"]={ "ϋ","́" },
- ["ϊ"]={ "ι","̈" },
- ["ϋ"]={ "υ","̈" },
- ["ό"]={ "ο","́" },
- ["ύ"]={ "υ","́" },
- ["ώ"]={ "ω","́" },
- ["ϓ"]={ "ϒ","́" },
- ["ϔ"]={ "ϒ","̈" },
- ["Ѐ"]={ "Е","̀" },
- ["Ё"]={ "Е","̈" },
- ["Ѓ"]={ "Г","́" },
- ["Ї"]={ "І","̈" },
- ["Ќ"]={ "К","́" },
- ["Ѝ"]={ "И","̀" },
- ["Ў"]={ "У","̆" },
- ["Й"]={ "И","̆" },
- ["й"]={ "и","̆" },
- ["ѐ"]={ "е","̀" },
- ["ё"]={ "е","̈" },
- ["ѓ"]={ "г","́" },
- ["ї"]={ "і","̈" },
- ["ќ"]={ "к","́" },
- ["ѝ"]={ "и","̀" },
- ["ў"]={ "у","̆" },
- ["Ѷ"]={ "Ѵ","̏" },
- ["ѷ"]={ "ѵ","̏" },
- ["Ӂ"]={ "Ж","̆" },
- ["ӂ"]={ "ж","̆" },
- ["Ӑ"]={ "А","̆" },
- ["ӑ"]={ "а","̆" },
- ["Ӓ"]={ "А","̈" },
- ["ӓ"]={ "а","̈" },
- ["Ӗ"]={ "Е","̆" },
- ["ӗ"]={ "е","̆" },
- ["Ӛ"]={ "Ә","̈" },
- ["ӛ"]={ "ә","̈" },
- ["Ӝ"]={ "Ж","̈" },
- ["ӝ"]={ "ж","̈" },
- ["Ӟ"]={ "З","̈" },
- ["ӟ"]={ "з","̈" },
- ["Ӣ"]={ "И","̄" },
- ["ӣ"]={ "и","̄" },
- ["Ӥ"]={ "И","̈" },
- ["ӥ"]={ "и","̈" },
- ["Ӧ"]={ "О","̈" },
- ["ӧ"]={ "о","̈" },
- ["Ӫ"]={ "Ө","̈" },
- ["ӫ"]={ "ө","̈" },
- ["Ӭ"]={ "Э","̈" },
- ["ӭ"]={ "э","̈" },
- ["Ӯ"]={ "У","̄" },
- ["ӯ"]={ "у","̄" },
- ["Ӱ"]={ "У","̈" },
- ["ӱ"]={ "у","̈" },
- ["Ӳ"]={ "У","̋" },
- ["ӳ"]={ "у","̋" },
- ["Ӵ"]={ "Ч","̈" },
- ["ӵ"]={ "ч","̈" },
- ["Ӹ"]={ "Ы","̈" },
- ["ӹ"]={ "ы","̈" },
- ["آ"]={ "ا","ٓ" },
- ["أ"]={ "ا","ٔ" },
- ["ؤ"]={ "و","ٔ" },
- ["إ"]={ "ا","ٕ" },
- ["ئ"]={ "ي","ٔ" },
- ["ۀ"]={ "ە","ٔ" },
- ["ۂ"]={ "ہ","ٔ" },
- ["ۓ"]={ "ے","ٔ" },
- ["ऩ"]={ "न","़" },
- ["ऱ"]={ "र","़" },
- ["ऴ"]={ "ळ","़" },
- ["क़"]={ "क","़" },
- ["ख़"]={ "ख","़" },
- ["ग़"]={ "ग","़" },
- ["ज़"]={ "ज","़" },
- ["ड़"]={ "ड","़" },
- ["ढ़"]={ "ढ","़" },
- ["फ़"]={ "फ","़" },
- ["य़"]={ "य","़" },
- ["ো"]={ "ে","া" },
- ["ৌ"]={ "ে","ৗ" },
- ["ড়"]={ "ড","়" },
- ["ঢ়"]={ "ঢ","়" },
- ["য়"]={ "য","়" },
- ["ਲ਼"]={ "ਲ","਼" },
- ["ਸ਼"]={ "ਸ","਼" },
- ["ਖ਼"]={ "ਖ","਼" },
- ["ਗ਼"]={ "ਗ","਼" },
- ["ਜ਼"]={ "ਜ","਼" },
- ["ਫ਼"]={ "ਫ","਼" },
- ["ୈ"]={ "େ","ୖ" },
- ["ୋ"]={ "େ","ା" },
- ["ୌ"]={ "େ","ୗ" },
- ["ଡ଼"]={ "ଡ","଼" },
- ["ଢ଼"]={ "ଢ","଼" },
- ["ஔ"]={ "ஒ","ௗ" },
- ["ொ"]={ "ெ","ா" },
- ["ோ"]={ "ே","ா" },
- ["ௌ"]={ "ெ","ௗ" },
- ["ై"]={ "ె","ౖ" },
- ["ೀ"]={ "ಿ","ೕ" },
- ["ೇ"]={ "ೆ","ೕ" },
- ["ೈ"]={ "ೆ","ೖ" },
- ["ೊ"]={ "ೆ","ೂ" },
- ["ೋ"]={ "ೊ","ೕ" },
- ["ൊ"]={ "െ","ാ" },
- ["ോ"]={ "േ","ാ" },
- ["ൌ"]={ "െ","ൗ" },
- ["ේ"]={ "ෙ","්" },
- ["ො"]={ "ෙ","ා" },
- ["ෝ"]={ "ො","්" },
- ["ෞ"]={ "ෙ","ෟ" },
- ["གྷ"]={ "ག","ྷ" },
- ["ཌྷ"]={ "ཌ","ྷ" },
- ["དྷ"]={ "ད","ྷ" },
- ["བྷ"]={ "བ","ྷ" },
- ["ཛྷ"]={ "ཛ","ྷ" },
- ["ཀྵ"]={ "ཀ","ྵ" },
- ["ཱི"]={ "ཱ","ི" },
- ["ཱུ"]={ "ཱ","ུ" },
- ["ྲྀ"]={ "ྲ","ྀ" },
- ["ླྀ"]={ "ླ","ྀ" },
- ["ཱྀ"]={ "ཱ","ྀ" },
- ["ྒྷ"]={ "ྒ","ྷ" },
- ["ྜྷ"]={ "ྜ","ྷ" },
- ["ྡྷ"]={ "ྡ","ྷ" },
- ["ྦྷ"]={ "ྦ","ྷ" },
- ["ྫྷ"]={ "ྫ","ྷ" },
- ["ྐྵ"]={ "ྐ","ྵ" },
- ["ဦ"]={ "ဥ","ီ" },
- ["ᬆ"]={ "ᬅ","ᬵ" },
- ["ᬈ"]={ "ᬇ","ᬵ" },
- ["ᬊ"]={ "ᬉ","ᬵ" },
- ["ᬌ"]={ "ᬋ","ᬵ" },
- ["ᬎ"]={ "ᬍ","ᬵ" },
- ["ᬒ"]={ "ᬑ","ᬵ" },
- ["ᬻ"]={ "ᬺ","ᬵ" },
- ["ᬽ"]={ "ᬼ","ᬵ" },
- ["ᭀ"]={ "ᬾ","ᬵ" },
- ["ᭁ"]={ "ᬿ","ᬵ" },
- ["ᭃ"]={ "ᭂ","ᬵ" },
- ["Ḁ"]={ "A","̥" },
- ["ḁ"]={ "a","̥" },
- ["Ḃ"]={ "B","̇" },
- ["ḃ"]={ "b","̇" },
- ["Ḅ"]={ "B","̣" },
- ["ḅ"]={ "b","̣" },
- ["Ḇ"]={ "B","̱" },
- ["ḇ"]={ "b","̱" },
- ["Ḉ"]={ "Ç","́" },
- ["ḉ"]={ "ç","́" },
- ["Ḋ"]={ "D","̇" },
- ["ḋ"]={ "d","̇" },
- ["Ḍ"]={ "D","̣" },
- ["ḍ"]={ "d","̣" },
- ["Ḏ"]={ "D","̱" },
- ["ḏ"]={ "d","̱" },
- ["Ḑ"]={ "D","̧" },
- ["ḑ"]={ "d","̧" },
- ["Ḓ"]={ "D","̭" },
- ["ḓ"]={ "d","̭" },
- ["Ḕ"]={ "Ē","̀" },
- ["ḕ"]={ "ē","̀" },
- ["Ḗ"]={ "Ē","́" },
- ["ḗ"]={ "ē","́" },
- ["Ḙ"]={ "E","̭" },
- ["ḙ"]={ "e","̭" },
- ["Ḛ"]={ "E","̰" },
- ["ḛ"]={ "e","̰" },
- ["Ḝ"]={ "Ȩ","̆" },
- ["ḝ"]={ "ȩ","̆" },
- ["Ḟ"]={ "F","̇" },
- ["ḟ"]={ "f","̇" },
- ["Ḡ"]={ "G","̄" },
- ["ḡ"]={ "g","̄" },
- ["Ḣ"]={ "H","̇" },
- ["ḣ"]={ "h","̇" },
- ["Ḥ"]={ "H","̣" },
- ["ḥ"]={ "h","̣" },
- ["Ḧ"]={ "H","̈" },
- ["ḧ"]={ "h","̈" },
- ["Ḩ"]={ "H","̧" },
- ["ḩ"]={ "h","̧" },
- ["Ḫ"]={ "H","̮" },
- ["ḫ"]={ "h","̮" },
- ["Ḭ"]={ "I","̰" },
- ["ḭ"]={ "i","̰" },
- ["Ḯ"]={ "Ï","́" },
- ["ḯ"]={ "ï","́" },
- ["Ḱ"]={ "K","́" },
- ["ḱ"]={ "k","́" },
- ["Ḳ"]={ "K","̣" },
- ["ḳ"]={ "k","̣" },
- ["Ḵ"]={ "K","̱" },
- ["ḵ"]={ "k","̱" },
- ["Ḷ"]={ "L","̣" },
- ["ḷ"]={ "l","̣" },
- ["Ḹ"]={ "Ḷ","̄" },
- ["ḹ"]={ "ḷ","̄" },
- ["Ḻ"]={ "L","̱" },
- ["ḻ"]={ "l","̱" },
- ["Ḽ"]={ "L","̭" },
- ["ḽ"]={ "l","̭" },
- ["Ḿ"]={ "M","́" },
- ["ḿ"]={ "m","́" },
- ["Ṁ"]={ "M","̇" },
- ["ṁ"]={ "m","̇" },
- ["Ṃ"]={ "M","̣" },
- ["ṃ"]={ "m","̣" },
- ["Ṅ"]={ "N","̇" },
- ["ṅ"]={ "n","̇" },
- ["Ṇ"]={ "N","̣" },
- ["ṇ"]={ "n","̣" },
- ["Ṉ"]={ "N","̱" },
- ["ṉ"]={ "n","̱" },
- ["Ṋ"]={ "N","̭" },
- ["ṋ"]={ "n","̭" },
- ["Ṍ"]={ "Õ","́" },
- ["ṍ"]={ "õ","́" },
- ["Ṏ"]={ "Õ","̈" },
- ["ṏ"]={ "õ","̈" },
- ["Ṑ"]={ "Ō","̀" },
- ["ṑ"]={ "ō","̀" },
- ["Ṓ"]={ "Ō","́" },
- ["ṓ"]={ "ō","́" },
- ["Ṕ"]={ "P","́" },
- ["ṕ"]={ "p","́" },
- ["Ṗ"]={ "P","̇" },
- ["ṗ"]={ "p","̇" },
- ["Ṙ"]={ "R","̇" },
- ["ṙ"]={ "r","̇" },
- ["Ṛ"]={ "R","̣" },
- ["ṛ"]={ "r","̣" },
- ["Ṝ"]={ "Ṛ","̄" },
- ["ṝ"]={ "ṛ","̄" },
- ["Ṟ"]={ "R","̱" },
- ["ṟ"]={ "r","̱" },
- ["Ṡ"]={ "S","̇" },
- ["ṡ"]={ "s","̇" },
- ["Ṣ"]={ "S","̣" },
- ["ṣ"]={ "s","̣" },
- ["Ṥ"]={ "Ś","̇" },
- ["ṥ"]={ "ś","̇" },
- ["Ṧ"]={ "Š","̇" },
- ["ṧ"]={ "š","̇" },
- ["Ṩ"]={ "Ṣ","̇" },
- ["ṩ"]={ "ṣ","̇" },
- ["Ṫ"]={ "T","̇" },
- ["ṫ"]={ "t","̇" },
- ["Ṭ"]={ "T","̣" },
- ["ṭ"]={ "t","̣" },
- ["Ṯ"]={ "T","̱" },
- ["ṯ"]={ "t","̱" },
- ["Ṱ"]={ "T","̭" },
- ["ṱ"]={ "t","̭" },
- ["Ṳ"]={ "U","̤" },
- ["ṳ"]={ "u","̤" },
- ["Ṵ"]={ "U","̰" },
- ["ṵ"]={ "u","̰" },
- ["Ṷ"]={ "U","̭" },
- ["ṷ"]={ "u","̭" },
- ["Ṹ"]={ "Ũ","́" },
- ["ṹ"]={ "ũ","́" },
- ["Ṻ"]={ "Ū","̈" },
- ["ṻ"]={ "ū","̈" },
- ["Ṽ"]={ "V","̃" },
- ["ṽ"]={ "v","̃" },
- ["Ṿ"]={ "V","̣" },
- ["ṿ"]={ "v","̣" },
- ["Ẁ"]={ "W","̀" },
- ["ẁ"]={ "w","̀" },
- ["Ẃ"]={ "W","́" },
- ["ẃ"]={ "w","́" },
- ["Ẅ"]={ "W","̈" },
- ["ẅ"]={ "w","̈" },
- ["Ẇ"]={ "W","̇" },
- ["ẇ"]={ "w","̇" },
- ["Ẉ"]={ "W","̣" },
- ["ẉ"]={ "w","̣" },
- ["Ẋ"]={ "X","̇" },
- ["ẋ"]={ "x","̇" },
- ["Ẍ"]={ "X","̈" },
- ["ẍ"]={ "x","̈" },
- ["Ẏ"]={ "Y","̇" },
- ["ẏ"]={ "y","̇" },
- ["Ẑ"]={ "Z","̂" },
- ["ẑ"]={ "z","̂" },
- ["Ẓ"]={ "Z","̣" },
- ["ẓ"]={ "z","̣" },
- ["Ẕ"]={ "Z","̱" },
- ["ẕ"]={ "z","̱" },
- ["ẖ"]={ "h","̱" },
- ["ẗ"]={ "t","̈" },
- ["ẘ"]={ "w","̊" },
- ["ẙ"]={ "y","̊" },
- ["ẛ"]={ "ſ","̇" },
- ["Ạ"]={ "A","̣" },
- ["ạ"]={ "a","̣" },
- ["Ả"]={ "A","̉" },
- ["ả"]={ "a","̉" },
- ["Ấ"]={ "Â","́" },
- ["ấ"]={ "â","́" },
- ["Ầ"]={ "Â","̀" },
- ["ầ"]={ "â","̀" },
- ["Ẩ"]={ "Â","̉" },
- ["ẩ"]={ "â","̉" },
- ["Ẫ"]={ "Â","̃" },
- ["ẫ"]={ "â","̃" },
- ["Ậ"]={ "Ạ","̂" },
- ["ậ"]={ "ạ","̂" },
- ["Ắ"]={ "Ă","́" },
- ["ắ"]={ "ă","́" },
- ["Ằ"]={ "Ă","̀" },
- ["ằ"]={ "ă","̀" },
- ["Ẳ"]={ "Ă","̉" },
- ["ẳ"]={ "ă","̉" },
- ["Ẵ"]={ "Ă","̃" },
- ["ẵ"]={ "ă","̃" },
- ["Ặ"]={ "Ạ","̆" },
- ["ặ"]={ "ạ","̆" },
- ["Ẹ"]={ "E","̣" },
- ["ẹ"]={ "e","̣" },
- ["Ẻ"]={ "E","̉" },
- ["ẻ"]={ "e","̉" },
- ["Ẽ"]={ "E","̃" },
- ["ẽ"]={ "e","̃" },
- ["Ế"]={ "Ê","́" },
- ["ế"]={ "ê","́" },
- ["Ề"]={ "Ê","̀" },
- ["ề"]={ "ê","̀" },
- ["Ể"]={ "Ê","̉" },
- ["ể"]={ "ê","̉" },
- ["Ễ"]={ "Ê","̃" },
- ["ễ"]={ "ê","̃" },
- ["Ệ"]={ "Ẹ","̂" },
- ["ệ"]={ "ẹ","̂" },
- ["Ỉ"]={ "I","̉" },
- ["ỉ"]={ "i","̉" },
- ["Ị"]={ "I","̣" },
- ["ị"]={ "i","̣" },
- ["Ọ"]={ "O","̣" },
- ["ọ"]={ "o","̣" },
- ["Ỏ"]={ "O","̉" },
- ["ỏ"]={ "o","̉" },
- ["Ố"]={ "Ô","́" },
- ["ố"]={ "ô","́" },
- ["Ồ"]={ "Ô","̀" },
- ["ồ"]={ "ô","̀" },
- ["Ổ"]={ "Ô","̉" },
- ["ổ"]={ "ô","̉" },
- ["Ỗ"]={ "Ô","̃" },
- ["ỗ"]={ "ô","̃" },
- ["Ộ"]={ "Ọ","̂" },
- ["ộ"]={ "ọ","̂" },
- ["Ớ"]={ "Ơ","́" },
- ["ớ"]={ "ơ","́" },
- ["Ờ"]={ "Ơ","̀" },
- ["ờ"]={ "ơ","̀" },
- ["Ở"]={ "Ơ","̉" },
- ["ở"]={ "ơ","̉" },
- ["Ỡ"]={ "Ơ","̃" },
- ["ỡ"]={ "ơ","̃" },
- ["Ợ"]={ "Ơ","̣" },
- ["ợ"]={ "ơ","̣" },
- ["Ụ"]={ "U","̣" },
- ["ụ"]={ "u","̣" },
- ["Ủ"]={ "U","̉" },
- ["ủ"]={ "u","̉" },
- ["Ứ"]={ "Ư","́" },
- ["ứ"]={ "ư","́" },
- ["Ừ"]={ "Ư","̀" },
- ["ừ"]={ "ư","̀" },
- ["Ử"]={ "Ư","̉" },
- ["ử"]={ "ư","̉" },
- ["Ữ"]={ "Ư","̃" },
- ["ữ"]={ "ư","̃" },
- ["Ự"]={ "Ư","̣" },
- ["ự"]={ "ư","̣" },
- ["Ỳ"]={ "Y","̀" },
- ["ỳ"]={ "y","̀" },
- ["Ỵ"]={ "Y","̣" },
- ["ỵ"]={ "y","̣" },
- ["Ỷ"]={ "Y","̉" },
- ["ỷ"]={ "y","̉" },
- ["Ỹ"]={ "Y","̃" },
- ["ỹ"]={ "y","̃" },
- ["ἀ"]={ "α","̓" },
- ["ἁ"]={ "α","̔" },
- ["ἂ"]={ "ἀ","̀" },
- ["ἃ"]={ "ἁ","̀" },
- ["ἄ"]={ "ἀ","́" },
- ["ἅ"]={ "ἁ","́" },
- ["ἆ"]={ "ἀ","͂" },
- ["ἇ"]={ "ἁ","͂" },
- ["Ἀ"]={ "Α","̓" },
- ["Ἁ"]={ "Α","̔" },
- ["Ἂ"]={ "Ἀ","̀" },
- ["Ἃ"]={ "Ἁ","̀" },
- ["Ἄ"]={ "Ἀ","́" },
- ["Ἅ"]={ "Ἁ","́" },
- ["Ἆ"]={ "Ἀ","͂" },
- ["Ἇ"]={ "Ἁ","͂" },
- ["ἐ"]={ "ε","̓" },
- ["ἑ"]={ "ε","̔" },
- ["ἒ"]={ "ἐ","̀" },
- ["ἓ"]={ "ἑ","̀" },
- ["ἔ"]={ "ἐ","́" },
- ["ἕ"]={ "ἑ","́" },
- ["Ἐ"]={ "Ε","̓" },
- ["Ἑ"]={ "Ε","̔" },
- ["Ἒ"]={ "Ἐ","̀" },
- ["Ἓ"]={ "Ἑ","̀" },
- ["Ἔ"]={ "Ἐ","́" },
- ["Ἕ"]={ "Ἑ","́" },
- ["ἠ"]={ "η","̓" },
- ["ἡ"]={ "η","̔" },
- ["ἢ"]={ "ἠ","̀" },
- ["ἣ"]={ "ἡ","̀" },
- ["ἤ"]={ "ἠ","́" },
- ["ἥ"]={ "ἡ","́" },
- ["ἦ"]={ "ἠ","͂" },
- ["ἧ"]={ "ἡ","͂" },
- ["Ἠ"]={ "Η","̓" },
- ["Ἡ"]={ "Η","̔" },
- ["Ἢ"]={ "Ἠ","̀" },
- ["Ἣ"]={ "Ἡ","̀" },
- ["Ἤ"]={ "Ἠ","́" },
- ["Ἥ"]={ "Ἡ","́" },
- ["Ἦ"]={ "Ἠ","͂" },
- ["Ἧ"]={ "Ἡ","͂" },
- ["ἰ"]={ "ι","̓" },
- ["ἱ"]={ "ι","̔" },
- ["ἲ"]={ "ἰ","̀" },
- ["ἳ"]={ "ἱ","̀" },
- ["ἴ"]={ "ἰ","́" },
- ["ἵ"]={ "ἱ","́" },
- ["ἶ"]={ "ἰ","͂" },
- ["ἷ"]={ "ἱ","͂" },
- ["Ἰ"]={ "Ι","̓" },
- ["Ἱ"]={ "Ι","̔" },
- ["Ἲ"]={ "Ἰ","̀" },
- ["Ἳ"]={ "Ἱ","̀" },
- ["Ἴ"]={ "Ἰ","́" },
- ["Ἵ"]={ "Ἱ","́" },
- ["Ἶ"]={ "Ἰ","͂" },
- ["Ἷ"]={ "Ἱ","͂" },
- ["ὀ"]={ "ο","̓" },
- ["ὁ"]={ "ο","̔" },
- ["ὂ"]={ "ὀ","̀" },
- ["ὃ"]={ "ὁ","̀" },
- ["ὄ"]={ "ὀ","́" },
- ["ὅ"]={ "ὁ","́" },
- ["Ὀ"]={ "Ο","̓" },
- ["Ὁ"]={ "Ο","̔" },
- ["Ὂ"]={ "Ὀ","̀" },
- ["Ὃ"]={ "Ὁ","̀" },
- ["Ὄ"]={ "Ὀ","́" },
- ["Ὅ"]={ "Ὁ","́" },
- ["ὐ"]={ "υ","̓" },
- ["ὑ"]={ "υ","̔" },
- ["ὒ"]={ "ὐ","̀" },
- ["ὓ"]={ "ὑ","̀" },
- ["ὔ"]={ "ὐ","́" },
- ["ὕ"]={ "ὑ","́" },
- ["ὖ"]={ "ὐ","͂" },
- ["ὗ"]={ "ὑ","͂" },
- ["Ὑ"]={ "Υ","̔" },
- ["Ὓ"]={ "Ὑ","̀" },
- ["Ὕ"]={ "Ὑ","́" },
- ["Ὗ"]={ "Ὑ","͂" },
- ["ὠ"]={ "ω","̓" },
- ["ὡ"]={ "ω","̔" },
- ["ὢ"]={ "ὠ","̀" },
- ["ὣ"]={ "ὡ","̀" },
- ["ὤ"]={ "ὠ","́" },
- ["ὥ"]={ "ὡ","́" },
- ["ὦ"]={ "ὠ","͂" },
- ["ὧ"]={ "ὡ","͂" },
- ["Ὠ"]={ "Ω","̓" },
- ["Ὡ"]={ "Ω","̔" },
- ["Ὢ"]={ "Ὠ","̀" },
- ["Ὣ"]={ "Ὡ","̀" },
- ["Ὤ"]={ "Ὠ","́" },
- ["Ὥ"]={ "Ὡ","́" },
- ["Ὦ"]={ "Ὠ","͂" },
- ["Ὧ"]={ "Ὡ","͂" },
- ["ὰ"]={ "α","̀" },
- ["ὲ"]={ "ε","̀" },
- ["ὴ"]={ "η","̀" },
- ["ὶ"]={ "ι","̀" },
- ["ὸ"]={ "ο","̀" },
- ["ὺ"]={ "υ","̀" },
- ["ὼ"]={ "ω","̀" },
- ["ᾀ"]={ "ἀ","ͅ" },
- ["ᾁ"]={ "ἁ","ͅ" },
- ["ᾂ"]={ "ἂ","ͅ" },
- ["ᾃ"]={ "ἃ","ͅ" },
- ["ᾄ"]={ "ἄ","ͅ" },
- ["ᾅ"]={ "ἅ","ͅ" },
- ["ᾆ"]={ "ἆ","ͅ" },
- ["ᾇ"]={ "ἇ","ͅ" },
- ["ᾈ"]={ "Ἀ","ͅ" },
- ["ᾉ"]={ "Ἁ","ͅ" },
- ["ᾊ"]={ "Ἂ","ͅ" },
- ["ᾋ"]={ "Ἃ","ͅ" },
- ["ᾌ"]={ "Ἄ","ͅ" },
- ["ᾍ"]={ "Ἅ","ͅ" },
- ["ᾎ"]={ "Ἆ","ͅ" },
- ["ᾏ"]={ "Ἇ","ͅ" },
- ["ᾐ"]={ "ἠ","ͅ" },
- ["ᾑ"]={ "ἡ","ͅ" },
- ["ᾒ"]={ "ἢ","ͅ" },
- ["ᾓ"]={ "ἣ","ͅ" },
- ["ᾔ"]={ "ἤ","ͅ" },
- ["ᾕ"]={ "ἥ","ͅ" },
- ["ᾖ"]={ "ἦ","ͅ" },
- ["ᾗ"]={ "ἧ","ͅ" },
- ["ᾘ"]={ "Ἠ","ͅ" },
- ["ᾙ"]={ "Ἡ","ͅ" },
- ["ᾚ"]={ "Ἢ","ͅ" },
- ["ᾛ"]={ "Ἣ","ͅ" },
- ["ᾜ"]={ "Ἤ","ͅ" },
- ["ᾝ"]={ "Ἥ","ͅ" },
- ["ᾞ"]={ "Ἦ","ͅ" },
- ["ᾟ"]={ "Ἧ","ͅ" },
- ["ᾠ"]={ "ὠ","ͅ" },
- ["ᾡ"]={ "ὡ","ͅ" },
- ["ᾢ"]={ "ὢ","ͅ" },
- ["ᾣ"]={ "ὣ","ͅ" },
- ["ᾤ"]={ "ὤ","ͅ" },
- ["ᾥ"]={ "ὥ","ͅ" },
- ["ᾦ"]={ "ὦ","ͅ" },
- ["ᾧ"]={ "ὧ","ͅ" },
- ["ᾨ"]={ "Ὠ","ͅ" },
- ["ᾩ"]={ "Ὡ","ͅ" },
- ["ᾪ"]={ "Ὢ","ͅ" },
- ["ᾫ"]={ "Ὣ","ͅ" },
- ["ᾬ"]={ "Ὤ","ͅ" },
- ["ᾭ"]={ "Ὥ","ͅ" },
- ["ᾮ"]={ "Ὦ","ͅ" },
- ["ᾯ"]={ "Ὧ","ͅ" },
- ["ᾰ"]={ "α","̆" },
- ["ᾱ"]={ "α","̄" },
- ["ᾲ"]={ "ὰ","ͅ" },
- ["ᾳ"]={ "α","ͅ" },
- ["ᾴ"]={ "ά","ͅ" },
- ["ᾶ"]={ "α","͂" },
- ["ᾷ"]={ "ᾶ","ͅ" },
- ["Ᾰ"]={ "Α","̆" },
- ["Ᾱ"]={ "Α","̄" },
- ["Ὰ"]={ "Α","̀" },
- ["ᾼ"]={ "Α","ͅ" },
- ["῁"]={ "¨","͂" },
- ["ῂ"]={ "ὴ","ͅ" },
- ["ῃ"]={ "η","ͅ" },
- ["ῄ"]={ "ή","ͅ" },
- ["ῆ"]={ "η","͂" },
- ["ῇ"]={ "ῆ","ͅ" },
- ["Ὲ"]={ "Ε","̀" },
- ["Ὴ"]={ "Η","̀" },
- ["ῌ"]={ "Η","ͅ" },
- ["῍"]={ "᾿","̀" },
- ["῎"]={ "᾿","́" },
- ["῏"]={ "᾿","͂" },
- ["ῐ"]={ "ι","̆" },
- ["ῑ"]={ "ι","̄" },
- ["ῒ"]={ "ϊ","̀" },
- ["ῖ"]={ "ι","͂" },
- ["ῗ"]={ "ϊ","͂" },
- ["Ῐ"]={ "Ι","̆" },
- ["Ῑ"]={ "Ι","̄" },
- ["Ὶ"]={ "Ι","̀" },
- ["῝"]={ "῾","̀" },
- ["῞"]={ "῾","́" },
- ["῟"]={ "῾","͂" },
- ["ῠ"]={ "υ","̆" },
- ["ῡ"]={ "υ","̄" },
- ["ῢ"]={ "ϋ","̀" },
- ["ῤ"]={ "ρ","̓" },
- ["ῥ"]={ "ρ","̔" },
- ["ῦ"]={ "υ","͂" },
- ["ῧ"]={ "ϋ","͂" },
- ["Ῠ"]={ "Υ","̆" },
- ["Ῡ"]={ "Υ","̄" },
- ["Ὺ"]={ "Υ","̀" },
- ["Ῥ"]={ "Ρ","̔" },
- ["῭"]={ "¨","̀" },
- ["ῲ"]={ "ὼ","ͅ" },
- ["ῳ"]={ "ω","ͅ" },
- ["ῴ"]={ "ώ","ͅ" },
- ["ῶ"]={ "ω","͂" },
- ["ῷ"]={ "ῶ","ͅ" },
- ["Ὸ"]={ "Ο","̀" },
- ["Ὼ"]={ "Ω","̀" },
- ["ῼ"]={ "Ω","ͅ" },
- ["↚"]={ "←","̸" },
- ["↛"]={ "→","̸" },
- ["↮"]={ "↔","̸" },
- ["⇍"]={ "⇐","̸" },
- ["⇎"]={ "⇔","̸" },
- ["⇏"]={ "⇒","̸" },
- ["∄"]={ "∃","̸" },
- ["∉"]={ "∈","̸" },
- ["∌"]={ "∋","̸" },
- ["∤"]={ "∣","̸" },
- ["∦"]={ "∥","̸" },
- ["≁"]={ "∼","̸" },
- ["≄"]={ "≃","̸" },
- ["≇"]={ "≅","̸" },
- ["≉"]={ "≈","̸" },
- ["≠"]={ "=","̸" },
- ["≢"]={ "≡","̸" },
- ["≭"]={ "≍","̸" },
- ["≮"]={ "<","̸" },
- ["≯"]={ ">","̸" },
- ["≰"]={ "≤","̸" },
- ["≱"]={ "≥","̸" },
- ["≴"]={ "≲","̸" },
- ["≵"]={ "≳","̸" },
- ["≸"]={ "≶","̸" },
- ["≹"]={ "≷","̸" },
- ["⊀"]={ "≺","̸" },
- ["⊁"]={ "≻","̸" },
- ["⊄"]={ "⊂","̸" },
- ["⊅"]={ "⊃","̸" },
- ["⊈"]={ "⊆","̸" },
- ["⊉"]={ "⊇","̸" },
- ["⊬"]={ "⊢","̸" },
- ["⊭"]={ "⊨","̸" },
- ["⊮"]={ "⊩","̸" },
- ["⊯"]={ "⊫","̸" },
- ["⋠"]={ "≼","̸" },
- ["⋡"]={ "≽","̸" },
- ["⋢"]={ "⊑","̸" },
- ["⋣"]={ "⊒","̸" },
- ["⋪"]={ "⊲","̸" },
- ["⋫"]={ "⊳","̸" },
- ["⋬"]={ "⊴","̸" },
- ["⋭"]={ "⊵","̸" },
- ["⫝̸"]={ "⫝","̸" },
- ["が"]={ "か","゙" },
- ["ぎ"]={ "き","゙" },
- ["ぐ"]={ "く","゙" },
- ["げ"]={ "け","゙" },
- ["ご"]={ "こ","゙" },
- ["ざ"]={ "さ","゙" },
- ["じ"]={ "し","゙" },
- ["ず"]={ "す","゙" },
- ["ぜ"]={ "せ","゙" },
- ["ぞ"]={ "そ","゙" },
- ["だ"]={ "た","゙" },
- ["ぢ"]={ "ち","゙" },
- ["づ"]={ "つ","゙" },
- ["で"]={ "て","゙" },
- ["ど"]={ "と","゙" },
- ["ば"]={ "は","゙" },
- ["ぱ"]={ "は","゚" },
- ["び"]={ "ひ","゙" },
- ["ぴ"]={ "ひ","゚" },
- ["ぶ"]={ "ふ","゙" },
- ["ぷ"]={ "ふ","゚" },
- ["べ"]={ "へ","゙" },
- ["ぺ"]={ "へ","゚" },
- ["ぼ"]={ "ほ","゙" },
- ["ぽ"]={ "ほ","゚" },
- ["ゔ"]={ "う","゙" },
- ["ゞ"]={ "ゝ","゙" },
- ["ガ"]={ "カ","゙" },
- ["ギ"]={ "キ","゙" },
- ["グ"]={ "ク","゙" },
- ["ゲ"]={ "ケ","゙" },
- ["ゴ"]={ "コ","゙" },
- ["ザ"]={ "サ","゙" },
- ["ジ"]={ "シ","゙" },
- ["ズ"]={ "ス","゙" },
- ["ゼ"]={ "セ","゙" },
- ["ゾ"]={ "ソ","゙" },
- ["ダ"]={ "タ","゙" },
- ["ヂ"]={ "チ","゙" },
- ["ヅ"]={ "ツ","゙" },
- ["デ"]={ "テ","゙" },
- ["ド"]={ "ト","゙" },
- ["バ"]={ "ハ","゙" },
- ["パ"]={ "ハ","゚" },
- ["ビ"]={ "ヒ","゙" },
- ["ピ"]={ "ヒ","゚" },
- ["ブ"]={ "フ","゙" },
- ["プ"]={ "フ","゚" },
- ["ベ"]={ "ヘ","゙" },
- ["ペ"]={ "ヘ","゚" },
- ["ボ"]={ "ホ","゙" },
- ["ポ"]={ "ホ","゚" },
- ["ヴ"]={ "ウ","゙" },
- ["ヷ"]={ "ワ","゙" },
- ["ヸ"]={ "ヰ","゙" },
- ["ヹ"]={ "ヱ","゙" },
- ["ヺ"]={ "ヲ","゙" },
- ["ヾ"]={ "ヽ","゙" },
- ["יִ"]={ "י","ִ" },
- ["ײַ"]={ "ײ","ַ" },
- ["שׁ"]={ "ש","ׁ" },
- ["שׂ"]={ "ש","ׂ" },
- ["שּׁ"]={ "שּ","ׁ" },
- ["שּׂ"]={ "שּ","ׂ" },
- ["אַ"]={ "א","ַ" },
- ["אָ"]={ "א","ָ" },
- ["אּ"]={ "א","ּ" },
- ["בּ"]={ "ב","ּ" },
- ["גּ"]={ "ג","ּ" },
- ["דּ"]={ "ד","ּ" },
- ["הּ"]={ "ה","ּ" },
- ["וּ"]={ "ו","ּ" },
- ["זּ"]={ "ז","ּ" },
- ["טּ"]={ "ט","ּ" },
- ["יּ"]={ "י","ּ" },
- ["ךּ"]={ "ך","ּ" },
- ["כּ"]={ "כ","ּ" },
- ["לּ"]={ "ל","ּ" },
- ["מּ"]={ "מ","ּ" },
- ["נּ"]={ "נ","ּ" },
- ["סּ"]={ "ס","ּ" },
- ["ףּ"]={ "ף","ּ" },
- ["פּ"]={ "פ","ּ" },
- ["צּ"]={ "צ","ּ" },
- ["קּ"]={ "ק","ּ" },
- ["רּ"]={ "ר","ּ" },
- ["שּ"]={ "ש","ּ" },
- ["תּ"]={ "ת","ּ" },
- ["וֹ"]={ "ו","ֹ" },
- ["בֿ"]={ "ב","ֿ" },
- ["כֿ"]={ "כ","ֿ" },
- ["פֿ"]={ "פ","ֿ" },
- ["𑂚"]={ "𑂙","𑂺" },
- ["𑂜"]={ "𑂛","𑂺" },
- ["𑂫"]={ "𑂥","𑂺" },
- ["𑄮"]={ "𑄱","𑄧" },
- ["𑄯"]={ "𑄲","𑄧" },
- ["𑍋"]={ "𑍇","𑌾" },
- ["𑍌"]={ "𑍇","𑍗" },
- ["𑒻"]={ "𑒹","𑒺" },
- ["𑒼"]={ "𑒹","𑒰" },
- ["𑒾"]={ "𑒹","𑒽" },
- ["𑖺"]={ "𑖸","𑖯" },
- ["𑖻"]={ "𑖹","𑖯" },
- ["𝅗𝅥"]={ "𝅗","𝅥" },
- ["𝅘𝅥"]={ "𝅘","𝅥" },
- ["𝅘𝅥𝅮"]={ "𝅘𝅥","𝅮" },
- ["𝅘𝅥𝅯"]={ "𝅘𝅥","𝅯" },
- ["𝅘𝅥𝅰"]={ "𝅘𝅥","𝅰" },
- ["𝅘𝅥𝅱"]={ "𝅘𝅥","𝅱" },
- ["𝅘𝅥𝅲"]={ "𝅘𝅥","𝅲" },
- ["𝆹𝅥"]={ "𝆹","𝅥" },
- ["𝆺𝅥"]={ "𝆺","𝅥" },
- ["𝆹𝅥𝅮"]={ "𝆹𝅥","𝅮" },
- ["𝆺𝅥𝅮"]={ "𝆺𝅥","𝅮" },
- ["𝆹𝅥𝅯"]={ "𝆹𝅥","𝅯" },
- ["𝆺𝅥𝅯"]={ "𝆺𝅥","𝅯" },
- },
- },
- },
- ["name"]="collapse",
- ["prepend"]=true,
- ["type"]="ligature",
-}
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “fonts-lig”] ---
-
-
-do --- [luaotfload, fontloader-2020-02-02.lua scope for “fonts-gbn” d25472d54c4841db43a745764a63533e] ---
-
-if not modules then modules={} end modules ['luatex-fonts-gbn']={
- version=1.001,
- comment="companion to luatex-*.tex",
- author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files"
-}
-if context then
- os.exit()
-end
-local next=next
-local fonts=fonts
-local nodes=nodes
-local nuts=nodes.nuts
-local traverse_id=nuts.traverse_id
-local flush_node=nuts.flush_node
-local glyph_code=nodes.nodecodes.glyph
-local disc_code=nodes.nodecodes.disc
-local tonode=nuts.tonode
-local tonut=nuts.tonut
-local getfont=nuts.getfont
-local getchar=nuts.getchar
-local getid=nuts.getid
-local getboth=nuts.getboth
-local getprev=nuts.getprev
-local getnext=nuts.getnext
-local getdisc=nuts.getdisc
-local setchar=nuts.setchar
-local setlink=nuts.setlink
-local setprev=nuts.setprev
-local n_ligaturing=node.ligaturing
-local n_kerning=node.kerning
-local d_ligaturing=nuts.ligaturing
-local d_kerning=nuts.kerning
-local basemodepass=true
-local function l_warning() logs.report("fonts","don't call 'node.ligaturing' directly") l_warning=nil end
-local function k_warning() logs.report("fonts","don't call 'node.kerning' directly") k_warning=nil end
-function node.ligaturing(...)
- if basemodepass and l_warning then
- l_warning()
- end
- return n_ligaturing(...)
-end
-function node.kerning(...)
- if basemodepass and k_warning then
- k_warning()
- end
- return n_kerning(...)
-end
-function nuts.ligaturing(...)
- if basemodepass and l_warning then
- l_warning()
- end
- return d_ligaturing(...)
-end
-function nuts.kerning(...)
- if basemodepass and k_warning then
- k_warning()
- end
- return d_kerning(...)
-end
-function nodes.handlers.setbasemodepass(v)
- basemodepass=v
-end
-local function nodepass(head,groupcode,size,packtype,direction)
- local fontdata=fonts.hashes.identifiers
- if fontdata then
- local usedfonts={}
- local basefonts={}
- local prevfont=nil
- local basefont=nil
- local variants=nil
- local redundant=nil
- local nofused=0
- for n in traverse_id(glyph_code,head) do
- local font=getfont(n)
- if font~=prevfont then
- if basefont then
- basefont[2]=getprev(n)
- end
- prevfont=font
- local used=usedfonts[font]
- if not used then
- local tfmdata=fontdata[font]
- if tfmdata then
- local shared=tfmdata.shared
- if shared then
- local processors=shared.processes
- if processors and #processors>0 then
- usedfonts[font]=processors
- nofused=nofused+1
- elseif basemodepass then
- basefont={ n,nil }
- basefonts[#basefonts+1]=basefont
- end
- end
- local resources=tfmdata.resources
- variants=resources and resources.variants
- variants=variants and next(variants) and variants or false
- end
- else
- local tfmdata=fontdata[prevfont]
- if tfmdata then
- local resources=tfmdata.resources
- variants=resources and resources.variants
- variants=variants and next(variants) and variants or false
- end
- end
- end
- if variants then
- local char=getchar(n)
- if (char>=0xFE00 and char<=0xFE0F) or (char>=0xE0100 and char<=0xE01EF) then
- local hash=variants[char]
- if hash then
- local p=getprev(n)
- if p and getid(p)==glyph_code then
- local variant=hash[getchar(p)]
- if variant then
- setchar(p,variant)
- end
- end
- end
- if not redundant then
- redundant={ n }
- else
- redundant[#redundant+1]=n
- end
- end
- end
- end
- local nofbasefonts=#basefonts
- if redundant then
- for i=1,#redundant do
- local r=redundant[i]
- local p,n=getboth(r)
- if r==head then
- head=n
- setprev(n)
- else
- setlink(p,n)
- end
- if nofbasefonts>0 then
- for i=1,nofbasefonts do
- local bi=basefonts[i]
- if r==bi[1] then
- bi[1]=n
- end
- if r==bi[2] then
- bi[2]=n
- end
- end
- end
- flush_node(r)
- end
- end
- for d in traverse_id(disc_code,head) do
- local _,_,r=getdisc(d)
- if r then
- for n in traverse_id(glyph_code,r) do
- local font=getfont(n)
- if font~=prevfont then
- prevfont=font
- local used=usedfonts[font]
- if not used then
- local tfmdata=fontdata[font]
- if tfmdata then
- local shared=tfmdata.shared
- if shared then
- local processors=shared.processes
- if processors and #processors>0 then
- usedfonts[font]=processors
- nofused=nofused+1
- end
- end
- end
- end
- end
- end
- end
- end
- if next(usedfonts) then
- for font,processors in next,usedfonts do
- for i=1,#processors do
- head=processors[i](head,font,0,direction,nofused) or head
- end
- end
- end
- if basemodepass and nofbasefonts>0 then
- for i=1,nofbasefonts do
- local range=basefonts[i]
- local start=range[1]
- local stop=range[2]
- if start then
- local front=head==start
- local prev,next
- if stop then
- next=getnext(stop)
- start,stop=d_ligaturing(start,stop)
- start,stop=d_kerning(start,stop)
- else
- prev=getprev(start)
- start=d_ligaturing(start)
- start=d_kerning(start)
- end
- if prev then
- setlink(prev,start)
- end
- if next then
- setlink(stop,next)
- end
- if front and head~=start then
- head=start
- end
- end
- end
- end
- end
- return head
-end
-local function basepass(head)
- if basemodepass then
- head=d_ligaturing(head)
- head=d_kerning(head)
- end
- return head
-end
-local protectpass=node.direct.protect_glyphs
-local injectpass=nodes.injections.handler
-function nodes.handlers.nodepass(head,...)
- if head then
- return tonode(nodepass(tonut(head),...))
- end
-end
-function nodes.handlers.basepass(head)
- if head then
- return tonode(basepass(tonut(head)))
- end
-end
-function nodes.handlers.injectpass(head)
- if head then
- return tonode(injectpass(tonut(head)))
- end
-end
-function nodes.handlers.protectpass(head)
- if head then
- protectpass(tonut(head))
- return head
- end
-end
-function nodes.simple_font_handler(head,groupcode,size,packtype,direction)
- if head then
- head=tonut(head)
- head=nodepass(head,groupcode,size,packtype,direction)
- head=injectpass(head)
- if not basemodepass then
- head=basepass(head)
- end
- protectpass(head)
- head=tonode(head)
- end
- return head
-end
-
-end --- [luaotfload, fontloader-2020-02-02.lua scope for “fonts-gbn”] ---
-
-
---- vim:ft=lua:sw=2:ts=8:et:tw=79
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-2020-04-30.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-2020-04-30.lua
new file mode 100644
index 00000000000..721d2461211
--- /dev/null
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-2020-04-30.lua
@@ -0,0 +1,34518 @@
+--[[info-----------------------------------------------------------------------
+ Luaotfload fontloader package
+ build 2020-05-01 16:08:24
+-------------------------------------------------------------------------------
+
+ © 2020 PRAGMA ADE / ConTeXt Development Team
+
+ The code in this file is provided under the GPL v2.0 license. See the
+ file COPYING in the Luaotfload repository for details.
+
+ Report bugs to github.com/u-fischer/luaotfload
+
+ This file has been assembled from components taken from Context. See
+ the Luaotfload documentation for details:
+
+ $ texdoc luaotfload
+ $ man 1 luaotfload-tool
+ $ man 5 luaotfload.conf
+
+ Included files:
+
+ · fontloader-data-con.lua
+ · fontloader-basics-nod.lua
+ · fontloader-basics-chr.lua
+ · fontloader-font-ini.lua
+ · fontloader-fonts-mis.lua
+ · fontloader-font-con.lua
+ · fontloader-fonts-enc.lua
+ · fontloader-font-cid.lua
+ · fontloader-font-map.lua
+ · fontloader-font-vfc.lua
+ · fontloader-font-otr.lua
+ · fontloader-font-oti.lua
+ · fontloader-font-ott.lua
+ · fontloader-font-cff.lua
+ · fontloader-font-ttf.lua
+ · fontloader-font-dsp.lua
+ · fontloader-font-oup.lua
+ · fontloader-font-otl.lua
+ · fontloader-font-oto.lua
+ · fontloader-font-otj.lua
+ · fontloader-font-ota.lua
+ · fontloader-font-ots.lua
+ · fontloader-font-osd.lua
+ · fontloader-font-ocl.lua
+ · fontloader-font-otc.lua
+ · fontloader-font-onr.lua
+ · fontloader-font-one.lua
+ · fontloader-font-afk.lua
+ · fontloader-fonts-tfm.lua
+ · fontloader-font-lua.lua
+ · fontloader-font-def.lua
+ · fontloader-fonts-def.lua
+ · fontloader-fonts-ext.lua
+ · fontloader-font-imp-tex.lua
+ · fontloader-font-imp-ligatures.lua
+ · fontloader-font-imp-italics.lua
+ · fontloader-font-imp-effects.lua
+ · fontloader-fonts-lig.lua
+ · fontloader-fonts-gbn.lua
+
+--info]]-----------------------------------------------------------------------
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “data-con” de6ae0997b0e70a23bcc9afff5d8b072] ---
+
+if not modules then modules={} end modules ['data-con']={
+ version=1.100,
+ comment="companion to luat-lib.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local setmetatable=setmetatable
+local format,lower,gsub=string.format,string.lower,string.gsub
+local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end)
+local trace_containers=false trackers.register("resolvers.containers",function(v) trace_containers=v end)
+local trace_storage=false trackers.register("resolvers.storage",function(v) trace_storage=v end)
+containers=containers or {}
+local containers=containers
+containers.usecache=true
+local getwritablepath=caches.getwritablepath
+local getreadablepaths=caches.getreadablepaths
+local cacheiswritable=caches.is_writable
+local loaddatafromcache=caches.loaddata
+local savedataincache=caches.savedata
+local report_containers=logs.reporter("resolvers","containers")
+local allocated={}
+local mt={
+ __index=function(t,k)
+ if k=="writable" then
+ local writable=getwritablepath(t.category,t.subcategory) or { "." }
+ t.writable=writable
+ return writable
+ elseif k=="readables" then
+ local readables=getreadablepaths(t.category,t.subcategory) or { "." }
+ t.readables=readables
+ return readables
+ end
+ end,
+ __storage__=true
+}
+function containers.define(category,subcategory,version,enabled)
+ if category and subcategory then
+ local c=allocated[category]
+ if not c then
+ c={}
+ allocated[category]=c
+ end
+ local s=c[subcategory]
+ if not s then
+ s={
+ category=category,
+ subcategory=subcategory,
+ storage={},
+ enabled=enabled,
+ version=version or math.pi,
+ trace=false,
+ }
+ setmetatable(s,mt)
+ c[subcategory]=s
+ end
+ return s
+ end
+end
+function containers.is_usable(container,name)
+ return container.enabled and caches and cacheiswritable(container.writable,name)
+end
+function containers.is_valid(container,name)
+ if name and name~="" then
+ local storage=container.storage[name]
+ return storage and storage.cache_version==container.version
+ else
+ return false
+ end
+end
+function containers.read(container,name)
+ local storage=container.storage
+ local stored=storage[name]
+ if not stored and container.enabled and caches and containers.usecache then
+ stored=loaddatafromcache(container.readables,name,container.writable)
+ if stored and stored.cache_version==container.version then
+ if trace_cache or trace_containers then
+ report_containers("action %a, category %a, name %a","load",container.subcategory,name)
+ end
+ else
+ stored=nil
+ end
+ storage[name]=stored
+ elseif stored then
+ if trace_cache or trace_containers then
+ report_containers("action %a, category %a, name %a","reuse",container.subcategory,name)
+ end
+ end
+ return stored
+end
+function containers.write(container,name,data,fast)
+ if data then
+ data.cache_version=container.version
+ if container.enabled and caches then
+ local unique=data.unique
+ local shared=data.shared
+ data.unique=nil
+ data.shared=nil
+ savedataincache(container.writable,name,data,fast)
+ if trace_cache or trace_containers then
+ report_containers("action %a, category %a, name %a","save",container.subcategory,name)
+ end
+ data.unique=unique
+ data.shared=shared
+ end
+ if trace_cache or trace_containers then
+ report_containers("action %a, category %a, name %a","store",container.subcategory,name)
+ end
+ container.storage[name]=data
+ end
+ return data
+end
+function containers.content(container,name)
+ return container.storage[name]
+end
+function containers.cleanname(name)
+ return (gsub(lower(name),"[^%w\128-\255]+","-"))
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “data-con”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “basics-nod” 68226d7dadd241bca55171af9ce1f243] ---
+
+if not modules then modules={} end modules ['luatex-fonts-nod']={
+ version=1.001,
+ comment="companion to luatex-fonts.lua",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+if context then
+ os.exit()
+end
+if tex.attribute[0]~=0 then
+ texio.write_nl("log","!")
+ texio.write_nl("log","! Attribute 0 is reserved for ConTeXt's font feature management and has to be")
+ texio.write_nl("log","! set to zero. Also, some attributes in the range 1-255 are used for special")
+ texio.write_nl("log","! purposes so setting them at the TeX end might break the font handler.")
+ texio.write_nl("log","!")
+ tex.attribute[0]=0
+end
+attributes=attributes or {}
+attributes.unsetvalue=-0x7FFFFFFF
+local numbers,last={},127
+attributes.private=attributes.private or function(name)
+ local number=numbers[name]
+ if not number then
+ if last<255 then
+ last=last+1
+ end
+ number=last
+ numbers[name]=number
+ end
+ return number
+end
+nodes={}
+nodes.handlers={}
+local nodecodes={}
+local glyphcodes=node.subtypes("glyph")
+local disccodes=node.subtypes("disc")
+for k,v in next,node.types() do
+ v=string.gsub(v,"_","")
+ nodecodes[k]=v
+ nodecodes[v]=k
+end
+for k,v in next,glyphcodes do
+ glyphcodes[v]=k
+end
+for k,v in next,disccodes do
+ disccodes[v]=k
+end
+nodes.nodecodes=nodecodes
+nodes.glyphcodes=glyphcodes
+nodes.disccodes=disccodes
+nodes.handlers.protectglyphs=node.protect_glyphs
+nodes.handlers.unprotectglyphs=node.unprotect_glyphs
+local direct=node.direct
+local nuts={}
+nodes.nuts=nuts
+local tonode=direct.tonode
+local tonut=direct.todirect
+nodes.tonode=tonode
+nodes.tonut=tonut
+nuts.tonode=tonode
+nuts.tonut=tonut
+nuts.getattr=direct.get_attribute
+nuts.getboth=direct.getboth
+nuts.getchar=direct.getchar
+nuts.getdirection=direct.getdirection
+nuts.getdisc=direct.getdisc
+nuts.getreplace=direct.getreplace
+nuts.getfield=direct.getfield
+nuts.getfont=direct.getfont
+nuts.getid=direct.getid
+nuts.getkern=direct.getkern
+nuts.getlist=direct.getlist
+nuts.getnext=direct.getnext
+nuts.getoffsets=direct.getoffsets
+nuts.getprev=direct.getprev
+nuts.getsubtype=direct.getsubtype
+nuts.getwidth=direct.getwidth
+nuts.setattr=direct.setfield
+nuts.setboth=direct.setboth
+nuts.setchar=direct.setchar
+nuts.setcomponents=direct.setcomponents
+nuts.setdirection=direct.setdirection
+nuts.setdisc=direct.setdisc
+nuts.setreplace=direct.setreplace
+nuts.setfield=setfield
+nuts.setkern=direct.setkern
+nuts.setlink=direct.setlink
+nuts.setlist=direct.setlist
+nuts.setnext=direct.setnext
+nuts.setoffsets=direct.setoffsets
+nuts.setprev=direct.setprev
+nuts.setsplit=direct.setsplit
+nuts.setsubtype=direct.setsubtype
+nuts.setwidth=direct.setwidth
+nuts.getglyphdata=nuts.getattr
+nuts.setglyphdata=nuts.setattr
+nuts.ischar=direct.is_char
+nuts.isglyph=direct.is_glyph
+nuts.copy=direct.copy
+nuts.copy_list=direct.copy_list
+nuts.copy_node=direct.copy
+nuts.end_of_math=direct.end_of_math
+nuts.flush=direct.flush
+nuts.flush_list=direct.flush_list
+nuts.flush_node=direct.flush_node
+nuts.free=direct.free
+nuts.insert_after=direct.insert_after
+nuts.insert_before=direct.insert_before
+nuts.is_node=direct.is_node
+nuts.kerning=direct.kerning
+nuts.ligaturing=direct.ligaturing
+nuts.new=direct.new
+nuts.remove=direct.remove
+nuts.tail=direct.tail
+nuts.traverse=direct.traverse
+nuts.traverse_char=direct.traverse_char
+nuts.traverse_glyph=direct.traverse_glyph
+nuts.traverse_id=direct.traverse_id
+local propertydata=direct.get_properties_table()
+nodes.properties={ data=propertydata }
+if direct.set_properties_mode then
+ direct.set_properties_mode(true,true)
+ function direct.set_properties_mode() end
+end
+nuts.getprop=function(n,k)
+ local p=propertydata[n]
+ if p then
+ return p[k]
+ end
+end
+nuts.setprop=function(n,k,v)
+ if v then
+ local p=propertydata[n]
+ if p then
+ p[k]=v
+ else
+ propertydata[n]={ [k]=v }
+ end
+ end
+end
+nodes.setprop=nodes.setproperty
+nodes.getprop=nodes.getproperty
+local setprev=nuts.setprev
+local setnext=nuts.setnext
+local getnext=nuts.getnext
+local setlink=nuts.setlink
+local getfield=nuts.getfield
+local setfield=nuts.setfield
+local getsubtype=nuts.getsubtype
+local isglyph=nuts.isglyph
+local find_tail=nuts.tail
+local flush_list=nuts.flush_list
+local flush_node=nuts.flush_node
+local traverse_id=nuts.traverse_id
+local copy_node=nuts.copy_node
+local glyph_code=nodes.nodecodes.glyph
+local ligature_code=nodes.glyphcodes.ligature
+do
+ local get_components=node.direct.getcomponents
+ local set_components=node.direct.setcomponents
+ local function copy_no_components(g,copyinjection)
+ local components=get_components(g)
+ if components then
+ set_components(g)
+ local n=copy_node(g)
+ if copyinjection then
+ copyinjection(n,g)
+ end
+ set_components(g,components)
+ return n
+ else
+ local n=copy_node(g)
+ if copyinjection then
+ copyinjection(n,g)
+ end
+ return n
+ end
+ end
+ local function copy_only_glyphs(current)
+ local head=nil
+ local previous=nil
+ for n in traverse_id(glyph_code,current) do
+ n=copy_node(n)
+ if head then
+ setlink(previous,n)
+ else
+ head=n
+ end
+ previous=n
+ end
+ return head
+ end
+ local function count_components(start,marks)
+ local char=isglyph(start)
+ if char then
+ if getsubtype(start)==ligature_code then
+ local n=0
+ local components=get_components(start)
+ while components do
+ n=n+count_components(components,marks)
+ components=getnext(components)
+ end
+ return n
+ elseif not marks[char] then
+ return 1
+ end
+ end
+ return 0
+ end
+ nuts.set_components=set_components
+ nuts.get_components=get_components
+ nuts.copy_only_glyphs=copy_only_glyphs
+ nuts.copy_no_components=copy_no_components
+ nuts.count_components=count_components
+end
+nuts.uses_font=direct.uses_font
+do
+ local dummy=tonut(node.new("glyph"))
+ nuts.traversers={
+ glyph=nuts.traverse_id(nodecodes.glyph,dummy),
+ glue=nuts.traverse_id(nodecodes.glue,dummy),
+ disc=nuts.traverse_id(nodecodes.disc,dummy),
+ boundary=nuts.traverse_id(nodecodes.boundary,dummy),
+ char=nuts.traverse_char(dummy),
+ node=nuts.traverse(dummy),
+ }
+end
+if not nuts.setreplace then
+ local getdisc=nuts.getdisc
+ local setfield=nuts.setfield
+ function nuts.getreplace(n)
+ local _,_,h,_,_,t=getdisc(n,true)
+ return h,t
+ end
+ function nuts.setreplace(n,h)
+ setfield(n,"replace",h)
+ end
+end
+do
+ local getsubtype=nuts.getsubtype
+ function nuts.start_of_par(n)
+ local s=getsubtype(n)
+ return s==0 or s==2
+ end
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “basics-nod”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “basics-chr” 58b7ef0c486e06090b362971b9f85e27] ---
+
+
+characters=characters or {}
+characters.blockrange={}
+characters.classifiers={
+ [768]=5,
+ [769]=5,
+ [770]=5,
+ [771]=5,
+ [772]=5,
+ [773]=5,
+ [774]=5,
+ [775]=5,
+ [776]=5,
+ [777]=5,
+ [778]=5,
+ [779]=5,
+ [780]=5,
+ [781]=5,
+ [782]=5,
+ [783]=5,
+ [784]=5,
+ [785]=5,
+ [786]=5,
+ [787]=5,
+ [788]=5,
+ [789]=5,
+ [790]=5,
+ [791]=5,
+ [792]=5,
+ [793]=5,
+ [794]=5,
+ [795]=5,
+ [796]=5,
+ [797]=5,
+ [798]=5,
+ [799]=5,
+ [800]=5,
+ [801]=5,
+ [802]=5,
+ [803]=5,
+ [804]=5,
+ [805]=5,
+ [806]=5,
+ [807]=5,
+ [808]=5,
+ [809]=5,
+ [810]=5,
+ [811]=5,
+ [812]=5,
+ [813]=5,
+ [814]=5,
+ [815]=5,
+ [816]=5,
+ [817]=5,
+ [818]=5,
+ [819]=5,
+ [820]=5,
+ [821]=5,
+ [822]=5,
+ [823]=5,
+ [824]=5,
+ [825]=5,
+ [826]=5,
+ [827]=5,
+ [828]=5,
+ [829]=5,
+ [830]=5,
+ [831]=5,
+ [832]=5,
+ [833]=5,
+ [834]=5,
+ [835]=5,
+ [836]=5,
+ [837]=5,
+ [838]=5,
+ [839]=5,
+ [840]=5,
+ [841]=5,
+ [842]=5,
+ [843]=5,
+ [844]=5,
+ [845]=5,
+ [846]=5,
+ [847]=5,
+ [848]=5,
+ [849]=5,
+ [850]=5,
+ [851]=5,
+ [852]=5,
+ [853]=5,
+ [854]=5,
+ [855]=5,
+ [856]=5,
+ [857]=5,
+ [858]=5,
+ [859]=5,
+ [860]=5,
+ [861]=5,
+ [862]=5,
+ [863]=5,
+ [864]=5,
+ [865]=5,
+ [866]=5,
+ [867]=5,
+ [868]=5,
+ [869]=5,
+ [870]=5,
+ [871]=5,
+ [872]=5,
+ [873]=5,
+ [874]=5,
+ [875]=5,
+ [876]=5,
+ [877]=5,
+ [878]=5,
+ [879]=5,
+ [1155]=5,
+ [1156]=5,
+ [1157]=5,
+ [1158]=5,
+ [1159]=5,
+ [1425]=5,
+ [1426]=5,
+ [1427]=5,
+ [1428]=5,
+ [1429]=5,
+ [1430]=5,
+ [1431]=5,
+ [1432]=5,
+ [1433]=5,
+ [1434]=5,
+ [1435]=5,
+ [1436]=5,
+ [1437]=5,
+ [1438]=5,
+ [1439]=5,
+ [1440]=5,
+ [1441]=5,
+ [1442]=5,
+ [1443]=5,
+ [1444]=5,
+ [1445]=5,
+ [1446]=5,
+ [1447]=5,
+ [1448]=5,
+ [1449]=5,
+ [1450]=5,
+ [1451]=5,
+ [1452]=5,
+ [1453]=5,
+ [1454]=5,
+ [1455]=5,
+ [1456]=5,
+ [1457]=5,
+ [1458]=5,
+ [1459]=5,
+ [1460]=5,
+ [1461]=5,
+ [1462]=5,
+ [1463]=5,
+ [1464]=5,
+ [1465]=5,
+ [1466]=5,
+ [1467]=5,
+ [1468]=5,
+ [1469]=5,
+ [1471]=5,
+ [1473]=5,
+ [1474]=5,
+ [1476]=5,
+ [1477]=5,
+ [1479]=5,
+ [1536]=4,
+ [1537]=4,
+ [1538]=4,
+ [1539]=4,
+ [1540]=4,
+ [1541]=4,
+ [1542]=6,
+ [1543]=6,
+ [1544]=4,
+ [1545]=6,
+ [1546]=6,
+ [1547]=4,
+ [1548]=6,
+ [1549]=6,
+ [1550]=6,
+ [1551]=6,
+ [1552]=5,
+ [1553]=5,
+ [1554]=5,
+ [1555]=5,
+ [1556]=5,
+ [1557]=5,
+ [1558]=5,
+ [1559]=5,
+ [1560]=5,
+ [1561]=5,
+ [1562]=5,
+ [1563]=6,
+ [1564]=6,
+ [1566]=6,
+ [1567]=6,
+ [1568]=2,
+ [1569]=4,
+ [1570]=3,
+ [1571]=3,
+ [1572]=3,
+ [1573]=3,
+ [1574]=2,
+ [1575]=3,
+ [1576]=2,
+ [1577]=3,
+ [1578]=2,
+ [1579]=2,
+ [1580]=2,
+ [1581]=2,
+ [1582]=2,
+ [1583]=3,
+ [1584]=3,
+ [1585]=3,
+ [1586]=3,
+ [1587]=2,
+ [1588]=2,
+ [1589]=2,
+ [1590]=2,
+ [1591]=2,
+ [1592]=2,
+ [1593]=2,
+ [1594]=2,
+ [1595]=2,
+ [1596]=2,
+ [1597]=2,
+ [1598]=2,
+ [1599]=2,
+ [1600]=2,
+ [1601]=2,
+ [1602]=2,
+ [1603]=2,
+ [1604]=2,
+ [1605]=2,
+ [1606]=2,
+ [1607]=2,
+ [1608]=3,
+ [1609]=2,
+ [1610]=2,
+ [1611]=5,
+ [1612]=5,
+ [1613]=5,
+ [1614]=5,
+ [1615]=5,
+ [1616]=5,
+ [1617]=5,
+ [1618]=5,
+ [1619]=5,
+ [1620]=5,
+ [1621]=5,
+ [1622]=5,
+ [1623]=5,
+ [1624]=5,
+ [1625]=5,
+ [1626]=5,
+ [1627]=5,
+ [1628]=5,
+ [1629]=5,
+ [1630]=5,
+ [1631]=5,
+ [1632]=6,
+ [1633]=6,
+ [1634]=6,
+ [1635]=6,
+ [1636]=6,
+ [1637]=6,
+ [1638]=6,
+ [1639]=6,
+ [1640]=6,
+ [1641]=6,
+ [1642]=6,
+ [1643]=6,
+ [1644]=6,
+ [1645]=6,
+ [1646]=2,
+ [1647]=2,
+ [1648]=5,
+ [1649]=3,
+ [1650]=3,
+ [1651]=3,
+ [1652]=4,
+ [1653]=3,
+ [1654]=3,
+ [1655]=3,
+ [1656]=2,
+ [1657]=2,
+ [1658]=2,
+ [1659]=2,
+ [1660]=2,
+ [1661]=2,
+ [1662]=2,
+ [1663]=2,
+ [1664]=2,
+ [1665]=2,
+ [1666]=2,
+ [1667]=2,
+ [1668]=2,
+ [1669]=2,
+ [1670]=2,
+ [1671]=2,
+ [1672]=3,
+ [1673]=3,
+ [1674]=3,
+ [1675]=3,
+ [1676]=3,
+ [1677]=3,
+ [1678]=3,
+ [1679]=3,
+ [1680]=3,
+ [1681]=3,
+ [1682]=3,
+ [1683]=3,
+ [1684]=3,
+ [1685]=3,
+ [1686]=3,
+ [1687]=3,
+ [1688]=3,
+ [1689]=3,
+ [1690]=2,
+ [1691]=2,
+ [1692]=2,
+ [1693]=2,
+ [1694]=2,
+ [1695]=2,
+ [1696]=2,
+ [1697]=2,
+ [1698]=2,
+ [1699]=2,
+ [1700]=2,
+ [1701]=2,
+ [1702]=2,
+ [1703]=2,
+ [1704]=2,
+ [1705]=2,
+ [1706]=2,
+ [1707]=2,
+ [1708]=2,
+ [1709]=2,
+ [1710]=2,
+ [1711]=2,
+ [1712]=2,
+ [1713]=2,
+ [1714]=2,
+ [1715]=2,
+ [1716]=2,
+ [1717]=2,
+ [1718]=2,
+ [1719]=2,
+ [1720]=2,
+ [1721]=2,
+ [1722]=2,
+ [1723]=2,
+ [1724]=2,
+ [1725]=2,
+ [1726]=2,
+ [1727]=2,
+ [1728]=3,
+ [1729]=2,
+ [1730]=2,
+ [1731]=3,
+ [1732]=3,
+ [1733]=3,
+ [1734]=3,
+ [1735]=3,
+ [1736]=3,
+ [1737]=3,
+ [1738]=3,
+ [1739]=3,
+ [1740]=2,
+ [1741]=3,
+ [1742]=2,
+ [1743]=3,
+ [1744]=2,
+ [1745]=2,
+ [1746]=3,
+ [1747]=3,
+ [1748]=6,
+ [1749]=3,
+ [1750]=5,
+ [1751]=5,
+ [1752]=5,
+ [1753]=5,
+ [1754]=5,
+ [1755]=5,
+ [1756]=5,
+ [1757]=4,
+ [1758]=6,
+ [1759]=5,
+ [1760]=5,
+ [1761]=5,
+ [1762]=5,
+ [1763]=5,
+ [1764]=5,
+ [1765]=6,
+ [1766]=6,
+ [1767]=5,
+ [1768]=5,
+ [1769]=6,
+ [1770]=5,
+ [1771]=5,
+ [1772]=5,
+ [1773]=5,
+ [1774]=3,
+ [1775]=3,
+ [1776]=6,
+ [1777]=6,
+ [1778]=6,
+ [1779]=6,
+ [1780]=6,
+ [1781]=6,
+ [1782]=6,
+ [1783]=6,
+ [1784]=6,
+ [1785]=6,
+ [1786]=2,
+ [1787]=2,
+ [1788]=2,
+ [1789]=6,
+ [1790]=6,
+ [1791]=2,
+ [1792]=6,
+ [1793]=6,
+ [1794]=6,
+ [1795]=6,
+ [1796]=6,
+ [1797]=6,
+ [1798]=6,
+ [1799]=6,
+ [1800]=6,
+ [1801]=6,
+ [1802]=6,
+ [1803]=6,
+ [1804]=6,
+ [1805]=6,
+ [1808]=3,
+ [1809]=5,
+ [1810]=2,
+ [1811]=2,
+ [1812]=2,
+ [1813]=3,
+ [1814]=3,
+ [1815]=3,
+ [1816]=3,
+ [1817]=3,
+ [1818]=2,
+ [1819]=2,
+ [1820]=2,
+ [1821]=2,
+ [1822]=3,
+ [1823]=2,
+ [1824]=2,
+ [1825]=2,
+ [1826]=2,
+ [1827]=2,
+ [1828]=2,
+ [1829]=2,
+ [1830]=2,
+ [1831]=2,
+ [1832]=3,
+ [1833]=2,
+ [1834]=3,
+ [1835]=2,
+ [1836]=3,
+ [1837]=2,
+ [1838]=2,
+ [1839]=3,
+ [1840]=5,
+ [1841]=5,
+ [1842]=5,
+ [1843]=5,
+ [1844]=5,
+ [1845]=5,
+ [1846]=5,
+ [1847]=5,
+ [1848]=5,
+ [1849]=5,
+ [1850]=5,
+ [1851]=5,
+ [1852]=5,
+ [1853]=5,
+ [1854]=5,
+ [1855]=5,
+ [1856]=5,
+ [1857]=5,
+ [1858]=5,
+ [1859]=5,
+ [1860]=5,
+ [1861]=5,
+ [1862]=5,
+ [1863]=5,
+ [1864]=5,
+ [1865]=5,
+ [1866]=5,
+ [1869]=3,
+ [1870]=2,
+ [1871]=2,
+ [1872]=2,
+ [1873]=2,
+ [1874]=2,
+ [1875]=2,
+ [1876]=2,
+ [1877]=2,
+ [1878]=2,
+ [1879]=2,
+ [1880]=2,
+ [1881]=3,
+ [1882]=3,
+ [1883]=3,
+ [1884]=2,
+ [1885]=2,
+ [1886]=2,
+ [1887]=2,
+ [1888]=2,
+ [1889]=2,
+ [1890]=2,
+ [1891]=2,
+ [1892]=2,
+ [1893]=2,
+ [1894]=2,
+ [1895]=2,
+ [1896]=2,
+ [1897]=2,
+ [1898]=2,
+ [1899]=3,
+ [1900]=3,
+ [1901]=2,
+ [1902]=2,
+ [1903]=2,
+ [1904]=2,
+ [1905]=3,
+ [1906]=2,
+ [1907]=3,
+ [1908]=3,
+ [1909]=2,
+ [1910]=2,
+ [1911]=2,
+ [1912]=3,
+ [1913]=3,
+ [1914]=2,
+ [1915]=2,
+ [1916]=2,
+ [1917]=2,
+ [1918]=2,
+ [1919]=2,
+ [1958]=5,
+ [1959]=5,
+ [1960]=5,
+ [1961]=5,
+ [1962]=5,
+ [1963]=5,
+ [1964]=5,
+ [1965]=5,
+ [1966]=5,
+ [1967]=5,
+ [1968]=5,
+ [1984]=6,
+ [1985]=6,
+ [1986]=6,
+ [1987]=6,
+ [1988]=6,
+ [1989]=6,
+ [1990]=6,
+ [1991]=6,
+ [1992]=6,
+ [1993]=6,
+ [1994]=2,
+ [1995]=2,
+ [1996]=2,
+ [1997]=2,
+ [1998]=2,
+ [1999]=2,
+ [2000]=2,
+ [2001]=2,
+ [2002]=2,
+ [2003]=2,
+ [2004]=2,
+ [2005]=2,
+ [2006]=2,
+ [2007]=2,
+ [2008]=2,
+ [2009]=2,
+ [2010]=2,
+ [2011]=2,
+ [2012]=2,
+ [2013]=2,
+ [2014]=2,
+ [2015]=2,
+ [2016]=2,
+ [2017]=2,
+ [2018]=2,
+ [2019]=2,
+ [2020]=2,
+ [2021]=2,
+ [2022]=2,
+ [2023]=2,
+ [2024]=2,
+ [2025]=2,
+ [2026]=2,
+ [2027]=5,
+ [2028]=5,
+ [2029]=5,
+ [2030]=5,
+ [2031]=5,
+ [2032]=5,
+ [2033]=5,
+ [2034]=5,
+ [2035]=5,
+ [2036]=6,
+ [2037]=6,
+ [2038]=6,
+ [2039]=6,
+ [2040]=6,
+ [2041]=6,
+ [2042]=2,
+ [2045]=5,
+ [2046]=6,
+ [2047]=6,
+ [2070]=5,
+ [2071]=5,
+ [2072]=5,
+ [2073]=5,
+ [2075]=5,
+ [2076]=5,
+ [2077]=5,
+ [2078]=5,
+ [2079]=5,
+ [2080]=5,
+ [2081]=5,
+ [2082]=5,
+ [2083]=5,
+ [2085]=5,
+ [2086]=5,
+ [2087]=5,
+ [2089]=5,
+ [2090]=5,
+ [2091]=5,
+ [2092]=5,
+ [2093]=5,
+ [2112]=3,
+ [2113]=2,
+ [2114]=2,
+ [2115]=2,
+ [2116]=2,
+ [2117]=2,
+ [2118]=3,
+ [2119]=3,
+ [2120]=2,
+ [2121]=3,
+ [2122]=2,
+ [2123]=2,
+ [2124]=2,
+ [2125]=2,
+ [2126]=2,
+ [2127]=2,
+ [2128]=2,
+ [2129]=2,
+ [2130]=2,
+ [2131]=2,
+ [2132]=3,
+ [2133]=2,
+ [2134]=4,
+ [2135]=4,
+ [2136]=4,
+ [2137]=5,
+ [2138]=5,
+ [2139]=5,
+ [2144]=2,
+ [2145]=4,
+ [2146]=2,
+ [2147]=2,
+ [2148]=2,
+ [2149]=2,
+ [2150]=4,
+ [2151]=3,
+ [2152]=2,
+ [2153]=3,
+ [2154]=3,
+ [2208]=2,
+ [2209]=2,
+ [2210]=2,
+ [2211]=2,
+ [2212]=2,
+ [2213]=2,
+ [2214]=2,
+ [2215]=2,
+ [2216]=2,
+ [2217]=2,
+ [2218]=3,
+ [2219]=3,
+ [2220]=3,
+ [2221]=4,
+ [2222]=3,
+ [2223]=2,
+ [2224]=2,
+ [2225]=3,
+ [2226]=3,
+ [2227]=2,
+ [2228]=2,
+ [2230]=2,
+ [2231]=2,
+ [2232]=2,
+ [2233]=3,
+ [2234]=2,
+ [2235]=2,
+ [2236]=2,
+ [2237]=2,
+ [2259]=5,
+ [2260]=5,
+ [2261]=5,
+ [2262]=5,
+ [2263]=5,
+ [2264]=5,
+ [2265]=5,
+ [2266]=5,
+ [2267]=5,
+ [2268]=5,
+ [2269]=5,
+ [2270]=5,
+ [2271]=5,
+ [2272]=5,
+ [2273]=5,
+ [2274]=4,
+ [2275]=5,
+ [2276]=5,
+ [2277]=5,
+ [2278]=5,
+ [2279]=5,
+ [2280]=5,
+ [2281]=5,
+ [2282]=5,
+ [2283]=5,
+ [2284]=5,
+ [2285]=5,
+ [2286]=5,
+ [2287]=5,
+ [2288]=5,
+ [2289]=5,
+ [2290]=5,
+ [2291]=5,
+ [2292]=5,
+ [2293]=5,
+ [2294]=5,
+ [2295]=5,
+ [2296]=5,
+ [2297]=5,
+ [2298]=5,
+ [2299]=5,
+ [2300]=5,
+ [2301]=5,
+ [2302]=5,
+ [2303]=5,
+ [2304]=5,
+ [2305]=5,
+ [2306]=5,
+ [2362]=5,
+ [2364]=5,
+ [2369]=5,
+ [2370]=5,
+ [2371]=5,
+ [2372]=5,
+ [2373]=5,
+ [2374]=5,
+ [2375]=5,
+ [2376]=5,
+ [2381]=5,
+ [2385]=5,
+ [2386]=5,
+ [2387]=5,
+ [2388]=5,
+ [2389]=5,
+ [2390]=5,
+ [2391]=5,
+ [2402]=5,
+ [2403]=5,
+ [2433]=5,
+ [2492]=5,
+ [2497]=5,
+ [2498]=5,
+ [2499]=5,
+ [2500]=5,
+ [2509]=5,
+ [2530]=5,
+ [2531]=5,
+ [2558]=5,
+ [2561]=5,
+ [2562]=5,
+ [2620]=5,
+ [2625]=5,
+ [2626]=5,
+ [2631]=5,
+ [2632]=5,
+ [2635]=5,
+ [2636]=5,
+ [2637]=5,
+ [2641]=5,
+ [2672]=5,
+ [2673]=5,
+ [2677]=5,
+ [2689]=5,
+ [2690]=5,
+ [2748]=5,
+ [2753]=5,
+ [2754]=5,
+ [2755]=5,
+ [2756]=5,
+ [2757]=5,
+ [2759]=5,
+ [2760]=5,
+ [2765]=5,
+ [2786]=5,
+ [2787]=5,
+ [2810]=5,
+ [2811]=5,
+ [2812]=5,
+ [2813]=5,
+ [2814]=5,
+ [2815]=5,
+ [2817]=5,
+ [2876]=5,
+ [2879]=5,
+ [2881]=5,
+ [2882]=5,
+ [2883]=5,
+ [2884]=5,
+ [2893]=5,
+ [2902]=5,
+ [2914]=5,
+ [2915]=5,
+ [2946]=5,
+ [3008]=5,
+ [3021]=5,
+ [3072]=5,
+ [3076]=5,
+ [3134]=5,
+ [3135]=5,
+ [3136]=5,
+ [3142]=5,
+ [3143]=5,
+ [3144]=5,
+ [3146]=5,
+ [3147]=5,
+ [3148]=5,
+ [3149]=5,
+ [3157]=5,
+ [3158]=5,
+ [3170]=5,
+ [3171]=5,
+ [3201]=5,
+ [3260]=5,
+ [3263]=5,
+ [3270]=5,
+ [3276]=5,
+ [3277]=5,
+ [3298]=5,
+ [3299]=5,
+ [3328]=5,
+ [3329]=5,
+ [3387]=5,
+ [3388]=5,
+ [3393]=5,
+ [3394]=5,
+ [3395]=5,
+ [3396]=5,
+ [3405]=5,
+ [3426]=5,
+ [3427]=5,
+ [3530]=5,
+ [3538]=5,
+ [3539]=5,
+ [3540]=5,
+ [3542]=5,
+ [3633]=5,
+ [3636]=5,
+ [3637]=5,
+ [3638]=5,
+ [3639]=5,
+ [3640]=5,
+ [3641]=5,
+ [3642]=5,
+ [3655]=5,
+ [3656]=5,
+ [3657]=5,
+ [3658]=5,
+ [3659]=5,
+ [3660]=5,
+ [3661]=5,
+ [3662]=5,
+ [3761]=5,
+ [3764]=5,
+ [3765]=5,
+ [3766]=5,
+ [3767]=5,
+ [3768]=5,
+ [3769]=5,
+ [3770]=5,
+ [3771]=5,
+ [3772]=5,
+ [3784]=5,
+ [3785]=5,
+ [3786]=5,
+ [3787]=5,
+ [3788]=5,
+ [3789]=5,
+ [3864]=5,
+ [3865]=5,
+ [3893]=5,
+ [3895]=5,
+ [3897]=5,
+ [3953]=5,
+ [3954]=5,
+ [3955]=5,
+ [3956]=5,
+ [3957]=5,
+ [3958]=5,
+ [3959]=5,
+ [3960]=5,
+ [3961]=5,
+ [3962]=5,
+ [3963]=5,
+ [3964]=5,
+ [3965]=5,
+ [3966]=5,
+ [3968]=5,
+ [3969]=5,
+ [3970]=5,
+ [3971]=5,
+ [3972]=5,
+ [3974]=5,
+ [3975]=5,
+ [3981]=5,
+ [3982]=5,
+ [3983]=5,
+ [3984]=5,
+ [3985]=5,
+ [3986]=5,
+ [3987]=5,
+ [3988]=5,
+ [3989]=5,
+ [3990]=5,
+ [3991]=5,
+ [3993]=5,
+ [3994]=5,
+ [3995]=5,
+ [3996]=5,
+ [3997]=5,
+ [3998]=5,
+ [3999]=5,
+ [4000]=5,
+ [4001]=5,
+ [4002]=5,
+ [4003]=5,
+ [4004]=5,
+ [4005]=5,
+ [4006]=5,
+ [4007]=5,
+ [4008]=5,
+ [4009]=5,
+ [4010]=5,
+ [4011]=5,
+ [4012]=5,
+ [4013]=5,
+ [4014]=5,
+ [4015]=5,
+ [4016]=5,
+ [4017]=5,
+ [4018]=5,
+ [4019]=5,
+ [4020]=5,
+ [4021]=5,
+ [4022]=5,
+ [4023]=5,
+ [4024]=5,
+ [4025]=5,
+ [4026]=5,
+ [4027]=5,
+ [4028]=5,
+ [4038]=5,
+ [4141]=5,
+ [4142]=5,
+ [4143]=5,
+ [4144]=5,
+ [4146]=5,
+ [4147]=5,
+ [4148]=5,
+ [4149]=5,
+ [4150]=5,
+ [4151]=5,
+ [4153]=5,
+ [4154]=5,
+ [4157]=5,
+ [4158]=5,
+ [4184]=5,
+ [4185]=5,
+ [4190]=5,
+ [4191]=5,
+ [4192]=5,
+ [4209]=5,
+ [4210]=5,
+ [4211]=5,
+ [4212]=5,
+ [4226]=5,
+ [4229]=5,
+ [4230]=5,
+ [4237]=5,
+ [4253]=5,
+ [4957]=5,
+ [4958]=5,
+ [4959]=5,
+ [5906]=5,
+ [5907]=5,
+ [5908]=5,
+ [5938]=5,
+ [5939]=5,
+ [5940]=5,
+ [5970]=5,
+ [5971]=5,
+ [6002]=5,
+ [6003]=5,
+ [6071]=5,
+ [6072]=5,
+ [6073]=5,
+ [6074]=5,
+ [6075]=5,
+ [6076]=5,
+ [6077]=5,
+ [6086]=5,
+ [6089]=5,
+ [6090]=5,
+ [6091]=5,
+ [6092]=5,
+ [6093]=5,
+ [6094]=5,
+ [6095]=5,
+ [6096]=5,
+ [6097]=5,
+ [6098]=5,
+ [6099]=5,
+ [6109]=5,
+ [6150]=4,
+ [6151]=2,
+ [6154]=2,
+ [6155]=5,
+ [6156]=5,
+ [6157]=5,
+ [6158]=4,
+ [6176]=2,
+ [6177]=2,
+ [6178]=2,
+ [6179]=2,
+ [6180]=2,
+ [6181]=2,
+ [6182]=2,
+ [6183]=2,
+ [6184]=2,
+ [6185]=2,
+ [6186]=2,
+ [6187]=2,
+ [6188]=2,
+ [6189]=2,
+ [6190]=2,
+ [6191]=2,
+ [6192]=2,
+ [6193]=2,
+ [6194]=2,
+ [6195]=2,
+ [6196]=2,
+ [6197]=2,
+ [6198]=2,
+ [6199]=2,
+ [6200]=2,
+ [6201]=2,
+ [6202]=2,
+ [6203]=2,
+ [6204]=2,
+ [6205]=2,
+ [6206]=2,
+ [6207]=2,
+ [6208]=2,
+ [6209]=2,
+ [6210]=2,
+ [6211]=2,
+ [6212]=2,
+ [6213]=2,
+ [6214]=2,
+ [6215]=2,
+ [6216]=2,
+ [6217]=2,
+ [6218]=2,
+ [6219]=2,
+ [6220]=2,
+ [6221]=2,
+ [6222]=2,
+ [6223]=2,
+ [6224]=2,
+ [6225]=2,
+ [6226]=2,
+ [6227]=2,
+ [6228]=2,
+ [6229]=2,
+ [6230]=2,
+ [6231]=2,
+ [6232]=2,
+ [6233]=2,
+ [6234]=2,
+ [6235]=2,
+ [6236]=2,
+ [6237]=2,
+ [6238]=2,
+ [6239]=2,
+ [6240]=2,
+ [6241]=2,
+ [6242]=2,
+ [6243]=2,
+ [6244]=2,
+ [6245]=2,
+ [6246]=2,
+ [6247]=2,
+ [6248]=2,
+ [6249]=2,
+ [6250]=2,
+ [6251]=2,
+ [6252]=2,
+ [6253]=2,
+ [6254]=2,
+ [6255]=2,
+ [6256]=2,
+ [6257]=2,
+ [6258]=2,
+ [6259]=2,
+ [6260]=2,
+ [6261]=2,
+ [6262]=2,
+ [6263]=2,
+ [6264]=2,
+ [6272]=4,
+ [6273]=4,
+ [6274]=4,
+ [6275]=4,
+ [6276]=4,
+ [6279]=2,
+ [6280]=2,
+ [6281]=2,
+ [6282]=2,
+ [6283]=2,
+ [6284]=2,
+ [6285]=2,
+ [6286]=2,
+ [6287]=2,
+ [6288]=2,
+ [6289]=2,
+ [6290]=2,
+ [6291]=2,
+ [6292]=2,
+ [6293]=2,
+ [6294]=2,
+ [6295]=2,
+ [6296]=2,
+ [6297]=2,
+ [6298]=2,
+ [6299]=2,
+ [6300]=2,
+ [6301]=2,
+ [6302]=2,
+ [6303]=2,
+ [6304]=2,
+ [6305]=2,
+ [6306]=2,
+ [6307]=2,
+ [6308]=2,
+ [6309]=2,
+ [6310]=2,
+ [6311]=2,
+ [6312]=2,
+ [6313]=5,
+ [6314]=2,
+ [6432]=5,
+ [6433]=5,
+ [6434]=5,
+ [6439]=5,
+ [6440]=5,
+ [6450]=5,
+ [6457]=5,
+ [6458]=5,
+ [6459]=5,
+ [6679]=5,
+ [6680]=5,
+ [6742]=5,
+ [6744]=5,
+ [6745]=5,
+ [6746]=5,
+ [6747]=5,
+ [6748]=5,
+ [6749]=5,
+ [6750]=5,
+ [6752]=5,
+ [6754]=5,
+ [6757]=5,
+ [6758]=5,
+ [6759]=5,
+ [6760]=5,
+ [6761]=5,
+ [6762]=5,
+ [6763]=5,
+ [6764]=5,
+ [6771]=5,
+ [6772]=5,
+ [6773]=5,
+ [6774]=5,
+ [6775]=5,
+ [6776]=5,
+ [6777]=5,
+ [6778]=5,
+ [6779]=5,
+ [6780]=5,
+ [6783]=5,
+ [6832]=5,
+ [6833]=5,
+ [6834]=5,
+ [6835]=5,
+ [6836]=5,
+ [6837]=5,
+ [6838]=5,
+ [6839]=5,
+ [6840]=5,
+ [6841]=5,
+ [6842]=5,
+ [6843]=5,
+ [6844]=5,
+ [6845]=5,
+ [6912]=5,
+ [6913]=5,
+ [6914]=5,
+ [6915]=5,
+ [6964]=5,
+ [6966]=5,
+ [6967]=5,
+ [6968]=5,
+ [6969]=5,
+ [6970]=5,
+ [6972]=5,
+ [6978]=5,
+ [7019]=5,
+ [7020]=5,
+ [7021]=5,
+ [7022]=5,
+ [7023]=5,
+ [7024]=5,
+ [7025]=5,
+ [7026]=5,
+ [7027]=5,
+ [7040]=5,
+ [7041]=5,
+ [7074]=5,
+ [7075]=5,
+ [7076]=5,
+ [7077]=5,
+ [7080]=5,
+ [7081]=5,
+ [7083]=5,
+ [7142]=5,
+ [7144]=5,
+ [7145]=5,
+ [7149]=5,
+ [7151]=5,
+ [7152]=5,
+ [7153]=5,
+ [7212]=5,
+ [7213]=5,
+ [7214]=5,
+ [7215]=5,
+ [7216]=5,
+ [7217]=5,
+ [7218]=5,
+ [7219]=5,
+ [7222]=5,
+ [7223]=5,
+ [7376]=5,
+ [7377]=5,
+ [7378]=5,
+ [7380]=5,
+ [7381]=5,
+ [7382]=5,
+ [7383]=5,
+ [7384]=5,
+ [7385]=5,
+ [7386]=5,
+ [7387]=5,
+ [7388]=5,
+ [7389]=5,
+ [7390]=5,
+ [7391]=5,
+ [7392]=5,
+ [7394]=5,
+ [7395]=5,
+ [7396]=5,
+ [7397]=5,
+ [7398]=5,
+ [7399]=5,
+ [7400]=5,
+ [7405]=5,
+ [7412]=5,
+ [7416]=5,
+ [7417]=5,
+ [7616]=5,
+ [7617]=5,
+ [7618]=5,
+ [7619]=5,
+ [7620]=5,
+ [7621]=5,
+ [7622]=5,
+ [7623]=5,
+ [7624]=5,
+ [7625]=5,
+ [7626]=5,
+ [7627]=5,
+ [7628]=5,
+ [7629]=5,
+ [7630]=5,
+ [7631]=5,
+ [7632]=5,
+ [7633]=5,
+ [7634]=5,
+ [7635]=5,
+ [7636]=5,
+ [7637]=5,
+ [7638]=5,
+ [7639]=5,
+ [7640]=5,
+ [7641]=5,
+ [7642]=5,
+ [7643]=5,
+ [7644]=5,
+ [7645]=5,
+ [7646]=5,
+ [7647]=5,
+ [7648]=5,
+ [7649]=5,
+ [7650]=5,
+ [7651]=5,
+ [7652]=5,
+ [7653]=5,
+ [7654]=5,
+ [7655]=5,
+ [7656]=5,
+ [7657]=5,
+ [7658]=5,
+ [7659]=5,
+ [7660]=5,
+ [7661]=5,
+ [7662]=5,
+ [7663]=5,
+ [7664]=5,
+ [7665]=5,
+ [7666]=5,
+ [7667]=5,
+ [7668]=5,
+ [7669]=5,
+ [7670]=5,
+ [7671]=5,
+ [7672]=5,
+ [7673]=5,
+ [7675]=5,
+ [7676]=5,
+ [7677]=5,
+ [7678]=5,
+ [7679]=5,
+ [8204]=4,
+ [8205]=2,
+ [8239]=4,
+ [8294]=4,
+ [8295]=4,
+ [8296]=4,
+ [8297]=4,
+ [8400]=5,
+ [8401]=5,
+ [8402]=5,
+ [8403]=5,
+ [8404]=5,
+ [8405]=5,
+ [8406]=5,
+ [8407]=5,
+ [8408]=5,
+ [8409]=5,
+ [8410]=5,
+ [8411]=5,
+ [8412]=5,
+ [8417]=5,
+ [8421]=5,
+ [8422]=5,
+ [8423]=5,
+ [8424]=5,
+ [8425]=5,
+ [8426]=5,
+ [8427]=5,
+ [8428]=5,
+ [8429]=5,
+ [8430]=5,
+ [8431]=5,
+ [8432]=5,
+ [11503]=5,
+ [11504]=5,
+ [11505]=5,
+ [11647]=5,
+ [11744]=5,
+ [11745]=5,
+ [11746]=5,
+ [11747]=5,
+ [11748]=5,
+ [11749]=5,
+ [11750]=5,
+ [11751]=5,
+ [11752]=5,
+ [11753]=5,
+ [11754]=5,
+ [11755]=5,
+ [11756]=5,
+ [11757]=5,
+ [11758]=5,
+ [11759]=5,
+ [11760]=5,
+ [11761]=5,
+ [11762]=5,
+ [11763]=5,
+ [11764]=5,
+ [11765]=5,
+ [11766]=5,
+ [11767]=5,
+ [11768]=5,
+ [11769]=5,
+ [11770]=5,
+ [11771]=5,
+ [11772]=5,
+ [11773]=5,
+ [11774]=5,
+ [11775]=5,
+ [12330]=5,
+ [12331]=5,
+ [12332]=5,
+ [12333]=5,
+ [12334]=5,
+ [12335]=5,
+ [12441]=5,
+ [12442]=5,
+ [42607]=5,
+ [42612]=5,
+ [42613]=5,
+ [42614]=5,
+ [42615]=5,
+ [42616]=5,
+ [42617]=5,
+ [42618]=5,
+ [42619]=5,
+ [42620]=5,
+ [42621]=5,
+ [42654]=5,
+ [42655]=5,
+ [42736]=5,
+ [42737]=5,
+ [43014]=5,
+ [43019]=5,
+ [43045]=5,
+ [43046]=5,
+ [43072]=2,
+ [43073]=2,
+ [43074]=2,
+ [43075]=2,
+ [43076]=2,
+ [43077]=2,
+ [43078]=2,
+ [43079]=2,
+ [43080]=2,
+ [43081]=2,
+ [43082]=2,
+ [43083]=2,
+ [43084]=2,
+ [43085]=2,
+ [43086]=2,
+ [43087]=2,
+ [43088]=2,
+ [43089]=2,
+ [43090]=2,
+ [43091]=2,
+ [43092]=2,
+ [43093]=2,
+ [43094]=2,
+ [43095]=2,
+ [43096]=2,
+ [43097]=2,
+ [43098]=2,
+ [43099]=2,
+ [43100]=2,
+ [43101]=2,
+ [43102]=2,
+ [43103]=2,
+ [43104]=2,
+ [43105]=2,
+ [43106]=2,
+ [43107]=2,
+ [43108]=2,
+ [43109]=2,
+ [43110]=2,
+ [43111]=2,
+ [43112]=2,
+ [43113]=2,
+ [43114]=2,
+ [43115]=2,
+ [43116]=2,
+ [43117]=2,
+ [43118]=2,
+ [43119]=2,
+ [43120]=2,
+ [43121]=2,
+ [43122]=1,
+ [43123]=4,
+ [43204]=5,
+ [43205]=5,
+ [43232]=5,
+ [43233]=5,
+ [43234]=5,
+ [43235]=5,
+ [43236]=5,
+ [43237]=5,
+ [43238]=5,
+ [43239]=5,
+ [43240]=5,
+ [43241]=5,
+ [43242]=5,
+ [43243]=5,
+ [43244]=5,
+ [43245]=5,
+ [43246]=5,
+ [43247]=5,
+ [43248]=5,
+ [43249]=5,
+ [43263]=5,
+ [43302]=5,
+ [43303]=5,
+ [43304]=5,
+ [43305]=5,
+ [43306]=5,
+ [43307]=5,
+ [43308]=5,
+ [43309]=5,
+ [43335]=5,
+ [43336]=5,
+ [43337]=5,
+ [43338]=5,
+ [43339]=5,
+ [43340]=5,
+ [43341]=5,
+ [43342]=5,
+ [43343]=5,
+ [43344]=5,
+ [43345]=5,
+ [43392]=5,
+ [43393]=5,
+ [43394]=5,
+ [43443]=5,
+ [43446]=5,
+ [43447]=5,
+ [43448]=5,
+ [43449]=5,
+ [43452]=5,
+ [43493]=5,
+ [43561]=5,
+ [43562]=5,
+ [43563]=5,
+ [43564]=5,
+ [43565]=5,
+ [43566]=5,
+ [43569]=5,
+ [43570]=5,
+ [43573]=5,
+ [43574]=5,
+ [43587]=5,
+ [43596]=5,
+ [43644]=5,
+ [43696]=5,
+ [43698]=5,
+ [43699]=5,
+ [43700]=5,
+ [43703]=5,
+ [43704]=5,
+ [43710]=5,
+ [43711]=5,
+ [43713]=5,
+ [43756]=5,
+ [43757]=5,
+ [43766]=5,
+ [44005]=5,
+ [44008]=5,
+ [44013]=5,
+ [64286]=5,
+ [65056]=5,
+ [65057]=5,
+ [65058]=5,
+ [65059]=5,
+ [65060]=5,
+ [65061]=5,
+ [65062]=5,
+ [65063]=5,
+ [65064]=5,
+ [65065]=5,
+ [65066]=5,
+ [65067]=5,
+ [65068]=5,
+ [65069]=5,
+ [65070]=5,
+ [65071]=5,
+ [66045]=5,
+ [66272]=5,
+ [66422]=5,
+ [66423]=5,
+ [66424]=5,
+ [66425]=5,
+ [66426]=5,
+ [68097]=5,
+ [68098]=5,
+ [68099]=5,
+ [68101]=5,
+ [68102]=5,
+ [68108]=5,
+ [68109]=5,
+ [68110]=5,
+ [68111]=5,
+ [68152]=5,
+ [68153]=5,
+ [68154]=5,
+ [68159]=5,
+ [68288]=2,
+ [68289]=2,
+ [68290]=2,
+ [68291]=2,
+ [68292]=2,
+ [68293]=3,
+ [68294]=4,
+ [68295]=3,
+ [68296]=4,
+ [68297]=3,
+ [68298]=3,
+ [68299]=4,
+ [68300]=4,
+ [68301]=1,
+ [68302]=3,
+ [68303]=3,
+ [68304]=3,
+ [68305]=3,
+ [68306]=3,
+ [68307]=2,
+ [68308]=2,
+ [68309]=2,
+ [68310]=2,
+ [68311]=1,
+ [68312]=2,
+ [68313]=2,
+ [68314]=2,
+ [68315]=2,
+ [68316]=2,
+ [68317]=3,
+ [68318]=2,
+ [68319]=2,
+ [68320]=2,
+ [68321]=3,
+ [68322]=4,
+ [68323]=4,
+ [68324]=3,
+ [68325]=5,
+ [68326]=5,
+ [68331]=2,
+ [68332]=2,
+ [68333]=2,
+ [68334]=2,
+ [68335]=3,
+ [68480]=2,
+ [68481]=3,
+ [68482]=2,
+ [68483]=3,
+ [68484]=3,
+ [68485]=3,
+ [68486]=2,
+ [68487]=2,
+ [68488]=2,
+ [68489]=3,
+ [68490]=2,
+ [68491]=2,
+ [68492]=3,
+ [68493]=2,
+ [68494]=3,
+ [68495]=3,
+ [68496]=2,
+ [68497]=3,
+ [68521]=3,
+ [68522]=3,
+ [68523]=3,
+ [68524]=3,
+ [68525]=2,
+ [68526]=2,
+ [68527]=4,
+ [68864]=1,
+ [68865]=2,
+ [68866]=2,
+ [68867]=2,
+ [68868]=2,
+ [68869]=2,
+ [68870]=2,
+ [68871]=2,
+ [68872]=2,
+ [68873]=2,
+ [68874]=2,
+ [68875]=2,
+ [68876]=2,
+ [68877]=2,
+ [68878]=2,
+ [68879]=2,
+ [68880]=2,
+ [68881]=2,
+ [68882]=2,
+ [68883]=2,
+ [68884]=2,
+ [68885]=2,
+ [68886]=2,
+ [68887]=2,
+ [68888]=2,
+ [68889]=2,
+ [68890]=2,
+ [68891]=2,
+ [68892]=2,
+ [68893]=2,
+ [68894]=2,
+ [68895]=2,
+ [68896]=2,
+ [68897]=2,
+ [68898]=3,
+ [68899]=2,
+ [68900]=5,
+ [68901]=5,
+ [68902]=5,
+ [68903]=5,
+ [69424]=2,
+ [69425]=2,
+ [69426]=2,
+ [69427]=3,
+ [69428]=2,
+ [69429]=2,
+ [69430]=2,
+ [69431]=2,
+ [69432]=2,
+ [69433]=2,
+ [69434]=2,
+ [69435]=2,
+ [69436]=2,
+ [69437]=2,
+ [69438]=2,
+ [69439]=2,
+ [69440]=2,
+ [69441]=2,
+ [69442]=2,
+ [69443]=2,
+ [69444]=2,
+ [69445]=4,
+ [69446]=5,
+ [69447]=5,
+ [69448]=5,
+ [69449]=5,
+ [69450]=5,
+ [69451]=5,
+ [69452]=5,
+ [69453]=5,
+ [69454]=5,
+ [69455]=5,
+ [69456]=5,
+ [69457]=2,
+ [69458]=2,
+ [69459]=2,
+ [69460]=3,
+ [69633]=5,
+ [69688]=5,
+ [69689]=5,
+ [69690]=5,
+ [69691]=5,
+ [69692]=5,
+ [69693]=5,
+ [69694]=5,
+ [69695]=5,
+ [69696]=5,
+ [69697]=5,
+ [69698]=5,
+ [69699]=5,
+ [69700]=5,
+ [69701]=5,
+ [69702]=5,
+ [69759]=5,
+ [69760]=5,
+ [69761]=5,
+ [69811]=5,
+ [69812]=5,
+ [69813]=5,
+ [69814]=5,
+ [69817]=5,
+ [69818]=5,
+ [69821]=4,
+ [69837]=4,
+ [69888]=5,
+ [69889]=5,
+ [69890]=5,
+ [69927]=5,
+ [69928]=5,
+ [69929]=5,
+ [69930]=5,
+ [69931]=5,
+ [69933]=5,
+ [69934]=5,
+ [69935]=5,
+ [69936]=5,
+ [69937]=5,
+ [69938]=5,
+ [69939]=5,
+ [69940]=5,
+ [70003]=5,
+ [70016]=5,
+ [70017]=5,
+ [70070]=5,
+ [70071]=5,
+ [70072]=5,
+ [70073]=5,
+ [70074]=5,
+ [70075]=5,
+ [70076]=5,
+ [70077]=5,
+ [70078]=5,
+ [70090]=5,
+ [70091]=5,
+ [70092]=5,
+ [70191]=5,
+ [70192]=5,
+ [70193]=5,
+ [70196]=5,
+ [70198]=5,
+ [70199]=5,
+ [70206]=5,
+ [70367]=5,
+ [70371]=5,
+ [70372]=5,
+ [70373]=5,
+ [70374]=5,
+ [70375]=5,
+ [70376]=5,
+ [70377]=5,
+ [70378]=5,
+ [70400]=5,
+ [70401]=5,
+ [70459]=5,
+ [70460]=5,
+ [70464]=5,
+ [70502]=5,
+ [70503]=5,
+ [70504]=5,
+ [70505]=5,
+ [70506]=5,
+ [70507]=5,
+ [70508]=5,
+ [70512]=5,
+ [70513]=5,
+ [70514]=5,
+ [70515]=5,
+ [70516]=5,
+ [70712]=5,
+ [70713]=5,
+ [70714]=5,
+ [70715]=5,
+ [70716]=5,
+ [70717]=5,
+ [70718]=5,
+ [70719]=5,
+ [70722]=5,
+ [70723]=5,
+ [70724]=5,
+ [70726]=5,
+ [70750]=5,
+ [70835]=5,
+ [70836]=5,
+ [70837]=5,
+ [70838]=5,
+ [70839]=5,
+ [70840]=5,
+ [70842]=5,
+ [70847]=5,
+ [70848]=5,
+ [70850]=5,
+ [70851]=5,
+ [71090]=5,
+ [71091]=5,
+ [71092]=5,
+ [71093]=5,
+ [71100]=5,
+ [71101]=5,
+ [71103]=5,
+ [71104]=5,
+ [71132]=5,
+ [71133]=5,
+ [71219]=5,
+ [71220]=5,
+ [71221]=5,
+ [71222]=5,
+ [71223]=5,
+ [71224]=5,
+ [71225]=5,
+ [71226]=5,
+ [71229]=5,
+ [71231]=5,
+ [71232]=5,
+ [71339]=5,
+ [71341]=5,
+ [71344]=5,
+ [71345]=5,
+ [71346]=5,
+ [71347]=5,
+ [71348]=5,
+ [71349]=5,
+ [71351]=5,
+ [71453]=5,
+ [71454]=5,
+ [71455]=5,
+ [71458]=5,
+ [71459]=5,
+ [71460]=5,
+ [71461]=5,
+ [71463]=5,
+ [71464]=5,
+ [71465]=5,
+ [71466]=5,
+ [71467]=5,
+ [71727]=5,
+ [71728]=5,
+ [71729]=5,
+ [71730]=5,
+ [71731]=5,
+ [71732]=5,
+ [71733]=5,
+ [71734]=5,
+ [71735]=5,
+ [71737]=5,
+ [71738]=5,
+ [72148]=5,
+ [72149]=5,
+ [72150]=5,
+ [72151]=5,
+ [72154]=5,
+ [72155]=5,
+ [72160]=5,
+ [72193]=5,
+ [72194]=5,
+ [72195]=5,
+ [72196]=5,
+ [72197]=5,
+ [72198]=5,
+ [72201]=5,
+ [72202]=5,
+ [72243]=5,
+ [72244]=5,
+ [72245]=5,
+ [72246]=5,
+ [72247]=5,
+ [72248]=5,
+ [72251]=5,
+ [72252]=5,
+ [72253]=5,
+ [72254]=5,
+ [72263]=5,
+ [72273]=5,
+ [72274]=5,
+ [72275]=5,
+ [72276]=5,
+ [72277]=5,
+ [72278]=5,
+ [72281]=5,
+ [72282]=5,
+ [72283]=5,
+ [72330]=5,
+ [72331]=5,
+ [72332]=5,
+ [72333]=5,
+ [72334]=5,
+ [72335]=5,
+ [72336]=5,
+ [72337]=5,
+ [72338]=5,
+ [72339]=5,
+ [72340]=5,
+ [72341]=5,
+ [72342]=5,
+ [72344]=5,
+ [72345]=5,
+ [72752]=5,
+ [72753]=5,
+ [72754]=5,
+ [72755]=5,
+ [72756]=5,
+ [72757]=5,
+ [72758]=5,
+ [72760]=5,
+ [72761]=5,
+ [72762]=5,
+ [72763]=5,
+ [72764]=5,
+ [72765]=5,
+ [72767]=5,
+ [72850]=5,
+ [72851]=5,
+ [72852]=5,
+ [72853]=5,
+ [72854]=5,
+ [72855]=5,
+ [72856]=5,
+ [72857]=5,
+ [72858]=5,
+ [72859]=5,
+ [72860]=5,
+ [72861]=5,
+ [72862]=5,
+ [72863]=5,
+ [72864]=5,
+ [72865]=5,
+ [72866]=5,
+ [72867]=5,
+ [72868]=5,
+ [72869]=5,
+ [72870]=5,
+ [72871]=5,
+ [72874]=5,
+ [72875]=5,
+ [72876]=5,
+ [72877]=5,
+ [72878]=5,
+ [72879]=5,
+ [72880]=5,
+ [72882]=5,
+ [72883]=5,
+ [72885]=5,
+ [72886]=5,
+ [73009]=5,
+ [73010]=5,
+ [73011]=5,
+ [73012]=5,
+ [73013]=5,
+ [73014]=5,
+ [73018]=5,
+ [73020]=5,
+ [73021]=5,
+ [73023]=5,
+ [73024]=5,
+ [73025]=5,
+ [73026]=5,
+ [73027]=5,
+ [73028]=5,
+ [73029]=5,
+ [73031]=5,
+ [73104]=5,
+ [73105]=5,
+ [73109]=5,
+ [73111]=5,
+ [73459]=5,
+ [73460]=5,
+ [92912]=5,
+ [92913]=5,
+ [92914]=5,
+ [92915]=5,
+ [92916]=5,
+ [92976]=5,
+ [92977]=5,
+ [92978]=5,
+ [92979]=5,
+ [92980]=5,
+ [92981]=5,
+ [92982]=5,
+ [94031]=5,
+ [94095]=5,
+ [94096]=5,
+ [94097]=5,
+ [94098]=5,
+ [113821]=5,
+ [113822]=5,
+ [119143]=5,
+ [119144]=5,
+ [119145]=5,
+ [119163]=5,
+ [119164]=5,
+ [119165]=5,
+ [119166]=5,
+ [119167]=5,
+ [119168]=5,
+ [119169]=5,
+ [119170]=5,
+ [119173]=5,
+ [119174]=5,
+ [119175]=5,
+ [119176]=5,
+ [119177]=5,
+ [119178]=5,
+ [119179]=5,
+ [119210]=5,
+ [119211]=5,
+ [119212]=5,
+ [119213]=5,
+ [119362]=5,
+ [119363]=5,
+ [119364]=5,
+ [121344]=5,
+ [121345]=5,
+ [121346]=5,
+ [121347]=5,
+ [121348]=5,
+ [121349]=5,
+ [121350]=5,
+ [121351]=5,
+ [121352]=5,
+ [121353]=5,
+ [121354]=5,
+ [121355]=5,
+ [121356]=5,
+ [121357]=5,
+ [121358]=5,
+ [121359]=5,
+ [121360]=5,
+ [121361]=5,
+ [121362]=5,
+ [121363]=5,
+ [121364]=5,
+ [121365]=5,
+ [121366]=5,
+ [121367]=5,
+ [121368]=5,
+ [121369]=5,
+ [121370]=5,
+ [121371]=5,
+ [121372]=5,
+ [121373]=5,
+ [121374]=5,
+ [121375]=5,
+ [121376]=5,
+ [121377]=5,
+ [121378]=5,
+ [121379]=5,
+ [121380]=5,
+ [121381]=5,
+ [121382]=5,
+ [121383]=5,
+ [121384]=5,
+ [121385]=5,
+ [121386]=5,
+ [121387]=5,
+ [121388]=5,
+ [121389]=5,
+ [121390]=5,
+ [121391]=5,
+ [121392]=5,
+ [121393]=5,
+ [121394]=5,
+ [121395]=5,
+ [121396]=5,
+ [121397]=5,
+ [121398]=5,
+ [121403]=5,
+ [121404]=5,
+ [121405]=5,
+ [121406]=5,
+ [121407]=5,
+ [121408]=5,
+ [121409]=5,
+ [121410]=5,
+ [121411]=5,
+ [121412]=5,
+ [121413]=5,
+ [121414]=5,
+ [121415]=5,
+ [121416]=5,
+ [121417]=5,
+ [121418]=5,
+ [121419]=5,
+ [121420]=5,
+ [121421]=5,
+ [121422]=5,
+ [121423]=5,
+ [121424]=5,
+ [121425]=5,
+ [121426]=5,
+ [121427]=5,
+ [121428]=5,
+ [121429]=5,
+ [121430]=5,
+ [121431]=5,
+ [121432]=5,
+ [121433]=5,
+ [121434]=5,
+ [121435]=5,
+ [121436]=5,
+ [121437]=5,
+ [121438]=5,
+ [121439]=5,
+ [121440]=5,
+ [121441]=5,
+ [121442]=5,
+ [121443]=5,
+ [121444]=5,
+ [121445]=5,
+ [121446]=5,
+ [121447]=5,
+ [121448]=5,
+ [121449]=5,
+ [121450]=5,
+ [121451]=5,
+ [121452]=5,
+ [121461]=5,
+ [121476]=5,
+ [121499]=5,
+ [121500]=5,
+ [121501]=5,
+ [121502]=5,
+ [121503]=5,
+ [121505]=5,
+ [121506]=5,
+ [121507]=5,
+ [121508]=5,
+ [121509]=5,
+ [121510]=5,
+ [121511]=5,
+ [121512]=5,
+ [121513]=5,
+ [121514]=5,
+ [121515]=5,
+ [121516]=5,
+ [121517]=5,
+ [121518]=5,
+ [121519]=5,
+ [122880]=5,
+ [122881]=5,
+ [122882]=5,
+ [122883]=5,
+ [122884]=5,
+ [122885]=5,
+ [122886]=5,
+ [122888]=5,
+ [122889]=5,
+ [122890]=5,
+ [122891]=5,
+ [122892]=5,
+ [122893]=5,
+ [122894]=5,
+ [122895]=5,
+ [122896]=5,
+ [122897]=5,
+ [122898]=5,
+ [122899]=5,
+ [122900]=5,
+ [122901]=5,
+ [122902]=5,
+ [122903]=5,
+ [122904]=5,
+ [122907]=5,
+ [122908]=5,
+ [122909]=5,
+ [122910]=5,
+ [122911]=5,
+ [122912]=5,
+ [122913]=5,
+ [122915]=5,
+ [122916]=5,
+ [122918]=5,
+ [122919]=5,
+ [122920]=5,
+ [122921]=5,
+ [122922]=5,
+ [123184]=5,
+ [123185]=5,
+ [123186]=5,
+ [123187]=5,
+ [123188]=5,
+ [123189]=5,
+ [123190]=5,
+ [123628]=5,
+ [123629]=5,
+ [123630]=5,
+ [123631]=5,
+ [125136]=5,
+ [125137]=5,
+ [125138]=5,
+ [125139]=5,
+ [125140]=5,
+ [125141]=5,
+ [125142]=5,
+ [125184]=2,
+ [125185]=2,
+ [125186]=2,
+ [125187]=2,
+ [125188]=2,
+ [125189]=2,
+ [125190]=2,
+ [125191]=2,
+ [125192]=2,
+ [125193]=2,
+ [125194]=2,
+ [125195]=2,
+ [125196]=2,
+ [125197]=2,
+ [125198]=2,
+ [125199]=2,
+ [125200]=2,
+ [125201]=2,
+ [125202]=2,
+ [125203]=2,
+ [125204]=2,
+ [125205]=2,
+ [125206]=2,
+ [125207]=2,
+ [125208]=2,
+ [125209]=2,
+ [125210]=2,
+ [125211]=2,
+ [125212]=2,
+ [125213]=2,
+ [125214]=2,
+ [125215]=2,
+ [125216]=2,
+ [125217]=2,
+ [125218]=2,
+ [125219]=2,
+ [125220]=2,
+ [125221]=2,
+ [125222]=2,
+ [125223]=2,
+ [125224]=2,
+ [125225]=2,
+ [125226]=2,
+ [125227]=2,
+ [125228]=2,
+ [125229]=2,
+ [125230]=2,
+ [125231]=2,
+ [125232]=2,
+ [125233]=2,
+ [125234]=2,
+ [125235]=2,
+ [125236]=2,
+ [125237]=2,
+ [125238]=2,
+ [125239]=2,
+ [125240]=2,
+ [125241]=2,
+ [125242]=2,
+ [125243]=2,
+ [125244]=2,
+ [125245]=2,
+ [125246]=2,
+ [125247]=2,
+ [125248]=2,
+ [125249]=2,
+ [125250]=2,
+ [125251]=2,
+ [125252]=5,
+ [125253]=5,
+ [125254]=5,
+ [125255]=5,
+ [125256]=5,
+ [125257]=5,
+ [125258]=5,
+ [1042752]=5,
+}
+characters.indicgroups={
+ ["above_mark"]={
+ [2304]=true,
+ [2305]=true,
+ [2306]=true,
+ [2362]=true,
+ [2373]=true,
+ [2374]=true,
+ [2375]=true,
+ [2376]=true,
+ [2385]=true,
+ [2387]=true,
+ [2388]=true,
+ [2389]=true,
+ [2631]=true,
+ [2632]=true,
+ [2635]=true,
+ [2636]=true,
+ [2690]=true,
+ [2757]=true,
+ [2759]=true,
+ [2760]=true,
+ [2879]=true,
+ [3008]=true,
+ [3021]=true,
+ [3134]=true,
+ [3135]=true,
+ [3136]=true,
+ [3142]=true,
+ [3143]=true,
+ [3146]=true,
+ [3147]=true,
+ [3148]=true,
+ [3149]=true,
+ [3263]=true,
+ [3270]=true,
+ [3406]=true,
+ [4141]=true,
+ [4142]=true,
+ [4146]=true,
+ [4147]=true,
+ [4148]=true,
+ [4149]=true,
+ [4150]=true,
+ [4154]=true,
+ [4209]=true,
+ [4210]=true,
+ [4211]=true,
+ [4212]=true,
+ [4229]=true,
+ [4230]=true,
+ [4253]=true,
+ [43232]=true,
+ [43233]=true,
+ [43234]=true,
+ [43235]=true,
+ [43236]=true,
+ [43237]=true,
+ [43238]=true,
+ [43239]=true,
+ [43240]=true,
+ [43241]=true,
+ [43242]=true,
+ [43243]=true,
+ [43244]=true,
+ [43245]=true,
+ [43246]=true,
+ [43247]=true,
+ [43248]=true,
+ [43249]=true,
+ [43493]=true,
+ [43644]=true,
+ },
+ ["after_half"]={},
+ ["after_main"]={
+ [2864]=true,
+ [2879]=true,
+ [2902]=true,
+ [3376]=true,
+ },
+ ["after_postscript"]={
+ [2433]=true,
+ [2494]=true,
+ [2496]=true,
+ [2519]=true,
+ [2561]=true,
+ [2562]=true,
+ [2622]=true,
+ [2624]=true,
+ [2625]=true,
+ [2626]=true,
+ [2672]=true,
+ [2673]=true,
+ [2735]=true,
+ [2750]=true,
+ [2752]=true,
+ [2753]=true,
+ [2754]=true,
+ [2755]=true,
+ [2756]=true,
+ [2761]=true,
+ [2763]=true,
+ [2764]=true,
+ [2786]=true,
+ [2787]=true,
+ [2878]=true,
+ [2880]=true,
+ [2903]=true,
+ [2992]=true,
+ [3006]=true,
+ [3007]=true,
+ [3009]=true,
+ [3010]=true,
+ [3031]=true,
+ [3120]=true,
+ [3248]=true,
+ [3390]=true,
+ [3391]=true,
+ [3392]=true,
+ [3393]=true,
+ [3394]=true,
+ [3395]=true,
+ [3415]=true,
+ },
+ ["after_subscript"]={
+ [2366]=true,
+ [2368]=true,
+ [2369]=true,
+ [2370]=true,
+ [2371]=true,
+ [2372]=true,
+ [2373]=true,
+ [2374]=true,
+ [2375]=true,
+ [2376]=true,
+ [2377]=true,
+ [2378]=true,
+ [2379]=true,
+ [2380]=true,
+ [2402]=true,
+ [2403]=true,
+ [2480]=true,
+ [2497]=true,
+ [2498]=true,
+ [2499]=true,
+ [2500]=true,
+ [2530]=true,
+ [2531]=true,
+ [2544]=true,
+ [2631]=true,
+ [2632]=true,
+ [2635]=true,
+ [2636]=true,
+ [2757]=true,
+ [2759]=true,
+ [2760]=true,
+ [2881]=true,
+ [2882]=true,
+ [2883]=true,
+ [3008]=true,
+ [3139]=true,
+ [3140]=true,
+ [3267]=true,
+ [3268]=true,
+ [3285]=true,
+ [3286]=true,
+ },
+ ["anudatta"]={
+ [2386]=true,
+ },
+ ["before_half"]={
+ [2367]=true,
+ [2382]=true,
+ [2495]=true,
+ [2503]=true,
+ [2504]=true,
+ [2623]=true,
+ [2751]=true,
+ [2887]=true,
+ },
+ ["before_main"]={
+ [3014]=true,
+ [3015]=true,
+ [3016]=true,
+ [3398]=true,
+ [3399]=true,
+ [3400]=true,
+ },
+ ["before_postscript"]={
+ [2352]=true,
+ [2736]=true,
+ },
+ ["before_subscript"]={
+ [2608]=true,
+ [2817]=true,
+ [3134]=true,
+ [3135]=true,
+ [3136]=true,
+ [3137]=true,
+ [3138]=true,
+ [3142]=true,
+ [3143]=true,
+ [3146]=true,
+ [3147]=true,
+ [3148]=true,
+ [3157]=true,
+ [3158]=true,
+ [3262]=true,
+ [3263]=true,
+ [3265]=true,
+ [3266]=true,
+ [3270]=true,
+ [3276]=true,
+ [3298]=true,
+ [3299]=true,
+ },
+ ["below_mark"]={
+ [2364]=true,
+ [2369]=true,
+ [2370]=true,
+ [2371]=true,
+ [2372]=true,
+ [2381]=true,
+ [2386]=true,
+ [2390]=true,
+ [2391]=true,
+ [2402]=true,
+ [2403]=true,
+ [2492]=true,
+ [2497]=true,
+ [2498]=true,
+ [2499]=true,
+ [2500]=true,
+ [2509]=true,
+ [2620]=true,
+ [2625]=true,
+ [2626]=true,
+ [2637]=true,
+ [2748]=true,
+ [2753]=true,
+ [2754]=true,
+ [2755]=true,
+ [2756]=true,
+ [2765]=true,
+ [2876]=true,
+ [2881]=true,
+ [2882]=true,
+ [2883]=true,
+ [2884]=true,
+ [2893]=true,
+ [2914]=true,
+ [2915]=true,
+ [3009]=true,
+ [3010]=true,
+ [3170]=true,
+ [3171]=true,
+ [3260]=true,
+ [3286]=true,
+ [3298]=true,
+ [3299]=true,
+ [3426]=true,
+ [3427]=true,
+ [4143]=true,
+ [4144]=true,
+ [4151]=true,
+ [4153]=true,
+ [4157]=true,
+ [4158]=true,
+ [4184]=true,
+ [4185]=true,
+ [4190]=true,
+ [4191]=true,
+ [4192]=true,
+ [4226]=true,
+ [4237]=true,
+ },
+ ["consonant"]={
+ [2325]=true,
+ [2326]=true,
+ [2327]=true,
+ [2328]=true,
+ [2329]=true,
+ [2330]=true,
+ [2331]=true,
+ [2332]=true,
+ [2333]=true,
+ [2334]=true,
+ [2335]=true,
+ [2336]=true,
+ [2337]=true,
+ [2338]=true,
+ [2339]=true,
+ [2340]=true,
+ [2341]=true,
+ [2342]=true,
+ [2343]=true,
+ [2344]=true,
+ [2345]=true,
+ [2346]=true,
+ [2347]=true,
+ [2348]=true,
+ [2349]=true,
+ [2350]=true,
+ [2351]=true,
+ [2352]=true,
+ [2353]=true,
+ [2354]=true,
+ [2355]=true,
+ [2356]=true,
+ [2357]=true,
+ [2358]=true,
+ [2359]=true,
+ [2360]=true,
+ [2361]=true,
+ [2392]=true,
+ [2393]=true,
+ [2394]=true,
+ [2395]=true,
+ [2396]=true,
+ [2397]=true,
+ [2398]=true,
+ [2399]=true,
+ [2424]=true,
+ [2425]=true,
+ [2426]=true,
+ [2453]=true,
+ [2454]=true,
+ [2455]=true,
+ [2456]=true,
+ [2457]=true,
+ [2458]=true,
+ [2459]=true,
+ [2460]=true,
+ [2461]=true,
+ [2462]=true,
+ [2463]=true,
+ [2464]=true,
+ [2465]=true,
+ [2466]=true,
+ [2467]=true,
+ [2468]=true,
+ [2469]=true,
+ [2470]=true,
+ [2471]=true,
+ [2472]=true,
+ [2474]=true,
+ [2475]=true,
+ [2476]=true,
+ [2477]=true,
+ [2478]=true,
+ [2479]=true,
+ [2480]=true,
+ [2482]=true,
+ [2486]=true,
+ [2487]=true,
+ [2488]=true,
+ [2489]=true,
+ [2510]=true,
+ [2524]=true,
+ [2525]=true,
+ [2527]=true,
+ [2581]=true,
+ [2582]=true,
+ [2583]=true,
+ [2584]=true,
+ [2585]=true,
+ [2586]=true,
+ [2587]=true,
+ [2588]=true,
+ [2589]=true,
+ [2590]=true,
+ [2591]=true,
+ [2592]=true,
+ [2593]=true,
+ [2594]=true,
+ [2595]=true,
+ [2596]=true,
+ [2597]=true,
+ [2598]=true,
+ [2599]=true,
+ [2600]=true,
+ [2602]=true,
+ [2603]=true,
+ [2604]=true,
+ [2605]=true,
+ [2606]=true,
+ [2607]=true,
+ [2608]=true,
+ [2610]=true,
+ [2611]=true,
+ [2613]=true,
+ [2614]=true,
+ [2616]=true,
+ [2617]=true,
+ [2649]=true,
+ [2650]=true,
+ [2651]=true,
+ [2652]=true,
+ [2654]=true,
+ [2709]=true,
+ [2710]=true,
+ [2711]=true,
+ [2712]=true,
+ [2713]=true,
+ [2714]=true,
+ [2715]=true,
+ [2716]=true,
+ [2717]=true,
+ [2718]=true,
+ [2719]=true,
+ [2720]=true,
+ [2721]=true,
+ [2722]=true,
+ [2723]=true,
+ [2724]=true,
+ [2725]=true,
+ [2726]=true,
+ [2727]=true,
+ [2728]=true,
+ [2730]=true,
+ [2731]=true,
+ [2732]=true,
+ [2733]=true,
+ [2734]=true,
+ [2735]=true,
+ [2736]=true,
+ [2738]=true,
+ [2739]=true,
+ [2741]=true,
+ [2742]=true,
+ [2743]=true,
+ [2744]=true,
+ [2745]=true,
+ [2837]=true,
+ [2838]=true,
+ [2839]=true,
+ [2840]=true,
+ [2841]=true,
+ [2842]=true,
+ [2843]=true,
+ [2844]=true,
+ [2845]=true,
+ [2846]=true,
+ [2847]=true,
+ [2848]=true,
+ [2849]=true,
+ [2850]=true,
+ [2851]=true,
+ [2852]=true,
+ [2853]=true,
+ [2854]=true,
+ [2855]=true,
+ [2856]=true,
+ [2858]=true,
+ [2859]=true,
+ [2860]=true,
+ [2861]=true,
+ [2862]=true,
+ [2863]=true,
+ [2864]=true,
+ [2866]=true,
+ [2867]=true,
+ [2869]=true,
+ [2870]=true,
+ [2871]=true,
+ [2872]=true,
+ [2873]=true,
+ [2908]=true,
+ [2909]=true,
+ [2929]=true,
+ [2965]=true,
+ [2969]=true,
+ [2970]=true,
+ [2972]=true,
+ [2974]=true,
+ [2975]=true,
+ [2979]=true,
+ [2980]=true,
+ [2984]=true,
+ [2985]=true,
+ [2986]=true,
+ [2990]=true,
+ [2991]=true,
+ [2992]=true,
+ [2993]=true,
+ [2994]=true,
+ [2995]=true,
+ [2996]=true,
+ [2997]=true,
+ [2998]=true,
+ [2999]=true,
+ [3000]=true,
+ [3001]=true,
+ [3093]=true,
+ [3094]=true,
+ [3095]=true,
+ [3096]=true,
+ [3097]=true,
+ [3098]=true,
+ [3099]=true,
+ [3100]=true,
+ [3101]=true,
+ [3102]=true,
+ [3103]=true,
+ [3104]=true,
+ [3105]=true,
+ [3106]=true,
+ [3107]=true,
+ [3108]=true,
+ [3109]=true,
+ [3110]=true,
+ [3111]=true,
+ [3112]=true,
+ [3114]=true,
+ [3115]=true,
+ [3116]=true,
+ [3117]=true,
+ [3118]=true,
+ [3119]=true,
+ [3120]=true,
+ [3121]=true,
+ [3122]=true,
+ [3123]=true,
+ [3124]=true,
+ [3125]=true,
+ [3126]=true,
+ [3127]=true,
+ [3128]=true,
+ [3129]=true,
+ [3133]=true,
+ [3221]=true,
+ [3222]=true,
+ [3223]=true,
+ [3224]=true,
+ [3225]=true,
+ [3226]=true,
+ [3227]=true,
+ [3228]=true,
+ [3229]=true,
+ [3230]=true,
+ [3231]=true,
+ [3232]=true,
+ [3233]=true,
+ [3234]=true,
+ [3235]=true,
+ [3236]=true,
+ [3237]=true,
+ [3238]=true,
+ [3239]=true,
+ [3240]=true,
+ [3242]=true,
+ [3243]=true,
+ [3244]=true,
+ [3245]=true,
+ [3246]=true,
+ [3247]=true,
+ [3248]=true,
+ [3249]=true,
+ [3250]=true,
+ [3251]=true,
+ [3253]=true,
+ [3254]=true,
+ [3255]=true,
+ [3256]=true,
+ [3257]=true,
+ [3294]=true,
+ [3349]=true,
+ [3350]=true,
+ [3351]=true,
+ [3352]=true,
+ [3353]=true,
+ [3354]=true,
+ [3355]=true,
+ [3356]=true,
+ [3357]=true,
+ [3358]=true,
+ [3359]=true,
+ [3360]=true,
+ [3361]=true,
+ [3362]=true,
+ [3363]=true,
+ [3364]=true,
+ [3365]=true,
+ [3366]=true,
+ [3367]=true,
+ [3368]=true,
+ [3369]=true,
+ [3370]=true,
+ [3371]=true,
+ [3372]=true,
+ [3373]=true,
+ [3374]=true,
+ [3375]=true,
+ [3376]=true,
+ [3377]=true,
+ [3378]=true,
+ [3379]=true,
+ [3380]=true,
+ [3381]=true,
+ [3382]=true,
+ [3383]=true,
+ [3384]=true,
+ [3385]=true,
+ [3386]=true,
+ [4096]=true,
+ [4097]=true,
+ [4098]=true,
+ [4099]=true,
+ [4100]=true,
+ [4101]=true,
+ [4102]=true,
+ [4103]=true,
+ [4104]=true,
+ [4105]=true,
+ [4106]=true,
+ [4107]=true,
+ [4108]=true,
+ [4109]=true,
+ [4110]=true,
+ [4111]=true,
+ [4112]=true,
+ [4113]=true,
+ [4114]=true,
+ [4115]=true,
+ [4116]=true,
+ [4117]=true,
+ [4118]=true,
+ [4119]=true,
+ [4120]=true,
+ [4121]=true,
+ [4122]=true,
+ [4123]=true,
+ [4124]=true,
+ [4125]=true,
+ [4126]=true,
+ [4127]=true,
+ [4128]=true,
+ [4155]=true,
+ [4156]=true,
+ [4157]=true,
+ [4158]=true,
+ [4159]=true,
+ [4176]=true,
+ [4177]=true,
+ [4186]=true,
+ [4187]=true,
+ [4188]=true,
+ [4189]=true,
+ [4190]=true,
+ [4191]=true,
+ [4192]=true,
+ [4193]=true,
+ [4197]=true,
+ [4198]=true,
+ [4206]=true,
+ [4207]=true,
+ [4208]=true,
+ [4213]=true,
+ [4214]=true,
+ [4215]=true,
+ [4216]=true,
+ [4217]=true,
+ [4218]=true,
+ [4219]=true,
+ [4220]=true,
+ [4221]=true,
+ [4222]=true,
+ [4223]=true,
+ [4224]=true,
+ [4225]=true,
+ [4226]=true,
+ [4238]=true,
+ [43488]=true,
+ [43489]=true,
+ [43490]=true,
+ [43491]=true,
+ [43492]=true,
+ [43495]=true,
+ [43496]=true,
+ [43497]=true,
+ [43498]=true,
+ [43499]=true,
+ [43500]=true,
+ [43501]=true,
+ [43502]=true,
+ [43503]=true,
+ [43514]=true,
+ [43515]=true,
+ [43516]=true,
+ [43517]=true,
+ [43518]=true,
+ [43616]=true,
+ [43617]=true,
+ [43618]=true,
+ [43619]=true,
+ [43620]=true,
+ [43621]=true,
+ [43622]=true,
+ [43623]=true,
+ [43624]=true,
+ [43625]=true,
+ [43626]=true,
+ [43628]=true,
+ [43629]=true,
+ [43630]=true,
+ [43631]=true,
+ [43633]=true,
+ [43634]=true,
+ [43635]=true,
+ [43636]=true,
+ [43637]=true,
+ [43638]=true,
+ [43642]=true,
+ [43646]=true,
+ [43647]=true,
+ },
+ ["dependent_vowel"]={
+ [2362]=true,
+ [2363]=true,
+ [2366]=true,
+ [2367]=true,
+ [2368]=true,
+ [2369]=true,
+ [2370]=true,
+ [2371]=true,
+ [2372]=true,
+ [2373]=true,
+ [2374]=true,
+ [2375]=true,
+ [2376]=true,
+ [2377]=true,
+ [2378]=true,
+ [2379]=true,
+ [2380]=true,
+ [2382]=true,
+ [2383]=true,
+ [2389]=true,
+ [2390]=true,
+ [2391]=true,
+ [2402]=true,
+ [2403]=true,
+ [2494]=true,
+ [2495]=true,
+ [2497]=true,
+ [2498]=true,
+ [2499]=true,
+ [2500]=true,
+ [2503]=true,
+ [2504]=true,
+ [2507]=true,
+ [2508]=true,
+ [2622]=true,
+ [2623]=true,
+ [2624]=true,
+ [2625]=true,
+ [2626]=true,
+ [2631]=true,
+ [2632]=true,
+ [2635]=true,
+ [2636]=true,
+ [2750]=true,
+ [2751]=true,
+ [2752]=true,
+ [2753]=true,
+ [2754]=true,
+ [2755]=true,
+ [2756]=true,
+ [2757]=true,
+ [2759]=true,
+ [2760]=true,
+ [2761]=true,
+ [2763]=true,
+ [2764]=true,
+ [2878]=true,
+ [2879]=true,
+ [2880]=true,
+ [2881]=true,
+ [2882]=true,
+ [2883]=true,
+ [2884]=true,
+ [2887]=true,
+ [2888]=true,
+ [2891]=true,
+ [2892]=true,
+ [2914]=true,
+ [2915]=true,
+ [3006]=true,
+ [3007]=true,
+ [3008]=true,
+ [3009]=true,
+ [3010]=true,
+ [3014]=true,
+ [3015]=true,
+ [3016]=true,
+ [3018]=true,
+ [3019]=true,
+ [3020]=true,
+ [3134]=true,
+ [3135]=true,
+ [3136]=true,
+ [3137]=true,
+ [3138]=true,
+ [3139]=true,
+ [3140]=true,
+ [3142]=true,
+ [3143]=true,
+ [3144]=true,
+ [3146]=true,
+ [3147]=true,
+ [3148]=true,
+ [3170]=true,
+ [3171]=true,
+ [3262]=true,
+ [3263]=true,
+ [3264]=true,
+ [3265]=true,
+ [3266]=true,
+ [3267]=true,
+ [3268]=true,
+ [3270]=true,
+ [3271]=true,
+ [3272]=true,
+ [3274]=true,
+ [3275]=true,
+ [3276]=true,
+ [3285]=true,
+ [3286]=true,
+ [3298]=true,
+ [3299]=true,
+ [3390]=true,
+ [3391]=true,
+ [3392]=true,
+ [3393]=true,
+ [3394]=true,
+ [3395]=true,
+ [3396]=true,
+ [3398]=true,
+ [3399]=true,
+ [3400]=true,
+ [3402]=true,
+ [3403]=true,
+ [3404]=true,
+ [3415]=true,
+ [3426]=true,
+ [3427]=true,
+ [4139]=true,
+ [4140]=true,
+ [4141]=true,
+ [4142]=true,
+ [4143]=true,
+ [4144]=true,
+ [4145]=true,
+ [4146]=true,
+ [4147]=true,
+ [4148]=true,
+ [4149]=true,
+ [4182]=true,
+ [4183]=true,
+ [4184]=true,
+ [4185]=true,
+ [4194]=true,
+ [4199]=true,
+ [4200]=true,
+ [4209]=true,
+ [4210]=true,
+ [4211]=true,
+ [4212]=true,
+ [4227]=true,
+ [4228]=true,
+ [4229]=true,
+ [4230]=true,
+ [4252]=true,
+ [4253]=true,
+ [43493]=true,
+ },
+ ["halant"]={
+ [2381]=true,
+ [2509]=true,
+ [2637]=true,
+ [2765]=true,
+ [2893]=true,
+ [3021]=true,
+ [3149]=true,
+ [3277]=true,
+ [3405]=true,
+ },
+ ["independent_vowel"]={
+ [2308]=true,
+ [2309]=true,
+ [2310]=true,
+ [2311]=true,
+ [2312]=true,
+ [2313]=true,
+ [2314]=true,
+ [2315]=true,
+ [2316]=true,
+ [2317]=true,
+ [2318]=true,
+ [2319]=true,
+ [2320]=true,
+ [2321]=true,
+ [2322]=true,
+ [2323]=true,
+ [2324]=true,
+ [2400]=true,
+ [2401]=true,
+ [2418]=true,
+ [2419]=true,
+ [2420]=true,
+ [2421]=true,
+ [2422]=true,
+ [2423]=true,
+ [2437]=true,
+ [2438]=true,
+ [2439]=true,
+ [2440]=true,
+ [2441]=true,
+ [2442]=true,
+ [2443]=true,
+ [2444]=true,
+ [2447]=true,
+ [2448]=true,
+ [2451]=true,
+ [2452]=true,
+ [2528]=true,
+ [2529]=true,
+ [2530]=true,
+ [2531]=true,
+ [2565]=true,
+ [2566]=true,
+ [2567]=true,
+ [2568]=true,
+ [2569]=true,
+ [2570]=true,
+ [2575]=true,
+ [2576]=true,
+ [2579]=true,
+ [2580]=true,
+ [2693]=true,
+ [2694]=true,
+ [2695]=true,
+ [2696]=true,
+ [2697]=true,
+ [2698]=true,
+ [2699]=true,
+ [2700]=true,
+ [2701]=true,
+ [2703]=true,
+ [2704]=true,
+ [2705]=true,
+ [2707]=true,
+ [2708]=true,
+ [2784]=true,
+ [2785]=true,
+ [2786]=true,
+ [2787]=true,
+ [2821]=true,
+ [2822]=true,
+ [2823]=true,
+ [2824]=true,
+ [2825]=true,
+ [2826]=true,
+ [2827]=true,
+ [2828]=true,
+ [2831]=true,
+ [2832]=true,
+ [2835]=true,
+ [2836]=true,
+ [2912]=true,
+ [2913]=true,
+ [2949]=true,
+ [2950]=true,
+ [2951]=true,
+ [2952]=true,
+ [2953]=true,
+ [2954]=true,
+ [2958]=true,
+ [2959]=true,
+ [2960]=true,
+ [2962]=true,
+ [2963]=true,
+ [2964]=true,
+ [3077]=true,
+ [3078]=true,
+ [3079]=true,
+ [3080]=true,
+ [3081]=true,
+ [3082]=true,
+ [3083]=true,
+ [3084]=true,
+ [3086]=true,
+ [3087]=true,
+ [3088]=true,
+ [3090]=true,
+ [3091]=true,
+ [3092]=true,
+ [3168]=true,
+ [3169]=true,
+ [3205]=true,
+ [3206]=true,
+ [3207]=true,
+ [3208]=true,
+ [3209]=true,
+ [3210]=true,
+ [3211]=true,
+ [3212]=true,
+ [3214]=true,
+ [3215]=true,
+ [3216]=true,
+ [3218]=true,
+ [3219]=true,
+ [3220]=true,
+ [3296]=true,
+ [3297]=true,
+ [3333]=true,
+ [3334]=true,
+ [3335]=true,
+ [3336]=true,
+ [3337]=true,
+ [3338]=true,
+ [3339]=true,
+ [3340]=true,
+ [3342]=true,
+ [3343]=true,
+ [3344]=true,
+ [3346]=true,
+ [3347]=true,
+ [3348]=true,
+ [3423]=true,
+ [3424]=true,
+ [3425]=true,
+ [4129]=true,
+ [4130]=true,
+ [4131]=true,
+ [4132]=true,
+ [4133]=true,
+ [4134]=true,
+ [4135]=true,
+ [4136]=true,
+ [4137]=true,
+ [4138]=true,
+ [4178]=true,
+ [4179]=true,
+ [4180]=true,
+ [4181]=true,
+ },
+ ["nukta"]={
+ [2364]=true,
+ [2492]=true,
+ [2620]=true,
+ [2748]=true,
+ [2876]=true,
+ [3260]=true,
+ },
+ ["post_mark"]={
+ [2307]=true,
+ [2363]=true,
+ [2366]=true,
+ [2368]=true,
+ [2377]=true,
+ [2378]=true,
+ [2379]=true,
+ [2380]=true,
+ [2383]=true,
+ [2494]=true,
+ [2496]=true,
+ [2622]=true,
+ [2624]=true,
+ [2750]=true,
+ [2752]=true,
+ [2761]=true,
+ [2763]=true,
+ [2764]=true,
+ [2878]=true,
+ [2880]=true,
+ [3006]=true,
+ [3007]=true,
+ [3137]=true,
+ [3138]=true,
+ [3139]=true,
+ [3140]=true,
+ [3262]=true,
+ [3265]=true,
+ [3266]=true,
+ [3267]=true,
+ [3268]=true,
+ [3276]=true,
+ [3285]=true,
+ [3390]=true,
+ [3391]=true,
+ [3392]=true,
+ [3393]=true,
+ [3394]=true,
+ [3395]=true,
+ [3396]=true,
+ [3415]=true,
+ [4139]=true,
+ [4140]=true,
+ [4152]=true,
+ [4155]=true,
+ [4182]=true,
+ [4183]=true,
+ [4194]=true,
+ [4195]=true,
+ [4196]=true,
+ [4199]=true,
+ [4200]=true,
+ [4201]=true,
+ [4202]=true,
+ [4203]=true,
+ [4204]=true,
+ [4205]=true,
+ [4227]=true,
+ [4231]=true,
+ [4232]=true,
+ [4233]=true,
+ [4234]=true,
+ [4235]=true,
+ [4236]=true,
+ [4239]=true,
+ [4250]=true,
+ [4251]=true,
+ [4252]=true,
+ [43643]=true,
+ [43645]=true,
+ },
+ ["pre_mark"]={
+ [2367]=true,
+ [2382]=true,
+ [2495]=true,
+ [2503]=true,
+ [2504]=true,
+ [2623]=true,
+ [2751]=true,
+ [2887]=true,
+ [3014]=true,
+ [3015]=true,
+ [3016]=true,
+ [3398]=true,
+ [3399]=true,
+ [3400]=true,
+ [4145]=true,
+ [4228]=true,
+ },
+ ["ra"]={
+ [2352]=true,
+ [2480]=true,
+ [2544]=true,
+ [2608]=true,
+ [2736]=true,
+ [2864]=true,
+ [2992]=true,
+ [3120]=true,
+ [3248]=true,
+ [3376]=true,
+ },
+ ["stress_tone_mark"]={
+ [2385]=true,
+ [2386]=true,
+ [2387]=true,
+ [2388]=true,
+ [4151]=true,
+ [4195]=true,
+ [4196]=true,
+ [4201]=true,
+ [4202]=true,
+ [4203]=true,
+ [4204]=true,
+ [4205]=true,
+ [4231]=true,
+ [4232]=true,
+ [4233]=true,
+ [4234]=true,
+ [4235]=true,
+ [4236]=true,
+ [4237]=true,
+ [4239]=true,
+ [4250]=true,
+ [4251]=true,
+ [43643]=true,
+ [43644]=true,
+ [43645]=true,
+ },
+ ["twopart_mark"]={
+ [2507]={ 2503,2494 },
+ [2508]={ 2503,2519 },
+ [2888]={ 2887,2902 },
+ [2891]={ 2887,2878 },
+ [2892]={ 2887,2903 },
+ [3018]={ 3014,3006 },
+ [3019]={ 3015,3006 },
+ [3020]={ 3014,3031 },
+ [3144]={ 3142,3158 },
+ [3264]={ 3263,3285 },
+ [3271]={ 3270,3285 },
+ [3272]={ 3270,3286 },
+ [3274]={ 3270,3266 },
+ [3275]={ 3274,3285 },
+ [3402]={ 3398,3390 },
+ [3403]={ 3399,3390 },
+ [3404]={ 3398,3415 },
+ },
+ ["vowel_modifier"]={
+ [2304]=true,
+ [2305]=true,
+ [2306]=true,
+ [2307]=true,
+ [2433]=true,
+ [3330]=true,
+ [3331]=true,
+ [4150]=true,
+ [4152]=true,
+ [4153]=true,
+ [4154]=true,
+ [43232]=true,
+ [43233]=true,
+ [43234]=true,
+ [43235]=true,
+ [43236]=true,
+ [43237]=true,
+ [43238]=true,
+ [43239]=true,
+ [43240]=true,
+ [43241]=true,
+ [43242]=true,
+ [43243]=true,
+ [43244]=true,
+ [43245]=true,
+ [43246]=true,
+ [43247]=true,
+ [43249]=true,
+ },
+}
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “basics-chr”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-ini” 4dee96e1e1474d324dd126bd5d375df8] ---
+
+if not modules then modules={} end modules ['font-ini']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local allocate=utilities.storage.allocate
+local sortedhash=table.sortedhash
+fonts=fonts or {}
+local fonts=fonts
+local identifiers=allocate()
+fonts.hashes=fonts.hashes or { identifiers=identifiers }
+fonts.tables=fonts.tables or {}
+fonts.helpers=fonts.helpers or {}
+fonts.tracers=fonts.tracers or {}
+fonts.specifiers=fonts.specifiers or {}
+fonts.analyzers={}
+fonts.readers={}
+fonts.definers={ methods={} }
+fonts.loggers={ register=function() end }
+if context then
+ font.originaleach=font.each
+ function font.each()
+ return sortedhash(identifiers)
+ end
+ fontloader=nil
+end
+fonts.privateoffsets={
+ textbase=0xF0000,
+ textextrabase=0xFD000,
+ mathextrabase=0xFE000,
+ mathbase=0xFF000,
+ keepnames=false,
+}
+if node and not tex.getfontoffamily then
+ tex.getfontoffamily=node.family_font
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-ini”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “fonts-mis” bc9eb43c27f63ce9d0fff67e104fe1c6] ---
+
+if not modules then modules={} end modules ['luatex-font-mis']={
+ version=1.001,
+ comment="companion to luatex-*.tex",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+if context then
+ os.exit()
+end
+local currentfont=font.current
+local hashes=fonts.hashes
+local identifiers=hashes.identifiers or {}
+local marks=hashes.marks or {}
+hashes.identifiers=identifiers
+hashes.marks=marks
+table.setmetatableindex(marks,function(t,k)
+ if k==true then
+ return marks[currentfont()]
+ else
+ local resources=identifiers[k].resources or {}
+ local marks=resources.marks or {}
+ t[k]=marks
+ return marks
+ end
+end)
+function font.each()
+ return table.sortedhash(fonts.hashes.identifiers)
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “fonts-mis”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-con” 40e3a857b2f31be1959dc6d445aaa9c4] ---
+
+if not modules then modules={} end modules ['font-con']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local next,tostring,tonumber,rawget=next,tostring,tonumber,rawget
+local format,match,lower,gsub,find=string.format,string.match,string.lower,string.gsub,string.find
+local sort,insert,concat=table.sort,table.insert,table.concat
+local sortedkeys,sortedhash,serialize,fastcopy=table.sortedkeys,table.sortedhash,table.serialize,table.fastcopy
+local derivetable=table.derive
+local ioflush=io.flush
+local round=math.round
+local setmetatable,getmetatable,rawget,rawset=setmetatable,getmetatable,rawget,rawset
+local trace_defining=false trackers.register("fonts.defining",function(v) trace_defining=v end)
+local trace_scaling=false trackers.register("fonts.scaling",function(v) trace_scaling=v end)
+local report_defining=logs.reporter("fonts","defining")
+local fonts=fonts
+local constructors=fonts.constructors or {}
+fonts.constructors=constructors
+local handlers=fonts.handlers or {}
+fonts.handlers=handlers
+local allocate=utilities.storage.allocate
+local setmetatableindex=table.setmetatableindex
+constructors.dontembed=allocate()
+constructors.namemode="fullpath"
+constructors.version=1.01
+constructors.cache=containers.define("fonts","constructors",constructors.version,false)
+constructors.privateoffset=fonts.privateoffsets.textbase or 0xF0000
+constructors.cacheintex=true
+constructors.addtounicode=true
+constructors.fixprotrusion=true
+local designsizes=allocate()
+constructors.designsizes=designsizes
+local loadedfonts=allocate()
+constructors.loadedfonts=loadedfonts
+local factors={
+ pt=65536.0,
+ bp=65781.8,
+}
+function constructors.setfactor(f)
+ constructors.factor=factors[f or 'pt'] or factors.pt
+end
+constructors.setfactor()
+function constructors.scaled(scaledpoints,designsize)
+ if scaledpoints<0 then
+ local factor=constructors.factor
+ if designsize then
+ if designsize>factor then
+ return (- scaledpoints/1000)*designsize
+ else
+ return (- scaledpoints/1000)*designsize*factor
+ end
+ else
+ return (- scaledpoints/1000)*10*factor
+ end
+ else
+ return scaledpoints
+ end
+end
+function constructors.getprivate(tfmdata)
+ local properties=tfmdata.properties
+ local private=properties.private
+ properties.private=private+1
+ return private
+end
+function constructors.setmathparameter(tfmdata,name,value)
+ local m=tfmdata.mathparameters
+ local c=tfmdata.MathConstants
+ if m then
+ m[name]=value
+ end
+ if c and c~=m then
+ c[name]=value
+ end
+end
+function constructors.getmathparameter(tfmdata,name)
+ local p=tfmdata.mathparameters or tfmdata.MathConstants
+ if p then
+ return p[name]
+ end
+end
+function constructors.cleanuptable(tfmdata)
+end
+function constructors.calculatescale(tfmdata,scaledpoints)
+ local parameters=tfmdata.parameters
+ if scaledpoints<0 then
+ scaledpoints=(- scaledpoints/1000)*(tfmdata.designsize or parameters.designsize)
+ end
+ return scaledpoints,scaledpoints/(parameters.units or 1000)
+end
+local unscaled={
+ ScriptPercentScaleDown=true,
+ ScriptScriptPercentScaleDown=true,
+ RadicalDegreeBottomRaisePercent=true,
+ NoLimitSupFactor=true,
+ NoLimitSubFactor=true,
+}
+function constructors.assignmathparameters(target,original)
+ local mathparameters=original.mathparameters
+ if mathparameters and next(mathparameters) then
+ local targetparameters=target.parameters
+ local targetproperties=target.properties
+ local targetmathparameters={}
+ local factor=targetproperties.math_is_scaled and 1 or targetparameters.factor
+ for name,value in next,mathparameters do
+ if unscaled[name] then
+ targetmathparameters[name]=value
+ else
+ targetmathparameters[name]=value*factor
+ end
+ end
+ if not targetmathparameters.FractionDelimiterSize then
+ targetmathparameters.FractionDelimiterSize=1.01*targetparameters.size
+ end
+ if not mathparameters.FractionDelimiterDisplayStyleSize then
+ targetmathparameters.FractionDelimiterDisplayStyleSize=2.40*targetparameters.size
+ end
+ target.mathparameters=targetmathparameters
+ end
+end
+function constructors.beforecopyingcharacters(target,original)
+end
+function constructors.aftercopyingcharacters(target,original)
+end
+constructors.sharefonts=false
+constructors.nofsharedfonts=0
+local sharednames={}
+function constructors.trytosharefont(target,tfmdata)
+ if constructors.sharefonts then
+ local characters=target.characters
+ local n=1
+ local t={ target.psname }
+ local u=sortedkeys(characters)
+ for i=1,#u do
+ local k=u[i]
+ n=n+1;t[n]=k
+ n=n+1;t[n]=characters[k].index or k
+ end
+ local h=md5.HEX(concat(t," "))
+ local s=sharednames[h]
+ if s then
+ if trace_defining then
+ report_defining("font %a uses backend resources of font %a",target.fullname,s)
+ end
+ target.fullname=s
+ constructors.nofsharedfonts=constructors.nofsharedfonts+1
+ target.properties.sharedwith=s
+ else
+ sharednames[h]=target.fullname
+ end
+ end
+end
+local synonyms={
+ exheight="x_height",
+ xheight="x_height",
+ ex="x_height",
+ emwidth="quad",
+ em="quad",
+ spacestretch="space_stretch",
+ stretch="space_stretch",
+ spaceshrink="space_shrink",
+ shrink="space_shrink",
+ extraspace="extra_space",
+ xspace="extra_space",
+ slantperpoint="slant",
+}
+function constructors.enhanceparameters(parameters)
+ local mt=getmetatable(parameters)
+ local getter=function(t,k)
+ if not k then
+ return nil
+ end
+ local s=synonyms[k]
+ if s then
+ return rawget(t,s) or (mt and mt[s]) or nil
+ end
+ if k=="spacing" then
+ return {
+ width=t.space,
+ stretch=t.space_stretch,
+ shrink=t.space_shrink,
+ extra=t.extra_space,
+ }
+ end
+ return mt and mt[k] or nil
+ end
+ local setter=function(t,k,v)
+ if not k then
+ return 0
+ end
+ local s=synonyms[k]
+ if s then
+ rawset(t,s,v)
+ elseif k=="spacing" then
+ if type(v)=="table" then
+ rawset(t,"space",v.width or 0)
+ rawset(t,"space_stretch",v.stretch or 0)
+ rawset(t,"space_shrink",v.shrink or 0)
+ rawset(t,"extra_space",v.extra or 0)
+ end
+ else
+ rawset(t,k,v)
+ end
+ end
+ setmetatable(parameters,{
+ __index=getter,
+ __newindex=setter,
+ })
+end
+local function mathkerns(v,vdelta)
+ local k={}
+ for i=1,#v do
+ local entry=v[i]
+ local height=entry.height
+ local kern=entry.kern
+ k[i]={
+ height=height and vdelta*height or 0,
+ kern=kern and vdelta*kern or 0,
+ }
+ end
+ return k
+end
+local psfake=0
+local function fixedpsname(psname,fallback)
+ local usedname=psname
+ if psname and psname~="" then
+ if find(psname," ",1,true) then
+ usedname=gsub(psname,"[%s]+","-")
+ else
+ end
+ elseif not fallback or fallback=="" then
+ psfake=psfake+1
+ psname="fakename-"..psfake
+ else
+ psname=fallback
+ usedname=gsub(psname,"[^a-zA-Z0-9]+","-")
+ end
+ return usedname,psname~=usedname
+end
+function constructors.scale(tfmdata,specification)
+ local target={}
+ if tonumber(specification) then
+ specification={ size=specification }
+ end
+ target.specification=specification
+ local scaledpoints=specification.size
+ local relativeid=specification.relativeid
+ local properties=tfmdata.properties or {}
+ local goodies=tfmdata.goodies or {}
+ local resources=tfmdata.resources or {}
+ local descriptions=tfmdata.descriptions or {}
+ local characters=tfmdata.characters or {}
+ local changed=tfmdata.changed or {}
+ local shared=tfmdata.shared or {}
+ local parameters=tfmdata.parameters or {}
+ local mathparameters=tfmdata.mathparameters or {}
+ local targetcharacters={}
+ local targetdescriptions=derivetable(descriptions)
+ local targetparameters=derivetable(parameters)
+ local targetproperties=derivetable(properties)
+ local targetgoodies=goodies
+ target.characters=targetcharacters
+ target.descriptions=targetdescriptions
+ target.parameters=targetparameters
+ target.properties=targetproperties
+ target.goodies=targetgoodies
+ target.shared=shared
+ target.resources=resources
+ target.unscaled=tfmdata
+ local mathsize=tonumber(specification.mathsize) or 0
+ local textsize=tonumber(specification.textsize) or scaledpoints
+ local forcedsize=tonumber(parameters.mathsize ) or 0
+ local extrafactor=tonumber(specification.factor ) or 1
+ if (mathsize==2 or forcedsize==2) and parameters.scriptpercentage then
+ scaledpoints=parameters.scriptpercentage*textsize/100
+ elseif (mathsize==3 or forcedsize==3) and parameters.scriptscriptpercentage then
+ scaledpoints=parameters.scriptscriptpercentage*textsize/100
+ elseif forcedsize>1000 then
+ scaledpoints=forcedsize
+ else
+ end
+ targetparameters.mathsize=mathsize
+ targetparameters.textsize=textsize
+ targetparameters.forcedsize=forcedsize
+ targetparameters.extrafactor=extrafactor
+ local addtounicode=constructors.addtounicode
+ local tounicode=fonts.mappings.tounicode
+ local unknowncode=tounicode(0xFFFD)
+ local defaultwidth=resources.defaultwidth or 0
+ local defaultheight=resources.defaultheight or 0
+ local defaultdepth=resources.defaultdepth or 0
+ local units=parameters.units or 1000
+ targetproperties.language=properties.language or "dflt"
+ targetproperties.script=properties.script or "dflt"
+ targetproperties.mode=properties.mode or "base"
+ targetproperties.method=properties.method
+ local askedscaledpoints=scaledpoints
+ local scaledpoints,delta=constructors.calculatescale(tfmdata,scaledpoints,nil,specification)
+ local hdelta=delta
+ local vdelta=delta
+ target.designsize=parameters.designsize
+ target.units=units
+ target.units_per_em=units
+ local direction=properties.direction or tfmdata.direction or 0
+ target.direction=direction
+ properties.direction=direction
+ target.size=scaledpoints
+ target.encodingbytes=properties.encodingbytes or 1
+ target.subfont=properties.subfont
+ target.embedding=properties.embedding or "subset"
+ target.tounicode=1
+ target.cidinfo=properties.cidinfo
+ target.format=properties.format
+ target.cache=constructors.cacheintex and "yes" or "renew"
+ local fontname=properties.fontname or tfmdata.fontname
+ local fullname=properties.fullname or tfmdata.fullname
+ local filename=properties.filename or tfmdata.filename
+ local psname=properties.psname or tfmdata.psname
+ local name=properties.name or tfmdata.name
+ local psname,psfixed=fixedpsname(psname,fontname or fullname or file.nameonly(filename))
+ target.fontname=fontname
+ target.fullname=fullname
+ target.filename=filename
+ target.psname=psname
+ target.name=name
+ properties.fontname=fontname
+ properties.fullname=fullname
+ properties.filename=filename
+ properties.psname=psname
+ properties.name=name
+ local expansion=parameters.expansion
+ if expansion then
+ target.stretch=expansion.stretch
+ target.shrink=expansion.shrink
+ target.step=expansion.step
+ end
+ local slantfactor=parameters.slantfactor or 0
+ if slantfactor~=0 then
+ target.slant=slantfactor*1000
+ else
+ target.slant=0
+ end
+ local extendfactor=parameters.extendfactor or 0
+ if extendfactor~=0 and extendfactor~=1 then
+ hdelta=hdelta*extendfactor
+ target.extend=extendfactor*1000
+ else
+ target.extend=1000
+ end
+ local squeezefactor=parameters.squeezefactor or 0
+ if squeezefactor~=0 and squeezefactor~=1 then
+ vdelta=vdelta*squeezefactor
+ target.squeeze=squeezefactor*1000
+ else
+ target.squeeze=1000
+ end
+ local mode=parameters.mode or 0
+ if mode~=0 then
+ target.mode=mode
+ end
+ local width=parameters.width or 0
+ if width~=0 then
+ target.width=width*delta*1000/655360
+ end
+ targetparameters.factor=delta
+ targetparameters.hfactor=hdelta
+ targetparameters.vfactor=vdelta
+ targetparameters.size=scaledpoints
+ targetparameters.units=units
+ targetparameters.scaledpoints=askedscaledpoints
+ targetparameters.mode=mode
+ targetparameters.width=width
+ local isvirtual=properties.virtualized or tfmdata.type=="virtual"
+ local hasquality=parameters.expansion or parameters.protrusion
+ local hasitalics=properties.hasitalics
+ local autoitalicamount=properties.autoitalicamount
+ local stackmath=not properties.nostackmath
+ local haskerns=properties.haskerns or properties.mode=="base"
+ local hasligatures=properties.hasligatures or properties.mode=="base"
+ local realdimensions=properties.realdimensions
+ local writingmode=properties.writingmode or "horizontal"
+ local identity=properties.identity or "horizontal"
+ local vfonts=target.fonts
+ if vfonts and #vfonts>0 then
+ target.fonts=fastcopy(vfonts)
+ elseif isvirtual then
+ target.fonts={ { id=0 } }
+ end
+ if changed and not next(changed) then
+ changed=false
+ end
+ target.type=isvirtual and "virtual" or "real"
+ target.writingmode=writingmode=="vertical" and "vertical" or "horizontal"
+ target.identity=identity=="vertical" and "vertical" or "horizontal"
+ target.postprocessors=tfmdata.postprocessors
+ local targetslant=(parameters.slant or parameters[1] or 0)*factors.pt
+ local targetspace=(parameters.space or parameters[2] or 0)*hdelta
+ local targetspace_stretch=(parameters.space_stretch or parameters[3] or 0)*hdelta
+ local targetspace_shrink=(parameters.space_shrink or parameters[4] or 0)*hdelta
+ local targetx_height=(parameters.x_height or parameters[5] or 0)*vdelta
+ local targetquad=(parameters.quad or parameters[6] or 0)*hdelta
+ local targetextra_space=(parameters.extra_space or parameters[7] or 0)*hdelta
+ targetparameters.slant=targetslant
+ targetparameters.space=targetspace
+ targetparameters.space_stretch=targetspace_stretch
+ targetparameters.space_shrink=targetspace_shrink
+ targetparameters.x_height=targetx_height
+ targetparameters.quad=targetquad
+ targetparameters.extra_space=targetextra_space
+ local ascender=parameters.ascender
+ if ascender then
+ targetparameters.ascender=delta*ascender
+ end
+ local descender=parameters.descender
+ if descender then
+ targetparameters.descender=delta*descender
+ end
+ constructors.enhanceparameters(targetparameters)
+ local protrusionfactor=constructors.fixprotrusion and ((targetquad~=0 and 1000/targetquad) or 1) or 1
+ local scaledwidth=defaultwidth*hdelta
+ local scaledheight=defaultheight*vdelta
+ local scaleddepth=defaultdepth*vdelta
+ local hasmath=(properties.hasmath or next(mathparameters)) and true
+ if hasmath then
+ constructors.assignmathparameters(target,tfmdata)
+ properties.hasmath=true
+ target.nomath=false
+ target.MathConstants=target.mathparameters
+ else
+ properties.hasmath=false
+ target.nomath=true
+ target.mathparameters=nil
+ end
+ if hasmath then
+ local mathitalics=properties.mathitalics
+ if mathitalics==false then
+ if trace_defining then
+ report_defining("%s italics %s for font %a, fullname %a, filename %a","math",hasitalics and "ignored" or "disabled",name,fullname,filename)
+ end
+ hasitalics=false
+ autoitalicamount=false
+ end
+ else
+ local textitalics=properties.textitalics
+ if textitalics==false then
+ if trace_defining then
+ report_defining("%s italics %s for font %a, fullname %a, filename %a","text",hasitalics and "ignored" or "disabled",name,fullname,filename)
+ end
+ hasitalics=false
+ autoitalicamount=false
+ end
+ end
+ if trace_defining then
+ report_defining("defining tfm, name %a, fullname %a, filename %a, %spsname %a, hscale %a, vscale %a, math %a, italics %a",
+ name,fullname,filename,psfixed and "(fixed) " or "",psname,hdelta,vdelta,
+ hasmath and "enabled" or "disabled",hasitalics and "enabled" or "disabled")
+ end
+ constructors.beforecopyingcharacters(target,tfmdata)
+ local sharedkerns={}
+ for unicode,character in next,characters do
+ local chr,description,index
+ if changed then
+ local c=changed[unicode]
+ if c and c~=unicode then
+ if c then
+ description=descriptions[c] or descriptions[unicode] or character
+ character=characters[c] or character
+ index=description.index or c
+ else
+ description=descriptions[unicode] or character
+ index=description.index or unicode
+ end
+ else
+ description=descriptions[unicode] or character
+ index=description.index or unicode
+ end
+ else
+ description=descriptions[unicode] or character
+ index=description.index or unicode
+ end
+ local width=description.width
+ local height=description.height
+ local depth=description.depth
+ local isunicode=description.unicode
+ if realdimensions then
+ if not height or height==0 then
+ local bb=description.boundingbox
+ local ht=bb[4]
+ if ht~=0 then
+ height=ht
+ end
+ if not depth or depth==0 then
+ local dp=-bb[2]
+ if dp~=0 then
+ depth=dp
+ end
+ end
+ elseif not depth or depth==0 then
+ local dp=-description.boundingbox[2]
+ if dp~=0 then
+ depth=dp
+ end
+ end
+ end
+ if width then width=hdelta*width else width=scaledwidth end
+ if height then height=vdelta*height else height=scaledheight end
+ if depth and depth~=0 then
+ depth=delta*depth
+ if isunicode then
+ chr={
+ index=index,
+ height=height,
+ depth=depth,
+ width=width,
+ unicode=isunicode,
+ }
+ else
+ chr={
+ index=index,
+ height=height,
+ depth=depth,
+ width=width,
+ }
+ end
+ else
+ if isunicode then
+ chr={
+ index=index,
+ height=height,
+ width=width,
+ unicode=isunicode,
+ }
+ else
+ chr={
+ index=index,
+ height=height,
+ width=width,
+ }
+ end
+ end
+ if addtounicode then
+ chr.tounicode=isunicode and tounicode(isunicode) or unknowncode
+ end
+ if hasquality then
+ local ve=character.expansion_factor
+ if ve then
+ chr.expansion_factor=ve*1000
+ end
+ local vl=character.left_protruding
+ if vl then
+ chr.left_protruding=protrusionfactor*width*vl
+ end
+ local vr=character.right_protruding
+ if vr then
+ chr.right_protruding=protrusionfactor*width*vr
+ end
+ end
+ if hasmath then
+ local vn=character.next
+ if vn then
+ chr.next=vn
+ else
+ local vv=character.vert_variants
+ if vv then
+ local t={}
+ for i=1,#vv do
+ local vvi=vv[i]
+ local s=vvi["start"] or 0
+ local e=vvi["end"] or 0
+ local a=vvi["advance"] or 0
+ t[i]={
+ ["start"]=s==0 and 0 or s*vdelta,
+ ["end"]=e==0 and 0 or e*vdelta,
+ ["advance"]=a==0 and 0 or a*vdelta,
+ ["extender"]=vvi["extender"],
+ ["glyph"]=vvi["glyph"],
+ }
+ end
+ chr.vert_variants=t
+ else
+ local hv=character.horiz_variants
+ if hv then
+ local t={}
+ for i=1,#hv do
+ local hvi=hv[i]
+ local s=hvi["start"] or 0
+ local e=hvi["end"] or 0
+ local a=hvi["advance"] or 0
+ t[i]={
+ ["start"]=s==0 and 0 or s*hdelta,
+ ["end"]=e==0 and 0 or e*hdelta,
+ ["advance"]=a==0 and 0 or a*hdelta,
+ ["extender"]=hvi["extender"],
+ ["glyph"]=hvi["glyph"],
+ }
+ end
+ chr.horiz_variants=t
+ end
+ end
+ end
+ local vi=character.vert_italic
+ if vi and vi~=0 then
+ chr.vert_italic=vi*hdelta
+ end
+ local va=character.accent
+ if va then
+ chr.top_accent=vdelta*va
+ end
+ if stackmath then
+ local mk=character.mathkerns
+ if mk then
+ local tr=mk.topright
+ local tl=mk.topleft
+ local br=mk.bottomright
+ local bl=mk.bottomleft
+ chr.mathkern={
+ top_right=tr and mathkerns(tr,vdelta) or nil,
+ top_left=tl and mathkerns(tl,vdelta) or nil,
+ bottom_right=br and mathkerns(br,vdelta) or nil,
+ bottom_left=bl and mathkerns(bl,vdelta) or nil,
+ }
+ end
+ end
+ if hasitalics then
+ local vi=character.italic
+ if vi and vi~=0 then
+ chr.italic=vi*hdelta
+ end
+ end
+ elseif autoitalicamount then
+ local vi=description.italic
+ if not vi then
+ local bb=description.boundingbox
+ if bb then
+ local vi=bb[3]-description.width+autoitalicamount
+ if vi>0 then
+ chr.italic=vi*hdelta
+ end
+ else
+ end
+ elseif vi~=0 then
+ chr.italic=vi*hdelta
+ end
+ elseif hasitalics then
+ local vi=character.italic
+ if vi and vi~=0 then
+ chr.italic=vi*hdelta
+ end
+ end
+ if haskerns then
+ local vk=character.kerns
+ if vk then
+ local s=sharedkerns[vk]
+ if not s then
+ s={}
+ for k,v in next,vk do s[k]=v*hdelta end
+ sharedkerns[vk]=s
+ end
+ chr.kerns=s
+ end
+ end
+ if hasligatures then
+ local vl=character.ligatures
+ if vl then
+ if true then
+ chr.ligatures=vl
+ else
+ local tt={}
+ for i,l in next,vl do
+ tt[i]=l
+ end
+ chr.ligatures=tt
+ end
+ end
+ end
+ if isvirtual then
+ local vc=character.commands
+ if vc then
+ local ok=false
+ for i=1,#vc do
+ local key=vc[i][1]
+ if key=="right" or key=="down" or key=="rule" then
+ ok=true
+ break
+ end
+ end
+ if ok then
+ local tt={}
+ for i=1,#vc do
+ local ivc=vc[i]
+ local key=ivc[1]
+ if key=="right" then
+ tt[i]={ key,ivc[2]*hdelta }
+ elseif key=="down" then
+ tt[i]={ key,ivc[2]*vdelta }
+ elseif key=="rule" then
+ tt[i]={ key,ivc[2]*vdelta,ivc[3]*hdelta }
+ else
+ tt[i]=ivc
+ end
+ end
+ chr.commands=tt
+ else
+ chr.commands=vc
+ end
+ end
+ end
+ targetcharacters[unicode]=chr
+ end
+ properties.setitalics=hasitalics
+ constructors.aftercopyingcharacters(target,tfmdata)
+ constructors.trytosharefont(target,tfmdata)
+ local vfonts=target.fonts
+ if isvirtual or target.type=="virtual" or properties.virtualized then
+ properties.virtualized=true
+ target.type="virtual"
+ if not vfonts or #vfonts==0 then
+ target.fonts={ { id=0 } }
+ end
+ elseif vfonts then
+ properties.virtualized=true
+ target.type="virtual"
+ if #vfonts==0 then
+ target.fonts={ { id=0 } }
+ end
+ end
+ return target
+end
+function constructors.finalize(tfmdata)
+ if tfmdata.properties and tfmdata.properties.finalized then
+ return
+ end
+ if not tfmdata.characters then
+ return nil
+ end
+ if not tfmdata.goodies then
+ tfmdata.goodies={}
+ end
+ local parameters=tfmdata.parameters
+ if not parameters then
+ return nil
+ end
+ if not parameters.expansion then
+ parameters.expansion={
+ stretch=tfmdata.stretch or 0,
+ shrink=tfmdata.shrink or 0,
+ step=tfmdata.step or 0,
+ }
+ end
+ if not parameters.size then
+ parameters.size=tfmdata.size
+ end
+ if not parameters.mode then
+ parameters.mode=0
+ end
+ if not parameters.width then
+ parameters.width=0
+ end
+ if not parameters.slantfactor then
+ parameters.slantfactor=(tfmdata.slant or 0)/1000
+ end
+ if not parameters.extendfactor then
+ parameters.extendfactor=(tfmdata.extend or 1000)/1000
+ end
+ if not parameters.squeezefactor then
+ parameters.squeezefactor=(tfmdata.squeeze or 1000)/1000
+ end
+ local designsize=parameters.designsize
+ if designsize then
+ parameters.minsize=tfmdata.minsize or designsize
+ parameters.maxsize=tfmdata.maxsize or designsize
+ else
+ designsize=factors.pt*10
+ parameters.designsize=designsize
+ parameters.minsize=designsize
+ parameters.maxsize=designsize
+ end
+ parameters.minsize=tfmdata.minsize or parameters.designsize
+ parameters.maxsize=tfmdata.maxsize or parameters.designsize
+ if not parameters.units then
+ parameters.units=tfmdata.units or tfmdata.units_per_em or 1000
+ end
+ if not tfmdata.descriptions then
+ local descriptions={}
+ setmetatableindex(descriptions,function(t,k) local v={} t[k]=v return v end)
+ tfmdata.descriptions=descriptions
+ end
+ local properties=tfmdata.properties
+ if not properties then
+ properties={}
+ tfmdata.properties=properties
+ end
+ if not properties.virtualized then
+ properties.virtualized=tfmdata.type=="virtual"
+ end
+ properties.fontname=properties.fontname or tfmdata.fontname
+ properties.filename=properties.filename or tfmdata.filename
+ properties.fullname=properties.fullname or tfmdata.fullname
+ properties.name=properties.name or tfmdata.name
+ properties.psname=properties.psname or tfmdata.psname
+ properties.encodingbytes=tfmdata.encodingbytes or 1
+ properties.subfont=tfmdata.subfont or nil
+ properties.embedding=tfmdata.embedding or "subset"
+ properties.tounicode=tfmdata.tounicode or 1
+ properties.cidinfo=tfmdata.cidinfo or nil
+ properties.format=tfmdata.format or "type1"
+ properties.direction=tfmdata.direction or 0
+ properties.writingmode=tfmdata.writingmode or "horizontal"
+ properties.identity=tfmdata.identity or "horizontal"
+ properties.usedbitmap=tfmdata.usedbitmap
+ if not tfmdata.resources then
+ tfmdata.resources={}
+ end
+ if not tfmdata.shared then
+ tfmdata.shared={}
+ end
+ if not properties.hasmath then
+ properties.hasmath=not tfmdata.nomath
+ end
+ tfmdata.MathConstants=nil
+ tfmdata.postprocessors=nil
+ tfmdata.fontname=nil
+ tfmdata.filename=nil
+ tfmdata.fullname=nil
+ tfmdata.name=nil
+ tfmdata.psname=nil
+ tfmdata.encodingbytes=nil
+ tfmdata.subfont=nil
+ tfmdata.embedding=nil
+ tfmdata.tounicode=nil
+ tfmdata.cidinfo=nil
+ tfmdata.format=nil
+ tfmdata.direction=nil
+ tfmdata.type=nil
+ tfmdata.nomath=nil
+ tfmdata.designsize=nil
+ tfmdata.size=nil
+ tfmdata.stretch=nil
+ tfmdata.shrink=nil
+ tfmdata.step=nil
+ tfmdata.slant=nil
+ tfmdata.extend=nil
+ tfmdata.squeeze=nil
+ tfmdata.mode=nil
+ tfmdata.width=nil
+ tfmdata.units=nil
+ tfmdata.units_per_em=nil
+ tfmdata.cache=nil
+ properties.finalized=true
+ return tfmdata
+end
+local hashmethods={}
+constructors.hashmethods=hashmethods
+function constructors.hashfeatures(specification)
+ local features=specification.features
+ if features then
+ local t,n={},0
+ for category,list in sortedhash(features) do
+ if next(list) then
+ local hasher=hashmethods[category]
+ if hasher then
+ local hash=hasher(list)
+ if hash then
+ n=n+1
+ t[n]=category..":"..hash
+ end
+ end
+ end
+ end
+ if n>0 then
+ return concat(t," & ")
+ end
+ end
+ return "unknown"
+end
+hashmethods.normal=function(list)
+ local s={}
+ local n=0
+ for k,v in next,list do
+ if not k then
+ elseif k=="number" or k=="features" then
+ else
+ n=n+1
+ if type(v)=="table" then
+ local t={}
+ local m=0
+ for k,v in next,v do
+ m=m+1
+ t[m]=k..'='..tostring(v)
+ end
+ sort(t)
+ s[n]=k..'={'..concat(t,",").."}"
+ else
+ s[n]=k..'='..tostring(v)
+ end
+ end
+ end
+ if n>0 then
+ sort(s)
+ return concat(s,"+")
+ end
+end
+function constructors.hashinstance(specification,force)
+ local hash=specification.hash
+ local size=specification.size
+ local fallbacks=specification.fallbacks
+ if force or not hash then
+ hash=constructors.hashfeatures(specification)
+ specification.hash=hash
+ end
+ if size<1000 and designsizes[hash] then
+ size=round(constructors.scaled(size,designsizes[hash]))
+ else
+ size=round(size)
+ end
+ specification.size=size
+ if fallbacks then
+ return hash..' @ '..size..' @ '..fallbacks
+ else
+ return hash..' @ '..size
+ end
+end
+function constructors.setname(tfmdata,specification)
+ if constructors.namemode=="specification" then
+ local specname=specification.specification
+ if specname then
+ tfmdata.properties.name=specname
+ if trace_defining then
+ report_otf("overloaded fontname %a",specname)
+ end
+ end
+ end
+end
+function constructors.checkedfilename(data)
+ local foundfilename=data.foundfilename
+ if not foundfilename then
+ local askedfilename=data.filename or ""
+ if askedfilename~="" then
+ askedfilename=resolvers.resolve(askedfilename)
+ foundfilename=resolvers.findbinfile(askedfilename,"") or ""
+ if foundfilename=="" then
+ report_defining("source file %a is not found",askedfilename)
+ foundfilename=resolvers.findbinfile(file.basename(askedfilename),"") or ""
+ if foundfilename~="" then
+ report_defining("using source file %a due to cache mismatch",foundfilename)
+ end
+ end
+ end
+ data.foundfilename=foundfilename
+ end
+ return foundfilename
+end
+local formats=allocate()
+fonts.formats=formats
+setmetatableindex(formats,function(t,k)
+ local l=lower(k)
+ if rawget(t,k) then
+ t[k]=l
+ return l
+ end
+ return rawget(t,file.suffix(l))
+end)
+do
+ local function setindeed(mode,source,target,group,name,position)
+ local action=source[mode]
+ if not action then
+ return
+ end
+ local t=target[mode]
+ if not t then
+ report_defining("fatal error in setting feature %a, group %a, mode %a",name,group,mode)
+ os.exit()
+ elseif position then
+ insert(t,position,{ name=name,action=action })
+ else
+ for i=1,#t do
+ local ti=t[i]
+ if ti.name==name then
+ ti.action=action
+ return
+ end
+ end
+ insert(t,{ name=name,action=action })
+ end
+ end
+ local function set(group,name,target,source)
+ target=target[group]
+ if not target then
+ report_defining("fatal target error in setting feature %a, group %a",name,group)
+ os.exit()
+ end
+ local source=source[group]
+ if not source then
+ report_defining("fatal source error in setting feature %a, group %a",name,group)
+ os.exit()
+ end
+ local position=source.position
+ setindeed("node",source,target,group,name,position)
+ setindeed("base",source,target,group,name,position)
+ setindeed("plug",source,target,group,name,position)
+ end
+ local function register(where,specification)
+ local name=specification.name
+ if name and name~="" then
+ local default=specification.default
+ local description=specification.description
+ local initializers=specification.initializers
+ local processors=specification.processors
+ local manipulators=specification.manipulators
+ local modechecker=specification.modechecker
+ if default then
+ where.defaults[name]=default
+ end
+ if description and description~="" then
+ where.descriptions[name]=description
+ end
+ if initializers then
+ set('initializers',name,where,specification)
+ end
+ if processors then
+ set('processors',name,where,specification)
+ end
+ if manipulators then
+ set('manipulators',name,where,specification)
+ end
+ if modechecker then
+ where.modechecker=modechecker
+ end
+ end
+ end
+ constructors.registerfeature=register
+ function constructors.getfeatureaction(what,where,mode,name)
+ what=handlers[what].features
+ if what then
+ where=what[where]
+ if where then
+ mode=where[mode]
+ if mode then
+ for i=1,#mode do
+ local m=mode[i]
+ if m.name==name then
+ return m.action
+ end
+ end
+ end
+ end
+ end
+ end
+ local newfeatures={}
+ constructors.newfeatures=newfeatures
+ constructors.features=newfeatures
+ local function setnewfeatures(what)
+ local handler=handlers[what]
+ local features=handler.features
+ if not features then
+ local tables=handler.tables
+ local statistics=handler.statistics
+ features=allocate {
+ defaults={},
+ descriptions=tables and tables.features or {},
+ used=statistics and statistics.usedfeatures or {},
+ initializers={ base={},node={},plug={} },
+ processors={ base={},node={},plug={} },
+ manipulators={ base={},node={},plug={} },
+ }
+ features.register=function(specification) return register(features,specification) end
+ handler.features=features
+ end
+ return features
+ end
+ setmetatable(newfeatures,{
+ __call=function(t,k) local v=t[k] return v end,
+ __index=function(t,k) local v=setnewfeatures(k) t[k]=v return v end,
+ })
+end
+do
+ local newhandler={}
+ constructors.handlers=newhandler
+ constructors.newhandler=newhandler
+ local function setnewhandler(what)
+ local handler=handlers[what]
+ if not handler then
+ handler={}
+ handlers[what]=handler
+ end
+ return handler
+ end
+ setmetatable(newhandler,{
+ __call=function(t,k) local v=t[k] return v end,
+ __index=function(t,k) local v=setnewhandler(k) t[k]=v return v end,
+ })
+end
+do
+ local newenhancer={}
+ constructors.enhancers=newenhancer
+ constructors.newenhancer=newenhancer
+ local function setnewenhancer(format)
+ local handler=handlers[format]
+ local enhancers=handler.enhancers
+ if not enhancers then
+ local actions=allocate()
+ local before=allocate()
+ local after=allocate()
+ local order=allocate()
+ local known={}
+ local nofsteps=0
+ local patches={ before=before,after=after }
+ local trace=false
+ local report=logs.reporter("fonts",format.." enhancing")
+ trackers.register(format..".loading",function(v) trace=v end)
+ local function enhance(name,data,filename,raw)
+ local enhancer=actions[name]
+ if enhancer then
+ if trace then
+ report("apply enhancement %a to file %a",name,filename)
+ ioflush()
+ end
+ enhancer(data,filename,raw)
+ else
+ end
+ end
+ local function apply(data,filename,raw)
+ local basename=file.basename(lower(filename))
+ if trace then
+ report("%s enhancing file %a","start",filename)
+ end
+ ioflush()
+ for e=1,nofsteps do
+ local enhancer=order[e]
+ local b=before[enhancer]
+ if b then
+ for pattern,action in next,b do
+ if find(basename,pattern) then
+ action(data,filename,raw)
+ end
+ end
+ end
+ enhance(enhancer,data,filename,raw)
+ local a=after[enhancer]
+ if a then
+ for pattern,action in next,a do
+ if find(basename,pattern) then
+ action(data,filename,raw)
+ end
+ end
+ end
+ ioflush()
+ end
+ if trace then
+ report("%s enhancing file %a","stop",filename)
+ end
+ ioflush()
+ end
+ local function register(what,action)
+ if action then
+ if actions[what] then
+ else
+ nofsteps=nofsteps+1
+ order[nofsteps]=what
+ known[what]=nofsteps
+ end
+ actions[what]=action
+ else
+ report("bad enhancer %a",what)
+ end
+ end
+ local function patch(what,where,pattern,action)
+ local pw=patches[what]
+ if pw then
+ local ww=pw[where]
+ if ww then
+ ww[pattern]=action
+ else
+ pw[where]={ [pattern]=action }
+ if not known[where] then
+ nofsteps=nofsteps+1
+ order[nofsteps]=where
+ known[where]=nofsteps
+ end
+ end
+ end
+ end
+ enhancers={
+ register=register,
+ apply=apply,
+ patch=patch,
+ report=report,
+ patches={
+ register=patch,
+ report=report,
+ },
+ }
+ handler.enhancers=enhancers
+ end
+ return enhancers
+ end
+ setmetatable(newenhancer,{
+ __call=function(t,k) local v=t[k] return v end,
+ __index=function(t,k) local v=setnewenhancer(k) t[k]=v return v end,
+ })
+end
+function constructors.checkedfeatures(what,features)
+ local defaults=handlers[what].features.defaults
+ if features and next(features) then
+ features=fastcopy(features)
+ for key,value in next,defaults do
+ if features[key]==nil then
+ features[key]=value
+ end
+ end
+ return features
+ else
+ return fastcopy(defaults)
+ end
+end
+function constructors.initializefeatures(what,tfmdata,features,trace,report)
+ if features and next(features) then
+ local properties=tfmdata.properties or {}
+ local whathandler=handlers[what]
+ local whatfeatures=whathandler.features
+ local whatmodechecker=whatfeatures.modechecker
+ local mode=properties.mode or (whatmodechecker and whatmodechecker(tfmdata,features,features.mode)) or features.mode or "base"
+ properties.mode=mode
+ features.mode=mode
+ local done={}
+ while true do
+ local redo=false
+ local initializers=whatfeatures.initializers[mode]
+ if initializers then
+ for i=1,#initializers do
+ local step=initializers[i]
+ local feature=step.name
+ local value=features[feature]
+ if not value then
+ elseif done[feature] then
+ else
+ local action=step.action
+ if trace then
+ report("initializing feature %a to %a for mode %a for font %a",feature,
+ value,mode,tfmdata.properties.fullname)
+ end
+ action(tfmdata,value,features)
+ if mode~=properties.mode or mode~=features.mode then
+ if whatmodechecker then
+ properties.mode=whatmodechecker(tfmdata,features,properties.mode)
+ features.mode=properties.mode
+ end
+ if mode~=properties.mode then
+ mode=properties.mode
+ redo=true
+ end
+ end
+ done[feature]=true
+ end
+ if redo then
+ break
+ end
+ end
+ if not redo then
+ break
+ end
+ else
+ break
+ end
+ end
+ properties.mode=mode
+ return true
+ else
+ return false
+ end
+end
+function constructors.collectprocessors(what,tfmdata,features,trace,report)
+ local processes={}
+ local nofprocesses=0
+ if features and next(features) then
+ local properties=tfmdata.properties
+ local whathandler=handlers[what]
+ local whatfeatures=whathandler.features
+ local whatprocessors=whatfeatures.processors
+ local mode=properties.mode
+ local processors=whatprocessors[mode]
+ if processors then
+ for i=1,#processors do
+ local step=processors[i]
+ local feature=step.name
+ if features[feature] then
+ local action=step.action
+ if trace then
+ report("installing feature processor %a for mode %a for font %a",feature,mode,tfmdata.properties.fullname)
+ end
+ if action then
+ nofprocesses=nofprocesses+1
+ processes[nofprocesses]=action
+ end
+ end
+ end
+ elseif trace then
+ report("no feature processors for mode %a for font %a",mode,properties.fullname)
+ end
+ end
+ return processes
+end
+function constructors.applymanipulators(what,tfmdata,features,trace,report)
+ if features and next(features) then
+ local properties=tfmdata.properties
+ local whathandler=handlers[what]
+ local whatfeatures=whathandler.features
+ local whatmanipulators=whatfeatures.manipulators
+ local mode=properties.mode
+ local manipulators=whatmanipulators[mode]
+ if manipulators then
+ for i=1,#manipulators do
+ local step=manipulators[i]
+ local feature=step.name
+ local value=features[feature]
+ if value then
+ local action=step.action
+ if trace then
+ report("applying feature manipulator %a for mode %a for font %a",feature,mode,properties.fullname)
+ end
+ if action then
+ action(tfmdata,feature,value)
+ end
+ end
+ end
+ end
+ end
+end
+function constructors.addcoreunicodes(unicodes)
+ if not unicodes then
+ unicodes={}
+ end
+ unicodes.space=0x0020
+ unicodes.hyphen=0x002D
+ unicodes.zwj=0x200D
+ unicodes.zwnj=0x200C
+ return unicodes
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-con”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “fonts-enc” 3e71a54297e8f85a1ac438bb0f20dd79] ---
+
+if not modules then modules={} end modules ['luatex-font-enc']={
+ version=1.001,
+ comment="companion to luatex-*.tex",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+if context then
+ os.exit()
+end
+local fonts=fonts
+local encodings={}
+fonts.encodings=encodings
+encodings.agl={}
+encodings.known={}
+setmetatable(encodings.agl,{ __index=function(t,k)
+ if k=="unicodes" then
+ logs.report("fonts","loading (extended) adobe glyph list")
+ local unicodes=dofile(resolvers.findfile("font-age.lua"))
+ encodings.agl={ unicodes=unicodes }
+ return unicodes
+ else
+ return nil
+ end
+end })
+encodings.cache=containers.define("fonts","enc",encodings.version,true)
+function encodings.load(filename)
+ local name=file.removesuffix(filename)
+ local data=containers.read(encodings.cache,name)
+ if data then
+ return data
+ end
+ local vector,tag,hash,unicodes={},"",{},{}
+ local foundname=resolvers.findfile(filename,'enc')
+ if foundname and foundname~="" then
+ local ok,encoding,size=resolvers.loadbinfile(foundname)
+ if ok and encoding then
+ encoding=string.gsub(encoding,"%%(.-)\n","")
+ local unicoding=encodings.agl.unicodes
+ local tag,vec=string.match(encoding,"/(%w+)%s*%[(.*)%]%s*def")
+ local i=0
+ for ch in string.gmatch(vec,"/([%a%d%.]+)") do
+ if ch~=".notdef" then
+ vector[i]=ch
+ if not hash[ch] then
+ hash[ch]=i
+ else
+ end
+ local u=unicoding[ch]
+ if u then
+ unicodes[u]=i
+ end
+ end
+ i=i+1
+ end
+ end
+ end
+ local data={
+ name=name,
+ tag=tag,
+ vector=vector,
+ hash=hash,
+ unicodes=unicodes
+ }
+ return containers.write(encodings.cache,name,data)
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “fonts-enc”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-cid” 4d87988efa86020a14708ee03c23415f] ---
+
+if not modules then modules={} end modules ['font-cid']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local format,match,lower=string.format,string.match,string.lower
+local tonumber=tonumber
+local P,S,R,C,V,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.V,lpeg.match
+local fonts,logs,trackers=fonts,logs,trackers
+local trace_loading=false trackers.register("otf.loading",function(v) trace_loading=v end)
+local report_otf=logs.reporter("fonts","otf loading")
+local cid={}
+fonts.cid=cid
+local cidmap={}
+local cidmax=10
+local number=C(R("09","af","AF")^1)
+local space=S(" \n\r\t")
+local spaces=space^0
+local period=P(".")
+local periods=period*period
+local name=P("/")*C((1-space)^1)
+local unicodes,names={},{}
+local function do_one(a,b)
+ unicodes[tonumber(a)]=tonumber(b,16)
+end
+local function do_range(a,b,c)
+ c=tonumber(c,16)
+ for i=tonumber(a),tonumber(b) do
+ unicodes[i]=c
+ c=c+1
+ end
+end
+local function do_name(a,b)
+ names[tonumber(a)]=b
+end
+local grammar=P { "start",
+ start=number*spaces*number*V("series"),
+ series=(spaces*(V("one")+V("range")+V("named")))^1,
+ one=(number*spaces*number)/do_one,
+ range=(number*periods*number*spaces*number)/do_range,
+ named=(number*spaces*name)/do_name
+}
+local function loadcidfile(filename)
+ local data=io.loaddata(filename)
+ if data then
+ unicodes,names={},{}
+ lpegmatch(grammar,data)
+ local supplement,registry,ordering=match(filename,"^(.-)%-(.-)%-()%.(.-)$")
+ return {
+ supplement=supplement,
+ registry=registry,
+ ordering=ordering,
+ filename=filename,
+ unicodes=unicodes,
+ names=names,
+ }
+ end
+end
+cid.loadfile=loadcidfile
+local template="%s-%s-%s.cidmap"
+local function locate(registry,ordering,supplement)
+ local filename=format(template,registry,ordering,supplement)
+ local hashname=lower(filename)
+ local found=cidmap[hashname]
+ if not found then
+ if trace_loading then
+ report_otf("checking cidmap, registry %a, ordering %a, supplement %a, filename %a",registry,ordering,supplement,filename)
+ end
+ local fullname=resolvers.findfile(filename,'cid') or ""
+ if fullname~="" then
+ found=loadcidfile(fullname)
+ if found then
+ if trace_loading then
+ report_otf("using cidmap file %a",filename)
+ end
+ cidmap[hashname]=found
+ found.usedname=file.basename(filename)
+ end
+ end
+ end
+ return found
+end
+function cid.getmap(specification)
+ if not specification then
+ report_otf("invalid cidinfo specification, table expected")
+ return
+ end
+ local registry=specification.registry
+ local ordering=specification.ordering
+ local supplement=specification.supplement
+ local filename=format(registry,ordering,supplement)
+ local lowername=lower(filename)
+ local found=cidmap[lowername]
+ if found then
+ return found
+ end
+ if ordering=="Identity" then
+ local found={
+ supplement=supplement,
+ registry=registry,
+ ordering=ordering,
+ filename=filename,
+ unicodes={},
+ names={},
+ }
+ cidmap[lowername]=found
+ return found
+ end
+ if trace_loading then
+ report_otf("cidmap needed, registry %a, ordering %a, supplement %a",registry,ordering,supplement)
+ end
+ found=locate(registry,ordering,supplement)
+ if not found then
+ local supnum=tonumber(supplement)
+ local cidnum=nil
+ if supnum0 then
+ for s=supnum-1,0,-1 do
+ local c=locate(registry,ordering,s)
+ if c then
+ found,cidnum=c,s
+ break
+ end
+ end
+ end
+ registry=lower(registry)
+ ordering=lower(ordering)
+ if found and cidnum>0 then
+ for s=0,cidnum-1 do
+ local filename=format(template,registry,ordering,s)
+ if not cidmap[filename] then
+ cidmap[filename]=found
+ end
+ end
+ end
+ end
+ return found
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-cid”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-map” 51d0362c19d2d0f621e5cb750410a809] ---
+
+if not modules then modules={} end modules ['font-map']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local tonumber,next,type=tonumber,next,type
+local match,format,find,concat,gsub,lower=string.match,string.format,string.find,table.concat,string.gsub,string.lower
+local P,R,S,C,Ct,Cc,lpegmatch=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Ct,lpeg.Cc,lpeg.match
+local formatters=string.formatters
+local sortedhash,sortedkeys=table.sortedhash,table.sortedkeys
+local idiv=number.idiv
+local trace_loading=false trackers.register("fonts.loading",function(v) trace_loading=v end)
+local trace_mapping=false trackers.register("fonts.mapping",function(v) trace_mapping=v end)
+local report_fonts=logs.reporter("fonts","loading")
+local force_ligatures=false directives.register("fonts.mapping.forceligatures",function(v) force_ligatures=v end)
+local fonts=fonts or {}
+local mappings=fonts.mappings or {}
+fonts.mappings=mappings
+local allocate=utilities.storage.allocate
+local hex=R("AF","af","09")
+local hexfour=(hex*hex*hex^-2)/function(s) return tonumber(s,16) end
+local hexsix=(hex*hex*hex^-4)/function(s) return tonumber(s,16) end
+local dec=(R("09")^1)/tonumber
+local period=P(".")
+local unicode=(P("uni")+P("UNI"))*(hexfour*(period+P(-1))*Cc(false)+Ct(hexfour^1)*Cc(true))
+local ucode=(P("u")+P("U") )*(hexsix*(period+P(-1))*Cc(false)+Ct(hexsix^1)*Cc(true))
+local index=P("index")*dec*Cc(false)
+local parser=unicode+ucode+index
+local parsers={}
+local function makenameparser(str)
+ if not str or str=="" then
+ return parser
+ else
+ local p=parsers[str]
+ if not p then
+ p=P(str)*period*dec*Cc(false)
+ parsers[str]=p
+ end
+ return p
+ end
+end
+local f_single=formatters["%04X"]
+local f_double=formatters["%04X%04X"]
+local s_unknown="FFFD"
+local function tounicode16(unicode)
+ if unicode<0xD7FF or (unicode>0xDFFF and unicode<=0xFFFF) then
+ return f_single(unicode)
+ elseif unicode>=0x00E000 and unicode<=0x00F8FF then
+ return s_unknown
+ elseif unicode>=0x0F0000 and unicode<=0x0FFFFF then
+ return s_unknown
+ elseif unicode>=0x100000 and unicode<=0x10FFFF then
+ return s_unknown
+ elseif unicode>=0x00D800 and unicode<=0x00DFFF then
+ return s_unknown
+ else
+ unicode=unicode-0x10000
+ return f_double(idiv(k,0x400)+0xD800,unicode%0x400+0xDC00)
+ end
+end
+local function tounicode16sequence(unicodes)
+ local t={}
+ for l=1,#unicodes do
+ local u=unicodes[l]
+ if u<0xD7FF or (u>0xDFFF and u<=0xFFFF) then
+ t[l]=f_single(u)
+ elseif unicode>=0x00E000 and unicode<=0x00F8FF then
+ t[l]=s_unknown
+ elseif unicode>=0x0F0000 and unicode<=0x0FFFFF then
+ t[l]=s_unknown
+ elseif unicode>=0x100000 and unicode<=0x10FFFF then
+ t[l]=s_unknown
+ elseif unicode>=0x00D7FF and unicode<=0x00DFFF then
+ t[l]=s_unknown
+ else
+ u=u-0x10000
+ t[l]=f_double(idiv(k,0x400)+0xD800,u%0x400+0xDC00)
+ end
+ end
+ return concat(t)
+end
+local hash={}
+local conc={}
+table.setmetatableindex(hash,function(t,k)
+ if k<0xD7FF or (k>0xDFFF and k<=0xFFFF) then
+ v=f_single(k)
+ else
+ local k=k-0x10000
+ v=f_double(idiv(k,0x400)+0xD800,k%0x400+0xDC00)
+ end
+ t[k]=v
+ return v
+end)
+local function tounicode(k)
+ if type(k)=="table" then
+ local n=#k
+ for l=1,n do
+ conc[l]=hash[k[l]]
+ end
+ return concat(conc,"",1,n)
+ elseif k>=0x00E000 and k<=0x00F8FF then
+ return s_unknown
+ elseif k>=0x0F0000 and k<=0x0FFFFF then
+ return s_unknown
+ elseif k>=0x100000 and k<=0x10FFFF then
+ return s_unknown
+ elseif k>=0x00D7FF and k<=0x00DFFF then
+ return s_unknown
+ else
+ return hash[k]
+ end
+end
+local function fromunicode16(str)
+ if #str==4 then
+ return tonumber(str,16)
+ else
+ local l,r=match(str,"(....)(....)")
+ return 0x10000+(tonumber(l,16)-0xD800)*0x400+tonumber(r,16)-0xDC00
+ end
+end
+mappings.makenameparser=makenameparser
+mappings.tounicode=tounicode
+mappings.tounicode16=tounicode16
+mappings.tounicode16sequence=tounicode16sequence
+mappings.fromunicode16=fromunicode16
+local ligseparator=P("_")
+local varseparator=P(".")
+local namesplitter=Ct(C((1-ligseparator-varseparator)^1)*(ligseparator*C((1-ligseparator-varseparator)^1))^0)
+do
+ local overloads={
+ IJ={ name="I_J",unicode={ 0x49,0x4A },mess=0x0132 },
+ ij={ name="i_j",unicode={ 0x69,0x6A },mess=0x0133 },
+ ff={ name="f_f",unicode={ 0x66,0x66 },mess=0xFB00 },
+ fi={ name="f_i",unicode={ 0x66,0x69 },mess=0xFB01 },
+ fl={ name="f_l",unicode={ 0x66,0x6C },mess=0xFB02 },
+ ffi={ name="f_f_i",unicode={ 0x66,0x66,0x69 },mess=0xFB03 },
+ ffl={ name="f_f_l",unicode={ 0x66,0x66,0x6C },mess=0xFB04 },
+ fj={ name="f_j",unicode={ 0x66,0x6A } },
+ fk={ name="f_k",unicode={ 0x66,0x6B } },
+ }
+ local o=allocate {}
+ for k,v in next,overloads do
+ local name=v.name
+ local mess=v.mess
+ if name then
+ o[name]=v
+ end
+ if mess then
+ o[mess]=v
+ end
+ o[k]=v
+ end
+ mappings.overloads=o
+end
+function mappings.addtounicode(data,filename,checklookups,forceligatures)
+ local resources=data.resources
+ local unicodes=resources.unicodes
+ if not unicodes then
+ if trace_mapping then
+ report_fonts("no unicode list, quitting tounicode for %a",filename)
+ end
+ return
+ end
+ local properties=data.properties
+ local descriptions=data.descriptions
+ local overloads=mappings.overloads
+ unicodes['space']=unicodes['space'] or 32
+ unicodes['hyphen']=unicodes['hyphen'] or 45
+ unicodes['zwj']=unicodes['zwj'] or 0x200D
+ unicodes['zwnj']=unicodes['zwnj'] or 0x200C
+ local private=fonts.constructors and fonts.constructors.privateoffset or 0xF0000
+ local unicodevector=fonts.encodings.agl.unicodes or {}
+ local contextvector=fonts.encodings.agl.ctxcodes or {}
+ local missing={}
+ local nofmissing=0
+ local oparser=nil
+ local cidnames=nil
+ local cidcodes=nil
+ local cidinfo=properties.cidinfo
+ local usedmap=cidinfo and fonts.cid.getmap(cidinfo)
+ local uparser=makenameparser()
+ if usedmap then
+ oparser=usedmap and makenameparser(cidinfo.ordering)
+ cidnames=usedmap.names
+ cidcodes=usedmap.unicodes
+ end
+ local ns=0
+ local nl=0
+ local dlist=sortedkeys(descriptions)
+ for i=1,#dlist do
+ local du=dlist[i]
+ local glyph=descriptions[du]
+ local name=glyph.name
+ if name then
+ local overload=overloads[name] or overloads[du]
+ if overload then
+ glyph.unicode=overload.unicode
+ else
+ local gu=glyph.unicode
+ if not gu or gu==-1 or du>=private or (du>=0xE000 and du<=0xF8FF) or du==0xFFFE or du==0xFFFF then
+ local unicode=unicodevector[name] or contextvector[name]
+ if unicode then
+ glyph.unicode=unicode
+ ns=ns+1
+ end
+ if (not unicode) and usedmap then
+ local foundindex=lpegmatch(oparser,name)
+ if foundindex then
+ unicode=cidcodes[foundindex]
+ if unicode then
+ glyph.unicode=unicode
+ ns=ns+1
+ else
+ local reference=cidnames[foundindex]
+ if reference then
+ local foundindex=lpegmatch(oparser,reference)
+ if foundindex then
+ unicode=cidcodes[foundindex]
+ if unicode then
+ glyph.unicode=unicode
+ ns=ns+1
+ end
+ end
+ if not unicode or unicode=="" then
+ local foundcodes,multiple=lpegmatch(uparser,reference)
+ if foundcodes then
+ glyph.unicode=foundcodes
+ if multiple then
+ nl=nl+1
+ unicode=true
+ else
+ ns=ns+1
+ unicode=foundcodes
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if not unicode or unicode=="" then
+ local split=lpegmatch(namesplitter,name)
+ local nsplit=split and #split or 0
+ if nsplit==0 then
+ elseif nsplit==1 then
+ local base=split[1]
+ local u=unicodes[base] or unicodevector[base] or contextvector[name]
+ if not u then
+ elseif type(u)=="table" then
+ if u[1]=private then
+ break
+ end
+ n=n+1
+ t[n]=u[1]
+ else
+ if u>=private then
+ break
+ end
+ n=n+1
+ t[n]=u
+ end
+ end
+ if n>0 then
+ if n==1 then
+ unicode=t[1]
+ else
+ unicode=t
+ end
+ glyph.unicode=unicode
+ end
+ end
+ nl=nl+1
+ end
+ if not unicode or unicode=="" then
+ local foundcodes,multiple=lpegmatch(uparser,name)
+ if foundcodes then
+ glyph.unicode=foundcodes
+ if multiple then
+ nl=nl+1
+ unicode=true
+ else
+ ns=ns+1
+ unicode=foundcodes
+ end
+ end
+ end
+ local r=overloads[unicode]
+ if r then
+ unicode=r.unicode
+ glyph.unicode=unicode
+ end
+ if not unicode then
+ missing[du]=true
+ nofmissing=nofmissing+1
+ end
+ else
+ end
+ end
+ else
+ local overload=overloads[du]
+ if overload then
+ glyph.unicode=overload.unicode
+ elseif not glyph.unicode then
+ missing[du]=true
+ nofmissing=nofmissing+1
+ end
+ end
+ end
+ if type(checklookups)=="function" then
+ checklookups(data,missing,nofmissing)
+ end
+ local unicoded=0
+ local collected=fonts.handlers.otf.readers.getcomponents(data)
+ local function resolve(glyph,u)
+ local n=#u
+ for i=1,n do
+ if u[i]>private then
+ n=0
+ break
+ end
+ end
+ if n>0 then
+ if n>1 then
+ glyph.unicode=u
+ else
+ glyph.unicode=u[1]
+ end
+ unicoded=unicoded+1
+ end
+ end
+ if not collected then
+ elseif forceligatures or force_ligatures then
+ for i=1,#dlist do
+ local du=dlist[i]
+ if du>=private or (du>=0xE000 and du<=0xF8FF) then
+ local u=collected[du]
+ if u then
+ resolve(descriptions[du],u)
+ end
+ end
+ end
+ else
+ for i=1,#dlist do
+ local du=dlist[i]
+ if du>=private or (du>=0xE000 and du<=0xF8FF) then
+ local glyph=descriptions[du]
+ if glyph.class=="ligature" and not glyph.unicode then
+ local u=collected[du]
+ if u then
+ resolve(glyph,u)
+ end
+ end
+ end
+ end
+ end
+ if trace_mapping and unicoded>0 then
+ report_fonts("%n ligature tounicode mappings deduced from gsub ligature features",unicoded)
+ end
+ if trace_mapping then
+ for i=1,#dlist do
+ local du=dlist[i]
+ local glyph=descriptions[du]
+ local name=glyph.name or "-"
+ local index=glyph.index or 0
+ local unicode=glyph.unicode
+ if unicode then
+ if type(unicode)=="table" then
+ local unicodes={}
+ for i=1,#unicode do
+ unicodes[i]=formatters("%U",unicode[i])
+ end
+ report_fonts("internal slot %U, name %a, unicode %U, tounicode % t",index,name,du,unicodes)
+ else
+ report_fonts("internal slot %U, name %a, unicode %U, tounicode %U",index,name,du,unicode)
+ end
+ else
+ report_fonts("internal slot %U, name %a, unicode %U",index,name,du)
+ end
+ end
+ end
+ if trace_loading and (ns>0 or nl>0) then
+ report_fonts("%s tounicode entries added, ligatures %s",nl+ns,ns)
+ end
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-map”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-vfc” 94937140f2c909e9c831ba021f1ab303] ---
+
+if not modules then modules={} end modules ['font-vfc']={
+ version=1.001,
+ comment="companion to font-ini.mkiv and hand-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local select,type=select,type
+local insert=table.insert
+local fonts=fonts
+local helpers=fonts.helpers
+local setmetatableindex=table.setmetatableindex
+local makeweak=table.makeweak
+local push={ "push" }
+local pop={ "pop" }
+local dummy={ "comment" }
+function helpers.prependcommands(commands,...)
+ insert(commands,1,push)
+ for i=select("#",...),1,-1 do
+ local s=(select(i,...))
+ if s then
+ insert(commands,1,s)
+ end
+ end
+ insert(commands,pop)
+ return commands
+end
+function helpers.appendcommands(commands,...)
+ insert(commands,1,push)
+ insert(commands,pop)
+ for i=1,select("#",...) do
+ local s=(select(i,...))
+ if s then
+ insert(commands,s)
+ end
+ end
+ return commands
+end
+function helpers.prependcommandtable(commands,t)
+ insert(commands,1,push)
+ for i=#t,1,-1 do
+ local s=t[i]
+ if s then
+ insert(commands,1,s)
+ end
+ end
+ insert(commands,pop)
+ return commands
+end
+function helpers.appendcommandtable(commands,t)
+ insert(commands,1,push)
+ insert(commands,pop)
+ for i=1,#t do
+ local s=t[i]
+ if s then
+ insert(commands,s)
+ end
+ end
+ return commands
+end
+local char=setmetatableindex(function(t,k)
+ local v={ "slot",0,k }
+ t[k]=v
+ return v
+end)
+local right=setmetatableindex(function(t,k)
+ local v={ "right",k }
+ t[k]=v
+ return v
+end)
+local left=setmetatableindex(function(t,k)
+ local v={ "right",-k }
+ t[k]=v
+ return v
+end)
+local down=setmetatableindex(function(t,k)
+ local v={ "down",k }
+ t[k]=v
+ return v
+end)
+local up=setmetatableindex(function(t,k)
+ local v={ "down",-k }
+ t[k]=v
+ return v
+end)
+helpers.commands=utilities.storage.allocate {
+ char=char,
+ right=right,
+ left=left,
+ down=down,
+ up=up,
+ push=push,
+ pop=pop,
+ dummy=dummy,
+}
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-vfc”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-otr” d96724dcb40c673ac294df7044a39925] ---
+
+if not modules then modules={} end modules ['font-otr']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local next,type,tonumber,rawget=next,type,tonumber,rawget
+local byte,lower,char,gsub=string.byte,string.lower,string.char,string.gsub
+local fullstrip=string.fullstrip
+local floor,round=math.floor,math.round
+local P,R,S,C,Cs,Cc,Ct,Carg,Cmt=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.Ct,lpeg.Carg,lpeg.Cmt
+local lpegmatch=lpeg.match
+local rshift=bit32.rshift
+local setmetatableindex=table.setmetatableindex
+local sortedkeys=table.sortedkeys
+local sortedhash=table.sortedhash
+local stripstring=string.nospaces
+local utf16_to_utf8_be=utf.utf16_to_utf8_be
+local report=logs.reporter("otf reader")
+local report_cmap=logs.reporter("otf reader","cmap")
+local trace_cmap=false trackers.register("otf.cmap",function(v) trace_cmap=v end)
+local trace_cmap_details=false trackers.register("otf.cmap.details",function(v) trace_cmap_details=v end)
+fonts=fonts or {}
+local handlers=fonts.handlers or {}
+fonts.handlers=handlers
+local otf=handlers.otf or {}
+handlers.otf=otf
+local readers=otf.readers or {}
+otf.readers=readers
+local streamreader=utilities.files
+local streamwriter=utilities.files
+readers.streamreader=streamreader
+readers.streamwriter=streamwriter
+local openfile=streamreader.open
+local closefile=streamreader.close
+local setposition=streamreader.setposition
+local skipshort=streamreader.skipshort
+local readbytes=streamreader.readbytes
+local readstring=streamreader.readstring
+local readbyte=streamreader.readcardinal1
+local readushort=streamreader.readcardinal2
+local readuint=streamreader.readcardinal3
+local readulong=streamreader.readcardinal4
+local readshort=streamreader.readinteger2
+local readlong=streamreader.readinteger4
+local readfixed=streamreader.readfixed4
+local read2dot14=streamreader.read2dot14
+local readfword=readshort
+local readufword=readushort
+local readoffset=readushort
+local readcardinaltable=streamreader.readcardinaltable
+local readintegertable=streamreader.readintegertable
+function streamreader.readtag(f)
+ return lower(stripstring(readstring(f,4)))
+end
+local short=2
+local ushort=2
+local ulong=4
+directives.register("fonts.streamreader",function()
+ streamreader=utilities.streams
+ openfile=streamreader.open
+ closefile=streamreader.close
+ setposition=streamreader.setposition
+ skipshort=streamreader.skipshort
+ readbytes=streamreader.readbytes
+ readstring=streamreader.readstring
+ readbyte=streamreader.readcardinal1
+ readushort=streamreader.readcardinal2
+ readuint=streamreader.readcardinal3
+ readulong=streamreader.readcardinal4
+ readshort=streamreader.readinteger2
+ readlong=streamreader.readinteger4
+ readfixed=streamreader.readfixed4
+ read2dot14=streamreader.read2dot14
+ readfword=readshort
+ readufword=readushort
+ readoffset=readushort
+ readcardinaltable=streamreader.readcardinaltable
+ readintegertable=streamreader.readintegertable
+ function streamreader.readtag(f)
+ return lower(stripstring(readstring(f,4)))
+ end
+end)
+local function readlongdatetime(f)
+ local a,b,c,d,e,f,g,h=readbytes(f,8)
+ return 0x100000000*d+0x1000000*e+0x10000*f+0x100*g+h
+end
+local tableversion=0.004
+readers.tableversion=tableversion
+local privateoffset=fonts.constructors and fonts.constructors.privateoffset or 0xF0000
+local reservednames={ [0]="copyright",
+ "family",
+ "subfamily",
+ "uniqueid",
+ "fullname",
+ "version",
+ "postscriptname",
+ "trademark",
+ "manufacturer",
+ "designer",
+ "description",
+ "vendorurl",
+ "designerurl",
+ "license",
+ "licenseurl",
+ "reserved",
+ "typographicfamily",
+ "typographicsubfamily",
+ "compatiblefullname",
+ "sampletext",
+ "cidfindfontname",
+ "wwsfamily",
+ "wwssubfamily",
+ "lightbackgroundpalette",
+ "darkbackgroundpalette",
+ "variationspostscriptnameprefix",
+}
+local platforms={ [0]="unicode",
+ "macintosh",
+ "iso",
+ "windows",
+ "custom",
+}
+local encodings={
+ unicode={ [0]="unicode 1.0 semantics",
+ "unicode 1.1 semantics",
+ "iso/iec 10646",
+ "unicode 2.0 bmp",
+ "unicode 2.0 full",
+ "unicode variation sequences",
+ "unicode full repertoire",
+ },
+ macintosh={ [0]="roman","japanese","chinese (traditional)","korean","arabic","hebrew","greek","russian",
+ "rsymbol","devanagari","gurmukhi","gujarati","oriya","bengali","tamil","telugu","kannada",
+ "malayalam","sinhalese","burmese","khmer","thai","laotian","georgian","armenian",
+ "chinese (simplified)","tibetan","mongolian","geez","slavic","vietnamese","sindhi",
+ "uninterpreted",
+ },
+ iso={ [0]="7-bit ascii",
+ "iso 10646",
+ "iso 8859-1",
+ },
+ windows={ [0]="symbol",
+ "unicode bmp",
+ "shiftjis",
+ "prc",
+ "big5",
+ "wansung",
+ "johab",
+ "reserved 7",
+ "reserved 8",
+ "reserved 9",
+ "unicode ucs-4",
+ },
+ custom={
+ }
+}
+local decoders={
+ unicode={},
+ macintosh={},
+ iso={},
+ windows={
+ ["unicode semantics"]=utf16_to_utf8_be,
+ ["unicode bmp"]=utf16_to_utf8_be,
+ ["unicode full"]=utf16_to_utf8_be,
+ ["unicode 1.0 semantics"]=utf16_to_utf8_be,
+ ["unicode 1.1 semantics"]=utf16_to_utf8_be,
+ ["unicode 2.0 bmp"]=utf16_to_utf8_be,
+ ["unicode 2.0 full"]=utf16_to_utf8_be,
+ ["unicode variation sequences"]=utf16_to_utf8_be,
+ ["unicode full repertoire"]=utf16_to_utf8_be,
+ },
+ custom={},
+}
+local languages={
+ unicode={
+ [ 0]="english",
+ },
+ macintosh={
+ [ 0]="english",
+ },
+ iso={},
+ windows={
+ [0x0409]="english - united states",
+ },
+ custom={},
+}
+local standardromanencoding={ [0]=
+ "notdef",".null","nonmarkingreturn","space","exclam","quotedbl",
+ "numbersign","dollar","percent","ampersand","quotesingle","parenleft",
+ "parenright","asterisk","plus","comma","hyphen","period","slash",
+ "zero","one","two","three","four","five","six","seven","eight",
+ "nine","colon","semicolon","less","equal","greater","question","at",
+ "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O",
+ "P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft",
+ "backslash","bracketright","asciicircum","underscore","grave","a","b",
+ "c","d","e","f","g","h","i","j","k","l","m","n","o","p","q",
+ "r","s","t","u","v","w","x","y","z","braceleft","bar",
+ "braceright","asciitilde","Adieresis","Aring","Ccedilla","Eacute",
+ "Ntilde","Odieresis","Udieresis","aacute","agrave","acircumflex",
+ "adieresis","atilde","aring","ccedilla","eacute","egrave",
+ "ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis",
+ "ntilde","oacute","ograve","ocircumflex","odieresis","otilde","uacute",
+ "ugrave","ucircumflex","udieresis","dagger","degree","cent","sterling",
+ "section","bullet","paragraph","germandbls","registered","copyright",
+ "trademark","acute","dieresis","notequal","AE","Oslash","infinity",
+ "plusminus","lessequal","greaterequal","yen","mu","partialdiff",
+ "summation","product","pi","integral","ordfeminine","ordmasculine",
+ "Omega","ae","oslash","questiondown","exclamdown","logicalnot",
+ "radical","florin","approxequal","Delta","guillemotleft",
+ "guillemotright","ellipsis","nonbreakingspace","Agrave","Atilde",
+ "Otilde","OE","oe","endash","emdash","quotedblleft","quotedblright",
+ "quoteleft","quoteright","divide","lozenge","ydieresis","Ydieresis",
+ "fraction","currency","guilsinglleft","guilsinglright","fi","fl",
+ "daggerdbl","periodcentered","quotesinglbase","quotedblbase",
+ "perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave",
+ "Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex",
+ "apple","Ograve","Uacute","Ucircumflex","Ugrave","dotlessi",
+ "circumflex","tilde","macron","breve","dotaccent","ring","cedilla",
+ "hungarumlaut","ogonek","caron","Lslash","lslash","Scaron","scaron",
+ "Zcaron","zcaron","brokenbar","Eth","eth","Yacute","yacute","Thorn",
+ "thorn","minus","multiply","onesuperior","twosuperior","threesuperior",
+ "onehalf","onequarter","threequarters","franc","Gbreve","gbreve",
+ "Idotaccent","Scedilla","scedilla","Cacute","cacute","Ccaron","ccaron",
+ "dcroat",
+}
+local weights={
+ [100]="thin",
+ [200]="extralight",
+ [300]="light",
+ [400]="normal",
+ [500]="medium",
+ [600]="semibold",
+ [700]="bold",
+ [800]="extrabold",
+ [900]="black",
+}
+local widths={
+ [1]="ultracondensed",
+ [2]="extracondensed",
+ [3]="condensed",
+ [4]="semicondensed",
+ [5]="normal",
+ [6]="semiexpanded",
+ [7]="expanded",
+ [8]="extraexpanded",
+ [9]="ultraexpanded",
+}
+setmetatableindex(weights,function(t,k)
+ local r=floor((k+50)/100)*100
+ local v=(r>900 and "black") or rawget(t,r) or "normal"
+ return v
+end)
+setmetatableindex(widths,function(t,k)
+ return "normal"
+end)
+local panoseweights={
+ [ 0]="normal",
+ [ 1]="normal",
+ [ 2]="verylight",
+ [ 3]="light",
+ [ 4]="thin",
+ [ 5]="book",
+ [ 6]="medium",
+ [ 7]="demi",
+ [ 8]="bold",
+ [ 9]="heavy",
+ [10]="black",
+}
+local panosewidths={
+ [ 0]="normal",
+ [ 1]="normal",
+ [ 2]="normal",
+ [ 3]="normal",
+ [ 4]="normal",
+ [ 5]="expanded",
+ [ 6]="condensed",
+ [ 7]="veryexpanded",
+ [ 8]="verycondensed",
+ [ 9]="monospaced",
+}
+local helpers={}
+readers.helpers=helpers
+local function gotodatatable(f,fontdata,tag,criterium)
+ if criterium and f then
+ local tables=fontdata.tables
+ if tables then
+ local datatable=tables[tag]
+ if datatable then
+ local tableoffset=datatable.offset
+ setposition(f,tableoffset)
+ return tableoffset
+ end
+ else
+ report("no tables")
+ end
+ end
+end
+local function reportskippedtable(f,fontdata,tag,criterium)
+ if criterium and f then
+ local tables=fontdata.tables
+ if tables then
+ local datatable=tables[tag]
+ if datatable then
+ report("loading of table %a skipped",tag)
+ end
+ else
+ report("no tables")
+ end
+ end
+end
+local function setvariabledata(fontdata,tag,data)
+ local variabledata=fontdata.variabledata
+ if variabledata then
+ variabledata[tag]=data
+ else
+ fontdata.variabledata={ [tag]=data }
+ end
+end
+helpers.gotodatatable=gotodatatable
+helpers.setvariabledata=setvariabledata
+helpers.reportskippedtable=reportskippedtable
+local platformnames={
+ postscriptname=true,
+ fullname=true,
+ family=true,
+ subfamily=true,
+ typographicfamily=true,
+ typographicsubfamily=true,
+ compatiblefullname=true,
+}
+local platformextras={
+ uniqueid=true,
+ version=true,
+ copyright=true,
+ license=true,
+ licenseurl=true,
+ manufacturer=true,
+ vendorurl=true,
+}
+function readers.name(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"name",true)
+ if tableoffset then
+ local format=readushort(f)
+ local nofnames=readushort(f)
+ local offset=readushort(f)
+ local start=tableoffset+offset
+ local namelists={
+ unicode={},
+ windows={},
+ macintosh={},
+ }
+ for i=1,nofnames do
+ local platform=platforms[readushort(f)]
+ if platform then
+ local namelist=namelists[platform]
+ if namelist then
+ local encoding=readushort(f)
+ local language=readushort(f)
+ local encodings=encodings[platform]
+ local languages=languages[platform]
+ if encodings and languages then
+ local encoding=encodings[encoding]
+ local language=languages[language]
+ if encoding and language then
+ local index=readushort(f)
+ local name=reservednames[index]
+ namelist[#namelist+1]={
+ platform=platform,
+ encoding=encoding,
+ language=language,
+ name=name,
+ index=index,
+ length=readushort(f),
+ offset=start+readushort(f),
+ }
+ else
+ skipshort(f,3)
+ end
+ else
+ skipshort(f,3)
+ end
+ else
+ skipshort(f,5)
+ end
+ else
+ skipshort(f,5)
+ end
+ end
+ local names={}
+ local done={}
+ local extras={}
+ local function decoded(platform,encoding,content)
+ local decoder=decoders[platform]
+ if decoder then
+ decoder=decoder[encoding]
+ end
+ if decoder then
+ return decoder(content)
+ else
+ return content
+ end
+ end
+ local function filter(platform,e,l)
+ local namelist=namelists[platform]
+ for i=1,#namelist do
+ local name=namelist[i]
+ local nametag=name.name
+ local index=name.index
+ if not done[nametag or i] then
+ local encoding=name.encoding
+ local language=name.language
+ if (not e or encoding==e) and (not l or language==l) then
+ setposition(f,name.offset)
+ local content=decoded(platform,encoding,readstring(f,name.length))
+ if nametag then
+ names[nametag]={
+ content=content,
+ platform=platform,
+ encoding=encoding,
+ language=language,
+ }
+ end
+ extras[index]=content
+ done[nametag or i]=true
+ end
+ end
+ end
+ end
+ filter("windows","unicode bmp","english - united states")
+ filter("macintosh","roman","english")
+ filter("windows")
+ filter("macintosh")
+ filter("unicode")
+ fontdata.names=names
+ fontdata.extras=extras
+ if specification.platformnames then
+ local collected={}
+ local platformextras=specification.platformextras and platformextras
+ for platform,namelist in next,namelists do
+ local filtered=false
+ for i=1,#namelist do
+ local entry=namelist[i]
+ local name=entry.name
+ if platformnames[name] or (platformextras and platformextras[name]) then
+ setposition(f,entry.offset)
+ local content=decoded(platform,entry.encoding,readstring(f,entry.length))
+ if filtered then
+ filtered[name]=content
+ else
+ filtered={ [name]=content }
+ end
+ end
+ end
+ if filtered then
+ collected[platform]=filtered
+ end
+ end
+ fontdata.platformnames=collected
+ end
+ else
+ fontdata.names={}
+ end
+end
+local validutf=lpeg.patterns.validutf8
+local function getname(fontdata,key)
+ local names=fontdata.names
+ if names then
+ local value=names[key]
+ if value then
+ local content=value.content
+ return lpegmatch(validutf,content) and content or nil
+ end
+ end
+end
+readers["os/2"]=function(f,fontdata)
+ local tableoffset=gotodatatable(f,fontdata,"os/2",true)
+ if tableoffset then
+ local version=readushort(f)
+ local windowsmetrics={
+ version=version,
+ averagewidth=readshort(f),
+ weightclass=readushort(f),
+ widthclass=readushort(f),
+ fstype=readushort(f),
+ subscriptxsize=readshort(f),
+ subscriptysize=readshort(f),
+ subscriptxoffset=readshort(f),
+ subscriptyoffset=readshort(f),
+ superscriptxsize=readshort(f),
+ superscriptysize=readshort(f),
+ superscriptxoffset=readshort(f),
+ superscriptyoffset=readshort(f),
+ strikeoutsize=readshort(f),
+ strikeoutpos=readshort(f),
+ familyclass=readshort(f),
+ panose={ readbytes(f,10) },
+ unicoderanges={ readulong(f),readulong(f),readulong(f),readulong(f) },
+ vendor=readstring(f,4),
+ fsselection=readushort(f),
+ firstcharindex=readushort(f),
+ lastcharindex=readushort(f),
+ typoascender=readshort(f),
+ typodescender=readshort(f),
+ typolinegap=readshort(f),
+ winascent=readushort(f),
+ windescent=readushort(f),
+ }
+ if version>=1 then
+ windowsmetrics.codepageranges={ readulong(f),readulong(f) }
+ end
+ if version>=2 then
+ windowsmetrics.xheight=readshort(f)
+ windowsmetrics.capheight=readshort(f)
+ windowsmetrics.defaultchar=readushort(f)
+ windowsmetrics.breakchar=readushort(f)
+ end
+ windowsmetrics.weight=windowsmetrics.weightclass and weights[windowsmetrics.weightclass]
+ windowsmetrics.width=windowsmetrics.widthclass and widths [windowsmetrics.widthclass]
+ windowsmetrics.panoseweight=panoseweights[windowsmetrics.panose[3]]
+ windowsmetrics.panosewidth=panosewidths [windowsmetrics.panose[4]]
+ fontdata.windowsmetrics=windowsmetrics
+ else
+ fontdata.windowsmetrics={}
+ end
+end
+readers.head=function(f,fontdata)
+ local tableoffset=gotodatatable(f,fontdata,"head",true)
+ if tableoffset then
+ local version=readulong(f)
+ local fontversion=readulong(f)
+ local fontheader={
+ version=version,
+ fontversion=number.to16dot16(fontversion),
+ fontversionnumber=fontversion,
+ checksum=readushort(f)*0x10000+readushort(f),
+ magic=readulong(f),
+ flags=readushort(f),
+ units=readushort(f),
+ created=readlongdatetime(f),
+ modified=readlongdatetime(f),
+ xmin=readshort(f),
+ ymin=readshort(f),
+ xmax=readshort(f),
+ ymax=readshort(f),
+ macstyle=readushort(f),
+ smallpixels=readushort(f),
+ directionhint=readshort(f),
+ indextolocformat=readshort(f),
+ glyphformat=readshort(f),
+ }
+ fontdata.fontheader=fontheader
+ else
+ fontdata.fontheader={}
+ end
+ fontdata.nofglyphs=0
+end
+readers.hhea=function(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"hhea",specification.details)
+ if tableoffset then
+ fontdata.horizontalheader={
+ version=readulong(f),
+ ascender=readfword(f),
+ descender=readfword(f),
+ linegap=readfword(f),
+ maxadvancewidth=readufword(f),
+ minleftsidebearing=readfword(f),
+ minrightsidebearing=readfword(f),
+ maxextent=readfword(f),
+ caretsloperise=readshort(f),
+ caretsloperun=readshort(f),
+ caretoffset=readshort(f),
+ reserved_1=readshort(f),
+ reserved_2=readshort(f),
+ reserved_3=readshort(f),
+ reserved_4=readshort(f),
+ metricdataformat=readshort(f),
+ nofmetrics=readushort(f),
+ }
+ else
+ fontdata.horizontalheader={
+ nofmetrics=0,
+ }
+ end
+end
+readers.vhea=function(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"vhea",specification.details)
+ if tableoffset then
+ fontdata.verticalheader={
+ version=readulong(f),
+ ascender=readfword(f),
+ descender=readfword(f),
+ linegap=readfword(f),
+ maxadvanceheight=readufword(f),
+ mintopsidebearing=readfword(f),
+ minbottomsidebearing=readfword(f),
+ maxextent=readfword(f),
+ caretsloperise=readshort(f),
+ caretsloperun=readshort(f),
+ caretoffset=readshort(f),
+ reserved_1=readshort(f),
+ reserved_2=readshort(f),
+ reserved_3=readshort(f),
+ reserved_4=readshort(f),
+ metricdataformat=readshort(f),
+ nofmetrics=readushort(f),
+ }
+ else
+ fontdata.verticalheader={
+ nofmetrics=0,
+ }
+ end
+end
+readers.maxp=function(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"maxp",specification.details)
+ if tableoffset then
+ local version=readulong(f)
+ local nofglyphs=readushort(f)
+ fontdata.nofglyphs=nofglyphs
+ if version==0x00005000 then
+ fontdata.maximumprofile={
+ version=version,
+ nofglyphs=nofglyphs,
+ }
+ elseif version==0x00010000 then
+ fontdata.maximumprofile={
+ version=version,
+ nofglyphs=nofglyphs,
+ points=readushort(f),
+ contours=readushort(f),
+ compositepoints=readushort(f),
+ compositecontours=readushort(f),
+ zones=readushort(f),
+ twilightpoints=readushort(f),
+ storage=readushort(f),
+ functiondefs=readushort(f),
+ instructiondefs=readushort(f),
+ stackelements=readushort(f),
+ sizeofinstructions=readushort(f),
+ componentelements=readushort(f),
+ componentdepth=readushort(f),
+ }
+ else
+ fontdata.maximumprofile={
+ version=version,
+ nofglyphs=0,
+ }
+ end
+ end
+end
+readers.hmtx=function(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"hmtx",specification.glyphs)
+ if tableoffset then
+ local horizontalheader=fontdata.horizontalheader
+ local nofmetrics=horizontalheader.nofmetrics
+ local glyphs=fontdata.glyphs
+ local nofglyphs=fontdata.nofglyphs
+ local width=0
+ local leftsidebearing=0
+ for i=0,nofmetrics-1 do
+ local glyph=glyphs[i]
+ width=readshort(f)
+ leftsidebearing=readshort(f)
+ if width~=0 then
+ glyph.width=width
+ end
+ end
+ for i=nofmetrics,nofglyphs-1 do
+ local glyph=glyphs[i]
+ if width~=0 then
+ glyph.width=width
+ end
+ end
+ end
+end
+readers.vmtx=function(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"vmtx",specification.glyphs)
+ if tableoffset then
+ local verticalheader=fontdata.verticalheader
+ local nofmetrics=verticalheader.nofmetrics
+ local glyphs=fontdata.glyphs
+ local nofglyphs=fontdata.nofglyphs
+ local vheight=0
+ local vdefault=verticalheader.ascender-verticalheader.descender
+ local topsidebearing=0
+ for i=0,nofmetrics-1 do
+ local glyph=glyphs[i]
+ vheight=readushort(f)
+ topsidebearing=readshort(f)
+ if vheight~=0 and vheight~=vdefault then
+ glyph.vheight=vheight
+ end
+ if topsidebearing~=0 then
+ glyph.tsb=topsidebearing
+ end
+ end
+ for i=nofmetrics,nofglyphs-1 do
+ local glyph=glyphs[i]
+ if vheight~=0 and vheight~=vdefault then
+ glyph.vheight=vheight
+ end
+ end
+ end
+end
+readers.vorg=function(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"vorg",specification.glyphs)
+end
+readers.post=function(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"post",true)
+ if tableoffset then
+ local version=readulong(f)
+ fontdata.postscript={
+ version=version,
+ italicangle=round(1000*readfixed(f))/1000,
+ underlineposition=readfword(f),
+ underlinethickness=readfword(f),
+ monospaced=readulong(f),
+ minmemtype42=readulong(f),
+ maxmemtype42=readulong(f),
+ minmemtype1=readulong(f),
+ maxmemtype1=readulong(f),
+ }
+ if not specification.glyphs then
+ elseif version==0x00010000 then
+ for index=0,#standardromanencoding do
+ glyphs[index].name=standardromanencoding[index]
+ end
+ elseif version==0x00020000 then
+ local glyphs=fontdata.glyphs
+ local nofglyphs=readushort(f)
+ local indices={}
+ local names={}
+ local maxnames=0
+ for i=0,nofglyphs-1 do
+ local nameindex=readushort(f)
+ if nameindex>=258 then
+ maxnames=maxnames+1
+ nameindex=nameindex-257
+ indices[nameindex]=i
+ else
+ glyphs[i].name=standardromanencoding[nameindex]
+ end
+ end
+ for i=1,maxnames do
+ local mapping=indices[i]
+ if not mapping then
+ report("quit post name fetching at %a of %a: %s",i,maxnames,"no index")
+ break
+ else
+ local length=readbyte(f)
+ if length>0 then
+ glyphs[mapping].name=readstring(f,length)
+ else
+ report("quit post name fetching at %a of %a: %s",i,maxnames,"overflow")
+ break
+ end
+ end
+ end
+ end
+ else
+ fontdata.postscript={}
+ end
+end
+readers.cff=function(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"cff",specification.glyphs)
+end
+local formatreaders={}
+local duplicatestoo=true
+local sequence={
+ { 3,1,4 },
+ { 3,10,12 },
+ { 0,3,4 },
+ { 0,3,12 },
+ { 0,1,4 },
+ { 0,1,12 },
+ { 0,0,6 },
+ { 3,0,6 },
+ { 3,0,4 },
+ { 0,5,14 },
+ { 0,4,12 },
+ { 3,10,13 },
+}
+local supported={}
+for i=1,#sequence do
+ local si=sequence[i]
+ local sp,se,sf=si[1],si[2],si[3]
+ local p=supported[sp]
+ if not p then
+ p={}
+ supported[sp]=p
+ end
+ local e=p[se]
+ if not e then
+ e={}
+ p[se]=e
+ end
+ e[sf]=true
+end
+formatreaders[4]=function(f,fontdata,offset)
+ setposition(f,offset+2)
+ local length=readushort(f)
+ local language=readushort(f)
+ local nofsegments=readushort(f)/2
+ skipshort(f,3)
+ local mapping=fontdata.mapping
+ local glyphs=fontdata.glyphs
+ local duplicates=fontdata.duplicates
+ local nofdone=0
+ local endchars=readcardinaltable(f,nofsegments,ushort)
+ local reserved=readushort(f)
+ local startchars=readcardinaltable(f,nofsegments,ushort)
+ local deltas=readcardinaltable(f,nofsegments,ushort)
+ local offsets=readcardinaltable(f,nofsegments,ushort)
+ local size=(length-2*2-5*2-4*2*nofsegments)/2
+ local indices=readcardinaltable(f,size-1,ushort)
+ for segment=1,nofsegments do
+ local startchar=startchars[segment]
+ local endchar=endchars[segment]
+ local offset=offsets[segment]
+ local delta=deltas[segment]
+ if startchar==0xFFFF and endchar==0xFFFF then
+ elseif startchar==0xFFFF and offset==0 then
+ elseif offset==0xFFFF then
+ elseif offset==0 then
+ if trace_cmap_details then
+ report("format 4.%i segment %2i from %C upto %C at index %H",1,segment,startchar,endchar,(startchar+delta)%65536)
+ end
+ for unicode=startchar,endchar do
+ local index=(unicode+delta)%65536
+ if index and index>0 then
+ local glyph=glyphs[index]
+ if glyph then
+ local gu=glyph.unicode
+ if not gu then
+ glyph.unicode=unicode
+ nofdone=nofdone+1
+ elseif gu~=unicode then
+ if duplicatestoo then
+ local d=duplicates[gu]
+ if d then
+ d[unicode]=true
+ else
+ duplicates[gu]={ [unicode]=true }
+ end
+ else
+ report("duplicate case 1: %C %04i %s",unicode,index,glyphs[index].name)
+ end
+ end
+ if not mapping[index] then
+ mapping[index]=unicode
+ end
+ end
+ end
+ end
+ else
+ local shift=(segment-nofsegments+offset/2)-startchar
+ if trace_cmap_details then
+ report_cmap("format 4.%i segment %2i from %C upto %C at index %H",0,segment,startchar,endchar,(startchar+delta)%65536)
+ end
+ for unicode=startchar,endchar do
+ local slot=shift+unicode
+ local index=indices[slot]
+ if index and index>0 then
+ index=(index+delta)%65536
+ local glyph=glyphs[index]
+ if glyph then
+ local gu=glyph.unicode
+ if not gu then
+ glyph.unicode=unicode
+ nofdone=nofdone+1
+ elseif gu~=unicode then
+ if duplicatestoo then
+ local d=duplicates[gu]
+ if d then
+ d[unicode]=true
+ else
+ duplicates[gu]={ [unicode]=true }
+ end
+ else
+ report("duplicate case 2: %C %04i %s",unicode,index,glyphs[index].name)
+ end
+ end
+ if not mapping[index] then
+ mapping[index]=unicode
+ end
+ end
+ end
+ end
+ end
+ end
+ return nofdone
+end
+formatreaders[6]=function(f,fontdata,offset)
+ setposition(f,offset)
+ local format=readushort(f)
+ local length=readushort(f)
+ local language=readushort(f)
+ local mapping=fontdata.mapping
+ local glyphs=fontdata.glyphs
+ local duplicates=fontdata.duplicates
+ local start=readushort(f)
+ local count=readushort(f)
+ local stop=start+count-1
+ local nofdone=0
+ if trace_cmap_details then
+ report_cmap("format 6 from %C to %C",2,start,stop)
+ end
+ for unicode=start,stop do
+ local index=readushort(f)
+ if index>0 then
+ local glyph=glyphs[index]
+ if glyph then
+ local gu=glyph.unicode
+ if not gu then
+ glyph.unicode=unicode
+ nofdone=nofdone+1
+ elseif gu~=unicode then
+ end
+ if not mapping[index] then
+ mapping[index]=unicode
+ end
+ end
+ end
+ end
+ return nofdone
+end
+formatreaders[12]=function(f,fontdata,offset)
+ setposition(f,offset+2+2+4+4)
+ local mapping=fontdata.mapping
+ local glyphs=fontdata.glyphs
+ local duplicates=fontdata.duplicates
+ local nofgroups=readulong(f)
+ local nofdone=0
+ for i=1,nofgroups do
+ local first=readulong(f)
+ local last=readulong(f)
+ local index=readulong(f)
+ if trace_cmap_details then
+ report_cmap("format 12 from %C to %C starts at index %i",first,last,index)
+ end
+ for unicode=first,last do
+ local glyph=glyphs[index]
+ if glyph then
+ local gu=glyph.unicode
+ if not gu then
+ glyph.unicode=unicode
+ nofdone=nofdone+1
+ elseif gu~=unicode then
+ local d=duplicates[gu]
+ if d then
+ d[unicode]=true
+ else
+ duplicates[gu]={ [unicode]=true }
+ end
+ end
+ if not mapping[index] then
+ mapping[index]=unicode
+ end
+ end
+ index=index+1
+ end
+ end
+ return nofdone
+end
+formatreaders[13]=function(f,fontdata,offset)
+ setposition(f,offset+2+2+4+4)
+ local mapping=fontdata.mapping
+ local glyphs=fontdata.glyphs
+ local duplicates=fontdata.duplicates
+ local nofgroups=readulong(f)
+ local nofdone=0
+ for i=1,nofgroups do
+ local first=readulong(f)
+ local last=readulong(f)
+ local index=readulong(f)
+ if first=privateoffset then
+ local limit=privateoffset-1
+ report("format 13 from %C to %C pruned to %C",first,last,limit)
+ last=limit
+ end
+ for unicode=first,last do
+ list[unicode]=true
+ end
+ nofdone=nofdone+last-first+1
+ else
+ report("format 13 from %C to %C ignored",first,last)
+ end
+ end
+ return nofdone
+end
+formatreaders[14]=function(f,fontdata,offset)
+ if offset and offset~=0 then
+ setposition(f,offset)
+ local format=readushort(f)
+ local length=readulong(f)
+ local nofrecords=readulong(f)
+ local records={}
+ local variants={}
+ local nofdone=0
+ fontdata.variants=variants
+ for i=1,nofrecords do
+ records[i]={
+ selector=readuint(f),
+ default=readulong(f),
+ other=readulong(f),
+ }
+ end
+ for i=1,nofrecords do
+ local record=records[i]
+ local selector=record.selector
+ local default=record.default
+ local other=record.other
+ local other=record.other
+ if other~=0 then
+ setposition(f,offset+other)
+ local mapping={}
+ local count=readulong(f)
+ for i=1,count do
+ mapping[readuint(f)]=readushort(f)
+ end
+ nofdone=nofdone+count
+ variants[selector]=mapping
+ end
+ end
+ return nofdone
+ else
+ return 0
+ end
+end
+local function checkcmap(f,fontdata,records,platform,encoding,format)
+ local pdata=records[platform]
+ if not pdata then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","no platform",platform,encoding,format)
+ end
+ return 0
+ end
+ local edata=pdata[encoding]
+ if not edata then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","no encoding",platform,encoding,format)
+ end
+ return 0
+ end
+ local fdata=edata[format]
+ if not fdata then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","no format",platform,encoding,format)
+ end
+ return 0
+ elseif type(fdata)~="number" then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","already done",platform,encoding,format)
+ end
+ return 0
+ end
+ edata[format]=true
+ local reader=formatreaders[format]
+ if not reader then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","unsupported format",platform,encoding,format)
+ end
+ return 0
+ end
+ local n=reader(f,fontdata,fdata) or 0
+ if trace_cmap_details or trace_cmap then
+ local p=platforms[platform]
+ local e=encodings[p]
+ report_cmap("checked, platform %i (%s), encoding %i (%s), format %i, new unicodes %i",
+ platform,p,encoding,e and e[encoding] or "?",format,n)
+ end
+ return n
+end
+function readers.cmap(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"cmap",specification.glyphs)
+ if tableoffset then
+ local version=readushort(f)
+ local noftables=readushort(f)
+ local records={}
+ local unicodecid=false
+ local variantcid=false
+ local variants={}
+ local duplicates=fontdata.duplicates or {}
+ fontdata.duplicates=duplicates
+ for i=1,noftables do
+ local platform=readushort(f)
+ local encoding=readushort(f)
+ local offset=readulong(f)
+ local record=records[platform]
+ if not record then
+ records[platform]={
+ [encoding]={
+ offsets={ offset },
+ formats={},
+ }
+ }
+ else
+ local subtables=record[encoding]
+ if not subtables then
+ record[encoding]={
+ offsets={ offset },
+ formats={},
+ }
+ else
+ local offsets=subtables.offsets
+ offsets[#offsets+1]=offset
+ end
+ end
+ end
+ if trace_cmap then
+ report("found cmaps:")
+ end
+ for platform,record in sortedhash(records) do
+ local p=platforms[platform]
+ local e=encodings[p]
+ local sp=supported[platform]
+ local ps=p or "?"
+ if trace_cmap then
+ if sp then
+ report(" platform %i: %s",platform,ps)
+ else
+ report(" platform %i: %s (unsupported)",platform,ps)
+ end
+ end
+ for encoding,subtables in sortedhash(record) do
+ local se=sp and sp[encoding]
+ local es=e and e[encoding] or "?"
+ if trace_cmap then
+ if se then
+ report(" encoding %i: %s",encoding,es)
+ else
+ report(" encoding %i: %s (unsupported)",encoding,es)
+ end
+ end
+ local offsets=subtables.offsets
+ local formats=subtables.formats
+ for i=1,#offsets do
+ local offset=tableoffset+offsets[i]
+ setposition(f,offset)
+ formats[readushort(f)]=offset
+ end
+ record[encoding]=formats
+ if trace_cmap then
+ local list=sortedkeys(formats)
+ for i=1,#list do
+ if not (se and se[list[i]]) then
+ list[i]=list[i].." (unsupported)"
+ end
+ end
+ report(" formats: % t",list)
+ end
+ end
+ end
+ local ok=false
+ for i=1,#sequence do
+ local si=sequence[i]
+ local sp,se,sf=si[1],si[2],si[3]
+ if checkcmap(f,fontdata,records,sp,se,sf)>0 then
+ ok=true
+ end
+ end
+ if not ok then
+ report("no useable unicode cmap found")
+ end
+ fontdata.cidmaps={
+ version=version,
+ noftables=noftables,
+ records=records,
+ }
+ else
+ fontdata.cidmaps={}
+ end
+end
+function readers.loca(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"loca",specification.glyphs)
+end
+function readers.glyf(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"glyf",specification.glyphs)
+end
+function readers.colr(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"colr",specification.glyphs)
+end
+function readers.cpal(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"cpal",specification.glyphs)
+end
+function readers.svg(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"svg",specification.glyphs)
+end
+function readers.sbix(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"sbix",specification.glyphs)
+end
+function readers.cbdt(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"cbdt",specification.glyphs)
+end
+function readers.cblc(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"cblc",specification.glyphs)
+end
+function readers.ebdt(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"ebdt",specification.glyphs)
+end
+function readers.ebsc(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"ebsc",specification.glyphs)
+end
+function readers.eblc(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"eblc",specification.glyphs)
+end
+function readers.kern(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"kern",specification.kerns)
+ if tableoffset then
+ local version=readushort(f)
+ local noftables=readushort(f)
+ for i=1,noftables do
+ local version=readushort(f)
+ local length=readushort(f)
+ local coverage=readushort(f)
+ local format=rshift(coverage,8)
+ if format==0 then
+ local nofpairs=readushort(f)
+ local searchrange=readushort(f)
+ local entryselector=readushort(f)
+ local rangeshift=readushort(f)
+ local kerns={}
+ local glyphs=fontdata.glyphs
+ for i=1,nofpairs do
+ local left=readushort(f)
+ local right=readushort(f)
+ local kern=readfword(f)
+ local glyph=glyphs[left]
+ local kerns=glyph.kerns
+ if kerns then
+ kerns[right]=kern
+ else
+ glyph.kerns={ [right]=kern }
+ end
+ end
+ elseif format==2 then
+ report("todo: kern classes")
+ else
+ report("todo: kerns")
+ end
+ end
+ end
+end
+function readers.gdef(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"gdef",specification.details)
+end
+function readers.gsub(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"gsub",specification.details)
+end
+function readers.gpos(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"gpos",specification.details)
+end
+function readers.math(f,fontdata,specification)
+ reportskippedtable(f,fontdata,"math",specification.details)
+end
+local function getinfo(maindata,sub,platformnames,rawfamilynames,metricstoo,instancenames)
+ local fontdata=sub and maindata.subfonts and maindata.subfonts[sub] or maindata
+ local names=fontdata.names
+ local info=nil
+ if names then
+ local metrics=fontdata.windowsmetrics or {}
+ local postscript=fontdata.postscript or {}
+ local fontheader=fontdata.fontheader or {}
+ local cffinfo=fontdata.cffinfo or {}
+ local verticalheader=fontdata.verticalheader or {}
+ local filename=fontdata.filename
+ local weight=getname(fontdata,"weight") or (cffinfo and cffinfo.weight) or (metrics and metrics.weight)
+ local width=getname(fontdata,"width") or (cffinfo and cffinfo.width ) or (metrics and metrics.width )
+ local fontname=getname(fontdata,"postscriptname")
+ local fullname=getname(fontdata,"fullname")
+ local family=getname(fontdata,"family")
+ local subfamily=getname(fontdata,"subfamily")
+ local familyname=getname(fontdata,"typographicfamily")
+ local subfamilyname=getname(fontdata,"typographicsubfamily")
+ local compatiblename=getname(fontdata,"compatiblefullname")
+ if rawfamilynames then
+ else
+ if not familyname then familyname=family end
+ if not subfamilyname then subfamilyname=subfamily end
+ end
+ if platformnames then
+ platformnames=fontdata.platformnames
+ end
+ if instancenames then
+ local variabledata=fontdata.variabledata
+ if variabledata then
+ local instances=variabledata and variabledata.instances
+ if instances then
+ instancenames={}
+ for i=1,#instances do
+ instancenames[i]=lower(stripstring(instances[i].subfamily))
+ end
+ else
+ instancenames=nil
+ end
+ else
+ instancenames=nil
+ end
+ end
+ info={
+ subfontindex=fontdata.subfontindex or sub or 0,
+ version=getname(fontdata,"version"),
+ fontname=fontname,
+ fullname=fullname,
+ family=family,
+ subfamily=subfamily,
+ familyname=familyname,
+ subfamilyname=subfamilyname,
+ compatiblename=compatiblename,
+ weight=weight and lower(weight),
+ width=width and lower(width),
+ pfmweight=metrics.weightclass or 400,
+ pfmwidth=metrics.widthclass or 5,
+ panosewidth=metrics.panosewidth,
+ panoseweight=metrics.panoseweight,
+ italicangle=postscript.italicangle or 0,
+ units=fontheader.units or 0,
+ designsize=fontdata.designsize,
+ minsize=fontdata.minsize,
+ maxsize=fontdata.maxsize,
+ boundingbox=fontheader and { fontheader.xmin or 0,fontheader.ymin or 0,fontheader.xmax or 0,fontheader.ymax or 0 } or nil,
+ monospaced=(tonumber(postscript.monospaced or 0)>0) or metrics.panosewidth=="monospaced",
+ averagewidth=metrics.averagewidth,
+ xheight=metrics.xheight,
+ capheight=metrics.capheight or fontdata.maxy,
+ ascender=metrics.typoascender,
+ descender=metrics.typodescender,
+ platformnames=platformnames or nil,
+ instancenames=instancenames or nil,
+ tableoffsets=fontdata.tableoffsets,
+ defaultvheight=(verticalheader.ascender or 0)-(verticalheader.descender or 0)
+ }
+ if metricstoo then
+ local keys={
+ "version",
+ "ascender","descender","linegap",
+ "maxadvancewidth","maxadvanceheight","maxextent",
+ "minbottomsidebearing","mintopsidebearing",
+ }
+ local h=fontdata.horizontalheader or {}
+ local v=fontdata.verticalheader or {}
+ if h then
+ local th={}
+ local tv={}
+ for i=1,#keys do
+ local key=keys[i]
+ th[key]=h[key] or 0
+ tv[key]=v[key] or 0
+ end
+ info.horizontalmetrics=th
+ info.verticalmetrics=tv
+ end
+ end
+ elseif n then
+ info={
+ filename=fontdata.filename,
+ comment="there is no info for subfont "..n,
+ }
+ else
+ info={
+ filename=fontdata.filename,
+ comment="there is no info",
+ }
+ end
+ return info
+end
+local function loadtables(f,specification,offset)
+ if offset then
+ setposition(f,offset)
+ end
+ local tables={}
+ local basename=file.basename(specification.filename)
+ local filesize=specification.filesize
+ local filetime=specification.filetime
+ local fontdata={
+ filename=basename,
+ filesize=filesize,
+ filetime=filetime,
+ version=readstring(f,4),
+ noftables=readushort(f),
+ searchrange=readushort(f),
+ entryselector=readushort(f),
+ rangeshift=readushort(f),
+ tables=tables,
+ foundtables=false,
+ }
+ for i=1,fontdata.noftables do
+ local tag=lower(stripstring(readstring(f,4)))
+ local checksum=readushort(f)*0x10000+readushort(f)
+ local offset=readulong(f)
+ local length=readulong(f)
+ if offset+length>filesize then
+ report("bad %a table in file %a",tag,basename)
+ end
+ tables[tag]={
+ checksum=checksum,
+ offset=offset,
+ length=length,
+ }
+ end
+ fontdata.foundtables=sortedkeys(tables)
+ if tables.cff or tables.cff2 then
+ fontdata.format="opentype"
+ else
+ fontdata.format="truetype"
+ end
+ return fontdata,tables
+end
+local function prepareglyps(fontdata)
+ local glyphs=setmetatableindex(function(t,k)
+ local v={
+ index=k,
+ }
+ t[k]=v
+ return v
+ end)
+ fontdata.glyphs=glyphs
+ fontdata.mapping={}
+end
+local function readtable(tag,f,fontdata,specification,...)
+ local reader=readers[tag]
+ if reader then
+ reader(f,fontdata,specification,...)
+ end
+end
+local variablefonts_supported=(context and true) or (logs and logs.application and true) or false
+local function readdata(f,offset,specification)
+ local fontdata,tables=loadtables(f,specification,offset)
+ if specification.glyphs then
+ prepareglyps(fontdata)
+ end
+ if not variablefonts_supported then
+ specification.instance=nil
+ specification.variable=nil
+ specification.factors=nil
+ end
+ fontdata.temporary={}
+ readtable("name",f,fontdata,specification)
+ local askedname=specification.askedname
+ if askedname then
+ local fullname=getname(fontdata,"fullname") or ""
+ local cleanname=gsub(askedname,"[^a-zA-Z0-9]","")
+ local foundname=gsub(fullname,"[^a-zA-Z0-9]","")
+ if lower(cleanname)~=lower(foundname) then
+ return
+ end
+ end
+ readtable("stat",f,fontdata,specification)
+ readtable("avar",f,fontdata,specification)
+ readtable("fvar",f,fontdata,specification)
+ if variablefonts_supported then
+ local variabledata=fontdata.variabledata
+ if variabledata then
+ local instances=variabledata.instances
+ local axis=variabledata.axis
+ if axis and (not instances or #instances==0) then
+ instances={}
+ variabledata.instances=instances
+ local function add(n,subfamily,value)
+ local values={}
+ for i=1,#axis do
+ local a=axis[i]
+ values[i]={
+ axis=a.tag,
+ value=i==n and value or a.default,
+ }
+ end
+ instances[#instances+1]={
+ subfamily=subfamily,
+ values=values,
+ }
+ end
+ for i=1,#axis do
+ local a=axis[i]
+ local tag=a.tag
+ add(i,"default"..tag,a.default)
+ add(i,"minimum"..tag,a.minimum)
+ add(i,"maximum"..tag,a.maximum)
+ end
+ end
+ end
+ if not specification.factors then
+ local instance=specification.instance
+ if type(instance)=="string" then
+ local factors=helpers.getfactors(fontdata,instance)
+ if factors then
+ specification.factors=factors
+ fontdata.factors=factors
+ fontdata.instance=instance
+ report("user instance: %s, factors: % t",instance,factors)
+ else
+ report("user instance: %s, bad factors",instance)
+ end
+ end
+ end
+ if not fontdata.factors then
+ if fontdata.variabledata then
+ local factors=helpers.getfactors(fontdata,true)
+ if factors then
+ specification.factors=factors
+ fontdata.factors=factors
+ end
+ else
+ end
+ end
+ end
+ readtable("os/2",f,fontdata,specification)
+ readtable("head",f,fontdata,specification)
+ readtable("maxp",f,fontdata,specification)
+ readtable("hhea",f,fontdata,specification)
+ readtable("vhea",f,fontdata,specification)
+ readtable("hmtx",f,fontdata,specification)
+ readtable("vmtx",f,fontdata,specification)
+ readtable("vorg",f,fontdata,specification)
+ readtable("post",f,fontdata,specification)
+ readtable("mvar",f,fontdata,specification)
+ readtable("hvar",f,fontdata,specification)
+ readtable("vvar",f,fontdata,specification)
+ readtable("gdef",f,fontdata,specification)
+ readtable("cff",f,fontdata,specification)
+ readtable("cff2",f,fontdata,specification)
+ readtable("cmap",f,fontdata,specification)
+ readtable("loca",f,fontdata,specification)
+ readtable("glyf",f,fontdata,specification)
+ readtable("colr",f,fontdata,specification)
+ readtable("cpal",f,fontdata,specification)
+ readtable("svg",f,fontdata,specification)
+ readtable("sbix",f,fontdata,specification)
+ readtable("cbdt",f,fontdata,specification)
+ readtable("cblc",f,fontdata,specification)
+ readtable("ebdt",f,fontdata,specification)
+ readtable("eblc",f,fontdata,specification)
+ readtable("kern",f,fontdata,specification)
+ readtable("gsub",f,fontdata,specification)
+ readtable("gpos",f,fontdata,specification)
+ readtable("math",f,fontdata,specification)
+ fontdata.locations=nil
+ fontdata.cidmaps=nil
+ fontdata.dictionaries=nil
+ if specification.tableoffsets then
+ fontdata.tableoffsets=tables
+ setmetatableindex(tables,{
+ version=fontdata.version,
+ noftables=fontdata.noftables,
+ searchrange=fontdata.searchrange,
+ entryselector=fontdata.entryselector,
+ rangeshift=fontdata.rangeshift,
+ })
+ end
+ return fontdata
+end
+local function loadfontdata(specification)
+ local filename=specification.filename
+ local fileattr=lfs.attributes(filename)
+ local filesize=fileattr and fileattr.size or 0
+ local filetime=fileattr and fileattr.modification or 0
+ local f=openfile(filename,true)
+ if not f then
+ report("unable to open %a",filename)
+ elseif filesize==0 then
+ report("empty file %a",filename)
+ closefile(f)
+ else
+ specification.filesize=filesize
+ specification.filetime=filetime
+ local version=readstring(f,4)
+ local fontdata=nil
+ if version=="OTTO" or version=="true" or version=="\0\1\0\0" then
+ fontdata=readdata(f,0,specification)
+ elseif version=="ttcf" then
+ local subfont=tonumber(specification.subfont)
+ local ttcversion=readulong(f)
+ local nofsubfonts=readulong(f)
+ local offsets=readcardinaltable(f,nofsubfonts,ulong)
+ if subfont then
+ if subfont>=1 and subfont<=nofsubfonts then
+ fontdata=readdata(f,offsets[subfont],specification)
+ else
+ report("no subfont %a in file %a",subfont,filename)
+ end
+ else
+ subfont=specification.subfont
+ if type(subfont)=="string" and subfont~="" then
+ specification.askedname=subfont
+ for i=1,nofsubfonts do
+ fontdata=readdata(f,offsets[i],specification)
+ if fontdata then
+ fontdata.subfontindex=i
+ report("subfont named %a has index %a",subfont,i)
+ break
+ end
+ end
+ if not fontdata then
+ report("no subfont named %a",subfont)
+ end
+ else
+ local subfonts={}
+ fontdata={
+ filename=filename,
+ filesize=filesize,
+ filetime=filetime,
+ version=version,
+ subfonts=subfonts,
+ ttcversion=ttcversion,
+ nofsubfonts=nofsubfonts,
+ }
+ for i=1,nofsubfonts do
+ subfonts[i]=readdata(f,offsets[i],specification)
+ end
+ end
+ end
+ else
+ report("unknown version %a in file %a",version,filename)
+ end
+ closefile(f)
+ return fontdata or {}
+ end
+end
+local function loadfont(specification,n,instance)
+ if type(specification)=="string" then
+ specification={
+ filename=specification,
+ info=true,
+ details=true,
+ glyphs=true,
+ shapes=true,
+ kerns=true,
+ variable=true,
+ globalkerns=true,
+ lookups=true,
+ subfont=n or true,
+ tounicode=false,
+ instance=instance
+ }
+ end
+ if specification.shapes or specification.lookups or specification.kerns then
+ specification.glyphs=true
+ end
+ if specification.glyphs then
+ specification.details=true
+ end
+ if specification.details then
+ specification.info=true
+ end
+ if specification.platformnames then
+ specification.platformnames=true
+ end
+ if specification.instance or instance then
+ specification.variable=true
+ specification.instance=specification.instance or instance
+ end
+ local function message(str)
+ report("fatal error in file %a: %s\n%s",specification.filename,str,debug and debug.traceback())
+ end
+ local ok,result=xpcall(loadfontdata,message,specification)
+ if ok then
+ return result
+ end
+end
+function readers.loadshapes(filename,n,instance,streams)
+ local fontdata=loadfont {
+ filename=filename,
+ shapes=true,
+ streams=streams,
+ variable=true,
+ subfont=n,
+ instance=instance,
+ }
+ if fontdata then
+ for k,v in next,fontdata.glyphs do
+ v.class=nil
+ v.index=nil
+ v.math=nil
+ end
+ local names=fontdata.names
+ if names then
+ for k,v in next,names do
+ names[k]=fullstrip(v.content)
+ end
+ end
+ end
+ return fontdata and {
+ filename=filename,
+ format=fontdata.format,
+ glyphs=fontdata.glyphs,
+ units=fontdata.fontheader.units,
+ cffinfo=fontdata.cffinfo,
+ fontheader=fontdata.fontheader,
+ horizontalheader=fontdata.horizontalheader,
+ verticalheader=fontdata.verticalheader,
+ maximumprofile=fontdata.maximumprofile,
+ names=fontdata.names,
+ postscript=fontdata.postscript,
+ } or {
+ filename=filename,
+ format="unknown",
+ glyphs={},
+ units=0,
+ }
+end
+function readers.loadfont(filename,n,instance)
+ local fontdata=loadfont {
+ filename=filename,
+ glyphs=true,
+ shapes=false,
+ lookups=true,
+ variable=true,
+ subfont=n,
+ instance=instance,
+ }
+ if fontdata then
+ return {
+ tableversion=tableversion,
+ creator="context mkiv",
+ size=fontdata.filesize,
+ time=fontdata.filetime,
+ glyphs=fontdata.glyphs,
+ descriptions=fontdata.descriptions,
+ format=fontdata.format,
+ goodies={},
+ metadata=getinfo(fontdata,n,false,false,true,true),
+ properties={
+ hasitalics=fontdata.hasitalics or false,
+ maxcolorclass=fontdata.maxcolorclass,
+ hascolor=fontdata.hascolor or false,
+ instance=fontdata.instance,
+ factors=fontdata.factors,
+ },
+ resources={
+ filename=filename,
+ private=privateoffset,
+ duplicates=fontdata.duplicates or {},
+ features=fontdata.features or {},
+ sublookups=fontdata.sublookups or {},
+ marks=fontdata.marks or {},
+ markclasses=fontdata.markclasses or {},
+ marksets=fontdata.marksets or {},
+ sequences=fontdata.sequences or {},
+ variants=fontdata.variants,
+ version=getname(fontdata,"version"),
+ cidinfo=fontdata.cidinfo,
+ mathconstants=fontdata.mathconstants,
+ colorpalettes=fontdata.colorpalettes,
+ svgshapes=fontdata.svgshapes,
+ pngshapes=fontdata.pngshapes,
+ variabledata=fontdata.variabledata,
+ foundtables=fontdata.foundtables,
+ },
+ }
+ end
+end
+function readers.getinfo(filename,specification)
+ local subfont=nil
+ local platformnames=false
+ local rawfamilynames=false
+ local instancenames=true
+ local tableoffsets=false
+ if type(specification)=="table" then
+ subfont=tonumber(specification.subfont)
+ platformnames=specification.platformnames
+ rawfamilynames=specification.rawfamilynames
+ tableoffsets=specification.tableoffsets
+ else
+ subfont=tonumber(specification)
+ end
+ local fontdata=loadfont {
+ filename=filename,
+ details=true,
+ platformnames=platformnames,
+ instancenames=true,
+ tableoffsets=tableoffsets,
+ }
+ if fontdata then
+ local subfonts=fontdata.subfonts
+ if not subfonts then
+ return getinfo(fontdata,nil,platformnames,rawfamilynames,false,instancenames)
+ elseif not subfont then
+ local info={}
+ for i=1,#subfonts do
+ info[i]=getinfo(fontdata,i,platformnames,rawfamilynames,false,instancenames)
+ end
+ return info
+ elseif subfont>=1 and subfont<=#subfonts then
+ return getinfo(fontdata,subfont,platformnames,rawfamilynames,false,instancenames)
+ else
+ return {
+ filename=filename,
+ comment="there is no subfont "..subfont.." in this file"
+ }
+ end
+ else
+ return {
+ filename=filename,
+ comment="the file cannot be opened for reading",
+ }
+ end
+end
+function readers.rehash(fontdata,hashmethod)
+ report("the %a helper is not yet implemented","rehash")
+end
+function readers.checkhash(fontdata)
+ report("the %a helper is not yet implemented","checkhash")
+end
+function readers.pack(fontdata,hashmethod)
+ report("the %a helper is not yet implemented","pack")
+end
+function readers.unpack(fontdata)
+ report("the %a helper is not yet implemented","unpack")
+end
+function readers.expand(fontdata)
+ report("the %a helper is not yet implemented","unpack")
+end
+function readers.compact(fontdata)
+ report("the %a helper is not yet implemented","compact")
+end
+local extenders={}
+function readers.registerextender(extender)
+ extenders[#extenders+1]=extender
+end
+function readers.extend(fontdata)
+ for i=1,#extenders do
+ local extender=extenders[i]
+ local name=extender.name or "unknown"
+ local action=extender.action
+ if action then
+ action(fontdata)
+ end
+ end
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-otr”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-oti” dbae7722baae24d917a17176553825cf] ---
+
+if not modules then modules={} end modules ['font-oti']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local lower=string.lower
+local fonts=fonts
+local constructors=fonts.constructors
+local otf=constructors.handlers.otf
+local otffeatures=constructors.features.otf
+local registerotffeature=otffeatures.register
+local otftables=otf.tables or {}
+otf.tables=otftables
+local allocate=utilities.storage.allocate
+registerotffeature {
+ name="features",
+ description="initialization of feature handler",
+ default=true,
+}
+local function setmode(tfmdata,value)
+ if value then
+ tfmdata.properties.mode=lower(value)
+ end
+end
+otf.modeinitializer=setmode
+local function setlanguage(tfmdata,value)
+ if value then
+ local cleanvalue=lower(value)
+ local languages=otftables and otftables.languages
+ local properties=tfmdata.properties
+ if not languages then
+ properties.language=cleanvalue
+ elseif languages[value] then
+ properties.language=cleanvalue
+ else
+ properties.language="dflt"
+ end
+ end
+end
+local function setscript(tfmdata,value)
+ if value then
+ local cleanvalue=lower(value)
+ local scripts=otftables and otftables.scripts
+ local properties=tfmdata.properties
+ if not scripts then
+ properties.script=cleanvalue
+ elseif scripts[value] then
+ properties.script=cleanvalue
+ else
+ properties.script="dflt"
+ end
+ end
+end
+registerotffeature {
+ name="mode",
+ description="mode",
+ initializers={
+ base=setmode,
+ node=setmode,
+ plug=setmode,
+ }
+}
+registerotffeature {
+ name="language",
+ description="language",
+ initializers={
+ base=setlanguage,
+ node=setlanguage,
+ plug=setlanguage,
+ }
+}
+registerotffeature {
+ name="script",
+ description="script",
+ initializers={
+ base=setscript,
+ node=setscript,
+ plug=setscript,
+ }
+}
+otftables.featuretypes=allocate {
+ gpos_single="position",
+ gpos_pair="position",
+ gpos_cursive="position",
+ gpos_mark2base="position",
+ gpos_mark2ligature="position",
+ gpos_mark2mark="position",
+ gpos_context="position",
+ gpos_contextchain="position",
+ gsub_single="substitution",
+ gsub_multiple="substitution",
+ gsub_alternate="substitution",
+ gsub_ligature="substitution",
+ gsub_context="substitution",
+ gsub_contextchain="substitution",
+ gsub_reversecontextchain="substitution",
+ gsub_reversesub="substitution",
+}
+function otffeatures.checkeddefaultscript(featuretype,autoscript,scripts)
+ if featuretype=="position" then
+ local default=scripts.dflt
+ if default then
+ if autoscript=="position" or autoscript==true then
+ return default
+ else
+ report_otf("script feature %s not applied, enable default positioning")
+ end
+ else
+ end
+ elseif featuretype=="substitution" then
+ local default=scripts.dflt
+ if default then
+ if autoscript=="substitution" or autoscript==true then
+ return default
+ end
+ end
+ end
+end
+function otffeatures.checkeddefaultlanguage(featuretype,autolanguage,languages)
+ if featuretype=="position" then
+ local default=languages.dflt
+ if default then
+ if autolanguage=="position" or autolanguage==true then
+ return default
+ else
+ report_otf("language feature %s not applied, enable default positioning")
+ end
+ else
+ end
+ elseif featuretype=="substitution" then
+ local default=languages.dflt
+ if default then
+ if autolanguage=="substitution" or autolanguage==true then
+ return default
+ end
+ end
+ end
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-oti”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-ott” aba6d8335a5f38a5a62d3631492f3392] ---
+
+if not modules then modules={} end modules ["font-ott"]={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files",
+}
+local type,next,tonumber,tostring,rawget,rawset=type,next,tonumber,tostring,rawget,rawset
+local gsub,lower,format,match,gmatch,find=string.gsub,string.lower,string.format,string.match,string.gmatch,string.find
+local sequenced=table.sequenced
+local is_boolean=string.is_boolean
+local setmetatableindex=table.setmetatableindex
+local setmetatablenewindex=table.setmetatablenewindex
+local allocate=utilities.storage.allocate
+local fonts=fonts
+local otf=fonts.handlers.otf
+local otffeatures=otf.features
+local tables=otf.tables or {}
+otf.tables=tables
+local statistics=otf.statistics or {}
+otf.statistics=statistics
+local scripts=allocate {
+ ["adlm"]="adlam",
+ ["aghb"]="caucasian albanian",
+ ["ahom"]="ahom",
+ ["arab"]="arabic",
+ ["armi"]="imperial aramaic",
+ ["armn"]="armenian",
+ ["avst"]="avestan",
+ ["bali"]="balinese",
+ ["bamu"]="bamum",
+ ["bass"]="bassa vah",
+ ["batk"]="batak",
+ ["beng"]="bengali",
+ ["bhks"]="bhaiksuki",
+ ["bng2"]="bengali variant 2",
+ ["bopo"]="bopomofo",
+ ["brah"]="brahmi",
+ ["brai"]="braille",
+ ["bugi"]="buginese",
+ ["buhd"]="buhid",
+ ["byzm"]="byzantine music",
+ ["cakm"]="chakma",
+ ["cans"]="canadian syllabics",
+ ["cari"]="carian",
+ ["cham"]="cham",
+ ["cher"]="cherokee",
+ ["copt"]="coptic",
+ ["cprt"]="cypriot syllabary",
+ ["cyrl"]="cyrillic",
+ ["dev2"]="devanagari variant 2",
+ ["deva"]="devanagari",
+ ["dogr"]="dogra",
+ ["dsrt"]="deseret",
+ ["dupl"]="duployan",
+ ["egyp"]="egyptian heiroglyphs",
+ ["elba"]="elbasan",
+ ["ethi"]="ethiopic",
+ ["geor"]="georgian",
+ ["gjr2"]="gujarati variant 2",
+ ["glag"]="glagolitic",
+ ["gong"]="gunjala gondi",
+ ["gonm"]="masaram gondi",
+ ["goth"]="gothic",
+ ["gran"]="grantha",
+ ["grek"]="greek",
+ ["gujr"]="gujarati",
+ ["gur2"]="gurmukhi variant 2",
+ ["guru"]="gurmukhi",
+ ["hang"]="hangul",
+ ["hani"]="cjk ideographic",
+ ["hano"]="hanunoo",
+ ["hatr"]="hatran",
+ ["hebr"]="hebrew",
+ ["hluw"]="anatolian hieroglyphs",
+ ["hmng"]="pahawh hmong",
+ ["hung"]="old hungarian",
+ ["ital"]="old italic",
+ ["jamo"]="hangul jamo",
+ ["java"]="javanese",
+ ["kali"]="kayah li",
+ ["kana"]="hiragana and katakana",
+ ["khar"]="kharosthi",
+ ["khmr"]="khmer",
+ ["khoj"]="khojki",
+ ["knd2"]="kannada variant 2",
+ ["knda"]="kannada",
+ ["kthi"]="kaithi",
+ ["lana"]="tai tham",
+ ["lao" ]="lao",
+ ["latn"]="latin",
+ ["lepc"]="lepcha",
+ ["limb"]="limbu",
+ ["lina"]="linear a",
+ ["linb"]="linear b",
+ ["lisu"]="lisu",
+ ["lyci"]="lycian",
+ ["lydi"]="lydian",
+ ["mahj"]="mahajani",
+ ["maka"]="makasar",
+ ["mand"]="mandaic and mandaean",
+ ["mani"]="manichaean",
+ ["marc"]="marchen",
+ ["math"]="mathematical alphanumeric symbols",
+ ["medf"]="medefaidrin",
+ ["mend"]="mende kikakui",
+ ["merc"]="meroitic cursive",
+ ["mero"]="meroitic hieroglyphs",
+ ["mlm2"]="malayalam variant 2",
+ ["mlym"]="malayalam",
+ ["modi"]="modi",
+ ["mong"]="mongolian",
+ ["mroo"]="mro",
+ ["mtei"]="meitei Mayek",
+ ["mult"]="multani",
+ ["musc"]="musical symbols",
+ ["mym2"]="myanmar variant 2",
+ ["mymr"]="myanmar",
+ ["narb"]="old north arabian",
+ ["nbat"]="nabataean",
+ ["newa"]="newa",
+ ["nko" ]='n"ko',
+ ["nshu"]="nüshu",
+ ["ogam"]="ogham",
+ ["olck"]="ol chiki",
+ ["orkh"]="old turkic and orkhon runic",
+ ["ory2"]="odia variant 2",
+ ["orya"]="oriya",
+ ["osge"]="osage",
+ ["osma"]="osmanya",
+ ["palm"]="palmyrene",
+ ["pauc"]="pau cin hau",
+ ["perm"]="old permic",
+ ["phag"]="phags-pa",
+ ["phli"]="inscriptional pahlavi",
+ ["phlp"]="psalter pahlavi",
+ ["phnx"]="phoenician",
+ ["plrd"]="miao",
+ ["prti"]="inscriptional parthian",
+ ["rjng"]="rejang",
+ ["rohg"]="hanifi rohingya",
+ ["runr"]="runic",
+ ["samr"]="samaritan",
+ ["sarb"]="old south arabian",
+ ["saur"]="saurashtra",
+ ["sgnw"]="sign writing",
+ ["shaw"]="shavian",
+ ["shrd"]="sharada",
+ ["sidd"]="siddham",
+ ["sind"]="khudawadi",
+ ["sinh"]="sinhala",
+ ["sogd"]="sogdian",
+ ["sogo"]="old sogdian",
+ ["sora"]="sora sompeng",
+ ["soyo"]="soyombo",
+ ["sund"]="sundanese",
+ ["sylo"]="syloti nagri",
+ ["syrc"]="syriac",
+ ["tagb"]="tagbanwa",
+ ["takr"]="takri",
+ ["tale"]="tai le",
+ ["talu"]="tai lu",
+ ["taml"]="tamil",
+ ["tang"]="tangut",
+ ["tavt"]="tai viet",
+ ["tel2"]="telugu variant 2",
+ ["telu"]="telugu",
+ ["tfng"]="tifinagh",
+ ["tglg"]="tagalog",
+ ["thaa"]="thaana",
+ ["thai"]="thai",
+ ["tibt"]="tibetan",
+ ["tirh"]="tirhuta",
+ ["tml2"]="tamil variant 2",
+ ["ugar"]="ugaritic cuneiform",
+ ["vai" ]="vai",
+ ["wara"]="warang citi",
+ ["xpeo"]="old persian cuneiform",
+ ["xsux"]="sumero-akkadian cuneiform",
+ ["yi" ]="yi",
+ ["zanb"]="zanabazar square",
+}
+local languages=allocate {
+ ["aba" ]="abaza",
+ ["abk" ]="abkhazian",
+ ["ach" ]="acholi",
+ ["acr" ]="achi",
+ ["ady" ]="adyghe",
+ ["afk" ]="afrikaans",
+ ["afr" ]="afar",
+ ["agw" ]="agaw",
+ ["aio" ]="aiton",
+ ["aka" ]="akan",
+ ["als" ]="alsatian",
+ ["alt" ]="altai",
+ ["amh" ]="amharic",
+ ["ang" ]="anglo-saxon",
+ ["apph"]="phonetic transcription—americanist conventions",
+ ["ara" ]="arabic",
+ ["arg" ]="aragonese",
+ ["ari" ]="aari",
+ ["ark" ]="rakhine",
+ ["asm" ]="assamese",
+ ["ast" ]="asturian",
+ ["ath" ]="athapaskan",
+ ["avr" ]="avar",
+ ["awa" ]="awadhi",
+ ["aym" ]="aymara",
+ ["azb" ]="torki",
+ ["aze" ]="azerbaijani",
+ ["bad" ]="badaga",
+ ["bad0"]="banda",
+ ["bag" ]="baghelkhandi",
+ ["bal" ]="balkar",
+ ["ban" ]="balinese",
+ ["bar" ]="bavarian",
+ ["bau" ]="baulé",
+ ["bbc" ]="batak toba",
+ ["bbr" ]="berber",
+ ["bch" ]="bench",
+ ["bcr" ]="bible cree",
+ ["bdy" ]="bandjalang",
+ ["bel" ]="belarussian",
+ ["bem" ]="bemba",
+ ["ben" ]="bengali",
+ ["bgc" ]="haryanvi",
+ ["bgq" ]="bagri",
+ ["bgr" ]="bulgarian",
+ ["bhi" ]="bhili",
+ ["bho" ]="bhojpuri",
+ ["bik" ]="bikol",
+ ["bil" ]="bilen",
+ ["bis" ]="bislama",
+ ["bjj" ]="kanauji",
+ ["bkf" ]="blackfoot",
+ ["bli" ]="baluchi",
+ ["blk" ]="pa'o karen",
+ ["bln" ]="balante",
+ ["blt" ]="balti",
+ ["bmb" ]="bambara (bamanankan)",
+ ["bml" ]="bamileke",
+ ["bos" ]="bosnian",
+ ["bpy" ]="bishnupriya manipuri",
+ ["bre" ]="breton",
+ ["brh" ]="brahui",
+ ["bri" ]="braj bhasha",
+ ["brm" ]="burmese",
+ ["brx" ]="bodo",
+ ["bsh" ]="bashkir",
+ ["bsk" ]="burushaski",
+ ["bti" ]="beti",
+ ["bts" ]="batak simalungun",
+ ["bug" ]="bugis",
+ ["byv" ]="medumba",
+ ["cak" ]="kaqchikel",
+ ["cat" ]="catalan",
+ ["cbk" ]="zamboanga chavacano",
+ ["cchn"]="chinantec",
+ ["ceb" ]="cebuano",
+ ["cgg" ]="chiga",
+ ["cha" ]="chamorro",
+ ["che" ]="chechen",
+ ["chg" ]="chaha gurage",
+ ["chh" ]="chattisgarhi",
+ ["chi" ]="chichewa (chewa, nyanja)",
+ ["chk" ]="chukchi",
+ ["chk0"]="chuukese",
+ ["cho" ]="choctaw",
+ ["chp" ]="chipewyan",
+ ["chr" ]="cherokee",
+ ["chu" ]="chuvash",
+ ["chy" ]="cheyenne",
+ ["cja" ]="western cham",
+ ["cjm" ]="eastern cham",
+ ["cmr" ]="comorian",
+ ["cop" ]="coptic",
+ ["cor" ]="cornish",
+ ["cos" ]="corsican",
+ ["cpp" ]="creoles",
+ ["cre" ]="cree",
+ ["crr" ]="carrier",
+ ["crt" ]="crimean tatar",
+ ["csb" ]="kashubian",
+ ["csl" ]="church slavonic",
+ ["csy" ]="czech",
+ ["ctg" ]="chittagonian",
+ ["cuk" ]="san blas kuna",
+ ["dan" ]="danish",
+ ["dar" ]="dargwa",
+ ["dax" ]="dayi",
+ ["dcr" ]="woods cree",
+ ["deu" ]="german",
+ ["dgo" ]="dogri",
+ ["dgr" ]="dogri",
+ ["dhg" ]="dhangu",
+ ["dhv" ]="divehi (dhivehi, maldivian)",
+ ["diq" ]="dimli",
+ ["div" ]="divehi (dhivehi, maldivian)",
+ ["djr" ]="zarma",
+ ["djr0"]="djambarrpuyngu",
+ ["dng" ]="dangme",
+ ["dnj" ]="dan",
+ ["dnk" ]="dinka",
+ ["dri" ]="dari",
+ ["duj" ]="dhuwal",
+ ["dun" ]="dungan",
+ ["dzn" ]="dzongkha",
+ ["ebi" ]="ebira",
+ ["ecr" ]="eastern cree",
+ ["edo" ]="edo",
+ ["efi" ]="efik",
+ ["ell" ]="greek",
+ ["emk" ]="eastern maninkakan",
+ ["eng" ]="english",
+ ["erz" ]="erzya",
+ ["esp" ]="spanish",
+ ["esu" ]="central yupik",
+ ["eti" ]="estonian",
+ ["euq" ]="basque",
+ ["evk" ]="evenki",
+ ["evn" ]="even",
+ ["ewe" ]="ewe",
+ ["fan" ]="french antillean",
+ ["fan0"]=" fang",
+ ["far" ]="persian",
+ ["fat" ]="fanti",
+ ["fin" ]="finnish",
+ ["fji" ]="fijian",
+ ["fle" ]="dutch (flemish)",
+ ["fmp" ]="fe’fe’",
+ ["fne" ]="forest nenets",
+ ["fon" ]="fon",
+ ["fos" ]="faroese",
+ ["fra" ]="french",
+ ["frc" ]="cajun french",
+ ["fri" ]="frisian",
+ ["frl" ]="friulian",
+ ["frp" ]="arpitan",
+ ["fta" ]="futa",
+ ["ful" ]="fulah",
+ ["fuv" ]="nigerian fulfulde",
+ ["gad" ]="ga",
+ ["gae" ]="scottish gaelic (gaelic)",
+ ["gag" ]="gagauz",
+ ["gal" ]="galician",
+ ["gar" ]="garshuni",
+ ["gaw" ]="garhwali",
+ ["gez" ]="ge'ez",
+ ["gih" ]="githabul",
+ ["gil" ]="gilyak",
+ ["gil0"]="kiribati (gilbertese)",
+ ["gkp" ]="kpelle (guinea)",
+ ["glk" ]="gilaki",
+ ["gmz" ]="gumuz",
+ ["gnn" ]="gumatj",
+ ["gog" ]="gogo",
+ ["gon" ]="gondi",
+ ["grn" ]="greenlandic",
+ ["gro" ]="garo",
+ ["gua" ]="guarani",
+ ["guc" ]="wayuu",
+ ["guf" ]="gupapuyngu",
+ ["guj" ]="gujarati",
+ ["guz" ]="gusii",
+ ["hai" ]="haitian (haitian creole)",
+ ["hal" ]="halam",
+ ["har" ]="harauti",
+ ["hau" ]="hausa",
+ ["haw" ]="hawaiian",
+ ["hay" ]="haya",
+ ["haz" ]="hazaragi",
+ ["hbn" ]="hammer-banna",
+ ["her" ]="herero",
+ ["hil" ]="hiligaynon",
+ ["hin" ]="hindi",
+ ["hma" ]="high mari",
+ ["hmn" ]="hmong",
+ ["hmo" ]="hiri motu",
+ ["hnd" ]="hindko",
+ ["ho" ]="ho",
+ ["hri" ]="harari",
+ ["hrv" ]="croatian",
+ ["hun" ]="hungarian",
+ ["hye" ]="armenian",
+ ["hye0"]="armenian east",
+ ["iba" ]="iban",
+ ["ibb" ]="ibibio",
+ ["ibo" ]="igbo",
+ ["ido" ]="ido",
+ ["ijo" ]="ijo languages",
+ ["ile" ]="interlingue",
+ ["ilo" ]="ilokano",
+ ["ina" ]="interlingua",
+ ["ind" ]="indonesian",
+ ["ing" ]="ingush",
+ ["inu" ]="inuktitut",
+ ["ipk" ]="inupiat",
+ ["ipph"]="phonetic transcription—ipa conventions",
+ ["iri" ]="irish",
+ ["irt" ]="irish traditional",
+ ["isl" ]="icelandic",
+ ["ism" ]="inari sami",
+ ["ita" ]="italian",
+ ["iwr" ]="hebrew",
+ ["jam" ]="jamaican creole",
+ ["jan" ]="japanese",
+ ["jav" ]="javanese",
+ ["jbo" ]="lojban",
+ ["jct" ]="krymchak",
+ ["jii" ]="yiddish",
+ ["jud" ]="ladino",
+ ["jul" ]="jula",
+ ["kab" ]="kabardian",
+ ["kab0"]="kabyle",
+ ["kac" ]="kachchi",
+ ["kal" ]="kalenjin",
+ ["kan" ]="kannada",
+ ["kar" ]="karachay",
+ ["kat" ]="georgian",
+ ["kaz" ]="kazakh",
+ ["kde" ]="makonde",
+ ["kea" ]="kabuverdianu (crioulo)",
+ ["keb" ]="kebena",
+ ["kek" ]="kekchi",
+ ["kge" ]="khutsuri georgian",
+ ["kha" ]="khakass",
+ ["khk" ]="khanty-kazim",
+ ["khm" ]="khmer",
+ ["khs" ]="khanty-shurishkar",
+ ["kht" ]="khamti shan",
+ ["khv" ]="khanty-vakhi",
+ ["khw" ]="khowar",
+ ["kik" ]="kikuyu (gikuyu)",
+ ["kir" ]="kirghiz (kyrgyz)",
+ ["kis" ]="kisii",
+ ["kiu" ]="kirmanjki",
+ ["kjd" ]="southern kiwai",
+ ["kjp" ]="eastern pwo karen",
+ ["kjz" ]="bumthangkha",
+ ["kkn" ]="kokni",
+ ["klm" ]="kalmyk",
+ ["kmb" ]="kamba",
+ ["kmn" ]="kumaoni",
+ ["kmo" ]="komo",
+ ["kms" ]="komso",
+ ["kmz" ]="khorasani turkic",
+ ["knr" ]="kanuri",
+ ["kod" ]="kodagu",
+ ["koh" ]="korean old hangul",
+ ["kok" ]="konkani",
+ ["kom" ]="komi",
+ ["kon" ]="kikongo",
+ ["kon0"]="kongo",
+ ["kop" ]="komi-permyak",
+ ["kor" ]="korean",
+ ["kos" ]="kosraean",
+ ["koz" ]="komi-zyrian",
+ ["kpl" ]="kpelle",
+ ["kri" ]="krio",
+ ["krk" ]="karakalpak",
+ ["krl" ]="karelian",
+ ["krm" ]="karaim",
+ ["krn" ]="karen",
+ ["krt" ]="koorete",
+ ["ksh" ]="kashmiri",
+ ["ksh0"]="ripuarian",
+ ["ksi" ]="khasi",
+ ["ksm" ]="kildin sami",
+ ["ksw" ]="s’gaw karen",
+ ["kua" ]="kuanyama",
+ ["kui" ]="kui",
+ ["kul" ]="kulvi",
+ ["kum" ]="kumyk",
+ ["kur" ]="kurdish",
+ ["kuu" ]="kurukh",
+ ["kuy" ]="kuy",
+ ["kyk" ]="koryak",
+ ["kyu" ]="western kayah",
+ ["lad" ]="ladin",
+ ["lah" ]="lahuli",
+ ["lak" ]="lak",
+ ["lam" ]="lambani",
+ ["lao" ]="lao",
+ ["lat" ]="latin",
+ ["laz" ]="laz",
+ ["lcr" ]="l-cree",
+ ["ldk" ]="ladakhi",
+ ["lez" ]="lezgi",
+ ["lij" ]="ligurian",
+ ["lim" ]="limburgish",
+ ["lin" ]="lingala",
+ ["lis" ]="lisu",
+ ["ljp" ]="lampung",
+ ["lki" ]="laki",
+ ["lma" ]="low mari",
+ ["lmb" ]="limbu",
+ ["lmo" ]="lombard",
+ ["lmw" ]="lomwe",
+ ["lom" ]="loma",
+ ["lrc" ]="luri",
+ ["lsb" ]="lower sorbian",
+ ["lsm" ]="lule sami",
+ ["lth" ]="lithuanian",
+ ["ltz" ]="luxembourgish",
+ ["lua" ]="luba-lulua",
+ ["lub" ]="luba-katanga",
+ ["lug" ]="ganda",
+ ["luh" ]="luyia",
+ ["luo" ]="luo",
+ ["lvi" ]="latvian",
+ ["mad" ]="madura",
+ ["mag" ]="magahi",
+ ["mah" ]="marshallese",
+ ["maj" ]="majang",
+ ["mak" ]="makhuwa",
+ ["mal" ]="malayalam reformed",
+ ["mam" ]="mam",
+ ["man" ]="mansi",
+ ["map" ]="mapudungun",
+ ["mar" ]="marathi",
+ ["maw" ]="marwari",
+ ["mbn" ]="mbundu",
+ ["mbo" ]="mbo",
+ ["mch" ]="manchu",
+ ["mcr" ]="moose cree",
+ ["mde" ]="mende",
+ ["mdr" ]="mandar",
+ ["men" ]="me'en",
+ ["mer" ]="meru",
+ ["mfa" ]="pattani malay",
+ ["mfe" ]="morisyen",
+ ["min" ]="minangkabau",
+ ["miz" ]="mizo",
+ ["mkd" ]="macedonian",
+ ["mkr" ]="makasar",
+ ["mkw" ]="kituba",
+ ["mle" ]="male",
+ ["mlg" ]="malagasy",
+ ["mln" ]="malinke",
+ ["mlr" ]="malayalam reformed",
+ ["mly" ]="malay",
+ ["mnd" ]="mandinka",
+ ["mng" ]="mongolian",
+ ["mni" ]="manipuri",
+ ["mnk" ]="maninka",
+ ["mnx" ]="manx",
+ ["moh" ]="mohawk",
+ ["mok" ]="moksha",
+ ["mol" ]="moldavian",
+ ["mon" ]="mon",
+ ["mor" ]="moroccan",
+ ["mos" ]="mossi",
+ ["mri" ]="maori",
+ ["mth" ]="maithili",
+ ["mts" ]="maltese",
+ ["mun" ]="mundari",
+ ["mus" ]="muscogee",
+ ["mwl" ]="mirandese",
+ ["mww" ]="hmong daw",
+ ["myn" ]="mayan",
+ ["mzn" ]="mazanderani",
+ ["nag" ]="naga-assamese",
+ ["nah" ]="nahuatl",
+ ["nan" ]="nanai",
+ ["nap" ]="neapolitan",
+ ["nas" ]="naskapi",
+ ["nau" ]="nauruan",
+ ["nav" ]="navajo",
+ ["ncr" ]="n-cree",
+ ["ndb" ]="ndebele",
+ ["ndc" ]="ndau",
+ ["ndg" ]="ndonga",
+ ["nds" ]="low saxon",
+ ["nep" ]="nepali",
+ ["new" ]="newari",
+ ["nga" ]="ngbaka",
+ ["ngr" ]="nagari",
+ ["nhc" ]="norway house cree",
+ ["nis" ]="nisi",
+ ["niu" ]="niuean",
+ ["nkl" ]="nyankole",
+ ["nko" ]="n'ko",
+ ["nld" ]="dutch",
+ ["noe" ]="nimadi",
+ ["nog" ]="nogai",
+ ["nor" ]="norwegian",
+ ["nov" ]="novial",
+ ["nsm" ]="northern sami",
+ ["nso" ]="sotho, northern",
+ ["nta" ]="northern tai",
+ ["nto" ]="esperanto",
+ ["nym" ]="nyamwezi",
+ ["nyn" ]="norwegian nynorsk",
+ ["nza" ]="mbembe tigon",
+ ["oci" ]="occitan",
+ ["ocr" ]="oji-cree",
+ ["ojb" ]="ojibway",
+ ["ori" ]="odia",
+ ["oro" ]="oromo",
+ ["oss" ]="ossetian",
+ ["paa" ]="palestinian aramaic",
+ ["pag" ]="pangasinan",
+ ["pal" ]="pali",
+ ["pam" ]="pampangan",
+ ["pan" ]="punjabi",
+ ["pap" ]="palpa",
+ ["pap0"]="papiamentu",
+ ["pas" ]="pashto",
+ ["pau" ]="palauan",
+ ["pcc" ]="bouyei",
+ ["pcd" ]="picard",
+ ["pdc" ]="pennsylvania german",
+ ["pgr" ]="polytonic greek",
+ ["phk" ]="phake",
+ ["pih" ]="norfolk",
+ ["pil" ]="filipino",
+ ["plg" ]="palaung",
+ ["plk" ]="polish",
+ ["pms" ]="piemontese",
+ ["pnb" ]="western panjabi",
+ ["poh" ]="pocomchi",
+ ["pon" ]="pohnpeian",
+ ["pro" ]="provencal",
+ ["ptg" ]="portuguese",
+ ["pwo" ]="western pwo karen",
+ ["qin" ]="chin",
+ ["quc" ]="k’iche’",
+ ["quh" ]="quechua (bolivia)",
+ ["quz" ]="quechua",
+ ["qvi" ]="quechua (ecuador)",
+ ["qwh" ]="quechua (peru)",
+ ["raj" ]="rajasthani",
+ ["rar" ]="rarotongan",
+ ["rbu" ]="russian buriat",
+ ["rcr" ]="r-cree",
+ ["rej" ]="rejang",
+ ["ria" ]="riang",
+ ["rif" ]="tarifit",
+ ["rit" ]="ritarungo",
+ ["rkw" ]="arakwal",
+ ["rms" ]="romansh",
+ ["rmy" ]="vlax romani",
+ ["rom" ]="romanian",
+ ["roy" ]="romany",
+ ["rsy" ]="rusyn",
+ ["rtm" ]="rotuman",
+ ["rua" ]="kinyarwanda",
+ ["run" ]="rundi",
+ ["rup" ]="aromanian",
+ ["rus" ]="russian",
+ ["sad" ]="sadri",
+ ["san" ]="sanskrit",
+ ["sas" ]="sasak",
+ ["sat" ]="santali",
+ ["say" ]="sayisi",
+ ["scn" ]="sicilian",
+ ["sco" ]="scots",
+ ["scs" ]="north slavey",
+ ["sek" ]="sekota",
+ ["sel" ]="selkup",
+ ["sga" ]="old irish",
+ ["sgo" ]="sango",
+ ["sgs" ]="samogitian",
+ ["shi" ]="tachelhit",
+ ["shn" ]="shan",
+ ["sib" ]="sibe",
+ ["sid" ]="sidamo",
+ ["sig" ]="silte gurage",
+ ["sks" ]="skolt sami",
+ ["sky" ]="slovak",
+ ["sla" ]="slavey",
+ ["slv" ]="slovenian",
+ ["sml" ]="somali",
+ ["smo" ]="samoan",
+ ["sna" ]="sena",
+ ["sna0"]="shona",
+ ["snd" ]="sindhi",
+ ["snh" ]="sinhala (sinhalese)",
+ ["snk" ]="soninke",
+ ["sog" ]="sodo gurage",
+ ["sop" ]="songe",
+ ["sot" ]="sotho, southern",
+ ["sqi" ]="albanian",
+ ["srb" ]="serbian",
+ ["srd" ]="sardinian",
+ ["srk" ]="saraiki",
+ ["srr" ]="serer",
+ ["ssl" ]="south slavey",
+ ["ssm" ]="southern sami",
+ ["stq" ]="saterland frisian",
+ ["suk" ]="sukuma",
+ ["sun" ]="sundanese",
+ ["sur" ]="suri",
+ ["sva" ]="svan",
+ ["sve" ]="swedish",
+ ["swa" ]="swadaya aramaic",
+ ["swk" ]="swahili",
+ ["swz" ]="swati",
+ ["sxt" ]="sutu",
+ ["sxu" ]="upper saxon",
+ ["syl" ]="sylheti",
+ ["syr" ]="syriac",
+ ["syre"]="estrangela syriac",
+ ["syrj"]="western syriac",
+ ["syrn"]="eastern syriac",
+ ["szl" ]="silesian",
+ ["tab" ]="tabasaran",
+ ["taj" ]="tajiki",
+ ["tam" ]="tamil",
+ ["tat" ]="tatar",
+ ["tcr" ]="th-cree",
+ ["tdd" ]="dehong dai",
+ ["tel" ]="telugu",
+ ["tet" ]="tetum",
+ ["tgl" ]="tagalog",
+ ["tgn" ]="tongan",
+ ["tgr" ]="tigre",
+ ["tgy" ]="tigrinya",
+ ["tha" ]="thai",
+ ["tht" ]="tahitian",
+ ["tib" ]="tibetan",
+ ["tiv" ]="tiv",
+ ["tkm" ]="turkmen",
+ ["tmh" ]="tamashek",
+ ["tmn" ]="temne",
+ ["tna" ]="tswana",
+ ["tne" ]="tundra nenets",
+ ["tng" ]="tonga",
+ ["tod" ]="todo",
+ ["tod0"]="toma",
+ ["tpi" ]="tok pisin",
+ ["trk" ]="turkish",
+ ["tsg" ]="tsonga",
+ ["tsj" ]="tshangla",
+ ["tua" ]="turoyo aramaic",
+ ["tul" ]="tulu",
+ ["tum" ]="tulu",
+ ["tuv" ]="tuvin",
+ ["tvl" ]="tuvalu",
+ ["twi" ]="twi",
+ ["tyz" ]="tày",
+ ["tzm" ]="tamazight",
+ ["tzo" ]="tzotzil",
+ ["udm" ]="udmurt",
+ ["ukr" ]="ukrainian",
+ ["umb" ]="umbundu",
+ ["urd" ]="urdu",
+ ["usb" ]="upper sorbian",
+ ["uyg" ]="uyghur",
+ ["uzb" ]="uzbek",
+ ["vec" ]="venetian",
+ ["ven" ]="venda",
+ ["vit" ]="vietnamese",
+ ["vol" ]="volapük",
+ ["vro" ]="võro",
+ ["wa" ]="wa",
+ ["wag" ]="wagdi",
+ ["war" ]="waray-waray",
+ ["wcr" ]="west-cree",
+ ["wel" ]="welsh",
+ ["wlf" ]="wolof",
+ ["wln" ]="walloon",
+ ["wtm" ]="mewati",
+ ["xbd" ]="lü",
+ ["xhs" ]="xhosa",
+ ["xjb" ]="minjangbal",
+ ["xkf" ]="khengkha",
+ ["xog" ]="soga",
+ ["xpe" ]="kpelle (liberia)",
+ ["yak" ]="sakha",
+ ["yao" ]="yao",
+ ["yap" ]="yapese",
+ ["yba" ]="yoruba",
+ ["ycr" ]="y-cree",
+ ["yic" ]="yi classic",
+ ["yim" ]="yi modern",
+ ["zea" ]="zealandic",
+ ["zgh" ]="standard morrocan tamazigh",
+ ["zha" ]="zhuang",
+ ["zhh" ]="chinese, hong kong sar",
+ ["zhp" ]="chinese phonetic",
+ ["zhs" ]="chinese simplified",
+ ["zht" ]="chinese traditional",
+ ["znd" ]="zande",
+ ["zul" ]="zulu",
+ ["zza" ]="zazaki",
+}
+local features=allocate {
+ ["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",
+ ["cfar"]="conjunct form after ro",
+ ["cjct"]="conjunct forms",
+ ["clig"]="contextual ligatures",
+ ["cpct"]="centered cjk punctuation",
+ ["cpsp"]="capital spacing",
+ ["cswh"]="contextual swash",
+ ["curs"]="cursive positioning",
+ ["dflt"]="default processing",
+ ["dist"]="distances",
+ ["dlig"]="discretionary ligatures",
+ ["dnom"]="denominators",
+ ["dtls"]="dotless forms",
+ ["expt"]="expert forms",
+ ["falt"]="final glyph alternates",
+ ["fin2"]="terminal forms #2",
+ ["fin3"]="terminal forms #3",
+ ["fina"]="terminal forms",
+ ["flac"]="flattened accents over capitals",
+ ["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",
+ ["ltra"]="left-to-right alternates",
+ ["ltrm"]="left-to-right mirrored 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",
+ ["pkna"]="proportional kana",
+ ["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",
+ ["rclt"]="required contextual alternates",
+ ["rkrf"]="rakar forms",
+ ["rlig"]="required ligatures",
+ ["rphf"]="reph form",
+ ["rtbd"]="right bounds",
+ ["rtla"]="right-to-left alternates",
+ ["rtlm"]="right to left mirrored forms",
+ ["rvrn"]="required variation alternates",
+ ["ruby"]="ruby notation forms",
+ ["salt"]="stylistic alternates",
+ ["sinf"]="scientific inferiors",
+ ["size"]="optical size",
+ ["smcp"]="small capitals",
+ ["smpl"]="simplified forms",
+ ["ssty"]="script style",
+ ["stch"]="stretching glyph decomposition",
+ ["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",
+ ["vrtr"]="vertical alternates for rotation",
+ ["vrt2"]="vertical rotation",
+ ["zero"]="slashed zero",
+ ["trep"]="traditional tex replacements",
+ ["tlig"]="traditional tex ligatures",
+ ["ss.."]="stylistic set ..",
+ ["cv.."]="character variant ..",
+ ["js.."]="justification ..",
+ ["dv.."]="devanagari ..",
+ ["ml.."]="malayalam ..",
+}
+local baselines=allocate {
+ ["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"]="mathematical centered baseline",
+ ["romn"]="roman baseline"
+}
+tables.scripts=scripts
+tables.languages=languages
+tables.features=features
+tables.baselines=baselines
+local acceptscripts=true directives.register("otf.acceptscripts",function(v) acceptscripts=v end)
+local acceptlanguages=true directives.register("otf.acceptlanguages",function(v) acceptlanguages=v end)
+local report_checks=logs.reporter("fonts","checks")
+if otffeatures.features then
+ for k,v in next,otffeatures.features do
+ features[k]=v
+ end
+ otffeatures.features=features
+end
+local function swapped(h)
+ local r={}
+ for k,v in next,h do
+ r[gsub(v,"[^a-z0-9]","")]=k
+ end
+ return r
+end
+local verbosescripts=allocate(swapped(scripts ))
+local verboselanguages=allocate(swapped(languages))
+local verbosefeatures=allocate(swapped(features ))
+local verbosebaselines=allocate(swapped(baselines))
+local function resolve(t,k)
+ if k then
+ k=gsub(lower(k),"[^a-z0-9]","")
+ local v=rawget(t,k)
+ if v then
+ return v
+ end
+ end
+end
+setmetatableindex(verbosescripts,resolve)
+setmetatableindex(verboselanguages,resolve)
+setmetatableindex(verbosefeatures,resolve)
+setmetatableindex(verbosebaselines,resolve)
+setmetatableindex(scripts,function(t,k)
+ if k then
+ k=lower(k)
+ if k=="dflt" then
+ return k
+ end
+ local v=rawget(t,k)
+ if v then
+ return v
+ end
+ k=gsub(k," ","")
+ v=rawget(t,v)
+ if v then
+ return v
+ elseif acceptscripts then
+ report_checks("registering extra script %a",k)
+ rawset(t,k,k)
+ return k
+ end
+ end
+ return "dflt"
+end)
+setmetatableindex(languages,function(t,k)
+ if k then
+ k=lower(k)
+ if k=="dflt" then
+ return k
+ end
+ local v=rawget(t,k)
+ if v then
+ return v
+ end
+ k=gsub(k," ","")
+ v=rawget(t,v)
+ if v then
+ return v
+ elseif acceptlanguages then
+ report_checks("registering extra language %a",k)
+ rawset(t,k,k)
+ return k
+ end
+ end
+ return "dflt"
+end)
+if setmetatablenewindex then
+ setmetatablenewindex(languages,"ignore")
+ setmetatablenewindex(scripts,"ignore")
+ setmetatablenewindex(baselines,"ignore")
+end
+local function resolve(t,k)
+ if k then
+ k=lower(k)
+ local v=rawget(t,k)
+ if v then
+ return v
+ end
+ k=gsub(k," ","")
+ local v=rawget(t,k)
+ if v then
+ return v
+ end
+ local tag,dd=match(k,"(..)(%d+)")
+ if tag and dd then
+ local v=rawget(t,tag)
+ if v then
+ return v
+ else
+ local v=rawget(t,tag.."..")
+ if v then
+ return (gsub(v,"%.%.",tonumber(dd)))
+ end
+ end
+ end
+ end
+ return k
+end
+setmetatableindex(features,resolve)
+local function assign(t,k,v)
+ if k and v then
+ v=lower(v)
+ rawset(t,k,v)
+ end
+end
+if setmetatablenewindex then
+ setmetatablenewindex(features,assign)
+end
+local checkers={
+ rand=function(v)
+ return v==true and "random" or v
+ end
+}
+if not storage then
+ return
+end
+local usedfeatures=statistics.usedfeatures or {}
+statistics.usedfeatures=usedfeatures
+table.setmetatableindex(usedfeatures,function(t,k) if k then local v={} t[k]=v return v end end)
+storage.register("fonts/otf/usedfeatures",usedfeatures,"fonts.handlers.otf.statistics.usedfeatures" )
+local normalizedaxis=otf.readers.helpers.normalizedaxis or function(s) return s end
+function otffeatures.normalize(features,wrap)
+ if features then
+ local h={}
+ for key,value in next,features do
+ local k=lower(key)
+ if k=="language" then
+ local v=gsub(lower(value),"[^a-z0-9]","")
+ h.language=rawget(verboselanguages,v) or (languages[v] and v) or "dflt"
+ elseif k=="script" then
+ local v=gsub(lower(value),"[^a-z0-9]","")
+ h.script=rawget(verbosescripts,v) or (scripts[v] and v) or "dflt"
+ elseif k=="axis" then
+ h[k]=normalizedaxis(value)
+ if not callbacks.supported.glyph_stream_provider then
+ h.variableshapes=true
+ end
+ else
+ local uk=usedfeatures[key]
+ local uv=uk[value]
+ if uv then
+ else
+ uv=tonumber(value)
+ if uv then
+ elseif type(value)=="string" then
+ local b=is_boolean(value)
+ if type(b)=="nil" then
+ if wrap and find(value,",") then
+ uv="{"..lower(value).."}"
+ else
+ uv=lower(value)
+ end
+ else
+ uv=b
+ end
+ elseif type(value)=="table" then
+ uv=sequenced(t,",")
+ else
+ uv=value
+ end
+ if not rawget(features,k) then
+ k=rawget(verbosefeatures,k) or k
+ end
+ local c=checkers[k]
+ if c then
+ uv=c(uv) or vc
+ end
+ uk[value]=uv
+ end
+ h[k]=uv
+ end
+ end
+ return h
+ end
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-ott”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-cff” 155821e11e84021437869ff973e75d93] ---
+
+if not modules then modules={} end modules ['font-cff']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local next,type,tonumber,rawget=next,type,tonumber,rawget
+local byte,char,gmatch,sub=string.byte,string.char,string.gmatch,string.sub
+local concat,remove,unpack=table.concat,table.remove,table.unpack
+local floor,abs,round,ceil,min,max=math.floor,math.abs,math.round,math.ceil,math.min,math.max
+local P,C,R,S,C,Cs,Ct=lpeg.P,lpeg.C,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Ct
+local lpegmatch=lpeg.match
+local formatters=string.formatters
+local bytetable=string.bytetable
+local idiv=number.idiv
+local rshift,band,extract=bit32.rshift,bit32.band,bit32.extract
+local readers=fonts.handlers.otf.readers
+local streamreader=readers.streamreader
+local readstring=streamreader.readstring
+local readbyte=streamreader.readcardinal1
+local readushort=streamreader.readcardinal2
+local readuint=streamreader.readcardinal3
+local readulong=streamreader.readcardinal4
+local setposition=streamreader.setposition
+local getposition=streamreader.getposition
+local readbytetable=streamreader.readbytetable
+directives.register("fonts.streamreader",function()
+ streamreader=utilities.streams
+ readstring=streamreader.readstring
+ readbyte=streamreader.readcardinal1
+ readushort=streamreader.readcardinal2
+ readuint=streamreader.readcardinal3
+ readulong=streamreader.readcardinal4
+ setposition=streamreader.setposition
+ getposition=streamreader.getposition
+ readbytetable=streamreader.readbytetable
+end)
+local setmetatableindex=table.setmetatableindex
+local trace_charstrings=false trackers.register("fonts.cff.charstrings",function(v) trace_charstrings=v end)
+local report=logs.reporter("otf reader","cff")
+local parsedictionaries
+local parsecharstring
+local parsecharstrings
+local resetcharstrings
+local parseprivates
+local startparsing
+local stopparsing
+local defaultstrings={ [0]=
+ ".notdef","space","exclam","quotedbl","numbersign","dollar","percent",
+ "ampersand","quoteright","parenleft","parenright","asterisk","plus",
+ "comma","hyphen","period","slash","zero","one","two","three","four",
+ "five","six","seven","eight","nine","colon","semicolon","less",
+ "equal","greater","question","at","A","B","C","D","E","F","G","H",
+ "I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W",
+ "X","Y","Z","bracketleft","backslash","bracketright","asciicircum",
+ "underscore","quoteleft","a","b","c","d","e","f","g","h","i","j",
+ "k","l","m","n","o","p","q","r","s","t","u","v","w","x","y",
+ "z","braceleft","bar","braceright","asciitilde","exclamdown","cent",
+ "sterling","fraction","yen","florin","section","currency",
+ "quotesingle","quotedblleft","guillemotleft","guilsinglleft",
+ "guilsinglright","fi","fl","endash","dagger","daggerdbl",
+ "periodcentered","paragraph","bullet","quotesinglbase","quotedblbase",
+ "quotedblright","guillemotright","ellipsis","perthousand","questiondown",
+ "grave","acute","circumflex","tilde","macron","breve","dotaccent",
+ "dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash",
+ "AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae",
+ "dotlessi","lslash","oslash","oe","germandbls","onesuperior",
+ "logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn",
+ "onequarter","divide","brokenbar","degree","thorn","threequarters",
+ "twosuperior","registered","minus","eth","multiply","threesuperior",
+ "copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring",
+ "Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave",
+ "Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute",
+ "Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute",
+ "Ucircumflex","Udieresis","Ugrave","Yacute","Ydieresis","Zcaron",
+ "aacute","acircumflex","adieresis","agrave","aring","atilde",
+ "ccedilla","eacute","ecircumflex","edieresis","egrave","iacute",
+ "icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex",
+ "odieresis","ograve","otilde","scaron","uacute","ucircumflex",
+ "udieresis","ugrave","yacute","ydieresis","zcaron","exclamsmall",
+ "Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall",
+ "Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader",
+ "onedotenleader","zerooldstyle","oneoldstyle","twooldstyle",
+ "threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle",
+ "sevenoldstyle","eightoldstyle","nineoldstyle","commasuperior",
+ "threequartersemdash","periodsuperior","questionsmall","asuperior",
+ "bsuperior","centsuperior","dsuperior","esuperior","isuperior",
+ "lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior",
+ "tsuperior","ff","ffi","ffl","parenleftinferior","parenrightinferior",
+ "Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall",
+ "Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall",
+ "Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall",
+ "Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall",
+ "Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah",
+ "Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall",
+ "Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall",
+ "Dotaccentsmall","Macronsmall","figuredash","hypheninferior",
+ "Ogoneksmall","Ringsmall","Cedillasmall","questiondownsmall","oneeighth",
+ "threeeighths","fiveeighths","seveneighths","onethird","twothirds",
+ "zerosuperior","foursuperior","fivesuperior","sixsuperior",
+ "sevensuperior","eightsuperior","ninesuperior","zeroinferior",
+ "oneinferior","twoinferior","threeinferior","fourinferior",
+ "fiveinferior","sixinferior","seveninferior","eightinferior",
+ "nineinferior","centinferior","dollarinferior","periodinferior",
+ "commainferior","Agravesmall","Aacutesmall","Acircumflexsmall",
+ "Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall",
+ "Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall",
+ "Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall",
+ "Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall",
+ "Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall",
+ "Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall",
+ "Thornsmall","Ydieresissmall","001.000","001.001","001.002","001.003",
+ "Black","Bold","Book","Light","Medium","Regular","Roman","Semibold",
+}
+local standardnames={ [0]=
+ false,false,false,false,false,false,false,false,false,false,false,
+ false,false,false,false,false,false,false,false,false,false,false,
+ false,false,false,false,false,false,false,false,false,false,
+ "space","exclam","quotedbl","numbersign","dollar","percent",
+ "ampersand","quoteright","parenleft","parenright","asterisk","plus",
+ "comma","hyphen","period","slash","zero","one","two","three","four",
+ "five","six","seven","eight","nine","colon","semicolon","less",
+ "equal","greater","question","at","A","B","C","D","E","F","G","H",
+ "I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W",
+ "X","Y","Z","bracketleft","backslash","bracketright","asciicircum",
+ "underscore","quoteleft","a","b","c","d","e","f","g","h","i","j",
+ "k","l","m","n","o","p","q","r","s","t","u","v","w","x","y",
+ "z","braceleft","bar","braceright","asciitilde",false,false,false,
+ false,false,false,false,false,false,false,false,false,false,false,
+ false,false,false,false,false,false,false,false,false,false,false,
+ false,false,false,false,false,false,false,false,false,"exclamdown",
+ "cent","sterling","fraction","yen","florin","section","currency",
+ "quotesingle","quotedblleft","guillemotleft","guilsinglleft",
+ "guilsinglright","fi","fl",false,"endash","dagger","daggerdbl",
+ "periodcentered",false,"paragraph","bullet","quotesinglbase",
+ "quotedblbase","quotedblright","guillemotright","ellipsis","perthousand",
+ false,"questiondown",false,"grave","acute","circumflex","tilde",
+ "macron","breve","dotaccent","dieresis",false,"ring","cedilla",false,
+ "hungarumlaut","ogonek","caron","emdash",false,false,false,false,
+ false,false,false,false,false,false,false,false,false,false,false,
+ false,"AE",false,"ordfeminine",false,false,false,false,"Lslash",
+ "Oslash","OE","ordmasculine",false,false,false,false,false,"ae",
+ false,false,false,"dotlessi",false,false,"lslash","oslash","oe",
+ "germandbls",false,false,false,false
+}
+local cffreaders={
+ readbyte,
+ readushort,
+ readuint,
+ readulong,
+}
+directives.register("fonts.streamreader",function()
+ cffreaders={
+ readbyte,
+ readushort,
+ readuint,
+ readulong,
+ }
+end)
+local function readheader(f)
+ local offset=getposition(f)
+ local major=readbyte(f)
+ local header={
+ offset=offset,
+ major=major,
+ minor=readbyte(f),
+ size=readbyte(f),
+ }
+ if major==1 then
+ header.dsize=readbyte(f)
+ elseif major==2 then
+ header.dsize=readushort(f)
+ else
+ end
+ setposition(f,offset+header.size)
+ return header
+end
+local function readlengths(f,longcount)
+ local count=longcount and readulong(f) or readushort(f)
+ if count==0 then
+ return {}
+ end
+ local osize=readbyte(f)
+ local read=cffreaders[osize]
+ if not read then
+ report("bad offset size: %i",osize)
+ return {}
+ end
+ local lengths={}
+ local previous=read(f)
+ for i=1,count do
+ local offset=read(f)
+ local length=offset-previous
+ if length<0 then
+ report("bad offset: %i",length)
+ length=0
+ end
+ lengths[i]=length
+ previous=offset
+ end
+ return lengths
+end
+local function readfontnames(f)
+ local names=readlengths(f)
+ for i=1,#names do
+ names[i]=readstring(f,names[i])
+ end
+ return names
+end
+local function readtopdictionaries(f)
+ local dictionaries=readlengths(f)
+ for i=1,#dictionaries do
+ dictionaries[i]=readstring(f,dictionaries[i])
+ end
+ return dictionaries
+end
+local function readstrings(f)
+ local lengths=readlengths(f)
+ local strings=setmetatableindex({},defaultstrings)
+ local index=#defaultstrings
+ for i=1,#lengths do
+ index=index+1
+ strings[index]=readstring(f,lengths[i])
+ end
+ return strings
+end
+do
+ local stack={}
+ local top=0
+ local result={}
+ local strings={}
+ local p_single=P("\00")/function()
+ result.version=strings[stack[top]] or "unset"
+ top=0
+ end+P("\01")/function()
+ result.notice=strings[stack[top]] or "unset"
+ top=0
+ end+P("\02")/function()
+ result.fullname=strings[stack[top]] or "unset"
+ top=0
+ end+P("\03")/function()
+ result.familyname=strings[stack[top]] or "unset"
+ top=0
+ end+P("\04")/function()
+ result.weight=strings[stack[top]] or "unset"
+ top=0
+ end+P("\05")/function()
+ result.fontbbox={ unpack(stack,1,4) }
+ top=0
+ end+P("\06")/function()
+ result.bluevalues={ unpack(stack,1,top) }
+ top=0
+ end+P("\07")/function()
+ result.otherblues={ unpack(stack,1,top) }
+ top=0
+ end+P("\08")/function()
+ result.familyblues={ unpack(stack,1,top) }
+ top=0
+ end+P("\09")/function()
+ result.familyotherblues={ unpack(stack,1,top) }
+ top=0
+ end+P("\10")/function()
+ result.strhw=stack[top]
+ top=0
+ end+P("\11")/function()
+ result.strvw=stack[top]
+ top=0
+ end+P("\13")/function()
+ result.uniqueid=stack[top]
+ top=0
+ end+P("\14")/function()
+ result.xuid=concat(stack,"",1,top)
+ top=0
+ end+P("\15")/function()
+ result.charset=stack[top]
+ top=0
+ end+P("\16")/function()
+ result.encoding=stack[top]
+ top=0
+ end+P("\17")/function()
+ result.charstrings=stack[top]
+ top=0
+ end+P("\18")/function()
+ result.private={
+ size=stack[top-1],
+ offset=stack[top],
+ }
+ top=0
+ end+P("\19")/function()
+ result.subroutines=stack[top]
+ top=0
+ end+P("\20")/function()
+ result.defaultwidthx=stack[top]
+ top=0
+ end+P("\21")/function()
+ result.nominalwidthx=stack[top]
+ top=0
+ end
++P("\24")/function()
+ result.vstore=stack[top]
+ top=0
+ end+P("\25")/function()
+ result.maxstack=stack[top]
+ top=0
+ end
+ local p_double=P("\12")*(
+ P("\00")/function()
+ result.copyright=stack[top]
+ top=0
+ end+P("\01")/function()
+ result.monospaced=stack[top]==1 and true or false
+ top=0
+ end+P("\02")/function()
+ result.italicangle=stack[top]
+ top=0
+ end+P("\03")/function()
+ result.underlineposition=stack[top]
+ top=0
+ end+P("\04")/function()
+ result.underlinethickness=stack[top]
+ top=0
+ end+P("\05")/function()
+ result.painttype=stack[top]
+ top=0
+ end+P("\06")/function()
+ result.charstringtype=stack[top]
+ top=0
+ end+P("\07")/function()
+ result.fontmatrix={ unpack(stack,1,6) }
+ top=0
+ end+P("\08")/function()
+ result.strokewidth=stack[top]
+ top=0
+ end+P("\09")/function()
+ result.bluescale=stack[top]
+ top=0
+ end+P("\10")/function()
+ result.bluesnap=stack[top]
+ top=0
+ end+P("\11")/function()
+ result.bluefuzz=stack[top]
+ top=0
+ end+P("\12")/function()
+ result.stemsnaph={ unpack(stack,1,top) }
+ top=0
+ end+P("\13")/function()
+ result.stemsnapv={ unpack(stack,1,top) }
+ top=0
+ end+P("\20")/function()
+ result.syntheticbase=stack[top]
+ top=0
+ end+P("\21")/function()
+ result.postscript=strings[stack[top]] or "unset"
+ top=0
+ end+P("\22")/function()
+ result.basefontname=strings[stack[top]] or "unset"
+ top=0
+ end+P("\21")/function()
+ result.basefontblend=stack[top]
+ top=0
+ end+P("\30")/function()
+ result.cid.registry=strings[stack[top-2]] or "unset"
+ result.cid.ordering=strings[stack[top-1]] or "unset"
+ result.cid.supplement=stack[top]
+ top=0
+ end+P("\31")/function()
+ result.cid.fontversion=stack[top]
+ top=0
+ end+P("\32")/function()
+ result.cid.fontrevision=stack[top]
+ top=0
+ end+P("\33")/function()
+ result.cid.fonttype=stack[top]
+ top=0
+ end+P("\34")/function()
+ result.cid.count=stack[top]
+ top=0
+ end+P("\35")/function()
+ result.cid.uidbase=stack[top]
+ top=0
+ end+P("\36")/function()
+ result.cid.fdarray=stack[top]
+ top=0
+ end+P("\37")/function()
+ result.cid.fdselect=stack[top]
+ top=0
+ end+P("\38")/function()
+ result.cid.fontname=strings[stack[top]] or "unset"
+ top=0
+ end
+ )
+ local remap={
+ ["\x00"]="00",["\x01"]="01",["\x02"]="02",["\x03"]="03",["\x04"]="04",["\x05"]="05",["\x06"]="06",["\x07"]="07",["\x08"]="08",["\x09"]="09",["\x0A"]="0.",["\x0B"]="0E",["\x0C"]="0E-",["\x0D"]="0",["\x0E"]="0-",["\x0F"]="0",
+ ["\x10"]="10",["\x11"]="11",["\x12"]="12",["\x13"]="13",["\x14"]="14",["\x15"]="15",["\x16"]="16",["\x17"]="17",["\x18"]="18",["\x19"]="19",["\x1A"]="1.",["\x1B"]="1E",["\x1C"]="1E-",["\x1D"]="1",["\x1E"]="1-",["\x1F"]="1",
+ ["\x20"]="20",["\x21"]="21",["\x22"]="22",["\x23"]="23",["\x24"]="24",["\x25"]="25",["\x26"]="26",["\x27"]="27",["\x28"]="28",["\x29"]="29",["\x2A"]="2.",["\x2B"]="2E",["\x2C"]="2E-",["\x2D"]="2",["\x2E"]="2-",["\x2F"]="2",
+ ["\x30"]="30",["\x31"]="31",["\x32"]="32",["\x33"]="33",["\x34"]="34",["\x35"]="35",["\x36"]="36",["\x37"]="37",["\x38"]="38",["\x39"]="39",["\x3A"]="3.",["\x3B"]="3E",["\x3C"]="3E-",["\x3D"]="3",["\x3E"]="3-",["\x3F"]="3",
+ ["\x40"]="40",["\x41"]="41",["\x42"]="42",["\x43"]="43",["\x44"]="44",["\x45"]="45",["\x46"]="46",["\x47"]="47",["\x48"]="48",["\x49"]="49",["\x4A"]="4.",["\x4B"]="4E",["\x4C"]="4E-",["\x4D"]="4",["\x4E"]="4-",["\x4F"]="4",
+ ["\x50"]="50",["\x51"]="51",["\x52"]="52",["\x53"]="53",["\x54"]="54",["\x55"]="55",["\x56"]="56",["\x57"]="57",["\x58"]="58",["\x59"]="59",["\x5A"]="5.",["\x5B"]="5E",["\x5C"]="5E-",["\x5D"]="5",["\x5E"]="5-",["\x5F"]="5",
+ ["\x60"]="60",["\x61"]="61",["\x62"]="62",["\x63"]="63",["\x64"]="64",["\x65"]="65",["\x66"]="66",["\x67"]="67",["\x68"]="68",["\x69"]="69",["\x6A"]="6.",["\x6B"]="6E",["\x6C"]="6E-",["\x6D"]="6",["\x6E"]="6-",["\x6F"]="6",
+ ["\x70"]="70",["\x71"]="71",["\x72"]="72",["\x73"]="73",["\x74"]="74",["\x75"]="75",["\x76"]="76",["\x77"]="77",["\x78"]="78",["\x79"]="79",["\x7A"]="7.",["\x7B"]="7E",["\x7C"]="7E-",["\x7D"]="7",["\x7E"]="7-",["\x7F"]="7",
+ ["\x80"]="80",["\x81"]="81",["\x82"]="82",["\x83"]="83",["\x84"]="84",["\x85"]="85",["\x86"]="86",["\x87"]="87",["\x88"]="88",["\x89"]="89",["\x8A"]="8.",["\x8B"]="8E",["\x8C"]="8E-",["\x8D"]="8",["\x8E"]="8-",["\x8F"]="8",
+ ["\x90"]="90",["\x91"]="91",["\x92"]="92",["\x93"]="93",["\x94"]="94",["\x95"]="95",["\x96"]="96",["\x97"]="97",["\x98"]="98",["\x99"]="99",["\x9A"]="9.",["\x9B"]="9E",["\x9C"]="9E-",["\x9D"]="9",["\x9E"]="9-",["\x9F"]="9",
+ ["\xA0"]=".0",["\xA1"]=".1",["\xA2"]=".2",["\xA3"]=".3",["\xA4"]=".4",["\xA5"]=".5",["\xA6"]=".6",["\xA7"]=".7",["\xA8"]=".8",["\xA9"]=".9",["\xAA"]="..",["\xAB"]=".E",["\xAC"]=".E-",["\xAD"]=".",["\xAE"]=".-",["\xAF"]=".",
+ ["\xB0"]="E0",["\xB1"]="E1",["\xB2"]="E2",["\xB3"]="E3",["\xB4"]="E4",["\xB5"]="E5",["\xB6"]="E6",["\xB7"]="E7",["\xB8"]="E8",["\xB9"]="E9",["\xBA"]="E.",["\xBB"]="EE",["\xBC"]="EE-",["\xBD"]="E",["\xBE"]="E-",["\xBF"]="E",
+ ["\xC0"]="E-0",["\xC1"]="E-1",["\xC2"]="E-2",["\xC3"]="E-3",["\xC4"]="E-4",["\xC5"]="E-5",["\xC6"]="E-6",["\xC7"]="E-7",["\xC8"]="E-8",["\xC9"]="E-9",["\xCA"]="E-.",["\xCB"]="E-E",["\xCC"]="E-E-",["\xCD"]="E-",["\xCE"]="E--",["\xCF"]="E-",
+ ["\xD0"]="-0",["\xD1"]="-1",["\xD2"]="-2",["\xD3"]="-3",["\xD4"]="-4",["\xD5"]="-5",["\xD6"]="-6",["\xD7"]="-7",["\xD8"]="-8",["\xD9"]="-9",["\xDA"]="-.",["\xDB"]="-E",["\xDC"]="-E-",["\xDD"]="-",["\xDE"]="--",["\xDF"]="-",
+ }
+ local p_last=S("\x0F\x1F\x2F\x3F\x4F\x5F\x6F\x7F\x8F\x9F\xAF\xBF")+R("\xF0\xFF")
+ local p_nibbles=P("\30")*Cs(((1-p_last)/remap)^0*(P(1)/remap))/function(n)
+ top=top+1
+ stack[top]=tonumber(n) or 0
+ end
+ local p_byte=C(R("\32\246"))/function(b0)
+ top=top+1
+ stack[top]=byte(b0)-139
+ end
+ local p_positive=C(R("\247\250"))*C(1)/function(b0,b1)
+ top=top+1
+ stack[top]=(byte(b0)-247)*256+byte(b1)+108
+ end
+ local p_negative=C(R("\251\254"))*C(1)/function(b0,b1)
+ top=top+1
+ stack[top]=-(byte(b0)-251)*256-byte(b1)-108
+ end
+ local p_short=P("\28")*C(1)*C(1)/function(b1,b2)
+ top=top+1
+ local n=0x100*byte(b1)+byte(b2)
+ if n>=0x8000 then
+ stack[top]=n-0xFFFF-1
+ else
+ stack[top]=n
+ end
+ end
+ local p_long=P("\29")*C(1)*C(1)*C(1)*C(1)/function(b1,b2,b3,b4)
+ top=top+1
+ local n=0x1000000*byte(b1)+0x10000*byte(b2)+0x100*byte(b3)+byte(b4)
+ if n>=0x8000000 then
+ stack[top]=n-0xFFFFFFFF-1
+ else
+ stack[top]=n
+ end
+ end
+ local p_unsupported=P(1)/function(detail)
+ top=0
+ end
+ local p_dictionary=(
+ p_byte+p_positive+p_negative+p_short+p_long+p_nibbles+p_single+p_double+p_unsupported
+ )^1
+ parsedictionaries=function(data,dictionaries,what)
+ stack={}
+ strings=data.strings
+ for i=1,#dictionaries do
+ top=0
+ result=what=="cff" and {
+ monospaced=false,
+ italicangle=0,
+ underlineposition=-100,
+ underlinethickness=50,
+ painttype=0,
+ charstringtype=2,
+ fontmatrix={ 0.001,0,0,0.001,0,0 },
+ fontbbox={ 0,0,0,0 },
+ strokewidth=0,
+ charset=0,
+ encoding=0,
+ cid={
+ fontversion=0,
+ fontrevision=0,
+ fonttype=0,
+ count=8720,
+ }
+ } or {
+ charstringtype=2,
+ charset=0,
+ vstore=0,
+ cid={
+ },
+ }
+ lpegmatch(p_dictionary,dictionaries[i])
+ dictionaries[i]=result
+ end
+ result={}
+ top=0
+ stack={}
+ end
+ parseprivates=function(data,dictionaries)
+ stack={}
+ strings=data.strings
+ for i=1,#dictionaries do
+ local private=dictionaries[i].private
+ if private and private.data then
+ top=0
+ result={
+ forcebold=false,
+ languagegroup=0,
+ expansionfactor=0.06,
+ initialrandomseed=0,
+ subroutines=0,
+ defaultwidthx=0,
+ nominalwidthx=0,
+ cid={
+ },
+ }
+ lpegmatch(p_dictionary,private.data)
+ private.data=result
+ end
+ end
+ result={}
+ top=0
+ stack={}
+ end
+ local x=0
+ local y=0
+ local width=false
+ local lsb=0
+ local r=0
+ local stems=0
+ local globalbias=0
+ local localbias=0
+ local nominalwidth=0
+ local defaultwidth=0
+ local charset=false
+ local globals=false
+ local locals=false
+ local depth=1
+ local xmin=0
+ local xmax=0
+ local ymin=0
+ local ymax=0
+ local checked=false
+ local keepcurve=false
+ local version=2
+ local regions=false
+ local nofregions=0
+ local region=false
+ local factors=false
+ local axis=false
+ local vsindex=0
+ local justpass=false
+ local seacs={}
+ local procidx=nil
+ local function showstate(where)
+ report("%w%-10s : [%s] n=%i",depth*2,where,concat(stack," ",1,top),top)
+ end
+ local function showvalue(where,value,showstack)
+ if showstack then
+ report("%w%-10s : %s : [%s] n=%i",depth*2,where,tostring(value),concat(stack," ",1,top),top)
+ else
+ report("%w%-10s : %s",depth*2,where,tostring(value))
+ end
+ end
+ local function xymoveto()
+ if keepcurve then
+ r=r+1
+ result[r]={ x,y,"m" }
+ end
+ if checked then
+ if x>xmax then xmax=x elseif xymax then ymax=y elseif yxmax then
+ xmax=x
+ elseif xymax then
+ ymax=y
+ elseif yxmax then xmax=x elseif xymax then ymax=y elseif yxmax then
+ xmax=x
+ elseif xymax then
+ ymax=y
+ elseif yxmax then xmax=x1 elseif x1ymax then ymax=y1 elseif y1xmax then xmax=x2 elseif x2ymax then ymax=y2 elseif y2xmax then xmax=x3 elseif x3ymax then ymax=y3 elseif y32 then
+ width=stack[1]
+ if trace_charstrings then
+ showvalue("backtrack width",width)
+ end
+ else
+ width=true
+ end
+ end
+ if trace_charstrings then
+ showstate("rmoveto")
+ end
+ x=x+stack[top-1]
+ y=y+stack[top]
+ top=0
+ xymoveto()
+ end
+ local function hmoveto()
+ if not width then
+ if top>1 then
+ width=stack[1]
+ if trace_charstrings then
+ showvalue("backtrack width",width)
+ end
+ else
+ width=true
+ end
+ end
+ if trace_charstrings then
+ showstate("hmoveto")
+ end
+ x=x+stack[top]
+ top=0
+ xmoveto()
+ end
+ local function vmoveto()
+ if not width then
+ if top>1 then
+ width=stack[1]
+ if trace_charstrings then
+ showvalue("backtrack width",width)
+ end
+ else
+ width=true
+ end
+ end
+ if trace_charstrings then
+ showstate("vmoveto")
+ end
+ y=y+stack[top]
+ top=0
+ ymoveto()
+ end
+ local function rlineto()
+ if trace_charstrings then
+ showstate("rlineto")
+ end
+ for i=1,top,2 do
+ x=x+stack[i]
+ y=y+stack[i+1]
+ xylineto()
+ end
+ top=0
+ end
+ local function hlineto()
+ if trace_charstrings then
+ showstate("hlineto")
+ end
+ if top==1 then
+ x=x+stack[1]
+ xlineto()
+ else
+ local swap=true
+ for i=1,top do
+ if swap then
+ x=x+stack[i]
+ xlineto()
+ swap=false
+ else
+ y=y+stack[i]
+ ylineto()
+ swap=true
+ end
+ end
+ end
+ top=0
+ end
+ local function vlineto()
+ if trace_charstrings then
+ showstate("vlineto")
+ end
+ if top==1 then
+ y=y+stack[1]
+ ylineto()
+ else
+ local swap=false
+ for i=1,top do
+ if swap then
+ x=x+stack[i]
+ xlineto()
+ swap=false
+ else
+ y=y+stack[i]
+ ylineto()
+ swap=true
+ end
+ end
+ end
+ top=0
+ end
+ local function rrcurveto()
+ if trace_charstrings then
+ showstate("rrcurveto")
+ end
+ for i=1,top,6 do
+ local ax=x+stack[i]
+ local ay=y+stack[i+1]
+ local bx=ax+stack[i+2]
+ local by=ay+stack[i+3]
+ x=bx+stack[i+4]
+ y=by+stack[i+5]
+ xycurveto(ax,ay,bx,by,x,y)
+ end
+ top=0
+ end
+ local function hhcurveto()
+ if trace_charstrings then
+ showstate("hhcurveto")
+ end
+ local s=1
+ if top%2~=0 then
+ y=y+stack[1]
+ s=2
+ end
+ for i=s,top,4 do
+ local ax=x+stack[i]
+ local ay=y
+ local bx=ax+stack[i+1]
+ local by=ay+stack[i+2]
+ x=bx+stack[i+3]
+ y=by
+ xycurveto(ax,ay,bx,by,x,y)
+ end
+ top=0
+ end
+ local function vvcurveto()
+ if trace_charstrings then
+ showstate("vvcurveto")
+ end
+ local s=1
+ local d=0
+ if top%2~=0 then
+ d=stack[1]
+ s=2
+ end
+ for i=s,top,4 do
+ local ax=x+d
+ local ay=y+stack[i]
+ local bx=ax+stack[i+1]
+ local by=ay+stack[i+2]
+ x=bx
+ y=by+stack[i+3]
+ xycurveto(ax,ay,bx,by,x,y)
+ d=0
+ end
+ top=0
+ end
+ local function xxcurveto(swap)
+ local last=top%4~=0 and stack[top]
+ if last then
+ top=top-1
+ end
+ for i=1,top,4 do
+ local ax,ay,bx,by
+ if swap then
+ ax=x+stack[i]
+ ay=y
+ bx=ax+stack[i+1]
+ by=ay+stack[i+2]
+ y=by+stack[i+3]
+ if last and i+3==top then
+ x=bx+last
+ else
+ x=bx
+ end
+ swap=false
+ else
+ ax=x
+ ay=y+stack[i]
+ bx=ax+stack[i+1]
+ by=ay+stack[i+2]
+ x=bx+stack[i+3]
+ if last and i+3==top then
+ y=by+last
+ else
+ y=by
+ end
+ swap=true
+ end
+ xycurveto(ax,ay,bx,by,x,y)
+ end
+ top=0
+ end
+ local function hvcurveto()
+ if trace_charstrings then
+ showstate("hvcurveto")
+ end
+ xxcurveto(true)
+ end
+ local function vhcurveto()
+ if trace_charstrings then
+ showstate("vhcurveto")
+ end
+ xxcurveto(false)
+ end
+ local function rcurveline()
+ if trace_charstrings then
+ showstate("rcurveline")
+ end
+ for i=1,top-2,6 do
+ local ax=x+stack[i]
+ local ay=y+stack[i+1]
+ local bx=ax+stack[i+2]
+ local by=ay+stack[i+3]
+ x=bx+stack[i+4]
+ y=by+stack[i+5]
+ xycurveto(ax,ay,bx,by,x,y)
+ end
+ x=x+stack[top-1]
+ y=y+stack[top]
+ xylineto()
+ top=0
+ end
+ local function rlinecurve()
+ if trace_charstrings then
+ showstate("rlinecurve")
+ end
+ if top>6 then
+ for i=1,top-6,2 do
+ x=x+stack[i]
+ y=y+stack[i+1]
+ xylineto()
+ end
+ end
+ local ax=x+stack[top-5]
+ local ay=y+stack[top-4]
+ local bx=ax+stack[top-3]
+ local by=ay+stack[top-2]
+ x=bx+stack[top-1]
+ y=by+stack[top]
+ xycurveto(ax,ay,bx,by,x,y)
+ top=0
+ end
+ local function flex()
+ if trace_charstrings then
+ showstate("flex")
+ end
+ local ax=x+stack[1]
+ local ay=y+stack[2]
+ local bx=ax+stack[3]
+ local by=ay+stack[4]
+ local cx=bx+stack[5]
+ local cy=by+stack[6]
+ xycurveto(ax,ay,bx,by,cx,cy)
+ local dx=cx+stack[7]
+ local dy=cy+stack[8]
+ local ex=dx+stack[9]
+ local ey=dy+stack[10]
+ x=ex+stack[11]
+ y=ey+stack[12]
+ xycurveto(dx,dy,ex,ey,x,y)
+ top=0
+ end
+ local function hflex()
+ if trace_charstrings then
+ showstate("hflex")
+ end
+ local ax=x+stack[1]
+ local ay=y
+ local bx=ax+stack[2]
+ local by=ay+stack[3]
+ local cx=bx+stack[4]
+ local cy=by
+ xycurveto(ax,ay,bx,by,cx,cy)
+ local dx=cx+stack[5]
+ local dy=by
+ local ex=dx+stack[6]
+ local ey=y
+ x=ex+stack[7]
+ xycurveto(dx,dy,ex,ey,x,y)
+ top=0
+ end
+ local function hflex1()
+ if trace_charstrings then
+ showstate("hflex1")
+ end
+ local ax=x+stack[1]
+ local ay=y+stack[2]
+ local bx=ax+stack[3]
+ local by=ay+stack[4]
+ local cx=bx+stack[5]
+ local cy=by
+ xycurveto(ax,ay,bx,by,cx,cy)
+ local dx=cx+stack[6]
+ local dy=by
+ local ex=dx+stack[7]
+ local ey=dy+stack[8]
+ x=ex+stack[9]
+ xycurveto(dx,dy,ex,ey,x,y)
+ top=0
+ end
+ local function flex1()
+ if trace_charstrings then
+ showstate("flex1")
+ end
+ local ax=x+stack[1]
+ local ay=y+stack[2]
+ local bx=ax+stack[3]
+ local by=ay+stack[4]
+ local cx=bx+stack[5]
+ local cy=by+stack[6]
+ xycurveto(ax,ay,bx,by,cx,cy)
+ local dx=cx+stack[7]
+ local dy=cy+stack[8]
+ local ex=dx+stack[9]
+ local ey=dy+stack[10]
+ if abs(ex-x)>abs(ey-y) then
+ x=ex+stack[11]
+ else
+ y=ey+stack[11]
+ end
+ xycurveto(dx,dy,ex,ey,x,y)
+ top=0
+ end
+ local function getstem()
+ if top==0 then
+ elseif top%2~=0 then
+ if width then
+ remove(stack,1)
+ else
+ width=remove(stack,1)
+ if trace_charstrings then
+ showvalue("width",width)
+ end
+ end
+ top=top-1
+ end
+ if trace_charstrings then
+ showstate("stem")
+ end
+ stems=stems+idiv(top,2)
+ top=0
+ end
+ local function getmask()
+ if top==0 then
+ elseif top%2~=0 then
+ if width then
+ remove(stack,1)
+ else
+ width=remove(stack,1)
+ if trace_charstrings then
+ showvalue("width",width)
+ end
+ end
+ top=top-1
+ end
+ if trace_charstrings then
+ showstate(operator==19 and "hintmark" or "cntrmask")
+ end
+ stems=stems+idiv(top,2)
+ top=0
+ if stems==0 then
+ elseif stems<=8 then
+ return 1
+ else
+ return idiv(stems+7,8)
+ end
+ end
+ local function unsupported(t)
+ if trace_charstrings then
+ showstate("unsupported "..t)
+ end
+ top=0
+ end
+ local function unsupportedsub(t)
+ if trace_charstrings then
+ showstate("unsupported sub "..t)
+ end
+ top=0
+ end
+ local function getstem3()
+ if trace_charstrings then
+ showstate("stem3")
+ end
+ top=0
+ end
+ local function divide()
+ if version=="cff" then
+ local d=stack[top]
+ top=top-1
+ stack[top]=stack[top]/d
+ end
+ end
+ local function closepath()
+ if version=="cff" then
+ if trace_charstrings then
+ showstate("closepath")
+ end
+ end
+ top=0
+ end
+ local function hsbw()
+ if version=="cff" then
+ if trace_charstrings then
+ showstate("hsbw")
+ end
+ lsb=stack[top-1] or 0
+ width=stack[top]
+ end
+ top=0
+ end
+ local function sbw()
+ if version=="cff" then
+ if trace_charstrings then
+ showstate("sbw")
+ end
+ lsb=stack[top-3]
+ width=stack[top-1]
+ end
+ top=0
+ end
+ local function seac()
+ if version=="cff" then
+ if trace_charstrings then
+ showstate("seac")
+ end
+ end
+ top=0
+ end
+ local popped=3
+ local hints=3
+ local function callothersubr()
+ if version=="cff" then
+ if trace_charstrings then
+ showstate("callothersubr")
+ end
+ if stack[top]==hints then
+ popped=stack[top-2]
+ else
+ popped=3
+ end
+ local t=stack[top-1]
+ if t then
+ top=top-(t+2)
+ if top<0 then
+ top=0
+ end
+ else
+ top=0
+ end
+ else
+ top=0
+ end
+ end
+ local function pop()
+ if version=="cff" then
+ if trace_charstrings then
+ showstate("pop")
+ end
+ top=top+1
+ stack[top]=popped
+ else
+ top=0
+ end
+ end
+ local function setcurrentpoint()
+ if version=="cff" then
+ if trace_charstrings then
+ showstate("setcurrentpoint (unsupported)")
+ end
+ x=x+stack[top-1]
+ y=y+stack[top]
+ end
+ top=0
+ end
+ local reginit=false
+ local function updateregions(n)
+ if regions then
+ local current=regions[n] or regions[1]
+ nofregions=#current
+ if axis and n~=reginit then
+ factors={}
+ for i=1,nofregions do
+ local region=current[i]
+ local s=1
+ for j=1,#axis do
+ local f=axis[j]
+ local r=region[j]
+ local start=r.start
+ local peak=r.peak
+ local stop=r.stop
+ if start>peak or peak>stop then
+ elseif start<0 and stop>0 and peak~=0 then
+ elseif peak==0 then
+ elseif fstop then
+ s=0
+ break
+ elseif fpeak then
+ s=s*(stop-f)/(stop-peak)
+ else
+ end
+ end
+ factors[i]=s
+ end
+ end
+ end
+ reginit=n
+ end
+ local function setvsindex()
+ local vsindex=stack[top]
+ if trace_charstrings then
+ showstate(formatters["vsindex %i"](vsindex))
+ end
+ updateregions(vsindex)
+ top=top-1
+ end
+ local function blend()
+ local n=stack[top]
+ top=top-1
+ if axis then
+ if trace_charstrings then
+ local t=top-nofregions*n
+ local m=t-n
+ for i=1,n do
+ local k=m+i
+ local d=m+n+(i-1)*nofregions
+ local old=stack[k]
+ local new=old
+ for r=1,nofregions do
+ new=new+stack[d+r]*factors[r]
+ end
+ stack[k]=new
+ showstate(formatters["blend %i of %i: %s -> %s"](i,n,old,new))
+ end
+ top=t
+ elseif n==1 then
+ top=top-nofregions
+ local v=stack[top]
+ for r=1,nofregions do
+ v=v+stack[top+r]*factors[r]
+ end
+ stack[top]=v
+ else
+ top=top-nofregions*n
+ local d=top
+ local k=top-n
+ for i=1,n do
+ k=k+1
+ local v=stack[k]
+ for r=1,nofregions do
+ v=v+stack[d+r]*factors[r]
+ end
+ stack[k]=v
+ d=d+nofregions
+ end
+ end
+ else
+ end
+ end
+ local actions={ [0]=unsupported,
+ getstem,
+ unsupported,
+ getstem,
+ vmoveto,
+ rlineto,
+ hlineto,
+ vlineto,
+ rrcurveto,
+ unsupported,
+ unsupported,
+ unsupported,
+ unsupported,
+ hsbw,
+ unsupported,
+ setvsindex,
+ blend,
+ unsupported,
+ getstem,
+ getmask,
+ getmask,
+ rmoveto,
+ hmoveto,
+ getstem,
+ rcurveline,
+ rlinecurve,
+ vvcurveto,
+ hhcurveto,
+ unsupported,
+ unsupported,
+ vhcurveto,
+ hvcurveto,
+ }
+ local reverse={ [0]="unsupported",
+ "getstem",
+ "unsupported",
+ "getstem",
+ "vmoveto",
+ "rlineto",
+ "hlineto",
+ "vlineto",
+ "rrcurveto",
+ "unsupported",
+ "unsupported",
+ "unsupported",
+ "unsupported",
+ "hsbw",
+ "unsupported",
+ "setvsindex",
+ "blend",
+ "unsupported",
+ "getstem",
+ "getmask",
+ "getmask",
+ "rmoveto",
+ "hmoveto",
+ "getstem",
+ "rcurveline",
+ "rlinecurve",
+ "vvcurveto",
+ "hhcurveto",
+ "unsupported",
+ "unsupported",
+ "vhcurveto",
+ "hvcurveto",
+ }
+ local subactions={
+ [000]=dotsection,
+ [001]=getstem3,
+ [002]=getstem3,
+ [006]=seac,
+ [007]=sbw,
+ [012]=divide,
+ [016]=callothersubr,
+ [017]=pop,
+ [033]=setcurrentpoint,
+ [034]=hflex,
+ [035]=flex,
+ [036]=hflex1,
+ [037]=flex1,
+ }
+ local chars=setmetatableindex(function (t,k)
+ local v=char(k)
+ t[k]=v
+ return v
+ end)
+ local c_endchar=chars[14]
+ local encode={}
+ setmetatableindex(encode,function(t,i)
+ for i=-2048,-1130 do
+ t[i]=char(28,band(rshift(i,8),0xFF),band(i,0xFF))
+ end
+ for i=-1131,-108 do
+ local v=0xFB00-i-108
+ t[i]=char(band(rshift(v,8),0xFF),band(v,0xFF))
+ end
+ for i=-107,107 do
+ t[i]=chars[i+139]
+ end
+ for i=108,1131 do
+ local v=0xF700+i-108
+ t[i]=char(extract(v,8,8),extract(v,0,8))
+ end
+ for i=1132,2048 do
+ t[i]=char(28,band(rshift(i,8),0xFF),band(i,0xFF))
+ end
+ setmetatableindex(encode,function(t,k)
+ local r=round(k)
+ local v=rawget(t,r)
+ if v then
+ return v
+ end
+ local v1=floor(k)
+ local v2=floor((k-v1)*0x10000)
+ return char(255,extract(v1,8,8),extract(v1,0,8),extract(v2,8,8),extract(v2,0,8))
+ end)
+ return t[i]
+ end)
+ readers.cffencoder=encode
+ local function p_setvsindex()
+ local vsindex=stack[top]
+ updateregions(vsindex)
+ top=top-1
+ end
+ local function p_blend()
+ local n=stack[top]
+ top=top-1
+ if not axis then
+ elseif n==1 then
+ top=top-nofregions
+ local v=stack[top]
+ for r=1,nofregions do
+ v=v+stack[top+r]*factors[r]
+ end
+ stack[top]=round(v)
+ else
+ top=top-nofregions*n
+ local d=top
+ local k=top-n
+ for i=1,n do
+ k=k+1
+ local v=stack[k]
+ for r=1,nofregions do
+ v=v+stack[d+r]*factors[r]
+ end
+ stack[k]=round(v)
+ d=d+nofregions
+ end
+ end
+ end
+ local function p_getstem()
+ local n=0
+ if top%2~=0 then
+ n=1
+ end
+ if top>n then
+ stems=stems+idiv(top-n,2)
+ end
+ end
+ local function p_getmask()
+ local n=0
+ if top%2~=0 then
+ n=1
+ end
+ if top>n then
+ stems=stems+idiv(top-n,2)
+ end
+ if stems==0 then
+ return 0
+ elseif stems<=8 then
+ return 1
+ else
+ return idiv(stems+7,8)
+ end
+ end
+ local process
+ local function call(scope,list,bias)
+ depth=depth+1
+ if top==0 then
+ showstate(formatters["unknown %s call %s, case %s"](scope,"?",1))
+ top=0
+ else
+ local index=stack[top]+bias
+ top=top-1
+ if trace_charstrings then
+ showvalue(scope,index,true)
+ end
+ local tab=list[index]
+ if tab then
+ process(tab)
+ else
+ showstate(formatters["unknown %s call %s, case %s"](scope,index,2))
+ top=0
+ end
+ end
+ depth=depth-1
+ end
+ process=function(tab)
+ local i=1
+ local n=#tab
+ while i<=n do
+ local t=tab[i]
+ if t>=32 then
+ top=top+1
+ if t<=246 then
+ stack[top]=t-139
+ i=i+1
+ elseif t<=250 then
+ stack[top]=t*256-63124+tab[i+1]
+ i=i+2
+ elseif t<=254 then
+ stack[top]=-t*256+64148-tab[i+1]
+ i=i+2
+ else
+ local n=0x100*tab[i+1]+tab[i+2]
+ if n>=0x8000 then
+ stack[top]=n-0x10000+(0x100*tab[i+3]+tab[i+4])/0xFFFF
+ else
+ stack[top]=n+(0x100*tab[i+3]+tab[i+4])/0xFFFF
+ end
+ i=i+5
+ end
+ elseif t==28 then
+ top=top+1
+ local n=0x100*tab[i+1]+tab[i+2]
+ if n>=0x8000 then
+ stack[top]=n-0x10000
+ else
+ stack[top]=n
+ end
+ i=i+3
+ elseif t==11 then
+ if trace_charstrings then
+ showstate("return")
+ end
+ return
+ elseif t==10 then
+ call("local",locals,localbias)
+ i=i+1
+ elseif t==14 then
+ if width then
+ elseif top>0 then
+ width=stack[1]
+ if trace_charstrings then
+ showvalue("width",width)
+ end
+ else
+ width=true
+ end
+ if trace_charstrings then
+ showstate("endchar")
+ end
+ return
+ elseif t==29 then
+ call("global",globals,globalbias)
+ i=i+1
+ elseif t==12 then
+ i=i+1
+ local t=tab[i]
+ if justpass then
+ if t>=34 and t<=37 then
+ for i=1,top do
+ r=r+1;result[r]=encode[stack[i]]
+ end
+ r=r+1;result[r]=chars[12]
+ r=r+1;result[r]=chars[t]
+ top=0
+ elseif t==6 then
+ seacs[procidx]={
+ asb=stack[1],
+ adx=stack[2],
+ ady=stack[3],
+ base=stack[4],
+ accent=stack[5],
+ width=width,
+ lsb=lsb,
+ }
+ top=0
+ else
+ local a=subactions[t]
+ if a then
+ a(t)
+ else
+ top=0
+ end
+ end
+ else
+ local a=subactions[t]
+ if a then
+ a(t)
+ else
+ if trace_charstrings then
+ showvalue("",t)
+ end
+ top=0
+ end
+ end
+ i=i+1
+ elseif justpass then
+ if t==15 then
+ p_setvsindex()
+ i=i+1
+ elseif t==16 then
+ local s=p_blend() or 0
+ i=i+s+1
+ elseif t==1 or t==3 or t==18 or operation==23 then
+ p_getstem()
+ if true then
+ if top>0 then
+ for i=1,top do
+ r=r+1;result[r]=encode[stack[i]]
+ end
+ top=0
+ end
+ r=r+1;result[r]=chars[t]
+ else
+ top=0
+ end
+ i=i+1
+ elseif t==19 or t==20 then
+ local s=p_getmask() or 0
+ if true then
+ if top>0 then
+ for i=1,top do
+ r=r+1;result[r]=encode[stack[i]]
+ end
+ top=0
+ end
+ r=r+1;result[r]=chars[t]
+ for j=1,s do
+ i=i+1
+ r=r+1;result[r]=chars[tab[i]]
+ end
+ else
+ i=i+s
+ top=0
+ end
+ i=i+1
+ elseif t==9 then
+ top=0
+ i=i+1
+ elseif t==13 then
+ hsbw()
+ if version=="cff" then
+ r=r+1;result[r]=encode[lsb]
+ r=r+1;result[r]=chars[22]
+ else
+ end
+ i=i+1
+ else
+ if trace_charstrings then
+ showstate(reverse[t] or "")
+ end
+ if top>0 then
+ for i=1,top do
+ r=r+1;result[r]=encode[stack[i]]
+ end
+ top=0
+ end
+ r=r+1;result[r]=chars[t]
+ i=i+1
+ end
+ else
+ local a=actions[t]
+ if a then
+ local s=a(t)
+ if s then
+ i=i+s+1
+ else
+ i=i+1
+ end
+ else
+ if trace_charstrings then
+ showstate(reverse[t] or "")
+ end
+ top=0
+ i=i+1
+ end
+ end
+ end
+ end
+ local function setbias(globals,locals,nobias)
+ if nobias then
+ return 0,0
+ else
+ local g=#globals
+ local l=#locals
+ return
+ ((g<1240 and 107) or (g<33900 and 1131) or 32768)+1,
+ ((l<1240 and 107) or (l<33900 and 1131) or 32768)+1
+ end
+ end
+ local function processshape(tab,index,hack)
+ if not tab then
+ glyphs[index]={
+ boundingbox={ 0,0,0,0 },
+ width=0,
+ name=charset and charset[index] or nil,
+ }
+ return
+ end
+ tab=bytetable(tab)
+ x=0
+ y=0
+ width=false
+ lsb=0
+ r=0
+ top=0
+ stems=0
+ result={}
+ popped=3
+ procidx=index
+ xmin=0
+ xmax=0
+ ymin=0
+ ymax=0
+ checked=false
+ if trace_charstrings then
+ report("glyph: %i",index)
+ report("data : % t",tab)
+ end
+ if regions then
+ updateregions(vsindex)
+ end
+ process(tab)
+ if hack then
+ return x,y
+ end
+ local boundingbox={
+ round(xmin),
+ round(ymin),
+ round(xmax),
+ round(ymax),
+ }
+ if width==true or width==false then
+ width=defaultwidth
+ else
+ width=nominalwidth+width
+ end
+ local glyph=glyphs[index]
+ if justpass then
+ r=r+1
+ result[r]=c_endchar
+ local stream=concat(result)
+ if glyph then
+ glyph.stream=stream
+ else
+ glyphs[index]={ stream=stream }
+ end
+ elseif glyph then
+ glyph.segments=keepcurve~=false and result or nil
+ glyph.boundingbox=boundingbox
+ if not glyph.width then
+ glyph.width=width
+ end
+ if charset and not glyph.name then
+ glyph.name=charset[index]
+ end
+ elseif keepcurve then
+ glyphs[index]={
+ segments=result,
+ boundingbox=boundingbox,
+ width=width,
+ name=charset and charset[index] or nil,
+ }
+ else
+ glyphs[index]={
+ boundingbox=boundingbox,
+ width=width,
+ name=charset and charset[index] or nil,
+ }
+ end
+ if trace_charstrings then
+ report("width : %s",tostring(width))
+ report("boundingbox: % t",boundingbox)
+ end
+ end
+ startparsing=function(fontdata,data,streams)
+ reginit=false
+ axis=false
+ regions=data.regions
+ justpass=streams==true
+ popped=3
+ seacs={}
+ if regions then
+ regions={ regions }
+ axis=data.factors or false
+ end
+ end
+ stopparsing=function(fontdata,data)
+ stack={}
+ glyphs=false
+ result={}
+ top=0
+ locals=false
+ globals=false
+ strings=false
+ popped=3
+ seacs={}
+ end
+ local function setwidths(private)
+ if not private then
+ return 0,0
+ end
+ local privatedata=private.data
+ if not privatedata then
+ return 0,0
+ end
+ return privatedata.nominalwidthx or 0,privatedata.defaultwidthx or 0
+ end
+ parsecharstrings=function(fontdata,data,glphs,doshapes,tversion,streams,nobias)
+ local dictionary=data.dictionaries[1]
+ local charstrings=dictionary.charstrings
+ keepcurve=doshapes
+ version=tversion
+ strings=data.strings
+ globals=data.routines or {}
+ locals=dictionary.subroutines or {}
+ charset=dictionary.charset
+ vsindex=dictionary.vsindex or 0
+ glyphs=glphs or {}
+ globalbias,localbias=setbias(globals,locals,nobias)
+ nominalwidth,defaultwidth=setwidths(dictionary.private)
+ if charstrings then
+ startparsing(fontdata,data,streams)
+ for index=1,#charstrings do
+ processshape(charstrings[index],index-1)
+ end
+ if justpass and next(seacs) then
+ local charset=data.dictionaries[1].charset
+ if charset then
+ local lookup=table.swapped(charset)
+ for index,v in next,seacs do
+ local bindex=lookup[standardnames[v.base]]
+ local aindex=lookup[standardnames[v.accent]]
+ local bglyph=bindex and glyphs[bindex]
+ local aglyph=aindex and glyphs[aindex]
+ if bglyph and aglyph then
+ local jp=justpass
+ justpass=false
+ local x,y=processshape(charstrings[bindex+1],bindex,true)
+ justpass=jp
+ local base=bglyph.stream
+ local accent=aglyph.stream
+ local moveto=encode[-x-v.asb+v.adx]..chars[22]..encode[-y+v.ady]..chars[ 4]
+ base=sub(base,1,#base-1)
+ glyphs[index].stream=base..moveto..accent
+ end
+ end
+ end
+ end
+ stopparsing(fontdata,data)
+ else
+ report("no charstrings")
+ end
+ return glyphs
+ end
+ parsecharstring=function(fontdata,data,dictionary,tab,glphs,index,doshapes,tversion,streams)
+ keepcurve=doshapes
+ version=tversion
+ strings=data.strings
+ globals=data.routines or {}
+ locals=dictionary.subroutines or {}
+ charset=false
+ vsindex=dictionary.vsindex or 0
+ glyphs=glphs or {}
+ justpass=streams==true
+ seacs={}
+ globalbias,localbias=setbias(globals,locals,nobias)
+ nominalwidth,defaultwidth=setwidths(dictionary.private)
+ processshape(tab,index-1)
+ end
+end
+local function readglobals(f,data)
+ local routines=readlengths(f)
+ for i=1,#routines do
+ routines[i]=readbytetable(f,routines[i])
+ end
+ data.routines=routines
+end
+local function readencodings(f,data)
+ data.encodings={}
+end
+local function readcharsets(f,data,dictionary)
+ local header=data.header
+ local strings=data.strings
+ local nofglyphs=data.nofglyphs
+ local charsetoffset=dictionary.charset
+ if charsetoffset and charsetoffset~=0 then
+ setposition(f,header.offset+charsetoffset)
+ local format=readbyte(f)
+ local charset={ [0]=".notdef" }
+ dictionary.charset=charset
+ if format==0 then
+ for i=1,nofglyphs do
+ charset[i]=strings[readushort(f)]
+ end
+ elseif format==1 or format==2 then
+ local readcount=format==1 and readbyte or readushort
+ local i=1
+ while i<=nofglyphs do
+ local sid=readushort(f)
+ local n=readcount(f)
+ for s=sid,sid+n do
+ charset[i]=strings[s]
+ i=i+1
+ if i>nofglyphs then
+ break
+ end
+ end
+ end
+ else
+ report("cff parser: unsupported charset format %a",format)
+ end
+ else
+ dictionary.nocharset=true
+ dictionary.charset=nil
+ end
+end
+local function readprivates(f,data)
+ local header=data.header
+ local dictionaries=data.dictionaries
+ local private=dictionaries[1].private
+ if private then
+ setposition(f,header.offset+private.offset)
+ private.data=readstring(f,private.size)
+ end
+end
+local function readlocals(f,data,dictionary)
+ local header=data.header
+ local private=dictionary.private
+ if private then
+ local subroutineoffset=private.data.subroutines
+ if subroutineoffset~=0 then
+ setposition(f,header.offset+private.offset+subroutineoffset)
+ local subroutines=readlengths(f)
+ for i=1,#subroutines do
+ subroutines[i]=readbytetable(f,subroutines[i])
+ end
+ dictionary.subroutines=subroutines
+ private.data.subroutines=nil
+ else
+ dictionary.subroutines={}
+ end
+ else
+ dictionary.subroutines={}
+ end
+end
+local function readcharstrings(f,data,what)
+ local header=data.header
+ local dictionaries=data.dictionaries
+ local dictionary=dictionaries[1]
+ local stringtype=dictionary.charstringtype
+ local offset=dictionary.charstrings
+ if type(offset)~="number" then
+ elseif stringtype==2 then
+ setposition(f,header.offset+offset)
+ local charstrings=readlengths(f,what=="cff2")
+ local nofglyphs=#charstrings
+ for i=1,nofglyphs do
+ charstrings[i]=readstring(f,charstrings[i])
+ end
+ data.nofglyphs=nofglyphs
+ dictionary.charstrings=charstrings
+ else
+ report("unsupported charstr type %i",stringtype)
+ data.nofglyphs=0
+ dictionary.charstrings={}
+ end
+end
+local function readcidprivates(f,data)
+ local header=data.header
+ local dictionaries=data.dictionaries[1].cid.dictionaries
+ for i=1,#dictionaries do
+ local dictionary=dictionaries[i]
+ local private=dictionary.private
+ if private then
+ setposition(f,header.offset+private.offset)
+ private.data=readstring(f,private.size)
+ end
+ end
+ parseprivates(data,dictionaries)
+end
+readers.parsecharstrings=parsecharstrings
+local function readnoselect(f,fontdata,data,glyphs,doshapes,version,streams)
+ local dictionaries=data.dictionaries
+ local dictionary=dictionaries[1]
+ readglobals(f,data)
+ readcharstrings(f,data,version)
+ if version=="cff2" then
+ dictionary.charset=nil
+ else
+ readencodings(f,data)
+ readcharsets(f,data,dictionary)
+ end
+ readprivates(f,data)
+ parseprivates(data,data.dictionaries)
+ readlocals(f,data,dictionary)
+ startparsing(fontdata,data,streams)
+ parsecharstrings(fontdata,data,glyphs,doshapes,version,streams)
+ stopparsing(fontdata,data)
+end
+local function readfdselect(f,fontdata,data,glyphs,doshapes,version,streams)
+ local header=data.header
+ local dictionaries=data.dictionaries
+ local dictionary=dictionaries[1]
+ local cid=dictionary.cid
+ local cidselect=cid and cid.fdselect
+ readglobals(f,data)
+ readcharstrings(f,data,version)
+ if version~="cff2" then
+ readencodings(f,data)
+ end
+ local charstrings=dictionary.charstrings
+ local fdindex={}
+ local nofglyphs=data.nofglyphs
+ local maxindex=-1
+ setposition(f,header.offset+cidselect)
+ local format=readbyte(f)
+ if format==1 then
+ for i=0,nofglyphs do
+ local index=readbyte(f)
+ fdindex[i]=index
+ if index>maxindex then
+ maxindex=index
+ end
+ end
+ elseif format==3 then
+ local nofranges=readushort(f)
+ local first=readushort(f)
+ local index=readbyte(f)
+ while true do
+ local last=readushort(f)
+ if index>maxindex then
+ maxindex=index
+ end
+ for i=first,last do
+ fdindex[i]=index
+ end
+ if last>=nofglyphs then
+ break
+ else
+ first=last+1
+ index=readbyte(f)
+ end
+ end
+ else
+ end
+ if maxindex>=0 then
+ local cidarray=cid.fdarray
+ if cidarray then
+ setposition(f,header.offset+cidarray)
+ local dictionaries=readlengths(f)
+ for i=1,#dictionaries do
+ dictionaries[i]=readstring(f,dictionaries[i])
+ end
+ parsedictionaries(data,dictionaries)
+ cid.dictionaries=dictionaries
+ readcidprivates(f,data)
+ for i=1,#dictionaries do
+ readlocals(f,data,dictionaries[i])
+ end
+ startparsing(fontdata,data,streams)
+ for i=1,#charstrings do
+ parsecharstring(fontdata,data,dictionaries[fdindex[i]+1],charstrings[i],glyphs,i,doshapes,version,streams)
+ end
+ stopparsing(fontdata,data)
+ else
+ report("no cid array")
+ end
+ end
+end
+local gotodatatable=readers.helpers.gotodatatable
+local function cleanup(data,dictionaries)
+end
+function readers.cff(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"cff",specification.details or specification.glyphs)
+ if tableoffset then
+ local header=readheader(f)
+ if header.major~=1 then
+ report("only version %s is supported for table %a",1,"cff")
+ return
+ end
+ local glyphs=fontdata.glyphs
+ local names=readfontnames(f)
+ local dictionaries=readtopdictionaries(f)
+ local strings=readstrings(f)
+ local data={
+ header=header,
+ names=names,
+ dictionaries=dictionaries,
+ strings=strings,
+ nofglyphs=fontdata.nofglyphs,
+ }
+ parsedictionaries(data,dictionaries,"cff")
+ local dic=dictionaries[1]
+ local cid=dic.cid
+ local cffinfo={
+ familyname=dic.familyname,
+ fullname=dic.fullname,
+ boundingbox=dic.boundingbox,
+ weight=dic.weight,
+ italicangle=dic.italicangle,
+ underlineposition=dic.underlineposition,
+ underlinethickness=dic.underlinethickness,
+ defaultwidth=dic.defaultwidthx,
+ nominalwidth=dic.nominalwidthx,
+ monospaced=dic.monospaced,
+ }
+ fontdata.cidinfo=cid and {
+ registry=cid.registry,
+ ordering=cid.ordering,
+ supplement=cid.supplement,
+ }
+ fontdata.cffinfo=cffinfo
+ local all=specification.shapes or specification.streams or false
+ if specification.glyphs or all then
+ if cid and cid.fdselect then
+ readfdselect(f,fontdata,data,glyphs,all,"cff",specification.streams)
+ else
+ readnoselect(f,fontdata,data,glyphs,all,"cff",specification.streams)
+ end
+ end
+ local private=dic.private
+ if private then
+ local data=private.data
+ if type(data)=="table" then
+ cffinfo.defaultwidth=data.defaultwidthx or cffinfo.defaultwidth
+ cffinfo.nominalwidth=data.nominalwidthx or cffinfo.nominalwidth
+ cffinfo.bluevalues=data.bluevalues
+ cffinfo.otherblues=data.otherblues
+ cffinfo.familyblues=data.familyblues
+ cffinfo.familyotherblues=data.familyotherblues
+ cffinfo.bluescale=data.bluescale
+ cffinfo.blueshift=data.blueshift
+ cffinfo.bluefuzz=data.bluefuzz
+ cffinfo.stdhw=data.stdhw
+ cffinfo.stdvw=data.stdvw
+ end
+ end
+ cleanup(data,dictionaries)
+ end
+end
+function readers.cff2(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"cff2",specification.glyphs)
+ if tableoffset then
+ local header=readheader(f)
+ if header.major~=2 then
+ report("only version %s is supported for table %a",2,"cff2")
+ return
+ end
+ local glyphs=fontdata.glyphs
+ local dictionaries={ readstring(f,header.dsize) }
+ local data={
+ header=header,
+ dictionaries=dictionaries,
+ nofglyphs=fontdata.nofglyphs,
+ }
+ parsedictionaries(data,dictionaries,"cff2")
+ local offset=dictionaries[1].vstore
+ if offset>0 then
+ local storeoffset=dictionaries[1].vstore+data.header.offset+2
+ local regions,deltas=readers.helpers.readvariationdata(f,storeoffset,factors)
+ data.regions=regions
+ data.deltas=deltas
+ else
+ data.regions={}
+ data.deltas={}
+ end
+ data.factors=specification.factors
+ local cid=data.dictionaries[1].cid
+ local all=specification.shapes or specification.streams or false
+ if cid and cid.fdselect then
+ readfdselect(f,fontdata,data,glyphs,all,"cff2",specification.streams)
+ else
+ readnoselect(f,fontdata,data,glyphs,all,"cff2",specification.streams)
+ end
+ cleanup(data,dictionaries)
+ end
+end
+function readers.cffcheck(filename)
+ local f=io.open(filename,"rb")
+ if f then
+ local fontdata={
+ glyphs={},
+ }
+ local header=readheader(f)
+ if header.major~=1 then
+ report("only version %s is supported for table %a",1,"cff")
+ return
+ end
+ local names=readfontnames(f)
+ local dictionaries=readtopdictionaries(f)
+ local strings=readstrings(f)
+ local glyphs={}
+ local data={
+ header=header,
+ names=names,
+ dictionaries=dictionaries,
+ strings=strings,
+ glyphs=glyphs,
+ nofglyphs=0,
+ }
+ parsedictionaries(data,dictionaries,"cff")
+ local cid=data.dictionaries[1].cid
+ if cid and cid.fdselect then
+ readfdselect(f,fontdata,data,glyphs,false)
+ else
+ readnoselect(f,fontdata,data,glyphs,false)
+ end
+ return data
+ end
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-cff”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-ttf” 44e61cef50dab9b1aaf48130f9367c34] ---
+
+if not modules then modules={} end modules ['font-ttf']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local next,type,unpack=next,type,unpack
+local band,rshift=bit32.band,bit32.rshift
+local sqrt,round=math.sqrt,math.round
+local char,rep=string.char,string.rep
+local concat=table.concat
+local idiv=number.idiv
+local setmetatableindex=table.setmetatableindex
+local report=logs.reporter("otf reader","ttf")
+local trace_deltas=false
+local readers=fonts.handlers.otf.readers
+local streamreader=readers.streamreader
+local setposition=streamreader.setposition
+local getposition=streamreader.getposition
+local skipbytes=streamreader.skip
+local readbyte=streamreader.readcardinal1
+local readushort=streamreader.readcardinal2
+local readulong=streamreader.readcardinal4
+local readchar=streamreader.readinteger1
+local readshort=streamreader.readinteger2
+local read2dot14=streamreader.read2dot14
+local readinteger=streamreader.readinteger1
+local readcardinaltable=streamreader.readcardinaltable
+local readintegertable=streamreader.readintegertable
+directives.register("fonts.streamreader",function()
+ streamreader=utilities.streams
+ setposition=streamreader.setposition
+ getposition=streamreader.getposition
+ skipbytes=streamreader.skip
+ readbyte=streamreader.readcardinal1
+ readushort=streamreader.readcardinal2
+ readulong=streamreader.readcardinal4
+ readchar=streamreader.readinteger1
+ readshort=streamreader.readinteger2
+ read2dot14=streamreader.read2dot14
+ readinteger=streamreader.readinteger1
+ readcardinaltable=streamreader.readcardinaltable
+ readintegertable=streamreader.readintegertable
+end)
+local short=2
+local ushort=2
+local ulong=4
+local helpers=readers.helpers
+local gotodatatable=helpers.gotodatatable
+local function mergecomposites(glyphs,shapes)
+ local function merge(index,shape,components)
+ local contours={}
+ local points={}
+ local nofcontours=0
+ local nofpoints=0
+ local offset=0
+ local deltas=shape.deltas
+ for i=1,#components do
+ local component=components[i]
+ local subindex=component.index
+ local subshape=shapes[subindex]
+ local subcontours=subshape.contours
+ local subpoints=subshape.points
+ if not subcontours then
+ local subcomponents=subshape.components
+ if subcomponents then
+ subcontours,subpoints=merge(subindex,subshape,subcomponents)
+ end
+ end
+ if subpoints then
+ local matrix=component.matrix
+ local xscale=matrix[1]
+ local xrotate=matrix[2]
+ local yrotate=matrix[3]
+ local yscale=matrix[4]
+ local xoffset=matrix[5]
+ local yoffset=matrix[6]
+ local count=#subpoints
+ if xscale==1 and yscale==1 and xrotate==0 and yrotate==0 then
+ for i=1,count do
+ local p=subpoints[i]
+ nofpoints=nofpoints+1
+ points[nofpoints]={
+ p[1]+xoffset,
+ p[2]+yoffset,
+ p[3]
+ }
+ end
+ else
+ for i=1,count do
+ local p=subpoints[i]
+ local x=p[1]
+ local y=p[2]
+ nofpoints=nofpoints+1
+ points[nofpoints]={
+ xscale*x+xrotate*y+xoffset,
+ yscale*y+yrotate*x+yoffset,
+ p[3]
+ }
+ end
+ end
+ local subcount=#subcontours
+ if subcount==1 then
+ nofcontours=nofcontours+1
+ contours[nofcontours]=offset+subcontours[1]
+ else
+ for i=1,#subcontours do
+ nofcontours=nofcontours+1
+ contours[nofcontours]=offset+subcontours[i]
+ end
+ end
+ offset=offset+count
+ else
+ report("missing contours composite %s, component %s of %s, glyph %s",index,i,#components,subindex)
+ end
+ end
+ shape.points=points
+ shape.contours=contours
+ shape.components=nil
+ return contours,points
+ end
+ for index=0,#glyphs-1 do
+ local shape=shapes[index]
+ if shape then
+ local components=shape.components
+ if components then
+ merge(index,shape,components)
+ end
+ end
+ end
+end
+local function readnothing(f)
+ return {
+ type="nothing",
+ }
+end
+local function curveto(m_x,m_y,l_x,l_y,r_x,r_y)
+ return
+ l_x+2/3*(m_x-l_x),l_y+2/3*(m_y-l_y),
+ r_x+2/3*(m_x-r_x),r_y+2/3*(m_y-r_y),
+ r_x,r_y,"c"
+end
+local function applyaxis(glyph,shape,deltas,dowidth)
+ local points=shape.points
+ if points then
+ local nofpoints=#points
+ local h=nofpoints+2
+ local l=nofpoints+1
+ local dw=0
+ local dl=0
+ for i=1,#deltas do
+ local deltaset=deltas[i]
+ local xvalues=deltaset.xvalues
+ local yvalues=deltaset.yvalues
+ local dpoints=deltaset.points
+ local factor=deltaset.factor
+ if dpoints then
+ local nofdpoints=#dpoints
+ for i=1,nofdpoints do
+ local d=dpoints[i]
+ local p=points[d]
+ if p then
+ if xvalues then
+ local x=xvalues[i]
+ if x and x~=0 then
+ p[1]=p[1]+factor*x
+ end
+ end
+ if yvalues then
+ local y=yvalues[i]
+ if y and y~=0 then
+ p[2]=p[2]+factor*y
+ end
+ end
+ elseif dowidth then
+ if d==h then
+ local x=xvalues[i]
+ if x then
+ dw=dw+factor*x
+ end
+ elseif d==l then
+ local x=xvalues[i]
+ if x then
+ dl=dl+factor*x
+ end
+ end
+ end
+ end
+ else
+ for i=1,nofpoints do
+ local p=points[i]
+ if xvalues then
+ local x=xvalues[i]
+ if x and x~=0 then
+ p[1]=p[1]+factor*x
+ end
+ end
+ if yvalues then
+ local y=yvalues[i]
+ if y and y~=0 then
+ p[2]=p[2]+factor*y
+ end
+ end
+ end
+ if dowidth then
+ local x=xvalues[h]
+ if x then
+ dw=dw+factor*x
+ end
+ local x=xvalues[l]
+ if x then
+ dl=dl+factor*x
+ end
+ end
+ end
+ end
+ if dowidth then
+ local width=glyph.width or 0
+ glyph.width=width+dw-dl
+ end
+ else
+ report("no points for glyph %a",glyph.name)
+ end
+end
+local quadratic=false
+local function contours2outlines_normal(glyphs,shapes)
+ for index=0,#glyphs-1 do
+ local shape=shapes[index]
+ if shape then
+ local glyph=glyphs[index]
+ local contours=shape.contours
+ local points=shape.points
+ if contours then
+ local nofcontours=#contours
+ local segments={}
+ local nofsegments=0
+ glyph.segments=segments
+ if nofcontours>0 then
+ local px=0
+ local py=0
+ local first=1
+ for i=1,nofcontours do
+ local last=contours[i]
+ if last>=first then
+ local first_pt=points[first]
+ local first_on=first_pt[3]
+ if first==last then
+ first_pt[3]="m"
+ nofsegments=nofsegments+1
+ segments[nofsegments]=first_pt
+ else
+ local first_on=first_pt[3]
+ local last_pt=points[last]
+ local last_on=last_pt[3]
+ local start=1
+ local control_pt=false
+ if first_on then
+ start=2
+ else
+ if last_on then
+ first_pt=last_pt
+ else
+ first_pt={ (first_pt[1]+last_pt[1])/2,(first_pt[2]+last_pt[2])/2,false }
+ end
+ control_pt=first_pt
+ end
+ local x=first_pt[1]
+ local y=first_pt[2]
+ if not done then
+ xmin=x
+ ymin=y
+ xmax=x
+ ymax=y
+ done=true
+ end
+ nofsegments=nofsegments+1
+ segments[nofsegments]={ x,y,"m" }
+ if not quadratic then
+ px=x
+ py=y
+ end
+ local previous_pt=first_pt
+ for i=first,last do
+ local current_pt=points[i]
+ local current_on=current_pt[3]
+ local previous_on=previous_pt[3]
+ if previous_on then
+ if current_on then
+ local x,y=current_pt[1],current_pt[2]
+ nofsegments=nofsegments+1
+ segments[nofsegments]={ x,y,"l" }
+ if not quadratic then
+ px,py=x,y
+ end
+ else
+ control_pt=current_pt
+ end
+ elseif current_on then
+ local x1=control_pt[1]
+ local y1=control_pt[2]
+ local x2=current_pt[1]
+ local y2=current_pt[2]
+ nofsegments=nofsegments+1
+ if quadratic then
+ segments[nofsegments]={ x1,y1,x2,y2,"q" }
+ else
+ x1,y1,x2,y2,px,py=curveto(x1,y1,px,py,x2,y2)
+ segments[nofsegments]={ x1,y1,x2,y2,px,py,"c" }
+ end
+ control_pt=false
+ else
+ local x2=(previous_pt[1]+current_pt[1])/2
+ local y2=(previous_pt[2]+current_pt[2])/2
+ local x1=control_pt[1]
+ local y1=control_pt[2]
+ nofsegments=nofsegments+1
+ if quadratic then
+ segments[nofsegments]={ x1,y1,x2,y2,"q" }
+ else
+ x1,y1,x2,y2,px,py=curveto(x1,y1,px,py,x2,y2)
+ segments[nofsegments]={ x1,y1,x2,y2,px,py,"c" }
+ end
+ control_pt=current_pt
+ end
+ previous_pt=current_pt
+ end
+ if first_pt==last_pt then
+ else
+ nofsegments=nofsegments+1
+ local x2=first_pt[1]
+ local y2=first_pt[2]
+ if not control_pt then
+ segments[nofsegments]={ x2,y2,"l" }
+ elseif quadratic then
+ local x1=control_pt[1]
+ local y1=control_pt[2]
+ segments[nofsegments]={ x1,y1,x2,y2,"q" }
+ else
+ local x1=control_pt[1]
+ local y1=control_pt[2]
+ x1,y1,x2,y2,px,py=curveto(x1,y1,px,py,x2,y2)
+ segments[nofsegments]={ x1,y1,x2,y2,px,py,"c" }
+ end
+ end
+ end
+ end
+ first=last+1
+ end
+ end
+ end
+ end
+ end
+end
+local function contours2outlines_shaped(glyphs,shapes,keepcurve)
+ for index=0,#glyphs-1 do
+ local shape=shapes[index]
+ if shape then
+ local glyph=glyphs[index]
+ local contours=shape.contours
+ local points=shape.points
+ if contours then
+ local nofcontours=#contours
+ local segments=keepcurve and {} or nil
+ local nofsegments=0
+ if keepcurve then
+ glyph.segments=segments
+ end
+ if nofcontours>0 then
+ local xmin,ymin,xmax,ymax,done=0,0,0,0,false
+ local px,py=0,0
+ local first=1
+ for i=1,nofcontours do
+ local last=contours[i]
+ if last>=first then
+ local first_pt=points[first]
+ local first_on=first_pt[3]
+ if first==last then
+ if keepcurve then
+ first_pt[3]="m"
+ nofsegments=nofsegments+1
+ segments[nofsegments]=first_pt
+ end
+ else
+ local first_on=first_pt[3]
+ local last_pt=points[last]
+ local last_on=last_pt[3]
+ local start=1
+ local control_pt=false
+ if first_on then
+ start=2
+ else
+ if last_on then
+ first_pt=last_pt
+ else
+ first_pt={ (first_pt[1]+last_pt[1])/2,(first_pt[2]+last_pt[2])/2,false }
+ end
+ control_pt=first_pt
+ end
+ local x=first_pt[1]
+ local y=first_pt[2]
+ if not done then
+ xmin,ymin,xmax,ymax=x,y,x,y
+ done=true
+ else
+ if xxmax then xmax=x end
+ if yymax then ymax=y end
+ end
+ if keepcurve then
+ nofsegments=nofsegments+1
+ segments[nofsegments]={ x,y,"m" }
+ end
+ if not quadratic then
+ px=x
+ py=y
+ end
+ local previous_pt=first_pt
+ for i=first,last do
+ local current_pt=points[i]
+ local current_on=current_pt[3]
+ local previous_on=previous_pt[3]
+ if previous_on then
+ if current_on then
+ local x=current_pt[1]
+ local y=current_pt[2]
+ if xxmax then xmax=x end
+ if yymax then ymax=y end
+ if keepcurve then
+ nofsegments=nofsegments+1
+ segments[nofsegments]={ x,y,"l" }
+ end
+ if not quadratic then
+ px=x
+ py=y
+ end
+ else
+ control_pt=current_pt
+ end
+ elseif current_on then
+ local x1=control_pt[1]
+ local y1=control_pt[2]
+ local x2=current_pt[1]
+ local y2=current_pt[2]
+ if quadratic then
+ if x1xmax then xmax=x1 end
+ if y1ymax then ymax=y1 end
+ if keepcurve then
+ nofsegments=nofsegments+1
+ segments[nofsegments]={ x1,y1,x2,y2,"q" }
+ end
+ else
+ x1,y1,x2,y2,px,py=curveto(x1,y1,px,py,x2,y2)
+ if x1xmax then xmax=x1 end
+ if y1ymax then ymax=y1 end
+ if x2xmax then xmax=x2 end
+ if y2ymax then ymax=y2 end
+ if pxxmax then xmax=px end
+ if pyymax then ymax=py end
+ if keepcurve then
+ nofsegments=nofsegments+1
+ segments[nofsegments]={ x1,y1,x2,y2,px,py,"c" }
+ end
+ end
+ control_pt=false
+ else
+ local x2=(previous_pt[1]+current_pt[1])/2
+ local y2=(previous_pt[2]+current_pt[2])/2
+ local x1=control_pt[1]
+ local y1=control_pt[2]
+ if quadratic then
+ if x1xmax then xmax=x1 end
+ if y1ymax then ymax=y1 end
+ if keepcurve then
+ nofsegments=nofsegments+1
+ segments[nofsegments]={ x1,y1,x2,y2,"q" }
+ end
+ else
+ x1,y1,x2,y2,px,py=curveto(x1,y1,px,py,x2,y2)
+ if x1xmax then xmax=x1 end
+ if y1ymax then ymax=y1 end
+ if x2xmax then xmax=x2 end
+ if y2ymax then ymax=y2 end
+ if pxxmax then xmax=px end
+ if pyymax then ymax=py end
+ if keepcurve then
+ nofsegments=nofsegments+1
+ segments[nofsegments]={ x1,y1,x2,y2,px,py,"c" }
+ end
+ end
+ control_pt=current_pt
+ end
+ previous_pt=current_pt
+ end
+ if first_pt==last_pt then
+ elseif not control_pt then
+ if keepcurve then
+ nofsegments=nofsegments+1
+ segments[nofsegments]={ first_pt[1],first_pt[2],"l" }
+ end
+ else
+ local x1=control_pt[1]
+ local y1=control_pt[2]
+ local x2=first_pt[1]
+ local y2=first_pt[2]
+ if x1xmax then xmax=x1 end
+ if y1ymax then ymax=y1 end
+ if quadratic then
+ if keepcurve then
+ nofsegments=nofsegments+1
+ segments[nofsegments]={ x1,y1,x2,y2,"q" }
+ end
+ else
+ x1,y1,x2,y2,px,py=curveto(x1,y1,px,py,x2,y2)
+ if x2xmax then xmax=x2 end
+ if y2ymax then ymax=y2 end
+ if pxxmax then xmax=px end
+ if pyymax then ymax=py end
+ if keepcurve then
+ nofsegments=nofsegments+1
+ segments[nofsegments]={ x1,y1,x2,y2,px,py,"c" }
+ end
+ end
+ end
+ end
+ end
+ first=last+1
+ end
+ glyph.boundingbox={ round(xmin),round(ymin),round(xmax),round(ymax) }
+ end
+ end
+ end
+ end
+end
+local c_zero=char(0)
+local s_zero=char(0,0)
+local function toushort(n)
+ return char(band(rshift(n,8),0xFF),band(n,0xFF))
+end
+local function toshort(n)
+ if n<0 then
+ n=n+0x10000
+ end
+ return char(band(rshift(n,8),0xFF),band(n,0xFF))
+end
+local chars=setmetatableindex(function(t,k)
+ for i=0,255 do local v=char(i) t[i]=v end return t[k]
+end)
+local function repackpoints(glyphs,shapes)
+ local noboundingbox={ 0,0,0,0 }
+ local result={}
+ local xpoints={}
+ local ypoints={}
+ for index=0,#glyphs-1 do
+ local shape=shapes[index]
+ if shape then
+ local r=0
+ local glyph=glyphs[index]
+ local contours=shape.contours
+ local nofcontours=contours and #contours or 0
+ local boundingbox=glyph.boundingbox or noboundingbox
+ r=r+1 result[r]=toshort(nofcontours)
+ r=r+1 result[r]=toshort(boundingbox[1])
+ r=r+1 result[r]=toshort(boundingbox[2])
+ r=r+1 result[r]=toshort(boundingbox[3])
+ r=r+1 result[r]=toshort(boundingbox[4])
+ if nofcontours>0 then
+ for i=1,nofcontours do
+ r=r+1 result[r]=toshort(contours[i]-1)
+ end
+ r=r+1 result[r]=s_zero
+ local points=shape.points
+ local currentx=0
+ local currenty=0
+ local x=0
+ local y=0
+ local lastflag=nil
+ local nofflags=0
+ for i=1,#points do
+ local pt=points[i]
+ local px=pt[1]
+ local py=pt[2]
+ local fl=pt[3] and 0x01 or 0x00
+ if px==currentx then
+ fl=fl+0x10
+ else
+ local dx=round(px-currentx)
+ x=x+1
+ if dx<-255 or dx>255 then
+ xpoints[x]=toshort(dx)
+ elseif dx<0 then
+ fl=fl+0x02
+ xpoints[x]=chars[-dx]
+ elseif dx>0 then
+ fl=fl+0x12
+ xpoints[x]=chars[dx]
+ else
+ fl=fl+0x02
+ xpoints[x]=c_zero
+ end
+ end
+ if py==currenty then
+ fl=fl+0x20
+ else
+ local dy=round(py-currenty)
+ y=y+1
+ if dy<-255 or dy>255 then
+ ypoints[y]=toshort(dy)
+ elseif dy<0 then
+ fl=fl+0x04
+ ypoints[y]=chars[-dy]
+ elseif dy>0 then
+ fl=fl+0x24
+ ypoints[y]=chars[dy]
+ else
+ fl=fl+0x04
+ ypoints[y]=c_zero
+ end
+ end
+ currentx=px
+ currenty=py
+ if lastflag==fl then
+ if nofflags==255 then
+ lastflag=lastflag+0x08
+ r=r+1 result[r]=char(lastflag,nofflags-1)
+ nofflags=1
+ lastflag=fl
+ else
+ nofflags=nofflags+1
+ end
+ else
+ if nofflags==1 then
+ r=r+1 result[r]=chars[lastflag]
+ elseif nofflags==2 then
+ r=r+1 result[r]=char(lastflag,lastflag)
+ elseif nofflags>2 then
+ lastflag=lastflag+0x08
+ r=r+1 result[r]=char(lastflag,nofflags-1)
+ end
+ nofflags=1
+ lastflag=fl
+ end
+ end
+ if nofflags==1 then
+ r=r+1 result[r]=chars[lastflag]
+ elseif nofflags==2 then
+ r=r+1 result[r]=char(lastflag,lastflag)
+ elseif nofflags>2 then
+ lastflag=lastflag+0x08
+ r=r+1 result[r]=char(lastflag,nofflags-1)
+ end
+ r=r+1 result[r]=concat(xpoints,"",1,x)
+ r=r+1 result[r]=concat(ypoints,"",1,y)
+ end
+ local stream=concat(result,"",1,r)
+ local length=#stream
+ local padding=idiv(length+3,4)*4-length
+ if padding>0 then
+ if padding==1 then
+ padding="\0"
+ elseif padding==2 then
+ padding="\0\0"
+ else
+ padding="\0\0\0"
+ end
+ padding=stream..padding
+ end
+ glyph.stream=stream
+ end
+ end
+end
+local flags={}
+local function readglyph(f,nofcontours)
+ local points={}
+ local contours={}
+ for i=1,nofcontours do
+ contours[i]=readshort(f)+1
+ end
+ local nofpoints=contours[nofcontours]
+ local nofinstructions=readushort(f)
+ skipbytes(f,nofinstructions)
+ local i=1
+ while i<=nofpoints do
+ local flag=readbyte(f)
+ flags[i]=flag
+ if band(flag,0x08)~=0 then
+ local n=readbyte(f)
+ if n==1 then
+ i=i+1
+ flags[i]=flag
+ else
+ for j=1,n do
+ i=i+1
+ flags[i]=flag
+ end
+ end
+ end
+ i=i+1
+ end
+ local x=0
+ for i=1,nofpoints do
+ local flag=flags[i]
+ if band(flag,0x02)~=0 then
+ if band(flag,0x10)~=0 then
+ x=x+readbyte(f)
+ else
+ x=x-readbyte(f)
+ end
+ elseif band(flag,0x10)~=0 then
+ else
+ x=x+readshort(f)
+ end
+ points[i]={ x,0,band(flag,0x01)~=0 }
+ end
+ local y=0
+ for i=1,nofpoints do
+ local flag=flags[i]
+ if band(flag,0x04)~=0 then
+ if band(flag,0x20)~=0 then
+ y=y+readbyte(f)
+ else
+ y=y-readbyte(f)
+ end
+ elseif band(flag,0x20)~=0 then
+ else
+ y=y+readshort(f)
+ end
+ points[i][2]=y
+ end
+ return {
+ type="glyph",
+ points=points,
+ contours=contours,
+ nofpoints=nofpoints,
+ }
+end
+local function readcomposite(f)
+ local components={}
+ local nofcomponents=0
+ local instructions=false
+ while true do
+ local flags=readushort(f)
+ local index=readushort(f)
+ local f_xyarg=band(flags,0x0002)~=0
+ local f_offset=band(flags,0x0800)~=0
+ local xscale=1
+ local xrotate=0
+ local yrotate=0
+ local yscale=1
+ local xoffset=0
+ local yoffset=0
+ local base=false
+ local reference=false
+ if f_xyarg then
+ if band(flags,0x0001)~=0 then
+ xoffset=readshort(f)
+ yoffset=readshort(f)
+ else
+ xoffset=readchar(f)
+ yoffset=readchar(f)
+ end
+ else
+ if band(flags,0x0001)~=0 then
+ base=readshort(f)
+ reference=readshort(f)
+ else
+ base=readchar(f)
+ reference=readchar(f)
+ end
+ end
+ if band(flags,0x0008)~=0 then
+ xscale=read2dot14(f)
+ yscale=xscale
+ if f_xyarg and f_offset then
+ xoffset=xoffset*xscale
+ yoffset=yoffset*yscale
+ end
+ elseif band(flags,0x0040)~=0 then
+ xscale=read2dot14(f)
+ yscale=read2dot14(f)
+ if f_xyarg and f_offset then
+ xoffset=xoffset*xscale
+ yoffset=yoffset*yscale
+ end
+ elseif band(flags,0x0080)~=0 then
+ xscale=read2dot14(f)
+ xrotate=read2dot14(f)
+ yrotate=read2dot14(f)
+ yscale=read2dot14(f)
+ if f_xyarg and f_offset then
+ xoffset=xoffset*sqrt(xscale^2+xrotate^2)
+ yoffset=yoffset*sqrt(yrotate^2+yscale^2)
+ end
+ end
+ nofcomponents=nofcomponents+1
+ components[nofcomponents]={
+ index=index,
+ usemine=band(flags,0x0200)~=0,
+ round=band(flags,0x0006)~=0,
+ base=base,
+ reference=reference,
+ matrix={ xscale,xrotate,yrotate,yscale,xoffset,yoffset },
+ }
+ if band(flags,0x0100)~=0 then
+ instructions=true
+ end
+ if band(flags,0x0020)==0 then
+ break
+ end
+ end
+ return {
+ type="composite",
+ components=components,
+ }
+end
+function readers.loca(f,fontdata,specification)
+ if specification.glyphs then
+ local datatable=fontdata.tables.loca
+ if datatable then
+ local offset=fontdata.tables.glyf.offset
+ local format=fontdata.fontheader.indextolocformat
+ local profile=fontdata.maximumprofile
+ local nofglyphs=profile and profile.nofglyphs
+ local locations={}
+ setposition(f,datatable.offset)
+ if format==1 then
+ if not nofglyphs then
+ nofglyphs=idiv(datatable.length,4)-1
+ end
+ for i=0,nofglyphs do
+ locations[i]=offset+readulong(f)
+ end
+ fontdata.nofglyphs=nofglyphs
+ else
+ if not nofglyphs then
+ nofglyphs=idiv(datatable.length,2)-1
+ end
+ for i=0,nofglyphs do
+ locations[i]=offset+readushort(f)*2
+ end
+ end
+ fontdata.nofglyphs=nofglyphs
+ fontdata.locations=locations
+ end
+ end
+end
+function readers.glyf(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"glyf",specification.glyphs)
+ if tableoffset then
+ local locations=fontdata.locations
+ if locations then
+ local glyphs=fontdata.glyphs
+ local nofglyphs=fontdata.nofglyphs
+ local filesize=fontdata.filesize
+ local nothing={ 0,0,0,0 }
+ local shapes={}
+ local loadshapes=specification.shapes or specification.instance or specification.streams
+ for index=0,nofglyphs-1 do
+ local location=locations[index]
+ local length=locations[index+1]-location
+ if location>=filesize then
+ report("discarding %s glyphs due to glyph location bug",nofglyphs-index+1)
+ fontdata.nofglyphs=index-1
+ fontdata.badfont=true
+ break
+ elseif length>0 then
+ setposition(f,location)
+ local nofcontours=readshort(f)
+ glyphs[index].boundingbox={
+ readshort(f),
+ readshort(f),
+ readshort(f),
+ readshort(f),
+ }
+ if not loadshapes then
+ elseif nofcontours==0 then
+ shapes[index]=readnothing(f)
+ elseif nofcontours>0 then
+ shapes[index]=readglyph(f,nofcontours)
+ else
+ shapes[index]=readcomposite(f,nofcontours)
+ end
+ else
+ if loadshapes then
+ shapes[index]=readnothing(f)
+ end
+ glyphs[index].boundingbox=nothing
+ end
+ end
+ if loadshapes then
+ if readers.gvar then
+ readers.gvar(f,fontdata,specification,glyphs,shapes)
+ end
+ mergecomposites(glyphs,shapes)
+ if specification.instance then
+ if specification.streams then
+ repackpoints(glyphs,shapes)
+ else
+ contours2outlines_shaped(glyphs,shapes,specification.shapes)
+ end
+ elseif specification.shapes then
+ if specification.streams then
+ repackpoints(glyphs,shapes)
+ else
+ contours2outlines_normal(glyphs,shapes)
+ end
+ elseif specification.streams then
+ repackpoints(glyphs,shapes)
+ end
+ end
+ end
+ end
+end
+local function readtuplerecord(f,nofaxis)
+ local record={}
+ for i=1,nofaxis do
+ record[i]=read2dot14(f)
+ end
+ return record
+end
+local function readpoints(f)
+ local count=readbyte(f)
+ if count==0 then
+ return nil,0
+ else
+ if count<128 then
+ elseif band(count,0x80)~=0 then
+ count=band(count,0x7F)*256+readbyte(f)
+ else
+ end
+ local points={}
+ local p=0
+ local n=1
+ while p0 do
+ local control=readbyte(f)
+if not control then
+ break
+end
+ local allzero=band(control,0x80)~=0
+ local runlength=band(control,0x3F)+1
+ if allzero then
+ z=z+runlength
+ else
+ local runreader=band(control,0x40)~=0 and readshort or readinteger
+ if z>0 then
+ for i=1,z do
+ p=p+1
+ deltas[p]=0
+ end
+ z=0
+ end
+ for i=1,runlength do
+ p=p+1
+ deltas[p]=runreader(f)
+ end
+ end
+ nofpoints=nofpoints-runlength
+ end
+ if p>0 then
+ return deltas
+ else
+ end
+end
+local function readdeltas(f,nofpoints)
+ local deltas={}
+ local p=0
+ while nofpoints>0 do
+ local control=readbyte(f)
+ if control then
+ local allzero=band(control,0x80)~=0
+ local runlength=band(control,0x3F)+1
+ if allzero then
+ for i=1,runlength do
+ p=p+1
+ deltas[p]=0
+ end
+ else
+ local runreader=band(control,0x40)~=0 and readshort or readinteger
+ for i=1,runlength do
+ p=p+1
+ deltas[p]=runreader(f)
+ end
+ end
+ nofpoints=nofpoints-runlength
+ else
+ break
+ end
+ end
+ if p>0 then
+ return deltas
+ else
+ end
+end
+function readers.gvar(f,fontdata,specification,glyphdata,shapedata)
+ local instance=specification.instance
+ if not instance then
+ return
+ end
+ local factors=specification.factors
+ if not factors then
+ return
+ end
+ local tableoffset=gotodatatable(f,fontdata,"gvar",specification.variable or specification.shapes)
+ if tableoffset then
+ local version=readulong(f)
+ local nofaxis=readushort(f)
+ local noftuples=readushort(f)
+ local tupleoffset=tableoffset+readulong(f)
+ local nofglyphs=readushort(f)
+ local flags=readushort(f)
+ local dataoffset=tableoffset+readulong(f)
+ local data={}
+ local tuples={}
+ local glyphdata=fontdata.glyphs
+ local dowidth=not fontdata.variabledata.hvarwidths
+ if band(flags,0x0001)~=0 then
+ for i=1,nofglyphs+1 do
+ data[i]=dataoffset+readulong(f)
+ end
+ else
+ for i=1,nofglyphs+1 do
+ data[i]=dataoffset+2*readushort(f)
+ end
+ end
+ if noftuples>0 then
+ setposition(f,tupleoffset)
+ for i=1,noftuples do
+ tuples[i]=readtuplerecord(f,nofaxis)
+ end
+ end
+ local nextoffset=false
+ local startoffset=data[1]
+ for i=1,nofglyphs do
+ nextoffset=data[i+1]
+ local glyph=glyphdata[i-1]
+ local name=trace_deltas and glyph.name
+ if startoffset==nextoffset then
+ if name then
+ report("no deltas for glyph %a",name)
+ end
+ else
+ local shape=shapedata[i-1]
+ if not shape then
+ if name then
+ report("no shape for glyph %a",name)
+ end
+ else
+ lastoffset=startoffset
+ setposition(f,startoffset)
+ local flags=readushort(f)
+ local count=band(flags,0x0FFF)
+ local offset=startoffset+readushort(f)
+ local deltas={}
+ local allpoints=(shape.nofpoints or 0)
+ local shared=false
+ local nofshared=0
+ if band(flags,0x8000)~=0 then
+ local current=getposition(f)
+ setposition(f,offset)
+ shared,nofshared=readpoints(f)
+ offset=getposition(f)
+ setposition(f,current)
+ end
+ for j=1,count do
+ local size=readushort(f)
+ local flags=readushort(f)
+ local index=band(flags,0x0FFF)
+ local haspeak=band(flags,0x8000)~=0
+ local intermediate=band(flags,0x4000)~=0
+ local private=band(flags,0x2000)~=0
+ local peak=nil
+ local start=nil
+ local stop=nil
+ local xvalues=nil
+ local yvalues=nil
+ local points=shared
+ local nofpoints=nofshared
+ if haspeak then
+ peak=readtuplerecord(f,nofaxis)
+ else
+ if index+1>#tuples then
+ report("error, bad tuple index",index)
+ end
+ peak=tuples[index+1]
+ end
+ if intermediate then
+ start=readtuplerecord(f,nofaxis)
+ stop=readtuplerecord(f,nofaxis)
+ end
+ if size>0 then
+ local current=getposition(f)
+ setposition(f,offset)
+ if private then
+ points,nofpoints=readpoints(f)
+ end
+ if nofpoints==0 then
+ nofpoints=allpoints+4
+ end
+ if nofpoints>0 then
+ xvalues=readdeltas(f,nofpoints)
+ yvalues=readdeltas(f,nofpoints)
+ end
+ offset=offset+size
+ setposition(f,current)
+ end
+ if not xvalues and not yvalues then
+ points=nil
+ end
+ local s=1
+ for i=1,nofaxis do
+ local f=factors[i]
+ local peak=peak and peak [i] or 0
+ local start=start and start[i] or (peak<0 and peak or 0)
+ local stop=stop and stop [i] or (peak>0 and peak or 0)
+ if start>peak or peak>stop then
+ elseif start<0 and stop>0 and peak~=0 then
+ elseif peak==0 then
+ elseif fstop then
+ s=0
+ break
+ elseif fpeak then
+ s=s*(stop-f)/(stop-peak)
+ else
+ end
+ end
+ if s==0 then
+ if name then
+ report("no deltas applied for glyph %a",name)
+ end
+ else
+ deltas[#deltas+1]={
+ factor=s,
+ points=points,
+ xvalues=xvalues,
+ yvalues=yvalues,
+ }
+ end
+ end
+ if shape.type=="glyph" then
+ applyaxis(glyph,shape,deltas,dowidth)
+ else
+ shape.deltas=deltas
+ end
+ end
+ end
+ startoffset=nextoffset
+ end
+ end
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-ttf”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-dsp” 618e5e760ec5dceb0c898a83816dbe61] ---
+
+if not modules then modules={} end modules ['font-dsp']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local next,type,tonumber=next,type,tonumber
+local band=bit32.band
+local extract=bit32.extract
+local bor=bit32.bor
+local lshift=bit32.lshift
+local rshift=bit32.rshift
+local gsub=string.gsub
+local lower=string.lower
+local sub=string.sub
+local strip=string.strip
+local tohash=table.tohash
+local concat=table.concat
+local copy=table.copy
+local reversed=table.reversed
+local sort=table.sort
+local insert=table.insert
+local round=math.round
+local settings_to_hash=utilities.parsers.settings_to_hash_colon_too
+local setmetatableindex=table.setmetatableindex
+local formatters=string.formatters
+local sortedkeys=table.sortedkeys
+local sortedhash=table.sortedhash
+local sequenced=table.sequenced
+local report=logs.reporter("otf reader")
+local readers=fonts.handlers.otf.readers
+local streamreader=readers.streamreader
+local setposition=streamreader.setposition
+local getposition=streamreader.getposition
+local readuinteger=streamreader.readcardinal1
+local readushort=streamreader.readcardinal2
+local readulong=streamreader.readcardinal4
+local readinteger=streamreader.readinteger1
+local readshort=streamreader.readinteger2
+local readstring=streamreader.readstring
+local readtag=streamreader.readtag
+local readbytes=streamreader.readbytes
+local readfixed=streamreader.readfixed4
+local read2dot14=streamreader.read2dot14
+local skipshort=streamreader.skipshort
+local skipbytes=streamreader.skip
+local readbytetable=streamreader.readbytetable
+local readbyte=streamreader.readbyte
+local readcardinaltable=streamreader.readcardinaltable
+local readintegertable=streamreader.readintegertable
+local readfword=readshort
+local short=2
+local ushort=2
+local ulong=4
+directives.register("fonts.streamreader",function()
+ streamreader=utilities.streams
+ setposition=streamreader.setposition
+ getposition=streamreader.getposition
+ readuinteger=streamreader.readcardinal1
+ readushort=streamreader.readcardinal2
+ readulong=streamreader.readcardinal4
+ readinteger=streamreader.readinteger1
+ readshort=streamreader.readinteger2
+ readstring=streamreader.readstring
+ readtag=streamreader.readtag
+ readbytes=streamreader.readbytes
+ readfixed=streamreader.readfixed4
+ read2dot14=streamreader.read2dot14
+ skipshort=streamreader.skipshort
+ skipbytes=streamreader.skip
+ readbytetable=streamreader.readbytetable
+ readbyte=streamreader.readbyte
+ readcardinaltable=streamreader.readcardinaltable
+ readintegertable=streamreader.readintegertable
+ readfword=readshort
+end)
+local gsubhandlers={}
+local gposhandlers={}
+readers.gsubhandlers=gsubhandlers
+readers.gposhandlers=gposhandlers
+local helpers=readers.helpers
+local gotodatatable=helpers.gotodatatable
+local setvariabledata=helpers.setvariabledata
+local lookupidoffset=-1
+local classes={
+ "base",
+ "ligature",
+ "mark",
+ "component",
+}
+local gsubtypes={
+ "single",
+ "multiple",
+ "alternate",
+ "ligature",
+ "context",
+ "chainedcontext",
+ "extension",
+ "reversechainedcontextsingle",
+}
+local gpostypes={
+ "single",
+ "pair",
+ "cursive",
+ "marktobase",
+ "marktoligature",
+ "marktomark",
+ "context",
+ "chainedcontext",
+ "extension",
+}
+local chaindirections={
+ context=0,
+ chainedcontext=1,
+ reversechainedcontextsingle=-1,
+}
+local function setmetrics(data,where,tag,d)
+ local w=data[where]
+ if w then
+ local v=w[tag]
+ if v then
+ w[tag]=v+d
+ end
+ end
+end
+local variabletags={
+ hasc=function(data,d) setmetrics(data,"windowsmetrics","typoascender",d) end,
+ hdsc=function(data,d) setmetrics(data,"windowsmetrics","typodescender",d) end,
+ hlgp=function(data,d) setmetrics(data,"windowsmetrics","typolinegap",d) end,
+ hcla=function(data,d) setmetrics(data,"windowsmetrics","winascent",d) end,
+ hcld=function(data,d) setmetrics(data,"windowsmetrics","windescent",d) end,
+ vasc=function(data,d) setmetrics(data,"vhea not done","ascent",d) end,
+ vdsc=function(data,d) setmetrics(data,"vhea not done","descent",d) end,
+ vlgp=function(data,d) setmetrics(data,"vhea not done","linegap",d) end,
+ xhgt=function(data,d) setmetrics(data,"windowsmetrics","xheight",d) end,
+ cpht=function(data,d) setmetrics(data,"windowsmetrics","capheight",d) end,
+ sbxs=function(data,d) setmetrics(data,"windowsmetrics","subscriptxsize",d) end,
+ sbys=function(data,d) setmetrics(data,"windowsmetrics","subscriptysize",d) end,
+ sbxo=function(data,d) setmetrics(data,"windowsmetrics","subscriptxoffset",d) end,
+ sbyo=function(data,d) setmetrics(data,"windowsmetrics","subscriptyoffset",d) end,
+ spxs=function(data,d) setmetrics(data,"windowsmetrics","superscriptxsize",d) end,
+ spys=function(data,d) setmetrics(data,"windowsmetrics","superscriptysize",d) end,
+ spxo=function(data,d) setmetrics(data,"windowsmetrics","superscriptxoffset",d) end,
+ spyo=function(data,d) setmetrics(data,"windowsmetrics","superscriptyoffset",d) end,
+ strs=function(data,d) setmetrics(data,"windowsmetrics","strikeoutsize",d) end,
+ stro=function(data,d) setmetrics(data,"windowsmetrics","strikeoutpos",d) end,
+ unds=function(data,d) setmetrics(data,"postscript","underlineposition",d) end,
+ undo=function(data,d) setmetrics(data,"postscript","underlinethickness",d) end,
+}
+local read_cardinal={
+ streamreader.readcardinal1,
+ streamreader.readcardinal2,
+ streamreader.readcardinal3,
+ streamreader.readcardinal4,
+}
+local read_integer={
+ streamreader.readinteger1,
+ streamreader.readinteger2,
+ streamreader.readinteger3,
+ streamreader.readinteger4,
+}
+local lookupnames={
+ gsub={
+ single="gsub_single",
+ multiple="gsub_multiple",
+ alternate="gsub_alternate",
+ ligature="gsub_ligature",
+ context="gsub_context",
+ chainedcontext="gsub_contextchain",
+ reversechainedcontextsingle="gsub_reversecontextchain",
+ },
+ gpos={
+ single="gpos_single",
+ pair="gpos_pair",
+ cursive="gpos_cursive",
+ marktobase="gpos_mark2base",
+ marktoligature="gpos_mark2ligature",
+ marktomark="gpos_mark2mark",
+ context="gpos_context",
+ chainedcontext="gpos_contextchain",
+ }
+}
+local lookupflags=setmetatableindex(function(t,k)
+ local v={
+ band(k,0x0008)~=0 and true or false,
+ band(k,0x0004)~=0 and true or false,
+ band(k,0x0002)~=0 and true or false,
+ band(k,0x0001)~=0 and true or false,
+ }
+ t[k]=v
+ return v
+end)
+local function axistofactors(str)
+ local t=settings_to_hash(str)
+ for k,v in next,t do
+ t[k]=tonumber(v) or v
+ end
+ return t
+end
+local hash=table.setmetatableindex(function(t,k)
+ local v=sequenced(axistofactors(k),",")
+ t[k]=v
+ return v
+end)
+helpers.normalizedaxishash=hash
+local cleanname=fonts.names and fonts.names.cleanname or function(name)
+ return name and (gsub(lower(name),"[^%a%d]","")) or nil
+end
+helpers.cleanname=cleanname
+function helpers.normalizedaxis(str)
+ return hash[str] or str
+end
+local function getaxisscale(segments,minimum,default,maximum,user)
+ if not minimum or not default or not maximum then
+ return false
+ end
+ if usermaximum then
+ user=maximum
+ end
+ if userdefault then
+ default=(user-default)/(maximum-default)
+ else
+ default=0
+ end
+ if not segments then
+ return default
+ end
+ local e
+ for i=1,#segments do
+ local s=segments[i]
+ if type(s)~="number" then
+ report("using default axis scale")
+ return default
+ elseif s[1]>=default then
+ if s[2]==default then
+ return default
+ else
+ e=i
+ break
+ end
+ end
+ end
+ if e then
+ local b=segments[e-1]
+ local e=segments[e]
+ return b[2]+(e[2]-b[2])*(default-b[1])/(e[1]-b[1])
+ else
+ return false
+ end
+end
+local function getfactors(data,instancespec)
+ if instancespec==true then
+ elseif type(instancespec)~="string" or instancespec=="" then
+ return
+ end
+ local variabledata=data.variabledata
+ if not variabledata then
+ return
+ end
+ local instances=variabledata.instances
+ local axis=variabledata.axis
+ local segments=variabledata.segments
+ if instances and axis then
+ local values
+ if instancespec==true then
+ values={}
+ for i=1,#axis do
+ values[i]={
+ value=axis[i].default,
+ }
+ end
+ else
+ for i=1,#instances do
+ local instance=instances[i]
+ if cleanname(instance.subfamily)==instancespec then
+ values=instance.values
+ break
+ end
+ end
+ end
+ if values then
+ local factors={}
+ for i=1,#axis do
+ local a=axis[i]
+ factors[i]=getaxisscale(segments,a.minimum,a.default,a.maximum,values[i].value)
+ end
+ return factors
+ end
+ local values=axistofactors(hash[instancespec] or instancespec)
+ if values then
+ local factors={}
+ for i=1,#axis do
+ local a=axis[i]
+ local d=a.default
+ factors[i]=getaxisscale(segments,a.minimum,d,a.maximum,values[a.name or a.tag] or d)
+ end
+ return factors
+ end
+ end
+end
+local function getscales(regions,factors)
+ local scales={}
+ for i=1,#regions do
+ local region=regions[i]
+ local s=1
+ for j=1,#region do
+ local axis=region[j]
+ local f=factors[j]
+ local start=axis.start
+ local peak=axis.peak
+ local stop=axis.stop
+ if start>peak or peak>stop then
+ elseif start<0 and stop>0 and peak~=0 then
+ elseif peak==0 then
+ elseif fstop then
+ s=0
+ break
+ elseif fpeak then
+ s=s*(stop-f)/(stop-peak)
+ else
+ end
+ end
+ scales[i]=s
+ end
+ return scales
+end
+helpers.getaxisscale=getaxisscale
+helpers.getfactors=getfactors
+helpers.getscales=getscales
+helpers.axistofactors=axistofactors
+local function readvariationdata(f,storeoffset,factors)
+ local position=getposition(f)
+ setposition(f,storeoffset)
+ local format=readushort(f)
+ local regionoffset=storeoffset+readulong(f)
+ local nofdeltadata=readushort(f)
+ local deltadata=readcardinaltable(f,nofdeltadata,ulong)
+ setposition(f,regionoffset)
+ local nofaxis=readushort(f)
+ local nofregions=readushort(f)
+ local regions={}
+ for i=1,nofregions do
+ local t={}
+ for i=1,nofaxis do
+ t[i]={
+ start=read2dot14(f),
+ peak=read2dot14(f),
+ stop=read2dot14(f),
+ }
+ end
+ regions[i]=t
+ end
+ if factors then
+ for i=1,nofdeltadata do
+ setposition(f,storeoffset+deltadata[i])
+ local nofdeltasets=readushort(f)
+ local nofshorts=readushort(f)
+ local nofregions=readushort(f)
+ local usedregions={}
+ local deltas={}
+ for i=1,nofregions do
+ usedregions[i]=regions[readushort(f)+1]
+ end
+ for i=1,nofdeltasets do
+ local t=readintegertable(f,nofshorts,short)
+ for i=nofshorts+1,nofregions do
+ t[i]=readinteger(f)
+ end
+ deltas[i]=t
+ end
+ deltadata[i]={
+ regions=usedregions,
+ deltas=deltas,
+ scales=factors and getscales(usedregions,factors) or nil,
+ }
+ end
+ end
+ setposition(f,position)
+ return regions,deltadata
+end
+helpers.readvariationdata=readvariationdata
+local function readcoverage(f,offset,simple)
+ setposition(f,offset)
+ local coverageformat=readushort(f)
+ if coverageformat==1 then
+ local nofcoverage=readushort(f)
+ if simple then
+ if nofcoverage==1 then
+ return { readushort(f) }
+ elseif nofcoverage==2 then
+ return { readushort(f),readushort(f) }
+ else
+ return readcardinaltable(f,nofcoverage,ushort)
+ end
+ elseif nofcoverage==1 then
+ return { [readushort(f)]=0 }
+ elseif nofcoverage==2 then
+ return { [readushort(f)]=0,[readushort(f)]=1 }
+ else
+ local coverage={}
+ for i=0,nofcoverage-1 do
+ coverage[readushort(f)]=i
+ end
+ return coverage
+ end
+ elseif coverageformat==2 then
+ local nofranges=readushort(f)
+ local coverage={}
+ local n=simple and 1 or 0
+ for i=1,nofranges do
+ local firstindex=readushort(f)
+ local lastindex=readushort(f)
+ local coverindex=readushort(f)
+ if simple then
+ for i=firstindex,lastindex do
+ coverage[n]=i
+ n=n+1
+ end
+ else
+ for i=firstindex,lastindex do
+ coverage[i]=n
+ n=n+1
+ end
+ end
+ end
+ return coverage
+ else
+ report("unknown coverage format %a ",coverageformat)
+ return {}
+ end
+end
+local function readclassdef(f,offset,preset)
+ setposition(f,offset)
+ local classdefformat=readushort(f)
+ local classdef={}
+ if type(preset)=="number" then
+ for k=0,preset-1 do
+ classdef[k]=1
+ end
+ end
+ if classdefformat==1 then
+ local index=readushort(f)
+ local nofclassdef=readushort(f)
+ for i=1,nofclassdef do
+ classdef[index]=readushort(f)+1
+ index=index+1
+ end
+ elseif classdefformat==2 then
+ local nofranges=readushort(f)
+ local n=0
+ for i=1,nofranges do
+ local firstindex=readushort(f)
+ local lastindex=readushort(f)
+ local class=readushort(f)+1
+ for i=firstindex,lastindex do
+ classdef[i]=class
+ end
+ end
+ else
+ report("unknown classdef format %a ",classdefformat)
+ end
+ if type(preset)=="table" then
+ for k in next,preset do
+ if not classdef[k] then
+ classdef[k]=1
+ end
+ end
+ end
+ return classdef
+end
+local function classtocoverage(defs)
+ if defs then
+ local list={}
+ for index,class in next,defs do
+ local c=list[class]
+ if c then
+ c[#c+1]=index
+ else
+ list[class]={ index }
+ end
+ end
+ return list
+ end
+end
+local skips={ [0]=0,
+ 1,
+ 1,
+ 2,
+ 1,
+ 2,
+ 2,
+ 3,
+ 2,
+ 2,
+ 3,
+ 2,
+ 3,
+ 3,
+ 4,
+}
+local function readvariation(f,offset)
+ local p=getposition(f)
+ setposition(f,offset)
+ local outer=readushort(f)
+ local inner=readushort(f)
+ local format=readushort(f)
+ setposition(f,p)
+ if format==0x8000 then
+ return outer,inner
+ end
+end
+local function readposition(f,format,mainoffset,getdelta)
+ if format==0 then
+ return false
+ end
+ if format==0x04 then
+ local h=readshort(f)
+ if h==0 then
+ return true
+ else
+ return { 0,0,h,0 }
+ end
+ end
+ if format==0x05 then
+ local x=readshort(f)
+ local h=readshort(f)
+ if x==0 and h==0 then
+ return true
+ else
+ return { x,0,h,0 }
+ end
+ end
+ if format==0x44 then
+ local h=readshort(f)
+ if getdelta then
+ local d=readshort(f)
+ if d>0 then
+ local outer,inner=readvariation(f,mainoffset+d)
+ if outer then
+ h=h+getdelta(outer,inner)
+ end
+ end
+ else
+ skipshort(f,1)
+ end
+ if h==0 then
+ return true
+ else
+ return { 0,0,h,0 }
+ end
+ end
+ local x=band(format,0x1)~=0 and readshort(f) or 0
+ local y=band(format,0x2)~=0 and readshort(f) or 0
+ local h=band(format,0x4)~=0 and readshort(f) or 0
+ local v=band(format,0x8)~=0 and readshort(f) or 0
+ if format>=0x10 then
+ local X=band(format,0x10)~=0 and skipshort(f) or 0
+ local Y=band(format,0x20)~=0 and skipshort(f) or 0
+ local H=band(format,0x40)~=0 and skipshort(f) or 0
+ local V=band(format,0x80)~=0 and skipshort(f) or 0
+ local s=skips[extract(format,4,4)]
+ if s>0 then
+ skipshort(f,s)
+ end
+ if getdelta then
+ if X>0 then
+ local outer,inner=readvariation(f,mainoffset+X)
+ if outer then
+ x=x+getdelta(outer,inner)
+ end
+ end
+ if Y>0 then
+ local outer,inner=readvariation(f,mainoffset+Y)
+ if outer then
+ y=y+getdelta(outer,inner)
+ end
+ end
+ if H>0 then
+ local outer,inner=readvariation(f,mainoffset+H)
+ if outer then
+ h=h+getdelta(outer,inner)
+ end
+ end
+ if V>0 then
+ local outer,inner=readvariation(f,mainoffset+V)
+ if outer then
+ v=v+getdelta(outer,inner)
+ end
+ end
+ end
+ return { x,y,h,v }
+ elseif x==0 and y==0 and h==0 and v==0 then
+ return true
+ else
+ return { x,y,h,v }
+ end
+end
+local function readanchor(f,offset,getdelta)
+ if not offset or offset==0 then
+ return nil
+ end
+ setposition(f,offset)
+ local format=readshort(f)
+ local x=readshort(f)
+ local y=readshort(f)
+ if format==3 then
+ if getdelta then
+ local X=readshort(f)
+ local Y=readshort(f)
+ if X>0 then
+ local outer,inner=readvariation(f,offset+X)
+ if outer then
+ x=x+getdelta(outer,inner)
+ end
+ end
+ if Y>0 then
+ local outer,inner=readvariation(f,offset+Y)
+ if outer then
+ y=y+getdelta(outer,inner)
+ end
+ end
+ else
+ skipshort(f,2)
+ end
+ return { x,y }
+ else
+ return { x,y }
+ end
+end
+local function readfirst(f,offset)
+ if offset then
+ setposition(f,offset)
+ end
+ return { readushort(f) }
+end
+function readarray(f,offset)
+ if offset then
+ setposition(f,offset)
+ end
+ local n=readushort(f)
+ if n==1 then
+ return { readushort(f) },1
+ elseif n>0 then
+ return readcardinaltable(f,n,ushort),n
+ end
+end
+local function readcoveragearray(f,offset,t,simple)
+ if not t then
+ return nil
+ end
+ local n=#t
+ if n==0 then
+ return nil
+ end
+ for i=1,n do
+ t[i]=readcoverage(f,offset+t[i],simple)
+ end
+ return t
+end
+local function covered(subset,all)
+ local used,u
+ for i=1,#subset do
+ local s=subset[i]
+ if all[s] then
+ if used then
+ u=u+1
+ used[u]=s
+ else
+ u=1
+ used={ s }
+ end
+ end
+ end
+ return used
+end
+local function readlookuparray(f,noflookups,nofcurrent)
+ local lookups={}
+ if noflookups>0 then
+ local length=0
+ for i=1,noflookups do
+ local index=readushort(f)+1
+ if index>length then
+ length=index
+ end
+ local lookup=readushort(f)+1
+ local list=lookups[index]
+ if list then
+ list[#list+1]=lookup
+ else
+ lookups[index]={ lookup }
+ end
+ end
+ for index=1,length do
+ if not lookups[index] then
+ lookups[index]=false
+ end
+ end
+ end
+ return lookups
+end
+local function unchainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,what)
+ local tableoffset=lookupoffset+offset
+ setposition(f,tableoffset)
+ local subtype=readushort(f)
+ if subtype==1 then
+ local coverage=readushort(f)
+ local subclasssets=readarray(f)
+ local rules={}
+ if subclasssets then
+ coverage=readcoverage(f,tableoffset+coverage,true)
+ for i=1,#subclasssets do
+ local offset=subclasssets[i]
+ if offset>0 then
+ local firstcoverage=coverage[i]
+ local rulesoffset=tableoffset+offset
+ local subclassrules=readarray(f,rulesoffset)
+ for rule=1,#subclassrules do
+ setposition(f,rulesoffset+subclassrules[rule])
+ local nofcurrent=readushort(f)
+ local noflookups=readushort(f)
+ local current={ { firstcoverage } }
+ for i=2,nofcurrent do
+ current[i]={ readushort(f) }
+ end
+ local lookups=readlookuparray(f,noflookups,nofcurrent)
+ rules[#rules+1]={
+ current=current,
+ lookups=lookups
+ }
+ end
+ end
+ end
+ else
+ report("empty subclassset in %a subtype %i","unchainedcontext",subtype)
+ end
+ return {
+ format="glyphs",
+ rules=rules,
+ }
+ elseif subtype==2 then
+ local coverage=readushort(f)
+ local currentclassdef=readushort(f)
+ local subclasssets=readarray(f)
+ local rules={}
+ if subclasssets then
+ coverage=readcoverage(f,tableoffset+coverage)
+ currentclassdef=readclassdef(f,tableoffset+currentclassdef,coverage)
+ local currentclasses=classtocoverage(currentclassdef,fontdata.glyphs)
+ for class=1,#subclasssets do
+ local offset=subclasssets[class]
+ if offset>0 then
+ local firstcoverage=currentclasses[class]
+ if firstcoverage then
+ firstcoverage=covered(firstcoverage,coverage)
+ if firstcoverage then
+ local rulesoffset=tableoffset+offset
+ local subclassrules=readarray(f,rulesoffset)
+ for rule=1,#subclassrules do
+ setposition(f,rulesoffset+subclassrules[rule])
+ local nofcurrent=readushort(f)
+ local noflookups=readushort(f)
+ local current={ firstcoverage }
+ for i=2,nofcurrent do
+ current[i]=currentclasses[readushort(f)+1]
+ end
+ local lookups=readlookuparray(f,noflookups,nofcurrent)
+ rules[#rules+1]={
+ current=current,
+ lookups=lookups
+ }
+ end
+ else
+ report("no coverage")
+ end
+ else
+ report("no coverage class")
+ end
+ end
+ end
+ else
+ report("empty subclassset in %a subtype %i","unchainedcontext",subtype)
+ end
+ return {
+ format="class",
+ rules=rules,
+ }
+ elseif subtype==3 then
+ local nofglyphs=readushort(f)
+ local noflookups=readushort(f)
+ local current=readcardinaltable(f,nofglyphs,ushort)
+ local lookups=readlookuparray(f,noflookups,#current)
+ current=readcoveragearray(f,tableoffset,current,true)
+ return {
+ format="coverage",
+ rules={
+ {
+ current=current,
+ lookups=lookups,
+ }
+ }
+ }
+ else
+ report("unsupported subtype %a in %a %s",subtype,"unchainedcontext",what)
+ end
+end
+local function chainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,what)
+ local tableoffset=lookupoffset+offset
+ setposition(f,tableoffset)
+ local subtype=readushort(f)
+ if subtype==1 then
+ local coverage=readushort(f)
+ local subclasssets=readarray(f)
+ local rules={}
+ if subclasssets then
+ coverage=readcoverage(f,tableoffset+coverage,true)
+ for i=1,#subclasssets do
+ local offset=subclasssets[i]
+ if offset>0 then
+ local firstcoverage=coverage[i]
+ local rulesoffset=tableoffset+offset
+ local subclassrules=readarray(f,rulesoffset)
+ for rule=1,#subclassrules do
+ setposition(f,rulesoffset+subclassrules[rule])
+ local nofbefore=readushort(f)
+ local before
+ if nofbefore>0 then
+ before={}
+ for i=1,nofbefore do
+ before[i]={ readushort(f) }
+ end
+ end
+ local nofcurrent=readushort(f)
+ local current={ { firstcoverage } }
+ for i=2,nofcurrent do
+ current[i]={ readushort(f) }
+ end
+ local nofafter=readushort(f)
+ local after
+ if nofafter>0 then
+ after={}
+ for i=1,nofafter do
+ after[i]={ readushort(f) }
+ end
+ end
+ local noflookups=readushort(f)
+ local lookups=readlookuparray(f,noflookups,nofcurrent)
+ rules[#rules+1]={
+ before=before,
+ current=current,
+ after=after,
+ lookups=lookups,
+ }
+ end
+ end
+ end
+ else
+ report("empty subclassset in %a subtype %i","chainedcontext",subtype)
+ end
+ return {
+ format="glyphs",
+ rules=rules,
+ }
+ elseif subtype==2 then
+ local coverage=readushort(f)
+ local beforeclassdef=readushort(f)
+ local currentclassdef=readushort(f)
+ local afterclassdef=readushort(f)
+ local subclasssets=readarray(f)
+ local rules={}
+ if subclasssets then
+ local coverage=readcoverage(f,tableoffset+coverage)
+ local beforeclassdef=readclassdef(f,tableoffset+beforeclassdef,nofglyphs)
+ local currentclassdef=readclassdef(f,tableoffset+currentclassdef,coverage)
+ local afterclassdef=readclassdef(f,tableoffset+afterclassdef,nofglyphs)
+ local beforeclasses=classtocoverage(beforeclassdef,fontdata.glyphs)
+ local currentclasses=classtocoverage(currentclassdef,fontdata.glyphs)
+ local afterclasses=classtocoverage(afterclassdef,fontdata.glyphs)
+ for class=1,#subclasssets do
+ local offset=subclasssets[class]
+ if offset>0 then
+ local firstcoverage=currentclasses[class]
+ if firstcoverage then
+ firstcoverage=covered(firstcoverage,coverage)
+ if firstcoverage then
+ local rulesoffset=tableoffset+offset
+ local subclassrules=readarray(f,rulesoffset)
+ for rule=1,#subclassrules do
+ setposition(f,rulesoffset+subclassrules[rule])
+ local nofbefore=readushort(f)
+ local before
+ if nofbefore>0 then
+ before={}
+ for i=1,nofbefore do
+ before[i]=beforeclasses[readushort(f)+1]
+ end
+ end
+ local nofcurrent=readushort(f)
+ local current={ firstcoverage }
+ for i=2,nofcurrent do
+ current[i]=currentclasses[readushort(f)+1]
+ end
+ local nofafter=readushort(f)
+ local after
+ if nofafter>0 then
+ after={}
+ for i=1,nofafter do
+ after[i]=afterclasses[readushort(f)+1]
+ end
+ end
+ local noflookups=readushort(f)
+ local lookups=readlookuparray(f,noflookups,nofcurrent)
+ rules[#rules+1]={
+ before=before,
+ current=current,
+ after=after,
+ lookups=lookups,
+ }
+ end
+ else
+ report("no coverage")
+ end
+ else
+ report("class is not covered")
+ end
+ end
+ end
+ else
+ report("empty subclassset in %a subtype %i","chainedcontext",subtype)
+ end
+ return {
+ format="class",
+ rules=rules,
+ }
+ elseif subtype==3 then
+ local before=readarray(f)
+ local current=readarray(f)
+ local after=readarray(f)
+ local noflookups=readushort(f)
+ local lookups=readlookuparray(f,noflookups,#current)
+ before=readcoveragearray(f,tableoffset,before,true)
+ current=readcoveragearray(f,tableoffset,current,true)
+ after=readcoveragearray(f,tableoffset,after,true)
+ return {
+ format="coverage",
+ rules={
+ {
+ before=before,
+ current=current,
+ after=after,
+ lookups=lookups,
+ }
+ }
+ }
+ else
+ report("unsupported subtype %a in %a %s",subtype,"chainedcontext",what)
+ end
+end
+local function extension(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,types,handlers,what)
+ local tableoffset=lookupoffset+offset
+ setposition(f,tableoffset)
+ local subtype=readushort(f)
+ if subtype==1 then
+ local lookuptype=types[readushort(f)]
+ local faroffset=readulong(f)
+ local handler=handlers[lookuptype]
+ if handler then
+ return handler(f,fontdata,lookupid,tableoffset+faroffset,0,glyphs,nofglyphs),lookuptype
+ else
+ report("no handler for lookuptype %a subtype %a in %s %s",lookuptype,subtype,what,"extension")
+ end
+ else
+ report("unsupported subtype %a in %s %s",subtype,what,"extension")
+ end
+end
+function gsubhandlers.single(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ local tableoffset=lookupoffset+offset
+ setposition(f,tableoffset)
+ local subtype=readushort(f)
+ if subtype==1 then
+ local coverage=readushort(f)
+ local delta=readshort(f)
+ local coverage=readcoverage(f,tableoffset+coverage)
+ for index in next,coverage do
+ local newindex=(index+delta)%65536
+ if index>nofglyphs or newindex>nofglyphs then
+ report("invalid index in %s format %i: %i -> %i (max %i)","single",subtype,index,newindex,nofglyphs)
+ coverage[index]=nil
+ else
+ coverage[index]=newindex
+ end
+ end
+ return {
+ coverage=coverage
+ }
+ elseif subtype==2 then
+ local coverage=readushort(f)
+ local nofreplacements=readushort(f)
+ local replacements=readcardinaltable(f,nofreplacements,ushort)
+ local coverage=readcoverage(f,tableoffset+coverage)
+ for index,newindex in next,coverage do
+ newindex=newindex+1
+ if index>nofglyphs or newindex>nofglyphs then
+ report("invalid index in %s format %i: %i -> %i (max %i)","single",subtype,index,newindex,nofglyphs)
+ coverage[index]=nil
+ else
+ coverage[index]=replacements[newindex]
+ end
+ end
+ return {
+ coverage=coverage
+ }
+ else
+ report("unsupported subtype %a in %a substitution",subtype,"single")
+ end
+end
+local function sethandler(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,what)
+ local tableoffset=lookupoffset+offset
+ setposition(f,tableoffset)
+ local subtype=readushort(f)
+ if subtype==1 then
+ local coverage=readushort(f)
+ local nofsequence=readushort(f)
+ local sequences=readcardinaltable(f,nofsequence,ushort)
+ for i=1,nofsequence do
+ setposition(f,tableoffset+sequences[i])
+ sequences[i]=readcardinaltable(f,readushort(f),ushort)
+ end
+ local coverage=readcoverage(f,tableoffset+coverage)
+ for index,newindex in next,coverage do
+ newindex=newindex+1
+ if index>nofglyphs or newindex>nofglyphs then
+ report("invalid index in %s format %i: %i -> %i (max %i)",what,subtype,index,newindex,nofglyphs)
+ coverage[index]=nil
+ else
+ coverage[index]=sequences[newindex]
+ end
+ end
+ return {
+ coverage=coverage
+ }
+ else
+ report("unsupported subtype %a in %a substitution",subtype,what)
+ end
+end
+function gsubhandlers.multiple(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ return sethandler(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,"multiple")
+end
+function gsubhandlers.alternate(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ return sethandler(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,"alternate")
+end
+function gsubhandlers.ligature(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ local tableoffset=lookupoffset+offset
+ setposition(f,tableoffset)
+ local subtype=readushort(f)
+ if subtype==1 then
+ local coverage=readushort(f)
+ local nofsets=readushort(f)
+ local ligatures=readcardinaltable(f,nofsets,ushort)
+ for i=1,nofsets do
+ local offset=lookupoffset+offset+ligatures[i]
+ setposition(f,offset)
+ local n=readushort(f)
+ if n==1 then
+ ligatures[i]={ offset+readushort(f) }
+ else
+ local l={}
+ for i=1,n do
+ l[i]=offset+readushort(f)
+ end
+ ligatures[i]=l
+ end
+ end
+ local coverage=readcoverage(f,tableoffset+coverage)
+ for index,newindex in next,coverage do
+ local hash={}
+ local ligatures=ligatures[newindex+1]
+ for i=1,#ligatures do
+ local offset=ligatures[i]
+ setposition(f,offset)
+ local lig=readushort(f)
+ local cnt=readushort(f)
+ local hsh=hash
+ for i=2,cnt do
+ local c=readushort(f)
+ local h=hsh[c]
+ if not h then
+ h={}
+ hsh[c]=h
+ end
+ hsh=h
+ end
+ hsh.ligature=lig
+ end
+ coverage[index]=hash
+ end
+ return {
+ coverage=coverage
+ }
+ else
+ report("unsupported subtype %a in %a substitution",subtype,"ligature")
+ end
+end
+function gsubhandlers.context(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ return unchainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,"substitution"),"context"
+end
+function gsubhandlers.chainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ return chainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,"substitution"),"chainedcontext"
+end
+function gsubhandlers.extension(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ return extension(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,gsubtypes,gsubhandlers,"substitution")
+end
+function gsubhandlers.reversechainedcontextsingle(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ local tableoffset=lookupoffset+offset
+ setposition(f,tableoffset)
+ local subtype=readushort(f)
+ if subtype==1 then
+ local current=readfirst(f)
+ local before=readarray(f)
+ local after=readarray(f)
+ local replacements=readarray(f)
+ current=readcoveragearray(f,tableoffset,current,true)
+ before=readcoveragearray(f,tableoffset,before,true)
+ after=readcoveragearray(f,tableoffset,after,true)
+ return {
+ format="reversecoverage",
+ rules={
+ {
+ before=before,
+ current=current,
+ after=after,
+ replacements=replacements,
+ }
+ }
+ },"reversechainedcontextsingle"
+ else
+ report("unsupported subtype %a in %a substitution",subtype,"reversechainedcontextsingle")
+ end
+end
+local function readpairsets(f,tableoffset,sets,format1,format2,mainoffset,getdelta)
+ local done={}
+ for i=1,#sets do
+ local offset=sets[i]
+ local reused=done[offset]
+ if not reused then
+ offset=tableoffset+offset
+ setposition(f,offset)
+ local n=readushort(f)
+ reused={}
+ for i=1,n do
+ reused[i]={
+ readushort(f),
+ readposition(f,format1,offset,getdelta),
+ readposition(f,format2,offset,getdelta),
+ }
+ end
+ done[offset]=reused
+ end
+ sets[i]=reused
+ end
+ return sets
+end
+local function readpairclasssets(f,nofclasses1,nofclasses2,format1,format2,mainoffset,getdelta)
+ local classlist1={}
+ for i=1,nofclasses1 do
+ local classlist2={}
+ classlist1[i]=classlist2
+ for j=1,nofclasses2 do
+ local one=readposition(f,format1,mainoffset,getdelta)
+ local two=readposition(f,format2,mainoffset,getdelta)
+ if one or two then
+ classlist2[j]={ one,two }
+ else
+ classlist2[j]=false
+ end
+ end
+ end
+ return classlist1
+end
+function gposhandlers.single(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ local tableoffset=lookupoffset+offset
+ setposition(f,tableoffset)
+ local subtype=readushort(f)
+ local getdelta=fontdata.temporary.getdelta
+ if subtype==1 then
+ local coverage=readushort(f)
+ local format=readushort(f)
+ local value=readposition(f,format,tableoffset,getdelta)
+ local coverage=readcoverage(f,tableoffset+coverage)
+ for index,newindex in next,coverage do
+ coverage[index]=value
+ end
+ return {
+ format="single",
+ coverage=coverage,
+ }
+ elseif subtype==2 then
+ local coverage=readushort(f)
+ local format=readushort(f)
+ local nofvalues=readushort(f)
+ local values={}
+ for i=1,nofvalues do
+ values[i]=readposition(f,format,tableoffset,getdelta)
+ end
+ local coverage=readcoverage(f,tableoffset+coverage)
+ for index,newindex in next,coverage do
+ coverage[index]=values[newindex+1]
+ end
+ return {
+ format="single",
+ coverage=coverage,
+ }
+ else
+ report("unsupported subtype %a in %a positioning",subtype,"single")
+ end
+end
+function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ local tableoffset=lookupoffset+offset
+ setposition(f,tableoffset)
+ local subtype=readushort(f)
+ local getdelta=fontdata.temporary.getdelta
+ if subtype==1 then
+ local coverage=readushort(f)
+ local format1=readushort(f)
+ local format2=readushort(f)
+ local sets=readarray(f)
+ sets=readpairsets(f,tableoffset,sets,format1,format2,mainoffset,getdelta)
+ coverage=readcoverage(f,tableoffset+coverage)
+ local shared={}
+ for index,newindex in next,coverage do
+ local set=sets[newindex+1]
+ local hash={}
+ for i=1,#set do
+ local value=set[i]
+ if value then
+ local other=value[1]
+ local share=shared[value]
+ if share==nil then
+ local first=value[2]
+ local second=value[3]
+ if first or second then
+ share={ first,second or nil }
+ else
+ share=false
+ end
+ shared[value]=share
+ end
+ hash[other]=share or nil
+ end
+ end
+ coverage[index]=hash
+ end
+ return {
+ shared=shared and true or nil,
+ format="pair",
+ coverage=coverage,
+ }
+ elseif subtype==2 then
+ local coverage=readushort(f)
+ local format1=readushort(f)
+ local format2=readushort(f)
+ local classdef1=readushort(f)
+ local classdef2=readushort(f)
+ local nofclasses1=readushort(f)
+ local nofclasses2=readushort(f)
+ local classlist=readpairclasssets(f,nofclasses1,nofclasses2,format1,format2,tableoffset,getdelta)
+ coverage=readcoverage(f,tableoffset+coverage)
+ classdef1=readclassdef(f,tableoffset+classdef1,coverage)
+ classdef2=readclassdef(f,tableoffset+classdef2,nofglyphs)
+ local usedcoverage={}
+ local shared={}
+ for g1,c1 in next,classdef1 do
+ if coverage[g1] then
+ local l1=classlist[c1]
+ if l1 then
+ local hash={}
+ for paired,class in next,classdef2 do
+ local offsets=l1[class]
+ if offsets then
+ local first=offsets[1]
+ local second=offsets[2]
+ if first or second then
+ local s1=shared[first]
+ if s1==nil then
+ s1={}
+ shared[first]=s1
+ end
+ local s2=s1[second]
+ if s2==nil then
+ s2={ first,second or nil }
+ s1[second]=s2
+ end
+ hash[paired]=s2
+ end
+ end
+ end
+ usedcoverage[g1]=hash
+ end
+ end
+ end
+ return {
+ shared=shared and true or nil,
+ format="pair",
+ coverage=usedcoverage,
+ }
+ elseif subtype==3 then
+ report("yet unsupported subtype %a in %a positioning",subtype,"pair")
+ else
+ report("unsupported subtype %a in %a positioning",subtype,"pair")
+ end
+end
+function gposhandlers.cursive(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ local tableoffset=lookupoffset+offset
+ setposition(f,tableoffset)
+ local subtype=readushort(f)
+ local getdelta=fontdata.temporary.getdelta
+ if subtype==1 then
+ local coverage=tableoffset+readushort(f)
+ local nofrecords=readushort(f)
+ local records={}
+ for i=1,nofrecords do
+ local entry=readushort(f)
+ local exit=readushort(f)
+ records[i]={
+ entry~=0 and (tableoffset+entry) or false,
+ exit~=0 and (tableoffset+exit ) or nil,
+ }
+ end
+ local cc=(fontdata.temporary.cursivecount or 0)+1
+ fontdata.temporary.cursivecount=cc
+ cc="cc-"..cc
+ coverage=readcoverage(f,coverage)
+ for i=1,nofrecords do
+ local r=records[i]
+ records[i]={
+ cc,
+ readanchor(f,r[1],getdelta) or false,
+ readanchor(f,r[2],getdelta) or nil,
+ }
+ end
+ for index,newindex in next,coverage do
+ coverage[index]=records[newindex+1]
+ end
+ return {
+ coverage=coverage,
+ }
+ else
+ report("unsupported subtype %a in %a positioning",subtype,"cursive")
+ end
+end
+local function handlemark(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,ligature)
+ local tableoffset=lookupoffset+offset
+ setposition(f,tableoffset)
+ local subtype=readushort(f)
+ local getdelta=fontdata.temporary.getdelta
+ if subtype==1 then
+ local markcoverage=tableoffset+readushort(f)
+ local basecoverage=tableoffset+readushort(f)
+ local nofclasses=readushort(f)
+ local markoffset=tableoffset+readushort(f)
+ local baseoffset=tableoffset+readushort(f)
+ local markcoverage=readcoverage(f,markcoverage)
+ local basecoverage=readcoverage(f,basecoverage,true)
+ setposition(f,markoffset)
+ local markclasses={}
+ local nofmarkclasses=readushort(f)
+ local lastanchor=fontdata.lastanchor or 0
+ local usedanchors={}
+ for i=1,nofmarkclasses do
+ local class=readushort(f)+1
+ local offset=readushort(f)
+ if offset==0 then
+ markclasses[i]=false
+ else
+ markclasses[i]={ class,markoffset+offset }
+ end
+ usedanchors[class]=true
+ end
+ for i=1,nofmarkclasses do
+ local mc=markclasses[i]
+ if mc then
+ mc[2]=readanchor(f,mc[2],getdelta)
+ end
+ end
+ setposition(f,baseoffset)
+ local nofbaserecords=readushort(f)
+ local baserecords={}
+ if ligature then
+ for i=1,nofbaserecords do
+ local offset=readushort(f)
+ if offset==0 then
+ baserecords[i]=false
+ else
+ baserecords[i]=baseoffset+offset
+ end
+ end
+ for i=1,nofbaserecords do
+ local recordoffset=baserecords[i]
+ if recordoffset then
+ setposition(f,recordoffset)
+ local nofcomponents=readushort(f)
+ local components={}
+ for i=1,nofcomponents do
+ local classes={}
+ for i=1,nofclasses do
+ local offset=readushort(f)
+ if offset~=0 then
+ classes[i]=recordoffset+offset
+ else
+ classes[i]=false
+ end
+ end
+ components[i]=classes
+ end
+ baserecords[i]=components
+ end
+ end
+ local baseclasses={}
+ for i=1,nofclasses do
+ baseclasses[i]={}
+ end
+ for i=1,nofbaserecords do
+ local components=baserecords[i]
+ if components then
+ local b=basecoverage[i]
+ for c=1,#components do
+ local classes=components[c]
+ if classes then
+ for i=1,nofclasses do
+ local anchor=readanchor(f,classes[i],getdelta)
+ local bclass=baseclasses[i]
+ local bentry=bclass[b]
+ if bentry then
+ bentry[c]=anchor
+ else
+ bclass[b]={ [c]=anchor }
+ end
+ end
+ end
+ end
+ end
+ end
+ for index,newindex in next,markcoverage do
+ markcoverage[index]=markclasses[newindex+1] or nil
+ end
+ return {
+ format="ligature",
+ baseclasses=baseclasses,
+ coverage=markcoverage,
+ }
+ else
+ for i=1,nofbaserecords do
+ local r={}
+ for j=1,nofclasses do
+ local offset=readushort(f)
+ if offset==0 then
+ r[j]=false
+ else
+ r[j]=baseoffset+offset
+ end
+ end
+ baserecords[i]=r
+ end
+ local baseclasses={}
+ for i=1,nofclasses do
+ baseclasses[i]={}
+ end
+ for i=1,nofbaserecords do
+ local r=baserecords[i]
+ local b=basecoverage[i]
+ for j=1,nofclasses do
+ baseclasses[j][b]=readanchor(f,r[j],getdelta)
+ end
+ end
+ for index,newindex in next,markcoverage do
+ markcoverage[index]=markclasses[newindex+1] or nil
+ end
+ return {
+ format="base",
+ baseclasses=baseclasses,
+ coverage=markcoverage,
+ }
+ end
+ else
+ report("unsupported subtype %a in",subtype)
+ end
+end
+function gposhandlers.marktobase(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ return handlemark(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+end
+function gposhandlers.marktoligature(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ return handlemark(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,true)
+end
+function gposhandlers.marktomark(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ return handlemark(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+end
+function gposhandlers.context(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ return unchainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,"positioning"),"context"
+end
+function gposhandlers.chainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ return chainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,"positioning"),"chainedcontext"
+end
+function gposhandlers.extension(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+ return extension(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs,gpostypes,gposhandlers,"positioning")
+end
+do
+ local plugins={}
+ function plugins.size(f,fontdata,tableoffset,feature)
+ if fontdata.designsize then
+ else
+ local function check(offset)
+ setposition(f,offset)
+ local designsize=readushort(f)
+ if designsize>0 then
+ local fontstyleid=readushort(f)
+ local guimenuid=readushort(f)
+ local minsize=readushort(f)
+ local maxsize=readushort(f)
+ if minsize==0 and maxsize==0 and fontstyleid==0 and guimenuid==0 then
+ minsize=designsize
+ maxsize=designsize
+ end
+ if designsize>=minsize and designsize<=maxsize then
+ return minsize,maxsize,designsize
+ end
+ end
+ end
+ local minsize,maxsize,designsize=check(tableoffset+feature.offset+feature.parameters)
+ if not designsize then
+ minsize,maxsize,designsize=check(tableoffset+feature.parameters)
+ if designsize then
+ report("bad size feature in %a, falling back to wrong offset",fontdata.filename or "?")
+ else
+ report("bad size feature in %a,",fontdata.filename or "?")
+ end
+ end
+ if designsize then
+ fontdata.minsize=minsize
+ fontdata.maxsize=maxsize
+ fontdata.designsize=designsize
+ end
+ end
+ end
+ local function reorderfeatures(fontdata,scripts,features)
+ local scriptlangs={}
+ local featurehash={}
+ local featureorder={}
+ for script,languages in next,scripts do
+ for language,record in next,languages do
+ local hash={}
+ local list=record.featureindices
+ for k=1,#list do
+ local index=list[k]
+ local feature=features[index]
+ local lookups=feature.lookups
+ local tag=feature.tag
+ if tag then
+ hash[tag]=true
+ end
+ if lookups then
+ for i=1,#lookups do
+ local lookup=lookups[i]
+ local o=featureorder[lookup]
+ if o then
+ local okay=true
+ for i=1,#o do
+ if o[i]==tag then
+ okay=false
+ break
+ end
+ end
+ if okay then
+ o[#o+1]=tag
+ end
+ else
+ featureorder[lookup]={ tag }
+ end
+ local f=featurehash[lookup]
+ if f then
+ local h=f[tag]
+ if h then
+ local s=h[script]
+ if s then
+ s[language]=true
+ else
+ h[script]={ [language]=true }
+ end
+ else
+ f[tag]={ [script]={ [language]=true } }
+ end
+ else
+ featurehash[lookup]={ [tag]={ [script]={ [language]=true } } }
+ end
+ local h=scriptlangs[tag]
+ if h then
+ local s=h[script]
+ if s then
+ s[language]=true
+ else
+ h[script]={ [language]=true }
+ end
+ else
+ scriptlangs[tag]={ [script]={ [language]=true } }
+ end
+ end
+ end
+ end
+ end
+ end
+ return scriptlangs,featurehash,featureorder
+ end
+ local function readscriplan(f,fontdata,scriptoffset)
+ setposition(f,scriptoffset)
+ local nofscripts=readushort(f)
+ local scripts={}
+ for i=1,nofscripts do
+ scripts[readtag(f)]=scriptoffset+readushort(f)
+ end
+ local languagesystems=setmetatableindex("table")
+ for script,offset in next,scripts do
+ setposition(f,offset)
+ local defaultoffset=readushort(f)
+ local noflanguages=readushort(f)
+ local languages={}
+ if defaultoffset>0 then
+ languages.dflt=languagesystems[offset+defaultoffset]
+ end
+ for i=1,noflanguages do
+ local language=readtag(f)
+ local offset=offset+readushort(f)
+ languages[language]=languagesystems[offset]
+ end
+ scripts[script]=languages
+ end
+ for offset,usedfeatures in next,languagesystems do
+ if offset>0 then
+ setposition(f,offset)
+ local featureindices={}
+ usedfeatures.featureindices=featureindices
+ usedfeatures.lookuporder=readushort(f)
+ usedfeatures.requiredindex=readushort(f)
+ local noffeatures=readushort(f)
+ for i=1,noffeatures do
+ featureindices[i]=readushort(f)+1
+ end
+ end
+ end
+ return scripts
+ end
+ local function readfeatures(f,fontdata,featureoffset)
+ setposition(f,featureoffset)
+ local features={}
+ local noffeatures=readushort(f)
+ for i=1,noffeatures do
+ features[i]={
+ tag=readtag(f),
+ offset=readushort(f)
+ }
+ end
+ for i=1,noffeatures do
+ local feature=features[i]
+ local offset=featureoffset+feature.offset
+ setposition(f,offset)
+ local parameters=readushort(f)
+ local noflookups=readushort(f)
+ if noflookups>0 then
+ local lookups=readcardinaltable(f,noflookups,ushort)
+ feature.lookups=lookups
+ for j=1,noflookups do
+ lookups[j]=lookups[j]+1
+ end
+ end
+ if parameters>0 then
+ feature.parameters=parameters
+ local plugin=plugins[feature.tag]
+ if plugin then
+ plugin(f,fontdata,featureoffset,feature)
+ end
+ end
+ end
+ return features
+ end
+ local function readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder)
+ setposition(f,lookupoffset)
+ local noflookups=readushort(f)
+ local lookups=readcardinaltable(f,noflookups,ushort)
+ for lookupid=1,noflookups do
+ local offset=lookups[lookupid]
+ setposition(f,lookupoffset+offset)
+ local subtables={}
+ local typebits=readushort(f)
+ local flagbits=readushort(f)
+ local lookuptype=lookuptypes[typebits]
+ local lookupflags=lookupflags[flagbits]
+ local nofsubtables=readushort(f)
+ for j=1,nofsubtables do
+ subtables[j]=offset+readushort(f)
+ end
+ local markclass=band(flagbits,0x0010)~=0
+ if markclass then
+ markclass=readushort(f)
+ end
+ local markset=rshift(flagbits,8)
+ if markset>0 then
+ markclass=markset
+ end
+ lookups[lookupid]={
+ type=lookuptype,
+ flags=lookupflags,
+ name=lookupid,
+ subtables=subtables,
+ markclass=markclass,
+ features=featurehash[lookupid],
+ order=featureorder[lookupid],
+ }
+ end
+ return lookups
+ end
+ local f_lookupname=formatters["%s_%s_%s"]
+ local function resolvelookups(f,lookupoffset,fontdata,lookups,lookuptypes,lookuphandlers,what,tableoffset)
+ local sequences=fontdata.sequences or {}
+ local sublookuplist=fontdata.sublookups or {}
+ fontdata.sequences=sequences
+ fontdata.sublookups=sublookuplist
+ local nofsublookups=#sublookuplist
+ local nofsequences=#sequences
+ local lastsublookup=nofsublookups
+ local lastsequence=nofsequences
+ local lookupnames=lookupnames[what]
+ local sublookuphash={}
+ local sublookupcheck={}
+ local glyphs=fontdata.glyphs
+ local nofglyphs=fontdata.nofglyphs or #glyphs
+ local noflookups=#lookups
+ local lookupprefix=sub(what,2,2)
+ local usedlookups=false
+ for lookupid=1,noflookups do
+ local lookup=lookups[lookupid]
+ local lookuptype=lookup.type
+ local subtables=lookup.subtables
+ local features=lookup.features
+ local handler=lookuphandlers[lookuptype]
+ if handler then
+ local nofsubtables=#subtables
+ local order=lookup.order
+ local flags=lookup.flags
+ if flags[1] then flags[1]="mark" end
+ if flags[2] then flags[2]="ligature" end
+ if flags[3] then flags[3]="base" end
+ local markclass=lookup.markclass
+ if nofsubtables>0 then
+ local steps={}
+ local nofsteps=0
+ local oldtype=nil
+ for s=1,nofsubtables do
+ local step,lt=handler(f,fontdata,lookupid,lookupoffset,subtables[s],glyphs,nofglyphs)
+ if lt then
+ lookuptype=lt
+ if oldtype and lt~=oldtype then
+ report("messy %s lookup type %a and %a",what,lookuptype,oldtype)
+ end
+ oldtype=lookuptype
+ end
+ if not step then
+ report("unsupported %s lookup type %a",what,lookuptype)
+ else
+ nofsteps=nofsteps+1
+ steps[nofsteps]=step
+ local rules=step.rules
+ if rules then
+ for i=1,#rules do
+ local rule=rules[i]
+ local before=rule.before
+ local current=rule.current
+ local after=rule.after
+ local replacements=rule.replacements
+ if before then
+ for i=1,#before do
+ before[i]=tohash(before[i])
+ end
+ rule.before=reversed(before)
+ end
+ if current then
+ if replacements then
+ local first=current[1]
+ local hash={}
+ local repl={}
+ for i=1,#first do
+ local c=first[i]
+ hash[c]=true
+ repl[c]=replacements[i]
+ end
+ rule.current={ hash }
+ rule.replacements=repl
+ else
+ for i=1,#current do
+ current[i]=tohash(current[i])
+ end
+ end
+ else
+ end
+ if after then
+ for i=1,#after do
+ after[i]=tohash(after[i])
+ end
+ end
+ if usedlookups then
+ local lookups=rule.lookups
+ if lookups then
+ for k,v in next,lookups do
+ if v then
+ for k,v in next,v do
+ usedlookups[v]=usedlookups[v]+1
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if nofsteps~=nofsubtables then
+ report("bogus subtables removed in %s lookup type %a",what,lookuptype)
+ end
+ lookuptype=lookupnames[lookuptype] or lookuptype
+ if features then
+ nofsequences=nofsequences+1
+ local l={
+ index=nofsequences,
+ name=f_lookupname(lookupprefix,"s",lookupid+lookupidoffset),
+ steps=steps,
+ nofsteps=nofsteps,
+ type=lookuptype,
+ markclass=markclass or nil,
+ flags=flags,
+ order=order,
+ features=features,
+ }
+ sequences[nofsequences]=l
+ lookup.done=l
+ else
+ nofsublookups=nofsublookups+1
+ local l={
+ index=nofsublookups,
+ name=f_lookupname(lookupprefix,"l",lookupid+lookupidoffset),
+ steps=steps,
+ nofsteps=nofsteps,
+ type=lookuptype,
+ markclass=markclass or nil,
+ flags=flags,
+ }
+ sublookuplist[nofsublookups]=l
+ sublookuphash[lookupid]=nofsublookups
+ sublookupcheck[lookupid]=0
+ lookup.done=l
+ end
+ else
+ report("no subtables for lookup %a",lookupid)
+ end
+ else
+ report("no handler for lookup %a with type %a",lookupid,lookuptype)
+ end
+ end
+ if usedlookups then
+ report("used %s lookups: % t",what,sortedkeys(usedlookups))
+ end
+ local reported={}
+ local function report_issue(i,what,sequence,kind)
+ local name=sequence.name
+ if not reported[name] then
+ report("rule %i in %s lookup %a has %s lookups",i,what,name,kind)
+ reported[name]=true
+ end
+ end
+ for i=lastsequence+1,nofsequences do
+ local sequence=sequences[i]
+ local steps=sequence.steps
+ for i=1,#steps do
+ local step=steps[i]
+ local rules=step.rules
+ if rules then
+ for i=1,#rules do
+ local rule=rules[i]
+ local rlookups=rule.lookups
+ if not rlookups then
+ report_issue(i,what,sequence,"no")
+ elseif not next(rlookups) then
+ rule.lookups=nil
+ else
+ local length=#rlookups
+ for index=1,length do
+ local lookuplist=rlookups[index]
+ if lookuplist then
+ local length=#lookuplist
+ local found={}
+ local noffound=0
+ for index=1,length do
+ local lookupid=lookuplist[index]
+ if lookupid then
+ local h=sublookuphash[lookupid]
+ if not h then
+ local lookup=lookups[lookupid]
+ if lookup then
+ local d=lookup.done
+ if d then
+ nofsublookups=nofsublookups+1
+ local l={
+ index=nofsublookups,
+ name=f_lookupname(lookupprefix,"d",lookupid+lookupidoffset),
+ derived=true,
+ steps=d.steps,
+ nofsteps=d.nofsteps,
+ type=d.lookuptype or "gsub_single",
+ markclass=d.markclass or nil,
+ flags=d.flags,
+ }
+ sublookuplist[nofsublookups]=copy(l)
+ sublookuphash[lookupid]=nofsublookups
+ sublookupcheck[lookupid]=1
+ h=nofsublookups
+ else
+ report_issue(i,what,sequence,"missing")
+ rule.lookups=nil
+ break
+ end
+ else
+ report_issue(i,what,sequence,"bad")
+ rule.lookups=nil
+ break
+ end
+ else
+ sublookupcheck[lookupid]=sublookupcheck[lookupid]+1
+ end
+ if h then
+ noffound=noffound+1
+ found[noffound]=h
+ end
+ end
+ end
+ rlookups[index]=noffound>0 and found or false
+ else
+ rlookups[index]=false
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ for i,n in sortedhash(sublookupcheck) do
+ local l=lookups[i]
+ local t=l.type
+ if n==0 and t~="extension" then
+ local d=l.done
+ report("%s lookup %s of type %a is not used",what,d and d.name or l.name,t)
+ end
+ end
+ end
+ local function loadvariations(f,fontdata,variationsoffset,lookuptypes,featurehash,featureorder)
+ setposition(f,variationsoffset)
+ local version=readulong(f)
+ local nofrecords=readulong(f)
+ local records={}
+ for i=1,nofrecords do
+ records[i]={
+ conditions=readulong(f),
+ substitutions=readulong(f),
+ }
+ end
+ for i=1,nofrecords do
+ local record=records[i]
+ local offset=record.conditions
+ if offset==0 then
+ record.condition=nil
+ record.matchtype="always"
+ else
+ local offset=variationsoffset+offset
+ setposition(f,offset)
+ local nofconditions=readushort(f)
+ local conditions={}
+ for i=1,nofconditions do
+ conditions[i]=offset+readulong(f)
+ end
+ record.conditions=conditions
+ record.matchtype="condition"
+ end
+ end
+ for i=1,nofrecords do
+ local record=records[i]
+ if record.matchtype=="condition" then
+ local conditions=record.conditions
+ for i=1,#conditions do
+ setposition(f,conditions[i])
+ conditions[i]={
+ format=readushort(f),
+ axis=readushort(f),
+ minvalue=read2dot14(f),
+ maxvalue=read2dot14(f),
+ }
+ end
+ end
+ end
+ for i=1,nofrecords do
+ local record=records[i]
+ local offset=record.substitutions
+ if offset==0 then
+ record.substitutions={}
+ else
+ setposition(f,variationsoffset+offset)
+ local version=readulong(f)
+ local nofsubstitutions=readushort(f)
+ local substitutions={}
+ for i=1,nofsubstitutions do
+ substitutions[readushort(f)]=readulong(f)
+ end
+ for index,alternates in sortedhash(substitutions) do
+ if index==0 then
+ record.substitutions=false
+ else
+ local tableoffset=variationsoffset+offset+alternates
+ setposition(f,tableoffset)
+ local parameters=readulong(f)
+ local noflookups=readushort(f)
+ local lookups=readcardinaltable(f,noflookups,ushort)
+ record.substitutions=lookups
+ end
+ end
+ end
+ end
+ setvariabledata(fontdata,"features",records)
+ end
+ local function readscripts(f,fontdata,what,lookuptypes,lookuphandlers,lookupstoo)
+ local tableoffset=gotodatatable(f,fontdata,what,true)
+ if tableoffset then
+ local version=readulong(f)
+ local scriptoffset=tableoffset+readushort(f)
+ local featureoffset=tableoffset+readushort(f)
+ local lookupoffset=tableoffset+readushort(f)
+ local variationsoffset=version>0x00010000 and (tableoffset+readulong(f)) or 0
+ if not scriptoffset then
+ return
+ end
+ local scripts=readscriplan(f,fontdata,scriptoffset)
+ local features=readfeatures(f,fontdata,featureoffset)
+ local scriptlangs,featurehash,featureorder=reorderfeatures(fontdata,scripts,features)
+ if fontdata.features then
+ fontdata.features[what]=scriptlangs
+ else
+ fontdata.features={ [what]=scriptlangs }
+ end
+ if not lookupstoo then
+ return
+ end
+ local lookups=readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder)
+ if lookups then
+ resolvelookups(f,lookupoffset,fontdata,lookups,lookuptypes,lookuphandlers,what,tableoffset)
+ end
+ if variationsoffset>0 then
+ loadvariations(f,fontdata,variationsoffset,lookuptypes,featurehash,featureorder)
+ end
+ end
+ end
+ local function checkkerns(f,fontdata,specification)
+ local datatable=fontdata.tables.kern
+ if not datatable then
+ return
+ end
+ local features=fontdata.features
+ local gposfeatures=features and features.gpos
+ local name
+ if not gposfeatures or not gposfeatures.kern then
+ name="kern"
+ elseif specification.globalkerns then
+ name="globalkern"
+ else
+ report("ignoring global kern table, using gpos kern feature")
+ return
+ end
+ setposition(f,datatable.offset)
+ local version=readushort(f)
+ local noftables=readushort(f)
+ if noftables>1 then
+ report("adding global kern table as gpos feature %a",name)
+ local kerns=setmetatableindex("table")
+ for i=1,noftables do
+ local version=readushort(f)
+ local length=readushort(f)
+ local coverage=readushort(f)
+ local format=rshift(coverage,8)
+ if format==0 then
+ local nofpairs=readushort(f)
+ local searchrange=readushort(f)
+ local entryselector=readushort(f)
+ local rangeshift=readushort(f)
+ for i=1,nofpairs do
+ kerns[readushort(f)][readushort(f)]=readfword(f)
+ end
+ elseif format==2 then
+ else
+ end
+ end
+ local feature={ dflt={ dflt=true } }
+ if not features then
+ fontdata.features={ gpos={ [name]=feature } }
+ elseif not gposfeatures then
+ fontdata.features.gpos={ [name]=feature }
+ else
+ gposfeatures[name]=feature
+ end
+ local sequences=fontdata.sequences
+ if not sequences then
+ sequences={}
+ fontdata.sequences=sequences
+ end
+ local nofsequences=#sequences+1
+ sequences[nofsequences]={
+ index=nofsequences,
+ name=name,
+ steps={
+ {
+ coverage=kerns,
+ format="kern",
+ },
+ },
+ nofsteps=1,
+ type="gpos_pair",
+ flags={ false,false,false,false },
+ order={ name },
+ features={ [name]=feature },
+ }
+ else
+ report("ignoring empty kern table of feature %a",name)
+ end
+ end
+ function readers.gsub(f,fontdata,specification)
+ if specification.details then
+ readscripts(f,fontdata,"gsub",gsubtypes,gsubhandlers,specification.lookups)
+ end
+ end
+ function readers.gpos(f,fontdata,specification)
+ if specification.details then
+ readscripts(f,fontdata,"gpos",gpostypes,gposhandlers,specification.lookups)
+ if specification.lookups then
+ checkkerns(f,fontdata,specification)
+ end
+ end
+ end
+end
+function readers.gdef(f,fontdata,specification)
+ if not specification.glyphs then
+ return
+ end
+ local datatable=fontdata.tables.gdef
+ if datatable then
+ local tableoffset=datatable.offset
+ setposition(f,tableoffset)
+ local version=readulong(f)
+ local classoffset=readushort(f)
+ local attachmentoffset=readushort(f)
+ local ligaturecarets=readushort(f)
+ local markclassoffset=readushort(f)
+ local marksetsoffset=version>=0x00010002 and readushort(f) or 0
+ local varsetsoffset=version>=0x00010003 and readulong(f) or 0
+ local glyphs=fontdata.glyphs
+ local marks={}
+ local markclasses=setmetatableindex("table")
+ local marksets=setmetatableindex("table")
+ fontdata.marks=marks
+ fontdata.markclasses=markclasses
+ fontdata.marksets=marksets
+ if classoffset~=0 then
+ setposition(f,tableoffset+classoffset)
+ local classformat=readushort(f)
+ if classformat==1 then
+ local firstindex=readushort(f)
+ local lastindex=firstindex+readushort(f)-1
+ for index=firstindex,lastindex do
+ local class=classes[readushort(f)]
+ if class=="mark" then
+ marks[index]=true
+ end
+ glyphs[index].class=class
+ end
+ elseif classformat==2 then
+ local nofranges=readushort(f)
+ for i=1,nofranges do
+ local firstindex=readushort(f)
+ local lastindex=readushort(f)
+ local class=classes[readushort(f)]
+ if class then
+ for index=firstindex,lastindex do
+ glyphs[index].class=class
+ if class=="mark" then
+ marks[index]=true
+ end
+ end
+ end
+ end
+ end
+ end
+ if markclassoffset~=0 then
+ setposition(f,tableoffset+markclassoffset)
+ local classformat=readushort(f)
+ if classformat==1 then
+ local firstindex=readushort(f)
+ local lastindex=firstindex+readushort(f)-1
+ for index=firstindex,lastindex do
+ markclasses[readushort(f)][index]=true
+ end
+ elseif classformat==2 then
+ local nofranges=readushort(f)
+ for i=1,nofranges do
+ local firstindex=readushort(f)
+ local lastindex=readushort(f)
+ local class=markclasses[readushort(f)]
+ for index=firstindex,lastindex do
+ class[index]=true
+ end
+ end
+ end
+ end
+ if marksetsoffset~=0 then
+ marksetsoffset=tableoffset+marksetsoffset
+ setposition(f,marksetsoffset)
+ local format=readushort(f)
+ if format==1 then
+ local nofsets=readushort(f)
+ local sets=readcardinaltable(f,nofsets,ulong)
+ for i=1,nofsets do
+ local offset=sets[i]
+ if offset~=0 then
+ marksets[i]=readcoverage(f,marksetsoffset+offset)
+ end
+ end
+ end
+ end
+ local factors=specification.factors
+ if (specification.variable or factors) and varsetsoffset~=0 then
+ local regions,deltas=readvariationdata(f,tableoffset+varsetsoffset,factors)
+ if factors then
+ fontdata.temporary.getdelta=function(outer,inner)
+ local delta=deltas[outer+1]
+ if delta then
+ local d=delta.deltas[inner+1]
+ if d then
+ local scales=delta.scales
+ local dd=0
+ for i=1,#scales do
+ local di=d[i]
+ if di then
+ dd=dd+scales[i]*di
+ else
+ break
+ end
+ end
+ return round(dd)
+ end
+ end
+ return 0
+ end
+ end
+ end
+ end
+end
+local function readmathvalue(f)
+ local v=readshort(f)
+ skipshort(f,1)
+ return v
+end
+local function readmathconstants(f,fontdata,offset)
+ setposition(f,offset)
+ fontdata.mathconstants={
+ ScriptPercentScaleDown=readshort(f),
+ ScriptScriptPercentScaleDown=readshort(f),
+ DelimitedSubFormulaMinHeight=readushort(f),
+ DisplayOperatorMinHeight=readushort(f),
+ MathLeading=readmathvalue(f),
+ AxisHeight=readmathvalue(f),
+ AccentBaseHeight=readmathvalue(f),
+ FlattenedAccentBaseHeight=readmathvalue(f),
+ SubscriptShiftDown=readmathvalue(f),
+ SubscriptTopMax=readmathvalue(f),
+ SubscriptBaselineDropMin=readmathvalue(f),
+ SuperscriptShiftUp=readmathvalue(f),
+ SuperscriptShiftUpCramped=readmathvalue(f),
+ SuperscriptBottomMin=readmathvalue(f),
+ SuperscriptBaselineDropMax=readmathvalue(f),
+ SubSuperscriptGapMin=readmathvalue(f),
+ SuperscriptBottomMaxWithSubscript=readmathvalue(f),
+ SpaceAfterScript=readmathvalue(f),
+ UpperLimitGapMin=readmathvalue(f),
+ UpperLimitBaselineRiseMin=readmathvalue(f),
+ LowerLimitGapMin=readmathvalue(f),
+ LowerLimitBaselineDropMin=readmathvalue(f),
+ StackTopShiftUp=readmathvalue(f),
+ StackTopDisplayStyleShiftUp=readmathvalue(f),
+ StackBottomShiftDown=readmathvalue(f),
+ StackBottomDisplayStyleShiftDown=readmathvalue(f),
+ StackGapMin=readmathvalue(f),
+ StackDisplayStyleGapMin=readmathvalue(f),
+ StretchStackTopShiftUp=readmathvalue(f),
+ StretchStackBottomShiftDown=readmathvalue(f),
+ StretchStackGapAboveMin=readmathvalue(f),
+ StretchStackGapBelowMin=readmathvalue(f),
+ FractionNumeratorShiftUp=readmathvalue(f),
+ FractionNumeratorDisplayStyleShiftUp=readmathvalue(f),
+ FractionDenominatorShiftDown=readmathvalue(f),
+ FractionDenominatorDisplayStyleShiftDown=readmathvalue(f),
+ FractionNumeratorGapMin=readmathvalue(f),
+ FractionNumeratorDisplayStyleGapMin=readmathvalue(f),
+ FractionRuleThickness=readmathvalue(f),
+ FractionDenominatorGapMin=readmathvalue(f),
+ FractionDenominatorDisplayStyleGapMin=readmathvalue(f),
+ SkewedFractionHorizontalGap=readmathvalue(f),
+ SkewedFractionVerticalGap=readmathvalue(f),
+ OverbarVerticalGap=readmathvalue(f),
+ OverbarRuleThickness=readmathvalue(f),
+ OverbarExtraAscender=readmathvalue(f),
+ UnderbarVerticalGap=readmathvalue(f),
+ UnderbarRuleThickness=readmathvalue(f),
+ UnderbarExtraDescender=readmathvalue(f),
+ RadicalVerticalGap=readmathvalue(f),
+ RadicalDisplayStyleVerticalGap=readmathvalue(f),
+ RadicalRuleThickness=readmathvalue(f),
+ RadicalExtraAscender=readmathvalue(f),
+ RadicalKernBeforeDegree=readmathvalue(f),
+ RadicalKernAfterDegree=readmathvalue(f),
+ RadicalDegreeBottomRaisePercent=readshort(f),
+ }
+end
+local function readmathglyphinfo(f,fontdata,offset)
+ setposition(f,offset)
+ local italics=readushort(f)
+ local accents=readushort(f)
+ local extensions=readushort(f)
+ local kerns=readushort(f)
+ local glyphs=fontdata.glyphs
+ if italics~=0 then
+ setposition(f,offset+italics)
+ local coverage=readushort(f)
+ local nofglyphs=readushort(f)
+ coverage=readcoverage(f,offset+italics+coverage,true)
+ setposition(f,offset+italics+4)
+ for i=1,nofglyphs do
+ local italic=readmathvalue(f)
+ if italic~=0 then
+ local glyph=glyphs[coverage[i]]
+ local math=glyph.math
+ if not math then
+ glyph.math={ italic=italic }
+ else
+ math.italic=italic
+ end
+ end
+ end
+ fontdata.hasitalics=true
+ end
+ if accents~=0 then
+ setposition(f,offset+accents)
+ local coverage=readushort(f)
+ local nofglyphs=readushort(f)
+ coverage=readcoverage(f,offset+accents+coverage,true)
+ setposition(f,offset+accents+4)
+ for i=1,nofglyphs do
+ local accent=readmathvalue(f)
+ if accent~=0 then
+ local glyph=glyphs[coverage[i]]
+ local math=glyph.math
+ if not math then
+ glyph.math={ accent=accent }
+ else
+ math.accent=accent
+ end
+ end
+ end
+ end
+ if extensions~=0 then
+ setposition(f,offset+extensions)
+ end
+ if kerns~=0 then
+ local kernoffset=offset+kerns
+ setposition(f,kernoffset)
+ local coverage=readushort(f)
+ local nofglyphs=readushort(f)
+ if nofglyphs>0 then
+ local function get(offset)
+ setposition(f,kernoffset+offset)
+ local n=readushort(f)
+ if n==0 then
+ local k=readmathvalue(f)
+ if k==0 then
+ else
+ return { { kern=k } }
+ end
+ else
+ local l={}
+ for i=1,n do
+ l[i]={ height=readmathvalue(f) }
+ end
+ for i=1,n do
+ l[i].kern=readmathvalue(f)
+ end
+ l[n+1]={ kern=readmathvalue(f) }
+ return l
+ end
+ end
+ local kernsets={}
+ for i=1,nofglyphs do
+ local topright=readushort(f)
+ local topleft=readushort(f)
+ local bottomright=readushort(f)
+ local bottomleft=readushort(f)
+ kernsets[i]={
+ topright=topright~=0 and topright or nil,
+ topleft=topleft~=0 and topleft or nil,
+ bottomright=bottomright~=0 and bottomright or nil,
+ bottomleft=bottomleft~=0 and bottomleft or nil,
+ }
+ end
+ coverage=readcoverage(f,kernoffset+coverage,true)
+ for i=1,nofglyphs do
+ local kernset=kernsets[i]
+ if next(kernset) then
+ local k=kernset.topright if k then kernset.topright=get(k) end
+ local k=kernset.topleft if k then kernset.topleft=get(k) end
+ local k=kernset.bottomright if k then kernset.bottomright=get(k) end
+ local k=kernset.bottomleft if k then kernset.bottomleft=get(k) end
+ if next(kernset) then
+ local glyph=glyphs[coverage[i]]
+ local math=glyph.math
+ if math then
+ math.kerns=kernset
+ else
+ glyph.math={ kerns=kernset }
+ end
+ end
+ end
+ end
+ end
+ end
+end
+local function readmathvariants(f,fontdata,offset)
+ setposition(f,offset)
+ local glyphs=fontdata.glyphs
+ local minoverlap=readushort(f)
+ local vcoverage=readushort(f)
+ local hcoverage=readushort(f)
+ local vnofglyphs=readushort(f)
+ local hnofglyphs=readushort(f)
+ local vconstruction=readcardinaltable(f,vnofglyphs,ushort)
+ local hconstruction=readcardinaltable(f,hnofglyphs,ushort)
+ fontdata.mathconstants.MinConnectorOverlap=minoverlap
+ local function get(offset,coverage,nofglyphs,construction,kvariants,kparts,kitalic)
+ if coverage~=0 and nofglyphs>0 then
+ local coverage=readcoverage(f,offset+coverage,true)
+ for i=1,nofglyphs do
+ local c=construction[i]
+ if c~=0 then
+ local index=coverage[i]
+ local glyph=glyphs[index]
+ local math=glyph.math
+ setposition(f,offset+c)
+ local assembly=readushort(f)
+ local nofvariants=readushort(f)
+ if nofvariants>0 then
+ local variants,v=nil,0
+ for i=1,nofvariants do
+ local variant=readushort(f)
+ if variant==index then
+ elseif variants then
+ v=v+1
+ variants[v]=variant
+ else
+ v=1
+ variants={ variant }
+ end
+ skipshort(f)
+ end
+ if not variants then
+ elseif not math then
+ math={ [kvariants]=variants }
+ glyph.math=math
+ else
+ math[kvariants]=variants
+ end
+ end
+ if assembly~=0 then
+ setposition(f,offset+c+assembly)
+ local italic=readmathvalue(f)
+ local nofparts=readushort(f)
+ local parts={}
+ for i=1,nofparts do
+ local p={
+ glyph=readushort(f),
+ start=readushort(f),
+ ["end"]=readushort(f),
+ advance=readushort(f),
+ }
+ local flags=readushort(f)
+ if band(flags,0x0001)~=0 then
+ p.extender=1
+ end
+ parts[i]=p
+ end
+ if not math then
+ math={
+ [kparts]=parts
+ }
+ glyph.math=math
+ else
+ math[kparts]=parts
+ end
+ if italic and italic~=0 then
+ math[kitalic]=italic
+ end
+ end
+ end
+ end
+ end
+ end
+ get(offset,vcoverage,vnofglyphs,vconstruction,"vvariants","vparts","vitalic")
+ get(offset,hcoverage,hnofglyphs,hconstruction,"hvariants","hparts","hitalic")
+end
+function readers.math(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"math",specification.glyphs)
+ if tableoffset then
+ local version=readulong(f)
+ local constants=readushort(f)
+ local glyphinfo=readushort(f)
+ local variants=readushort(f)
+ if constants==0 then
+ report("the math table of %a has no constants",fontdata.filename)
+ else
+ readmathconstants(f,fontdata,tableoffset+constants)
+ end
+ if glyphinfo~=0 then
+ readmathglyphinfo(f,fontdata,tableoffset+glyphinfo)
+ end
+ if variants~=0 then
+ readmathvariants(f,fontdata,tableoffset+variants)
+ end
+ end
+end
+function readers.colr(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"colr",specification.glyphs)
+ if tableoffset then
+ local version=readushort(f)
+ if version~=0 then
+ report("table version %a of %a is not supported (yet), maybe font %s is bad",version,"colr",fontdata.filename)
+ return
+ end
+ if not fontdata.tables.cpal then
+ report("color table %a in font %a has no mandate %a table","colr",fontdata.filename,"cpal")
+ fontdata.colorpalettes={}
+ end
+ local glyphs=fontdata.glyphs
+ local nofglyphs=readushort(f)
+ local baseoffset=readulong(f)
+ local layeroffset=readulong(f)
+ local noflayers=readushort(f)
+ local layerrecords={}
+ local maxclass=0
+ setposition(f,tableoffset+layeroffset)
+ for i=1,noflayers do
+ local slot=readushort(f)
+ local class=readushort(f)
+ if class<0xFFFF then
+ class=class+1
+ if class>maxclass then
+ maxclass=class
+ end
+ end
+ layerrecords[i]={
+ slot=slot,
+ class=class,
+ }
+ end
+ fontdata.maxcolorclass=maxclass
+ setposition(f,tableoffset+baseoffset)
+ for i=0,nofglyphs-1 do
+ local glyphindex=readushort(f)
+ local firstlayer=readushort(f)
+ local noflayers=readushort(f)
+ local t={}
+ for i=1,noflayers do
+ t[i]=layerrecords[firstlayer+i]
+ end
+ glyphs[glyphindex].colors=t
+ end
+ end
+ fontdata.hascolor=true
+end
+function readers.cpal(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"cpal",specification.glyphs)
+ if tableoffset then
+ local version=readushort(f)
+ local nofpaletteentries=readushort(f)
+ local nofpalettes=readushort(f)
+ local nofcolorrecords=readushort(f)
+ local firstcoloroffset=readulong(f)
+ local colorrecords={}
+ local palettes=readcardinaltable(f,nofpalettes,ushort)
+ if version==1 then
+ local palettettypesoffset=readulong(f)
+ local palettelabelsoffset=readulong(f)
+ local paletteentryoffset=readulong(f)
+ end
+ setposition(f,tableoffset+firstcoloroffset)
+ for i=1,nofcolorrecords do
+ local b,g,r,a=readbytes(f,4)
+ colorrecords[i]={
+ r,g,b,a~=255 and a or nil,
+ }
+ end
+ for i=1,nofpalettes do
+ local p={}
+ local o=palettes[i]
+ for j=1,nofpaletteentries do
+ p[j]=colorrecords[o+j]
+ end
+ palettes[i]=p
+ end
+ fontdata.colorpalettes=palettes
+ end
+end
+local compress=gzip and gzip.compress
+local compressed=compress and gzip.compressed
+function readers.svg(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"svg",specification.glyphs)
+ if tableoffset then
+ local version=readushort(f)
+ local glyphs=fontdata.glyphs
+ local indexoffset=tableoffset+readulong(f)
+ local reserved=readulong(f)
+ setposition(f,indexoffset)
+ local nofentries=readushort(f)
+ local entries={}
+ for i=1,nofentries do
+ entries[i]={
+ first=readushort(f),
+ last=readushort(f),
+ offset=indexoffset+readulong(f),
+ length=readulong(f),
+ }
+ end
+ for i=1,nofentries do
+ local entry=entries[i]
+ setposition(f,entry.offset)
+ local data=readstring(f,entry.length)
+ if compressed and not compressed(data) then
+ data=compress(data)
+ end
+ entries[i]={
+ first=entry.first,
+ last=entry.last,
+ data=data
+ }
+ end
+ fontdata.svgshapes=entries
+ end
+ fontdata.hascolor=true
+end
+function readers.sbix(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"sbix",specification.glyphs)
+ if tableoffset then
+ local version=readushort(f)
+ local flags=readushort(f)
+ local nofstrikes=readulong(f)
+ local strikes={}
+ local nofglyphs=fontdata.nofglyphs
+ for i=1,nofstrikes do
+ strikes[i]=readulong(f)
+ end
+ local shapes={}
+ local done=0
+ for i=1,nofstrikes do
+ local strikeoffset=strikes[i]+tableoffset
+ setposition(f,strikeoffset)
+ strikes[i]={
+ ppem=readushort(f),
+ ppi=readushort(f),
+ offset=strikeoffset
+ }
+ end
+ sort(strikes,function(a,b)
+ if b.ppem==a.ppem then
+ return b.ppi0 or fonts.handlers.typethree
+ for i=1,nofstrikes do
+ local strike=strikes[i]
+ local strikeppem=strike.ppem
+ local strikeppi=strike.ppi
+ local strikeoffset=strike.offset
+ setposition(f,strikeoffset)
+ for i=0,nofglyphs do
+ glyphs[i]=readulong(f)
+ end
+ local glyphoffset=glyphs[0]
+ for i=0,nofglyphs-1 do
+ local nextoffset=glyphs[i+1]
+ if not shapes[i] then
+ local datasize=nextoffset-glyphoffset
+ if datasize>0 then
+ setposition(f,strikeoffset+glyphoffset)
+ local x=readshort(f)
+ local y=readshort(f)
+ local tag=readtag(f)
+ local size=datasize-8
+ local data=nil
+ local offset=nil
+ if delayed then
+ offset=getposition(f)
+ data=nil
+ else
+ data=readstring(f,size)
+ size=nil
+ end
+ shapes[i]={
+ x=x,
+ y=y,
+ o=offset,
+ s=size,
+ data=data,
+ }
+ done=done+1
+ if done==nofglyphs then
+ break
+ end
+ end
+ end
+ glyphoffset=nextoffset
+ end
+ end
+ fontdata.pngshapes=shapes
+ end
+end
+do
+ local function getmetrics(f)
+ return {
+ ascender=readinteger(f),
+ descender=readinteger(f),
+ widthmax=readuinteger(f),
+ caretslopedumerator=readinteger(f),
+ caretslopedenominator=readinteger(f),
+ caretoffset=readinteger(f),
+ minorigin=readinteger(f),
+ minadvance=readinteger(f),
+ maxbefore=readinteger(f),
+ minafter=readinteger(f),
+ pad1=readinteger(f),
+ pad2=readinteger(f),
+ }
+ end
+ local function getbigmetrics(f)
+ return {
+ height=readuinteger(f),
+ width=readuinteger(f),
+ horiBearingX=readinteger(f),
+ horiBearingY=readinteger(f),
+ horiAdvance=readuinteger(f),
+ vertBearingX=readinteger(f),
+ vertBearingY=readinteger(f),
+ vertAdvance=readuinteger(f),
+ }
+ end
+ local function getsmallmetrics(f)
+ return {
+ height=readuinteger(f),
+ width=readuinteger(f),
+ bearingX=readinteger(f),
+ bearingY=readinteger(f),
+ advance=readuinteger(f),
+ }
+ end
+ function readers.cblc(f,fontdata,specification)
+ local ctdttableoffset=gotodatatable(f,fontdata,"cbdt",specification.glyphs)
+ if not ctdttableoffset then
+ return
+ end
+ local cblctableoffset=gotodatatable(f,fontdata,"cblc",specification.glyphs)
+ if cblctableoffset then
+ local majorversion=readushort(f)
+ local minorversion=readushort(f)
+ local nofsizetables=readulong(f)
+ local sizetables={}
+ local shapes={}
+ local subtables={}
+ for i=1,nofsizetables do
+ sizetables[i]={
+ subtables=readulong(f),
+ indexsize=readulong(f),
+ nofsubtables=readulong(f),
+ colorref=readulong(f),
+ hormetrics=getmetrics(f),
+ vermetrics=getmetrics(f),
+ firstindex=readushort(f),
+ lastindex=readushort(f),
+ ppemx=readbyte(f),
+ ppemy=readbyte(f),
+ bitdepth=readbyte(f),
+ flags=readbyte(f),
+ }
+ end
+ sort(sizetables,function(a,b)
+ if b.ppemx==a.ppemx then
+ return b.bitdepth0 or fonts.handlers.typethree
+ for index,subtable in sortedhash(shapes) do
+ if type(subtable)=="table" then
+ local data=nil
+ local size=nil
+ local metrics=default
+ local format=subtable.format
+ local offset=subtable.offsets[index]
+ setposition(f,offset)
+ if format==17 then
+ metrics=getsmallmetrics(f)
+ size=true
+ elseif format==18 then
+ metrics=getbigmetrics(f)
+ size=true
+ elseif format==19 then
+ metrics=subtable.metrics
+ size=true
+ else
+ end
+ if size then
+ size=readulong(f)
+ if delayed then
+ offset=getposition(f)
+ data=nil
+ else
+ offset=nil
+ data=readstring(f,size)
+ size=nil
+ end
+ else
+ offset=nil
+ end
+ local x=metrics.width
+ local y=metrics.height
+ shapes[index]={
+ x=x,
+ y=y,
+ o=offset,
+ s=size,
+ data=data,
+ }
+ local glyph=glyphs[index]
+ if not glyph.boundingbox then
+ local width=glyph.width
+ local height=width*y/x
+ glyph.boundingbox={ 0,0,width,height }
+ end
+ else
+ shapes[index]={
+ x=0,
+ y=0,
+ data="",
+ }
+ end
+ end
+ fontdata.pngshapes=shapes
+ end
+ end
+ function readers.cbdt(f,fontdata,specification)
+ end
+end
+function readers.stat(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"stat",true)
+ if tableoffset then
+ local extras=fontdata.extras
+ local version=readulong(f)
+ local axissize=readushort(f)
+ local nofaxis=readushort(f)
+ local axisoffset=readulong(f)
+ local nofvalues=readushort(f)
+ local valuesoffset=readulong(f)
+ local fallbackname=extras[readushort(f)]
+ local axis={}
+ local values={}
+ setposition(f,tableoffset+axisoffset)
+ for i=1,nofaxis do
+ local tag=readtag(f)
+ axis[i]={
+ tag=tag,
+ name=lower(extras[readushort(f)] or tag),
+ ordering=readushort(f),
+ variants={}
+ }
+ end
+ setposition(f,tableoffset+valuesoffset)
+ for i=1,nofvalues do
+ values[i]=readushort(f)
+ end
+ for i=1,nofvalues do
+ setposition(f,tableoffset+valuesoffset+values[i])
+ local format=readushort(f)
+ local index=readushort(f)+1
+ local flags=readushort(f)
+ local name=lower(extras[readushort(f)] or "no name")
+ local value=readfixed(f)
+ local variant
+ if format==1 then
+ variant={
+ flags=flags,
+ name=name,
+ value=value,
+ }
+ elseif format==2 then
+ variant={
+ flags=flags,
+ name=name,
+ value=value,
+ minimum=readfixed(f),
+ maximum=readfixed(f),
+ }
+ elseif format==3 then
+ variant={
+ flags=flags,
+ name=name,
+ value=value,
+ link=readfixed(f),
+ }
+ end
+ insert(axis[index].variants,variant)
+ end
+ sort(axis,function(a,b)
+ return a.ordering=lastto then
+ else
+ values[#values+1]={ from,to }
+ lastfrom,lastto=from,to
+ end
+ end
+ nofvalues=#values
+ if nofvalues>2 then
+ local some=values[1]
+ if some[1]==-1 and some[2]==-1 then
+ some=values[nofvalues]
+ if some[1]==1 and some[2]==1 then
+ for i=2,nofvalues-1 do
+ some=values[i]
+ if some[1]==0 and some[2]==0 then
+ return values
+ end
+ end
+ end
+ end
+ end
+ return false
+ end
+ local version=readulong(f)
+ local reserved=readushort(f)
+ local nofaxis=readushort(f)
+ local segments={}
+ for i=1,nofaxis do
+ segments[i]=collect()
+ end
+ setvariabledata(fontdata,"segments",segments)
+ end
+end
+function readers.fvar(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"fvar",true)
+ if tableoffset then
+ local version=readulong(f)
+ local offsettoaxis=tableoffset+readushort(f)
+ local reserved=skipshort(f)
+ local nofaxis=readushort(f)
+ local sizeofaxis=readushort(f)
+ local nofinstances=readushort(f)
+ local sizeofinstances=readushort(f)
+ local extras=fontdata.extras
+ local axis={}
+ local instances={}
+ setposition(f,offsettoaxis)
+ for i=1,nofaxis do
+ axis[i]={
+ tag=readtag(f),
+ minimum=readfixed(f),
+ default=readfixed(f),
+ maximum=readfixed(f),
+ flags=readushort(f),
+ name=lower(extras[readushort(f)] or "bad name"),
+ }
+ local n=sizeofaxis-20
+ if n>0 then
+ skipbytes(f,n)
+ elseif n<0 then
+ end
+ end
+ local nofbytes=2+2+2+nofaxis*4
+ local readpsname=nofbytes<=sizeofinstances
+ local skippable=sizeofinstances-nofbytes
+ for i=1,nofinstances do
+ local subfamid=readushort(f)
+ local flags=readushort(f)
+ local values={}
+ for i=1,nofaxis do
+ values[i]={
+ axis=axis[i].tag,
+ value=readfixed(f),
+ }
+ end
+ local psnameid=readpsname and readushort(f) or 0xFFFF
+ if subfamid==2 or subfamid==17 then
+ elseif subfamid==0xFFFF then
+ subfamid=nil
+ elseif subfamid<=256 or subfamid>=32768 then
+ subfamid=nil
+ end
+ if psnameid==6 then
+ elseif psnameid==0xFFFF then
+ psnameid=nil
+ elseif psnameid<=256 or psnameid>=32768 then
+ psnameid=nil
+ end
+ instances[i]={
+ subfamily=extras[subfamid],
+ psname=psnameid and extras[psnameid] or nil,
+ values=values,
+ }
+ if skippable>0 then
+ skipbytes(f,skippable)
+ end
+ end
+ setvariabledata(fontdata,"axis",axis)
+ setvariabledata(fontdata,"instances",instances)
+ end
+end
+function readers.hvar(f,fontdata,specification)
+ local factors=specification.factors
+ if not factors then
+ return
+ end
+ local tableoffset=gotodatatable(f,fontdata,"hvar",specification.variable)
+ if not tableoffset then
+ return
+ end
+ local version=readulong(f)
+ local variationoffset=tableoffset+readulong(f)
+ local advanceoffset=tableoffset+readulong(f)
+ local lsboffset=tableoffset+readulong(f)
+ local rsboffset=tableoffset+readulong(f)
+ local regions={}
+ local variations={}
+ local innerindex={}
+ local outerindex={}
+ if variationoffset>0 then
+ regions,deltas=readvariationdata(f,variationoffset,factors)
+ end
+ if not regions then
+ return
+ end
+ if advanceoffset>0 then
+ setposition(f,advanceoffset)
+ local format=readushort(f)
+ local mapcount=readushort(f)
+ local entrysize=rshift(band(format,0x0030),4)+1
+ local nofinnerbits=band(format,0x000F)+1
+ local innermask=lshift(1,nofinnerbits)-1
+ local readcardinal=read_cardinal[entrysize]
+ for i=0,mapcount-1 do
+ local mapdata=readcardinal(f)
+ outerindex[i]=rshift(mapdata,nofinnerbits)
+ innerindex[i]=band(mapdata,innermask)
+ end
+ setvariabledata(fontdata,"hvarwidths",true)
+ local glyphs=fontdata.glyphs
+ for i=0,fontdata.nofglyphs-1 do
+ local glyph=glyphs[i]
+ local width=glyph.width
+ if width then
+ local outer=outerindex[i] or 0
+ local inner=innerindex[i] or i
+ if outer and inner then
+ local delta=deltas[outer+1]
+ if delta then
+ local d=delta.deltas[inner+1]
+ if d then
+ local scales=delta.scales
+ local deltaw=0
+ for i=1,#scales do
+ local di=d[i]
+ if di then
+ deltaw=deltaw+scales[i]*di
+ else
+ break
+ end
+ end
+ glyph.width=width+round(deltaw)
+ end
+ end
+ end
+ end
+ end
+ end
+end
+function readers.vvar(f,fontdata,specification)
+ if not specification.variable then
+ return
+ end
+end
+function readers.mvar(f,fontdata,specification)
+ local tableoffset=gotodatatable(f,fontdata,"mvar",specification.variable)
+ if tableoffset then
+ local version=readulong(f)
+ local reserved=skipshort(f,1)
+ local recordsize=readushort(f)
+ local nofrecords=readushort(f)
+ local offsettostore=tableoffset+readushort(f)
+ local dimensions={}
+ local factors=specification.factors
+ if factors then
+ local regions,deltas=readvariationdata(f,offsettostore,factors)
+ for i=1,nofrecords do
+ local tag=readtag(f)
+ local var=variabletags[tag]
+ if var then
+ local outer=readushort(f)
+ local inner=readushort(f)
+ local delta=deltas[outer+1]
+ if delta then
+ local d=delta.deltas[inner+1]
+ if d then
+ local scales=delta.scales
+ local dd=0
+ for i=1,#scales do
+ dd=dd+scales[i]*d[i]
+ end
+ var(fontdata,round(dd))
+ end
+ end
+ else
+ skipshort(f,2)
+ end
+ if recordsize>8 then
+ skipbytes(recordsize-8)
+ end
+ end
+ end
+ end
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-dsp”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-oup” 1700a2dac4f8b105c187d4e5b84cecdf] ---
+
+if not modules then modules={} end modules ['font-oup']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local next,type=next,type
+local P,R,S=lpeg.P,lpeg.R,lpeg.S
+local lpegmatch=lpeg.match
+local insert,remove,copy,unpack=table.insert,table.remove,table.copy,table.unpack
+local formatters=string.formatters
+local sortedkeys=table.sortedkeys
+local sortedhash=table.sortedhash
+local tohash=table.tohash
+local setmetatableindex=table.setmetatableindex
+local report_error=logs.reporter("otf reader","error")
+local report_markwidth=logs.reporter("otf reader","markwidth")
+local report_cleanup=logs.reporter("otf reader","cleanup")
+local report_optimizations=logs.reporter("otf reader","merges")
+local report_unicodes=logs.reporter("otf reader","unicodes")
+local trace_markwidth=false trackers.register("otf.markwidth",function(v) trace_markwidth=v end)
+local trace_cleanup=false trackers.register("otf.cleanups",function(v) trace_cleanups=v end)
+local trace_optimizations=false trackers.register("otf.optimizations",function(v) trace_optimizations=v end)
+local trace_unicodes=false trackers.register("otf.unicodes",function(v) trace_unicodes=v end)
+local readers=fonts.handlers.otf.readers
+local privateoffset=fonts.constructors and fonts.constructors.privateoffset or 0xF0000
+local f_private=formatters["P%05X"]
+local f_unicode=formatters["U%05X"]
+local f_index=formatters["I%05X"]
+local f_character_y=formatters["%C"]
+local f_character_n=formatters["[ %C ]"]
+local check_duplicates=true
+local check_soft_hyphen=true
+directives.register("otf.checksofthyphen",function(v)
+ check_soft_hyphen=v
+end)
+local function replaced(list,index,replacement)
+ if type(list)=="number" then
+ return replacement
+ elseif type(replacement)=="table" then
+ local t={}
+ local n=index-1
+ for i=1,n do
+ t[i]=list[i]
+ end
+ for i=1,#replacement do
+ n=n+1
+ t[n]=replacement[i]
+ end
+ for i=index+1,#list do
+ n=n+1
+ t[n]=list[i]
+ end
+ else
+ list[index]=replacement
+ return list
+ end
+end
+local function unifyresources(fontdata,indices)
+ local descriptions=fontdata.descriptions
+ local resources=fontdata.resources
+ if not descriptions or not resources then
+ return
+ end
+ local nofindices=#indices
+ local variants=fontdata.resources.variants
+ if variants then
+ for selector,unicodes in next,variants do
+ for unicode,index in next,unicodes do
+ unicodes[unicode]=indices[index]
+ end
+ end
+ end
+ local function remark(marks)
+ if marks then
+ local newmarks={}
+ for k,v in next,marks do
+ local u=indices[k]
+ if u then
+ newmarks[u]=v
+ elseif trace_optimizations then
+ report_optimizations("discarding mark %i",k)
+ end
+ end
+ return newmarks
+ end
+ end
+ local marks=resources.marks
+ if marks then
+ resources.marks=remark(marks)
+ end
+ local markclasses=resources.markclasses
+ if markclasses then
+ for class,marks in next,markclasses do
+ markclasses[class]=remark(marks)
+ end
+ end
+ local marksets=resources.marksets
+ if marksets then
+ for class,marks in next,marksets do
+ marksets[class]=remark(marks)
+ end
+ end
+ local done={}
+ local duplicates=check_duplicates and resources.duplicates
+ if duplicates and not next(duplicates) then
+ duplicates=false
+ end
+ local function recover(cover)
+ for i=1,#cover do
+ local c=cover[i]
+ if not done[c] then
+ local t={}
+ for k,v in next,c do
+ local ug=indices[k]
+ if ug then
+ t[ug]=v
+ else
+ report_error("case %i, bad index in unifying %s: %s of %s",1,"coverage",k,nofindices)
+ end
+ end
+ cover[i]=t
+ done[c]=d
+ end
+ end
+ end
+ local function recursed(c,kind)
+ local t={}
+ for g,d in next,c do
+ if type(d)=="table" then
+ local ug=indices[g]
+ if ug then
+ t[ug]=recursed(d,kind)
+ else
+ report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g,nofindices)
+ end
+ else
+ t[g]=indices[d]
+ end
+ end
+ return t
+ end
+ local function unifythem(sequences)
+ if not sequences then
+ return
+ end
+ for i=1,#sequences do
+ local sequence=sequences[i]
+ local kind=sequence.type
+ local steps=sequence.steps
+ local features=sequence.features
+ if steps then
+ for i=1,#steps do
+ local step=steps[i]
+ if kind=="gsub_single" then
+ local c=step.coverage
+ if c then
+ local t1=done[c]
+ if not t1 then
+ t1={}
+ if duplicates then
+ for g1,d1 in next,c do
+ local ug1=indices[g1]
+ if ug1 then
+ local ud1=indices[d1]
+ if ud1 then
+ t1[ug1]=ud1
+ local dg1=duplicates[ug1]
+ if dg1 then
+ for u in next,dg1 do
+ t1[u]=ud1
+ end
+ end
+ else
+ report_error("case %i, bad index in unifying %s: %s of %s",3,kind,d1,nofindices)
+ end
+ else
+ report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices)
+ end
+ end
+ else
+ for g1,d1 in next,c do
+ local ug1=indices[g1]
+ if ug1 then
+ t1[ug1]=indices[d1]
+ else
+ report_error("fuzzy case %i in unifying %s: %i",2,kind,g1)
+ end
+ end
+ end
+ done[c]=t1
+ end
+ step.coverage=t1
+ end
+ elseif kind=="gpos_pair" then
+ local c=step.coverage
+ if c then
+ local t1=done[c]
+ if not t1 then
+ t1={}
+ for g1,d1 in next,c do
+ local ug1=indices[g1]
+ if ug1 then
+ local t2=done[d1]
+ if not t2 then
+ t2={}
+ for g2,d2 in next,d1 do
+ local ug2=indices[g2]
+ if ug2 then
+ t2[ug2]=d2
+ else
+ report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g2,nofindices,nofindices)
+ end
+ end
+ done[d1]=t2
+ end
+ t1[ug1]=t2
+ else
+ report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices)
+ end
+ end
+ done[c]=t1
+ end
+ step.coverage=t1
+ end
+ elseif kind=="gsub_ligature" then
+ local c=step.coverage
+ if c then
+ step.coverage=recursed(c,kind)
+ end
+ elseif kind=="gsub_alternate" or kind=="gsub_multiple" then
+ local c=step.coverage
+ if c then
+ local t1=done[c]
+ if not t1 then
+ t1={}
+ if duplicates then
+ for g1,d1 in next,c do
+ for i=1,#d1 do
+ local d1i=d1[i]
+ local d1u=indices[d1i]
+ if d1u then
+ d1[i]=d1u
+ else
+ report_error("case %i, bad index in unifying %s: %s of %s",1,kind,i,d1i,nofindices)
+ end
+ end
+ local ug1=indices[g1]
+ if ug1 then
+ t1[ug1]=d1
+ local dg1=duplicates[ug1]
+ if dg1 then
+ for u in next,dg1 do
+ t1[u]=copy(d1)
+ end
+ end
+ else
+ report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices)
+ end
+ end
+ else
+ for g1,d1 in next,c do
+ for i=1,#d1 do
+ local d1i=d1[i]
+ local d1u=indices[d1i]
+ if d1u then
+ d1[i]=d1u
+ else
+ report_error("case %i, bad index in unifying %s: %s of %s",2,kind,d1i,nofindices)
+ end
+ end
+ t1[indices[g1]]=d1
+ end
+ end
+ done[c]=t1
+ end
+ step.coverage=t1
+ end
+ elseif kind=="gpos_single" then
+ local c=step.coverage
+ if c then
+ local t1=done[c]
+ if not t1 then
+ t1={}
+ if duplicates then
+ for g1,d1 in next,c do
+ local ug1=indices[g1]
+ if ug1 then
+ t1[ug1]=d1
+ local dg1=duplicates[ug1]
+ if dg1 then
+ for u in next,dg1 do
+ t1[u]=d1
+ end
+ end
+ else
+ report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices)
+ end
+ end
+ else
+ for g1,d1 in next,c do
+ local ug1=indices[g1]
+ if ug1 then
+ t1[ug1]=d1
+ else
+ report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices)
+ end
+ end
+ end
+ done[c]=t1
+ end
+ step.coverage=t1
+ end
+ elseif kind=="gpos_mark2base" or kind=="gpos_mark2mark" or kind=="gpos_mark2ligature" then
+ local c=step.coverage
+ if c then
+ local t1=done[c]
+ if not t1 then
+ t1={}
+ for g1,d1 in next,c do
+ local ug1=indices[g1]
+ if ug1 then
+ t1[ug1]=d1
+ else
+ report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices)
+ end
+ end
+ done[c]=t1
+ end
+ step.coverage=t1
+ end
+ local c=step.baseclasses
+ if c then
+ local t1=done[c]
+ if not t1 then
+ for g1,d1 in next,c do
+ local t2=done[d1]
+ if not t2 then
+ t2={}
+ for g2,d2 in next,d1 do
+ local ug2=indices[g2]
+ if ug2 then
+ t2[ug2]=d2
+ else
+ report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g2,nofindices)
+ end
+ end
+ done[d1]=t2
+ end
+ c[g1]=t2
+ end
+ done[c]=c
+ end
+ end
+ elseif kind=="gpos_cursive" then
+ local c=step.coverage
+ if c then
+ local t1=done[c]
+ if not t1 then
+ t1={}
+ if duplicates then
+ for g1,d1 in next,c do
+ local ug1=indices[g1]
+ if ug1 then
+ t1[ug1]=d1
+ local dg1=duplicates[ug1]
+ if dg1 then
+ for u in next,dg1 do
+ t1[u]=copy(d1)
+ end
+ end
+ else
+ report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices)
+ end
+ end
+ else
+ for g1,d1 in next,c do
+ local ug1=indices[g1]
+ if ug1 then
+ t1[ug1]=d1
+ else
+ report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices)
+ end
+ end
+ end
+ done[c]=t1
+ end
+ step.coverage=t1
+ end
+ end
+ local rules=step.rules
+ if rules then
+ for i=1,#rules do
+ local rule=rules[i]
+ local before=rule.before if before then recover(before) end
+ local after=rule.after if after then recover(after) end
+ local current=rule.current if current then recover(current) end
+ local replacements=rule.replacements
+ if replacements then
+ if not done[replacements] then
+ local r={}
+ for k,v in next,replacements do
+ r[indices[k]]=indices[v]
+ end
+ rule.replacements=r
+ done[replacements]=r
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ unifythem(resources.sequences)
+ unifythem(resources.sublookups)
+end
+local function copyduplicates(fontdata)
+ if check_duplicates then
+ local descriptions=fontdata.descriptions
+ local resources=fontdata.resources
+ local duplicates=resources.duplicates
+ if check_soft_hyphen then
+ local ds=descriptions[0xAD]
+ if not ds or ds.width==0 then
+ if ds then
+ descriptions[0xAD]=nil
+ if trace_unicodes then
+ report_unicodes("patching soft hyphen")
+ end
+ else
+ if trace_unicodes then
+ report_unicodes("adding soft hyphen")
+ end
+ end
+ if not duplicates then
+ duplicates={}
+ resources.duplicates=duplicates
+ end
+ local dh=duplicates[0x2D]
+ if dh then
+ dh[#dh+1]={ [0xAD]=true }
+ else
+ duplicates[0x2D]={ [0xAD]=true }
+ end
+ end
+ end
+ if duplicates then
+ for u,d in next,duplicates do
+ local du=descriptions[u]
+ if du then
+ local t={ f_character_y(u),"@",f_index(du.index),"->" }
+ local n=0
+ local m=25
+ for u in next,d do
+ if descriptions[u] then
+ if n0 then
+ t={}
+ n=0
+ local loops=0
+ while true do
+ loops=loops+1
+ local old=nofmissing
+ for i=1,#ligatures do
+ recursed(ligatures[i])
+ end
+ if nofmissing<=0 then
+ if trace_unicodes then
+ report_unicodes("all missings done in %s loops",loops)
+ end
+ return
+ elseif old==nofmissing then
+ break
+ end
+ end
+ t=nil
+ n=0
+ end
+ if trace_unicodes and nofmissing>0 then
+ local done={}
+ for i,r in next,missing do
+ if r then
+ local data=descriptions[i]
+ local name=data and data.name or f_index(i)
+ if not ignore[name] then
+ done[name]=true
+ end
+ end
+ end
+ if next(done) then
+ report_unicodes("not unicoded: % t",sortedkeys(done))
+ end
+ end
+end
+local firstprivate=fonts.privateoffsets and fonts.privateoffsets.textbase or 0xF0000
+local puafirst=0xE000
+local pualast=0xF8FF
+local function unifymissing(fontdata)
+ if not fonts.mappings then
+ require("font-map")
+ require("font-agl")
+ end
+ local unicodes={}
+ local resources=fontdata.resources
+ resources.unicodes=unicodes
+ for unicode,d in next,fontdata.descriptions do
+ if unicode=puafirst and unicode<=pualast then
+ else
+ local name=d.name
+ if name then
+ unicodes[name]=unicode
+ end
+ end
+ else
+ end
+ end
+ fonts.mappings.addtounicode(fontdata,fontdata.filename,checklookups)
+ resources.unicodes=nil
+end
+local function unifyglyphs(fontdata,usenames)
+ local private=fontdata.private or privateoffset
+ local glyphs=fontdata.glyphs
+ local indices={}
+ local descriptions={}
+ local names=usenames and {}
+ local resources=fontdata.resources
+ local zero=glyphs[0]
+ local zerocode=zero.unicode
+ if not zerocode then
+ zerocode=private
+ zero.unicode=zerocode
+ private=private+1
+ end
+ descriptions[zerocode]=zero
+ if names then
+ local name=glyphs[0].name or f_private(zerocode)
+ indices[0]=name
+ names[name]=zerocode
+ else
+ indices[0]=zerocode
+ end
+ if names then
+ for index=1,#glyphs do
+ local glyph=glyphs[index]
+ local unicode=glyph.unicode
+ if not unicode then
+ unicode=private
+ local name=glyph.name or f_private(unicode)
+ indices[index]=name
+ names[name]=unicode
+ private=private+1
+ elseif unicode>=firstprivate then
+ unicode=private
+ local name=glyph.name or f_private(unicode)
+ indices[index]=name
+ names[name]=unicode
+ private=private+1
+ elseif unicode>=puafirst and unicode<=pualast then
+ local name=glyph.name or f_private(unicode)
+ indices[index]=name
+ names[name]=unicode
+ elseif descriptions[unicode] then
+ unicode=private
+ local name=glyph.name or f_private(unicode)
+ indices[index]=name
+ names[name]=unicode
+ private=private+1
+ else
+ local name=glyph.name or f_unicode(unicode)
+ indices[index]=name
+ names[name]=unicode
+ end
+ descriptions[unicode]=glyph
+ end
+ elseif trace_unicodes then
+ for index=1,#glyphs do
+ local glyph=glyphs[index]
+ local unicode=glyph.unicode
+ if not unicode then
+ unicode=private
+ indices[index]=unicode
+ private=private+1
+ elseif unicode>=firstprivate then
+ local name=glyph.name
+ if name then
+ report_unicodes("moving glyph %a indexed %05X from private %U to %U ",name,index,unicode,private)
+ else
+ report_unicodes("moving glyph indexed %05X from private %U to %U ",index,unicode,private)
+ end
+ unicode=private
+ indices[index]=unicode
+ private=private+1
+ elseif unicode>=puafirst and unicode<=pualast then
+ local name=glyph.name
+ if name then
+ report_unicodes("keeping private unicode %U for glyph %a indexed %05X",unicode,name,index)
+ else
+ report_unicodes("keeping private unicode %U for glyph indexed %05X",unicode,index)
+ end
+ indices[index]=unicode
+ elseif descriptions[unicode] then
+ local name=glyph.name
+ if name then
+ report_unicodes("assigning duplicate unicode %U to %U for glyph %a indexed %05X ",unicode,private,name,index)
+ else
+ report_unicodes("assigning duplicate unicode %U to %U for glyph indexed %05X ",unicode,private,index)
+ end
+ unicode=private
+ indices[index]=unicode
+ private=private+1
+ else
+ indices[index]=unicode
+ end
+ descriptions[unicode]=glyph
+ end
+ else
+ for index=1,#glyphs do
+ local glyph=glyphs[index]
+ local unicode=glyph.unicode
+ if not unicode then
+ unicode=private
+ indices[index]=unicode
+ private=private+1
+ elseif unicode>=firstprivate then
+ local name=glyph.name
+ unicode=private
+ indices[index]=unicode
+ private=private+1
+ elseif unicode>=puafirst and unicode<=pualast then
+ local name=glyph.name
+ indices[index]=unicode
+ elseif descriptions[unicode] then
+ local name=glyph.name
+ unicode=private
+ indices[index]=unicode
+ private=private+1
+ else
+ indices[index]=unicode
+ end
+ descriptions[unicode]=glyph
+ end
+ end
+ for index=1,#glyphs do
+ local math=glyphs[index].math
+ if math then
+ local list=math.vparts
+ if list then
+ for i=1,#list do local l=list[i] l.glyph=indices[l.glyph] end
+ end
+ local list=math.hparts
+ if list then
+ for i=1,#list do local l=list[i] l.glyph=indices[l.glyph] end
+ end
+ local list=math.vvariants
+ if list then
+ for i=1,#list do list[i]=indices[list[i]] end
+ end
+ local list=math.hvariants
+ if list then
+ for i=1,#list do list[i]=indices[list[i]] end
+ end
+ end
+ end
+ local colorpalettes=resources.colorpalettes
+ if colorpalettes then
+ for index=1,#glyphs do
+ local colors=glyphs[index].colors
+ if colors then
+ for i=1,#colors do
+ local c=colors[i]
+ c.slot=indices[c.slot]
+ end
+ end
+ end
+ end
+ fontdata.private=private
+ fontdata.glyphs=nil
+ fontdata.names=names
+ fontdata.descriptions=descriptions
+ fontdata.hashmethod=hashmethod
+ return indices,names
+end
+local p_crappyname do
+ local p_hex=R("af","AF","09")
+ local p_digit=R("09")
+ local p_done=S("._-")^0+P(-1)
+ local p_alpha=R("az","AZ")
+ local p_ALPHA=R("AZ")
+ p_crappyname=(
+ lpeg.utfchartabletopattern({ "uni","u" },true)*S("Xx_")^0*p_hex^1
++lpeg.utfchartabletopattern({ "identity","glyph","jamo" },true)*p_hex^1
++lpeg.utfchartabletopattern({ "index","afii" },true)*p_digit^1
++p_digit*p_hex^3+p_alpha*p_digit^1
++P("aj")*p_digit^1+P("eh_")*(p_digit^1+p_ALPHA*p_digit^1)+(1-P("_"))^1*P("_uni")*p_hex^1+P("_")*P(1)^1
+ )*p_done
+end
+local forcekeep=false
+directives.register("otf.keepnames",function(v)
+ report_cleanup("keeping weird glyph names, expect larger files and more memory usage")
+ forcekeep=v
+end)
+local function stripredundant(fontdata)
+ local descriptions=fontdata.descriptions
+ if descriptions then
+ local n=0
+ local c=0
+ if (not context and fonts.privateoffsets.keepnames) or forcekeep then
+ for unicode,d in next,descriptions do
+ if d.class=="base" then
+ d.class=nil
+ c=c+1
+ end
+ end
+ else
+ for unicode,d in next,descriptions do
+ local name=d.name
+ if name and lpegmatch(p_crappyname,name) then
+ d.name=nil
+ n=n+1
+ end
+ if d.class=="base" then
+ d.class=nil
+ c=c+1
+ end
+ end
+ end
+ if trace_cleanup then
+ if n>0 then
+ report_cleanup("%s bogus names removed (verbose unicode)",n)
+ end
+ if c>0 then
+ report_cleanup("%s base class tags removed (default is base)",c)
+ end
+ end
+ end
+end
+readers.stripredundant=stripredundant
+function readers.getcomponents(fontdata)
+ local resources=fontdata.resources
+ if resources then
+ local sequences=resources.sequences
+ if sequences then
+ local collected={}
+ for i=1,#sequences do
+ local sequence=sequences[i]
+ if sequence.type=="gsub_ligature" then
+ local steps=sequence.steps
+ if steps then
+ local l={}
+ local function traverse(p,k,v)
+ if k=="ligature" then
+ collected[v]={ unpack(l) }
+ else
+ insert(l,k)
+ for k,vv in next,v do
+ traverse(p,k,vv)
+ end
+ remove(l)
+ end
+ end
+ for i=1,#steps do
+ local c=steps[i].coverage
+ if c then
+ for k,v in next,c do
+ traverse(k,k,v)
+ end
+ end
+ end
+ end
+ end
+ end
+ if next(collected) then
+ while true do
+ local done=false
+ for k,v in next,collected do
+ for i=1,#v do
+ local vi=v[i]
+ if vi==k then
+ collected[k]=nil
+ break
+ else
+ local c=collected[vi]
+ if c then
+ done=true
+ local t={}
+ local n=i-1
+ for j=1,n do
+ t[j]=v[j]
+ end
+ for j=1,#c do
+ n=n+1
+ t[n]=c[j]
+ end
+ for j=i+1,#v do
+ n=n+1
+ t[n]=v[j]
+ end
+ collected[k]=t
+ break
+ end
+ end
+ end
+ end
+ if not done then
+ break
+ end
+ end
+ return collected
+ end
+ end
+ end
+end
+readers.unifymissing=unifymissing
+function readers.rehash(fontdata,hashmethod)
+ if not (fontdata and fontdata.glyphs) then
+ return
+ end
+ if hashmethod=="indices" then
+ fontdata.hashmethod="indices"
+ elseif hashmethod=="names" then
+ fontdata.hashmethod="names"
+ local indices=unifyglyphs(fontdata,true)
+ unifyresources(fontdata,indices)
+ copyduplicates(fontdata)
+ unifymissing(fontdata)
+ else
+ fontdata.hashmethod="unicodes"
+ local indices=unifyglyphs(fontdata)
+ unifyresources(fontdata,indices)
+ copyduplicates(fontdata)
+ unifymissing(fontdata)
+ stripredundant(fontdata)
+ end
+end
+function readers.checkhash(fontdata)
+ local hashmethod=fontdata.hashmethod
+ if hashmethod=="unicodes" then
+ fontdata.names=nil
+ elseif hashmethod=="names" and fontdata.names then
+ unifyresources(fontdata,fontdata.names)
+ copyduplicates(fontdata)
+ fontdata.hashmethod="unicodes"
+ fontdata.names=nil
+ else
+ readers.rehash(fontdata,"unicodes")
+ end
+end
+function readers.addunicodetable(fontdata)
+ local resources=fontdata.resources
+ local unicodes=resources.unicodes
+ if not unicodes then
+ local descriptions=fontdata.descriptions
+ if descriptions then
+ unicodes={}
+ resources.unicodes=unicodes
+ for u,d in next,descriptions do
+ local n=d.name
+ if n then
+ unicodes[n]=u
+ end
+ end
+ end
+ end
+end
+local concat,sort=table.concat,table.sort
+local next,type,tostring=next,type,tostring
+local criterium=1
+local threshold=0
+local trace_packing=false trackers.register("otf.packing",function(v) trace_packing=v end)
+local trace_loading=false trackers.register("otf.loading",function(v) trace_loading=v end)
+local report_otf=logs.reporter("fonts","otf loading")
+local function tabstr_normal(t)
+ local s={}
+ local n=0
+ for k,v in next,t do
+ n=n+1
+ if type(v)=="table" then
+ s[n]=k..">"..tabstr_normal(v)
+ elseif v==true then
+ s[n]=k.."+"
+ elseif v then
+ s[n]=k.."="..v
+ else
+ s[n]=k.."-"
+ end
+ end
+ if n==0 then
+ return ""
+ elseif n==1 then
+ return s[1]
+ else
+ sort(s)
+ return concat(s,",")
+ end
+end
+local function tabstr_flat(t)
+ local s={}
+ local n=0
+ for k,v in next,t do
+ n=n+1
+ s[n]=k.."="..v
+ end
+ if n==0 then
+ return ""
+ elseif n==1 then
+ return s[1]
+ else
+ sort(s)
+ return concat(s,",")
+ end
+end
+local function tabstr_mixed(t)
+ local s={}
+ local n=#t
+ if n==0 then
+ return ""
+ elseif n==1 then
+ local k=t[1]
+ if k==true then
+ return "++"
+ elseif k==false then
+ return "--"
+ else
+ return tostring(k)
+ end
+ else
+ for i=1,n do
+ local k=t[i]
+ if k==true then
+ s[i]="++"
+ elseif k==false then
+ s[i]="--"
+ else
+ s[i]=k
+ end
+ end
+ return concat(s,",")
+ end
+end
+local function tabstr_boolean(t)
+ local s={}
+ local n=0
+ for k,v in next,t do
+ n=n+1
+ if v then
+ s[n]=k.."+"
+ else
+ s[n]=k.."-"
+ end
+ end
+ if n==0 then
+ return ""
+ elseif n==1 then
+ return s[1]
+ else
+ sort(s)
+ return concat(s,",")
+ end
+end
+function readers.pack(data)
+ if data then
+ local h,t,c={},{},{}
+ local hh,tt,cc={},{},{}
+ local nt,ntt=0,0
+ local function pack_normal(v)
+ local tag=tabstr_normal(v)
+ local ht=h[tag]
+ if ht then
+ c[ht]=c[ht]+1
+ return ht
+ else
+ nt=nt+1
+ t[nt]=v
+ h[tag]=nt
+ c[nt]=1
+ return nt
+ end
+ end
+ local function pack_normal_cc(v)
+ local tag=tabstr_normal(v)
+ local ht=h[tag]
+ if ht then
+ c[ht]=c[ht]+1
+ return ht
+ else
+ v[1]=0
+ nt=nt+1
+ t[nt]=v
+ h[tag]=nt
+ c[nt]=1
+ return nt
+ end
+ end
+ local function pack_flat(v)
+ local tag=tabstr_flat(v)
+ local ht=h[tag]
+ if ht then
+ c[ht]=c[ht]+1
+ return ht
+ else
+ nt=nt+1
+ t[nt]=v
+ h[tag]=nt
+ c[nt]=1
+ return nt
+ end
+ end
+ local function pack_indexed(v)
+ local tag=concat(v," ")
+ local ht=h[tag]
+ if ht then
+ c[ht]=c[ht]+1
+ return ht
+ else
+ nt=nt+1
+ t[nt]=v
+ h[tag]=nt
+ c[nt]=1
+ return nt
+ end
+ end
+ local function pack_mixed(v)
+ local tag=tabstr_mixed(v)
+ local ht=h[tag]
+ if ht then
+ c[ht]=c[ht]+1
+ return ht
+ else
+ nt=nt+1
+ t[nt]=v
+ h[tag]=nt
+ c[nt]=1
+ return nt
+ end
+ end
+ local function pack_boolean(v)
+ local tag=tabstr_boolean(v)
+ local ht=h[tag]
+ if ht then
+ c[ht]=c[ht]+1
+ return ht
+ else
+ nt=nt+1
+ t[nt]=v
+ h[tag]=nt
+ c[nt]=1
+ return nt
+ end
+ end
+ local function pack_final(v)
+ if c[v]<=criterium then
+ return t[v]
+ else
+ local hv=hh[v]
+ if hv then
+ return hv
+ else
+ ntt=ntt+1
+ tt[ntt]=t[v]
+ hh[v]=ntt
+ cc[ntt]=c[v]
+ return ntt
+ end
+ end
+ end
+ local function pack_final_cc(v)
+ if c[v]<=criterium then
+ return t[v]
+ else
+ local hv=hh[v]
+ if hv then
+ return hv
+ else
+ ntt=ntt+1
+ tt[ntt]=t[v]
+ hh[v]=ntt
+ cc[ntt]=c[v]
+ return ntt
+ end
+ end
+ end
+ local function success(stage,pass)
+ if nt==0 then
+ if trace_loading or trace_packing then
+ report_otf("pack quality: nothing to pack")
+ end
+ return false
+ elseif nt>=threshold then
+ local one=0
+ local two=0
+ local rest=0
+ if pass==1 then
+ for k,v in next,c do
+ if v==1 then
+ one=one+1
+ elseif v==2 then
+ two=two+1
+ else
+ rest=rest+1
+ end
+ end
+ else
+ for k,v in next,cc do
+ if v>20 then
+ rest=rest+1
+ elseif v>10 then
+ two=two+1
+ else
+ one=one+1
+ end
+ end
+ data.tables=tt
+ end
+ if trace_loading or trace_packing then
+ report_otf("pack quality: stage %s, pass %s, %s packed, 1-10:%s, 11-20:%s, rest:%s (criterium: %s)",
+ stage,pass,one+two+rest,one,two,rest,criterium)
+ end
+ return true
+ else
+ if trace_loading or trace_packing then
+ report_otf("pack quality: stage %s, pass %s, %s packed, aborting pack (threshold: %s)",
+ stage,pass,nt,threshold)
+ end
+ return false
+ end
+ end
+ local function packers(pass)
+ if pass==1 then
+ return pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed,pack_normal_cc
+ else
+ return pack_final,pack_final,pack_final,pack_final,pack_final,pack_final_cc
+ end
+ end
+ local resources=data.resources
+ local sequences=resources.sequences
+ local sublookups=resources.sublookups
+ local features=resources.features
+ local palettes=resources.colorpalettes
+ local variable=resources.variabledata
+ local chardata=characters and characters.data
+ local descriptions=data.descriptions or data.glyphs
+ if not descriptions then
+ return
+ end
+ for pass=1,2 do
+ if trace_packing then
+ report_otf("start packing: stage 1, pass %s",pass)
+ end
+ local pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed,pack_normal_cc=packers(pass)
+ for unicode,description in next,descriptions do
+ local boundingbox=description.boundingbox
+ if boundingbox then
+ description.boundingbox=pack_indexed(boundingbox)
+ end
+ local math=description.math
+ if math then
+ local kerns=math.kerns
+ if kerns then
+ for tag,kern in next,kerns do
+ kerns[tag]=pack_normal(kern)
+ end
+ end
+ end
+ end
+ local function packthem(sequences)
+ for i=1,#sequences do
+ local sequence=sequences[i]
+ local kind=sequence.type
+ local steps=sequence.steps
+ local order=sequence.order
+ local features=sequence.features
+ local flags=sequence.flags
+ if steps then
+ for i=1,#steps do
+ local step=steps[i]
+ if kind=="gpos_pair" then
+ local c=step.coverage
+ if c then
+ if step.format~="pair" then
+ for g1,d1 in next,c do
+ c[g1]=pack_normal(d1)
+ end
+ elseif step.shared then
+ local shared={}
+ for g1,d1 in next,c do
+ for g2,d2 in next,d1 do
+ if not shared[d2] then
+ local f=d2[1] if f and f~=true then d2[1]=pack_indexed(f) end
+ local s=d2[2] if s and s~=true then d2[2]=pack_indexed(s) end
+ shared[d2]=true
+ end
+ end
+ end
+ if pass==2 then
+ step.shared=nil
+ end
+ else
+ for g1,d1 in next,c do
+ for g2,d2 in next,d1 do
+ local f=d2[1] if f and f~=true then d2[1]=pack_indexed(f) end
+ local s=d2[2] if s and s~=true then d2[2]=pack_indexed(s) end
+ end
+ end
+ end
+ end
+ elseif kind=="gpos_single" then
+ local c=step.coverage
+ if c then
+ if step.format=="single" then
+ for g1,d1 in next,c do
+ if d1 and d1~=true then
+ c[g1]=pack_indexed(d1)
+ end
+ end
+ else
+ step.coverage=pack_normal(c)
+ end
+ end
+ elseif kind=="gpos_cursive" then
+ local c=step.coverage
+ if c then
+ for g1,d1 in next,c do
+ local f=d1[2] if f then d1[2]=pack_indexed(f) end
+ local s=d1[3] if s then d1[3]=pack_indexed(s) end
+ end
+ end
+ elseif kind=="gpos_mark2base" or kind=="gpos_mark2mark" then
+ local c=step.baseclasses
+ if c then
+ for g1,d1 in next,c do
+ for g2,d2 in next,d1 do
+ d1[g2]=pack_indexed(d2)
+ end
+ end
+ end
+ local c=step.coverage
+ if c then
+ for g1,d1 in next,c do
+ d1[2]=pack_indexed(d1[2])
+ end
+ end
+ elseif kind=="gpos_mark2ligature" then
+ local c=step.baseclasses
+ if c then
+ for g1,d1 in next,c do
+ for g2,d2 in next,d1 do
+ for g3,d3 in next,d2 do
+ d2[g3]=pack_indexed(d3)
+ end
+ end
+ end
+ end
+ local c=step.coverage
+ if c then
+ for g1,d1 in next,c do
+ d1[2]=pack_indexed(d1[2])
+ end
+ end
+ end
+ local rules=step.rules
+ if rules then
+ for i=1,#rules do
+ local rule=rules[i]
+ local r=rule.before if r then for i=1,#r do r[i]=pack_boolean(r[i]) end end
+ local r=rule.after if r then for i=1,#r do r[i]=pack_boolean(r[i]) end end
+ local r=rule.current if r then for i=1,#r do r[i]=pack_boolean(r[i]) end end
+ local r=rule.replacements if r then rule.replacements=pack_flat (r) end
+ end
+ end
+ end
+ end
+ if order then
+ sequence.order=pack_indexed(order)
+ end
+ if features then
+ for script,feature in next,features do
+ features[script]=pack_normal(feature)
+ end
+ end
+ if flags then
+ sequence.flags=pack_normal(flags)
+ end
+ end
+ end
+ if sequences then
+ packthem(sequences)
+ end
+ if sublookups then
+ packthem(sublookups)
+ end
+ if features then
+ for k,list in next,features do
+ for feature,spec in next,list do
+ list[feature]=pack_normal(spec)
+ end
+ end
+ end
+ if palettes then
+ for i=1,#palettes do
+ local p=palettes[i]
+ for j=1,#p do
+ p[j]=pack_indexed(p[j])
+ end
+ end
+ end
+ if variable then
+ local instances=variable.instances
+ if instances then
+ for i=1,#instances do
+ local v=instances[i].values
+ for j=1,#v do
+ v[j]=pack_normal(v[j])
+ end
+ end
+ end
+ local function packdeltas(main)
+ if main then
+ local deltas=main.deltas
+ if deltas then
+ for i=1,#deltas do
+ local di=deltas[i]
+ local d=di.deltas
+ for j=1,#d do
+ d[j]=pack_indexed(d[j])
+ end
+ di.regions=pack_indexed(di.regions)
+ end
+ end
+ local regions=main.regions
+ if regions then
+ for i=1,#regions do
+ local r=regions[i]
+ for j=1,#r do
+ r[j]=pack_normal(r[j])
+ end
+ end
+ end
+ end
+ end
+ packdeltas(variable.global)
+ packdeltas(variable.horizontal)
+ packdeltas(variable.vertical)
+ packdeltas(variable.metrics)
+ end
+ if not success(1,pass) then
+ return
+ end
+ end
+ if nt>0 then
+ for pass=1,2 do
+ if trace_packing then
+ report_otf("start packing: stage 2, pass %s",pass)
+ end
+ local pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed,pack_normal_cc=packers(pass)
+ for unicode,description in next,descriptions do
+ local math=description.math
+ if math then
+ local kerns=math.kerns
+ if kerns then
+ math.kerns=pack_normal(kerns)
+ end
+ end
+ end
+ local function packthem(sequences)
+ for i=1,#sequences do
+ local sequence=sequences[i]
+ local kind=sequence.type
+ local steps=sequence.steps
+ local features=sequence.features
+ if steps then
+ for i=1,#steps do
+ local step=steps[i]
+ if kind=="gpos_pair" then
+ local c=step.coverage
+ if c then
+ if step.format=="pair" then
+ for g1,d1 in next,c do
+ for g2,d2 in next,d1 do
+ d1[g2]=pack_normal(d2)
+ end
+ end
+ end
+ end
+ elseif kind=="gpos_mark2ligature" then
+ local c=step.baseclasses
+ if c then
+ for g1,d1 in next,c do
+ for g2,d2 in next,d1 do
+ d1[g2]=pack_normal(d2)
+ end
+ end
+ end
+ end
+ local rules=step.rules
+ if rules then
+ for i=1,#rules do
+ local rule=rules[i]
+ local r=rule.before if r then rule.before=pack_normal(r) end
+ local r=rule.after if r then rule.after=pack_normal(r) end
+ local r=rule.current if r then rule.current=pack_normal(r) end
+ end
+ end
+ end
+ end
+ if features then
+ sequence.features=pack_normal(features)
+ end
+ end
+ end
+ if sequences then
+ packthem(sequences)
+ end
+ if sublookups then
+ packthem(sublookups)
+ end
+ if variable then
+ local function unpackdeltas(main)
+ if main then
+ local regions=main.regions
+ if regions then
+ main.regions=pack_normal(regions)
+ end
+ end
+ end
+ unpackdeltas(variable.global)
+ unpackdeltas(variable.horizontal)
+ unpackdeltas(variable.vertical)
+ unpackdeltas(variable.metrics)
+ end
+ end
+ for pass=1,2 do
+ if trace_packing then
+ report_otf("start packing: stage 3, pass %s",pass)
+ end
+ local pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed,pack_normal_cc=packers(pass)
+ local function packthem(sequences)
+ for i=1,#sequences do
+ local sequence=sequences[i]
+ local kind=sequence.type
+ local steps=sequence.steps
+ local features=sequence.features
+ if steps then
+ for i=1,#steps do
+ local step=steps[i]
+ if kind=="gpos_pair" then
+ local c=step.coverage
+ if c then
+ if step.format=="pair" then
+ for g1,d1 in next,c do
+ c[g1]=pack_normal(d1)
+ end
+ end
+ end
+ elseif kind=="gpos_cursive" then
+ local c=step.coverage
+ if c then
+ for g1,d1 in next,c do
+ c[g1]=pack_normal_cc(d1)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if sequences then
+ packthem(sequences)
+ end
+ if sublookups then
+ packthem(sublookups)
+ end
+ end
+ end
+ end
+end
+local unpacked_mt={
+ __index=function(t,k)
+ t[k]=false
+ return k
+ end
+}
+function readers.unpack(data)
+ if data then
+ local tables=data.tables
+ if tables then
+ local resources=data.resources
+ local descriptions=data.descriptions or data.glyphs
+ local sequences=resources.sequences
+ local sublookups=resources.sublookups
+ local features=resources.features
+ local palettes=resources.colorpalettes
+ local variable=resources.variabledata
+ local unpacked={}
+ setmetatable(unpacked,unpacked_mt)
+ for unicode,description in next,descriptions do
+ local tv=tables[description.boundingbox]
+ if tv then
+ description.boundingbox=tv
+ end
+ local math=description.math
+ if math then
+ local kerns=math.kerns
+ if kerns then
+ local tm=tables[kerns]
+ if tm then
+ math.kerns=tm
+ kerns=unpacked[tm]
+ end
+ if kerns then
+ for k,kern in next,kerns do
+ local tv=tables[kern]
+ if tv then
+ kerns[k]=tv
+ end
+ end
+ end
+ end
+ end
+ end
+ local function unpackthem(sequences)
+ for i=1,#sequences do
+ local sequence=sequences[i]
+ local kind=sequence.type
+ local steps=sequence.steps
+ local order=sequence.order
+ local features=sequence.features
+ local flags=sequence.flags
+ local markclass=sequence.markclass
+ if features then
+ local tv=tables[features]
+ if tv then
+ sequence.features=tv
+ features=tv
+ end
+ for script,feature in next,features do
+ local tv=tables[feature]
+ if tv then
+ features[script]=tv
+ end
+ end
+ end
+ if steps then
+ for i=1,#steps do
+ local step=steps[i]
+ if kind=="gpos_pair" then
+ local c=step.coverage
+ if c then
+ if step.format=="pair" then
+ for g1,d1 in next,c do
+ local tv=tables[d1]
+ if tv then
+ c[g1]=tv
+ d1=tv
+ end
+ for g2,d2 in next,d1 do
+ local tv=tables[d2]
+ if tv then
+ d1[g2]=tv
+ d2=tv
+ end
+ local f=tables[d2[1]] if f then d2[1]=f end
+ local s=tables[d2[2]] if s then d2[2]=s end
+ end
+ end
+ else
+ for g1,d1 in next,c do
+ local tv=tables[d1]
+ if tv then
+ c[g1]=tv
+ end
+ end
+ end
+ end
+ elseif kind=="gpos_single" then
+ local c=step.coverage
+ if c then
+ if step.format=="single" then
+ for g1,d1 in next,c do
+ local tv=tables[d1]
+ if tv then
+ c[g1]=tv
+ end
+ end
+ else
+ local tv=tables[c]
+ if tv then
+ step.coverage=tv
+ end
+ end
+ end
+ elseif kind=="gpos_cursive" then
+ local c=step.coverage
+ if c then
+ for g1,d1 in next,c do
+ local tv=tables[d1]
+ if tv then
+ d1=tv
+ c[g1]=d1
+ end
+ local f=tables[d1[2]] if f then d1[2]=f end
+ local s=tables[d1[3]] if s then d1[3]=s end
+ end
+ end
+ elseif kind=="gpos_mark2base" or kind=="gpos_mark2mark" then
+ local c=step.baseclasses
+ if c then
+ for g1,d1 in next,c do
+ for g2,d2 in next,d1 do
+ local tv=tables[d2]
+ if tv then
+ d1[g2]=tv
+ end
+ end
+ end
+ end
+ local c=step.coverage
+ if c then
+ for g1,d1 in next,c do
+ local tv=tables[d1[2]]
+ if tv then
+ d1[2]=tv
+ end
+ end
+ end
+ elseif kind=="gpos_mark2ligature" then
+ local c=step.baseclasses
+ if c then
+ for g1,d1 in next,c do
+ for g2,d2 in next,d1 do
+ local tv=tables[d2]
+ if tv then
+ d2=tv
+ d1[g2]=d2
+ end
+ for g3,d3 in next,d2 do
+ local tv=tables[d2[g3]]
+ if tv then
+ d2[g3]=tv
+ end
+ end
+ end
+ end
+ end
+ local c=step.coverage
+ if c then
+ for g1,d1 in next,c do
+ local tv=tables[d1[2]]
+ if tv then
+ d1[2]=tv
+ end
+ end
+ end
+ end
+ local rules=step.rules
+ if rules then
+ for i=1,#rules do
+ local rule=rules[i]
+ local before=rule.before
+ if before then
+ local tv=tables[before]
+ if tv then
+ rule.before=tv
+ before=tv
+ end
+ for i=1,#before do
+ local tv=tables[before[i]]
+ if tv then
+ before[i]=tv
+ end
+ end
+ end
+ local after=rule.after
+ if after then
+ local tv=tables[after]
+ if tv then
+ rule.after=tv
+ after=tv
+ end
+ for i=1,#after do
+ local tv=tables[after[i]]
+ if tv then
+ after[i]=tv
+ end
+ end
+ end
+ local current=rule.current
+ if current then
+ local tv=tables[current]
+ if tv then
+ rule.current=tv
+ current=tv
+ end
+ for i=1,#current do
+ local tv=tables[current[i]]
+ if tv then
+ current[i]=tv
+ end
+ end
+ end
+ local replacements=rule.replacements
+ if replacements then
+ local tv=tables[replacements]
+ if tv then
+ rule.replacements=tv
+ end
+ end
+ end
+ end
+ end
+ end
+ if order then
+ local tv=tables[order]
+ if tv then
+ sequence.order=tv
+ end
+ end
+ if flags then
+ local tv=tables[flags]
+ if tv then
+ sequence.flags=tv
+ end
+ end
+ end
+ end
+ if sequences then
+ unpackthem(sequences)
+ end
+ if sublookups then
+ unpackthem(sublookups)
+ end
+ if features then
+ for k,list in next,features do
+ for feature,spec in next,list do
+ local tv=tables[spec]
+ if tv then
+ list[feature]=tv
+ end
+ end
+ end
+ end
+ if palettes then
+ for i=1,#palettes do
+ local p=palettes[i]
+ for j=1,#p do
+ local tv=tables[p[j]]
+ if tv then
+ p[j]=tv
+ end
+ end
+ end
+ end
+ if variable then
+ local instances=variable.instances
+ if instances then
+ for i=1,#instances do
+ local v=instances[i].values
+ for j=1,#v do
+ local tv=tables[v[j]]
+ if tv then
+ v[j]=tv
+ end
+ end
+ end
+ end
+ local function unpackdeltas(main)
+ if main then
+ local deltas=main.deltas
+ if deltas then
+ for i=1,#deltas do
+ local di=deltas[i]
+ local d=di.deltas
+ local r=di.regions
+ for j=1,#d do
+ local tv=tables[d[j]]
+ if tv then
+ d[j]=tv
+ end
+ end
+ local tv=di.regions
+ if tv then
+ di.regions=tv
+ end
+ end
+ end
+ local regions=main.regions
+ if regions then
+ local tv=tables[regions]
+ if tv then
+ main.regions=tv
+ regions=tv
+ end
+ for i=1,#regions do
+ local r=regions[i]
+ for j=1,#r do
+ local tv=tables[r[j]]
+ if tv then
+ r[j]=tv
+ end
+ end
+ end
+ end
+ end
+ end
+ unpackdeltas(variable.global)
+ unpackdeltas(variable.horizontal)
+ unpackdeltas(variable.vertical)
+ unpackdeltas(variable.metrics)
+ end
+ data.tables=nil
+ end
+ end
+end
+local mt={
+ __index=function(t,k)
+ if k=="height" then
+ local ht=t.boundingbox[4]
+ return ht<0 and 0 or ht
+ elseif k=="depth" then
+ local dp=-t.boundingbox[2]
+ return dp<0 and 0 or dp
+ elseif k=="width" then
+ return 0
+ elseif k=="name" then
+ return forcenotdef and ".notdef"
+ end
+ end
+}
+local function sameformat(sequence,steps,first,nofsteps,kind)
+ return true
+end
+local function mergesteps_1(lookup,strict)
+ local steps=lookup.steps
+ local nofsteps=lookup.nofsteps
+ local first=steps[1]
+ if strict then
+ local f=first.format
+ for i=2,nofsteps do
+ if steps[i].format~=f then
+ if trace_optimizations then
+ report_optimizations("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name)
+ end
+ return 0
+ end
+ end
+ end
+ if trace_optimizations then
+ report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name)
+ end
+ local target=first.coverage
+ for i=2,nofsteps do
+ local c=steps[i].coverage
+ if c then
+ for k,v in next,c do
+ if not target[k] then
+ target[k]=v
+ end
+ end
+ end
+ end
+ lookup.nofsteps=1
+ lookup.merged=true
+ lookup.steps={ first }
+ return nofsteps-1
+end
+local function mergesteps_2(lookup)
+ local steps=lookup.steps
+ local nofsteps=lookup.nofsteps
+ local first=steps[1]
+ if strict then
+ local f=first.format
+ for i=2,nofsteps do
+ if steps[i].format~=f then
+ if trace_optimizations then
+ report_optimizations("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name)
+ end
+ return 0
+ end
+ end
+ end
+ if trace_optimizations then
+ report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name)
+ end
+ local target=first.coverage
+ for i=2,nofsteps do
+ local c=steps[i].coverage
+ if c then
+ for k,v in next,c do
+ local tk=target[k]
+ if tk then
+ for kk,vv in next,v do
+ if tk[kk]==nil then
+ tk[kk]=vv
+ end
+ end
+ else
+ target[k]=v
+ end
+ end
+ end
+ end
+ lookup.nofsteps=1
+ lookup.merged=true
+ lookup.steps={ first }
+ return nofsteps-1
+end
+local function mergesteps_3(lookup,strict)
+ local steps=lookup.steps
+ local nofsteps=lookup.nofsteps
+ if trace_optimizations then
+ report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name)
+ end
+ local coverage={}
+ for i=1,nofsteps do
+ local c=steps[i].coverage
+ if c then
+ for k,v in next,c do
+ local tk=coverage[k]
+ if tk then
+ if trace_optimizations then
+ report_optimizations("quitting merge due to multiple checks")
+ end
+ return nofsteps
+ else
+ coverage[k]=v
+ end
+ end
+ end
+ end
+ local first=steps[1]
+ local baseclasses={}
+ for i=1,nofsteps do
+ local offset=i*10
+ local step=steps[i]
+ for k,v in sortedhash(step.baseclasses) do
+ baseclasses[offset+k]=v
+ end
+ for k,v in next,step.coverage do
+ v[1]=offset+v[1]
+ end
+ end
+ first.baseclasses=baseclasses
+ first.coverage=coverage
+ lookup.nofsteps=1
+ lookup.merged=true
+ lookup.steps={ first }
+ return nofsteps-1
+end
+local function nested(old,new)
+ for k,v in next,old do
+ if k=="ligature" then
+ if not new.ligature then
+ new.ligature=v
+ end
+ else
+ local n=new[k]
+ if n then
+ nested(v,n)
+ else
+ new[k]=v
+ end
+ end
+ end
+end
+local function mergesteps_4(lookup)
+ local steps=lookup.steps
+ local nofsteps=lookup.nofsteps
+ local first=steps[1]
+ if trace_optimizations then
+ report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name)
+ end
+ local target=first.coverage
+ for i=2,nofsteps do
+ local c=steps[i].coverage
+ if c then
+ for k,v in next,c do
+ local tk=target[k]
+ if tk then
+ nested(v,tk)
+ else
+ target[k]=v
+ end
+ end
+ end
+ end
+ lookup.nofsteps=1
+ lookup.steps={ first }
+ return nofsteps-1
+end
+local function mergesteps_5(lookup)
+ local steps=lookup.steps
+ local nofsteps=lookup.nofsteps
+ local first=steps[1]
+ if trace_optimizations then
+ report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name)
+ end
+ local target=first.coverage
+ local hash=nil
+ for k,v in next,target do
+ hash=v[1]
+ break
+ end
+ for i=2,nofsteps do
+ local c=steps[i].coverage
+ if c then
+ for k,v in next,c do
+ local tk=target[k]
+ if tk then
+ if not tk[2] then
+ tk[2]=v[2]
+ end
+ if not tk[3] then
+ tk[3]=v[3]
+ end
+ else
+ target[k]=v
+ v[1]=hash
+ end
+ end
+ end
+ end
+ lookup.nofsteps=1
+ lookup.merged=true
+ lookup.steps={ first }
+ return nofsteps-1
+end
+local function checkkerns(lookup)
+ local steps=lookup.steps
+ local nofsteps=lookup.nofsteps
+ local kerned=0
+ for i=1,nofsteps do
+ local step=steps[i]
+ if step.format=="pair" then
+ local coverage=step.coverage
+ local kerns=true
+ for g1,d1 in next,coverage do
+ if d1==true then
+ elseif not d1 then
+ elseif d1[1]~=0 or d1[2]~=0 or d1[4]~=0 then
+ kerns=false
+ break
+ end
+ end
+ if kerns then
+ if trace_optimizations then
+ report_optimizations("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name)
+ end
+ local c={}
+ for g1,d1 in next,coverage do
+ if d1 and d1~=true then
+ c[g1]=d1[3]
+ end
+ end
+ step.coverage=c
+ step.format="move"
+ kerned=kerned+1
+ end
+ end
+ end
+ return kerned
+end
+local function checkpairs(lookup)
+ local steps=lookup.steps
+ local nofsteps=lookup.nofsteps
+ local kerned=0
+ local function onlykerns(step)
+ local coverage=step.coverage
+ for g1,d1 in next,coverage do
+ for g2,d2 in next,d1 do
+ if d2[2] then
+ return false
+ else
+ local v=d2[1]
+ if v==true then
+ elseif v and (v[1]~=0 or v[2]~=0 or v[4]~=0) then
+ return false
+ end
+ end
+ end
+ end
+ return coverage
+ end
+ for i=1,nofsteps do
+ local step=steps[i]
+ if step.format=="pair" then
+ local coverage=onlykerns(step)
+ if coverage then
+ if trace_optimizations then
+ report_optimizations("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name)
+ end
+ for g1,d1 in next,coverage do
+ local d={}
+ for g2,d2 in next,d1 do
+ local v=d2[1]
+ if v==true then
+ elseif v then
+ d[g2]=v[3]
+ end
+ end
+ coverage[g1]=d
+ end
+ step.format="move"
+ kerned=kerned+1
+ end
+ end
+ end
+ return kerned
+end
+local compact_pairs=true
+local compact_singles=true
+local merge_pairs=true
+local merge_singles=true
+local merge_substitutions=true
+local merge_alternates=true
+local merge_multiples=true
+local merge_ligatures=true
+local merge_cursives=true
+local merge_marks=true
+directives.register("otf.compact.pairs",function(v) compact_pairs=v end)
+directives.register("otf.compact.singles",function(v) compact_singles=v end)
+directives.register("otf.merge.pairs",function(v) merge_pairs=v end)
+directives.register("otf.merge.singles",function(v) merge_singles=v end)
+directives.register("otf.merge.substitutions",function(v) merge_substitutions=v end)
+directives.register("otf.merge.alternates",function(v) merge_alternates=v end)
+directives.register("otf.merge.multiples",function(v) merge_multiples=v end)
+directives.register("otf.merge.ligatures",function(v) merge_ligatures=v end)
+directives.register("otf.merge.cursives",function(v) merge_cursives=v end)
+directives.register("otf.merge.marks",function(v) merge_marks=v end)
+function readers.compact(data)
+ if not data or data.compacted then
+ return
+ else
+ data.compacted=true
+ end
+ local resources=data.resources
+ local merged=0
+ local kerned=0
+ local allsteps=0
+ local function compact(what)
+ local lookups=resources[what]
+ if lookups then
+ for i=1,#lookups do
+ local lookup=lookups[i]
+ local nofsteps=lookup.nofsteps
+ local kind=lookup.type
+ allsteps=allsteps+nofsteps
+ if nofsteps>1 then
+ local merg=merged
+ if kind=="gsub_single" then
+ if merge_substitutions then
+ merged=merged+mergesteps_1(lookup)
+ end
+ elseif kind=="gsub_alternate" then
+ if merge_alternates then
+ merged=merged+mergesteps_1(lookup)
+ end
+ elseif kind=="gsub_multiple" then
+ if merge_multiples then
+ merged=merged+mergesteps_1(lookup)
+ end
+ elseif kind=="gsub_ligature" then
+ if merge_ligatures then
+ merged=merged+mergesteps_4(lookup)
+ end
+ elseif kind=="gpos_single" then
+ if merge_singles then
+ merged=merged+mergesteps_1(lookup,true)
+ end
+ if compact_singles then
+ kerned=kerned+checkkerns(lookup)
+ end
+ elseif kind=="gpos_pair" then
+ if merge_pairs then
+ merged=merged+mergesteps_2(lookup)
+ end
+ if compact_pairs then
+ kerned=kerned+checkpairs(lookup)
+ end
+ elseif kind=="gpos_cursive" then
+ if merge_cursives then
+ merged=merged+mergesteps_5(lookup)
+ end
+ elseif kind=="gpos_mark2mark" or kind=="gpos_mark2base" or kind=="gpos_mark2ligature" then
+ if merge_marks then
+ merged=merged+mergesteps_3(lookup)
+ end
+ end
+ if merg~=merged then
+ lookup.merged=true
+ end
+ elseif nofsteps==1 then
+ local kern=kerned
+ if kind=="gpos_single" then
+ if compact_singles then
+ kerned=kerned+checkkerns(lookup)
+ end
+ elseif kind=="gpos_pair" then
+ if compact_pairs then
+ kerned=kerned+checkpairs(lookup)
+ end
+ end
+ if kern~=kerned then
+ end
+ end
+ end
+ elseif trace_optimizations then
+ report_optimizations("no lookups in %a",what)
+ end
+ end
+ compact("sequences")
+ compact("sublookups")
+ if trace_optimizations then
+ if merged>0 then
+ report_optimizations("%i steps of %i removed due to merging",merged,allsteps)
+ end
+ if kerned>0 then
+ report_optimizations("%i steps of %i steps turned from pairs into kerns",kerned,allsteps)
+ end
+ end
+end
+local function mergesteps(t,k)
+ if k=="merged" then
+ local merged={}
+ for i=1,#t do
+ local step=t[i]
+ local coverage=step.coverage
+ for k in next,coverage do
+ local m=merged[k]
+ if m then
+ m[2]=i
+ else
+ merged[k]={ i,i }
+ end
+ end
+ end
+ t.merged=merged
+ return merged
+ end
+end
+local function checkmerge(sequence)
+ local steps=sequence.steps
+ if steps then
+ setmetatableindex(steps,mergesteps)
+ end
+end
+local function checkflags(sequence,resources)
+ if not sequence.skiphash then
+ local flags=sequence.flags
+ if flags then
+ local skipmark=flags[1]
+ local skipligature=flags[2]
+ local skipbase=flags[3]
+ local markclass=sequence.markclass
+ local skipsome=skipmark or skipligature or skipbase or markclass or false
+ if skipsome then
+ sequence.skiphash=setmetatableindex(function(t,k)
+ local c=resources.classes[k]
+ local v=c==skipmark
+ or (markclass and c=="mark" and not markclass[k])
+ or c==skipligature
+ or c==skipbase
+ or false
+ t[k]=v
+ return v
+ end)
+ else
+ sequence.skiphash=false
+ end
+ else
+ sequence.skiphash=false
+ end
+ end
+end
+local function checksteps(sequence)
+ local steps=sequence.steps
+ if steps then
+ for i=1,#steps do
+ steps[i].index=i
+ end
+ end
+end
+if fonts.helpers then
+ fonts.helpers.checkmerge=checkmerge
+ fonts.helpers.checkflags=checkflags
+ fonts.helpers.checksteps=checksteps
+end
+function readers.expand(data)
+ if not data or data.expanded then
+ return
+ else
+ data.expanded=true
+ end
+ local resources=data.resources
+ local sublookups=resources.sublookups
+ local sequences=resources.sequences
+ local markclasses=resources.markclasses
+ local descriptions=data.descriptions
+ if descriptions then
+ local defaultwidth=resources.defaultwidth or 0
+ local defaultheight=resources.defaultheight or 0
+ local defaultdepth=resources.defaultdepth or 0
+ local basename=trace_markwidth and file.basename(resources.filename)
+ for u,d in next,descriptions do
+ local bb=d.boundingbox
+ local wd=d.width
+ if not wd then
+ d.width=defaultwidth
+ elseif trace_markwidth and wd~=0 and d.class=="mark" then
+ report_markwidth("mark %a with width %b found in %a",d.name or "",wd,basename)
+ end
+ if bb then
+ local ht=bb[4]
+ local dp=-bb[2]
+ if ht==0 or ht<0 then
+ else
+ d.height=ht
+ end
+ if dp==0 or dp<0 then
+ else
+ d.depth=dp
+ end
+ end
+ end
+ end
+ local function expandlookups(sequences)
+ if sequences then
+ for i=1,#sequences do
+ local sequence=sequences[i]
+ local steps=sequence.steps
+ if steps then
+ local nofsteps=sequence.nofsteps
+ local kind=sequence.type
+ local markclass=sequence.markclass
+ if markclass then
+ if not markclasses then
+ report_warning("missing markclasses")
+ sequence.markclass=false
+ else
+ sequence.markclass=markclasses[markclass]
+ end
+ end
+ for i=1,nofsteps do
+ local step=steps[i]
+ local baseclasses=step.baseclasses
+ if baseclasses then
+ local coverage=step.coverage
+ for k,v in next,coverage do
+ v[1]=baseclasses[v[1]]
+ end
+ elseif kind=="gpos_cursive" then
+ local coverage=step.coverage
+ for k,v in next,coverage do
+ v[1]=coverage
+ end
+ end
+ local rules=step.rules
+ if rules then
+ local rulehash={ n=0 }
+ local rulesize=0
+ local coverage={}
+ local lookuptype=sequence.type
+ local nofrules=#rules
+ step.coverage=coverage
+ for currentrule=1,nofrules do
+ local rule=rules[currentrule]
+ local current=rule.current
+ local before=rule.before
+ local after=rule.after
+ local replacements=rule.replacements or false
+ local sequence={}
+ local nofsequences=0
+ if before then
+ for n=1,#before do
+ nofsequences=nofsequences+1
+ sequence[nofsequences]=before[n]
+ end
+ end
+ local start=nofsequences+1
+ for n=1,#current do
+ nofsequences=nofsequences+1
+ sequence[nofsequences]=current[n]
+ end
+ local stop=nofsequences
+ if after then
+ for n=1,#after do
+ nofsequences=nofsequences+1
+ sequence[nofsequences]=after[n]
+ end
+ end
+ local lookups=rule.lookups or false
+ local subtype=nil
+ if lookups then
+ for i=1,#lookups do
+ local lookups=lookups[i]
+ if lookups then
+ for k,v in next,lookups do
+ local lookup=sublookups[v]
+ if lookup then
+ lookups[k]=lookup
+ if not subtype then
+ subtype=lookup.type
+ end
+ else
+ end
+ end
+ end
+ end
+ end
+ if sequence[1] then
+ sequence.n=#sequence
+ local ruledata={
+ currentrule,
+ lookuptype,
+ sequence,
+ start,
+ stop,
+ lookups,
+ replacements,
+ subtype,
+ }
+ rulesize=rulesize+1
+ rulehash[rulesize]=ruledata
+ rulehash.n=rulesize
+ if true then
+ for unic in next,sequence[start] do
+ local cu=coverage[unic]
+ if cu then
+ local n=#cu+1
+ cu[n]=ruledata
+ cu.n=n
+ else
+ coverage[unic]={ ruledata,n=1 }
+ end
+ end
+ else
+ for unic in next,sequence[start] do
+ local cu=coverage[unic]
+ if cu then
+ else
+ coverage[unic]=rulehash
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ checkmerge(sequence)
+ checkflags(sequence,resources)
+ checksteps(sequence)
+ end
+ end
+ end
+ end
+ expandlookups(sequences)
+ expandlookups(sublookups)
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-oup”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-otl” f111f9ac18d24049fadeb8883e4e8da5] ---
+
+if not modules then modules={} end modules ['font-otl']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files",
+}
+local lower=string.lower
+local type,next,tonumber,tostring,unpack=type,next,tonumber,tostring,unpack
+local abs=math.abs
+local derivetable=table.derive
+local formatters=string.formatters
+local setmetatableindex=table.setmetatableindex
+local allocate=utilities.storage.allocate
+local registertracker=trackers.register
+local registerdirective=directives.register
+local starttiming=statistics.starttiming
+local stoptiming=statistics.stoptiming
+local elapsedtime=statistics.elapsedtime
+local findbinfile=resolvers.findbinfile
+local trace_loading=false registertracker("otf.loading",function(v) trace_loading=v end)
+local trace_features=false registertracker("otf.features",function(v) trace_features=v end)
+local trace_defining=false registertracker("fonts.defining",function(v) trace_defining=v end)
+local report_otf=logs.reporter("fonts","otf loading")
+local fonts=fonts
+local otf=fonts.handlers.otf
+otf.version=3.111
+otf.cache=containers.define("fonts","otl",otf.version,true)
+otf.svgcache=containers.define("fonts","svg",otf.version,true)
+otf.pngcache=containers.define("fonts","png",otf.version,true)
+otf.pdfcache=containers.define("fonts","pdf",otf.version,true)
+otf.mpscache=containers.define("fonts","mps",otf.version,true)
+otf.svgenabled=false
+otf.pngenabled=false
+local otfreaders=otf.readers
+local hashes=fonts.hashes
+local definers=fonts.definers
+local readers=fonts.readers
+local constructors=fonts.constructors
+local otffeatures=constructors.features.otf
+local registerotffeature=otffeatures.register
+local otfenhancers=constructors.enhancers.otf
+local registerotfenhancer=otfenhancers.register
+local forceload=false
+local cleanup=0
+local syncspace=true
+local forcenotdef=false
+local privateoffset=fonts.constructors and fonts.constructors.privateoffset or 0xF0000
+local applyruntimefixes=fonts.treatments and fonts.treatments.applyfixes
+local wildcard="*"
+local default="dflt"
+local formats=fonts.formats
+formats.otf="opentype"
+formats.ttf="truetype"
+formats.ttc="truetype"
+registerdirective("fonts.otf.loader.cleanup",function(v) cleanup=tonumber(v) or (v and 1) or 0 end)
+registerdirective("fonts.otf.loader.force",function(v) forceload=v end)
+registerdirective("fonts.otf.loader.syncspace",function(v) syncspace=v end)
+registerdirective("fonts.otf.loader.forcenotdef",function(v) forcenotdef=v end)
+registerotfenhancer("check extra features",function() end)
+local checkmemory=utilities.lua and utilities.lua.checkmemory
+local threshold=100
+local tracememory=false
+registertracker("fonts.otf.loader.memory",function(v) tracememory=v end)
+if not checkmemory then
+ local collectgarbage=collectgarbage
+ checkmemory=function(previous,threshold)
+ local current=collectgarbage("count")
+ if previous then
+ local checked=(threshold or 64)*1024
+ if current-previous>checked then
+ collectgarbage("collect")
+ current=collectgarbage("count")
+ end
+ end
+ return current
+ end
+end
+function otf.load(filename,sub,instance)
+ local base=file.basename(file.removesuffix(filename))
+ local name=file.removesuffix(base)
+ local attr=lfs.attributes(filename)
+ local size=attr and attr.size or 0
+ local time=attr and attr.modification or 0
+ if sub=="" then
+ sub=false
+ end
+ local hash=name
+ if sub then
+ hash=hash.."-"..sub
+ end
+ if instance then
+ hash=hash.."-"..instance
+ end
+ hash=containers.cleanname(hash)
+ local data=containers.read(otf.cache,hash)
+ local reload=not data or data.size~=size or data.time~=time or data.tableversion~=otfreaders.tableversion
+ if forceload then
+ report_otf("forced reload of %a due to hard coded flag",filename)
+ reload=true
+ end
+ if reload then
+ report_otf("loading %a, hash %a",filename,hash)
+ starttiming(otfreaders,true)
+ data=otfreaders.loadfont(filename,sub or 1,instance)
+ if data then
+ local used=checkmemory()
+ local resources=data.resources
+ local svgshapes=resources.svgshapes
+ local pngshapes=resources.pngshapes
+ if cleanup==0 then
+ checkmemory(used,threshold,tracememory)
+ end
+ if svgshapes then
+ resources.svgshapes=nil
+ if otf.svgenabled then
+ local timestamp=os.date()
+ containers.write(otf.svgcache,hash,{
+ svgshapes=svgshapes,
+ timestamp=timestamp,
+ })
+ data.properties.svg={
+ hash=hash,
+ timestamp=timestamp,
+ }
+ end
+ if cleanup>1 then
+ collectgarbage("collect")
+ else
+ checkmemory(used,threshold,tracememory)
+ end
+ end
+ if pngshapes then
+ resources.pngshapes=nil
+ if otf.pngenabled then
+ local timestamp=os.date()
+ containers.write(otf.pngcache,hash,{
+ pngshapes=pngshapes,
+ timestamp=timestamp,
+ })
+ data.properties.png={
+ hash=hash,
+ timestamp=timestamp,
+ }
+ end
+ if cleanup>1 then
+ collectgarbage("collect")
+ else
+ checkmemory(used,threshold,tracememory)
+ end
+ end
+ otfreaders.compact(data)
+ if cleanup==0 then
+ checkmemory(used,threshold,tracememory)
+ end
+ otfreaders.rehash(data,"unicodes")
+ otfreaders.addunicodetable(data)
+ otfreaders.extend(data)
+ if cleanup==0 then
+ checkmemory(used,threshold,tracememory)
+ end
+ otfreaders.pack(data)
+ report_otf("loading done")
+ report_otf("saving %a in cache",filename)
+ data=containers.write(otf.cache,hash,data)
+ if cleanup>1 then
+ collectgarbage("collect")
+ else
+ checkmemory(used,threshold,tracememory)
+ end
+ stoptiming(otfreaders)
+ if elapsedtime then
+ report_otf("loading, optimizing, packing and caching time %s",elapsedtime(otfreaders))
+ end
+ if cleanup>3 then
+ collectgarbage("collect")
+ else
+ checkmemory(used,threshold,tracememory)
+ end
+ data=containers.read(otf.cache,hash)
+ if cleanup>2 then
+ collectgarbage("collect")
+ else
+ checkmemory(used,threshold,tracememory)
+ end
+ else
+ stoptiming(otfreaders)
+ data=nil
+ report_otf("loading failed due to read error")
+ end
+ end
+ if data then
+ if trace_defining then
+ report_otf("loading from cache using hash %a",hash)
+ end
+ otfreaders.unpack(data)
+ otfreaders.expand(data)
+ otfreaders.addunicodetable(data)
+ otfenhancers.apply(data,filename,data)
+ if applyruntimefixes then
+ applyruntimefixes(filename,data)
+ end
+ data.metadata.math=data.resources.mathconstants
+ local classes=data.resources.classes
+ if not classes then
+ local descriptions=data.descriptions
+ classes=setmetatableindex(function(t,k)
+ local d=descriptions[k]
+ local v=(d and d.class or "base") or false
+ t[k]=v
+ return v
+ end)
+ data.resources.classes=classes
+ end
+ end
+ return data
+end
+function otf.setfeatures(tfmdata,features)
+ local okay=constructors.initializefeatures("otf",tfmdata,features,trace_features,report_otf)
+ if okay then
+ return constructors.collectprocessors("otf",tfmdata,features,trace_features,report_otf)
+ else
+ return {}
+ end
+end
+local function copytotfm(data,cache_id)
+ if data then
+ local metadata=data.metadata
+ local properties=derivetable(data.properties)
+ local descriptions=derivetable(data.descriptions)
+ local goodies=derivetable(data.goodies)
+ local characters={}
+ local parameters={}
+ local mathparameters={}
+ local resources=data.resources
+ local unicodes=resources.unicodes
+ local spaceunits=500
+ local spacer="space"
+ local designsize=metadata.designsize or 100
+ local minsize=metadata.minsize or designsize
+ local maxsize=metadata.maxsize or designsize
+ local mathspecs=metadata.math
+ if designsize==0 then
+ designsize=100
+ minsize=100
+ maxsize=100
+ end
+ if mathspecs then
+ for name,value in next,mathspecs do
+ mathparameters[name]=value
+ end
+ end
+ for unicode in next,data.descriptions do
+ characters[unicode]={}
+ end
+ if mathspecs then
+ for unicode,character in next,characters do
+ local d=descriptions[unicode]
+ local m=d.math
+ if m then
+ local italic=m.italic
+ local vitalic=m.vitalic
+ local variants=m.hvariants
+ local parts=m.hparts
+ if variants then
+ local c=character
+ for i=1,#variants do
+ local un=variants[i]
+ c.next=un
+ c=characters[un]
+ end
+ c.horiz_variants=parts
+ elseif parts then
+ character.horiz_variants=parts
+ italic=m.hitalic
+ end
+ local variants=m.vvariants
+ local parts=m.vparts
+ if variants then
+ local c=character
+ for i=1,#variants do
+ local un=variants[i]
+ c.next=un
+ c=characters[un]
+ end
+ c.vert_variants=parts
+ elseif parts then
+ character.vert_variants=parts
+ end
+ if italic and italic~=0 then
+ character.italic=italic
+ end
+ if vitalic and vitalic~=0 then
+ character.vert_italic=vitalic
+ end
+ local accent=m.accent
+ if accent then
+ character.accent=accent
+ end
+ local kerns=m.kerns
+ if kerns then
+ character.mathkerns=kerns
+ end
+ end
+ end
+ end
+ local filename=constructors.checkedfilename(resources)
+ local fontname=metadata.fontname
+ local fullname=metadata.fullname or fontname
+ local psname=fontname or fullname
+ local subfont=metadata.subfontindex
+ local units=metadata.units or 1000
+ if units==0 then
+ units=1000
+ metadata.units=1000
+ report_otf("changing %a units to %a",0,units)
+ end
+ local monospaced=metadata.monospaced
+ local charwidth=metadata.averagewidth
+ local charxheight=metadata.xheight
+ local italicangle=metadata.italicangle
+ local hasitalics=metadata.hasitalics
+ properties.monospaced=monospaced
+ properties.hasitalics=hasitalics
+ parameters.italicangle=italicangle
+ parameters.charwidth=charwidth
+ parameters.charxheight=charxheight
+ local space=0x0020
+ local emdash=0x2014
+ if monospaced then
+ if descriptions[space] then
+ spaceunits,spacer=descriptions[space].width,"space"
+ end
+ if not spaceunits and descriptions[emdash] then
+ spaceunits,spacer=descriptions[emdash].width,"emdash"
+ end
+ if not spaceunits and charwidth then
+ spaceunits,spacer=charwidth,"charwidth"
+ end
+ else
+ if descriptions[space] then
+ spaceunits,spacer=descriptions[space].width,"space"
+ end
+ if not spaceunits and descriptions[emdash] then
+ spaceunits,spacer=descriptions[emdash].width/2,"emdash/2"
+ end
+ if not spaceunits and charwidth then
+ spaceunits,spacer=charwidth,"charwidth"
+ end
+ end
+ spaceunits=tonumber(spaceunits) or units/2
+ parameters.slant=0
+ parameters.space=spaceunits
+ parameters.space_stretch=1*units/2
+ parameters.space_shrink=1*units/3
+ parameters.x_height=2*units/5
+ parameters.quad=units
+ if spaceunits<2*units/5 then
+ end
+ if italicangle and italicangle~=0 then
+ parameters.italicangle=italicangle
+ parameters.italicfactor=math.cos(math.rad(90+italicangle))
+ parameters.slant=- math.tan(italicangle*math.pi/180)
+ end
+ if monospaced then
+ parameters.space_stretch=0
+ parameters.space_shrink=0
+ elseif syncspace then
+ parameters.space_stretch=spaceunits/2
+ parameters.space_shrink=spaceunits/3
+ end
+ parameters.extra_space=parameters.space_shrink
+ if charxheight then
+ parameters.x_height=charxheight
+ else
+ local x=0x0078
+ if x then
+ local x=descriptions[x]
+ if x then
+ parameters.x_height=x.height
+ end
+ end
+ end
+ parameters.designsize=(designsize/10)*65536
+ parameters.minsize=(minsize/10)*65536
+ parameters.maxsize=(maxsize/10)*65536
+ parameters.ascender=abs(metadata.ascender or 0)
+ parameters.descender=abs(metadata.descender or 0)
+ parameters.units=units
+ parameters.vheight=metadata.defaultvheight
+ properties.space=spacer
+ properties.encodingbytes=2
+ properties.format=data.format or formats.otf
+ properties.filename=filename
+ properties.fontname=fontname
+ properties.fullname=fullname
+ properties.psname=psname
+ properties.name=filename or fullname
+ properties.subfont=subfont
+ properties.private=properties.private or data.private or privateoffset
+ return {
+ characters=characters,
+ descriptions=descriptions,
+ parameters=parameters,
+ mathparameters=mathparameters,
+ resources=resources,
+ properties=properties,
+ goodies=goodies,
+ }
+ end
+end
+local converters={
+ woff={
+ cachename="webfonts",
+ action=otf.readers.woff2otf,
+ }
+}
+local function checkconversion(specification)
+ local filename=specification.filename
+ local converter=converters[lower(file.suffix(filename))]
+ if converter then
+ local base=file.basename(filename)
+ local name=file.removesuffix(base)
+ local attr=lfs.attributes(filename)
+ local size=attr and attr.size or 0
+ local time=attr and attr.modification or 0
+ if size>0 then
+ local cleanname=containers.cleanname(name)
+ local cachename=caches.setfirstwritablefile(cleanname,converter.cachename)
+ if not io.exists(cachename) or (time~=lfs.attributes(cachename).modification) then
+ report_otf("caching font %a in %a",filename,cachename)
+ converter.action(filename,cachename)
+ lfs.touch(cachename,time,time)
+ end
+ specification.filename=cachename
+ end
+ end
+end
+local function otftotfm(specification)
+ local cache_id=specification.hash
+ local tfmdata=containers.read(constructors.cache,cache_id)
+ if not tfmdata then
+ checkconversion(specification)
+ local name=specification.name
+ local sub=specification.sub
+ local subindex=specification.subindex
+ local filename=specification.filename
+ local features=specification.features.normal
+ local instance=specification.instance or (features and features.axis)
+ local rawdata=otf.load(filename,sub,instance)
+ if rawdata and next(rawdata) then
+ local descriptions=rawdata.descriptions
+ rawdata.lookuphash={}
+ tfmdata=copytotfm(rawdata,cache_id)
+ if tfmdata and next(tfmdata) then
+ local features=constructors.checkedfeatures("otf",features)
+ local shared=tfmdata.shared
+ if not shared then
+ shared={}
+ tfmdata.shared=shared
+ end
+ shared.rawdata=rawdata
+ shared.dynamics={}
+ tfmdata.changed={}
+ shared.features=features
+ shared.processes=otf.setfeatures(tfmdata,features)
+ end
+ end
+ containers.write(constructors.cache,cache_id,tfmdata)
+ end
+ return tfmdata
+end
+local function read_from_otf(specification)
+ local tfmdata=otftotfm(specification)
+ if tfmdata then
+ tfmdata.properties.name=specification.name
+ tfmdata.properties.sub=specification.sub
+ tfmdata=constructors.scale(tfmdata,specification)
+ local allfeatures=tfmdata.shared.features or specification.features.normal
+ constructors.applymanipulators("otf",tfmdata,allfeatures,trace_features,report_otf)
+ constructors.setname(tfmdata,specification)
+ fonts.loggers.register(tfmdata,file.suffix(specification.filename),specification)
+ end
+ return tfmdata
+end
+local function checkmathsize(tfmdata,mathsize)
+ local mathdata=tfmdata.shared.rawdata.metadata.math
+ local mathsize=tonumber(mathsize)
+ if mathdata then
+ local parameters=tfmdata.parameters
+ parameters.scriptpercentage=mathdata.ScriptPercentScaleDown
+ parameters.scriptscriptpercentage=mathdata.ScriptScriptPercentScaleDown
+ parameters.mathsize=mathsize
+ end
+end
+registerotffeature {
+ name="mathsize",
+ description="apply mathsize specified in the font",
+ initializers={
+ base=checkmathsize,
+ node=checkmathsize,
+ }
+}
+function otf.collectlookups(rawdata,kind,script,language)
+ if not kind then
+ return
+ end
+ if not script then
+ script=default
+ end
+ if not language then
+ language=default
+ end
+ local lookupcache=rawdata.lookupcache
+ if not lookupcache then
+ lookupcache={}
+ rawdata.lookupcache=lookupcache
+ end
+ local kindlookup=lookupcache[kind]
+ if not kindlookup then
+ kindlookup={}
+ lookupcache[kind]=kindlookup
+ end
+ local scriptlookup=kindlookup[script]
+ if not scriptlookup then
+ scriptlookup={}
+ kindlookup[script]=scriptlookup
+ end
+ local languagelookup=scriptlookup[language]
+ if not languagelookup then
+ local sequences=rawdata.resources.sequences
+ local featuremap={}
+ local featurelist={}
+ if sequences then
+ for s=1,#sequences do
+ local sequence=sequences[s]
+ local features=sequence.features
+ if features then
+ features=features[kind]
+ if features then
+ features=features[script] or features[wildcard]
+ if features then
+ features=features[language] or features[wildcard]
+ if features then
+ if not featuremap[sequence] then
+ featuremap[sequence]=true
+ featurelist[#featurelist+1]=sequence
+ end
+ end
+ end
+ end
+ end
+ end
+ if #featurelist==0 then
+ featuremap,featurelist=false,false
+ end
+ else
+ featuremap,featurelist=false,false
+ end
+ languagelookup={ featuremap,featurelist }
+ scriptlookup[language]=languagelookup
+ end
+ return unpack(languagelookup)
+end
+local function getgsub(tfmdata,k,kind,value)
+ local shared=tfmdata.shared
+ local rawdata=shared and shared.rawdata
+ if rawdata then
+ local sequences=rawdata.resources.sequences
+ if sequences then
+ local properties=tfmdata.properties
+ local validlookups,lookuplist=otf.collectlookups(rawdata,kind,properties.script,properties.language)
+ if validlookups then
+ for i=1,#lookuplist do
+ local lookup=lookuplist[i]
+ local steps=lookup.steps
+ local nofsteps=lookup.nofsteps
+ for i=1,nofsteps do
+ local coverage=steps[i].coverage
+ if coverage then
+ local found=coverage[k]
+ if found then
+ return found,lookup.type
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+otf.getgsub=getgsub
+function otf.getsubstitution(tfmdata,k,kind,value)
+ local found,kind=getgsub(tfmdata,k,kind,value)
+ if not found then
+ elseif kind=="gsub_single" then
+ return found
+ elseif kind=="gsub_alternate" then
+ local choice=tonumber(value) or 1
+ return found[choice] or found[1] or k
+ end
+ return k
+end
+otf.getalternate=otf.getsubstitution
+function otf.getmultiple(tfmdata,k,kind)
+ local found,kind=getgsub(tfmdata,k,kind)
+ if found and kind=="gsub_multiple" then
+ return found
+ end
+ return { k }
+end
+function otf.getkern(tfmdata,left,right,kind)
+ local kerns=getgsub(tfmdata,left,kind or "kern",true)
+ if kerns then
+ local found=kerns[right]
+ local kind=type(found)
+ if kind=="table" then
+ found=found[1][3]
+ elseif kind~="number" then
+ found=false
+ end
+ if found then
+ return found*tfmdata.parameters.factor
+ end
+ end
+ return 0
+end
+local function check_otf(forced,specification,suffix)
+ local name=specification.name
+ if forced then
+ name=specification.forcedname
+ end
+ local fullname=findbinfile(name,suffix) or ""
+ if fullname=="" then
+ fullname=fonts.names.getfilename(name,suffix) or ""
+ end
+ if fullname~="" and not fonts.names.ignoredfile(fullname) then
+ specification.filename=fullname
+ return read_from_otf(specification)
+ end
+end
+local function opentypereader(specification,suffix)
+ local forced=specification.forced or ""
+ if formats[forced] then
+ return check_otf(true,specification,forced)
+ else
+ return check_otf(false,specification,suffix)
+ end
+end
+readers.opentype=opentypereader
+function readers.otf(specification) return opentypereader(specification,"otf") end
+function readers.ttf(specification) return opentypereader(specification,"ttf") end
+function readers.ttc(specification) return opentypereader(specification,"ttf") end
+function readers.woff(specification)
+ checkconversion(specification)
+ opentypereader(specification,"")
+end
+function otf.scriptandlanguage(tfmdata,attr)
+ local properties=tfmdata.properties
+ return properties.script or "dflt",properties.language or "dflt"
+end
+local function justset(coverage,unicode,replacement)
+ coverage[unicode]=replacement
+end
+otf.coverup={
+ stepkey="steps",
+ actions={
+ chainsubstitution=justset,
+ chainposition=justset,
+ substitution=justset,
+ alternate=justset,
+ multiple=justset,
+ kern=justset,
+ pair=justset,
+ single=justset,
+ ligature=function(coverage,unicode,ligature)
+ local first=ligature[1]
+ local tree=coverage[first]
+ if not tree then
+ tree={}
+ coverage[first]=tree
+ end
+ for i=2,#ligature do
+ local l=ligature[i]
+ local t=tree[l]
+ if not t then
+ t={}
+ tree[l]=t
+ end
+ tree=t
+ end
+ tree.ligature=unicode
+ end,
+ },
+ register=function(coverage,featuretype,format)
+ return {
+ format=format,
+ coverage=coverage,
+ }
+ end
+}
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-otl”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-oto” 24238a7c600d090a8ee88312321dd9b3] ---
+
+if not modules then modules={} end modules ['font-oto']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local concat,unpack=table.concat,table.unpack
+local insert,remove=table.insert,table.remove
+local format,gmatch,gsub,find,match,lower,strip=string.format,string.gmatch,string.gsub,string.find,string.match,string.lower,string.strip
+local type,next,tonumber,tostring=type,next,tonumber,tostring
+local trace_baseinit=false trackers.register("otf.baseinit",function(v) trace_baseinit=v end)
+local trace_singles=false trackers.register("otf.singles",function(v) trace_singles=v end)
+local trace_multiples=false trackers.register("otf.multiples",function(v) trace_multiples=v end)
+local trace_alternatives=false trackers.register("otf.alternatives",function(v) trace_alternatives=v end)
+local trace_ligatures=false trackers.register("otf.ligatures",function(v) trace_ligatures=v end)
+local trace_kerns=false trackers.register("otf.kerns",function(v) trace_kerns=v end)
+local trace_preparing=false trackers.register("otf.preparing",function(v) trace_preparing=v end)
+local report_prepare=logs.reporter("fonts","otf prepare")
+local fonts=fonts
+local otf=fonts.handlers.otf
+local otffeatures=otf.features
+local registerotffeature=otffeatures.register
+otf.defaultbasealternate="none"
+local getprivate=fonts.constructors.getprivate
+local wildcard="*"
+local default="dflt"
+local formatters=string.formatters
+local f_unicode=formatters["%U"]
+local f_uniname=formatters["%U (%s)"]
+local f_unilist=formatters["% t (% t)"]
+local function gref(descriptions,n)
+ if type(n)=="number" then
+ local name=descriptions[n].name
+ if name then
+ return f_uniname(n,name)
+ else
+ return f_unicode(n)
+ end
+ elseif n then
+ local num={}
+ local nam={}
+ local j=0
+ for i=1,#n do
+ local ni=n[i]
+ if tonumber(ni) then
+ j=j+1
+ local di=descriptions[ni]
+ num[j]=f_unicode(ni)
+ nam[j]=di and di.name or "-"
+ end
+ end
+ return f_unilist(num,nam)
+ else
+ return ""
+ end
+end
+local function cref(feature,sequence)
+ return formatters["feature %a, type %a, chain lookup %a"](feature,sequence.type,sequence.name)
+end
+local function report_substitution(feature,sequence,descriptions,unicode,substitution)
+ if unicode==substitution then
+ report_prepare("%s: base substitution %s maps onto itself",
+ cref(feature,sequence),
+ gref(descriptions,unicode))
+ else
+ report_prepare("%s: base substitution %s => %S",
+ cref(feature,sequence),
+ gref(descriptions,unicode),
+ gref(descriptions,substitution))
+ end
+end
+local function report_alternate(feature,sequence,descriptions,unicode,replacement,value,comment)
+ if unicode==replacement then
+ report_prepare("%s: base alternate %s maps onto itself",
+ cref(feature,sequence),
+ gref(descriptions,unicode))
+ else
+ report_prepare("%s: base alternate %s => %s (%S => %S)",
+ cref(feature,sequence),
+ gref(descriptions,unicode),
+ replacement and gref(descriptions,replacement),
+ value,
+ comment)
+ end
+end
+local function report_ligature(feature,sequence,descriptions,unicode,ligature)
+ report_prepare("%s: base ligature %s => %S",
+ cref(feature,sequence),
+ gref(descriptions,ligature),
+ gref(descriptions,unicode))
+end
+local function report_kern(feature,sequence,descriptions,unicode,otherunicode,value)
+ report_prepare("%s: base kern %s + %s => %S",
+ cref(feature,sequence),
+ gref(descriptions,unicode),
+ gref(descriptions,otherunicode),
+ value)
+end
+local basehash,basehashes,applied={},1,{}
+local function registerbasehash(tfmdata)
+ local properties=tfmdata.properties
+ local hash=concat(applied," ")
+ local base=basehash[hash]
+ if not base then
+ basehashes=basehashes+1
+ base=basehashes
+ basehash[hash]=base
+ end
+ properties.basehash=base
+ properties.fullname=(properties.fullname or properties.name).."-"..base
+ applied={}
+end
+local function registerbasefeature(feature,value)
+ applied[#applied+1]=feature.."="..tostring(value)
+end
+local function makefake(tfmdata,name,present)
+ local private=getprivate(tfmdata)
+ local character={ intermediate=true,ligatures={} }
+ resources.unicodes[name]=private
+ tfmdata.characters[private]=character
+ tfmdata.descriptions[private]={ name=name }
+ present[name]=private
+ return character
+end
+local function make_1(present,tree,name)
+ for k,v in next,tree do
+ if k=="ligature" then
+ present[name]=v
+ else
+ make_1(present,v,name.."_"..k)
+ end
+ end
+end
+local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,done)
+ for k,v in next,tree do
+ if k=="ligature" then
+ local character=characters[preceding]
+ if not character then
+ if trace_baseinit then
+ report_prepare("weird ligature in lookup %a, current %C, preceding %C",sequence.name,v,preceding)
+ end
+ character=makefake(tfmdata,name,present)
+ end
+ local ligatures=character.ligatures
+ if ligatures then
+ ligatures[unicode]={ char=v }
+ else
+ character.ligatures={ [unicode]={ char=v } }
+ end
+ if done then
+ local d=done[name]
+ if not d then
+ done[name]={ "dummy",v }
+ else
+ d[#d+1]=v
+ end
+ end
+ else
+ local code=present[name] or unicode
+ local name=name.."_"..k
+ make_2(present,tfmdata,characters,v,name,code,k,done)
+ end
+ end
+end
+local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplist)
+ local characters=tfmdata.characters
+ local descriptions=tfmdata.descriptions
+ local resources=tfmdata.resources
+ local changed=tfmdata.changed
+ local ligatures={}
+ local alternate=tonumber(value) or true and 1
+ local defaultalt=otf.defaultbasealternate
+ local trace_singles=trace_baseinit and trace_singles
+ local trace_alternatives=trace_baseinit and trace_alternatives
+ local trace_ligatures=trace_baseinit and trace_ligatures
+ if not changed then
+ changed={}
+ tfmdata.changed=changed
+ end
+ for i=1,#lookuplist do
+ local sequence=lookuplist[i]
+ local steps=sequence.steps
+ local kind=sequence.type
+ if kind=="gsub_single" then
+ for i=1,#steps do
+ for unicode,data in next,steps[i].coverage do
+ if unicode~=data then
+ changed[unicode]=data
+ end
+ if trace_singles then
+ report_substitution(feature,sequence,descriptions,unicode,data)
+ end
+ end
+ end
+ elseif kind=="gsub_alternate" then
+ for i=1,#steps do
+ for unicode,data in next,steps[i].coverage do
+ local replacement=data[alternate]
+ if replacement then
+ if unicode~=replacement then
+ changed[unicode]=replacement
+ end
+ if trace_alternatives then
+ report_alternate(feature,sequence,descriptions,unicode,replacement,value,"normal")
+ end
+ elseif defaultalt=="first" then
+ replacement=data[1]
+ if unicode~=replacement then
+ changed[unicode]=replacement
+ end
+ if trace_alternatives then
+ report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt)
+ end
+ elseif defaultalt=="last" then
+ replacement=data[#data]
+ if unicode~=replacement then
+ changed[unicode]=replacement
+ end
+ if trace_alternatives then
+ report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt)
+ end
+ else
+ if trace_alternatives then
+ report_alternate(feature,sequence,descriptions,unicode,replacement,value,"unknown")
+ end
+ end
+ end
+ end
+ elseif kind=="gsub_ligature" then
+ for i=1,#steps do
+ for unicode,data in next,steps[i].coverage do
+ ligatures[#ligatures+1]={ unicode,data,"" }
+ if trace_ligatures then
+ report_ligature(feature,sequence,descriptions,unicode,data)
+ end
+ end
+ end
+ end
+ end
+ local nofligatures=#ligatures
+ if nofligatures>0 then
+ local characters=tfmdata.characters
+ local present={}
+ local done=trace_baseinit and trace_ligatures and {}
+ for i=1,nofligatures do
+ local ligature=ligatures[i]
+ local unicode=ligature[1]
+ local tree=ligature[2]
+ make_1(present,tree,"ctx_"..unicode)
+ end
+ for i=1,nofligatures do
+ local ligature=ligatures[i]
+ local unicode=ligature[1]
+ local tree=ligature[2]
+ local lookupname=ligature[3]
+ make_2(present,tfmdata,characters,tree,"ctx_"..unicode,unicode,unicode,done,sequence)
+ end
+ end
+end
+local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist)
+ local characters=tfmdata.characters
+ local descriptions=tfmdata.descriptions
+ local resources=tfmdata.resources
+ local properties=tfmdata.properties
+ local traceindeed=trace_baseinit and trace_kerns
+ for i=1,#lookuplist do
+ local sequence=lookuplist[i]
+ local steps=sequence.steps
+ local kind=sequence.type
+ local format=sequence.format
+ if kind=="gpos_pair" then
+ for i=1,#steps do
+ local step=steps[i]
+ local format=step.format
+ if format=="kern" or format=="move" then
+ for unicode,data in next,steps[i].coverage do
+ local character=characters[unicode]
+ local kerns=character.kerns
+ if not kerns then
+ kerns={}
+ character.kerns=kerns
+ end
+ if traceindeed then
+ for otherunicode,kern in next,data do
+ if not kerns[otherunicode] and kern~=0 then
+ kerns[otherunicode]=kern
+ report_kern(feature,sequence,descriptions,unicode,otherunicode,kern)
+ end
+ end
+ else
+ for otherunicode,kern in next,data do
+ if not kerns[otherunicode] and kern~=0 then
+ kerns[otherunicode]=kern
+ end
+ end
+ end
+ end
+ else
+ for unicode,data in next,steps[i].coverage do
+ local character=characters[unicode]
+ local kerns=character.kerns
+ for otherunicode,kern in next,data do
+ local other=kern[2]
+ if other==true or (not other and not (kerns and kerns[otherunicode])) then
+ local kern=kern[1]
+ if kern==true then
+ elseif kern[1]~=0 or kern[2]~=0 or kern[4]~=0 then
+ else
+ kern=kern[3]
+ if kern~=0 then
+ if kerns then
+ kerns[otherunicode]=kern
+ else
+ kerns={ [otherunicode]=kern }
+ character.kerns=kerns
+ end
+ if traceindeed then
+ report_kern(feature,sequence,descriptions,unicode,otherunicode,kern)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+local function initializehashes(tfmdata)
+end
+local function checkmathreplacements(tfmdata,fullname,fixitalics)
+ if tfmdata.mathparameters then
+ local characters=tfmdata.characters
+ local changed=tfmdata.changed
+ if next(changed) then
+ if trace_preparing or trace_baseinit then
+ report_prepare("checking math replacements for %a",fullname)
+ end
+ for unicode,replacement in next,changed do
+ local u=characters[unicode]
+ local r=characters[replacement]
+ if u and r then
+ local n=u.next
+ local v=u.vert_variants
+ local h=u.horiz_variants
+ if fixitalics then
+ local ui=u.italic
+ if ui and not r.italic then
+ if trace_preparing then
+ report_prepare("using %i units of italic correction from %C for %U",ui,unicode,replacement)
+ end
+ r.italic=ui
+ end
+ end
+ if n and not r.next then
+ if trace_preparing then
+ report_prepare("forcing %s for %C substituted by %U","incremental step",unicode,replacement)
+ end
+ r.next=n
+ end
+ if v and not r.vert_variants then
+ if trace_preparing then
+ report_prepare("forcing %s for %C substituted by %U","vertical variants",unicode,replacement)
+ end
+ r.vert_variants=v
+ end
+ if h and not r.horiz_variants then
+ if trace_preparing then
+ report_prepare("forcing %s for %C substituted by %U","horizontal variants",unicode,replacement)
+ end
+ r.horiz_variants=h
+ end
+ else
+ if trace_preparing then
+ report_prepare("error replacing %C by %U",unicode,replacement)
+ end
+ end
+ end
+ end
+ end
+end
+local function featuresinitializer(tfmdata,value)
+ if true then
+ local starttime=trace_preparing and os.clock()
+ local features=tfmdata.shared.features
+ local fullname=tfmdata.properties.fullname or "?"
+ if features then
+ initializehashes(tfmdata)
+ local collectlookups=otf.collectlookups
+ local rawdata=tfmdata.shared.rawdata
+ local properties=tfmdata.properties
+ local script=properties.script
+ local language=properties.language
+ local rawresources=rawdata.resources
+ local rawfeatures=rawresources and rawresources.features
+ local basesubstitutions=rawfeatures and rawfeatures.gsub
+ local basepositionings=rawfeatures and rawfeatures.gpos
+ local substitutionsdone=false
+ local positioningsdone=false
+ if basesubstitutions or basepositionings then
+ local sequences=tfmdata.resources.sequences
+ for s=1,#sequences do
+ local sequence=sequences[s]
+ local sfeatures=sequence.features
+ if sfeatures then
+ local order=sequence.order
+ if order then
+ for i=1,#order do
+ local feature=order[i]
+ local value=features[feature]
+ if value then
+ local validlookups,lookuplist=collectlookups(rawdata,feature,script,language)
+ if not validlookups then
+ elseif basesubstitutions and basesubstitutions[feature] then
+ if trace_preparing then
+ report_prepare("filtering base %s feature %a for %a with value %a","sub",feature,fullname,value)
+ end
+ preparesubstitutions(tfmdata,feature,value,validlookups,lookuplist)
+ registerbasefeature(feature,value)
+ substitutionsdone=true
+ elseif basepositionings and basepositionings[feature] then
+ if trace_preparing then
+ report_prepare("filtering base %a feature %a for %a with value %a","pos",feature,fullname,value)
+ end
+ preparepositionings(tfmdata,feature,value,validlookups,lookuplist)
+ registerbasefeature(feature,value)
+ positioningsdone=true
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if substitutionsdone then
+ checkmathreplacements(tfmdata,fullname,features.fixitalics)
+ end
+ registerbasehash(tfmdata)
+ end
+ if trace_preparing then
+ report_prepare("preparation time is %0.3f seconds for %a",os.clock()-starttime,fullname)
+ end
+ end
+end
+registerotffeature {
+ name="features",
+ description="features",
+ default=true,
+ initializers={
+ base=featuresinitializer,
+ }
+}
+otf.basemodeinitializer=featuresinitializer
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-oto”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-otj” c9ded1d935bfa43020657e1f408fb820] ---
+
+if not modules then modules={} end modules ['font-otj']={
+ version=1.001,
+ comment="companion to font-lib.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files",
+}
+if not nodes.properties then return end
+local next,rawget,tonumber=next,rawget,tonumber
+local fastcopy=table.fastcopy
+local registertracker=trackers.register
+local registerdirective=directives.register
+local trace_injections=false registertracker("fonts.injections",function(v) trace_injections=v end)
+local trace_marks=false registertracker("fonts.injections.marks",function(v) trace_marks=v end)
+local trace_cursive=false registertracker("fonts.injections.cursive",function(v) trace_cursive=v end)
+local trace_spaces=false registertracker("fonts.injections.spaces",function(v) trace_spaces=v end)
+local report_injections=logs.reporter("fonts","injections")
+local report_spaces=logs.reporter("fonts","spaces")
+local attributes,nodes,node=attributes,nodes,node
+fonts=fonts
+local hashes=fonts.hashes
+local fontdata=hashes.identifiers
+local fontmarks=hashes.marks
+nodes.injections=nodes.injections or {}
+local injections=nodes.injections
+local tracers=nodes.tracers
+local setcolor=tracers and tracers.colors.set
+local resetcolor=tracers and tracers.colors.reset
+local nodecodes=nodes.nodecodes
+local glyph_code=nodecodes.glyph
+local disc_code=nodecodes.disc
+local kern_code=nodecodes.kern
+local glue_code=nodecodes.glue
+local nuts=nodes.nuts
+local nodepool=nuts.pool
+local tonode=nuts.tonode
+local tonut=nuts.tonut
+local setfield=nuts.setfield
+local getnext=nuts.getnext
+local getprev=nuts.getprev
+local getid=nuts.getid
+local getfont=nuts.getfont
+local getchar=nuts.getchar
+local getoffsets=nuts.getoffsets
+local getboth=nuts.getboth
+local getdisc=nuts.getdisc
+local setdisc=nuts.setdisc
+local setoffsets=nuts.setoffsets
+local ischar=nuts.ischar
+local getkern=nuts.getkern
+local setkern=nuts.setkern
+local setlink=nuts.setlink
+local setwidth=nuts.setwidth
+local getwidth=nuts.getwidth
+local nextchar=nuts.traversers.char
+local nextglue=nuts.traversers.glue
+local insert_node_before=nuts.insert_before
+local insert_node_after=nuts.insert_after
+local properties=nodes.properties.data
+local fontkern=nuts.pool and nuts.pool.fontkern
+local italickern=nuts.pool and nuts.pool.italickern
+local useitalickerns=false
+directives.register("fonts.injections.useitalics",function(v)
+ if v then
+ report_injections("using italics for space kerns (tracing only)")
+ end
+ useitalickerns=v
+end)
+if not fontkern then
+ local thekern=nuts.new("kern",0)
+ local setkern=nuts.setkern
+ local copy_node=nuts.copy_node
+ fontkern=function(k)
+ local n=copy_node(thekern)
+ setkern(n,k)
+ return n
+ end
+end
+if not italickern then
+ local thekern=nuts.new("kern",3)
+ local setkern=nuts.setkern
+ local copy_node=nuts.copy_node
+ italickern=function(k)
+ local n=copy_node(thekern)
+ setkern(n,k)
+ return n
+ end
+end
+function injections.installnewkern() end
+local nofregisteredkerns=0
+local nofregisteredpositions=0
+local nofregisteredmarks=0
+local nofregisteredcursives=0
+local keepregisteredcounts=false
+function injections.keepcounts()
+ keepregisteredcounts=true
+end
+function injections.resetcounts()
+ nofregisteredkerns=0
+ nofregisteredpositions=0
+ nofregisteredmarks=0
+ nofregisteredcursives=0
+ keepregisteredcounts=false
+end
+function injections.reset(n)
+ local p=rawget(properties,n)
+ if p then
+ p.injections=false
+ else
+ properties[n]=false
+ end
+end
+function injections.copy(target,source)
+ local sp=rawget(properties,source)
+ if sp then
+ local tp=rawget(properties,target)
+ local si=sp.injections
+ if si then
+ si=fastcopy(si)
+ if tp then
+ tp.injections=si
+ else
+ properties[target]={
+ injections=si,
+ }
+ end
+ elseif tp then
+ tp.injections=false
+ else
+ properties[target]={ injections={} }
+ end
+ else
+ local tp=rawget(properties,target)
+ if tp then
+ tp.injections=false
+ else
+ properties[target]=false
+ end
+ end
+end
+function injections.setligaindex(n,index)
+ local p=rawget(properties,n)
+ if p then
+ local i=p.injections
+ if i then
+ i.ligaindex=index
+ else
+ p.injections={
+ ligaindex=index
+ }
+ end
+ else
+ properties[n]={
+ injections={
+ ligaindex=index
+ }
+ }
+ end
+end
+function injections.getligaindex(n,default)
+ local p=rawget(properties,n)
+ if p then
+ local i=p.injections
+ if i then
+ return i.ligaindex or default
+ end
+ end
+ return default
+end
+function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext,r2lflag)
+ local dx=factor*(exit[1]-entry[1])
+ local dy=-factor*(exit[2]-entry[2])
+ local ws=tfmstart.width
+ local wn=tfmnext.width
+ nofregisteredcursives=nofregisteredcursives+1
+ if rlmode<0 then
+ dx=-(dx+wn)
+ else
+ dx=dx-ws
+ end
+ if dx==0 then
+ dx=0
+ end
+ local p=rawget(properties,start)
+ if p then
+ local i=p.injections
+ if i then
+ i.cursiveanchor=true
+ else
+ p.injections={
+ cursiveanchor=true,
+ }
+ end
+ else
+ properties[start]={
+ injections={
+ cursiveanchor=true,
+ },
+ }
+ end
+ local p=rawget(properties,nxt)
+ if p then
+ local i=p.injections
+ if i then
+ i.cursivex=dx
+ i.cursivey=dy
+ else
+ p.injections={
+ cursivex=dx,
+ cursivey=dy,
+ }
+ end
+ else
+ properties[nxt]={
+ injections={
+ cursivex=dx,
+ cursivey=dy,
+ },
+ }
+ end
+ return dx,dy,nofregisteredcursives
+end
+function injections.setposition(kind,current,factor,rlmode,spec,injection)
+ local x=factor*(spec[1] or 0)
+ local y=factor*(spec[2] or 0)
+ local w=factor*(spec[3] or 0)
+ local h=factor*(spec[4] or 0)
+ if x~=0 or w~=0 or y~=0 or h~=0 then
+ local yoffset=y-h
+ local leftkern=x
+ local rightkern=w-x
+ if leftkern~=0 or rightkern~=0 or yoffset~=0 then
+ nofregisteredpositions=nofregisteredpositions+1
+ if rlmode and rlmode<0 then
+ leftkern,rightkern=rightkern,leftkern
+ end
+ if not injection then
+ injection="injections"
+ end
+ local p=rawget(properties,current)
+ if p then
+ local i=p[injection]
+ if i then
+ if leftkern~=0 then
+ i.leftkern=(i.leftkern or 0)+leftkern
+ end
+ if rightkern~=0 then
+ i.rightkern=(i.rightkern or 0)+rightkern
+ end
+ if yoffset~=0 then
+ i.yoffset=(i.yoffset or 0)+yoffset
+ end
+ elseif leftkern~=0 or rightkern~=0 then
+ p[injection]={
+ leftkern=leftkern,
+ rightkern=rightkern,
+ yoffset=yoffset,
+ }
+ else
+ p[injection]={
+ yoffset=yoffset,
+ }
+ end
+ elseif leftkern~=0 or rightkern~=0 then
+ properties[current]={
+ [injection]={
+ leftkern=leftkern,
+ rightkern=rightkern,
+ yoffset=yoffset,
+ },
+ }
+ else
+ properties[current]={
+ [injection]={
+ yoffset=yoffset,
+ },
+ }
+ end
+ return x,y,w,h,nofregisteredpositions
+ end
+ end
+ return x,y,w,h
+end
+function injections.setkern(current,factor,rlmode,x,injection)
+ local dx=factor*x
+ if dx~=0 then
+ nofregisteredkerns=nofregisteredkerns+1
+ local p=rawget(properties,current)
+ if not injection then
+ injection="injections"
+ end
+ if p then
+ local i=p[injection]
+ if i then
+ i.leftkern=dx+(i.leftkern or 0)
+ else
+ p[injection]={
+ leftkern=dx,
+ }
+ end
+ else
+ properties[current]={
+ [injection]={
+ leftkern=dx,
+ },
+ }
+ end
+ return dx,nofregisteredkerns
+ else
+ return 0,0
+ end
+end
+function injections.setmove(current,factor,rlmode,x,injection)
+ local dx=factor*x
+ if dx~=0 then
+ nofregisteredkerns=nofregisteredkerns+1
+ local p=rawget(properties,current)
+ if not injection then
+ injection="injections"
+ end
+ if rlmode and rlmode<0 then
+ if p then
+ local i=p[injection]
+ if i then
+ i.rightkern=dx+(i.rightkern or 0)
+ else
+ p[injection]={
+ rightkern=dx,
+ }
+ end
+ else
+ properties[current]={
+ [injection]={
+ rightkern=dx,
+ },
+ }
+ end
+ else
+ if p then
+ local i=p[injection]
+ if i then
+ i.leftkern=dx+(i.leftkern or 0)
+ else
+ p[injection]={
+ leftkern=dx,
+ }
+ end
+ else
+ properties[current]={
+ [injection]={
+ leftkern=dx,
+ },
+ }
+ end
+ end
+ return dx,nofregisteredkerns
+ else
+ return 0,0
+ end
+end
+function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase,mkmk,checkmark)
+ local dx=factor*(ba[1]-ma[1])
+ local dy=factor*(ba[2]-ma[2])
+ nofregisteredmarks=nofregisteredmarks+1
+ if rlmode>=0 then
+ dx=tfmbase.width-dx
+ end
+ local p=rawget(properties,start)
+ if p then
+ local i=p.injections
+ if i then
+ if i.markmark then
+ else
+ i.markx=dx
+ i.marky=dy
+ i.markdir=rlmode or 0
+ i.markbase=nofregisteredmarks
+ i.markbasenode=base
+ i.markmark=mkmk
+ i.checkmark=checkmark
+ end
+ else
+ p.injections={
+ markx=dx,
+ marky=dy,
+ markdir=rlmode or 0,
+ markbase=nofregisteredmarks,
+ markbasenode=base,
+ markmark=mkmk,
+ checkmark=checkmark,
+ }
+ end
+ else
+ properties[start]={
+ injections={
+ markx=dx,
+ marky=dy,
+ markdir=rlmode or 0,
+ markbase=nofregisteredmarks,
+ markbasenode=base,
+ markmark=mkmk,
+ checkmark=checkmark,
+ },
+ }
+ end
+ return dx,dy,nofregisteredmarks
+end
+local function dir(n)
+ return (n and n<0 and "r-to-l") or (n and n>0 and "l-to-r") or "unset"
+end
+local function showchar(n,nested)
+ local char=getchar(n)
+ report_injections("%wfont %s, char %U, glyph %c",nested and 2 or 0,getfont(n),char,char)
+end
+local function show(n,what,nested,symbol)
+ if n then
+ local p=rawget(properties,n)
+ if p then
+ local i=p[what]
+ if i then
+ local leftkern=i.leftkern or 0
+ local rightkern=i.rightkern or 0
+ local yoffset=i.yoffset or 0
+ local markx=i.markx or 0
+ local marky=i.marky or 0
+ local markdir=i.markdir or 0
+ local markbase=i.markbase or 0
+ local cursivex=i.cursivex or 0
+ local cursivey=i.cursivey or 0
+ local ligaindex=i.ligaindex or 0
+ local cursbase=i.cursiveanchor
+ local margin=nested and 4 or 2
+ if rightkern~=0 or yoffset~=0 then
+ report_injections("%w%s pair: lx %p, rx %p, dy %p",margin,symbol,leftkern,rightkern,yoffset)
+ elseif leftkern~=0 then
+ report_injections("%w%s kern: dx %p",margin,symbol,leftkern)
+ end
+ if markx~=0 or marky~=0 or markbase~=0 then
+ report_injections("%w%s mark: dx %p, dy %p, dir %s, base %s",margin,symbol,markx,marky,markdir,markbase~=0 and "yes" or "no")
+ end
+ if cursivex~=0 or cursivey~=0 then
+ if cursbase then
+ report_injections("%w%s curs: base dx %p, dy %p",margin,symbol,cursivex,cursivey)
+ else
+ report_injections("%w%s curs: dx %p, dy %p",margin,symbol,cursivex,cursivey)
+ end
+ elseif cursbase then
+ report_injections("%w%s curs: base",margin,symbol)
+ end
+ if ligaindex~=0 then
+ report_injections("%w%s liga: index %i",margin,symbol,ligaindex)
+ end
+ end
+ end
+ end
+end
+local function showsub(n,what,where)
+ report_injections("begin subrun: %s",where)
+ for n in nextchar,n do
+ showchar(n,where)
+ show(n,what,where," ")
+ end
+ report_injections("end subrun")
+end
+local function trace(head,where)
+ report_injections()
+ report_injections("begin run %s: %s kerns, %s positions, %s marks and %s cursives registered",
+ where or "",nofregisteredkerns,nofregisteredpositions,nofregisteredmarks,nofregisteredcursives)
+ local n=head
+ while n do
+ local id=getid(n)
+ if id==glyph_code then
+ showchar(n)
+ show(n,"injections",false," ")
+ show(n,"preinjections",false,"<")
+ show(n,"postinjections",false,">")
+ show(n,"replaceinjections",false,"=")
+ show(n,"emptyinjections",false,"*")
+ elseif id==disc_code then
+ local pre,post,replace=getdisc(n)
+ if pre then
+ showsub(pre,"preinjections","pre")
+ end
+ if post then
+ showsub(post,"postinjections","post")
+ end
+ if replace then
+ showsub(replace,"replaceinjections","replace")
+ end
+ show(n,"emptyinjections",false,"*")
+ end
+ n=getnext(n)
+ end
+ report_injections("end run")
+end
+local function show_result(head)
+ local current=head
+ local skipping=false
+ while current do
+ local id=getid(current)
+ if id==glyph_code then
+ local w=getwidth(current)
+ local x,y=getoffsets(current)
+ report_injections("char: %C, width %p, xoffset %p, yoffset %p",getchar(current),w,x,y)
+ skipping=false
+ elseif id==kern_code then
+ report_injections("kern: %p",getkern(current))
+ skipping=false
+ elseif not skipping then
+ report_injections()
+ skipping=true
+ end
+ current=getnext(current)
+ end
+ report_injections()
+end
+local function inject_kerns_only(head,where)
+ if trace_injections then
+ trace(head,"kerns")
+ end
+ local current=head
+ local prev=nil
+ local next=nil
+ local prevdisc=nil
+ local pre=nil
+ local post=nil
+ local replace=nil
+ local pretail=nil
+ local posttail=nil
+ local replacetail=nil
+ while current do
+ local next=getnext(current)
+ local char,id=ischar(current)
+ if char then
+ local p=rawget(properties,current)
+ if p then
+ local i=p.injections
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ if prev and getid(prev)==glue_code then
+ if useitalickerns then
+ head=insert_node_before(head,current,italickern(leftkern))
+ else
+ setwidth(prev,getwidth(prev)+leftkern)
+ end
+ else
+ head=insert_node_before(head,current,fontkern(leftkern))
+ end
+ end
+ end
+ if prevdisc then
+ local done=false
+ if post then
+ local i=p.postinjections
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ setlink(posttail,fontkern(leftkern))
+ done=true
+ end
+ end
+ end
+ if replace then
+ local i=p.replaceinjections
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ setlink(replacetail,fontkern(leftkern))
+ done=true
+ end
+ end
+ else
+ local i=p.emptyinjections
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ replace=fontkern(leftkern)
+ done=true
+ end
+ end
+ end
+ if done then
+ setdisc(prevdisc,pre,post,replace)
+ end
+ end
+ end
+ prevdisc=nil
+ elseif char==false then
+ prevdisc=nil
+ elseif id==disc_code then
+ pre,post,replace,pretail,posttail,replacetail=getdisc(current,true)
+ local done=false
+ if pre then
+ for n in nextchar,pre do
+ local p=rawget(properties,n)
+ if p then
+ local i=p.injections or p.preinjections
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ pre=insert_node_before(pre,n,fontkern(leftkern))
+ done=true
+ end
+ end
+ end
+ end
+ end
+ if post then
+ for n in nextchar,post do
+ local p=rawget(properties,n)
+ if p then
+ local i=p.injections or p.postinjections
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ post=insert_node_before(post,n,fontkern(leftkern))
+ done=true
+ end
+ end
+ end
+ end
+ end
+ if replace then
+ for n in nextchar,replace do
+ local p=rawget(properties,n)
+ if p then
+ local i=p.injections or p.replaceinjections
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ replace=insert_node_before(replace,n,fontkern(leftkern))
+ done=true
+ end
+ end
+ end
+ end
+ end
+ if done then
+ setdisc(current,pre,post,replace)
+ end
+ prevdisc=current
+ else
+ prevdisc=nil
+ end
+ prev=current
+ current=next
+ end
+ if keepregisteredcounts then
+ keepregisteredcounts=false
+ else
+ nofregisteredkerns=0
+ end
+ if trace_injections then
+ show_result(head)
+ end
+ return head
+end
+local function inject_positions_only(head,where)
+ if trace_injections then
+ trace(head,"positions")
+ end
+ local current=head
+ local prev=nil
+ local next=nil
+ local prevdisc=nil
+ local prevglyph=nil
+ local pre=nil
+ local post=nil
+ local replace=nil
+ local pretail=nil
+ local posttail=nil
+ local replacetail=nil
+ while current do
+ local next=getnext(current)
+ local char,id=ischar(current)
+ if char then
+ local p=rawget(properties,current)
+ if p then
+ local i=p.injections
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setoffsets(current,false,yoffset)
+ end
+ local leftkern=i.leftkern
+ local rightkern=i.rightkern
+ if leftkern and leftkern~=0 then
+ if rightkern and leftkern==-rightkern then
+ setoffsets(current,leftkern,false)
+ rightkern=0
+ elseif prev and getid(prev)==glue_code then
+ if useitalickerns then
+ head=insert_node_before(head,current,italickern(leftkern))
+ else
+ setwidth(prev,getwidth(prev)+leftkern)
+ end
+ else
+ head=insert_node_before(head,current,fontkern(leftkern))
+ end
+ end
+ if rightkern and rightkern~=0 then
+ if next and getid(next)==glue_code then
+ if useitalickerns then
+ insert_node_after(head,current,italickern(rightkern))
+ else
+ setwidth(next,getwidth(next)+rightkern)
+ end
+ else
+ insert_node_after(head,current,fontkern(rightkern))
+ end
+ end
+ else
+ local i=p.emptyinjections
+ if i then
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ if next and getid(next)==disc_code then
+ if replace then
+ else
+ replace=fontkern(rightkern)
+ done=true
+ end
+ end
+ end
+ end
+ end
+ if prevdisc then
+ local done=false
+ if post then
+ local i=p.postinjections
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ setlink(posttail,fontkern(leftkern))
+ done=true
+ end
+ end
+ end
+ if replace then
+ local i=p.replaceinjections
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ setlink(replacetail,fontkern(leftkern))
+ done=true
+ end
+ end
+ else
+ local i=p.emptyinjections
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ replace=fontkern(leftkern)
+ done=true
+ end
+ end
+ end
+ if done then
+ setdisc(prevdisc,pre,post,replace)
+ end
+ end
+ end
+ prevdisc=nil
+ prevglyph=current
+ elseif char==false then
+ prevdisc=nil
+ prevglyph=current
+ elseif id==disc_code then
+ pre,post,replace,pretail,posttail,replacetail=getdisc(current,true)
+ local done=false
+ if pre then
+ for n in nextchar,pre do
+ local p=rawget(properties,n)
+ if p then
+ local i=p.injections or p.preinjections
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setoffsets(n,false,yoffset)
+ end
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ pre=insert_node_before(pre,n,fontkern(leftkern))
+ done=true
+ end
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ insert_node_after(pre,n,fontkern(rightkern))
+ done=true
+ end
+ end
+ end
+ end
+ end
+ if post then
+ for n in nextchar,post do
+ local p=rawget(properties,n)
+ if p then
+ local i=p.injections or p.postinjections
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setoffsets(n,false,yoffset)
+ end
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ post=insert_node_before(post,n,fontkern(leftkern))
+ done=true
+ end
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ insert_node_after(post,n,fontkern(rightkern))
+ done=true
+ end
+ end
+ end
+ end
+ end
+ if replace then
+ for n in nextchar,replace do
+ local p=rawget(properties,n)
+ if p then
+ local i=p.injections or p.replaceinjections
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setoffsets(n,false,yoffset)
+ end
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ replace=insert_node_before(replace,n,fontkern(leftkern))
+ done=true
+ end
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ insert_node_after(replace,n,fontkern(rightkern))
+ done=true
+ end
+ end
+ end
+ end
+ end
+ if prevglyph then
+ if pre then
+ local p=rawget(properties,prevglyph)
+ if p then
+ local i=p.preinjections
+ if i then
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ pre=insert_node_before(pre,pre,fontkern(rightkern))
+ done=true
+ end
+ end
+ end
+ end
+ if replace then
+ local p=rawget(properties,prevglyph)
+ if p then
+ local i=p.replaceinjections
+ if i then
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ replace=insert_node_before(replace,replace,fontkern(rightkern))
+ done=true
+ end
+ end
+ end
+ end
+ end
+ if done then
+ setdisc(current,pre,post,replace)
+ end
+ prevglyph=nil
+ prevdisc=current
+ else
+ prevglyph=nil
+ prevdisc=nil
+ end
+ prev=current
+ current=next
+ end
+ if keepregisteredcounts then
+ keepregisteredcounts=false
+ else
+ nofregisteredpositions=0
+ end
+ if trace_injections then
+ show_result(head)
+ end
+ return head
+end
+local function showoffset(n,flag)
+ local x,y=getoffsets(n)
+ if x~=0 or y~=0 then
+ setcolor(n,"darkgray")
+ end
+end
+local function inject_everything(head,where)
+ if trace_injections then
+ trace(head,"everything")
+ end
+ local hascursives=nofregisteredcursives>0
+ local hasmarks=nofregisteredmarks>0
+ local current=head
+ local last=nil
+ local prev=nil
+ local next=nil
+ local prevdisc=nil
+ local prevglyph=nil
+ local pre=nil
+ local post=nil
+ local replace=nil
+ local pretail=nil
+ local posttail=nil
+ local replacetail=nil
+ local cursiveanchor=nil
+ local minc=0
+ local maxc=0
+ local glyphs={}
+ local marks={}
+ local nofmarks=0
+ local function processmark(p,n,pn)
+ local px,py=getoffsets(p)
+ local nx,ny=getoffsets(n)
+ local ox=0
+ local rightkern=nil
+ local pp=rawget(properties,p)
+ if pp then
+ pp=pp.injections
+ if pp then
+ rightkern=pp.rightkern
+ end
+ end
+ local markdir=pn.markdir
+ if rightkern then
+ ox=px-(pn.markx or 0)-rightkern
+ if markdir and markdir<0 then
+ if not pn.markmark then
+ ox=ox+(pn.leftkern or 0)
+ end
+ else
+ if false then
+ local leftkern=pp.leftkern
+ if leftkern then
+ ox=ox-leftkern
+ end
+ end
+ end
+ else
+ ox=px-(pn.markx or 0)
+ if markdir and markdir<0 then
+ if not pn.markmark then
+ local leftkern=pn.leftkern
+ if leftkern then
+ ox=ox+leftkern
+ end
+ end
+ end
+ if pn.checkmark then
+ local wn=getwidth(n)
+ if wn and wn~=0 then
+ wn=wn/2
+ if trace_injections then
+ report_injections("correcting non zero width mark %C",getchar(n))
+ end
+ insert_node_before(n,n,fontkern(-wn))
+ insert_node_after(n,n,fontkern(-wn))
+ end
+ end
+ end
+ local oy=ny+py+(pn.marky or 0)
+ if not pn.markmark then
+ local yoffset=pn.yoffset
+ if yoffset then
+ oy=oy+yoffset
+ end
+ end
+ setoffsets(n,ox,oy)
+ if trace_marks then
+ showoffset(n,true)
+ end
+ end
+ while current do
+ local next=getnext(current)
+ local char,id=ischar(current)
+ if char then
+ local p=rawget(properties,current)
+ if p then
+ local i=p.injections
+ if i then
+ local pm=i.markbasenode
+ if pm then
+ nofmarks=nofmarks+1
+ marks[nofmarks]=current
+ else
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setoffsets(current,false,yoffset)
+ end
+ if hascursives then
+ local cursivex=i.cursivex
+ if cursivex then
+ if cursiveanchor then
+ if cursivex~=0 then
+ i.leftkern=(i.leftkern or 0)+cursivex
+ end
+ if maxc==0 then
+ minc=1
+ maxc=1
+ glyphs[1]=cursiveanchor
+ else
+ maxc=maxc+1
+ glyphs[maxc]=cursiveanchor
+ end
+ properties[cursiveanchor].cursivedy=i.cursivey
+ last=current
+ else
+ maxc=0
+ end
+ elseif maxc>0 then
+ local nx,ny=getoffsets(current)
+ for i=maxc,minc,-1 do
+ local ti=glyphs[i]
+ ny=ny+properties[ti].cursivedy
+ setoffsets(ti,false,ny)
+ if trace_cursive then
+ showoffset(ti)
+ end
+ end
+ maxc=0
+ cursiveanchor=nil
+ end
+ if i.cursiveanchor then
+ cursiveanchor=current
+ else
+ if maxc>0 then
+ local nx,ny=getoffsets(current)
+ for i=maxc,minc,-1 do
+ local ti=glyphs[i]
+ ny=ny+properties[ti].cursivedy
+ setoffsets(ti,false,ny)
+ if trace_cursive then
+ showoffset(ti)
+ end
+ end
+ maxc=0
+ end
+ cursiveanchor=nil
+ end
+ end
+ local leftkern=i.leftkern
+ local rightkern=i.rightkern
+ if leftkern and leftkern~=0 then
+ if rightkern and leftkern==-rightkern then
+ setoffsets(current,leftkern,false)
+ rightkern=0
+ elseif prev and getid(prev)==glue_code then
+ if useitalickerns then
+ head=insert_node_before(head,current,italickern(leftkern))
+ else
+ setwidth(prev,getwidth(prev)+leftkern)
+ end
+ else
+ head=insert_node_before(head,current,fontkern(leftkern))
+ end
+ end
+ if rightkern and rightkern~=0 then
+ if next and getid(next)==glue_code then
+ if useitalickerns then
+ insert_node_after(head,current,italickern(rightkern))
+ else
+ setwidth(next,getwidth(next)+rightkern)
+ end
+ else
+ insert_node_after(head,current,fontkern(rightkern))
+ end
+ end
+ end
+ else
+ local i=p.emptyinjections
+ if i then
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ if next and getid(next)==disc_code then
+ if replace then
+ else
+ replace=fontkern(rightkern)
+ done=true
+ end
+ end
+ end
+ end
+ end
+ if prevdisc then
+ if p then
+ local done=false
+ if post then
+ local i=p.postinjections
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ setlink(posttail,fontkern(leftkern))
+ done=true
+ end
+ end
+ end
+ if replace then
+ local i=p.replaceinjections
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ setlink(replacetail,fontkern(leftkern))
+ done=true
+ end
+ end
+ else
+ local i=p.emptyinjections
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ replace=fontkern(leftkern)
+ done=true
+ end
+ end
+ end
+ if done then
+ setdisc(prevdisc,pre,post,replace)
+ end
+ end
+ end
+ else
+ if hascursives and maxc>0 then
+ local nx,ny=getoffsets(current)
+ for i=maxc,minc,-1 do
+ local ti=glyphs[i]
+ ny=ny+properties[ti].cursivedy
+ local xi,yi=getoffsets(ti)
+ setoffsets(ti,xi,yi+ny)
+ end
+ maxc=0
+ cursiveanchor=nil
+ end
+ end
+ prevdisc=nil
+ prevglyph=current
+ elseif char==false then
+ prevdisc=nil
+ prevglyph=current
+ elseif id==disc_code then
+ pre,post,replace,pretail,posttail,replacetail=getdisc(current,true)
+ local done=false
+ if pre then
+ for n in nextchar,pre do
+ local p=rawget(properties,n)
+ if p then
+ local i=p.injections or p.preinjections
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setoffsets(n,false,yoffset)
+ end
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ pre=insert_node_before(pre,n,fontkern(leftkern))
+ done=true
+ end
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ insert_node_after(pre,n,fontkern(rightkern))
+ done=true
+ end
+ if hasmarks then
+ local pm=i.markbasenode
+ if pm then
+ processmark(pm,n,i)
+ end
+ end
+ end
+ end
+ end
+ end
+ if post then
+ for n in nextchar,post do
+ local p=rawget(properties,n)
+ if p then
+ local i=p.injections or p.postinjections
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setoffsets(n,false,yoffset)
+ end
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ post=insert_node_before(post,n,fontkern(leftkern))
+ done=true
+ end
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ insert_node_after(post,n,fontkern(rightkern))
+ done=true
+ end
+ if hasmarks then
+ local pm=i.markbasenode
+ if pm then
+ processmark(pm,n,i)
+ end
+ end
+ end
+ end
+ end
+ end
+ if replace then
+ for n in nextchar,replace do
+ local p=rawget(properties,n)
+ if p then
+ local i=p.injections or p.replaceinjections
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setoffsets(n,false,yoffset)
+ end
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ replace=insert_node_before(replace,n,fontkern(leftkern))
+ done=true
+ end
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ insert_node_after(replace,n,fontkern(rightkern))
+ done=true
+ end
+ if hasmarks then
+ local pm=i.markbasenode
+ if pm then
+ processmark(pm,n,i)
+ end
+ end
+ end
+ end
+ end
+ end
+ if prevglyph then
+ if pre then
+ local p=rawget(properties,prevglyph)
+ if p then
+ local i=p.preinjections
+ if i then
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ pre=insert_node_before(pre,pre,fontkern(rightkern))
+ done=true
+ end
+ end
+ end
+ end
+ if replace then
+ local p=rawget(properties,prevglyph)
+ if p then
+ local i=p.replaceinjections
+ if i then
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ replace=insert_node_before(replace,replace,fontkern(rightkern))
+ done=true
+ end
+ end
+ end
+ end
+ end
+ if done then
+ setdisc(current,pre,post,replace)
+ end
+ prevglyph=nil
+ prevdisc=current
+ else
+ prevglyph=nil
+ prevdisc=nil
+ end
+ prev=current
+ current=next
+ end
+ if hascursives and maxc>0 then
+ local nx,ny=getoffsets(last)
+ for i=maxc,minc,-1 do
+ local ti=glyphs[i]
+ ny=ny+properties[ti].cursivedy
+ setoffsets(ti,false,ny)
+ if trace_cursive then
+ showoffset(ti)
+ end
+ end
+ end
+ if nofmarks>0 then
+ for i=1,nofmarks do
+ local m=marks[i]
+ local p=rawget(properties,m)
+ local i=p.injections
+ local b=i.markbasenode
+ processmark(b,m,i)
+ end
+ elseif hasmarks then
+ end
+ if keepregisteredcounts then
+ keepregisteredcounts=false
+ else
+ nofregisteredkerns=0
+ nofregisteredpositions=0
+ nofregisteredmarks=0
+ nofregisteredcursives=0
+ end
+ if trace_injections then
+ show_result(head)
+ end
+ return head
+end
+local triggers=false
+function nodes.injections.setspacekerns(font,sequence)
+ if triggers then
+ triggers[font]=sequence
+ else
+ triggers={ [font]=sequence }
+ end
+end
+local getthreshold
+if context then
+ local threshold=1
+ local parameters=fonts.hashes.parameters
+ directives.register("otf.threshold",function(v) threshold=tonumber(v) or 1 end)
+ getthreshold=function(font)
+ local p=parameters[font]
+ local f=p.factor
+ local s=p.spacing
+ local t=threshold*(s and s.width or p.space or 0)-2
+ return t>0 and t or 0,f
+ end
+else
+ injections.threshold=0
+ getthreshold=function(font)
+ local p=fontdata[font].parameters
+ local f=p.factor
+ local s=p.spacing
+ local t=injections.threshold*(s and s.width or p.space or 0)-2
+ return t>0 and t or 0,f
+ end
+end
+injections.getthreshold=getthreshold
+function injections.isspace(n,threshold,id)
+ if (id or getid(n))==glue_code then
+ local w=getwidth(n)
+ if threshold and w>threshold then
+ return 32
+ end
+ end
+end
+local getspaceboth=getboth
+function injections.installgetspaceboth(gb)
+ getspaceboth=gb or getboth
+end
+local function injectspaces(head)
+ if not triggers then
+ return head
+ end
+ local lastfont=nil
+ local spacekerns=nil
+ local leftkerns=nil
+ local rightkerns=nil
+ local factor=0
+ local threshold=0
+ local leftkern=false
+ local rightkern=false
+ local function updatefont(font,trig)
+ leftkerns=trig.left
+ rightkerns=trig.right
+ lastfont=font
+ threshold,
+ factor=getthreshold(font)
+ end
+ for n in nextglue,head do
+ local prev,next=getspaceboth(n)
+ local prevchar=prev and ischar(prev)
+ local nextchar=next and ischar(next)
+ if nextchar then
+ local font=getfont(next)
+ local trig=triggers[font]
+ if trig then
+ if lastfont~=font then
+ updatefont(font,trig)
+ end
+ if rightkerns then
+ rightkern=rightkerns[nextchar]
+ end
+ end
+ end
+ if prevchar then
+ local font=getfont(prev)
+ local trig=triggers[font]
+ if trig then
+ if lastfont~=font then
+ updatefont(font,trig)
+ end
+ if leftkerns then
+ leftkern=leftkerns[prevchar]
+ end
+ end
+ end
+ if leftkern then
+ local old=getwidth(n)
+ if old>threshold then
+ if rightkern then
+ if useitalickerns then
+ local lnew=leftkern*factor
+ local rnew=rightkern*factor
+ if trace_spaces then
+ report_spaces("%C [%p + %p + %p] %C",prevchar,lnew,old,rnew,nextchar)
+ end
+ head=insert_node_before(head,n,italickern(lnew))
+ insert_node_after(head,n,italickern(rnew))
+ else
+ local new=old+(leftkern+rightkern)*factor
+ if trace_spaces then
+ report_spaces("%C [%p -> %p] %C",prevchar,old,new,nextchar)
+ end
+ setwidth(n,new)
+ end
+ rightkern=false
+ else
+ if useitalickerns then
+ local new=leftkern*factor
+ if trace_spaces then
+ report_spaces("%C [%p + %p]",prevchar,old,new)
+ end
+ insert_node_after(head,n,italickern(new))
+ else
+ local new=old+leftkern*factor
+ if trace_spaces then
+ report_spaces("%C [%p -> %p]",prevchar,old,new)
+ end
+ setwidth(n,new)
+ end
+ end
+ end
+ leftkern=false
+ elseif rightkern then
+ local old=getwidth(n)
+ if old>threshold then
+ if useitalickerns then
+ local new=rightkern*factor
+ if trace_spaces then
+ report_spaces("[%p + %p] %C",old,new,nextchar)
+ end
+ insert_node_after(head,n,italickern(new))
+ else
+ local new=old+rightkern*factor
+ if trace_spaces then
+ report_spaces("[%p -> %p] %C",old,new,nextchar)
+ end
+ setwidth(n,new)
+ end
+ else
+ end
+ rightkern=false
+ end
+ end
+ triggers=false
+ return head
+end
+function injections.handler(head,where)
+ if triggers then
+ head=injectspaces(head)
+ end
+ if nofregisteredmarks>0 or nofregisteredcursives>0 then
+ if trace_injections then
+ report_injections("injection variant %a","everything")
+ end
+ return inject_everything(head,where)
+ elseif nofregisteredpositions>0 then
+ if trace_injections then
+ report_injections("injection variant %a","positions")
+ end
+ return inject_positions_only(head,where)
+ elseif nofregisteredkerns>0 then
+ if trace_injections then
+ report_injections("injection variant %a","kerns")
+ end
+ return inject_kerns_only(head,where)
+ else
+ return head
+ end
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-otj”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-ota” dd5f1c8ba28abaf4505fd960d04a3a98] ---
+
+if not modules then modules={} end modules ['font-ota']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local type=type
+if not trackers then trackers={ register=function() end } end
+local fonts,nodes,node=fonts,nodes,node
+local allocate=utilities.storage.allocate
+local otf=fonts.handlers.otf
+local analyzers=fonts.analyzers
+local initializers=allocate()
+local methods=allocate()
+analyzers.initializers=initializers
+analyzers.methods=methods
+local nuts=nodes.nuts
+local tonut=nuts.tonut
+local getnext=nuts.getnext
+local getprev=nuts.getprev
+local getprev=nuts.getprev
+local getprop=nuts.getprop
+local setprop=nuts.setprop
+local getsubtype=nuts.getsubtype
+local getchar=nuts.getchar
+local ischar=nuts.ischar
+local end_of_math=nuts.end_of_math
+local nodecodes=nodes.nodecodes
+local disc_code=nodecodes.disc
+local math_code=nodecodes.math
+local fontdata=fonts.hashes.identifiers
+local categories=characters and characters.categories or {}
+local chardata=characters and characters.data
+local otffeatures=fonts.constructors.features.otf
+local registerotffeature=otffeatures.register
+local setstate=nuts.setstate
+local getstate=nuts.getstate
+if not setstate or not getstate then
+ setstate=function(n,v)
+ setprop(n,"state",v)
+ end
+ getstate=function(n,v)
+ local s=getprop(n,"state")
+ if v then
+ return s==v
+ else
+ return s
+ end
+ end
+ nuts.setstate=setstate
+ nuts.getstate=getstate
+end
+local s_init=1 local s_rphf=7
+local s_medi=2 local s_half=8
+local s_fina=3 local s_pref=9
+local s_isol=4 local s_blwf=10
+local s_mark=5 local s_pstf=11
+local s_rest=6
+local states=allocate {
+ init=s_init,
+ medi=s_medi,
+ med2=s_medi,
+ fina=s_fina,
+ fin2=s_fina,
+ fin3=s_fina,
+ isol=s_isol,
+ mark=s_mark,
+ rest=s_rest,
+ rphf=s_rphf,
+ half=s_half,
+ pref=s_pref,
+ blwf=s_blwf,
+ pstf=s_pstf,
+}
+local features=allocate {
+ init=s_init,
+ medi=s_medi,
+ med2=s_medi,
+ fina=s_fina,
+ fin2=s_fina,
+ fin3=s_fina,
+ isol=s_isol,
+ rphf=s_rphf,
+ half=s_half,
+ pref=s_pref,
+ blwf=s_blwf,
+ pstf=s_pstf,
+}
+analyzers.states=states
+analyzers.features=features
+analyzers.useunicodemarks=false
+function analyzers.setstate(head,font)
+ local useunicodemarks=analyzers.useunicodemarks
+ local tfmdata=fontdata[font]
+ local descriptions=tfmdata.descriptions
+ local first,last,current,n,done=nil,nil,head,0,false
+ current=tonut(current)
+ while current do
+ local char,id=ischar(current,font)
+ if char and not getstate(current) then
+ done=true
+ local d=descriptions[char]
+ if d then
+ if d.class=="mark" then
+ done=true
+ setstate(current,s_mark)
+ elseif useunicodemarks and categories[char]=="mn" then
+ done=true
+ setstate(current,s_mark)
+ elseif n==0 then
+ first,last,n=current,current,1
+ setstate(current,s_init)
+ else
+ last,n=current,n+1
+ setstate(current,s_medi)
+ end
+ else
+ if first and first==last then
+ setstate(last,s_isol)
+ elseif last then
+ setstate(last,s_fina)
+ end
+ first,last,n=nil,nil,0
+ end
+ elseif char==false then
+ if first and first==last then
+ setstate(last,s_isol)
+ elseif last then
+ setstate(last,s_fina)
+ end
+ first,last,n=nil,nil,0
+ if id==math_code then
+ current=end_of_math(current)
+ end
+ elseif id==disc_code then
+ setstate(current,s_medi)
+ last=current
+ else
+ if first and first==last then
+ setstate(last,s_isol)
+ elseif last then
+ setstate(last,s_fina)
+ end
+ first,last,n=nil,nil,0
+ if id==math_code then
+ current=end_of_math(current)
+ end
+ end
+ current=getnext(current)
+ end
+ if first and first==last then
+ setstate(last,s_isol)
+ elseif last then
+ setstate(last,s_fina)
+ end
+ return head,done
+end
+local function analyzeinitializer(tfmdata,value)
+ local script,language=otf.scriptandlanguage(tfmdata)
+ local action=initializers[script]
+ if not action then
+ elseif type(action)=="function" then
+ return action(tfmdata,value)
+ else
+ local action=action[language]
+ if action then
+ return action(tfmdata,value)
+ end
+ end
+end
+local function analyzeprocessor(head,font,attr)
+ local tfmdata=fontdata[font]
+ local script,language=otf.scriptandlanguage(tfmdata,attr)
+ local action=methods[script]
+ if not action then
+ elseif type(action)=="function" then
+ return action(head,font,attr)
+ else
+ action=action[language]
+ if action then
+ return action(head,font,attr)
+ end
+ end
+ return head,false
+end
+registerotffeature {
+ name="analyze",
+ description="analysis of character classes",
+ default=true,
+ initializers={
+ node=analyzeinitializer,
+ },
+ processors={
+ position=1,
+ node=analyzeprocessor,
+ }
+}
+methods.latn=analyzers.setstate
+local arab_warned={}
+local function warning(current,what)
+ local char=getchar(current)
+ if not arab_warned[char] then
+ log.report("analyze","arab: character %C has no %a class",char,what)
+ arab_warned[char]=true
+ end
+end
+local mappers=allocate {
+ l=s_init,
+ d=s_medi,
+ c=s_medi,
+ r=s_fina,
+ u=s_isol,
+}
+local classifiers=characters.classifiers
+if not classifiers then
+ local f_arabic,l_arabic=characters.blockrange("arabic")
+ local f_syriac,l_syriac=characters.blockrange("syriac")
+ local f_mandiac,l_mandiac=characters.blockrange("mandiac")
+ local f_nko,l_nko=characters.blockrange("nko")
+ local f_ext_a,l_ext_a=characters.blockrange("arabicextendeda")
+ classifiers=table.setmetatableindex(function(t,k)
+ if type(k)=="number" then
+ local c=chardata[k]
+ local v=false
+ if c then
+ local arabic=c.arabic
+ if arabic then
+ v=mappers[arabic]
+ if not v then
+ log.report("analyze","error in mapping arabic %C",k)
+ v=false
+ end
+ elseif (k>=f_arabic and k<=l_arabic) or
+ (k>=f_syriac and k<=l_syriac) or
+ (k>=f_mandiac and k<=l_mandiac) or
+ (k>=f_nko and k<=l_nko) or
+ (k>=f_ext_a and k<=l_ext_a) then
+ if categories[k]=="mn" then
+ v=s_mark
+ else
+ v=s_rest
+ end
+ end
+ end
+ t[k]=v
+ return v
+ end
+ end)
+ characters.classifiers=classifiers
+end
+function methods.arab(head,font,attr)
+ local first,last,c_first,c_last
+ local current=head
+ local done=false
+ current=tonut(current)
+ while current do
+ local char,id=ischar(current,font)
+ if char and not getstate(current) then
+ done=true
+ local classifier=classifiers[char]
+ if not classifier then
+ if last then
+ if c_last==s_medi or c_last==s_fina then
+ setstate(last,s_fina)
+ else
+ warning(last,"fina")
+ setstate(last,s_error)
+ end
+ first,last=nil,nil
+ elseif first then
+ if c_first==s_medi or c_first==s_fina then
+ setstate(first,s_isol)
+ else
+ warning(first,"isol")
+ setstate(first,s_error)
+ end
+ first=nil
+ end
+ elseif classifier==s_mark then
+ setstate(current,s_mark)
+ elseif classifier==s_isol then
+ if last then
+ if c_last==s_medi or c_last==s_fina then
+ setstate(last,s_fina)
+ else
+ warning(last,"fina")
+ setstate(last,s_error)
+ end
+ first,last=nil,nil
+ elseif first then
+ if c_first==s_medi or c_first==s_fina then
+ setstate(first,s_isol)
+ else
+ warning(first,"isol")
+ setstate(first,s_error)
+ end
+ first=nil
+ end
+ setstate(current,s_isol)
+ elseif classifier==s_medi then
+ if first then
+ last=current
+ c_last=classifier
+ setstate(current,s_medi)
+ else
+ setstate(current,s_init)
+ first=current
+ c_first=classifier
+ end
+ elseif classifier==s_fina then
+ if last then
+ if getstate(last)~=s_init then
+ setstate(last,s_medi)
+ end
+ setstate(current,s_fina)
+ first,last=nil,nil
+ elseif first then
+ setstate(current,s_fina)
+ first=nil
+ else
+ setstate(current,s_isol)
+ end
+ else
+ setstate(current,s_rest)
+ if last then
+ if c_last==s_medi or c_last==s_fina then
+ setstate(last,s_fina)
+ else
+ warning(last,"fina")
+ setstate(last,s_error)
+ end
+ first,last=nil,nil
+ elseif first then
+ if c_first==s_medi or c_first==s_fina then
+ setstate(first,s_isol)
+ else
+ warning(first,"isol")
+ setstate(first,s_error)
+ end
+ first=nil
+ end
+ end
+ else
+ if last then
+ if c_last==s_medi or c_last==s_fina then
+ setstate(last,s_fina)
+ else
+ warning(last,"fina")
+ setstate(last,s_error)
+ end
+ first,last=nil,nil
+ elseif first then
+ if c_first==s_medi or c_first==s_fina then
+ setstate(first,s_isol)
+ else
+ warning(first,"isol")
+ setstate(first,s_error)
+ end
+ first=nil
+ end
+ if id==math_code then
+ current=end_of_math(current)
+ end
+ end
+ current=getnext(current)
+ end
+ if last then
+ if c_last==s_medi or c_last==s_fina then
+ setstate(last,s_fina)
+ else
+ warning(last,"fina")
+ setstate(last,s_error)
+ end
+ elseif first then
+ if c_first==s_medi or c_first==s_fina then
+ setstate(first,s_isol)
+ else
+ warning(first,"isol")
+ setstate(first,s_error)
+ end
+ end
+ return head,done
+end
+methods.syrc=methods.arab
+methods.mand=methods.arab
+methods.nko=methods.arab
+directives.register("otf.analyze.useunicodemarks",function(v)
+ analyzers.useunicodemarks=v
+end)
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-ota”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-ots” 113b7ad0c40d4786bb026706e479c3f3] ---
+
+if not modules then modules={} end modules ['font-ots']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files",
+}
+local type,next,tonumber=type,next,tonumber
+local random=math.random
+local formatters=string.formatters
+local insert=table.insert
+local registertracker=trackers.register
+local logs=logs
+local trackers=trackers
+local nodes=nodes
+local attributes=attributes
+local fonts=fonts
+local otf=fonts.handlers.otf
+local tracers=nodes.tracers
+local trace_singles=false registertracker("otf.singles",function(v) trace_singles=v end)
+local trace_multiples=false registertracker("otf.multiples",function(v) trace_multiples=v end)
+local trace_alternatives=false registertracker("otf.alternatives",function(v) trace_alternatives=v end)
+local trace_ligatures=false registertracker("otf.ligatures",function(v) trace_ligatures=v end)
+local trace_contexts=false registertracker("otf.contexts",function(v) trace_contexts=v end)
+local trace_marks=false registertracker("otf.marks",function(v) trace_marks=v end)
+local trace_kerns=false registertracker("otf.kerns",function(v) trace_kerns=v end)
+local trace_cursive=false registertracker("otf.cursive",function(v) trace_cursive=v end)
+local trace_preparing=false registertracker("otf.preparing",function(v) trace_preparing=v end)
+local trace_bugs=false registertracker("otf.bugs",function(v) trace_bugs=v end)
+local trace_details=false registertracker("otf.details",function(v) trace_details=v end)
+local trace_steps=false registertracker("otf.steps",function(v) trace_steps=v end)
+local trace_skips=false registertracker("otf.skips",function(v) trace_skips=v end)
+local trace_plugins=false registertracker("otf.plugins",function(v) trace_plugins=v end)
+local trace_chains=false registertracker("otf.chains",function(v) trace_chains=v end)
+local trace_kernruns=false registertracker("otf.kernruns",function(v) trace_kernruns=v end)
+local trace_compruns=false registertracker("otf.compruns",function(v) trace_compruns=v end)
+local trace_testruns=false registertracker("otf.testruns",function(v) trace_testruns=v end)
+local forcediscretionaries=false
+local forcepairadvance=false
+directives.register("otf.forcediscretionaries",function(v)
+ forcediscretionaries=v
+end)
+directives.register("otf.forcepairadvance",function(v)
+ forcepairadvance=v
+end)
+local report_direct=logs.reporter("fonts","otf direct")
+local report_subchain=logs.reporter("fonts","otf subchain")
+local report_chain=logs.reporter("fonts","otf chain")
+local report_process=logs.reporter("fonts","otf process")
+local report_warning=logs.reporter("fonts","otf warning")
+local report_run=logs.reporter("fonts","otf run")
+registertracker("otf.substitutions","otf.singles","otf.multiples","otf.alternatives","otf.ligatures")
+registertracker("otf.positions","otf.marks","otf.kerns","otf.cursive")
+registertracker("otf.actions","otf.substitutions","otf.positions")
+registertracker("otf.sample","otf.steps","otf.substitutions","otf.positions","otf.analyzing")
+registertracker("otf.sample.silent","otf.steps=silent","otf.substitutions","otf.positions","otf.analyzing")
+local nuts=nodes.nuts
+local getnext=nuts.getnext
+local setnext=nuts.setnext
+local getprev=nuts.getprev
+local setprev=nuts.setprev
+local getboth=nuts.getboth
+local setboth=nuts.setboth
+local getid=nuts.getid
+local getstate=nuts.getstate
+local getsubtype=nuts.getsubtype
+local setsubtype=nuts.setsubtype
+local getchar=nuts.getchar
+local setchar=nuts.setchar
+local getdisc=nuts.getdisc
+local setdisc=nuts.setdisc
+local getreplace=nuts.getreplace
+local setlink=nuts.setlink
+local getwidth=nuts.getwidth
+local getattr=nuts.getattr
+local getglyphdata=nuts.getglyphdata
+local copy_no_components=nuts.copy_no_components
+local copy_only_glyphs=nuts.copy_only_glyphs
+local count_components=nuts.count_components
+local set_components=nuts.set_components
+local get_components=nuts.get_components
+local ischar=nuts.ischar
+local usesfont=nuts.uses_font
+local insert_node_after=nuts.insert_after
+local copy_node=nuts.copy
+local copy_node_list=nuts.copy_list
+local remove_node=nuts.remove
+local find_node_tail=nuts.tail
+local flush_node_list=nuts.flush_list
+local flush_node=nuts.flush_node
+local end_of_math=nuts.end_of_math
+local start_of_par=nuts.start_of_par
+local setmetatable=setmetatable
+local setmetatableindex=table.setmetatableindex
+local nextnode=nuts.traversers.node
+local nodecodes=nodes.nodecodes
+local glyphcodes=nodes.glyphcodes
+local disccodes=nodes.disccodes
+local glyph_code=nodecodes.glyph
+local glue_code=nodecodes.glue
+local disc_code=nodecodes.disc
+local math_code=nodecodes.math
+local dir_code=nodecodes.dir
+local localpar_code=nodecodes.localpar
+local discretionarydisc_code=disccodes.discretionary
+local ligatureglyph_code=glyphcodes.ligature
+local a_noligature=attributes.private("noligature")
+local injections=nodes.injections
+local setmark=injections.setmark
+local setcursive=injections.setcursive
+local setkern=injections.setkern
+local setmove=injections.setmove
+local setposition=injections.setposition
+local resetinjection=injections.reset
+local copyinjection=injections.copy
+local setligaindex=injections.setligaindex
+local getligaindex=injections.getligaindex
+local fontdata=fonts.hashes.identifiers
+local fontfeatures=fonts.hashes.features
+local otffeatures=fonts.constructors.features.otf
+local registerotffeature=otffeatures.register
+local onetimemessage=fonts.loggers.onetimemessage or function() end
+local getrandom=utilities and utilities.randomizer and utilities.randomizer.get
+otf.defaultnodealternate="none"
+local tfmdata=false
+local characters=false
+local descriptions=false
+local marks=false
+local classes=false
+local currentfont=false
+local factor=0
+local threshold=0
+local checkmarks=false
+local discs=false
+local spaces=false
+local sweepnode=nil
+local sweephead={}
+local notmatchpre={}
+local notmatchpost={}
+local notmatchreplace={}
+local handlers={}
+local isspace=injections.isspace
+local getthreshold=injections.getthreshold
+local checkstep=(tracers and tracers.steppers.check) or function() end
+local registerstep=(tracers and tracers.steppers.register) or function() end
+local registermessage=(tracers and tracers.steppers.message) or function() end
+local function logprocess(...)
+ if trace_steps then
+ registermessage(...)
+ if trace_steps=="silent" then
+ return
+ end
+ end
+ report_direct(...)
+end
+local function logwarning(...)
+ report_direct(...)
+end
+local gref do
+ local f_unicode=formatters["U+%X"]
+ local f_uniname=formatters["U+%X (%s)"]
+ local f_unilist=formatters["% t"]
+ gref=function(n)
+ if type(n)=="number" then
+ local description=descriptions[n]
+ local name=description and description.name
+ if name then
+ return f_uniname(n,name)
+ else
+ return f_unicode(n)
+ end
+ elseif n then
+ local t={}
+ for i=1,#n do
+ local ni=n[i]
+ if tonumber(ni) then
+ local di=descriptions[ni]
+ local nn=di and di.name
+ if nn then
+ t[#t+1]=f_uniname(ni,nn)
+ else
+ t[#t+1]=f_unicode(ni)
+ end
+ end
+ end
+ return f_unilist(t)
+ else
+ return ""
+ end
+ end
+end
+local function cref(dataset,sequence,index)
+ if not dataset then
+ return "no valid dataset"
+ end
+ local merged=sequence.merged and "merged " or ""
+ if index then
+ return formatters["feature %a, type %a, %schain lookup %a, index %a"](
+ dataset[4],sequence.type,merged,sequence.name,index)
+ else
+ return formatters["feature %a, type %a, %schain lookup %a"](
+ dataset[4],sequence.type,merged,sequence.name)
+ end
+end
+local function pref(dataset,sequence)
+ return formatters["feature %a, type %a, %slookup %a"](
+ dataset[4],sequence.type,sequence.merged and "merged " or "",sequence.name)
+end
+local function mref(rlmode)
+ if not rlmode or rlmode>=0 then
+ return "l2r"
+ else
+ return "r2l"
+ end
+end
+local function flattendisk(head,disc)
+ local pre,post,replace,pretail,posttail,replacetail=getdisc(disc,true)
+ local prev,next=getboth(disc)
+ local ishead=head==disc
+ setdisc(disc)
+ flush_node(disc)
+ if pre then
+ flush_node_list(pre)
+ end
+ if post then
+ flush_node_list(post)
+ end
+ if ishead then
+ if replace then
+ if next then
+ setlink(replacetail,next)
+ end
+ return replace,replace
+ elseif next then
+ return next,next
+ else
+ end
+ else
+ if replace then
+ if next then
+ setlink(replacetail,next)
+ end
+ setlink(prev,replace)
+ return head,replace
+ else
+ setlink(prev,next)
+ return head,next
+ end
+ end
+end
+local function appenddisc(disc,list)
+ local pre,post,replace,pretail,posttail,replacetail=getdisc(disc,true)
+ local posthead=list
+ local replacehead=copy_node_list(list)
+ if post then
+ setlink(posttail,posthead)
+ else
+ post=posthead
+ end
+ if replace then
+ setlink(replacetail,replacehead)
+ else
+ replace=replacehead
+ end
+ setdisc(disc,pre,post,replace)
+end
+local function markstoligature(head,start,stop,char)
+ if start==stop and getchar(start)==char then
+ return head,start
+ else
+ local prev=getprev(start)
+ local next=getnext(stop)
+ setprev(start)
+ setnext(stop)
+ local base=copy_no_components(start,copyinjection)
+ if head==start then
+ head=base
+ end
+ resetinjection(base)
+ setchar(base,char)
+ setsubtype(base,ligatureglyph_code)
+ set_components(base,start)
+ setlink(prev,base,next)
+ return head,base
+ end
+end
+local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfound,hasmarks)
+ if getattr(start,a_noligature)==1 then
+ return head,start
+ end
+ if start==stop and getchar(start)==char then
+ resetinjection(start)
+ setchar(start,char)
+ return head,start
+ end
+ local prev=getprev(start)
+ local next=getnext(stop)
+ local comp=start
+ setprev(start)
+ setnext(stop)
+ local base=copy_no_components(start,copyinjection)
+ if start==head then
+ head=base
+ end
+ resetinjection(base)
+ setchar(base,char)
+ setsubtype(base,ligatureglyph_code)
+ set_components(base,comp)
+ setlink(prev,base,next)
+ if not discfound then
+ local deletemarks=not skiphash or hasmarks
+ local components=start
+ local baseindex=0
+ local componentindex=0
+ local head=base
+ local current=base
+ while start do
+ local char=getchar(start)
+ if not marks[char] then
+ baseindex=baseindex+componentindex
+ componentindex=count_components(start,marks)
+ elseif not deletemarks then
+ setligaindex(start,baseindex+getligaindex(start,componentindex))
+ if trace_marks then
+ logwarning("%s: keep ligature mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start))
+ end
+ local n=copy_node(start)
+ copyinjection(n,start)
+ head,current=insert_node_after(head,current,n)
+ elseif trace_marks then
+ logwarning("%s: delete ligature mark %s",pref(dataset,sequence),gref(char))
+ end
+ start=getnext(start)
+ end
+ local start=getnext(current)
+ while start do
+ local char=ischar(start)
+ if char then
+ if marks[char] then
+ setligaindex(start,baseindex+getligaindex(start,componentindex))
+ if trace_marks then
+ logwarning("%s: set ligature mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start))
+ end
+ start=getnext(start)
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+ else
+ local discprev,discnext=getboth(discfound)
+ if discprev and discnext then
+ local pre,post,replace,pretail,posttail,replacetail=getdisc(discfound,true)
+ if not replace then
+ local prev=getprev(base)
+ local copied=copy_only_glyphs(comp)
+ if pre then
+ setlink(discprev,pre)
+ else
+ setnext(discprev)
+ end
+ pre=comp
+ if post then
+ setlink(posttail,discnext)
+ setprev(post)
+ else
+ post=discnext
+ setprev(discnext)
+ end
+ setlink(prev,discfound,next)
+ setboth(base)
+ set_components(base,copied)
+ replace=base
+ if forcediscretionaries then
+ setdisc(discfound,pre,post,replace,discretionarydisc_code)
+ else
+ setdisc(discfound,pre,post,replace)
+ end
+ base=prev
+ end
+ end
+ end
+ return head,base
+end
+local function multiple_glyphs(head,start,multiple,skiphash,what,stop)
+ local nofmultiples=#multiple
+ if nofmultiples>0 then
+ resetinjection(start)
+ setchar(start,multiple[1])
+ if nofmultiples>1 then
+ local sn=getnext(start)
+ for k=2,nofmultiples do
+ local n=copy_node(start)
+ resetinjection(n)
+ setchar(n,multiple[k])
+ insert_node_after(head,start,n)
+ start=n
+ end
+ if what==true then
+ elseif what>1 then
+ local m=multiple[nofmultiples]
+ for i=2,what do
+ local n=copy_node(start)
+ resetinjection(n)
+ setchar(n,m)
+ insert_node_after(head,start,n)
+ start=n
+ end
+ end
+ end
+ return head,start,true
+ else
+ if trace_multiples then
+ logprocess("no multiple for %s",gref(getchar(start)))
+ end
+ return head,start,false
+ end
+end
+local function get_alternative_glyph(start,alternatives,value)
+ local n=#alternatives
+ if n==1 then
+ return alternatives[1],trace_alternatives and "1 (only one present)"
+ elseif value=="random" then
+ local r=getrandom and getrandom("glyph",1,n) or random(1,n)
+ return alternatives[r],trace_alternatives and formatters["value %a, taking %a"](value,r)
+ elseif value=="first" then
+ return alternatives[1],trace_alternatives and formatters["value %a, taking %a"](value,1)
+ elseif value=="last" then
+ return alternatives[n],trace_alternatives and formatters["value %a, taking %a"](value,n)
+ end
+ value=value==true and 1 or tonumber(value)
+ if type(value)~="number" then
+ return alternatives[1],trace_alternatives and formatters["invalid value %s, taking %a"](value,1)
+ end
+ if value>n then
+ local defaultalt=otf.defaultnodealternate
+ if defaultalt=="first" then
+ return alternatives[n],trace_alternatives and formatters["invalid value %s, taking %a"](value,1)
+ elseif defaultalt=="last" then
+ return alternatives[1],trace_alternatives and formatters["invalid value %s, taking %a"](value,n)
+ else
+ return false,trace_alternatives and formatters["invalid value %a, %s"](value,"out of range")
+ end
+ elseif value==0 then
+ return getchar(start),trace_alternatives and formatters["invalid value %a, %s"](value,"no change")
+ elseif value<1 then
+ return alternatives[1],trace_alternatives and formatters["invalid value %a, taking %a"](value,1)
+ else
+ return alternatives[value],trace_alternatives and formatters["value %a, taking %a"](value,value)
+ end
+end
+function handlers.gsub_single(head,start,dataset,sequence,replacement)
+ if trace_singles then
+ logprocess("%s: replacing %s by single %s",pref(dataset,sequence),gref(getchar(start)),gref(replacement))
+ end
+ resetinjection(start)
+ setchar(start,replacement)
+ return head,start,true
+end
+function handlers.gsub_alternate(head,start,dataset,sequence,alternative)
+ local kind=dataset[4]
+ local what=dataset[1]
+ local value=what==true and tfmdata.shared.features[kind] or what
+ local choice,comment=get_alternative_glyph(start,alternative,value)
+ if choice then
+ if trace_alternatives then
+ logprocess("%s: replacing %s by alternative %a to %s, %s",pref(dataset,sequence),gref(getchar(start)),gref(choice),comment)
+ end
+ resetinjection(start)
+ setchar(start,choice)
+ else
+ if trace_alternatives then
+ logwarning("%s: no variant %a for %s, %s",pref(dataset,sequence),value,gref(getchar(start)),comment)
+ end
+ end
+ return head,start,true
+end
+function handlers.gsub_multiple(head,start,dataset,sequence,multiple,rlmode,skiphash)
+ if trace_multiples then
+ logprocess("%s: replacing %s by multiple %s",pref(dataset,sequence),gref(getchar(start)),gref(multiple))
+ end
+ return multiple_glyphs(head,start,multiple,skiphash,dataset[1])
+end
+function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skiphash)
+ local current=getnext(start)
+ if not current then
+ return head,start,false,nil
+ end
+ local stop=nil
+ local startchar=getchar(start)
+ if skiphash and skiphash[startchar] then
+ while current do
+ local char=ischar(current,currentfont)
+ if char then
+ local lg=ligature[char]
+ if lg then
+ stop=current
+ ligature=lg
+ current=getnext(current)
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+ if stop then
+ local lig=ligature.ligature
+ if lig then
+ if trace_ligatures then
+ local stopchar=getchar(stop)
+ head,start=markstoligature(head,start,stop,lig)
+ logprocess("%s: replacing %s upto %s by ligature %s case 1",pref(dataset,sequence),gref(startchar),gref(stopchar),gref(getchar(start)))
+ else
+ head,start=markstoligature(head,start,stop,lig)
+ end
+ return head,start,true,false
+ else
+ end
+ end
+ else
+ local discfound=false
+ local hasmarks=marks[startchar]
+ while current do
+ local char,id=ischar(current,currentfont)
+ if char then
+ if skiphash and skiphash[char] then
+ current=getnext(current)
+ else
+ local lg=ligature[char]
+ if lg then
+ if marks[char] then
+ hasmarks=true
+ end
+ stop=current
+ ligature=lg
+ current=getnext(current)
+ else
+ break
+ end
+ end
+ elseif char==false then
+ break
+ elseif id==disc_code then
+ discfound=current
+ break
+ else
+ break
+ end
+ end
+ if discfound then
+ local pre,post,replace=getdisc(discfound)
+ local match
+ if replace then
+ local char=ischar(replace,currentfont)
+ if char and ligature[char] then
+ match=true
+ end
+ end
+ if not match and pre then
+ local char=ischar(pre,currentfont)
+ if char and ligature[char] then
+ match=true
+ end
+ end
+ if not match and not pre or not replace then
+ local n=getnext(discfound)
+ local char=ischar(n,currentfont)
+ if char and ligature[char] then
+ match=true
+ end
+ end
+ if match then
+ local ishead=head==start
+ local prev=getprev(start)
+ if stop then
+ setnext(stop)
+ local copy=copy_node_list(start)
+ local tail=stop
+ local liat=find_node_tail(copy)
+ if pre then
+ setlink(liat,pre)
+ end
+ if replace then
+ setlink(tail,replace)
+ end
+ pre=copy
+ replace=start
+ else
+ setnext(start)
+ local copy=copy_node(start)
+ if pre then
+ setlink(copy,pre)
+ end
+ if replace then
+ setlink(start,replace)
+ end
+ pre=copy
+ replace=start
+ end
+ setdisc(discfound,pre,post,replace)
+ if prev then
+ setlink(prev,discfound)
+ else
+ setprev(discfound)
+ head=discfound
+ end
+ start=discfound
+ return head,start,true,true
+ end
+ end
+ local lig=ligature.ligature
+ if lig then
+ if stop then
+ if trace_ligatures then
+ local stopchar=getchar(stop)
+ head,start=toligature(head,start,stop,lig,dataset,sequence,skiphash,false,hasmarks)
+ logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(dataset,sequence),gref(startchar),gref(stopchar),gref(lig))
+ else
+ head,start=toligature(head,start,stop,lig,dataset,sequence,skiphash,false,hasmarks)
+ end
+ else
+ resetinjection(start)
+ setchar(start,lig)
+ if trace_ligatures then
+ logprocess("%s: replacing %s by (no real) ligature %s case 3",pref(dataset,sequence),gref(startchar),gref(lig))
+ end
+ end
+ return head,start,true,false
+ else
+ end
+ end
+ return head,start,false,false
+end
+function handlers.gpos_single(head,start,dataset,sequence,kerns,rlmode,skiphash,step,injection)
+ local startchar=getchar(start)
+ local format=step.format
+ if format=="single" or type(kerns)=="table" then
+ local dx,dy,w,h=setposition(0,start,factor,rlmode,kerns,injection)
+ if trace_kerns then
+ logprocess("%s: shifting single %s by %s xy (%p,%p) and wh (%p,%p)",pref(dataset,sequence),gref(startchar),format,dx,dy,w,h)
+ end
+ else
+ local k=(format=="move" and setmove or setkern)(start,factor,rlmode,kerns,injection)
+ if trace_kerns then
+ logprocess("%s: shifting single %s by %s %p",pref(dataset,sequence),gref(startchar),format,k)
+ end
+ end
+ return head,start,true
+end
+function handlers.gpos_pair(head,start,dataset,sequence,kerns,rlmode,skiphash,step,injection)
+ local snext=getnext(start)
+ if not snext then
+ return head,start,false
+ else
+ local prev=start
+ while snext do
+ local nextchar=ischar(snext,currentfont)
+ if nextchar then
+ if skiphash and skiphash[nextchar] then
+ prev=snext
+ snext=getnext(snext)
+ else
+ local krn=kerns[nextchar]
+ if not krn then
+ break
+ end
+ local format=step.format
+ if format=="pair" then
+ local a=krn[1]
+ local b=krn[2]
+ if a==true then
+ elseif a then
+ local x,y,w,h=setposition(1,start,factor,rlmode,a,injection)
+ if trace_kerns then
+ local startchar=getchar(start)
+ logprocess("%s: shifting first of pair %s and %s by xy (%p,%p) and wh (%p,%p) as %s",pref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h,injection or "injections")
+ end
+ end
+ if b==true then
+ start=snext
+ elseif b then
+ local x,y,w,h=setposition(2,snext,factor,rlmode,b,injection)
+ if trace_kerns then
+ local startchar=getchar(start)
+ logprocess("%s: shifting second of pair %s and %s by xy (%p,%p) and wh (%p,%p) as %s",pref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h,injection or "injections")
+ end
+ start=snext
+ elseif forcepairadvance then
+ start=snext
+ end
+ return head,start,true
+ elseif krn~=0 then
+ local k=(format=="move" and setmove or setkern)(snext,factor,rlmode,krn,injection)
+ if trace_kerns then
+ logprocess("%s: inserting %s %p between %s and %s as %s",pref(dataset,sequence),format,k,gref(getchar(prev)),gref(nextchar),injection or "injections")
+ end
+ return head,start,true
+ else
+ break
+ end
+ end
+ else
+ break
+ end
+ end
+ return head,start,false
+ end
+end
+function handlers.gpos_mark2base(head,start,dataset,sequence,markanchors,rlmode,skiphash)
+ local markchar=getchar(start)
+ if marks[markchar] then
+ local base=getprev(start)
+ if base then
+ local basechar=ischar(base,currentfont)
+ if basechar then
+ if marks[basechar] then
+ while base do
+ base=getprev(base)
+ if base then
+ basechar=ischar(base,currentfont)
+ if basechar then
+ if not marks[basechar] then
+ break
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s, case %i",pref(dataset,sequence),gref(markchar),1)
+ end
+ return head,start,false
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s, case %i",pref(dataset,sequence),gref(markchar),2)
+ end
+ return head,start,false
+ end
+ end
+ end
+ local ba=markanchors[1][basechar]
+ if ba then
+ local ma=markanchors[2]
+ local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks)
+ if trace_marks then
+ logprocess("%s, bound %s, anchoring mark %s to basechar %s => (%p,%p)",
+ pref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy)
+ end
+ return head,start,true
+ elseif trace_bugs then
+ logwarning("%s: mark %s is not anchored to %s",pref(dataset,sequence),gref(markchar),gref(basechar))
+ end
+ elseif trace_bugs then
+ logwarning("%s: nothing preceding, case %i",pref(dataset,sequence),1)
+ end
+ elseif trace_bugs then
+ logwarning("%s: nothing preceding, case %i",pref(dataset,sequence),2)
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",pref(dataset,sequence),gref(markchar))
+ end
+ return head,start,false
+end
+function handlers.gpos_mark2ligature(head,start,dataset,sequence,markanchors,rlmode,skiphash)
+ local markchar=getchar(start)
+ if marks[markchar] then
+ local base=getprev(start)
+ if base then
+ local basechar=ischar(base,currentfont)
+ if basechar then
+ if marks[basechar] then
+ while base do
+ base=getprev(base)
+ if base then
+ basechar=ischar(base,currentfont)
+ if basechar then
+ if not marks[basechar] then
+ break
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s, case %i",pref(dataset,sequence),gref(markchar),1)
+ end
+ return head,start,false
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s, case %i",pref(dataset,sequence),gref(markchar),2)
+ end
+ return head,start,false
+ end
+ end
+ end
+ local ba=markanchors[1][basechar]
+ if ba then
+ local ma=markanchors[2]
+ if ma then
+ local index=getligaindex(start)
+ ba=ba[index]
+ if ba then
+ local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks)
+ if trace_marks then
+ logprocess("%s, index %s, bound %s, anchoring mark %s to baselig %s at index %s => (%p,%p)",
+ pref(dataset,sequence),index,bound,gref(markchar),gref(basechar),index,dx,dy)
+ end
+ return head,start,true
+ else
+ if trace_bugs then
+ logwarning("%s: no matching anchors for mark %s and baselig %s with index %a",pref(dataset,sequence),gref(markchar),gref(basechar),index)
+ end
+ end
+ end
+ elseif trace_bugs then
+ onetimemessage(currentfont,basechar,"no base anchors",report_fonts)
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no char, case %i",pref(dataset,sequence),1)
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no char, case %i",pref(dataset,sequence),2)
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",pref(dataset,sequence),gref(markchar))
+ end
+ return head,start,false
+end
+function handlers.gpos_mark2mark(head,start,dataset,sequence,markanchors,rlmode,skiphash)
+ local markchar=getchar(start)
+ if marks[markchar] then
+ local base=getprev(start)
+ local slc=getligaindex(start)
+ if slc then
+ while base do
+ local blc=getligaindex(base)
+ if blc and blc~=slc then
+ base=getprev(base)
+ else
+ break
+ end
+ end
+ end
+ if base then
+ local basechar=ischar(base,currentfont)
+ if basechar then
+ local ba=markanchors[1][basechar]
+ if ba then
+ local ma=markanchors[2]
+ local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],true,checkmarks)
+ if trace_marks then
+ logprocess("%s, bound %s, anchoring mark %s to basemark %s => (%p,%p)",
+ pref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy)
+ end
+ return head,start,true
+ end
+ end
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",pref(dataset,sequence),gref(markchar))
+ end
+ return head,start,false
+end
+function handlers.gpos_cursive(head,start,dataset,sequence,exitanchors,rlmode,skiphash,step)
+ local startchar=getchar(start)
+ if marks[startchar] then
+ if trace_cursive then
+ logprocess("%s: ignoring cursive for mark %s",pref(dataset,sequence),gref(startchar))
+ end
+ else
+ local nxt=getnext(start)
+ while nxt do
+ local nextchar=ischar(nxt,currentfont)
+ if not nextchar then
+ break
+ elseif marks[nextchar] then
+ nxt=getnext(nxt)
+ else
+ local exit=exitanchors[3]
+ if exit then
+ local entry=exitanchors[1][nextchar]
+ if entry then
+ entry=entry[2]
+ if entry then
+ local r2lflag=sequence.flags[4]
+ local dx,dy,bound=setcursive(start,nxt,factor,rlmode,exit,entry,characters[startchar],characters[nextchar],r2lflag)
+ if trace_cursive then
+ logprocess("%s: moving %s to %s cursive (%p,%p) using bound %s in %s mode",pref(dataset,sequence),gref(startchar),gref(nextchar),dx,dy,bound,mref(rlmode))
+ end
+ return head,start,true
+ end
+ end
+ end
+ break
+ end
+ end
+ end
+ return head,start,false
+end
+local chainprocs={}
+local function logprocess(...)
+ if trace_steps then
+ registermessage(...)
+ if trace_steps=="silent" then
+ return
+ end
+ end
+ report_subchain(...)
+end
+local logwarning=report_subchain
+local function logprocess(...)
+ if trace_steps then
+ registermessage(...)
+ if trace_steps=="silent" then
+ return
+ end
+ end
+ report_chain(...)
+end
+local logwarning=report_chain
+local function reversesub(head,start,stop,dataset,sequence,replacements,rlmode,skiphash)
+ local char=getchar(start)
+ local replacement=replacements[char]
+ if replacement then
+ if trace_singles then
+ logprocess("%s: single reverse replacement of %s by %s",cref(dataset,sequence),gref(char),gref(replacement))
+ end
+ resetinjection(start)
+ setchar(start,replacement)
+ return head,start,true
+ else
+ return head,start,false
+ end
+end
+chainprocs.reversesub=reversesub
+local function reportzerosteps(dataset,sequence)
+ logwarning("%s: no steps",cref(dataset,sequence))
+end
+local function reportmoresteps(dataset,sequence)
+ logwarning("%s: more than 1 step",cref(dataset,sequence))
+end
+local function getmapping(dataset,sequence,currentlookup)
+ local steps=currentlookup.steps
+ local nofsteps=currentlookup.nofsteps
+ if nofsteps==0 then
+ reportzerosteps(dataset,sequence)
+ currentlookup.mapping=false
+ return false
+ else
+ if nofsteps>1 then
+ reportmoresteps(dataset,sequence)
+ end
+ local mapping=steps[1].coverage
+ currentlookup.mapping=mapping
+ currentlookup.format=steps[1].format
+ return mapping
+ end
+end
+function chainprocs.gsub_remove(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
+ if trace_chains then
+ logprocess("%s: removing character %s",cref(dataset,sequence,chainindex),gref(getchar(start)))
+ end
+ head,start=remove_node(head,start,true)
+ return head,getprev(start),true
+end
+function chainprocs.gsub_single(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
+ local mapping=currentlookup.mapping
+ if mapping==nil then
+ mapping=getmapping(dataset,sequence,currentlookup)
+ end
+ if mapping then
+ local current=start
+ while current do
+ local currentchar=ischar(current)
+ if currentchar then
+ local replacement=mapping[currentchar]
+ if not replacement or replacement=="" then
+ if trace_bugs then
+ logwarning("%s: no single for %s",cref(dataset,sequence,chainindex),gref(currentchar))
+ end
+ else
+ if trace_singles then
+ logprocess("%s: replacing single %s by %s",cref(dataset,sequence,chainindex),gref(currentchar),gref(replacement))
+ end
+ resetinjection(current)
+ setchar(current,replacement)
+ end
+ return head,start,true
+ elseif currentchar==false then
+ break
+ elseif current==stop then
+ break
+ else
+ current=getnext(current)
+ end
+ end
+ end
+ return head,start,false
+end
+function chainprocs.gsub_alternate(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
+ local mapping=currentlookup.mapping
+ if mapping==nil then
+ mapping=getmapping(dataset,sequence,currentlookup)
+ end
+ if mapping then
+ local kind=dataset[4]
+ local what=dataset[1]
+ local value=what==true and tfmdata.shared.features[kind] or what
+ local current=start
+ while current do
+ local currentchar=ischar(current)
+ if currentchar then
+ local alternatives=mapping[currentchar]
+ if alternatives then
+ local choice,comment=get_alternative_glyph(current,alternatives,value)
+ if choice then
+ if trace_alternatives then
+ logprocess("%s: replacing %s by alternative %a to %s, %s",cref(dataset,sequence),gref(currentchar),choice,gref(choice),comment)
+ end
+ resetinjection(start)
+ setchar(start,choice)
+ else
+ if trace_alternatives then
+ logwarning("%s: no variant %a for %s, %s",cref(dataset,sequence),value,gref(currentchar),comment)
+ end
+ end
+ end
+ return head,start,true
+ elseif currentchar==false then
+ break
+ elseif current==stop then
+ break
+ else
+ current=getnext(current)
+ end
+ end
+ end
+ return head,start,false
+end
+function chainprocs.gsub_multiple(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
+ local mapping=currentlookup.mapping
+ if mapping==nil then
+ mapping=getmapping(dataset,sequence,currentlookup)
+ end
+ if mapping then
+ local startchar=getchar(start)
+ local replacement=mapping[startchar]
+ if not replacement or replacement=="" then
+ if trace_bugs then
+ logwarning("%s: no multiple for %s",cref(dataset,sequence),gref(startchar))
+ end
+ else
+ if trace_multiples then
+ logprocess("%s: replacing %s by multiple characters %s",cref(dataset,sequence),gref(startchar),gref(replacement))
+ end
+ return multiple_glyphs(head,start,replacement,skiphash,dataset[1],stop)
+ end
+ end
+ return head,start,false
+end
+function chainprocs.gsub_ligature(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
+ local mapping=currentlookup.mapping
+ if mapping==nil then
+ mapping=getmapping(dataset,sequence,currentlookup)
+ end
+ if mapping then
+ local startchar=getchar(start)
+ local ligatures=mapping[startchar]
+ if not ligatures then
+ if trace_bugs then
+ logwarning("%s: no ligatures starting with %s",cref(dataset,sequence,chainindex),gref(startchar))
+ end
+ else
+ local hasmarks=marks[startchar]
+ local current=getnext(start)
+ local discfound=false
+ local last=stop
+ local nofreplacements=1
+ while current do
+ local id=getid(current)
+ if id==disc_code then
+ if not discfound then
+ discfound=current
+ end
+ if current==stop then
+ break
+ else
+ current=getnext(current)
+ end
+ else
+ local schar=getchar(current)
+ if skiphash and skiphash[schar] then
+ current=getnext(current)
+ else
+ local lg=ligatures[schar]
+ if lg then
+ ligatures=lg
+ last=current
+ nofreplacements=nofreplacements+1
+ if marks[char] then
+ hasmarks=true
+ end
+ if current==stop then
+ break
+ else
+ current=getnext(current)
+ end
+ else
+ break
+ end
+ end
+ end
+ end
+ local ligature=ligatures.ligature
+ if ligature then
+ if chainindex then
+ stop=last
+ end
+ if trace_ligatures then
+ if start==stop then
+ logprocess("%s: replacing character %s by ligature %s case 3",cref(dataset,sequence,chainindex),gref(startchar),gref(ligature))
+ else
+ logprocess("%s: replacing character %s upto %s by ligature %s case 4",cref(dataset,sequence,chainindex),gref(startchar),gref(getchar(stop)),gref(ligature))
+ end
+ end
+ head,start=toligature(head,start,stop,ligature,dataset,sequence,skiphash,discfound,hasmarks)
+ return head,start,true,nofreplacements,discfound
+ elseif trace_bugs then
+ if start==stop then
+ logwarning("%s: replacing character %s by ligature fails",cref(dataset,sequence,chainindex),gref(startchar))
+ else
+ logwarning("%s: replacing character %s upto %s by ligature fails",cref(dataset,sequence,chainindex),gref(startchar),gref(getchar(stop)))
+ end
+ end
+ end
+ end
+ return head,start,false,0,false
+end
+function chainprocs.gpos_single(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
+ local mapping=currentlookup.mapping
+ if mapping==nil then
+ mapping=getmapping(dataset,sequence,currentlookup)
+ end
+ if mapping then
+ local startchar=getchar(start)
+ local kerns=mapping[startchar]
+ if kerns then
+ local format=currentlookup.format
+ if format=="single" then
+ local dx,dy,w,h=setposition(0,start,factor,rlmode,kerns)
+ if trace_kerns then
+ logprocess("%s: shifting single %s by %s (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),format,dx,dy,w,h)
+ end
+ else
+ local k=(format=="move" and setmove or setkern)(start,factor,rlmode,kerns,injection)
+ if trace_kerns then
+ logprocess("%s: shifting single %s by %s %p",cref(dataset,sequence),gref(startchar),format,k)
+ end
+ end
+ return head,start,true
+ end
+ end
+ return head,start,false
+end
+function chainprocs.gpos_pair(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
+ local mapping=currentlookup.mapping
+ if mapping==nil then
+ mapping=getmapping(dataset,sequence,currentlookup)
+ end
+ if mapping then
+ local snext=getnext(start)
+ if snext then
+ local startchar=getchar(start)
+ local kerns=mapping[startchar]
+ if kerns then
+ local prev=start
+ while snext do
+ local nextchar=ischar(snext,currentfont)
+ if not nextchar then
+ break
+ end
+ if skiphash and skiphash[nextchar] then
+ prev=snext
+ snext=getnext(snext)
+ else
+ local krn=kerns[nextchar]
+ if not krn then
+ break
+ end
+ local format=currentlookup.format
+ if format=="pair" then
+ local a=krn[1]
+ local b=krn[2]
+ if a==true then
+ elseif a then
+ local x,y,w,h=setposition(1,start,factor,rlmode,a,"injections")
+ if trace_kerns then
+ local startchar=getchar(start)
+ logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h)
+ end
+ end
+ if b==true then
+ start=snext
+ elseif b then
+ local x,y,w,h=setposition(2,snext,factor,rlmode,b,"injections")
+ if trace_kerns then
+ local startchar=getchar(start)
+ logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h)
+ end
+ start=snext
+ elseif forcepairadvance then
+ start=snext
+ end
+ return head,start,true
+ elseif krn~=0 then
+ local k=(format=="move" and setmove or setkern)(snext,factor,rlmode,krn)
+ if trace_kerns then
+ logprocess("%s: inserting %s %p between %s and %s",cref(dataset,sequence),format,k,gref(getchar(prev)),gref(nextchar))
+ end
+ return head,start,true
+ else
+ break
+ end
+ end
+ end
+ end
+ end
+ end
+ return head,start,false
+end
+function chainprocs.gpos_mark2base(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
+ local mapping=currentlookup.mapping
+ if mapping==nil then
+ mapping=getmapping(dataset,sequence,currentlookup)
+ end
+ if mapping then
+ local markchar=getchar(start)
+ if marks[markchar] then
+ local markanchors=mapping[markchar]
+ if markanchors then
+ local base=getprev(start)
+ if base then
+ local basechar=ischar(base,currentfont)
+ if basechar then
+ if marks[basechar] then
+ while base do
+ base=getprev(base)
+ if base then
+ local basechar=ischar(base,currentfont)
+ if basechar then
+ if not marks[basechar] then
+ break
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s, case %i",pref(dataset,sequence),gref(markchar),1)
+ end
+ return head,start,false
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s, case %i",pref(dataset,sequence),gref(markchar),2)
+ end
+ return head,start,false
+ end
+ end
+ end
+ local ba=markanchors[1][basechar]
+ if ba then
+ local ma=markanchors[2]
+ if ma then
+ local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks)
+ if trace_marks then
+ logprocess("%s, bound %s, anchoring mark %s to basechar %s => (%p,%p)",
+ cref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy)
+ end
+ return head,start,true
+ end
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no char, case %i",cref(dataset,sequence),1)
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no char, case %i",cref(dataset,sequence),2)
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s has no anchors",cref(dataset,sequence),gref(markchar))
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",cref(dataset,sequence),gref(markchar))
+ end
+ end
+ return head,start,false
+end
+function chainprocs.gpos_mark2ligature(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
+ local mapping=currentlookup.mapping
+ if mapping==nil then
+ mapping=getmapping(dataset,sequence,currentlookup)
+ end
+ if mapping then
+ local markchar=getchar(start)
+ if marks[markchar] then
+ local markanchors=mapping[markchar]
+ if markanchors then
+ local base=getprev(start)
+ if base then
+ local basechar=ischar(base,currentfont)
+ if basechar then
+ if marks[basechar] then
+ while base do
+ base=getprev(base)
+ if base then
+ local basechar=ischar(base,currentfont)
+ if basechar then
+ if not marks[basechar] then
+ break
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s, case %i",cref(dataset,sequence),markchar,1)
+ end
+ return head,start,false
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s, case %i",cref(dataset,sequence),markchar,2)
+ end
+ return head,start,false
+ end
+ end
+ end
+ local ba=markanchors[1][basechar]
+ if ba then
+ local ma=markanchors[2]
+ if ma then
+ local index=getligaindex(start)
+ ba=ba[index]
+ if ba then
+ local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks)
+ if trace_marks then
+ logprocess("%s, bound %s, anchoring mark %s to baselig %s at index %s => (%p,%p)",
+ cref(dataset,sequence),a or bound,gref(markchar),gref(basechar),index,dx,dy)
+ end
+ return head,start,true
+ end
+ end
+ end
+ elseif trace_bugs then
+ logwarning("%s, prev node is no char, case %i",cref(dataset,sequence),1)
+ end
+ elseif trace_bugs then
+ logwarning("%s, prev node is no char, case %i",cref(dataset,sequence),2)
+ end
+ elseif trace_bugs then
+ logwarning("%s, mark %s has no anchors",cref(dataset,sequence),gref(markchar))
+ end
+ elseif trace_bugs then
+ logwarning("%s, mark %s is no mark",cref(dataset,sequence),gref(markchar))
+ end
+ end
+ return head,start,false
+end
+function chainprocs.gpos_mark2mark(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
+ local mapping=currentlookup.mapping
+ if mapping==nil then
+ mapping=getmapping(dataset,sequence,currentlookup)
+ end
+ if mapping then
+ local markchar=getchar(start)
+ if marks[markchar] then
+ local markanchors=mapping[markchar]
+ if markanchors then
+ local base=getprev(start)
+ local slc=getligaindex(start)
+ if slc then
+ while base do
+ local blc=getligaindex(base)
+ if blc and blc~=slc then
+ base=getprev(base)
+ else
+ break
+ end
+ end
+ end
+ if base then
+ local basechar=ischar(base,currentfont)
+ if basechar then
+ local ba=markanchors[1][basechar]
+ if ba then
+ local ma=markanchors[2]
+ if ma then
+ local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],true,checkmarks)
+ if trace_marks then
+ logprocess("%s, bound %s, anchoring mark %s to basemark %s => (%p,%p)",
+ cref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy)
+ end
+ return head,start,true
+ end
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no mark, case %i",cref(dataset,sequence),1)
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no mark, case %i",cref(dataset,sequence),2)
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s has no anchors",cref(dataset,sequence),gref(markchar))
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",cref(dataset,sequence),gref(markchar))
+ end
+ end
+ return head,start,false
+end
+function chainprocs.gpos_cursive(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex)
+ local mapping=currentlookup.mapping
+ if mapping==nil then
+ mapping=getmapping(dataset,sequence,currentlookup)
+ end
+ if mapping then
+ local startchar=getchar(start)
+ local exitanchors=mapping[startchar]
+ if exitanchors then
+ if marks[startchar] then
+ if trace_cursive then
+ logprocess("%s: ignoring cursive for mark %s",pref(dataset,sequence),gref(startchar))
+ end
+ else
+ local nxt=getnext(start)
+ while nxt do
+ local nextchar=ischar(nxt,currentfont)
+ if not nextchar then
+ break
+ elseif marks[nextchar] then
+ nxt=getnext(nxt)
+ else
+ local exit=exitanchors[3]
+ if exit then
+ local entry=exitanchors[1][nextchar]
+ if entry then
+ entry=entry[2]
+ if entry then
+ local r2lflag=sequence.flags[4]
+ local dx,dy,bound=setcursive(start,nxt,factor,rlmode,exit,entry,characters[startchar],characters[nextchar],r2lflag)
+ if trace_cursive then
+ logprocess("%s: moving %s to %s cursive (%p,%p) using bound %s in %s mode",pref(dataset,sequence),gref(startchar),gref(nextchar),dx,dy,bound,mref(rlmode))
+ end
+ return head,start,true
+ end
+ end
+ elseif trace_bugs then
+ onetimemessage(currentfont,startchar,"no entry anchors",report_fonts)
+ end
+ break
+ end
+ end
+ end
+ elseif trace_cursive and trace_details then
+ logprocess("%s, cursive %s is already done",pref(dataset,sequence),gref(getchar(start)),alreadydone)
+ end
+ end
+ return head,start,false
+end
+local function show_skip(dataset,sequence,char,ck,class)
+ logwarning("%s: skipping char %s, class %a, rule %a, lookuptype %a",cref(dataset,sequence),gref(char),class,ck[1],ck[8] or ck[2])
+end
+local userkern=nuts.pool and nuts.pool.newkern
+do if not userkern then
+ local thekern=nuts.new("kern",1)
+ local setkern=nuts.setkern
+ userkern=function(k)
+ local n=copy_node(thekern)
+ setkern(n,k)
+ return n
+ end
+end end
+local function checked(head)
+ local current=head
+ while current do
+ if getid(current)==glue_code then
+ local kern=userkern(getwidth(current))
+ if head==current then
+ local next=getnext(current)
+ if next then
+ setlink(kern,next)
+ end
+ flush_node(current)
+ head=kern
+ current=next
+ else
+ local prev,next=getboth(current)
+ setlink(prev,kern,next)
+ flush_node(current)
+ current=next
+ end
+ else
+ current=getnext(current)
+ end
+ end
+ return head
+end
+local function setdiscchecked(d,pre,post,replace)
+ if pre then pre=checked(pre) end
+ if post then post=checked(post) end
+ if replace then replace=checked(replace) end
+ setdisc(d,pre,post,replace)
+end
+local noflags={ false,false,false,false }
+local function chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck)
+ local size=ck[5]-ck[4]+1
+ local chainlookups=ck[6]
+ local done=false
+ if chainlookups then
+ if size==1 then
+ local chainlookup=chainlookups[1]
+ for j=1,#chainlookup do
+ local chainstep=chainlookup[j]
+ local chainkind=chainstep.type
+ local chainproc=chainprocs[chainkind]
+ if chainproc then
+ local ok
+ head,start,ok=chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash)
+ if ok then
+ done=true
+ end
+ else
+ logprocess("%s: %s is not yet supported (1)",cref(dataset,sequence),chainkind)
+ end
+ end
+ else
+ local i=1
+ local laststart=start
+ local nofchainlookups=#chainlookups
+ while start do
+ if skiphash then
+ while start do
+ local char=ischar(start,currentfont)
+ if char then
+ if skiphash and skiphash[char] then
+ start=getnext(start)
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+ end
+ local chainlookup=chainlookups[i]
+ if chainlookup then
+ for j=1,#chainlookup do
+ local chainstep=chainlookup[j]
+ local chainkind=chainstep.type
+ local chainproc=chainprocs[chainkind]
+ if chainproc then
+ local ok,n
+ head,start,ok,n=chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash,i)
+ if ok then
+ done=true
+ if n and n>1 and i+n>nofchainlookups then
+ i=size
+ break
+ end
+ end
+ else
+ logprocess("%s: %s is not yet supported (2)",cref(dataset,sequence),chainkind)
+ end
+ end
+ else
+ end
+ i=i+1
+ if i>size or not start then
+ break
+ elseif start then
+ laststart=start
+ start=getnext(start)
+ end
+ end
+ if not start then
+ start=laststart
+ end
+ end
+ else
+ local replacements=ck[7]
+ if replacements then
+ head,start,done=reversesub(head,start,last,dataset,sequence,replacements,rlmode,skiphash)
+ else
+ done=true
+ if trace_contexts then
+ logprocess("%s: skipping match",cref(dataset,sequence))
+ end
+ end
+ end
+ return head,start,done
+end
+local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
+ if not start then
+ return head,start,false
+ end
+ local startishead=start==head
+ local seq=ck[3]
+ local f=ck[4]
+ local l=ck[5]
+ local s=#seq
+ local done=false
+ local sweepnode=sweepnode
+ local sweeptype=sweeptype
+ local sweepoverflow=false
+ local keepdisc=not sweepnode
+ local lookaheaddisc=nil
+ local backtrackdisc=nil
+ local current=start
+ local last=start
+ local prev=getprev(start)
+ local hasglue=false
+ local i=f
+ while i<=l do
+ local id=getid(current)
+ if id==glyph_code then
+ i=i+1
+ last=current
+ current=getnext(current)
+ elseif id==glue_code then
+ i=i+1
+ last=current
+ current=getnext(current)
+ hasglue=true
+ elseif id==disc_code then
+ if keepdisc then
+ keepdisc=false
+ lookaheaddisc=current
+ local replace=getreplace(current)
+ if not replace then
+ sweepoverflow=true
+ sweepnode=current
+ current=getnext(current)
+ else
+ while replace and i<=l do
+ if getid(replace)==glyph_code then
+ i=i+1
+ end
+ replace=getnext(replace)
+ end
+ current=getnext(replace)
+ end
+ last=current
+ else
+ head,current=flattendisk(head,current)
+ end
+ else
+ last=current
+ current=getnext(current)
+ end
+ if current then
+ elseif sweepoverflow then
+ break
+ elseif sweeptype=="post" or sweeptype=="replace" then
+ current=getnext(sweepnode)
+ if current then
+ sweeptype=nil
+ sweepoverflow=true
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+ if sweepoverflow then
+ local prev=current and getprev(current)
+ if not current or prev~=sweepnode then
+ local head=getnext(sweepnode)
+ local tail=nil
+ if prev then
+ tail=prev
+ setprev(current,sweepnode)
+ else
+ tail=find_node_tail(head)
+ end
+ setnext(sweepnode,current)
+ setprev(head)
+ setnext(tail)
+ appenddisc(sweepnode,head)
+ end
+ end
+ if l1 then
+ local current=prev
+ local i=f
+ local t=sweeptype=="pre" or sweeptype=="replace"
+ if not current and t and current==checkdisk then
+ current=getprev(sweepnode)
+ end
+ while current and i>1 do
+ local id=getid(current)
+ if id==glyph_code then
+ i=i-1
+ elseif id==glue_code then
+ i=i-1
+ hasglue=true
+ elseif id==disc_code then
+ if keepdisc then
+ keepdisc=false
+ if notmatchpost[current]~=notmatchreplace[current] then
+ backtrackdisc=current
+ end
+ local replace=getreplace(current)
+ while replace and i>1 do
+ if getid(replace)==glyph_code then
+ i=i-1
+ end
+ replace=getnext(replace)
+ end
+ elseif notmatchpost[current]~=notmatchreplace[current] then
+ head,current=flattendisk(head,current)
+ end
+ end
+ current=getprev(current)
+ if t and current==checkdisk then
+ current=getprev(sweepnode)
+ end
+ end
+ end
+ local done=false
+ if lookaheaddisc then
+ local cf=start
+ local cl=getprev(lookaheaddisc)
+ local cprev=getprev(start)
+ local insertedmarks=0
+ while cprev do
+ local char=ischar(cf,currentfont)
+ if char and marks[char] then
+ insertedmarks=insertedmarks+1
+ cf=cprev
+ startishead=cf==head
+ cprev=getprev(cprev)
+ else
+ break
+ end
+ end
+ setlink(cprev,lookaheaddisc)
+ setprev(cf)
+ setnext(cl)
+ if startishead then
+ head=lookaheaddisc
+ end
+ local pre,post,replace=getdisc(lookaheaddisc)
+ local new=copy_node_list(cf)
+ local cnew=new
+ if pre then
+ setlink(find_node_tail(cf),pre)
+ end
+ if replace then
+ local tail=find_node_tail(new)
+ setlink(tail,replace)
+ end
+ for i=1,insertedmarks do
+ cnew=getnext(cnew)
+ end
+ cl=start
+ local clast=cnew
+ for i=f,l do
+ cl=getnext(cl)
+ clast=getnext(clast)
+ end
+ if not notmatchpre[lookaheaddisc] then
+ local ok=false
+ cf,start,ok=chainrun(cf,start,cl,dataset,sequence,rlmode,skiphash,ck)
+ if ok then
+ done=true
+ end
+ end
+ if not notmatchreplace[lookaheaddisc] then
+ local ok=false
+ new,cnew,ok=chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck)
+ if ok then
+ done=true
+ end
+ end
+ if hasglue then
+ setdiscchecked(lookaheaddisc,cf,post,new)
+ else
+ setdisc(lookaheaddisc,cf,post,new)
+ end
+ start=getprev(lookaheaddisc)
+ sweephead[cf]=getnext(clast) or false
+ sweephead[new]=getnext(cl) or false
+ elseif backtrackdisc then
+ local cf=getnext(backtrackdisc)
+ local cl=start
+ local cnext=getnext(start)
+ local insertedmarks=0
+ while cnext do
+ local char=ischar(cnext,currentfont)
+ if char and marks[char] then
+ insertedmarks=insertedmarks+1
+ cl=cnext
+ cnext=getnext(cnext)
+ else
+ break
+ end
+ end
+ setlink(backtrackdisc,cnext)
+ setprev(cf)
+ setnext(cl)
+ local pre,post,replace,pretail,posttail,replacetail=getdisc(backtrackdisc,true)
+ local new=copy_node_list(cf)
+ local cnew=find_node_tail(new)
+ for i=1,insertedmarks do
+ cnew=getprev(cnew)
+ end
+ local clast=cnew
+ for i=f,l do
+ clast=getnext(clast)
+ end
+ if not notmatchpost[backtrackdisc] then
+ local ok=false
+ cf,start,ok=chainrun(cf,start,last,dataset,sequence,rlmode,skiphash,ck)
+ if ok then
+ done=true
+ end
+ end
+ if not notmatchreplace[backtrackdisc] then
+ local ok=false
+ new,cnew,ok=chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck)
+ if ok then
+ done=true
+ end
+ end
+ if post then
+ setlink(posttail,cf)
+ else
+ post=cf
+ end
+ if replace then
+ setlink(replacetail,new)
+ else
+ replace=new
+ end
+ if hasglue then
+ setdiscchecked(backtrackdisc,pre,post,replace)
+ else
+ setdisc(backtrackdisc,pre,post,replace)
+ end
+ start=getprev(backtrackdisc)
+ sweephead[post]=getnext(clast) or false
+ sweephead[replace]=getnext(last) or false
+ else
+ local ok=false
+ head,start,ok=chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck)
+ if ok then
+ done=true
+ end
+ end
+ return head,start,done
+end
+local function chaintrac(head,start,dataset,sequence,rlmode,skiphash,ck,match,discseen,sweepnode)
+ local rule=ck[1]
+ local lookuptype=ck[8] or ck[2]
+ local nofseq=#ck[3]
+ local first=ck[4]
+ local last=ck[5]
+ local char=getchar(start)
+ logwarning("%s: rule %s %s at char %s for (%s,%s,%s) chars, lookuptype %a, %sdisc seen, %ssweeping",
+ cref(dataset,sequence),rule,match and "matches" or "nomatch",
+ gref(char),first-1,last-first+1,nofseq-last,lookuptype,
+ discseen and "" or "no ",sweepnode and "" or "not ")
+end
+local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,skiphash)
+ local sweepnode=sweepnode
+ local sweeptype=sweeptype
+ local postreplace
+ local prereplace
+ local checkdisc
+ local discseen
+ if sweeptype then
+ if sweeptype=="replace" then
+ postreplace=true
+ prereplace=true
+ else
+ postreplace=sweeptype=="post"
+ prereplace=sweeptype=="pre"
+ end
+ checkdisc=getprev(head)
+ end
+ local currentfont=currentfont
+ local skipped
+ local startprev,
+ startnext=getboth(start)
+ local done
+ local nofcontexts=contexts.n
+ local startchar=nofcontext==1 or ischar(start,currentfont)
+ for k=1,nofcontexts do
+ local ck=contexts[k]
+ local seq=ck[3]
+ local f=ck[4]
+ if not startchar or not seq[f][startchar] then
+ goto next
+ end
+ local s=seq.n
+ local l=ck[5]
+ local current=start
+ local last=start
+ if l>f then
+ local discfound
+ local n=f+1
+ last=startnext
+ while n<=l do
+ if postreplace and not last then
+ last=getnext(sweepnode)
+ sweeptype=nil
+ end
+ if last then
+ local char,id=ischar(last,currentfont)
+ if char then
+ if skiphash and skiphash[char] then
+ skipped=true
+ if trace_skips then
+ show_skip(dataset,sequence,char,ck,classes[char])
+ end
+ last=getnext(last)
+ elseif seq[n][char] then
+ if nl then
+ break
+ end
+ pre=getnext(pre)
+ else
+ notmatchpre[last]=true
+ break
+ end
+ end
+ else
+ notmatchpre[last]=true
+ end
+ if replace then
+ while replace do
+ if seq[n][getchar(replace)] then
+ n=n+1
+ if n>l then
+ break
+ end
+ replace=getnext(replace)
+ else
+ notmatchreplace[last]=true
+ if notmatchpre[last] then
+ goto next
+ else
+ break
+ end
+ end
+ end
+ if notmatchpre[last] then
+ goto next
+ end
+ end
+ last=getnext(last)
+ else
+ goto next
+ end
+ else
+ goto next
+ end
+ end
+ end
+ if f>1 then
+ if startprev then
+ local prev=startprev
+ if prereplace and prev==checkdisc then
+ prev=getprev(sweepnode)
+ end
+ if prev then
+ local discfound
+ local n=f-1
+ while n>=1 do
+ if prev then
+ local char,id=ischar(prev,currentfont)
+ if char then
+ if skiphash and skiphash[char] then
+ skipped=true
+ if trace_skips then
+ show_skip(dataset,sequence,char,ck,classes[char])
+ end
+ prev=getprev(prev)
+ elseif seq[n][char] then
+ if n>1 then
+ prev=getprev(prev)
+ end
+ n=n-1
+ elseif discfound then
+ notmatchreplace[discfound]=true
+ if notmatchpost[discfound] then
+ goto next
+ else
+ break
+ end
+ else
+ goto next
+ end
+ elseif char==false then
+ if discfound then
+ notmatchreplace[discfound]=true
+ if notmatchpost[discfound] then
+ goto next
+ end
+ else
+ goto next
+ end
+ break
+ elseif id==disc_code then
+ discseen=true
+ discfound=prev
+ notmatchpre[prev]=true
+ notmatchpost[prev]=nil
+ notmatchreplace[prev]=nil
+ local pre,post,replace,pretail,posttail,replacetail=getdisc(prev,true)
+ if pre~=start and post~=start and replace~=start then
+ if post then
+ local n=n
+ while posttail do
+ if seq[n][getchar(posttail)] then
+ n=n-1
+ if posttail==post or n<1 then
+ break
+ else
+ posttail=getprev(posttail)
+ end
+ else
+ notmatchpost[prev]=true
+ break
+ end
+ end
+ if n>=1 then
+ notmatchpost[prev]=true
+ end
+ else
+ notmatchpost[prev]=true
+ end
+ if replace then
+ while replacetail do
+ if seq[n][getchar(replacetail)] then
+ n=n-1
+ if replacetail==replace or n<1 then
+ break
+ else
+ replacetail=getprev(replacetail)
+ end
+ else
+ notmatchreplace[prev]=true
+ if notmatchpost[prev] then
+ goto next
+ else
+ break
+ end
+ end
+ end
+ else
+ end
+ end
+ prev=getprev(prev)
+ elseif id==glue_code then
+ local sn=seq[n]
+ if (sn[32] and spaces[prev]) or sn[0xFFFC] then
+ n=n-1
+ prev=getprev(prev)
+ else
+ goto next
+ end
+ elseif seq[n][0xFFFC] then
+ n=n-1
+ prev=getprev(prev)
+ else
+ goto next
+ end
+ else
+ goto next
+ end
+ end
+ else
+ goto next
+ end
+ else
+ goto next
+ end
+ end
+ if s>l then
+ local current=last and getnext(last)
+ if not current and postreplace then
+ current=getnext(sweepnode)
+ end
+ if current then
+ local discfound
+ local n=l+1
+ while n<=s do
+ if current then
+ local char,id=ischar(current,currentfont)
+ if char then
+ if skiphash and skiphash[char] then
+ skipped=true
+ if trace_skips then
+ show_skip(dataset,sequence,char,ck,classes[char])
+ end
+ current=getnext(current)
+ elseif seq[n][char] then
+ if ns then
+ break
+ else
+ pre=getnext(pre)
+ end
+ else
+ notmatchpre[current]=true
+ break
+ end
+ end
+ if n<=s then
+ notmatchpre[current]=true
+ end
+ else
+ notmatchpre[current]=true
+ end
+ if replace then
+ while replace do
+ if seq[n][getchar(replace)] then
+ n=n+1
+ if n>s then
+ break
+ else
+ replace=getnext(replace)
+ end
+ else
+ notmatchreplace[current]=true
+ if notmatchpre[current] then
+ goto next
+ else
+ break
+ end
+ end
+ end
+ else
+ end
+ current=getnext(current)
+ elseif id==glue_code then
+ local sn=seq[n]
+ if (sn[32] and spaces[current]) or sn[0xFFFC] then
+ n=n+1
+ current=getnext(current)
+ else
+ goto next
+ end
+ elseif seq[n][0xFFFC] then
+ n=n+1
+ current=getnext(current)
+ else
+ goto next
+ end
+ else
+ goto next
+ end
+ end
+ else
+ goto next
+ end
+ end
+ if trace_contexts then
+ chaintrac(head,start,dataset,sequence,rlmode,skipped and skiphash,ck,true,discseen,sweepnode)
+ end
+ if discseen or sweepnode then
+ head,start,done=chaindisk(head,start,dataset,sequence,rlmode,skipped and skiphash,ck)
+ else
+ head,start,done=chainrun(head,start,last,dataset,sequence,rlmode,skipped and skiphash,ck)
+ end
+ if done then
+ break
+ end
+ ::next::
+ end
+ if discseen then
+ notmatchpre={}
+ notmatchpost={}
+ notmatchreplace={}
+ end
+ return head,start,done
+end
+handlers.gsub_context=handle_contextchain
+handlers.gsub_contextchain=handle_contextchain
+handlers.gsub_reversecontextchain=handle_contextchain
+handlers.gpos_contextchain=handle_contextchain
+handlers.gpos_context=handle_contextchain
+local function chained_contextchain(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash)
+ local steps=currentlookup.steps
+ local nofsteps=currentlookup.nofsteps
+ if nofsteps>1 then
+ reportmoresteps(dataset,sequence)
+ end
+ local l=steps[1].coverage[getchar(start)]
+ if l then
+ return handle_contextchain(head,start,dataset,sequence,l,rlmode,skiphash)
+ else
+ return head,start,false
+ end
+end
+chainprocs.gsub_context=chained_contextchain
+chainprocs.gsub_contextchain=chained_contextchain
+chainprocs.gsub_reversecontextchain=chained_contextchain
+chainprocs.gpos_contextchain=chained_contextchain
+chainprocs.gpos_context=chained_contextchain
+local missing=setmetatableindex("table")
+local logwarning=report_process
+local resolved={}
+local function logprocess(...)
+ if trace_steps then
+ registermessage(...)
+ if trace_steps=="silent" then
+ return
+ end
+ end
+ report_process(...)
+end
+local sequencelists=setmetatableindex(function(t,font)
+ local sequences=fontdata[font].resources.sequences
+ if not sequences or not next(sequences) then
+ sequences=false
+ end
+ t[font]=sequences
+ return sequences
+end)
+do
+ local autofeatures=fonts.analyzers.features
+ local featuretypes=otf.tables.featuretypes
+ local defaultscript=otf.features.checkeddefaultscript
+ local defaultlanguage=otf.features.checkeddefaultlanguage
+ local wildcard="*"
+ local default="dflt"
+ local function initialize(sequence,script,language,enabled,autoscript,autolanguage)
+ local features=sequence.features
+ if features then
+ local order=sequence.order
+ if order then
+ local featuretype=featuretypes[sequence.type or "unknown"]
+ for i=1,#order do
+ local kind=order[i]
+ local valid=enabled[kind]
+ if valid then
+ local scripts=features[kind]
+ local languages=scripts and (
+ scripts[script] or
+ scripts[wildcard] or
+ (autoscript and defaultscript(featuretype,autoscript,scripts))
+ )
+ local enabled=languages and (
+ languages[language] or
+ languages[wildcard] or
+ (autolanguage and defaultlanguage(featuretype,autolanguage,languages))
+ )
+ if enabled then
+ return { valid,autofeatures[kind] or false,sequence,kind }
+ end
+ end
+ end
+ else
+ end
+ end
+ return false
+ end
+ function otf.dataset(tfmdata,font)
+ local shared=tfmdata.shared
+ local properties=tfmdata.properties
+ local language=properties.language or "dflt"
+ local script=properties.script or "dflt"
+ local enabled=shared.features
+ local autoscript=enabled and enabled.autoscript
+ local autolanguage=enabled and enabled.autolanguage
+ local res=resolved[font]
+ if not res then
+ res={}
+ resolved[font]=res
+ end
+ local rs=res[script]
+ if not rs then
+ rs={}
+ res[script]=rs
+ end
+ local rl=rs[language]
+ if not rl then
+ rl={
+ }
+ rs[language]=rl
+ local sequences=tfmdata.resources.sequences
+ if sequences then
+ for s=1,#sequences do
+ local v=enabled and initialize(sequences[s],script,language,enabled,autoscript,autolanguage)
+ if v then
+ rl[#rl+1]=v
+ end
+ end
+ end
+ end
+ return rl
+ end
+end
+local function report_disc(what,n)
+ report_run("%s: %s > %s",what,n,languages.serializediscretionary(n))
+end
+local function kernrun(disc,k_run,font,attr,...)
+ if trace_kernruns then
+ report_disc("kern",disc)
+ end
+ local prev,next=getboth(disc)
+ local nextstart=next
+ local done=false
+ local pre,post,replace,pretail,posttail,replacetail=getdisc(disc,true)
+ local prevmarks=prev
+ while prevmarks do
+ local char=ischar(prevmarks,font)
+ if char and marks[char] then
+ prevmarks=getprev(prevmarks)
+ else
+ break
+ end
+ end
+ if prev and not ischar(prev,font) then
+ prev=false
+ end
+ if next and not ischar(next,font) then
+ next=false
+ end
+ if pre then
+ if k_run(pre,"injections",nil,font,attr,...) then
+ done=true
+ end
+ if prev then
+ setlink(prev,pre)
+ if k_run(prevmarks,"preinjections",pre,font,attr,...) then
+ done=true
+ end
+ setprev(pre)
+ setlink(prev,disc)
+ end
+ end
+ if post then
+ if k_run(post,"injections",nil,font,attr,...) then
+ done=true
+ end
+ if next then
+ setlink(posttail,next)
+ if k_run(posttail,"postinjections",next,font,attr,...) then
+ done=true
+ end
+ setnext(posttail)
+ setlink(disc,next)
+ end
+ end
+ if replace then
+ if k_run(replace,"injections",nil,font,attr,...) then
+ done=true
+ end
+ if prev then
+ setlink(prev,replace)
+ if k_run(prevmarks,"replaceinjections",replace,font,attr,...) then
+ done=true
+ end
+ setprev(replace)
+ setlink(prev,disc)
+ end
+ if next then
+ setlink(replacetail,next)
+ if k_run(replacetail,"replaceinjections",next,font,attr,...) then
+ done=true
+ end
+ setnext(replacetail)
+ setlink(disc,next)
+ end
+ elseif prev and next then
+ setlink(prev,next)
+ if k_run(prevmarks,"emptyinjections",next,font,attr,...) then
+ done=true
+ end
+ setlink(prev,disc,next)
+ end
+ if done and trace_testruns then
+ report_disc("done",disc)
+ end
+ return nextstart,done
+end
+local function comprun(disc,c_run,...)
+ if trace_compruns then
+ report_disc("comp",disc)
+ end
+ local pre,post,replace=getdisc(disc)
+ local renewed=false
+ if pre then
+ sweepnode=disc
+ sweeptype="pre"
+ local new,done=c_run(pre,...)
+ if done then
+ pre=new
+ renewed=true
+ end
+ end
+ if post then
+ sweepnode=disc
+ sweeptype="post"
+ local new,done=c_run(post,...)
+ if done then
+ post=new
+ renewed=true
+ end
+ end
+ if replace then
+ sweepnode=disc
+ sweeptype="replace"
+ local new,done=c_run(replace,...)
+ if done then
+ replace=new
+ renewed=true
+ end
+ end
+ sweepnode=nil
+ sweeptype=nil
+ if renewed then
+ if trace_testruns then
+ report_disc("done",disc)
+ end
+ setdisc(disc,pre,post,replace)
+ end
+ return getnext(disc),renewed
+end
+local function testrun(disc,t_run,c_run,...)
+ if trace_testruns then
+ report_disc("test",disc)
+ end
+ local prev,next=getboth(disc)
+ if not next then
+ return
+ end
+ local pre,post,replace,pretail,posttail,replacetail=getdisc(disc,true)
+ local renewed=false
+ if post or replace then
+ if post then
+ setlink(posttail,next)
+ else
+ post=next
+ end
+ if replace then
+ setlink(replacetail,next)
+ else
+ replace=next
+ end
+ local d_post=t_run(post,next,...)
+ local d_replace=t_run(replace,next,...)
+ if d_post>0 or d_replace>0 then
+ local d=d_replace>d_post and d_replace or d_post
+ local head=getnext(disc)
+ local tail=head
+ for i=2,d do
+ local nx=getnext(tail)
+ local id=getid(nx)
+ if id==disc_code then
+ head,tail=flattendisk(head,nx)
+ elseif id==glyph_code then
+ tail=nx
+ else
+ break
+ end
+ end
+ next=getnext(tail)
+ setnext(tail)
+ setprev(head)
+ local new=copy_node_list(head)
+ if posttail then
+ setlink(posttail,head)
+ else
+ post=head
+ end
+ if replacetail then
+ setlink(replacetail,new)
+ else
+ replace=new
+ end
+ else
+ if posttail then
+ setnext(posttail)
+ else
+ post=nil
+ end
+ if replacetail then
+ setnext(replacetail)
+ else
+ replace=nil
+ end
+ end
+ setlink(disc,next)
+ end
+ if trace_testruns then
+ report_disc("more",disc)
+ end
+ if pre then
+ sweepnode=disc
+ sweeptype="pre"
+ local new,ok=c_run(pre,...)
+ if ok then
+ pre=new
+ renewed=true
+ end
+ end
+ if post then
+ sweepnode=disc
+ sweeptype="post"
+ local new,ok=c_run(post,...)
+ if ok then
+ post=new
+ renewed=true
+ end
+ end
+ if replace then
+ sweepnode=disc
+ sweeptype="replace"
+ local new,ok=c_run(replace,...)
+ if ok then
+ replace=new
+ renewed=true
+ end
+ end
+ sweepnode=nil
+ sweeptype=nil
+ if renewed then
+ setdisc(disc,pre,post,replace)
+ if trace_testruns then
+ report_disc("done",disc)
+ end
+ end
+ return getnext(disc),renewed
+end
+local nesting=0
+local function c_run_single(head,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler)
+ local done=false
+ local sweep=sweephead[head]
+ local start
+ if sweep then
+ start=sweep
+ sweephead[head]=false
+ else
+ start=head
+ end
+ while start do
+ local char,id=ischar(start,font)
+ if char then
+ local a
+ if attr then
+ a=getglyphdata(start)
+ end
+ if not a or (a==attr) then
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ local ok
+ head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
+ if ok then
+ done=true
+ end
+ end
+ if start then
+ start=getnext(start)
+ end
+ else
+ start=getnext(start)
+ end
+ elseif char==false then
+ return head,done
+ elseif sweep then
+ return head,done
+ else
+ start=getnext(start)
+ end
+ end
+ return head,done
+end
+local function t_run_single(start,stop,font,attr,lookupcache)
+ local lastd=nil
+ while start~=stop do
+ local char=ischar(start,font)
+ if char then
+ local a
+ if attr then
+ a=getglyphdata(start)
+ end
+ local startnext=getnext(start)
+ if not a or (a==attr) then
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ local s=startnext
+ local ss=nil
+ local sstop=s==stop
+ if not s then
+ s=ss
+ ss=nil
+ end
+ while getid(s)==disc_code do
+ ss=getnext(s)
+ s=getreplace(s)
+ if not s then
+ s=ss
+ ss=nil
+ end
+ end
+ local l=nil
+ local d=0
+ while s do
+ local char=ischar(s,font)
+ if char then
+ local lg=lookupmatch[char]
+ if lg then
+ if sstop then
+ d=1
+ elseif d>0 then
+ d=d+1
+ end
+ l=lg
+ s=getnext(s)
+ sstop=s==stop
+ if not s then
+ s=ss
+ ss=nil
+ end
+ while getid(s)==disc_code do
+ ss=getnext(s)
+ s=getreplace(s)
+ if not s then
+ s=ss
+ ss=nil
+ end
+ end
+ lookupmatch=lg
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+ if l and l.ligature then
+ lastd=d
+ end
+ else
+ end
+ else
+ end
+ if lastd then
+ return lastd
+ end
+ start=startnext
+ else
+ break
+ end
+ end
+ return 0
+end
+local function k_run_single(sub,injection,last,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler)
+ local a
+ if attr then
+ a=getglyphdata(sub)
+ end
+ if not a or (a==attr) then
+ for n in nextnode,sub do
+ if n==last then
+ break
+ end
+ local char=ischar(n,font)
+ if char then
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ local h,d,ok=handler(sub,n,dataset,sequence,lookupmatch,rlmode,skiphash,step,injection)
+ if ok then
+ return true
+ end
+ end
+ end
+ end
+ end
+end
+local function c_run_multiple(head,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler)
+ local done=false
+ local sweep=sweephead[head]
+ local start
+ if sweep then
+ start=sweep
+ sweephead[head]=false
+ else
+ start=head
+ end
+ while start do
+ local char=ischar(start,font)
+ if char then
+ local a
+ if attr then
+ a=getglyphdata(start)
+ end
+ if not a or (a==attr) then
+ for i=1,nofsteps do
+ local step=steps[i]
+ local lookupcache=step.coverage
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ local ok
+ head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
+ if ok then
+ done=true
+ break
+ elseif not start then
+ break
+ end
+ end
+ end
+ if start then
+ start=getnext(start)
+ end
+ else
+ start=getnext(start)
+ end
+ elseif char==false then
+ return head,done
+ elseif sweep then
+ return head,done
+ else
+ start=getnext(start)
+ end
+ end
+ return head,done
+end
+local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
+ local lastd=nil
+ while start~=stop do
+ local char=ischar(start,font)
+ if char then
+ local a
+ if attr then
+ a=getglyphdata(start)
+ end
+ local startnext=getnext(start)
+ if not a or (a==attr) then
+ for i=1,nofsteps do
+ local step=steps[i]
+ local lookupcache=step.coverage
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ local s=startnext
+ local ss=nil
+ local sstop=s==stop
+ if not s then
+ s=ss
+ ss=nil
+ end
+ while getid(s)==disc_code do
+ ss=getnext(s)
+ s=getreplace(s)
+ if not s then
+ s=ss
+ ss=nil
+ end
+ end
+ local l=nil
+ local d=0
+ while s do
+ local char=ischar(s)
+ if char then
+ local lg=lookupmatch[char]
+ if lg then
+ if sstop then
+ d=1
+ elseif d>0 then
+ d=d+1
+ end
+ l=lg
+ s=getnext(s)
+ sstop=s==stop
+ if not s then
+ s=ss
+ ss=nil
+ end
+ while getid(s)==disc_code do
+ ss=getnext(s)
+ s=getreplace(s)
+ if not s then
+ s=ss
+ ss=nil
+ end
+ end
+ lookupmatch=lg
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+ if l and l.ligature then
+ lastd=d
+ end
+ end
+ end
+ else
+ end
+ if lastd then
+ return lastd
+ end
+ start=startnext
+ else
+ break
+ end
+ end
+ return 0
+end
+local function k_run_multiple(sub,injection,last,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler)
+ local a
+ if attr then
+ a=getglyphdata(sub)
+ end
+ if not a or (a==attr) then
+ for n in nextnode,sub do
+ if n==last then
+ break
+ end
+ local char=ischar(n)
+ if char then
+ for i=1,nofsteps do
+ local step=steps[i]
+ local lookupcache=step.coverage
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ local h,d,ok=handler(sub,n,dataset,sequence,lookupmatch,rlmode,skiphash,step,injection)
+ if ok then
+ return true
+ end
+ end
+ end
+ end
+ end
+ end
+end
+local txtdirstate,pardirstate do
+ local getdirection=nuts.getdirection
+ local lefttoright=0
+ local righttoleft=1
+ txtdirstate=function(start,stack,top,rlparmode)
+ local dir,pop=getdirection(start)
+ if pop then
+ if top==1 then
+ return 0,rlparmode
+ else
+ top=top-1
+ if stack[top]==righttoleft then
+ return top,-1
+ else
+ return top,1
+ end
+ end
+ elseif dir==lefttoright then
+ top=top+1
+ stack[top]=lefttoright
+ return top,1
+ elseif dir==righttoleft then
+ top=top+1
+ stack[top]=righttoleft
+ return top,-1
+ else
+ return top,rlparmode
+ end
+ end
+ pardirstate=function(start)
+ local dir=getdirection(start)
+ if dir==lefttoright then
+ return 1,1
+ elseif dir==righttoleft then
+ return -1,-1
+ elseif dir=="TLT" then
+ return 1,1
+ elseif dir=="TRT" then
+ return -1,-1
+ else
+ return 0,0
+ end
+ end
+end
+otf.helpers=otf.helpers or {}
+otf.helpers.txtdirstate=txtdirstate
+otf.helpers.pardirstate=pardirstate
+do
+ local fastdisc=true
+ local testdics=false
+ directives.register("otf.fastdisc",function(v) fastdisc=v end)
+ local otfdataset=nil
+ local getfastdisc={ __index=function(t,k)
+ local v=usesfont(k,currentfont)
+ t[k]=v
+ return v
+ end }
+ local getfastspace={ __index=function(t,k)
+ local v=isspace(k,threshold) or false
+ t[k]=v
+ return v
+ end }
+ function otf.featuresprocessor(head,font,attr,direction,n)
+ local sequences=sequencelists[font]
+ nesting=nesting+1
+ if nesting==1 then
+ currentfont=font
+ tfmdata=fontdata[font]
+ descriptions=tfmdata.descriptions
+ characters=tfmdata.characters
+ local resources=tfmdata.resources
+ marks=resources.marks
+ classes=resources.classes
+ threshold,
+ factor=getthreshold(font)
+ checkmarks=tfmdata.properties.checkmarks
+ if not otfdataset then
+ otfdataset=otf.dataset
+ end
+ discs=fastdisc and n and n>1 and setmetatable({},getfastdisc)
+ spaces=setmetatable({},getfastspace)
+ elseif currentfont~=font then
+ report_warning("nested call with a different font, level %s, quitting",nesting)
+ nesting=nesting-1
+ return head,false
+ end
+ if trace_steps then
+ checkstep(head)
+ end
+ local initialrl=0
+ if getid(head)==localpar_code and start_of_par(head) then
+ initialrl=pardirstate(head)
+ elseif direction==1 or direction=="TRT" then
+ initialrl=-1
+ end
+ local datasets=otfdataset(tfmdata,font,attr)
+ local dirstack={ nil }
+ sweephead={}
+ for s=1,#datasets do
+ local dataset=datasets[s]
+ local attribute=dataset[2]
+ local sequence=dataset[3]
+ local rlparmode=initialrl
+ local topstack=0
+ local typ=sequence.type
+ local gpossing=typ=="gpos_single" or typ=="gpos_pair"
+ local forcetestrun=typ=="gsub_ligature"
+ local handler=handlers[typ]
+ local steps=sequence.steps
+ local nofsteps=sequence.nofsteps
+ local skiphash=sequence.skiphash
+ if not steps then
+ local h,ok=handler(head,dataset,sequence,initialrl,font,attr)
+ if h and h~=head then
+ head=h
+ end
+ elseif typ=="gsub_reversecontextchain" then
+ local start=find_node_tail(head)
+ local rlmode=0
+ local merged=steps.merged
+ while start do
+ local char=ischar(start,font)
+ if char then
+ local m=merged[char]
+ if m then
+ local a
+ if attr then
+ a=getglyphdata(start)
+ end
+ if not a or (a==attr) then
+ for i=m[1],m[2] do
+ local step=steps[i]
+ local lookupcache=step.coverage
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ local ok
+ head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
+ if ok then
+ break
+ end
+ end
+ end
+ if start then
+ start=getprev(start)
+ end
+ else
+ start=getprev(start)
+ end
+ else
+ start=getprev(start)
+ end
+ else
+ start=getprev(start)
+ end
+ end
+ else
+ local start=head
+ local rlmode=initialrl
+ if nofsteps==1 then
+ local step=steps[1]
+ local lookupcache=step.coverage
+ while start do
+ local char,id=ischar(start,font)
+ if char then
+ if skiphash and skiphash[char] then
+ start=getnext(start)
+ else
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ local a
+ if attr then
+ if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then
+ a=true
+ end
+ elseif not attribute or getstate(start,attribute) then
+ a=true
+ end
+ if a then
+ local ok,df
+ head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
+ if df then
+ elseif start then
+ start=getnext(start)
+ end
+ else
+ start=getnext(start)
+ end
+ else
+ start=getnext(start)
+ end
+ end
+ elseif char==false or id==glue_code then
+ start=getnext(start)
+ elseif id==disc_code then
+ if not discs or discs[start]==true then
+ local ok
+ if gpossing then
+ start,ok=kernrun(start,k_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler)
+ elseif forcetestrun then
+ start,ok=testrun(start,t_run_single,c_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler)
+ else
+ start,ok=comprun(start,c_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler)
+ end
+ else
+ start=getnext(start)
+ end
+ elseif id==math_code then
+ start=getnext(end_of_math(start))
+ elseif id==dir_code then
+ topstack,rlmode=txtdirstate(start,dirstack,topstack,rlparmode)
+ start=getnext(start)
+ else
+ start=getnext(start)
+ end
+ end
+ else
+ local merged=steps.merged
+ while start do
+ local char,id=ischar(start,font)
+ if char then
+ if skiphash and skiphash[char] then
+ start=getnext(start)
+ else
+ local m=merged[char]
+ if m then
+ local a
+ if attr then
+ if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then
+ a=true
+ end
+ elseif not attribute or getstate(start,attribute) then
+ a=true
+ end
+ if a then
+ local ok,df
+ for i=m[1],m[2] do
+ local step=steps[i]
+ local lookupcache=step.coverage
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
+ if df then
+ break
+ elseif ok then
+ break
+ elseif not start then
+ break
+ end
+ end
+ end
+ if df then
+ elseif start then
+ start=getnext(start)
+ end
+ else
+ start=getnext(start)
+ end
+ else
+ start=getnext(start)
+ end
+ end
+ elseif char==false or id==glue_code then
+ start=getnext(start)
+ elseif id==disc_code then
+ if not discs or discs[start]==true then
+ local ok
+ if gpossing then
+ start,ok=kernrun(start,k_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler)
+ elseif forcetestrun then
+ start,ok=testrun(start,t_run_multiple,c_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler)
+ else
+ start,ok=comprun(start,c_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler)
+ end
+ else
+ start=getnext(start)
+ end
+ elseif id==math_code then
+ start=getnext(end_of_math(start))
+ elseif id==dir_code then
+ topstack,rlmode=txtdirstate(start,dirstack,topstack,rlparmode)
+ start=getnext(start)
+ else
+ start=getnext(start)
+ end
+ end
+ end
+ end
+ if trace_steps then
+ registerstep(head)
+ end
+ end
+ nesting=nesting-1
+ return head
+ end
+ function otf.datasetpositionprocessor(head,font,direction,dataset)
+ currentfont=font
+ tfmdata=fontdata[font]
+ descriptions=tfmdata.descriptions
+ characters=tfmdata.characters
+ local resources=tfmdata.resources
+ marks=resources.marks
+ classes=resources.classes
+ threshold,
+ factor=getthreshold(font)
+ checkmarks=tfmdata.properties.checkmarks
+ if type(dataset)=="number" then
+ dataset=otfdataset(tfmdata,font,0)[dataset]
+ end
+ local sequence=dataset[3]
+ local typ=sequence.type
+ local handler=handlers[typ]
+ local steps=sequence.steps
+ local nofsteps=sequence.nofsteps
+ local done=false
+ local dirstack={ nil }
+ local start=head
+ local initialrl=(direction==1 or direction=="TRT") and -1 or 0
+ local rlmode=initialrl
+ local rlparmode=initialrl
+ local topstack=0
+ local merged=steps.merged
+ local position=0
+ while start do
+ local char,id=ischar(start,font)
+ if char then
+ position=position+1
+ local m=merged[char]
+ if m then
+ if skiphash and skiphash[char] then
+ start=getnext(start)
+ else
+ for i=m[1],m[2] do
+ local step=steps[i]
+ local lookupcache=step.coverage
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ local ok
+ head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
+ if ok then
+ break
+ elseif not start then
+ break
+ end
+ end
+ end
+ if start then
+ start=getnext(start)
+ end
+ end
+ else
+ start=getnext(start)
+ end
+ elseif char==false or id==glue_code then
+ start=getnext(start)
+ elseif id==math_code then
+ start=getnext(end_of_math(start))
+ elseif id==dir_code then
+ topstack,rlmode=txtdirstate(start,dirstack,topstack,rlparmode)
+ start=getnext(start)
+ else
+ start=getnext(start)
+ end
+ end
+ return head
+ end
+end
+local plugins={}
+otf.plugins=plugins
+local report=logs.reporter("fonts")
+function otf.registerplugin(name,f)
+ if type(name)=="string" and type(f)=="function" then
+ plugins[name]={ name,f }
+ report()
+ report("plugin %a has been loaded, please be aware of possible side effects",name)
+ report()
+ if logs.pushtarget then
+ logs.pushtarget("log")
+ end
+ report("Plugins are not officially supported unless stated otherwise. This is because")
+ report("they bypass the regular font handling and therefore some features in ConTeXt")
+ report("(especially those related to fonts) might not work as expected or might not work")
+ report("at all. Some plugins are for testing and development only and might change")
+ report("whenever we feel the need for it.")
+ report()
+ if logs.poptarget then
+ logs.poptarget()
+ end
+ end
+end
+function otf.plugininitializer(tfmdata,value)
+ if type(value)=="string" then
+ tfmdata.shared.plugin=plugins[value]
+ end
+end
+function otf.pluginprocessor(head,font,attr,direction)
+ local s=fontdata[font].shared
+ local p=s and s.plugin
+ if p then
+ if trace_plugins then
+ report_process("applying plugin %a",p[1])
+ end
+ return p[2](head,font,attr,direction)
+ else
+ return head,false
+ end
+end
+function otf.featuresinitializer(tfmdata,value)
+end
+registerotffeature {
+ name="features",
+ description="features",
+ default=true,
+ initializers={
+ position=1,
+ node=otf.featuresinitializer,
+ plug=otf.plugininitializer,
+ },
+ processors={
+ node=otf.featuresprocessor,
+ plug=otf.pluginprocessor,
+ }
+}
+local function markinitializer(tfmdata,value)
+ local properties=tfmdata.properties
+ properties.checkmarks=value
+end
+registerotffeature {
+ name="checkmarks",
+ description="check mark widths",
+ default=true,
+ initializers={
+ node=markinitializer,
+ },
+}
+otf.handlers=handlers
+if context then
+ return
+else
+end
+local setspacekerns=nodes.injections.setspacekerns if not setspacekerns then os.exit() end
+local tag="kern"
+ function handlers.trigger_space_kerns(head,dataset,sequence,initialrl,font,attr)
+ local shared=fontdata[font].shared
+ local features=shared and shared.features
+ local enabled=features and features.spacekern and features[tag]
+ if enabled then
+ setspacekerns(font,sequence)
+ end
+ return head,enabled
+ end
+local function hasspacekerns(data)
+ local resources=data.resources
+ local sequences=resources.sequences
+ local validgpos=resources.features.gpos
+ if validgpos and sequences then
+ for i=1,#sequences do
+ local sequence=sequences[i]
+ local steps=sequence.steps
+ if steps and sequence.features[tag] then
+ local kind=sequence.type
+ if kind=="gpos_pair" or kind=="gpos_single" then
+ for i=1,#steps do
+ local step=steps[i]
+ local coverage=step.coverage
+ local rules=step.rules
+ if rules then
+ elseif not coverage then
+ elseif kind=="gpos_single" then
+ elseif kind=="gpos_pair" then
+ local format=step.format
+ if format=="move" or format=="kern" then
+ local kerns=coverage[32]
+ if kerns then
+ return true
+ end
+ for k,v in next,coverage do
+ if v[32] then
+ return true
+ end
+ end
+ elseif format=="pair" then
+ local kerns=coverage[32]
+ if kerns then
+ for k,v in next,kerns do
+ local one=v[1]
+ if one and one~=true then
+ return true
+ end
+ end
+ end
+ for k,v in next,coverage do
+ local kern=v[32]
+ if kern then
+ local one=kern[1]
+ if one and one~=true then
+ return true
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ return false
+end
+otf.readers.registerextender {
+ name="spacekerns",
+ action=function(data)
+ data.properties.hasspacekerns=hasspacekerns(data)
+ end
+}
+local function spaceinitializer(tfmdata,value)
+ local resources=tfmdata.resources
+ local spacekerns=resources and resources.spacekerns
+ if value and spacekerns==nil then
+ local rawdata=tfmdata.shared and tfmdata.shared.rawdata
+ local properties=rawdata.properties
+ if properties and properties.hasspacekerns then
+ local sequences=resources.sequences
+ local validgpos=resources.features.gpos
+ if validgpos and sequences then
+ local left={}
+ local right={}
+ local last=0
+ local feat=nil
+ for i=1,#sequences do
+ local sequence=sequences[i]
+ local steps=sequence.steps
+ if steps then
+ local kern=sequence.features[tag]
+ if kern then
+ local kind=sequence.type
+ if kind=="gpos_pair" or kind=="gpos_single" then
+ if feat then
+ for script,languages in next,kern do
+ local f=feat[script]
+ if f then
+ for l in next,languages do
+ f[l]=true
+ end
+ else
+ feat[script]=languages
+ end
+ end
+ else
+ feat=kern
+ end
+ for i=1,#steps do
+ local step=steps[i]
+ local coverage=step.coverage
+ local rules=step.rules
+ if rules then
+ elseif not coverage then
+ elseif kind=="gpos_single" then
+ elseif kind=="gpos_pair" then
+ local format=step.format
+ if format=="move" or format=="kern" then
+ local kerns=coverage[32]
+ if kerns then
+ for k,v in next,kerns do
+ right[k]=v
+ end
+ end
+ for k,v in next,coverage do
+ local kern=v[32]
+ if kern then
+ left[k]=kern
+ end
+ end
+ elseif format=="pair" then
+ local kerns=coverage[32]
+ if kerns then
+ for k,v in next,kerns do
+ local one=v[1]
+ if one and one~=true then
+ right[k]=one[3]
+ end
+ end
+ end
+ for k,v in next,coverage do
+ local kern=v[32]
+ if kern then
+ local one=kern[1]
+ if one and one~=true then
+ left[k]=one[3]
+ end
+ end
+ end
+ end
+ end
+ end
+ last=i
+ end
+ else
+ end
+ end
+ end
+ left=next(left) and left or false
+ right=next(right) and right or false
+ if left or right then
+ spacekerns={
+ left=left,
+ right=right,
+ }
+ if last>0 then
+ local triggersequence={
+ features={ [tag]=feat or { dflt={ dflt=true,} } },
+ flags=noflags,
+ name="trigger_space_kerns",
+ order={ tag },
+ type="trigger_space_kerns",
+ left=left,
+ right=right,
+ }
+ insert(sequences,last,triggersequence)
+ end
+ end
+ end
+ end
+ resources.spacekerns=spacekerns
+ end
+ return spacekerns
+end
+registerotffeature {
+ name="spacekern",
+ description="space kern injection",
+ default=true,
+ initializers={
+ node=spaceinitializer,
+ },
+}
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-ots”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-osd” 61f05fcf91add1aa5dac9bc8b235adc9] ---
+
+if not modules then modules={} end modules ['font-osd']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Kai Eigner, TAT Zetwerk / Hans Hagen, PRAGMA ADE",
+ copyright="TAT Zetwerk / PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local insert,imerge,copy,tohash=table.insert,table.imerge,table.copy,table.tohash
+local next,type=next,type
+local report=logs.reporter("otf","devanagari")
+fonts=fonts or {}
+fonts.analyzers=fonts.analyzers or {}
+fonts.analyzers.methods=fonts.analyzers.methods or { node={ otf={} } }
+local otf=fonts.handlers.otf
+local handlers=otf.handlers
+local methods=fonts.analyzers.methods
+local otffeatures=fonts.constructors.features.otf
+local registerotffeature=otffeatures.register
+local nuts=nodes.nuts
+local getnext=nuts.getnext
+local getprev=nuts.getprev
+local getboth=nuts.getboth
+local getid=nuts.getid
+local getchar=nuts.getchar
+local getfont=nuts.getfont
+local getsubtype=nuts.getsubtype
+local setlink=nuts.setlink
+local setnext=nuts.setnext
+local setprev=nuts.setprev
+local setchar=nuts.setchar
+local getprop=nuts.getprop
+local setprop=nuts.setprop
+local getstate=nuts.getstate
+local setstate=nuts.setstate
+local ischar=nuts.ischar
+local insert_node_after=nuts.insert_after
+local copy_node=nuts.copy
+local remove_node=nuts.remove
+local flush_list=nuts.flush_list
+local flush_node=nuts.flush_node
+local copyinjection=nodes.injections.copy
+local unsetvalue=attributes.unsetvalue
+local fontdata=fonts.hashes.identifiers
+local a_syllabe=attributes.private('syllabe')
+local dotted_circle=0x25CC
+local c_nbsp=0x00A0
+local c_zwnj=0x200C
+local c_zwj=0x200D
+local states=fonts.analyzers.states
+local s_rphf=states.rphf
+local s_half=states.half
+local s_pref=states.pref
+local s_blwf=states.blwf
+local s_pstf=states.pstf
+local s_init=states.init
+local replace_all_nbsp=nil
+replace_all_nbsp=function(head)
+ replace_all_nbsp=typesetters and typesetters.characters and typesetters.characters.replacenbspaces or function(head)
+ return head
+ end
+ return replace_all_nbsp(head)
+end
+local processcharacters=nil
+if context then
+ local fontprocesses=fonts.hashes.processes
+ function processcharacters(head,font)
+ local processors=fontprocesses[font]
+ for i=1,#processors do
+ head=processors[i](head,font,0)
+ end
+ return head
+ end
+else
+ function processcharacters(head,font)
+ local processors=fontdata[font].shared.processes
+ for i=1,#processors do
+ head=processors[i](head,font,0)
+ end
+ return head
+ end
+end
+local indicgroups=characters and characters.indicgroups
+if not indicgroups and characters then
+ local indic={
+ c={},
+ i={},
+ d={},
+ m={},
+ s={},
+ o={},
+ }
+ local indicmarks={
+ l={},
+ t={},
+ b={},
+ r={},
+ s={},
+ }
+ local indicclasses={
+ nukta={},
+ halant={},
+ ra={},
+ anudatta={},
+ }
+ local indicorders={
+ bp={},
+ ap={},
+ bs={},
+ as={},
+ bh={},
+ ah={},
+ bm={},
+ am={},
+ }
+ for k,v in next,characters.data do
+ local i=v.indic
+ if i then
+ indic[i][k]=true
+ i=v.indicmark
+ if i then
+ if i=="s" then
+ local s=v.specials
+ indicmarks[i][k]={ s[2],s[3] }
+ else
+ indicmarks[i][k]=true
+ end
+ end
+ i=v.indicclass
+ if i then
+ indicclasses[i][k]=true
+ end
+ i=v.indicorder
+ if i then
+ indicorders[i][k]=true
+ end
+ end
+ end
+ indicgroups={
+ consonant=indic.c,
+ independent_vowel=indic.i,
+ dependent_vowel=indic.d,
+ vowel_modifier=indic.m,
+ stress_tone_mark=indic.s,
+ pre_mark=indicmarks.l,
+ above_mark=indicmarks.t,
+ below_mark=indicmarks.b,
+ post_mark=indicmarks.r,
+ twopart_mark=indicmarks.s,
+ nukta=indicclasses.nukta,
+ halant=indicclasses.halant,
+ ra=indicclasses.ra,
+ anudatta=indicclasses.anudatta,
+ before_postscript=indicorders.bp,
+ after_postscript=indicorders.ap,
+ before_half=indicorders.bh,
+ after_half=indicorders.ah,
+ before_subscript=indicorders.bs,
+ after_subscript=indicorders.as,
+ before_main=indicorders.bm,
+ after_main=indicorders.am,
+ }
+ indic=nil
+ indicmarks=nil
+ indicclasses=nil
+ indicorders=nil
+ characters.indicgroups=indicgroups
+end
+local consonant=indicgroups.consonant
+local independent_vowel=indicgroups.independent_vowel
+local dependent_vowel=indicgroups.dependent_vowel
+local vowel_modifier=indicgroups.vowel_modifier
+local stress_tone_mark=indicgroups.stress_tone_mark
+local pre_mark=indicgroups.pre_mark
+local above_mark=indicgroups.above_mark
+local below_mark=indicgroups.below_mark
+local post_mark=indicgroups.post_mark
+local twopart_mark=indicgroups.twopart_mark
+local nukta=indicgroups.nukta
+local halant=indicgroups.halant
+local ra=indicgroups.ra
+local anudatta=indicgroups.anudatta
+local before_postscript=indicgroups.before_postscript
+local after_postscript=indicgroups.after_postscript
+local before_half=indicgroups.before_half
+local after_half=indicgroups.after_half
+local before_subscript=indicgroups.before_subscript
+local after_subscript=indicgroups.after_subscript
+local before_main=indicgroups.before_main
+local after_main=indicgroups.after_main
+local mark_four=table.merged (
+ pre_mark,
+ above_mark,
+ below_mark,
+ post_mark
+)
+local mark_above_below_post=table.merged (
+ above_mark,
+ below_mark,
+ post_mark
+)
+local zw_char={
+ [c_zwnj]=true,
+ [c_zwj ]=true,
+}
+local dflt_true={
+ dflt=true,
+}
+local two_defaults={}
+local one_defaults={}
+local false_flags={ false,false,false,false }
+local sequence_reorder_matras={
+ features={ dv01=two_defaults },
+ flags=false_flags,
+ name="dv01_reorder_matras",
+ order={ "dv01" },
+ type="devanagari_reorder_matras",
+ nofsteps=1,
+ steps={
+ {
+ coverage=pre_mark,
+ }
+ }
+}
+local sequence_reorder_reph={
+ features={ dv02=two_defaults },
+ flags=false_flags,
+ name="dv02_reorder_reph",
+ order={ "dv02" },
+ type="devanagari_reorder_reph",
+ nofsteps=1,
+ steps={
+ {
+ coverage={},
+ }
+ }
+}
+local sequence_reorder_pre_base_reordering_consonants={
+ features={ dv03=one_defaults },
+ flags=false_flags,
+ name="dv03_reorder_pre_base_reordering_consonants",
+ order={ "dv03" },
+ type="devanagari_reorder_pre_base_reordering_consonants",
+ nofsteps=1,
+ steps={
+ {
+ coverage={},
+ }
+ }
+}
+local sequence_remove_joiners={
+ features={ dv04=one_defaults },
+ flags=false_flags,
+ name="dv04_remove_joiners",
+ order={ "dv04" },
+ type="devanagari_remove_joiners",
+ nofsteps=1,
+ steps={
+ {
+ coverage=zw_char,
+ },
+ }
+}
+local basic_shaping_forms={
+ akhn=true,
+ blwf=true,
+ cjct=true,
+ half=true,
+ nukt=true,
+ pref=true,
+ pstf=true,
+ rkrf=true,
+ rphf=true,
+ vatu=true,
+ locl=true,
+}
+local valid={
+ abvs=true,
+ akhn=true,
+ blwf=true,
+ calt=true,
+ cjct=true,
+ half=true,
+ haln=true,
+ nukt=true,
+ pref=true,
+ pres=true,
+ pstf=true,
+ psts=true,
+ rkrf=true,
+ rphf=true,
+ vatu=true,
+ pres=true,
+ abvs=true,
+ blws=true,
+ psts=true,
+ haln=true,
+ calt=true,
+ locl=true,
+}
+local scripts={}
+local scripts_one={ "deva","mlym","beng","gujr","guru","knda","orya","taml","telu" }
+local scripts_two={ "dev2","mlm2","bng2","gjr2","gur2","knd2","ory2","tml2","tel2" }
+local nofscripts=#scripts_one
+for i=1,nofscripts do
+ local one=scripts_one[i]
+ local two=scripts_two[i]
+ scripts[one]=true
+ scripts[two]=true
+ two_defaults[two]=dflt_true
+ one_defaults[one]=dflt_true
+ one_defaults[two]=dflt_true
+end
+local function valid_one(s) for i=1,nofscripts do if s[scripts_one[i]] then return true end end end
+local function valid_two(s) for i=1,nofscripts do if s[scripts_two[i]] then return true end end end
+local function initializedevanagi(tfmdata)
+ local script,language=otf.scriptandlanguage(tfmdata,attr)
+ if scripts[script] then
+ local resources=tfmdata.resources
+ local devanagari=resources.devanagari
+ if not devanagari then
+ report("adding devanagari features to font")
+ local gsubfeatures=resources.features.gsub
+ local sequences=resources.sequences
+ local sharedfeatures=tfmdata.shared.features
+ gsubfeatures["dv01"]=two_defaults
+ gsubfeatures["dv02"]=two_defaults
+ gsubfeatures["dv03"]=one_defaults
+ gsubfeatures["dv04"]=one_defaults
+ local reorder_pre_base_reordering_consonants=copy(sequence_reorder_pre_base_reordering_consonants)
+ local reorder_reph=copy(sequence_reorder_reph)
+ local reorder_matras=copy(sequence_reorder_matras)
+ local remove_joiners=copy(sequence_remove_joiners)
+ local lastmatch=0
+ for s=1,#sequences do
+ local features=sequences[s].features
+ if features then
+ for k,v in next,features do
+ if k=="locl" then
+ local steps=sequences[s].steps
+ local nofsteps=sequences[s].nofsteps
+ for i=1,nofsteps do
+ local step=steps[i]
+ local coverage=step.coverage
+ if coverage then
+ for k,v in next,pre_mark do
+ local locl=coverage[k]
+ if locl then
+ if #locl>0 then
+ for j=1,#locl do
+ local ck=locl[j]
+ local f=ck[4]
+ local chainlookups=ck[6]
+ if chainlookups then
+ local chainlookup=chainlookups[f]
+ for j=1,#chainlookup do
+ local chainstep=chainlookup[j]
+ local steps=chainstep.steps
+ local nofsteps=chainstep.nofsteps
+ for i=1,nofsteps do
+ local step=steps[i]
+ local coverage=step.coverage
+ if coverage then
+ locl=coverage[k]
+ end
+ end
+ end
+ end
+ end
+ end
+ if locl then
+ reorder_matras.steps[1].coverage[locl]=true
+ end
+ end
+ end
+ end
+ end
+ end
+ if basic_shaping_forms[k] then
+ lastmatch=lastmatch+1
+ if s~=lastmatch then
+ table.insert(sequences,lastmatch,table.remove(sequences,s))
+ end
+ end
+ end
+ end
+ end
+ local insertindex=lastmatch+1
+ if tfmdata.properties.language then
+ dflt_true[tfmdata.properties.language]=true
+ end
+ insert(sequences,insertindex,reorder_pre_base_reordering_consonants)
+ insert(sequences,insertindex,reorder_reph)
+ insert(sequences,insertindex,reorder_matras)
+ insert(sequences,insertindex,remove_joiners)
+ local blwfcache={}
+ local vatucache={}
+ local pstfcache={}
+ local seqsubset={}
+ local rephstep={
+ coverage={}
+ }
+ local devanagari={
+ reph=false,
+ vattu=false,
+ blwfcache=blwfcache,
+ vatucache=vatucache,
+ pstfcache=pstfcache,
+ seqsubset=seqsubset,
+ reorderreph=rephstep,
+ }
+ reorder_reph.steps={ rephstep }
+ local pre_base_reordering_consonants={}
+ reorder_pre_base_reordering_consonants.steps[1].coverage=pre_base_reordering_consonants
+ resources.devanagari=devanagari
+ for s=1,#sequences do
+ local sequence=sequences[s]
+ local steps=sequence.steps
+ local nofsteps=sequence.nofsteps
+ local features=sequence.features
+ local has_rphf=features.rphf
+ local has_blwf=features.blwf
+ local has_vatu=features.vatu
+ local has_pstf=features.pstf
+ if has_rphf and has_rphf[script] then
+ devanagari.reph=true
+ elseif (has_blwf and has_blwf[script] ) or (has_vatu and has_vatu[script] ) then
+ devanagari.vattu=true
+ for i=1,nofsteps do
+ local step=steps[i]
+ local coverage=step.coverage
+ if coverage then
+ for k,v in next,coverage do
+ for h,w in next,halant do
+ if v[h] then
+ if not blwfcache[k] then
+ blwfcache[k]=v
+ end
+ end
+ if has_vatu and has_vatu[script] and not vatucache[k] then
+ vatucache[k]=v
+ end
+ end
+ end
+ end
+ end
+ elseif has_pstf and has_pstf[script] then
+ for i=1,nofsteps do
+ local step=steps[i]
+ local coverage=step.coverage
+ if coverage then
+ for k,v in next,coverage do
+ if not pstfcache[k] then
+ pstfcache[k]=v
+ end
+ end
+ for k,v in next,ra do
+ local r=coverage[k]
+ if r then
+ local found=false
+ if #r>0 then
+ for j=1,#r do
+ local ck=r[j]
+ local f=ck[4]
+ local chainlookups=ck[6]
+ if chainlookups and chainlookups[f] then
+ local chainlookup=chainlookups[f]
+ for j=1,#chainlookup do
+ local chainstep=chainlookup[j]
+ local steps=chainstep.steps
+ local nofsteps=chainstep.nofsteps
+ for i=1,nofsteps do
+ local step=steps[i]
+ local coverage=step.coverage
+ if coverage then
+ local h=coverage[k]
+ if h then
+ for k,v in next,h do
+ found=v and v.ligature
+ if found then
+ pre_base_reordering_consonants[found]=true
+ break
+ end
+ end
+ if found then
+ break
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ else
+ for k,v in next,r do
+ found=v and v.ligature
+ if found then
+ pre_base_reordering_consonants[found]=true
+ break
+ end
+ end
+ end
+ if found then
+ break
+ end
+ end
+ end
+ end
+ end
+ end
+ for kind,spec in next,features do
+ if valid[kind] and valid_two(spec)then
+ for i=1,nofsteps do
+ local step=steps[i]
+ local coverage=step.coverage
+ if coverage then
+ local reph,rephbase=false,false
+ if kind=="rphf" then
+ for k,v in next,ra do
+ local r=coverage[k]
+ if r then
+ rephbase=k
+ local h=false
+ if #r>0 then
+ for j=1,#r do
+ local ck=r[j]
+ local f=ck[4]
+ local chainlookups=ck[6]
+ if chainlookups then
+ local chainlookup=chainlookups[f]
+ for j=1,#chainlookup do
+ local chainstep=chainlookup[j]
+ local steps=chainstep.steps
+ local nofsteps=chainstep.nofsteps
+ for i=1,nofsteps do
+ local step=steps[i]
+ local coverage=step.coverage
+ if coverage then
+ local r=coverage[k]
+ if r then
+ for k,v in next,halant do
+ local h=r[k]
+ if h then
+ reph=h.ligature or false
+ break
+ end
+ end
+ if h then
+ break
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ else
+ for k,v in next,halant do
+ local h=r[k]
+ if h then
+ reph=h.ligature or false
+ break
+ end
+ end
+ end
+ if reph then
+ break
+ end
+ end
+ end
+ end
+ seqsubset[#seqsubset+1]={ kind,coverage,reph,rephbase }
+ end
+ end
+ end
+ if kind=="pref" then
+ local steps=sequence.steps
+ local nofsteps=sequence.nofsteps
+ for i=1,nofsteps do
+ local step=steps[i]
+ local coverage=step.coverage
+ if coverage then
+ for k,v in next,halant do
+ local h=coverage[k]
+ if h then
+ local found=false
+ if #h>0 then
+ for j=1,#h do
+ local ck=h[j]
+ local f=ck[4]
+ local chainlookups=ck[6]
+ if chainlookups then
+ local chainlookup=chainlookups[f]
+ for j=1,#chainlookup do
+ local chainstep=chainlookup[j]
+ local steps=chainstep.steps
+ local nofsteps=chainstep.nofsteps
+ for i=1,nofsteps do
+ local step=steps[i]
+ local coverage=step.coverage
+ if coverage then
+ local h=coverage[k]
+ if h then
+ for k,v in next,h do
+ found=v and v.ligature
+ if found then
+ pre_base_reordering_consonants[found]=true
+ break
+ end
+ end
+ if found then
+ break
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ else
+ for k,v in next,h do
+ found=v and v.ligature
+ if found then
+ pre_base_reordering_consonants[found]=true
+ break
+ end
+ end
+ end
+ if found then
+ break
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if two_defaults[script] then
+ sharedfeatures["dv01"]=true
+ sharedfeatures["dv02"]=true
+ sharedfeatures["dv03"]=true
+ sharedfeatures["dv04"]=true
+ elseif one_defaults[script] then
+ sharedfeatures["dv03"]=true
+ sharedfeatures["dv04"]=true
+ end
+ if script=="mlym" or script=="taml" then
+ devanagari.left_matra_before_base=true
+ end
+ end
+ end
+end
+registerotffeature {
+ name="devanagari",
+ description="inject additional features",
+ default=true,
+ initializers={
+ node=initializedevanagi,
+ },
+}
+local show_syntax_errors=false
+local function inject_syntax_error(head,current,char)
+ local signal=copy_node(current)
+ copyinjection(signal,current)
+ if pre_mark[char] then
+ setchar(signal,dotted_circle)
+ else
+ setchar(current,dotted_circle)
+ end
+ return insert_node_after(head,current,signal)
+end
+local function initialize_one(font,attr)
+ local tfmdata=fontdata[font]
+ local datasets=otf.dataset(tfmdata,font,attr)
+ local devanagaridata=datasets.devanagari
+ if not devanagaridata then
+ devanagaridata={
+ reph=false,
+ vattu=false,
+ blwfcache={},
+ vatucache={},
+ pstfcache={},
+ }
+ datasets.devanagari=devanagaridata
+ local resources=tfmdata.resources
+ local devanagari=resources.devanagari
+ for s=1,#datasets do
+ local dataset=datasets[s]
+ if dataset and dataset[1] then
+ local kind=dataset[4]
+ if kind=="rphf" then
+ devanagaridata.reph=true
+ elseif kind=="blwf" or kind=="vatu" then
+ devanagaridata.vattu=true
+ devanagaridata.blwfcache=devanagari.blwfcache
+ devanagaridata.vatucache=devanagari.vatucache
+ devanagaridata.pstfcache=devanagari.pstfcache
+ end
+ end
+ end
+ end
+ return devanagaridata.reph,devanagaridata.vattu,devanagaridata.blwfcache,devanagaridata.vatucache,devanagaridata.pstfcache
+end
+local function contextchain(contexts,n)
+ local char=getchar(n)
+ for k=1,#contexts do
+ local ck=contexts[k]
+ local seq=ck[3]
+ local f=ck[4]
+ local l=ck[5]
+ if (l-f)==1 and seq[f+1][char] then
+ local ok=true
+ local c=n
+ for i=l+1,#seq do
+ c=getnext(c)
+ if not c or not seq[i][ischar(c)] then
+ ok=false
+ break
+ end
+ end
+ if ok then
+ c=getprev(n)
+ for i=1,f-1 do
+ c=getprev(c)
+ if not c or not seq[f-i][ischar(c)] then
+ ok=false
+ end
+ end
+ end
+ if ok then
+ return true
+ end
+ end
+ end
+ return false
+end
+local function order_matras(c)
+ local cn=getnext(c)
+ local char=getchar(cn)
+ while dependent_vowel[char] do
+ local next=getnext(cn)
+ local cc=c
+ local cchar=getchar(cc)
+ while cc~=cn do
+ if (above_mark[char] and (below_mark[cchar] or post_mark[cchar])) or (below_mark[char] and (post_mark[cchar])) then
+ local prev,next=getboth(cn)
+ if next then
+ setprev(next,prev)
+ end
+ setnext(prev,next)
+ setnext(getprev(cc),cn)
+ setprev(cn,getprev(cc))
+ setnext(cn,cc)
+ setprev(cc,cn)
+ break
+ end
+ cc=getnext(cc)
+ cchar=getchar(cc)
+ end
+ cn=next
+ char=getchar(cn)
+ end
+end
+local function reorder_one(head,start,stop,font,attr,nbspaces)
+ local reph,vattu,blwfcache,vatucache,pstfcache=initialize_one(font,attr)
+ local devanagari=fontdata[font].resources.devanagari
+ local current=start
+ local n=getnext(start)
+ local base=nil
+ local firstcons=nil
+ local lastcons=nil
+ local basefound=false
+ if reph and ra[getchar(start)] and halant[getchar(n)] then
+ if n==stop then
+ return head,stop,nbspaces
+ end
+ if getchar(getnext(n))==c_zwj then
+ current=start
+ else
+ current=getnext(n)
+ setstate(start,s_rphf)
+ end
+ end
+ if getchar(current)==c_nbsp then
+ if current==stop then
+ stop=getprev(stop)
+ head=remove_node(head,current)
+ flush_node(current)
+ return head,stop,nbspaces
+ else
+ nbspaces=nbspaces+1
+ base=current
+ firstcons=current
+ lastcons=current
+ current=getnext(current)
+ if current~=stop then
+ local char=getchar(current)
+ if nukta[char] then
+ current=getnext(current)
+ char=getchar(current)
+ end
+ if char==c_zwj and current~=stop then
+ local next=getnext(current)
+ if next~=stop and halant[getchar(next)] then
+ current=next
+ next=getnext(current)
+ local tmp=next and getnext(next) or nil
+ local changestop=next==stop
+ local tempcurrent=copy_node(next)
+ copyinjection(tempcurrent,next)
+ local nextcurrent=copy_node(current)
+ copyinjection(nextcurrent,current)
+ setlink(tempcurrent,nextcurrent)
+ setstate(tempcurrent,s_blwf)
+ tempcurrent=processcharacters(tempcurrent,font)
+ setstate(tempcurrent,unsetvalue)
+ if getchar(next)==getchar(tempcurrent) then
+ flush_list(tempcurrent)
+ if show_syntax_errors then
+ head,current=inject_syntax_error(head,current,char)
+ end
+ else
+ setchar(current,getchar(tempcurrent))
+ local freenode=getnext(current)
+ setlink(current,tmp)
+ flush_node(freenode)
+ flush_list(tempcurrent)
+ if changestop then
+ stop=current
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ while not basefound do
+ local char=getchar(current)
+ if consonant[char] then
+ setstate(current,s_half)
+ if not firstcons then
+ firstcons=current
+ end
+ lastcons=current
+ if not base then
+ base=current
+ elseif blwfcache[char] then
+ setstate(current,s_blwf)
+ elseif pstfcache[char] then
+ setstate(current,s_pstf)
+ else
+ base=current
+ end
+ end
+ basefound=current==stop
+ current=getnext(current)
+ end
+ if base~=lastcons then
+ local np=base
+ local n=getnext(base)
+ local ch=getchar(n)
+ if nukta[ch] then
+ np=n
+ n=getnext(n)
+ ch=getchar(n)
+ end
+ if halant[ch] then
+ if lastcons~=stop then
+ local ln=getnext(lastcons)
+ if nukta[getchar(ln)] then
+ lastcons=ln
+ end
+ end
+ local nn=getnext(n)
+ local ln=getnext(lastcons)
+ setlink(np,nn)
+ setnext(lastcons,n)
+ if ln then
+ setprev(ln,n)
+ end
+ setnext(n,ln)
+ setprev(n,lastcons)
+ if lastcons==stop then
+ stop=n
+ end
+ end
+ end
+ n=getnext(start)
+ if n~=stop and ra[getchar(start)] and halant[getchar(n)] and not zw_char[getchar(getnext(n))] then
+ local matra=base
+ if base~=stop then
+ local next=getnext(base)
+ if dependent_vowel[getchar(next)] then
+ matra=next
+ end
+ end
+ local sp=getprev(start)
+ local nn=getnext(n)
+ local mn=getnext(matra)
+ setlink(sp,nn)
+ setlink(matra,start)
+ setlink(n,mn)
+ if head==start then
+ head=nn
+ end
+ start=nn
+ if matra==stop then
+ stop=n
+ end
+ end
+ local current=start
+ while current~=stop do
+ local next=getnext(current)
+ if next~=stop and halant[getchar(next)] and getchar(getnext(next))==c_zwnj then
+ setstate(current,unsetvalue)
+ end
+ current=next
+ end
+ if base~=stop and getstate(base) then
+ local next=getnext(base)
+ if halant[getchar(next)] and not (next~=stop and getchar(getnext(next))==c_zwj) then
+ setstate(base,unsetvalue)
+ end
+ end
+ local current,allreordered,moved=start,false,{ [base]=true }
+ local a,b,p,bn=base,base,base,getnext(base)
+ if base~=stop and nukta[getchar(bn)] then
+ a,b,p=bn,bn,bn
+ end
+ while not allreordered do
+ local c=current
+ local n=getnext(current)
+ local l=nil
+ if c~=stop then
+ local ch=getchar(n)
+ if nukta[ch] then
+ c=n
+ n=getnext(n)
+ ch=getchar(n)
+ end
+ if c~=stop then
+ if halant[ch] then
+ c=n
+ n=getnext(n)
+ ch=getchar(n)
+ end
+ local tpm=twopart_mark[ch]
+ while tpm do
+ local extra=copy_node(n)
+ copyinjection(extra,n)
+ ch=tpm[1]
+ setchar(n,ch)
+ setchar(extra,tpm[2])
+ head=insert_node_after(head,current,extra)
+ tpm=twopart_mark[ch]
+ end
+ while c~=stop and dependent_vowel[ch] do
+ c=n
+ n=getnext(n)
+ ch=getchar(n)
+ end
+ if c~=stop then
+ if vowel_modifier[ch] then
+ c=n
+ n=getnext(n)
+ ch=getchar(n)
+ end
+ if c~=stop and stress_tone_mark[ch] then
+ c=n
+ n=getnext(n)
+ end
+ end
+ end
+ end
+ local bp=getprev(firstcons)
+ local cn=getnext(current)
+ local last=getnext(c)
+ while cn~=last do
+ if pre_mark[getchar(cn)] then
+ if devanagari.left_matra_before_base then
+ local prev,next=getboth(cn)
+ setlink(prev,next)
+ if cn==stop then
+ stop=getprev(cn)
+ end
+ if base==start then
+ if head==start then
+ head=cn
+ end
+ start=cn
+ end
+ setlink(getprev(base),cn)
+ setlink(cn,base)
+ cn=next
+ else
+ if bp then
+ setnext(bp,cn)
+ end
+ local prev,next=getboth(cn)
+ if next then
+ setprev(next,prev)
+ end
+ setnext(prev,next)
+ if cn==stop then
+ stop=prev
+ end
+ setprev(cn,bp)
+ setlink(cn,firstcons)
+ if firstcons==start then
+ if head==start then
+ head=cn
+ end
+ start=cn
+ end
+ cn=next
+ end
+ elseif current~=base and dependent_vowel[getchar(cn)] then
+ local prev,next=getboth(cn)
+ if next then
+ setprev(next,prev)
+ end
+ setnext(prev,next)
+ if cn==stop then
+ stop=prev
+ end
+ setlink(b,cn,getnext(b))
+ order_matras(cn)
+ cn=next
+ elseif current==base and dependent_vowel[getchar(cn)] then
+ local cnn=getnext(cn)
+ order_matras(cn)
+ cn=cnn
+ while cn~=last and dependent_vowel[getchar(cn)] do
+ cn=getnext(cn)
+ end
+ else
+ cn=getnext(cn)
+ end
+ end
+ allreordered=c==stop
+ current=getnext(c)
+ end
+ if reph or vattu then
+ local current,cns=start,nil
+ while current~=stop do
+ local c=current
+ local n=getnext(current)
+ if ra[getchar(current)] and halant[getchar(n)] then
+ c=n
+ n=getnext(n)
+ local b,bn=base,base
+ while bn~=stop do
+ local next=getnext(bn)
+ if dependent_vowel[getchar(next)] then
+ b=next
+ end
+ bn=next
+ end
+ if getstate(current,s_rphf) then
+ if b~=current then
+ if current==start then
+ if head==start then
+ head=n
+ end
+ start=n
+ end
+ if b==stop then
+ stop=c
+ end
+ local prev=getprev(current)
+ setlink(prev,n)
+ local next=getnext(b)
+ setlink(c,next)
+ setlink(b,current)
+ end
+ elseif cns and getnext(cns)~=current then
+ local cp=getprev(current)
+ local cnsn=getnext(cns)
+ setlink(cp,n)
+ setlink(cns,current)
+ setlink(c,cnsn)
+ if c==stop then
+ stop=cp
+ break
+ end
+ current=getprev(n)
+ end
+ else
+ local char=getchar(current)
+ if consonant[char] then
+ cns=current
+ local next=getnext(cns)
+ if halant[getchar(next)] then
+ cns=next
+ end
+ if not vatucache[char] then
+ next=getnext(cns)
+ while dependent_vowel[getchar(next)] do
+ cns=next
+ next=getnext(cns)
+ end
+ end
+ elseif char==c_nbsp then
+ nbspaces=nbspaces+1
+ cns=current
+ local next=getnext(cns)
+ if halant[getchar(next)] then
+ cns=next
+ end
+ if not vatucache[char] then
+ next=getnext(cns)
+ while dependent_vowel[getchar(next)] do
+ cns=next
+ next=getnext(cns)
+ end
+ end
+ end
+ end
+ current=getnext(current)
+ end
+ end
+ if getchar(base)==c_nbsp then
+ nbspaces=nbspaces-1
+ if base==stop then
+ stop=getprev(stop)
+ end
+ head=remove_node(head,base)
+ flush_node(base)
+ end
+ return head,stop,nbspaces
+end
+function handlers.devanagari_reorder_matras(head,start)
+ local current=start
+ local startfont=getfont(start)
+ local startattr=getprop(start,a_syllabe)
+ while current do
+ local char=ischar(current,startfont)
+ local next=getnext(current)
+ if char and getprop(current,a_syllabe)==startattr then
+ if halant[char] then
+ if next then
+ local char=ischar(next,startfont)
+ if char and zw_char[char] and getprop(next,a_syllabe)==startattr then
+ current=next
+ next=getnext(current)
+ end
+ end
+ local startnext=getnext(start)
+ head=remove_node(head,start)
+ setlink(start,next)
+ setlink(current,start)
+ start=startnext
+ break
+ end
+ else
+ break
+ end
+ current=next
+ end
+ return head,start,true
+end
+local rephbase={}
+function handlers.devanagari_reorder_reph(head,start)
+ local current=getnext(start)
+ local startnext=nil
+ local startprev=nil
+ local startfont=getfont(start)
+ local startattr=getprop(start,a_syllabe)
+ ::step_1::
+ local char=ischar(start,startfont)
+ local rephbase=rephbase[startfont][char]
+ if char and after_subscript[rephbase] then
+ goto step_5
+ end
+ ::step_2::
+ if char and not after_postscript[rephbase] then
+ while current do
+ local char=ischar(current,startfont)
+ if char and getprop(current,a_syllabe)==startattr then
+ if halant[char] then
+ local next=getnext(current)
+ if next then
+ local nextchar=ischar(next,startfont)
+ if nextchar and zw_char[nextchar] and getprop(next,a_syllabe)==startattr then
+ current=next
+ next=getnext(current)
+ end
+ end
+ startnext=getnext(start)
+ head=remove_node(head,start)
+ setlink(start,next)
+ setlink(current,start)
+ start=startnext
+ startattr=getprop(start,a_syllabe)
+ break
+ end
+ current=getnext(current)
+ else
+ break
+ end
+ end
+ end
+ ::step_3::
+ if not startnext then
+ if char and after_main[rephbase] then
+ current=getnext(start)
+ while current do
+ local char=ischar(current,startfont)
+ if char and getprop(current,a_syllabe)==startattr then
+ if consonant[char] and not getstate(current,s_pref) then
+ startnext=getnext(start)
+ head=remove_node(head,start)
+ setlink(current,start)
+ setlink(start,getnext(current))
+ start=startnext
+ startattr=getprop(start,a_syllabe)
+ break
+ end
+ current=getnext(current)
+ else
+ break
+ end
+ end
+ end
+ end
+ ::step_4::
+ if not startnext then
+ if char and before_postscript[rephbase] then
+ current=getnext(start)
+ local c=nil
+ while current do
+ local char=ischar(current,startfont)
+ if char and getprop(current,a_syllabe)==startattr then
+ if getstate(current,s_pstf) then
+ startnext=getnext(start)
+ head=remove_node(head,start)
+ setlink(getprev(current),start)
+ setlink(start,current)
+ start=startnext
+ startattr=getprop(start,a_syllabe)
+ break
+ elseif not c and (vowel_modifier[char] or stress_tone_mark[char] ) then
+ c=current
+ end
+ current=getnext(current)
+ else
+ if c then
+ startnext=getnext(start)
+ head=remove_node(head,start)
+ setlink(getprev(c),start)
+ setlink(start,c)
+ start=startnext
+ startattr=getprop(start,a_syllabe)
+ end
+ break
+ end
+ end
+ end
+ end
+ ::step_5::
+ if not startnext then
+ current=getnext(start)
+ local c=nil
+ while current do
+ local char=ischar(current,startfont)
+ if char and getprop(current,a_syllabe)==startattr then
+ local state=getstate(current)
+ if before_subscript[rephbase] and (state==s_blwf or state==s_pstf) then
+ c=current
+ elseif after_subscript[rephbase] and (state==s_pstf) then
+ c=current
+ end
+ current=getnext(current)
+ else
+ break
+ end
+ end
+ if c then
+ startnext=getnext(start)
+ head=remove_node(head,start)
+ setlink(getprev(c),start)
+ setlink(start,c)
+ start=startnext
+ startattr=getprop(start,a_syllabe)
+ end
+ end
+ ::step_6::
+ if not startnext then
+ current=start
+ local next=getnext(current)
+ while next do
+ local nextchar=ischar(next,startfont)
+ if nextchar and getprop(next,a_syllabe)==startattr then
+ current=next
+ next=getnext(current)
+ else
+ break
+ end
+ end
+ if start~=current then
+ startnext=getnext(start)
+ head=remove_node(head,start)
+ setlink(start,getnext(current))
+ setlink(current,start)
+ start=startnext
+ end
+ end
+ return head,start,true
+end
+local reordered_pre_base_reordering_consonants={}
+function handlers.devanagari_reorder_pre_base_reordering_consonants(head,start)
+ if reordered_pre_base_reordering_consonants[start] then
+ return head,start,true
+ end
+ local current=start
+ local startfont=getfont(start)
+ local startattr=getprop(start,a_syllabe)
+ while current do
+ local char=ischar(current,startfont)
+ local next=getnext(current)
+ if char and getprop(current,a_syllabe)==startattr then
+ if halant[char] then
+ if next then
+ local char=ischar(next,startfont)
+ if char and zw_char[char] and getprop(next,a_syllabe)==startattr then
+ current=next
+ next=getnext(current)
+ end
+ end
+ local startnext=getnext(start)
+ head=remove_node(head,start)
+ setlink(start,next)
+ setlink(current,start)
+ reordered_pre_base_reordering_consonants[start]=true
+ start=startnext
+ return head,start,true
+ end
+ else
+ break
+ end
+ current=next
+ end
+ local startattr=getprop(start,a_syllabe)
+ local current=getprev(start)
+ while current and getprop(current,a_syllabe)==startattr do
+ local char=ischar(current)
+ if (not dependent_vowel[char] and (not getstate(current) or getstate(current,s_init))) then
+ startnext=getnext(start)
+ head=remove_node(head,start)
+ if current==head then
+ setlink(start,current)
+ head=start
+ else
+ setlink(getprev(current),start)
+ setlink(start,current)
+ end
+ reordered_pre_base_reordering_consonants[start]=true
+ start=startnext
+ break
+ end
+ current=getprev(current)
+ end
+ return head,start,true
+end
+function handlers.devanagari_remove_joiners(head,start,kind,lookupname,replacement)
+ local stop=getnext(start)
+ local font=getfont(start)
+ local last=start
+ while stop do
+ local char=ischar(stop,font)
+ if char and (char==c_zwnj or char==c_zwj) then
+ last=stop
+ stop=getnext(stop)
+ else
+ break
+ end
+ end
+ local prev=getprev(start)
+ if stop then
+ setnext(last)
+ setlink(prev,stop)
+ elseif prev then
+ setnext(prev)
+ end
+ if head==start then
+ head=stop
+ end
+ flush_list(start)
+ return head,stop,true
+end
+local function initialize_two(font,attr)
+ local devanagari=fontdata[font].resources.devanagari
+ if devanagari then
+ return devanagari.seqsubset or {},devanagari.reorderreph or {}
+ else
+ return {},{}
+ end
+end
+local function reorder_two(head,start,stop,font,attr,nbspaces)
+ local seqsubset,reorderreph=initialize_two(font,attr)
+ local halfpos=nil
+ local basepos=nil
+ local subpos=nil
+ local postpos=nil
+ reorderreph.coverage={}
+ rephbase[font]={}
+ for i=1,#seqsubset do
+ local subset=seqsubset[i]
+ local kind=subset[1]
+ local lookupcache=subset[2]
+ if kind=="rphf" then
+ reorderreph.coverage[subset[3]]=true
+ rephbase[font][subset[3]]=subset[4]
+ local current=start
+ local last=getnext(stop)
+ while current~=last do
+ if current~=stop then
+ local c=getchar(current)
+ local found=lookupcache[c]
+ if found then
+ local next=getnext(current)
+ if found[getchar(next)] or contextchain(found,next) then
+ local afternext=next~=stop and getnext(next)
+ if afternext and zw_char[getchar(afternext)] then
+ current=afternext
+ elseif current==start then
+ setstate(current,s_rphf)
+ current=next
+ else
+ current=next
+ end
+ end
+ end
+ end
+ current=getnext(current)
+ end
+ elseif kind=="pref" then
+ local current=start
+ local last=getnext(stop)
+ while current~=last do
+ if current~=stop then
+ local c=getchar(current)
+ local found=lookupcache[c]
+ if found then
+ local next=getnext(current)
+ if found[getchar(next)] or contextchain(found,next) then
+ if (not getstate(current) and not getstate(next)) then
+ setstate(current,s_pref)
+ setstate(next,s_pref)
+ current=next
+ end
+ end
+ end
+ end
+ current=getnext(current)
+ end
+ elseif kind=="half" then
+ local current=start
+ local last=getnext(stop)
+ while current~=last do
+ if current~=stop then
+ local c=getchar(current)
+ local found=lookupcache[c]
+ if found then
+ local next=getnext(current)
+ if found[getchar(next)] or contextchain(found,next) then
+ if next~=stop and getchar(getnext(next))==c_zwnj then
+ current=next
+ elseif (not getstate(current)) then
+ setstate(current,s_half)
+ if not halfpos then
+ halfpos=current
+ end
+ end
+ current=getnext(current)
+ end
+ end
+ end
+ current=getnext(current)
+ end
+ elseif kind=="blwf" or kind=="vatu" then
+ local current=start
+ local last=getnext(stop)
+ while current~=last do
+ if current~=stop then
+ local c=getchar(current)
+ local found=lookupcache[c]
+ if found then
+ local next=getnext(current)
+ if found[getchar(next)] or contextchain(found,next) then
+ if (not getstate(current) and not getstate(next)) then
+ setstate(current,s_blwf)
+ setstate(next,s_blwf)
+ current=next
+ subpos=current
+ end
+ end
+ end
+ end
+ current=getnext(current)
+ end
+ elseif kind=="pstf" then
+ local current=start
+ local last=getnext(stop)
+ while current~=last do
+ if current~=stop then
+ local c=getchar(current)
+ local found=lookupcache[c]
+ if found then
+ local next=getnext(current)
+ if found[getchar(next)] or contextchain(found,next) then
+ if (not getstate(current) and not getstate(next)) then
+ setstate(current,s_pstf)
+ setstate(next,s_pstf)
+ current=next
+ postpos=current
+ end
+ end
+ end
+ end
+ current=getnext(current)
+ end
+ end
+ end
+ local current,base,firstcons=start,nil,nil
+ if getstate(start,s_rphf) then
+ current=getnext(getnext(start))
+ end
+ if current~=getnext(stop) and getchar(current)==c_nbsp then
+ if current==stop then
+ stop=getprev(stop)
+ head=remove_node(head,current)
+ flush_node(current)
+ return head,stop,nbspaces
+ else
+ nbspaces=nbspaces+1
+ base=current
+ current=getnext(current)
+ if current~=stop then
+ local char=getchar(current)
+ if nukta[char] then
+ current=getnext(current)
+ char=getchar(current)
+ end
+ if char==c_zwj then
+ local next=getnext(current)
+ if current~=stop and next~=stop and halant[getchar(next)] then
+ current=next
+ next=getnext(current)
+ local tmp=getnext(next)
+ local changestop=next==stop
+ setnext(next)
+ setstate(current,s_pref)
+ current=processcharacters(current,font)
+ setstate(current,s_blwf)
+ current=processcharacters(current,font)
+ setstate(current,s_pstf)
+ current=processcharacters(current,font)
+ setstate(current,unsetvalue)
+ if halant[getchar(current)] then
+ setnext(getnext(current),tmp)
+ if show_syntax_errors then
+ head,current=inject_syntax_error(head,current,char)
+ end
+ else
+ setnext(current,tmp)
+ if changestop then
+ stop=current
+ end
+ end
+ end
+ end
+ end
+ end
+ else
+ local last=getnext(stop)
+ while current~=last do
+ local next=getnext(current)
+ if consonant[getchar(current)] then
+ if not (current~=stop and next~=stop and halant[getchar(next)] and getchar(getnext(next))==c_zwj) then
+ if not firstcons then
+ firstcons=current
+ end
+ local a=getstate(current)
+ if not (a==s_blwf or a==s_pstf or (a~=s_rphf and a~=s_blwf and ra[getchar(current)])) then
+ base=current
+ end
+ end
+ end
+ current=next
+ end
+ if not base then
+ base=firstcons
+ end
+ end
+ if not base then
+ if getstate(start,s_rphf) then
+ setstate(start,unsetvalue)
+ end
+ return head,stop,nbspaces
+ else
+ if getstate(base) then
+ setstate(base,unsetvalue)
+ end
+ basepos=base
+ end
+ if not halfpos then
+ halfpos=base
+ end
+ if not subpos then
+ subpos=base
+ end
+ if not postpos then
+ postpos=subpos or base
+ end
+ local moved={}
+ local current=start
+ local last=getnext(stop)
+ while current~=last do
+ local char=getchar(current)
+ local target=nil
+ local cn=getnext(current)
+ local tpm=twopart_mark[char]
+ while tpm do
+ local extra=copy_node(current)
+ copyinjection(extra,current)
+ char=tpm[1]
+ setchar(current,char)
+ setchar(extra,tpm[2])
+ head=insert_node_after(head,current,extra)
+ tpm=twopart_mark[char]
+ end
+ if not moved[current] and dependent_vowel[char] then
+ if pre_mark[char] then
+ moved[current]=true
+ local prev,next=getboth(current)
+ setlink(prev,next)
+ if current==stop then
+ stop=getprev(current)
+ end
+ local pos
+ if before_main[char] then
+ pos=basepos
+ else
+ pos=halfpos
+ end
+ local ppos=getprev(pos)
+ while ppos and getprop(ppos,a_syllabe)==getprop(pos,a_syllabe) do
+ if getstate(ppos,s_pref) then
+ pos=ppos
+ end
+ ppos=getprev(ppos)
+ end
+ local ppos=getprev(pos)
+ while ppos and getprop(ppos,a_syllabe)==getprop(pos,a_syllabe) and halant[ischar(ppos)] do
+ ppos=getprev(ppos)
+ if ppos and getprop(ppos,a_syllabe)==getprop(pos,a_syllabe) and consonant[ischar(ppos)] then
+ pos=ppos
+ ppos=getprev(ppos)
+ else
+ break
+ end
+ end
+ if pos==start then
+ if head==start then
+ head=current
+ end
+ start=current
+ end
+ setlink(getprev(pos),current)
+ setlink(current,pos)
+ elseif above_mark[char] then
+ target=basepos
+ if subpos==basepos then
+ subpos=current
+ end
+ if postpos==basepos then
+ postpos=current
+ end
+ basepos=current
+ elseif below_mark[char] then
+ target=subpos
+ if postpos==subpos then
+ postpos=current
+ end
+ subpos=current
+ elseif post_mark[char] then
+ local n=getnext(postpos)
+ while n do
+ local v=ischar(n,font)
+ if nukta[v] or stress_tone_mark[v] or vowel_modifier[v] then
+ postpos=n
+ else
+ break
+ end
+ n=getnext(n)
+ end
+ target=postpos
+ postpos=current
+ end
+ if mark_above_below_post[char] then
+ local prev=getprev(current)
+ if prev~=target then
+ local next=getnext(current)
+ setlink(prev,next)
+ if current==stop then
+ stop=prev
+ end
+ setlink(current,getnext(target))
+ setlink(target,current)
+ end
+ end
+ end
+ current=cn
+ end
+ local current=getnext(start)
+ local last=getnext(stop)
+ while current~=last do
+ local char=getchar(current)
+ local cn=getnext(current)
+ if halant[char] and ra[ischar(cn)] and (not getstate(cn,s_rphf)) and (not getstate(cn,s_blwf)) then
+ if after_main[ischar(cn)] then
+ local prev=getprev(current)
+ local next=getnext(cn)
+ local bpn=getnext(basepos)
+ while bpn and dependent_vowel[ischar(bpn)] do
+ basepos=bpn
+ bpn=getnext(bpn)
+ end
+ if basepos~=prev then
+ setlink(prev,next)
+ setlink(cn,getnext(basepos))
+ setlink(basepos,current)
+ if cn==stop then
+ stop=prev
+ end
+ cn=next
+ end
+ end
+ end
+ current=cn
+ end
+ local current=start
+ local c=nil
+ while current~=stop do
+ local char=getchar(current)
+ if halant[char] or stress_tone_mark[char] then
+ if not c then
+ c=current
+ end
+ else
+ c=nil
+ end
+ local next=getnext(current)
+ if c and nukta[getchar(next)] then
+ if head==c then
+ head=next
+ end
+ if stop==next then
+ stop=current
+ end
+ setlink(getprev(c),next)
+ local nextnext=getnext(next)
+ setnext(current,nextnext)
+ local nextnextnext=getnext(nextnext)
+ if nextnextnext then
+ setprev(nextnextnext,current)
+ end
+ setlink(nextnext,c)
+ end
+ if stop==current then break end
+ current=getnext(current)
+ end
+ if getchar(base)==c_nbsp then
+ if base==stop then
+ stop=getprev(stop)
+ end
+ nbspaces=nbspaces-1
+ head=remove_node(head,base)
+ flush_node(base)
+ end
+ return head,stop,nbspaces
+end
+local separator={}
+imerge(separator,consonant)
+imerge(separator,independent_vowel)
+imerge(separator,dependent_vowel)
+imerge(separator,vowel_modifier)
+imerge(separator,stress_tone_mark)
+for k,v in next,nukta do separator[k]=true end
+for k,v in next,halant do separator[k]=true end
+local function analyze_next_chars_one(c,font,variant)
+ local n=getnext(c)
+ if not n then
+ return c
+ end
+ if variant==1 then
+ local v=ischar(n,font)
+ if v and nukta[v] then
+ n=getnext(n)
+ if n then
+ v=ischar(n,font)
+ end
+ end
+ if n and v then
+ local nn=getnext(n)
+ if nn then
+ local vv=ischar(nn,font)
+ if vv then
+ local nnn=getnext(nn)
+ if nnn then
+ local vvv=ischar(nnn,font)
+ if vvv then
+ if vv==c_zwj and consonant[vvv] then
+ c=nnn
+ elseif (vv==c_zwnj or vv==c_zwj) and halant[vvv] then
+ local nnnn=getnext(nnn)
+ if nnnn then
+ local vvvv=ischar(nnnn,font)
+ if vvvv and consonant[vvvv] then
+ c=nnnn
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ elseif variant==2 then
+ local v=ischar(n,font)
+ if v and nukta[v] then
+ c=n
+ end
+ n=getnext(c)
+ if n then
+ v=ischar(n,font)
+ if v then
+ local nn=getnext(n)
+ if nn then
+ local vv=ischar(nn,font)
+ if vv and zw_char[v] then
+ n=nn
+ v=vv
+ nn=getnext(nn)
+ vv=nn and ischar(nn,font)
+ end
+ if vv and halant[v] and consonant[vv] then
+ c=nn
+ end
+ end
+ end
+ end
+ end
+ local n=getnext(c)
+ if not n then
+ return c
+ end
+ local v=ischar(n,font)
+ if not v then
+ return c
+ end
+ local already_pre_mark
+ local already_above_mark
+ local already_below_mark
+ local already_post_mark
+ while dependent_vowel[v] do
+ local vowels=twopart_mark[v] or { v }
+ for k,v in next,vowels do
+ if pre_mark[v] and not already_pre_mark then
+ already_pre_mark=true
+ elseif above_mark[v] and not already_above_mark then
+ already_above_mark=true
+ elseif below_mark[v] and not already_below_mark then
+ already_below_mark=true
+ elseif post_mark[v] and not already_post_mark then
+ already_post_mark=true
+ else
+ return c
+ end
+ end
+ c=getnext(c)
+ n=getnext(c)
+ if not n then
+ return c
+ end
+ v=ischar(n,font)
+ if not v then
+ return c
+ end
+ end
+ if nukta[v] then
+ c=getnext(c)
+ n=getnext(c)
+ if not n then
+ return c
+ end
+ v=ischar(n,font)
+ if not v then
+ return c
+ end
+ end
+ if halant[v] then
+ c=getnext(c)
+ n=getnext(c)
+ if not n then
+ return c
+ end
+ v=ischar(n,font)
+ if not v then
+ return c
+ end
+ end
+ if vowel_modifier[v] then
+ c=getnext(c)
+ n=getnext(c)
+ if not n then
+ return c
+ end
+ v=ischar(n,font)
+ if not v then
+ return c
+ end
+ end
+ if stress_tone_mark[v] then
+ c=getnext(c)
+ n=getnext(c)
+ if not n then
+ return c
+ end
+ v=ischar(n,font)
+ if not v then
+ return c
+ end
+ end
+ if stress_tone_mark[v] then
+ return n
+ else
+ return c
+ end
+end
+local function analyze_next_chars_two(c,font)
+ local n=getnext(c)
+ if not n then
+ return c
+ end
+ local v=ischar(n,font)
+ if v and nukta[v] then
+ c=n
+ end
+ n=c
+ while true do
+ local nn=getnext(n)
+ if nn then
+ local vv=ischar(nn,font)
+ if vv then
+ if halant[vv] then
+ n=nn
+ local nnn=getnext(nn)
+ if nnn then
+ local vvv=ischar(nnn,font)
+ if vvv and zw_char[vvv] then
+ n=nnn
+ end
+ end
+ elseif vv==c_zwnj or vv==c_zwj then
+ local nnn=getnext(nn)
+ if nnn then
+ local vvv=ischar(nnn,font)
+ if vvv and halant[vvv] then
+ n=nnn
+ end
+ end
+ else
+ break
+ end
+ local nn=getnext(n)
+ if nn then
+ local vv=ischar(nn,font)
+ if vv and consonant[vv] then
+ n=nn
+ local nnn=getnext(nn)
+ if nnn then
+ local vvv=ischar(nnn,font)
+ if vvv and nukta[vvv] then
+ n=nnn
+ end
+ end
+ c=n
+ else
+ break
+ end
+ else
+ break
+ end
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+ if not c then
+ return
+ end
+ local n=getnext(c)
+ if not n then
+ return c
+ end
+ local v=ischar(n,font)
+ if not v then
+ return c
+ end
+ if anudatta[v] then
+ c=n
+ n=getnext(c)
+ if not n then
+ return c
+ end
+ v=ischar(n,font)
+ if not v then
+ return c
+ end
+ end
+ if halant[v] then
+ c=n
+ n=getnext(c)
+ if not n then
+ return c
+ end
+ v=ischar(n,font)
+ if not v then
+ return c
+ end
+ if v==c_zwnj or v==c_zwj then
+ c=n
+ n=getnext(c)
+ if not n then
+ return c
+ end
+ v=ischar(n,font)
+ if not v then
+ return c
+ end
+ end
+ else
+ local already_pre_mark
+ local already_above_mark
+ local already_below_mark
+ local already_post_mark
+ while dependent_vowel[v] do
+ local vowels=twopart_mark[v] or { v }
+ for k,v in next,vowels do
+ if pre_mark[v] and not already_pre_mark then
+ already_pre_mark=true
+ elseif above_mark[v] and not already_above_mark then
+ already_above_mark=true
+ elseif below_mark[v] and not already_below_mark then
+ already_below_mark=true
+ elseif post_mark[v] and not already_post_mark then
+ already_post_mark=true
+ else
+ return c
+ end
+ end
+ c=n
+ n=getnext(c)
+ if not n then
+ return c
+ end
+ v=ischar(n,font)
+ if not v then
+ return c
+ end
+ end
+ if nukta[v] then
+ c=n
+ n=getnext(c)
+ if not n then
+ return c
+ end
+ v=ischar(n,font)
+ if not v then
+ return c
+ end
+ end
+ if halant[v] then
+ c=n
+ n=getnext(c)
+ if not n then
+ return c
+ end
+ v=ischar(n,font)
+ if not v then
+ return c
+ end
+ end
+ end
+ if vowel_modifier[v] then
+ c=n
+ n=getnext(c)
+ if not n then
+ return c
+ end
+ v=ischar(n,font)
+ if not v then
+ return c
+ end
+ end
+ if stress_tone_mark[v] then
+ c=n
+ n=getnext(c)
+ if not n then
+ return c
+ end
+ v=ischar(n,font)
+ if not v then
+ return c
+ end
+ end
+ if stress_tone_mark[v] then
+ return n
+ else
+ return c
+ end
+end
+local function method_one(head,font,attr)
+ local current=head
+ local start=true
+ local done=false
+ local nbspaces=0
+ local syllabe=0
+ while current do
+ local char=ischar(current,font)
+ if char then
+ done=true
+ local syllablestart=current
+ local syllableend=nil
+ local c=current
+ local n=getnext(c)
+ local first=char
+ if n and ra[first] then
+ local second=ischar(n,font)
+ if second and halant[second] then
+ local n=getnext(n)
+ if n then
+ local third=ischar(n,font)
+ if third then
+ c=n
+ first=third
+ end
+ end
+ end
+ end
+ local standalone=first==c_nbsp
+ if standalone then
+ local prev=getprev(current)
+ if prev then
+ local prevchar=ischar(prev,font)
+ if not prevchar then
+ elseif not separator[prevchar] then
+ else
+ standalone=false
+ end
+ else
+ end
+ end
+ if standalone then
+ local syllableend=analyze_next_chars_one(c,font,2)
+ current=getnext(syllableend)
+ if syllablestart~=syllableend then
+ head,current,nbspaces=reorder_one(head,syllablestart,syllableend,font,attr,nbspaces)
+ current=getnext(current)
+ end
+ else
+ if consonant[char] then
+ local prevc=true
+ while prevc do
+ prevc=false
+ local n=getnext(current)
+ if not n then
+ break
+ end
+ local v=ischar(n,font)
+ if not v then
+ break
+ end
+ if nukta[v] then
+ n=getnext(n)
+ if not n then
+ break
+ end
+ v=ischar(n,font)
+ if not v then
+ break
+ end
+ end
+ if halant[v] then
+ n=getnext(n)
+ if not n then
+ break
+ end
+ v=ischar(n,font)
+ if not v then
+ break
+ end
+ if v==c_zwnj or v==c_zwj then
+ n=getnext(n)
+ if not n then
+ break
+ end
+ v=ischar(n,font)
+ if not v then
+ break
+ end
+ end
+ if consonant[v] then
+ prevc=true
+ current=n
+ end
+ end
+ end
+ local n=getnext(current)
+ if n then
+ local v=ischar(n,font)
+ if v and nukta[v] then
+ current=n
+ n=getnext(current)
+ end
+ end
+ syllableend=current
+ current=n
+ if current then
+ local v=ischar(current,font)
+ if not v then
+ elseif halant[v] then
+ local n=getnext(current)
+ if n then
+ local v=ischar(n,font)
+ if v and zw_char[v] then
+ syllableend=n
+ current=getnext(n)
+ else
+ syllableend=current
+ current=n
+ end
+ else
+ syllableend=current
+ current=n
+ end
+ else
+ if dependent_vowel[v] then
+ syllableend=current
+ current=getnext(current)
+ v=ischar(current,font)
+ end
+ if v and vowel_modifier[v] then
+ syllableend=current
+ current=getnext(current)
+ v=ischar(current,font)
+ end
+ if v and stress_tone_mark[v] then
+ syllableend=current
+ current=getnext(current)
+ end
+ end
+ end
+ if syllablestart~=syllableend then
+ if syllableend then
+ syllabe=syllabe+1
+ local c=syllablestart
+ local n=getnext(syllableend)
+ while c~=n do
+ setprop(c,a_syllabe,syllabe)
+ c=getnext(c)
+ end
+ end
+ head,current,nbspaces=reorder_one(head,syllablestart,syllableend,font,attr,nbspaces)
+ current=getnext(current)
+ end
+ elseif independent_vowel[char] then
+ syllableend=current
+ current=getnext(current)
+ if current then
+ local v=ischar(current,font)
+ if v then
+ if vowel_modifier[v] then
+ syllableend=current
+ current=getnext(current)
+ v=ischar(current,font)
+ end
+ if v and stress_tone_mark[v] then
+ syllableend=current
+ current=getnext(current)
+ end
+ end
+ end
+ else
+ if show_syntax_errors then
+ local mark=mark_four[char]
+ if mark then
+ head,current=inject_syntax_error(head,current,char)
+ end
+ end
+ current=getnext(current)
+ end
+ end
+ else
+ current=getnext(current)
+ end
+ start=false
+ end
+ if nbspaces>0 then
+ head=replace_all_nbsp(head)
+ end
+ current=head
+ local n=0
+ while current do
+ local char=ischar(current,font)
+ if char then
+ if n==0 and not getstate(current) then
+ setstate(current,s_init)
+ end
+ n=n+1
+ else
+ n=0
+ end
+ current=getnext(current)
+ end
+ return head,done
+end
+local function method_two(head,font,attr)
+ local current=head
+ local start=true
+ local done=false
+ local syllabe=0
+ local nbspaces=0
+ while current do
+ local syllablestart=nil
+ local syllableend=nil
+ local char=ischar(current,font)
+ if char then
+ done=true
+ syllablestart=current
+ local c=current
+ local n=getnext(current)
+ if n and ra[char] then
+ local nextchar=ischar(n,font)
+ if nextchar and halant[nextchar] then
+ local n=getnext(n)
+ if n then
+ local nextnextchar=ischar(n,font)
+ if nextnextchar then
+ c=n
+ char=nextnextchar
+ end
+ end
+ end
+ end
+ if independent_vowel[char] then
+ current=analyze_next_chars_one(c,font,1)
+ syllableend=current
+ else
+ local standalone=char==c_nbsp
+ if standalone then
+ nbspaces=nbspaces+1
+ local p=getprev(current)
+ if not p then
+ elseif ischar(p,font) then
+ elseif not separator[getchar(p)] then
+ else
+ standalone=false
+ end
+ end
+ if standalone then
+ current=analyze_next_chars_one(c,font,2)
+ syllableend=current
+ elseif consonant[getchar(current)] then
+ current=analyze_next_chars_two(current,font)
+ syllableend=current
+ end
+ end
+ end
+ if syllableend then
+ syllabe=syllabe+1
+ local c=syllablestart
+ local n=getnext(syllableend)
+ while c~=n do
+ setprop(c,a_syllabe,syllabe)
+ c=getnext(c)
+ end
+ end
+ if syllableend and syllablestart~=syllableend then
+ head,current,nbspaces=reorder_two(head,syllablestart,syllableend,font,attr,nbspaces)
+ end
+ if not syllableend and show_syntax_errors then
+ local char=ischar(current,font)
+ if char and not getstate(current) then
+ local mark=mark_four[char]
+ if mark then
+ head,current=inject_syntax_error(head,current,char)
+ end
+ end
+ end
+ start=false
+ current=getnext(current)
+ end
+ if nbspaces>0 then
+ head=replace_all_nbsp(head)
+ end
+ current=head
+ local n=0
+ while current do
+ local char=ischar(current,font)
+ if char then
+ if n==0 and not getstate(current) then
+ setstate(current,s_init)
+ end
+ n=n+1
+ else
+ n=0
+ end
+ current=getnext(current)
+ end
+ return head,done
+end
+for i=1,nofscripts do
+ methods[scripts_one[i]]=method_one
+ methods[scripts_two[i]]=method_two
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-osd”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-ocl” e6b45379971219a6227e8655cda14aff] ---
+
+if not modules then modules={} end modules ['font-ocl']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+if CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 then
+ return
+end
+local tostring,tonumber,next=tostring,tonumber,next
+local round,max=math.round,math.round
+local gsub,find=string.gsub,string.find
+local sortedkeys,sortedhash,concat=table.sortedkeys,table.sortedhash,table.concat
+local setmetatableindex=table.setmetatableindex
+local formatters=string.formatters
+local tounicode=fonts.mappings.tounicode
+local helpers=fonts.helpers
+local charcommand=helpers.commands.char
+local rightcommand=helpers.commands.right
+local leftcommand=helpers.commands.left
+local downcommand=helpers.commands.down
+local otf=fonts.handlers.otf
+local otfregister=otf.features.register
+local f_color=formatters["%.3f %.3f %.3f rg"]
+local f_gray=formatters["%.3f g"]
+if context then
+ local startactualtext=nil
+ local stopactualtext=nil
+ function otf.getactualtext(s)
+ if not startactualtext then
+ startactualtext=backends.codeinjections.startunicodetoactualtextdirect
+ stopactualtext=backends.codeinjections.stopunicodetoactualtextdirect
+ end
+ return startactualtext(s),stopactualtext()
+ end
+else
+ local tounicode=fonts.mappings.tounicode16
+ function otf.getactualtext(s)
+ return
+ "/Span << /ActualText >> BDC",
+ "EMC"
+ end
+end
+local sharedpalettes={}
+local hash=setmetatableindex(function(t,k)
+ local v={ "pdf","direct",k }
+ t[k]=v
+ return v
+end)
+if context then
+ local colors=attributes.list[attributes.private('color')] or {}
+ local transparencies=attributes.list[attributes.private('transparency')] or {}
+ function otf.registerpalette(name,values)
+ sharedpalettes[name]=values
+ local color=lpdf.color
+ local transparency=lpdf.transparency
+ local register=colors.register
+ for i=1,#values do
+ local v=values[i]
+ if v=="textcolor" then
+ values[i]=false
+ else
+ local c=nil
+ local t=nil
+ if type(v)=="table" then
+ c=register(name,"rgb",
+ max(round((v.r or 0)*255),255)/255,
+ max(round((v.g or 0)*255),255)/255,
+ max(round((v.b or 0)*255),255)/255
+ )
+ else
+ c=colors[v]
+ t=transparencies[v]
+ end
+ if c and t then
+ values[i]=hash[color(1,c).." "..transparency(t)]
+ elseif c then
+ values[i]=hash[color(1,c)]
+ elseif t then
+ values[i]=hash[color(1,t)]
+ end
+ end
+ end
+ end
+else
+ function otf.registerpalette(name,values)
+ sharedpalettes[name]=values
+ for i=1,#values do
+ local v=values[i]
+ if v then
+ values[i]=hash[f_color(
+ max(round((v.r or 0)*255),255)/255,
+ max(round((v.g or 0)*255),255)/255,
+ max(round((v.b or 0)*255),255)/255
+ )]
+ end
+ end
+ end
+end
+local function convert(t,k)
+ local v={}
+ for i=1,#k do
+ local p=k[i]
+ local r,g,b=p[1],p[2],p[3]
+ if r==g and g==b then
+ v[i]=hash[f_gray(r/255)]
+ else
+ v[i]=hash[f_color(r/255,g/255,b/255)]
+ end
+ end
+ t[k]=v
+ return v
+end
+local start={ "pdf","mode","font" }
+local push={ "pdf","page","q" }
+local pop={ "pdf","page","Q" }
+local function initializeoverlay(tfmdata,kind,value)
+ if value then
+ local resources=tfmdata.resources
+ local palettes=resources.colorpalettes
+ if palettes then
+ local converted=resources.converted
+ if not converted then
+ converted=setmetatableindex(convert)
+ resources.converted=converted
+ end
+ local colorvalues=sharedpalettes[value]
+ local default=false
+ if colorvalues then
+ default=colorvalues[#colorvalues]
+ else
+ colorvalues=converted[palettes[tonumber(value) or 1] or palettes[1]] or {}
+ end
+ local classes=#colorvalues
+ if classes==0 then
+ return
+ end
+ local characters=tfmdata.characters
+ local descriptions=tfmdata.descriptions
+ local properties=tfmdata.properties
+ properties.virtualized=true
+ tfmdata.fonts={
+ { id=0 }
+ }
+ local getactualtext=otf.getactualtext
+ local b,e=getactualtext(tounicode(0xFFFD))
+ local actualb={ "pdf","page",b }
+ local actuale={ "pdf","page",e }
+ for unicode,character in next,characters do
+ local description=descriptions[unicode]
+ if description then
+ local colorlist=description.colors
+ if colorlist then
+ local u=description.unicode or characters[unicode].unicode
+ local w=character.width or 0
+ local s=#colorlist
+ local goback=w~=0 and leftcommand[w] or nil
+ local t={
+ not u and actualb or { "pdf","page",(getactualtext(tounicode(u))) },
+ push,
+ }
+ local n=2
+ local l=nil
+ for i=1,s do
+ local entry=colorlist[i]
+ local v=colorvalues[entry.class] or default
+ if v and l~=v then
+ n=n+1 t[n]=v
+ l=v
+ end
+ n=n+1 t[n]=charcommand[entry.slot]
+ if s>1 and i temp-otf-svg-shape.log","w")
+ end
+ end
+ function otfsvg.topdf(svgshapes,tfmdata)
+ local pdfshapes={}
+ local inkscape=runner()
+ if inkscape then
+ local descriptions=tfmdata.descriptions
+ local nofshapes=#svgshapes
+ local f_svgfile=formatters["temp-otf-svg-shape-%i.svg"]
+ local f_pdffile=formatters["temp-otf-svg-shape-%i.pdf"]
+ local f_convert=formatters["%s --export-pdf=%s\n"]
+ local filterglyph=otfsvg.filterglyph
+ local nofdone=0
+ local processed={}
+ report_svg("processing %i svg containers",nofshapes)
+ statistics.starttiming()
+ for i=1,nofshapes do
+ local entry=svgshapes[i]
+ for index=entry.first,entry.last do
+ local data=filterglyph(entry,index)
+ if data and data~="" then
+ local svgfile=f_svgfile(index)
+ local pdffile=f_pdffile(index)
+ savedata(svgfile,data)
+ inkscape:write(f_convert(svgfile,pdffile))
+ processed[index]=true
+ nofdone=nofdone+1
+ if nofdone%25==0 then
+ report_svg("%i shapes submitted",nofdone)
+ end
+ end
+ end
+ end
+ if nofdone%25~=0 then
+ report_svg("%i shapes submitted",nofdone)
+ end
+ report_svg("processing can be going on for a while")
+ inkscape:write("quit\n")
+ inkscape:close()
+ report_svg("processing %i pdf results",nofshapes)
+ for index in next,processed do
+ local svgfile=f_svgfile(index)
+ local pdffile=f_pdffile(index)
+ local pdfdata=loaddata(pdffile)
+ if pdfdata and pdfdata~="" then
+ pdfshapes[index]={
+ data=pdfdata,
+ }
+ end
+ remove(svgfile)
+ remove(pdffile)
+ end
+ local characters=tfmdata.characters
+ for k,v in next,characters do
+ local d=descriptions[k]
+ local i=d.index
+ if i then
+ local p=pdfshapes[i]
+ if p then
+ local w=d.width
+ local l=d.boundingbox[1]
+ local r=d.boundingbox[3]
+ p.scale=(r-l)/w
+ p.x=l
+ end
+ end
+ end
+ if not next(pdfshapes) then
+ report_svg("there are no converted shapes, fix your setup")
+ end
+ statistics.stoptiming()
+ if statistics.elapsedseconds then
+ report_svg("svg conversion time %s",statistics.elapsedseconds() or "-")
+ end
+ end
+ return pdfshapes
+ end
+end
+local function initializesvg(tfmdata,kind,value)
+ if value and otf.svgenabled then
+ local svg=tfmdata.properties.svg
+ local hash=svg and svg.hash
+ local timestamp=svg and svg.timestamp
+ if not hash then
+ return
+ end
+ local pdffile=containers.read(otf.pdfcache,hash)
+ local pdfshapes=pdffile and pdffile.pdfshapes
+ if not pdfshapes or pdffile.timestamp~=timestamp or not next(pdfshapes) then
+ local svgfile=containers.read(otf.svgcache,hash)
+ local svgshapes=svgfile and svgfile.svgshapes
+ pdfshapes=svgshapes and otfsvg.topdf(svgshapes,tfmdata,otf.pdfcache.writable,hash) or {}
+ containers.write(otf.pdfcache,hash,{
+ pdfshapes=pdfshapes,
+ timestamp=timestamp,
+ })
+ end
+ pdftovirtual(tfmdata,pdfshapes,"svg")
+ return true
+ end
+end
+otfregister {
+ name="svg",
+ description="svg glyphs",
+ manipulators={
+ base=initializesvg,
+ node=initializesvg,
+ }
+}
+local otfpng=otf.png or {}
+otf.png=otfpng
+otf.pngenabled=true
+do
+ local report_png=logs.reporter("fonts","png conversion")
+ local loaddata=io.loaddata
+ local savedata=io.savedata
+ local remove=os.remove
+ local runner=sandbox and sandbox.registerrunner {
+ name="otfpng",
+ program="gm",
+ template="convert -quality 100 temp-otf-png-shape.png temp-otf-png-shape.pdf > temp-otf-svg-shape.log",
+ }
+ if not runner then
+ runner=function()
+ return os.execute("gm convert -quality 100 temp-otf-png-shape.png temp-otf-png-shape.pdf > temp-otf-svg-shape.log")
+ end
+ end
+ function otfpng.topdf(pngshapes)
+ local pdfshapes={}
+ local pngfile="temp-otf-png-shape.png"
+ local pdffile="temp-otf-png-shape.pdf"
+ local nofdone=0
+ local indices=sortedkeys(pngshapes)
+ local nofindices=#indices
+ report_png("processing %i png containers",nofindices)
+ statistics.starttiming()
+ for i=1,nofindices do
+ local index=indices[i]
+ local entry=pngshapes[index]
+ local data=entry.data
+ local x=entry.x
+ local y=entry.y
+ savedata(pngfile,data)
+ runner()
+ pdfshapes[index]={
+ x=x~=0 and x or nil,
+ y=y~=0 and y or nil,
+ data=loaddata(pdffile),
+ }
+ nofdone=nofdone+1
+ if nofdone%100==0 then
+ report_png("%i shapes processed",nofdone)
+ end
+ end
+ report_png("processing %i pdf results",nofindices)
+ remove(pngfile)
+ remove(pdffile)
+ statistics.stoptiming()
+ if statistics.elapsedseconds then
+ report_png("png conversion time %s",statistics.elapsedseconds() or "-")
+ end
+ return pdfshapes
+ end
+end
+local function initializepng(tfmdata,kind,value)
+ if value and otf.pngenabled then
+ local png=tfmdata.properties.png
+ local hash=png and png.hash
+ local timestamp=png and png.timestamp
+ if not hash then
+ return
+ end
+ local pdffile=containers.read(otf.pdfcache,hash)
+ local pdfshapes=pdffile and pdffile.pdfshapes
+ if not pdfshapes or pdffile.timestamp~=timestamp then
+ local pngfile=containers.read(otf.pngcache,hash)
+ local pngshapes=pngfile and pngfile.pngshapes
+ pdfshapes=pngshapes and otfpng.topdf(pngshapes) or {}
+ containers.write(otf.pdfcache,hash,{
+ pdfshapes=pdfshapes,
+ timestamp=timestamp,
+ })
+ end
+ pdftovirtual(tfmdata,pdfshapes,"png")
+ return true
+ end
+end
+otfregister {
+ name="sbix",
+ description="sbix glyphs",
+ manipulators={
+ base=initializepng,
+ node=initializepng,
+ }
+}
+otfregister {
+ name="cblc",
+ description="cblc glyphs",
+ manipulators={
+ base=initializepng,
+ node=initializepng,
+ }
+}
+if context then
+ local function initializecolor(tfmdata,kind,value)
+ if value=="auto" then
+ return
+ initializeoverlay(tfmdata,kind,value) or
+ initializesvg(tfmdata,kind,value) or
+ initializepng(tfmdata,kind,value)
+ elseif value=="overlay" then
+ return initializeoverlay(tfmdata,kind,value)
+ elseif value=="svg" then
+ return initializesvg(tfmdata,kind,value)
+ elseif value=="png" or value=="bitmap" then
+ return initializepng(tfmdata,kind,value)
+ else
+ end
+ end
+ otfregister {
+ name="color",
+ description="color glyphs",
+ manipulators={
+ base=initializecolor,
+ node=initializecolor,
+ }
+ }
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-ocl”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-otc” 1204a2fdc436e644127c0aa38ab69607] ---
+
+if not modules then modules={} end modules ['font-otc']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local insert,sortedkeys,sortedhash,tohash=table.insert,table.sortedkeys,table.sortedhash,table.tohash
+local type,next,tonumber=type,next,tonumber
+local lpegmatch=lpeg.match
+local utfbyte,utflen=utf.byte,utf.len
+local sortedhash=table.sortedhash
+local trace_loading=false trackers.register("otf.loading",function(v) trace_loading=v end)
+local report_otf=logs.reporter("fonts","otf loading")
+local fonts=fonts
+local otf=fonts.handlers.otf
+local registerotffeature=otf.features.register
+local setmetatableindex=table.setmetatableindex
+local fonthelpers=fonts.helpers
+local checkmerge=fonthelpers.checkmerge
+local checkflags=fonthelpers.checkflags
+local checksteps=fonthelpers.checksteps
+local normalized={
+ substitution="substitution",
+ single="substitution",
+ ligature="ligature",
+ alternate="alternate",
+ multiple="multiple",
+ kern="kern",
+ pair="pair",
+ single="single",
+ chainsubstitution="chainsubstitution",
+ chainposition="chainposition",
+}
+local types={
+ substitution="gsub_single",
+ ligature="gsub_ligature",
+ alternate="gsub_alternate",
+ multiple="gsub_multiple",
+ kern="gpos_pair",
+ pair="gpos_pair",
+ single="gpos_single",
+ chainsubstitution="gsub_contextchain",
+ chainposition="gpos_contextchain",
+}
+local names={
+ gsub_single="gsub",
+ gsub_multiple="gsub",
+ gsub_alternate="gsub",
+ gsub_ligature="gsub",
+ gsub_context="gsub",
+ gsub_contextchain="gsub",
+ gsub_reversecontextchain="gsub",
+ gpos_single="gpos",
+ gpos_pair="gpos",
+ gpos_cursive="gpos",
+ gpos_mark2base="gpos",
+ gpos_mark2ligature="gpos",
+ gpos_mark2mark="gpos",
+ gpos_context="gpos",
+ gpos_contextchain="gpos",
+}
+setmetatableindex(types,function(t,k) t[k]=k return k end)
+local everywhere={ ["*"]={ ["*"]=true } }
+local noflags={ false,false,false,false }
+local function getrange(sequences,category)
+ local count=#sequences
+ local first=nil
+ local last=nil
+ for i=1,count do
+ local t=sequences[i].type
+ if t and names[t]==category then
+ if not first then
+ first=i
+ end
+ last=i
+ end
+ end
+ return first or 1,last or count
+end
+local function validspecification(specification,name)
+ local dataset=specification.dataset
+ if dataset then
+ elseif specification[1] then
+ dataset=specification
+ specification={ dataset=dataset }
+ else
+ dataset={ { data=specification.data } }
+ specification.data=nil
+ specification.dataset=dataset
+ end
+ local first=dataset[1]
+ if first then
+ first=first.data
+ end
+ if not first then
+ report_otf("invalid feature specification, no dataset")
+ return
+ end
+ if type(name)~="string" then
+ name=specification.name or first.name
+ end
+ if type(name)~="string" then
+ report_otf("invalid feature specification, no name")
+ return
+ end
+ local n=#dataset
+ if n>0 then
+ for i=1,n do
+ setmetatableindex(dataset[i],specification)
+ end
+ return specification,name
+ end
+end
+local function addfeature(data,feature,specifications)
+ if not specifications then
+ report_otf("missing specification")
+ return
+ end
+ local descriptions=data.descriptions
+ local resources=data.resources
+ local features=resources.features
+ local sequences=resources.sequences
+ if not features or not sequences then
+ report_otf("missing specification")
+ return
+ end
+ local alreadydone=resources.alreadydone
+ if not alreadydone then
+ alreadydone={}
+ resources.alreadydone=alreadydone
+ end
+ if alreadydone[specifications] then
+ return
+ else
+ alreadydone[specifications]=true
+ end
+ local fontfeatures=resources.features or everywhere
+ local unicodes=resources.unicodes
+ local splitter=lpeg.splitter(" ",unicodes)
+ local done=0
+ local skip=0
+ local aglunicodes=false
+ local privateslot=fonthelpers.privateslot
+ local specifications=validspecification(specifications,feature)
+ if not specifications then
+ return
+ end
+ local p=lpeg.P("P")*(lpeg.patterns.hexdigit^1/function(s) return tonumber(s,16) end)*lpeg.P(-1)
+ local function tounicode(code)
+ if not code then
+ return
+ end
+ if type(code)=="number" then
+ return code
+ end
+ local u=unicodes[code]
+ if u then
+ return u
+ end
+ if utflen(code)==1 then
+ u=utfbyte(code)
+ if u then
+ return u
+ end
+ end
+ if privateslot then
+ u=privateslot(code)
+ if u then
+ return u
+ end
+ end
+ local u=lpegmatch(p,code)
+ if u then
+ return u
+ end
+ if not aglunicodes then
+ aglunicodes=fonts.encodings.agl.unicodes
+ end
+ local u=aglunicodes[code]
+ if u then
+ return u
+ end
+ end
+ local coverup=otf.coverup
+ local coveractions=coverup.actions
+ local stepkey=coverup.stepkey
+ local register=coverup.register
+ local function prepare_substitution(list,featuretype,nocheck)
+ local coverage={}
+ local cover=coveractions[featuretype]
+ for code,replacement in next,list do
+ local unicode=tounicode(code)
+ local description=descriptions[unicode]
+ if not nocheck and not description then
+ skip=skip+1
+ else
+ if type(replacement)=="table" then
+ replacement=replacement[1]
+ end
+ replacement=tounicode(replacement)
+ if replacement and (nocheck or descriptions[replacement]) then
+ cover(coverage,unicode,replacement)
+ done=done+1
+ else
+ skip=skip+1
+ end
+ end
+ end
+ return coverage
+ end
+ local function prepare_alternate(list,featuretype,nocheck)
+ local coverage={}
+ local cover=coveractions[featuretype]
+ for code,replacement in next,list do
+ local unicode=tounicode(code)
+ local description=descriptions[unicode]
+ if not nocheck and not description then
+ skip=skip+1
+ elseif type(replacement)=="table" then
+ local r={}
+ for i=1,#replacement do
+ local u=tounicode(replacement[i])
+ r[i]=(nocheck or descriptions[u]) and u or unicode
+ end
+ cover(coverage,unicode,r)
+ done=done+1
+ else
+ local u=tounicode(replacement)
+ if u then
+ cover(coverage,unicode,{ u })
+ done=done+1
+ else
+ skip=skip+1
+ end
+ end
+ end
+ return coverage
+ end
+ local function prepare_multiple(list,featuretype,nocheck)
+ local coverage={}
+ local cover=coveractions[featuretype]
+ for code,replacement in next,list do
+ local unicode=tounicode(code)
+ local description=descriptions[unicode]
+ if not nocheck and not description then
+ skip=skip+1
+ elseif type(replacement)=="table" then
+ local r={}
+ local n=0
+ for i=1,#replacement do
+ local u=tounicode(replacement[i])
+ if nocheck or descriptions[u] then
+ n=n+1
+ r[n]=u
+ end
+ end
+ if n>0 then
+ cover(coverage,unicode,r)
+ done=done+1
+ else
+ skip=skip+1
+ end
+ else
+ local u=tounicode(replacement)
+ if u then
+ cover(coverage,unicode,{ u })
+ done=done+1
+ else
+ skip=skip+1
+ end
+ end
+ end
+ return coverage
+ end
+ local function prepare_ligature(list,featuretype,nocheck)
+ local coverage={}
+ local cover=coveractions[featuretype]
+ for code,ligature in next,list do
+ local unicode=tounicode(code)
+ local description=descriptions[unicode]
+ if not nocheck and not description then
+ skip=skip+1
+ else
+ if type(ligature)=="string" then
+ ligature={ lpegmatch(splitter,ligature) }
+ end
+ local present=true
+ for i=1,#ligature do
+ local l=ligature[i]
+ local u=tounicode(l)
+ if nocheck or descriptions[u] then
+ ligature[i]=u
+ else
+ present=false
+ break
+ end
+ end
+ if present then
+ cover(coverage,unicode,ligature)
+ done=done+1
+ else
+ skip=skip+1
+ end
+ end
+ end
+ return coverage
+ end
+ local function resetspacekerns()
+ data.properties.hasspacekerns=true
+ data.resources .spacekerns=nil
+ end
+ local function prepare_kern(list,featuretype)
+ local coverage={}
+ local cover=coveractions[featuretype]
+ local isspace=false
+ for code,replacement in next,list do
+ local unicode=tounicode(code)
+ local description=descriptions[unicode]
+ if description and type(replacement)=="table" then
+ local r={}
+ for k,v in next,replacement do
+ local u=tounicode(k)
+ if u then
+ r[u]=v
+ if u==32 then
+ isspace=true
+ end
+ end
+ end
+ if next(r) then
+ cover(coverage,unicode,r)
+ done=done+1
+ if unicode==32 then
+ isspace=true
+ end
+ else
+ skip=skip+1
+ end
+ else
+ skip=skip+1
+ end
+ end
+ if isspace then
+ resetspacekerns()
+ end
+ return coverage
+ end
+ local function prepare_pair(list,featuretype)
+ local coverage={}
+ local cover=coveractions[featuretype]
+ if cover then
+ for code,replacement in next,list do
+ local unicode=tounicode(code)
+ local description=descriptions[unicode]
+ if description and type(replacement)=="table" then
+ local r={}
+ for k,v in next,replacement do
+ local u=tounicode(k)
+ if u then
+ r[u]=v
+ if u==32 then
+ isspace=true
+ end
+ end
+ end
+ if next(r) then
+ cover(coverage,unicode,r)
+ done=done+1
+ if unicode==32 then
+ isspace=true
+ end
+ else
+ skip=skip+1
+ end
+ else
+ skip=skip+1
+ end
+ end
+ if isspace then
+ resetspacekerns()
+ end
+ else
+ report_otf("unknown cover type %a",featuretype)
+ end
+ return coverage
+ end
+ local prepare_single=prepare_pair
+ local function prepare_chain(list,featuretype,sublookups)
+ local rules=list.rules
+ local coverage={}
+ if rules then
+ local rulehash={}
+ local rulesize=0
+ local lookuptype=types[featuretype]
+ for nofrules=1,#rules do
+ local rule=rules[nofrules]
+ local current=rule.current
+ local before=rule.before
+ local after=rule.after
+ local replacements=rule.replacements or false
+ local sequence={}
+ local nofsequences=0
+ if before then
+ for n=1,#before do
+ nofsequences=nofsequences+1
+ sequence[nofsequences]=before[n]
+ end
+ end
+ local start=nofsequences+1
+ for n=1,#current do
+ nofsequences=nofsequences+1
+ sequence[nofsequences]=current[n]
+ end
+ local stop=nofsequences
+ if after then
+ for n=1,#after do
+ nofsequences=nofsequences+1
+ sequence[nofsequences]=after[n]
+ end
+ end
+ local lookups=rule.lookups or false
+ local subtype=nil
+ if lookups and sublookups then
+ for k,v in sortedhash(lookups) do
+ local t=type(v)
+ if t=="table" then
+ for i=1,#v do
+ local vi=v[i]
+ if type(vi)~="table" then
+ v[i]={ vi }
+ end
+ end
+ elseif t=="number" then
+ local lookup=sublookups[v]
+ if lookup then
+ lookups[k]={ lookup }
+ if not subtype then
+ subtype=lookup.type
+ end
+ elseif v==0 then
+ lookups[k]={ { type="gsub_remove" } }
+ else
+ lookups[k]=false
+ end
+ else
+ lookups[k]=false
+ end
+ end
+ end
+ if nofsequences>0 then
+ local hashed={}
+ for i=1,nofsequences do
+ local t={}
+ local s=sequence[i]
+ for i=1,#s do
+ local u=tounicode(s[i])
+ if u then
+ t[u]=true
+ end
+ end
+ hashed[i]=t
+ end
+ sequence=hashed
+ rulesize=rulesize+1
+ rulehash[rulesize]={
+ nofrules,
+ lookuptype,
+ sequence,
+ start,
+ stop,
+ lookups,
+ replacements,
+ subtype,
+ }
+ for unic in sortedhash(sequence[start]) do
+ local cu=coverage[unic]
+ if not cu then
+ coverage[unic]=rulehash
+ end
+ end
+ sequence.n=nofsequences
+ end
+ end
+ rulehash.n=rulesize
+ end
+ return coverage
+ end
+ local dataset=specifications.dataset
+ local function report(name,category,position,first,last,sequences)
+ report_otf("injecting name %a of category %a at position %i in [%i,%i] of [%i,%i]",
+ name,category,position,first,last,1,#sequences)
+ end
+ local function inject(specification,sequences,sequence,first,last,category,name)
+ local position=specification.position or false
+ if not position then
+ position=specification.prepend
+ if position==true then
+ if trace_loading then
+ report(name,category,first,first,last,sequences)
+ end
+ insert(sequences,first,sequence)
+ return
+ end
+ end
+ if not position then
+ position=specification.append
+ if position==true then
+ if trace_loading then
+ report(name,category,last+1,first,last,sequences)
+ end
+ insert(sequences,last+1,sequence)
+ return
+ end
+ end
+ local kind=type(position)
+ if kind=="string" then
+ local index=false
+ for i=first,last do
+ local s=sequences[i]
+ local f=s.features
+ if f then
+ for k in sortedhash(f) do
+ if k==position then
+ index=i
+ break
+ end
+ end
+ if index then
+ break
+ end
+ end
+ end
+ if index then
+ position=index
+ else
+ position=last+1
+ end
+ elseif kind=="number" then
+ if position<0 then
+ position=last-position+1
+ end
+ if position>last then
+ position=last+1
+ elseif position0 then
+ for k,v in next,askedfeatures do
+ if v[1] then
+ askedfeatures[k]=tohash(v)
+ end
+ end
+ if featureflags[1] then featureflags[1]="mark" end
+ if featureflags[2] then featureflags[2]="ligature" end
+ if featureflags[3] then featureflags[3]="base" end
+ local steptype=types[featuretype]
+ local sequence={
+ chain=featurechain,
+ features={ [feature]=askedfeatures },
+ flags=featureflags,
+ name=feature,
+ order=featureorder,
+ [stepkey]=steps,
+ nofsteps=nofsteps,
+ type=steptype,
+ }
+ checkflags(sequence,resources)
+ checkmerge(sequence)
+ checksteps(sequence)
+ local first,last=getrange(sequences,category)
+ inject(specification,sequences,sequence,first,last,category,feature)
+ local features=fontfeatures[category]
+ if not features then
+ features={}
+ fontfeatures[category]=features
+ end
+ local k=features[feature]
+ if not k then
+ k={}
+ features[feature]=k
+ end
+ for script,languages in next,askedfeatures do
+ local kk=k[script]
+ if not kk then
+ kk={}
+ k[script]=kk
+ end
+ for language,value in next,languages do
+ kk[language]=value
+ end
+ end
+ end
+ end
+ end
+ if trace_loading then
+ report_otf("registering feature %a, affected glyphs %a, skipped glyphs %a",feature,done,skip)
+ end
+end
+otf.enhancers.addfeature=addfeature
+local extrafeatures={}
+local knownfeatures={}
+function otf.addfeature(name,specification)
+ if type(name)=="table" then
+ specification=name
+ end
+ if type(specification)~="table" then
+ report_otf("invalid feature specification, no valid table")
+ return
+ end
+ specification,name=validspecification(specification,name)
+ if name and specification then
+ local slot=knownfeatures[name]
+ if not slot then
+ slot=#extrafeatures+1
+ knownfeatures[name]=slot
+ elseif specification.overload==false then
+ slot=#extrafeatures+1
+ knownfeatures[name]=slot
+ else
+ end
+ specification.name=name
+ extrafeatures[slot]=specification
+ end
+end
+local function enhance(data,filename,raw)
+ for slot=1,#extrafeatures do
+ local specification=extrafeatures[slot]
+ addfeature(data,specification.name,specification)
+ end
+end
+otf.enhancers.enhance=enhance
+otf.enhancers.register("check extra features",enhance)
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-otc”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-onr” 22572ec0f86f53631e14b6d1ed43ee51] ---
+
+if not modules then modules={} end modules ['font-onr']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local fonts,logs,trackers,resolvers=fonts,logs,trackers,resolvers
+local next,type,tonumber,rawset=next,type,tonumber,rawset
+local match,lower,gsub,strip,find=string.match,string.lower,string.gsub,string.strip,string.find
+local char,byte,sub=string.char,string.byte,string.sub
+local abs=math.abs
+local bxor,rshift=bit32.bxor,bit32.rshift
+local P,S,R,V,Cmt,C,Ct,Cs,Carg,Cf,Cg,Cc=lpeg.P,lpeg.S,lpeg.R,lpeg.V,lpeg.Cmt,lpeg.C,lpeg.Ct,lpeg.Cs,lpeg.Carg,lpeg.Cf,lpeg.Cg,lpeg.Cc
+local lpegmatch,patterns=lpeg.match,lpeg.patterns
+local trace_indexing=false trackers.register("afm.indexing",function(v) trace_indexing=v end)
+local trace_loading=false trackers.register("afm.loading",function(v) trace_loading=v end)
+local report_afm=logs.reporter("fonts","afm loading")
+local report_pfb=logs.reporter("fonts","pfb loading")
+local handlers=fonts.handlers
+local afm=handlers.afm or {}
+handlers.afm=afm
+local readers=afm.readers or {}
+afm.readers=readers
+afm.version=1.513
+local get_indexes,get_shapes
+do
+ local decrypt
+ do
+ local r,c1,c2,n=0,0,0,0
+ local function step(c)
+ local cipher=byte(c)
+ local plain=bxor(cipher,rshift(r,8))
+ r=((cipher+r)*c1+c2)%65536
+ return char(plain)
+ end
+ decrypt=function(binary,initial,seed)
+ r,c1,c2,n=initial,52845,22719,seed
+ binary=gsub(binary,".",step)
+ return sub(binary,n+1)
+ end
+ end
+ local charstrings=P("/CharStrings")
+ local subroutines=P("/Subrs")
+ local encoding=P("/Encoding")
+ local dup=P("dup")
+ local put=P("put")
+ local array=P("array")
+ local name=P("/")*C((R("az","AZ","09")+S("-_."))^1)
+ local digits=R("09")^1
+ local cardinal=digits/tonumber
+ local spaces=P(" ")^1
+ local spacing=patterns.whitespace^0
+ local routines,vector,chars,n,m
+ local initialize=function(str,position,size)
+ n=0
+ m=size
+ return position+1
+ end
+ local setroutine=function(str,position,index,size,filename)
+ if routines[index] then
+ return false
+ end
+ local forward=position+size
+ local stream=decrypt(sub(str,position+1,forward),4330,4)
+ routines[index]={ byte(stream,1,#stream) }
+ n=n+1
+ if n>=m then
+ return #str
+ end
+ return forward+1
+ end
+ local setvector=function(str,position,name,size,filename)
+ local forward=position+tonumber(size)
+ if n>=m then
+ return #str
+ elseif forward<#str then
+ if n==0 and name~=".notdef" then
+ report_pfb("reserving .notdef at index 0 in %a",filename)
+ n=n+1
+ end
+ vector[n]=name
+ n=n+1
+ return forward
+ else
+ return #str
+ end
+ end
+ local setshapes=function(str,position,name,size,filename)
+ local forward=position+tonumber(size)
+ local stream=sub(str,position+1,forward)
+ if n>m then
+ return #str
+ elseif forward<#str then
+ if n==0 and name~=".notdef" then
+ report_pfb("reserving .notdef at index 0 in %a",filename)
+ n=n+1
+ end
+ vector[n]=name
+ n=n+1
+ chars [n]=decrypt(stream,4330,4)
+ return forward
+ else
+ return #str
+ end
+ end
+ local p_rd=spacing*(P("RD")+P("-|"))
+ local p_np=spacing*(P("NP")+P("|"))
+ local p_nd=spacing*(P("ND")+P("|"))
+ local p_filterroutines=
+ (1-subroutines)^0*subroutines*spaces*Cmt(cardinal,initialize)*(Cmt(cardinal*spaces*cardinal*p_rd*Carg(1),setroutine)*p_np+(1-p_nd))^1
+ local p_filtershapes=
+ (1-charstrings)^0*charstrings*spaces*Cmt(cardinal,initialize)*(Cmt(name*spaces*cardinal*p_rd*Carg(1),setshapes)*p_nd+P(1))^1
+ local p_filternames=Ct (
+ (1-charstrings)^0*charstrings*spaces*Cmt(cardinal,initialize)*(Cmt(name*spaces*cardinal*Carg(1),setvector)+P(1))^1
+ )
+ local p_filterencoding=(1-encoding)^0*encoding*spaces*digits*spaces*array*(1-dup)^0*Cf(
+ Ct("")*Cg(spacing*dup*spaces*cardinal*spaces*name*spaces*put)^1
+,rawset)
+ local key=spacing*P("/")*R("az","AZ")
+ local str=spacing*Cs { (P("(")/"")*((1-P("\\(")-P("\\)")-S("()"))+V(1))^0*(P(")")/"") }
+ local num=spacing*(R("09")+S("+-."))^1/tonumber
+ local arr=spacing*Ct (S("[{")*(num)^0*spacing*S("]}"))
+ local boo=spacing*(P("true")*Cc(true)+P("false")*Cc(false))
+ local nam=spacing*P("/")*Cs(R("az","AZ")^1)
+ local p_filtermetadata=(
+ P("/")*Carg(1)*((
+ C("version")*str+C("Copyright")*str+C("Notice")*str+C("FullName")*str+C("FamilyName")*str+C("Weight")*str+C("ItalicAngle")*num+C("isFixedPitch")*boo+C("UnderlinePosition")*num+C("UnderlineThickness")*num+C("FontName")*nam+C("FontMatrix")*arr+C("FontBBox")*arr
+ ) )/function(t,k,v) t[lower(k)]=v end+P(1)
+ )^0*Carg(1)
+ local function loadpfbvector(filename,shapestoo,streams)
+ local data=io.loaddata(resolvers.findfile(filename))
+ if not data then
+ report_pfb("no data in %a",filename)
+ return
+ end
+ if not (find(data,"!PS-AdobeFont-",1,true) or find(data,"%!FontType1",1,true)) then
+ report_pfb("no font in %a",filename)
+ return
+ end
+ local ascii,binary=match(data,"(.*)eexec%s+......(.*)")
+ if not binary then
+ report_pfb("no binary data in %a",filename)
+ return
+ end
+ binary=decrypt(binary,55665,4)
+ local names={}
+ local encoding=lpegmatch(p_filterencoding,ascii)
+ local metadata=lpegmatch(p_filtermetadata,ascii,1,{})
+ local glyphs={}
+ routines,vector,chars={},{},{}
+ if shapestoo or streams then
+ lpegmatch(p_filterroutines,binary,1,filename)
+ lpegmatch(p_filtershapes,binary,1,filename)
+ local data={
+ dictionaries={
+ {
+ charstrings=chars,
+ charset=vector,
+ subroutines=routines,
+ }
+ },
+ }
+ fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,"cff",streams,true)
+ else
+ lpegmatch(p_filternames,binary,1,filename)
+ end
+ names=vector
+ routines,vector,chars=nil,nil,nil
+ return names,encoding,glyphs,metadata
+ end
+ local pfb=handlers.pfb or {}
+ handlers.pfb=pfb
+ pfb.loadvector=loadpfbvector
+ get_indexes=function(data,pfbname)
+ local vector=loadpfbvector(pfbname)
+ if vector then
+ local characters=data.characters
+ if trace_loading then
+ report_afm("getting index data from %a",pfbname)
+ end
+ for index=0,#vector do
+ local name=vector[index]
+ local char=characters[name]
+ if char then
+ if trace_indexing then
+ report_afm("glyph %a has index %a",name,index)
+ end
+ char.index=index
+ else
+ if trace_indexing then
+ report_afm("glyph %a has index %a but no data",name,index)
+ end
+ end
+ end
+ end
+ end
+ get_shapes=function(pfbname)
+ local vector,encoding,glyphs=loadpfbvector(pfbname,true)
+ return glyphs
+ end
+end
+local spacer=patterns.spacer
+local whitespace=patterns.whitespace
+local lineend=patterns.newline
+local spacing=spacer^0
+local number=spacing*S("+-")^-1*(R("09")+S("."))^1/tonumber
+local name=spacing*C((1-whitespace)^1)
+local words=spacing*((1-lineend)^1/strip)
+local rest=(1-lineend)^0
+local fontdata=Carg(1)
+local semicolon=spacing*P(";")
+local plus=spacing*P("plus")*number
+local minus=spacing*P("minus")*number
+local function addkernpair(data,one,two,value)
+ local chr=data.characters[one]
+ if chr then
+ local kerns=chr.kerns
+ if kerns then
+ kerns[two]=tonumber(value)
+ else
+ chr.kerns={ [two]=tonumber(value) }
+ end
+ end
+end
+local p_kernpair=(fontdata*P("KPX")*name*name*number)/addkernpair
+local chr=false
+local ind=0
+local function start(data,version)
+ data.metadata.afmversion=version
+ ind=0
+ chr={}
+end
+local function stop()
+ ind=0
+ chr=false
+end
+local function setindex(i)
+ if i<0 then
+ ind=ind+1
+ else
+ ind=i
+ end
+ chr={
+ index=ind
+ }
+end
+local function setwidth(width)
+ chr.width=width
+end
+local function setname(data,name)
+ data.characters[name]=chr
+end
+local function setboundingbox(boundingbox)
+ chr.boundingbox=boundingbox
+end
+local function setligature(plus,becomes)
+ local ligatures=chr.ligatures
+ if ligatures then
+ ligatures[plus]=becomes
+ else
+ chr.ligatures={ [plus]=becomes }
+ end
+end
+local p_charmetric=((
+ P("C")*number/setindex+P("WX")*number/setwidth+P("N")*fontdata*name/setname+P("B")*Ct((number)^4)/setboundingbox+P("L")*(name)^2/setligature
+ )*semicolon )^1
+local p_charmetrics=P("StartCharMetrics")*number*(p_charmetric+(1-P("EndCharMetrics")))^0*P("EndCharMetrics")
+local p_kernpairs=P("StartKernPairs")*number*(p_kernpair+(1-P("EndKernPairs" )))^0*P("EndKernPairs" )
+local function set_1(data,key,a) data.metadata[lower(key)]=a end
+local function set_2(data,key,a,b) data.metadata[lower(key)]={ a,b } end
+local function set_3(data,key,a,b,c) data.metadata[lower(key)]={ a,b,c } end
+local p_parameters=P(false)+fontdata*((P("FontName")+P("FullName")+P("FamilyName"))/lower)*words/function(data,key,value)
+ data.metadata[key]=value
+ end+fontdata*((P("Weight")+P("Version"))/lower)*name/function(data,key,value)
+ data.metadata[key]=value
+ end+fontdata*P("IsFixedPitch")*name/function(data,pitch)
+ data.metadata.monospaced=toboolean(pitch,true)
+ end+fontdata*P("FontBBox")*Ct(number^4)/function(data,boundingbox)
+ data.metadata.boundingbox=boundingbox
+ end+fontdata*((P("CharWidth")+P("CapHeight")+P("XHeight")+P("Descender")+P("Ascender")+P("ItalicAngle"))/lower)*number/function(data,key,value)
+ data.metadata[key]=value
+ end+P("Comment")*spacing*(P(false)+(fontdata*C("DESIGNSIZE")*number*rest)/set_1
++(fontdata*C("TFM designsize")*number*rest)/set_1+(fontdata*C("DesignSize")*number*rest)/set_1+(fontdata*C("CODINGSCHEME")*words*rest)/set_1
++(fontdata*C("CHECKSUM")*number*words*rest)/set_1
++(fontdata*C("SPACE")*number*plus*minus*rest)/set_3
++(fontdata*C("QUAD")*number*rest)/set_1
++(fontdata*C("EXTRASPACE")*number*rest)/set_1
++(fontdata*C("NUM")*number*number*number*rest)/set_3
++(fontdata*C("DENOM")*number*number*rest)/set_2
++(fontdata*C("SUP")*number*number*number*rest)/set_3
++(fontdata*C("SUB")*number*number*rest)/set_2
++(fontdata*C("SUPDROP")*number*rest)/set_1
++(fontdata*C("SUBDROP")*number*rest)/set_1
++(fontdata*C("DELIM")*number*number*rest)/set_2
++(fontdata*C("AXISHEIGHT")*number*rest)/set_1
+ )
+local fullparser=(P("StartFontMetrics")*fontdata*name/start )*(p_charmetrics+p_kernpairs+p_parameters+(1-P("EndFontMetrics")) )^0*(P("EndFontMetrics")/stop )
+local infoparser=(P("StartFontMetrics")*fontdata*name/start )*(p_parameters+(1-P("EndFontMetrics")) )^0*(P("EndFontMetrics")/stop )
+local function read(filename,parser)
+ local afmblob=io.loaddata(filename)
+ if afmblob then
+ local data={
+ resources={
+ filename=resolvers.unresolve(filename),
+ version=afm.version,
+ creator="context mkiv",
+ },
+ properties={
+ hasitalics=false,
+ },
+ goodies={},
+ metadata={
+ filename=file.removesuffix(file.basename(filename))
+ },
+ characters={
+ },
+ descriptions={
+ },
+ }
+ if trace_loading then
+ report_afm("parsing afm file %a",filename)
+ end
+ lpegmatch(parser,afmblob,1,data)
+ return data
+ else
+ if trace_loading then
+ report_afm("no valid afm file %a",filename)
+ end
+ return nil
+ end
+end
+function readers.loadfont(afmname,pfbname)
+ local data=read(resolvers.findfile(afmname),fullparser)
+ if data then
+ if not pfbname or pfbname=="" then
+ pfbname=resolvers.findfile(file.replacesuffix(file.nameonly(afmname),"pfb"))
+ end
+ if pfbname and pfbname~="" then
+ data.resources.filename=resolvers.unresolve(pfbname)
+ get_indexes(data,pfbname)
+ return data
+ else
+ report_afm("no pfb file for %a",afmname)
+ end
+ end
+end
+function readers.loadshapes(filename)
+ local fullname=resolvers.findfile(filename) or ""
+ if fullname=="" then
+ return {
+ filename="not found: "..filename,
+ glyphs={}
+ }
+ else
+ return {
+ filename=fullname,
+ format="opentype",
+ glyphs=get_shapes(fullname) or {},
+ units=1000,
+ }
+ end
+end
+function readers.getinfo(filename)
+ local data=read(resolvers.findfile(filename),infoparser)
+ if data then
+ return data.metadata
+ end
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-onr”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-one” 987c5c5ed3754ad2feab80985067d59e] ---
+
+if not modules then modules={} end modules ['font-one']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local fonts,logs,trackers,containers,resolvers=fonts,logs,trackers,containers,resolvers
+local next,type,tonumber,rawget=next,type,tonumber,rawget
+local match,gsub=string.match,string.gsub
+local abs=math.abs
+local P,S,R,Cmt,C,Ct,Cs,Carg=lpeg.P,lpeg.S,lpeg.R,lpeg.Cmt,lpeg.C,lpeg.Ct,lpeg.Cs,lpeg.Carg
+local lpegmatch,patterns=lpeg.match,lpeg.patterns
+local sortedhash=table.sortedhash
+local trace_features=false trackers.register("afm.features",function(v) trace_features=v end)
+local trace_indexing=false trackers.register("afm.indexing",function(v) trace_indexing=v end)
+local trace_loading=false trackers.register("afm.loading",function(v) trace_loading=v end)
+local trace_defining=false trackers.register("fonts.defining",function(v) trace_defining=v end)
+local report_afm=logs.reporter("fonts","afm loading")
+local setmetatableindex=table.setmetatableindex
+local derivetable=table.derive
+local findbinfile=resolvers.findbinfile
+local privateoffset=fonts.constructors and fonts.constructors.privateoffset or 0xF0000
+local definers=fonts.definers
+local readers=fonts.readers
+local constructors=fonts.constructors
+local afm=constructors.handlers.afm
+local pfb=constructors.handlers.pfb
+local otf=fonts.handlers.otf
+local otfreaders=otf.readers
+local otfenhancers=otf.enhancers
+local afmfeatures=constructors.features.afm
+local registerafmfeature=afmfeatures.register
+local afmenhancers=constructors.enhancers.afm
+local registerafmenhancer=afmenhancers.register
+afm.version=1.513
+afm.cache=containers.define("fonts","one",afm.version,true)
+afm.autoprefixed=true
+afm.helpdata={}
+afm.syncspace=true
+local overloads=fonts.mappings.overloads
+local applyruntimefixes=fonts.treatments and fonts.treatments.applyfixes
+function afm.load(filename)
+ filename=resolvers.findfile(filename,'afm') or ""
+ if filename~="" and not fonts.names.ignoredfile(filename) then
+ local name=file.removesuffix(file.basename(filename))
+ local data=containers.read(afm.cache,name)
+ local attr=lfs.attributes(filename)
+ local size=attr and attr.size or 0
+ local time=attr and attr.modification or 0
+ local pfbfile=file.replacesuffix(name,"pfb")
+ local pfbname=resolvers.findfile(pfbfile,"pfb") or ""
+ if pfbname=="" then
+ pfbname=resolvers.findfile(file.basename(pfbfile),"pfb") or ""
+ end
+ local pfbsize=0
+ local pfbtime=0
+ if pfbname~="" then
+ local attr=lfs.attributes(pfbname)
+ pfbsize=attr.size or 0
+ pfbtime=attr.modification or 0
+ end
+ if not data or data.size~=size or data.time~=time or data.pfbsize~=pfbsize or data.pfbtime~=pfbtime then
+ report_afm("reading %a",filename)
+ data=afm.readers.loadfont(filename,pfbname)
+ if data then
+ afmenhancers.apply(data,filename)
+ fonts.mappings.addtounicode(data,filename)
+ otfreaders.stripredundant(data)
+ otfreaders.pack(data)
+ data.size=size
+ data.time=time
+ data.pfbsize=pfbsize
+ data.pfbtime=pfbtime
+ report_afm("saving %a in cache",name)
+ data=containers.write(afm.cache,name,data)
+ data=containers.read(afm.cache,name)
+ end
+ end
+ if data then
+ otfreaders.unpack(data)
+ otfreaders.expand(data)
+ otfreaders.addunicodetable(data)
+ otfenhancers.apply(data,filename,data)
+ if applyruntimefixes then
+ applyruntimefixes(filename,data)
+ end
+ end
+ return data
+ end
+end
+local uparser=fonts.mappings.makenameparser()
+local function enhance_unify_names(data,filename)
+ local unicodevector=fonts.encodings.agl.unicodes
+ local unicodes={}
+ local names={}
+ local private=data.private or privateoffset
+ local descriptions=data.descriptions
+ for name,blob in sortedhash(data.characters) do
+ local code=unicodevector[name]
+ if not code then
+ code=lpegmatch(uparser,name)
+ if type(code)~="number" then
+ code=private
+ private=private+1
+ report_afm("assigning private slot %U for unknown glyph name %a",code,name)
+ end
+ end
+ local index=blob.index
+ unicodes[name]=code
+ names[name]=index
+ blob.name=name
+ descriptions[code]={
+ boundingbox=blob.boundingbox,
+ width=blob.width,
+ kerns=blob.kerns,
+ index=index,
+ name=name,
+ }
+ end
+ for unicode,description in next,descriptions do
+ local kerns=description.kerns
+ if kerns then
+ local krn={}
+ for name,kern in next,kerns do
+ local unicode=unicodes[name]
+ if unicode then
+ krn[unicode]=kern
+ else
+ end
+ end
+ description.kerns=krn
+ end
+ end
+ data.characters=nil
+ data.private=private
+ local resources=data.resources
+ local filename=resources.filename or file.removesuffix(file.basename(filename))
+ resources.filename=resolvers.unresolve(filename)
+ resources.unicodes=unicodes
+ resources.marks={}
+end
+local everywhere={ ["*"]={ ["*"]=true } }
+local noflags={ false,false,false,false }
+local function enhance_normalize_features(data)
+ local ligatures=setmetatableindex("table")
+ local kerns=setmetatableindex("table")
+ local extrakerns=setmetatableindex("table")
+ for u,c in next,data.descriptions do
+ local l=c.ligatures
+ local k=c.kerns
+ local e=c.extrakerns
+ if l then
+ ligatures[u]=l
+ for u,v in next,l do
+ l[u]={ ligature=v }
+ end
+ c.ligatures=nil
+ end
+ if k then
+ kerns[u]=k
+ for u,v in next,k do
+ k[u]=v
+ end
+ c.kerns=nil
+ end
+ if e then
+ extrakerns[u]=e
+ for u,v in next,e do
+ e[u]=v
+ end
+ c.extrakerns=nil
+ end
+ end
+ local features={
+ gpos={},
+ gsub={},
+ }
+ local sequences={
+ }
+ if next(ligatures) then
+ features.gsub.liga=everywhere
+ data.properties.hasligatures=true
+ sequences[#sequences+1]={
+ features={
+ liga=everywhere,
+ },
+ flags=noflags,
+ name="s_s_0",
+ nofsteps=1,
+ order={ "liga" },
+ type="gsub_ligature",
+ steps={
+ {
+ coverage=ligatures,
+ },
+ },
+ }
+ end
+ if next(kerns) then
+ features.gpos.kern=everywhere
+ data.properties.haskerns=true
+ sequences[#sequences+1]={
+ features={
+ kern=everywhere,
+ },
+ flags=noflags,
+ name="p_s_0",
+ nofsteps=1,
+ order={ "kern" },
+ type="gpos_pair",
+ steps={
+ {
+ format="kern",
+ coverage=kerns,
+ },
+ },
+ }
+ end
+ if next(extrakerns) then
+ features.gpos.extrakerns=everywhere
+ data.properties.haskerns=true
+ sequences[#sequences+1]={
+ features={
+ extrakerns=everywhere,
+ },
+ flags=noflags,
+ name="p_s_1",
+ nofsteps=1,
+ order={ "extrakerns" },
+ type="gpos_pair",
+ steps={
+ {
+ format="kern",
+ coverage=extrakerns,
+ },
+ },
+ }
+ end
+ data.resources.features=features
+ data.resources.sequences=sequences
+end
+local function enhance_fix_names(data)
+ for k,v in next,data.descriptions do
+ local n=v.name
+ local r=overloads[n]
+ if r then
+ local name=r.name
+ if trace_indexing then
+ report_afm("renaming characters %a to %a",n,name)
+ end
+ v.name=name
+ v.unicode=r.unicode
+ end
+ end
+end
+local addthem=function(rawdata,ligatures)
+ if ligatures then
+ local descriptions=rawdata.descriptions
+ local resources=rawdata.resources
+ local unicodes=resources.unicodes
+ for ligname,ligdata in next,ligatures do
+ local one=descriptions[unicodes[ligname]]
+ if one then
+ for _,pair in next,ligdata do
+ local two=unicodes[pair[1]]
+ local three=unicodes[pair[2]]
+ if two and three then
+ local ol=one.ligatures
+ if ol then
+ if not ol[two] then
+ ol[two]=three
+ end
+ else
+ one.ligatures={ [two]=three }
+ end
+ end
+ end
+ end
+ end
+ end
+end
+local function enhance_add_ligatures(rawdata)
+ addthem(rawdata,afm.helpdata.ligatures)
+end
+local function enhance_add_extra_kerns(rawdata)
+ local descriptions=rawdata.descriptions
+ local resources=rawdata.resources
+ local unicodes=resources.unicodes
+ local function do_it_left(what)
+ if what then
+ for unicode,description in next,descriptions do
+ local kerns=description.kerns
+ if kerns then
+ local extrakerns
+ for complex,simple in next,what do
+ complex=unicodes[complex]
+ simple=unicodes[simple]
+ if complex and simple then
+ local ks=kerns[simple]
+ if ks and not kerns[complex] then
+ if extrakerns then
+ extrakerns[complex]=ks
+ else
+ extrakerns={ [complex]=ks }
+ end
+ end
+ end
+ end
+ if extrakerns then
+ description.extrakerns=extrakerns
+ end
+ end
+ end
+ end
+ end
+ local function do_it_copy(what)
+ if what then
+ for complex,simple in next,what do
+ complex=unicodes[complex]
+ simple=unicodes[simple]
+ if complex and simple then
+ local complexdescription=descriptions[complex]
+ if complexdescription then
+ local simpledescription=descriptions[complex]
+ if simpledescription then
+ local extrakerns
+ local kerns=simpledescription.kerns
+ if kerns then
+ for unicode,kern in next,kerns do
+ if extrakerns then
+ extrakerns[unicode]=kern
+ else
+ extrakerns={ [unicode]=kern }
+ end
+ end
+ end
+ local extrakerns=simpledescription.extrakerns
+ if extrakerns then
+ for unicode,kern in next,extrakerns do
+ if extrakerns then
+ extrakerns[unicode]=kern
+ else
+ extrakerns={ [unicode]=kern }
+ end
+ end
+ end
+ if extrakerns then
+ complexdescription.extrakerns=extrakerns
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ do_it_left(afm.helpdata.leftkerned)
+ do_it_left(afm.helpdata.bothkerned)
+ do_it_copy(afm.helpdata.bothkerned)
+ do_it_copy(afm.helpdata.rightkerned)
+end
+local function adddimensions(data)
+ if data then
+ for unicode,description in next,data.descriptions do
+ local bb=description.boundingbox
+ if bb then
+ local ht=bb[4]
+ local dp=-bb[2]
+ if ht==0 or ht<0 then
+ else
+ description.height=ht
+ end
+ if dp==0 or dp<0 then
+ else
+ description.depth=dp
+ end
+ end
+ end
+ end
+end
+local function copytotfm(data)
+ if data and data.descriptions then
+ local metadata=data.metadata
+ local resources=data.resources
+ local properties=derivetable(data.properties)
+ local descriptions=derivetable(data.descriptions)
+ local goodies=derivetable(data.goodies)
+ local characters={}
+ local parameters={}
+ local unicodes=resources.unicodes
+ for unicode,description in next,data.descriptions do
+ characters[unicode]={}
+ end
+ local filename=constructors.checkedfilename(resources)
+ local fontname=metadata.fontname or metadata.fullname
+ local fullname=metadata.fullname or metadata.fontname
+ local endash=0x2013
+ local emdash=0x2014
+ local space=0x0020
+ local spacer="space"
+ local spaceunits=500
+ local monospaced=metadata.monospaced
+ local charwidth=metadata.charwidth
+ local italicangle=metadata.italicangle
+ local charxheight=metadata.xheight and metadata.xheight>0 and metadata.xheight
+ properties.monospaced=monospaced
+ parameters.italicangle=italicangle
+ parameters.charwidth=charwidth
+ parameters.charxheight=charxheight
+ local d_endash=descriptions[endash]
+ local d_emdash=descriptions[emdash]
+ local d_space=descriptions[space]
+ if not d_space or d_space==0 then
+ d_space=d_endash
+ end
+ if d_space then
+ spaceunits,spacer=d_space.width or 0,"space"
+ end
+ if properties.monospaced then
+ if spaceunits==0 and d_emdash then
+ spaceunits,spacer=d_emdash.width or 0,"emdash"
+ end
+ else
+ if spaceunits==0 and d_endash then
+ spaceunits,spacer=d_emdash.width or 0,"endash"
+ end
+ end
+ if spaceunits==0 and charwidth then
+ spaceunits,spacer=charwidth or 0,"charwidth"
+ end
+ if spaceunits==0 then
+ spaceunits=tonumber(spaceunits) or 500
+ end
+ if spaceunits==0 then
+ spaceunits=500
+ end
+ parameters.slant=0
+ parameters.space=spaceunits
+ parameters.space_stretch=500
+ parameters.space_shrink=333
+ parameters.x_height=400
+ parameters.quad=1000
+ if italicangle and italicangle~=0 then
+ parameters.italicangle=italicangle
+ parameters.italicfactor=math.cos(math.rad(90+italicangle))
+ parameters.slant=- math.tan(italicangle*math.pi/180)
+ end
+ if monospaced then
+ parameters.space_stretch=0
+ parameters.space_shrink=0
+ elseif afm.syncspace then
+ parameters.space_stretch=spaceunits/2
+ parameters.space_shrink=spaceunits/3
+ end
+ parameters.extra_space=parameters.space_shrink
+ if charxheight then
+ parameters.x_height=charxheight
+ else
+ local x=0x0078
+ if x then
+ local x=descriptions[x]
+ if x then
+ parameters.x_height=x.height
+ end
+ end
+ end
+ if metadata.sup then
+ local dummy={ 0,0,0 }
+ parameters[ 1]=metadata.designsize or 0
+ parameters[ 2]=metadata.checksum or 0
+ parameters[ 3],
+ parameters[ 4],
+ parameters[ 5]=unpack(metadata.space or dummy)
+ parameters[ 6]=metadata.quad or 0
+ parameters[ 7]=metadata.extraspace or 0
+ parameters[ 8],
+ parameters[ 9],
+ parameters[10]=unpack(metadata.num or dummy)
+ parameters[11],
+ parameters[12]=unpack(metadata.denom or dummy)
+ parameters[13],
+ parameters[14],
+ parameters[15]=unpack(metadata.sup or dummy)
+ parameters[16],
+ parameters[17]=unpack(metadata.sub or dummy)
+ parameters[18]=metadata.supdrop or 0
+ parameters[19]=metadata.subdrop or 0
+ parameters[20],
+ parameters[21]=unpack(metadata.delim or dummy)
+ parameters[22]=metadata.axisheight or 0
+ end
+ parameters.designsize=(metadata.designsize or 10)*65536
+ parameters.ascender=abs(metadata.ascender or 0)
+ parameters.descender=abs(metadata.descender or 0)
+ parameters.units=1000
+ properties.spacer=spacer
+ properties.encodingbytes=2
+ properties.format=fonts.formats[filename] or "type1"
+ properties.filename=filename
+ properties.fontname=fontname
+ properties.fullname=fullname
+ properties.psname=fullname
+ properties.name=filename or fullname or fontname
+ properties.private=properties.private or data.private or privateoffset
+ if next(characters) then
+ return {
+ characters=characters,
+ descriptions=descriptions,
+ parameters=parameters,
+ resources=resources,
+ properties=properties,
+ goodies=goodies,
+ }
+ end
+ end
+ return nil
+end
+function afm.setfeatures(tfmdata,features)
+ local okay=constructors.initializefeatures("afm",tfmdata,features,trace_features,report_afm)
+ if okay then
+ return constructors.collectprocessors("afm",tfmdata,features,trace_features,report_afm)
+ else
+ return {}
+ end
+end
+local function addtables(data)
+ local resources=data.resources
+ local lookuptags=resources.lookuptags
+ local unicodes=resources.unicodes
+ if not lookuptags then
+ lookuptags={}
+ resources.lookuptags=lookuptags
+ end
+ setmetatableindex(lookuptags,function(t,k)
+ local v=type(k)=="number" and ("lookup "..k) or k
+ t[k]=v
+ return v
+ end)
+ if not unicodes then
+ unicodes={}
+ resources.unicodes=unicodes
+ setmetatableindex(unicodes,function(t,k)
+ setmetatableindex(unicodes,nil)
+ for u,d in next,data.descriptions do
+ local n=d.name
+ if n then
+ t[n]=u
+ end
+ end
+ return rawget(t,k)
+ end)
+ end
+ constructors.addcoreunicodes(unicodes)
+end
+local function afmtotfm(specification)
+ local afmname=specification.filename or specification.name
+ if specification.forced=="afm" or specification.format=="afm" then
+ if trace_loading then
+ report_afm("forcing afm format for %a",afmname)
+ end
+ else
+ local tfmname=findbinfile(afmname,"ofm") or ""
+ if tfmname~="" then
+ if trace_loading then
+ report_afm("fallback from afm to tfm for %a",afmname)
+ end
+ return
+ end
+ end
+ if afmname~="" then
+ local features=constructors.checkedfeatures("afm",specification.features.normal)
+ specification.features.normal=features
+ constructors.hashinstance(specification,true)
+ specification=definers.resolve(specification)
+ local cache_id=specification.hash
+ local tfmdata=containers.read(constructors.cache,cache_id)
+ if not tfmdata then
+ local rawdata=afm.load(afmname)
+ if rawdata and next(rawdata) then
+ addtables(rawdata)
+ adddimensions(rawdata)
+ tfmdata=copytotfm(rawdata)
+ if tfmdata and next(tfmdata) then
+ local shared=tfmdata.shared
+ if not shared then
+ shared={}
+ tfmdata.shared=shared
+ end
+ shared.rawdata=rawdata
+ shared.dynamics={}
+ tfmdata.changed={}
+ shared.features=features
+ shared.processes=afm.setfeatures(tfmdata,features)
+ end
+ elseif trace_loading then
+ report_afm("no (valid) afm file found with name %a",afmname)
+ end
+ tfmdata=containers.write(constructors.cache,cache_id,tfmdata)
+ end
+ return tfmdata
+ end
+end
+local function read_from_afm(specification)
+ local tfmdata=afmtotfm(specification)
+ if tfmdata then
+ tfmdata.properties.name=specification.name
+ tfmdata=constructors.scale(tfmdata,specification)
+ local allfeatures=tfmdata.shared.features or specification.features.normal
+ constructors.applymanipulators("afm",tfmdata,allfeatures,trace_features,report_afm)
+ fonts.loggers.register(tfmdata,'afm',specification)
+ end
+ return tfmdata
+end
+registerafmfeature {
+ name="mode",
+ description="mode",
+ initializers={
+ base=otf.modeinitializer,
+ node=otf.modeinitializer,
+ }
+}
+registerafmfeature {
+ name="features",
+ description="features",
+ default=true,
+ initializers={
+ node=otf.nodemodeinitializer,
+ base=otf.basemodeinitializer,
+ },
+ processors={
+ node=otf.featuresprocessor,
+ }
+}
+fonts.formats.afm="type1"
+fonts.formats.pfb="type1"
+local function check_afm(specification,fullname)
+ local foundname=findbinfile(fullname,'afm') or ""
+ if foundname=="" then
+ foundname=fonts.names.getfilename(fullname,"afm") or ""
+ end
+ if fullname and foundname=="" and afm.autoprefixed then
+ local encoding,shortname=match(fullname,"^(.-)%-(.*)$")
+ if encoding and shortname and fonts.encodings.known[encoding] then
+ shortname=findbinfile(shortname,'afm') or ""
+ if shortname~="" then
+ foundname=shortname
+ if trace_defining then
+ report_afm("stripping encoding prefix from filename %a",afmname)
+ end
+ end
+ end
+ end
+ if foundname~="" then
+ specification.filename=foundname
+ specification.format="afm"
+ return read_from_afm(specification)
+ end
+end
+function readers.afm(specification,method)
+ local fullname=specification.filename or ""
+ local tfmdata=nil
+ if fullname=="" then
+ local forced=specification.forced or ""
+ if forced~="" then
+ tfmdata=check_afm(specification,specification.name.."."..forced)
+ end
+ if not tfmdata then
+ local check_tfm=readers.check_tfm
+ method=(check_tfm and (method or definers.method or "afm or tfm")) or "afm"
+ if method=="tfm" then
+ tfmdata=check_tfm(specification,specification.name)
+ elseif method=="afm" then
+ tfmdata=check_afm(specification,specification.name)
+ elseif method=="tfm or afm" then
+ tfmdata=check_tfm(specification,specification.name) or check_afm(specification,specification.name)
+ else
+ tfmdata=check_afm(specification,specification.name) or check_tfm(specification,specification.name)
+ end
+ end
+ else
+ tfmdata=check_afm(specification,fullname)
+ end
+ return tfmdata
+end
+function readers.pfb(specification,method)
+ local original=specification.specification
+ if trace_defining then
+ report_afm("using afm reader for %a",original)
+ end
+ specification.forced="afm"
+ local function swap(name)
+ local value=specification[swap]
+ if value then
+ specification[swap]=gsub("%.pfb",".afm",1)
+ end
+ end
+ swap("filename")
+ swap("fullname")
+ swap("forcedname")
+ swap("specification")
+ return readers.afm(specification,method)
+end
+registerafmenhancer("unify names",enhance_unify_names)
+registerafmenhancer("add ligatures",enhance_add_ligatures)
+registerafmenhancer("add extra kerns",enhance_add_extra_kerns)
+registerafmenhancer("normalize features",enhance_normalize_features)
+registerafmenhancer("check extra features",otfenhancers.enhance)
+registerafmenhancer("fix names",enhance_fix_names)
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-one”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-afk” 54d554530e75c57c56ee76234724e26d] ---
+
+if not modules then modules={} end modules ['font-afk']={
+ version=1.001,
+ comment="companion to font-lib.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files",
+ dataonly=true,
+}
+local allocate=utilities.storage.allocate
+fonts.handlers.afm.helpdata={
+ ligatures=allocate {
+ ['f']={
+ { 'f','ff' },
+ { 'i','fi' },
+ { 'l','fl' },
+ },
+ ['ff']={
+ { 'i','ffi' }
+ },
+ ['fi']={
+ { 'i','fii' }
+ },
+ ['fl']={
+ { 'i','fli' }
+ },
+ ['s']={
+ { 't','st' }
+ },
+ ['i']={
+ { 'j','ij' }
+ },
+ },
+ texligatures=allocate {
+ ['quoteleft']={
+ { 'quoteleft','quotedblleft' }
+ },
+ ['quoteright']={
+ { 'quoteright','quotedblright' }
+ },
+ ['hyphen']={
+ { 'hyphen','endash' }
+ },
+ ['endash']={
+ { 'hyphen','emdash' }
+ }
+ },
+ leftkerned=allocate {
+ 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",
+ },
+ rightkerned=allocate {
+ 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",
+ },
+ bothkerned=allocate {
+ 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",
+ }
+}
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-afk”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “fonts-tfm” 3bbba3214fd0b8c6f35ad85592fc2917] ---
+
+if not modules then modules={} end modules ['luatex-fonts-tfm']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local next,type=next,type
+local match,format=string.match,string.format
+local concat,sortedhash=table.concat,table.sortedhash
+local idiv=number.idiv
+local trace_defining=false trackers.register("fonts.defining",function(v) trace_defining=v end)
+local trace_features=false trackers.register("tfm.features",function(v) trace_features=v end)
+local report_defining=logs.reporter("fonts","defining")
+local report_tfm=logs.reporter("fonts","tfm loading")
+local findbinfile=resolvers.findbinfile
+local setmetatableindex=table.setmetatableindex
+local fonts=fonts
+local handlers=fonts.handlers
+local helpers=fonts.helpers
+local readers=fonts.readers
+local constructors=fonts.constructors
+local encodings=fonts.encodings
+local tfm=constructors.handlers.tfm
+tfm.version=1.000
+tfm.maxnestingdepth=5
+tfm.maxnestingsize=65536*1024
+local otf=fonts.handlers.otf
+local otfenhancers=otf.enhancers
+local tfmfeatures=constructors.features.tfm
+local registertfmfeature=tfmfeatures.register
+local tfmenhancers=constructors.enhancers.tfm
+local registertfmenhancer=tfmenhancers.register
+local charcommand=helpers.commands.char
+constructors.resolvevirtualtoo=false
+fonts.formats.tfm="type1"
+fonts.formats.ofm="type1"
+function tfm.setfeatures(tfmdata,features)
+ local okay=constructors.initializefeatures("tfm",tfmdata,features,trace_features,report_tfm)
+ if okay then
+ return constructors.collectprocessors("tfm",tfmdata,features,trace_features,report_tfm)
+ else
+ return {}
+ end
+end
+local depth={}
+local loadtfm=font.read_tfm
+local loadvf=font.read_vf
+local function read_from_tfm(specification)
+ local filename=specification.filename
+ local size=specification.size
+ depth[filename]=(depth[filename] or 0)+1
+ if trace_defining then
+ report_defining("loading tfm file %a at size %s",filename,size)
+ end
+ local tfmdata=loadtfm(filename,size)
+ if tfmdata then
+ local features=specification.features and specification.features.normal or {}
+ local features=constructors.checkedfeatures("tfm",features)
+ specification.features.normal=features
+ local newtfmdata=(depth[filename]==1) and tfm.reencode(tfmdata,specification)
+ if newtfmdata then
+ tfmdata=newtfmdata
+ end
+ local resources=tfmdata.resources or {}
+ local properties=tfmdata.properties or {}
+ local parameters=tfmdata.parameters or {}
+ local shared=tfmdata.shared or {}
+ shared.features=features
+ shared.resources=resources
+ properties.name=tfmdata.name
+ properties.fontname=tfmdata.fontname
+ properties.psname=tfmdata.psname
+ properties.fullname=tfmdata.fullname
+ properties.filename=specification.filename
+ properties.format=tfmdata.format or fonts.formats.tfm
+ properties.usedbitmap=tfmdata.usedbitmap
+ tfmdata.properties=properties
+ tfmdata.resources=resources
+ tfmdata.parameters=parameters
+ tfmdata.shared=shared
+ shared.rawdata={ resources=resources }
+ shared.features=features
+ if newtfmdata then
+ if not resources.marks then
+ resources.marks={}
+ end
+ if not resources.sequences then
+ resources.sequences={}
+ end
+ if not resources.features then
+ resources.features={
+ gsub={},
+ gpos={},
+ }
+ end
+ if not tfmdata.changed then
+ tfmdata.changed={}
+ end
+ if not tfmdata.descriptions then
+ tfmdata.descriptions=tfmdata.characters
+ end
+ otf.readers.addunicodetable(tfmdata)
+ tfmenhancers.apply(tfmdata,filename)
+ constructors.applymanipulators("tfm",tfmdata,features,trace_features,report_tfm)
+ otf.readers.unifymissing(tfmdata)
+ fonts.mappings.addtounicode(tfmdata,filename)
+ tfmdata.tounicode=1
+ local tounicode=fonts.mappings.tounicode
+ for unicode,v in next,tfmdata.characters do
+ local u=v.unicode
+ if u then
+ v.tounicode=tounicode(u)
+ end
+ end
+ if tfmdata.usedbitmap then
+ tfm.addtounicode(tfmdata)
+ end
+ end
+ shared.processes=next(features) and tfm.setfeatures(tfmdata,features) or nil
+ if size<0 then
+ size=idiv(65536*-size,100)
+ end
+ parameters.factor=1
+ parameters.units=1000
+ parameters.size=size
+ parameters.slant=parameters.slant or parameters[1] or 0
+ parameters.space=parameters.space or parameters[2] or 0
+ parameters.space_stretch=parameters.space_stretch or parameters[3] or 0
+ parameters.space_shrink=parameters.space_shrink or parameters[4] or 0
+ parameters.x_height=parameters.x_height or parameters[5] or 0
+ parameters.quad=parameters.quad or parameters[6] or 0
+ parameters.extra_space=parameters.extra_space or parameters[7] or 0
+ constructors.enhanceparameters(parameters)
+ properties.private=properties.private or tfmdata.private or privateoffset
+ if newtfmdata then
+ elseif constructors.resolvevirtualtoo then
+ fonts.loggers.register(tfmdata,file.suffix(filename),specification)
+ local vfname=findbinfile(specification.name,'ovf')
+ if vfname and vfname~="" then
+ local vfdata=loadvf(vfname,size)
+ if vfdata then
+ local chars=tfmdata.characters
+ for k,v in next,vfdata.characters do
+ chars[k].commands=v.commands
+ end
+ properties.virtualized=true
+ tfmdata.fonts=vfdata.fonts
+ tfmdata.type="virtual"
+ local fontlist=vfdata.fonts
+ local name=file.nameonly(filename)
+ for i=1,#fontlist do
+ local n=fontlist[i].name
+ local s=fontlist[i].size
+ local d=depth[filename]
+ s=constructors.scaled(s,vfdata.designsize)
+ if d>tfm.maxnestingdepth then
+ report_defining("too deeply nested virtual font %a with size %a, max nesting depth %s",n,s,tfm.maxnestingdepth)
+ fontlist[i]={ id=0 }
+ elseif (d>1) and (s>tfm.maxnestingsize) then
+ report_defining("virtual font %a exceeds size %s",n,s)
+ fontlist[i]={ id=0 }
+ else
+ local t,id=constructors.readanddefine(n,s)
+ fontlist[i]={ id=id }
+ end
+ end
+ end
+ end
+ end
+ properties.haskerns=true
+ properties.hasligatures=true
+ properties.hasitalics=true
+ resources.unicodes={}
+ resources.lookuptags={}
+ depth[filename]=depth[filename]-1
+ return tfmdata
+ else
+ depth[filename]=depth[filename]-1
+ end
+end
+local function check_tfm(specification,fullname)
+ local foundname=findbinfile(fullname,'tfm') or ""
+ if foundname=="" then
+ foundname=findbinfile(fullname,'ofm') or ""
+ end
+ if foundname=="" then
+ foundname=fonts.names.getfilename(fullname,"tfm") or ""
+ end
+ if foundname~="" then
+ specification.filename=foundname
+ specification.format="ofm"
+ return read_from_tfm(specification)
+ elseif trace_defining then
+ report_defining("loading tfm with name %a fails",specification.name)
+ end
+end
+readers.check_tfm=check_tfm
+function readers.tfm(specification)
+ local fullname=specification.filename or ""
+ if fullname=="" then
+ local forced=specification.forced or ""
+ if forced~="" then
+ fullname=specification.name.."."..forced
+ else
+ fullname=specification.name
+ end
+ end
+ return check_tfm(specification,fullname)
+end
+readers.ofm=readers.tfm
+do
+ local outfiles={}
+ local tfmcache=table.setmetatableindex(function(t,tfmdata)
+ local id=font.define(tfmdata)
+ t[tfmdata]=id
+ return id
+ end)
+ local encdone=table.setmetatableindex("table")
+ function tfm.reencode(tfmdata,specification)
+ local features=specification.features
+ if not features then
+ return
+ end
+ local features=features.normal
+ if not features then
+ return
+ end
+ local tfmfile=file.basename(tfmdata.name)
+ local encfile=features.reencode
+ local pfbfile=features.pfbfile
+ local bitmap=features.bitmap
+ if not encfile then
+ return
+ end
+ local pfbfile=outfiles[tfmfile]
+ if pfbfile==nil then
+ if bitmap then
+ pfbfile=false
+ elseif type(pfbfile)~="string" then
+ pfbfile=tfmfile
+ end
+ if type(pfbfile)=="string" then
+ pfbfile=file.addsuffix(pfbfile,"pfb")
+ report_tfm("using type1 shapes from %a for %a",pfbfile,tfmfile)
+ else
+ report_tfm("using bitmap shapes for %a",tfmfile)
+ pfbfile=false
+ end
+ outfiles[tfmfile]=pfbfile
+ end
+ local encoding=false
+ local vector=false
+ if type(pfbfile)=="string" then
+ local pfb=constructors.handlers.pfb
+ if pfb and pfb.loadvector then
+ local v,e=pfb.loadvector(pfbfile)
+ if v then
+ vector=v
+ end
+ if e then
+ encoding=e
+ end
+ end
+ end
+ if type(encfile)=="string" and encfile~="auto" then
+ encoding=fonts.encodings.load(file.addsuffix(encfile,"enc"))
+ if encoding then
+ encoding=encoding.vector
+ end
+ end
+ if not encoding then
+ report_tfm("bad encoding for %a, quitting",tfmfile)
+ return
+ end
+ local unicoding=fonts.encodings.agl and fonts.encodings.agl.unicodes
+ local virtualid=tfmcache[tfmdata]
+ local tfmdata=table.copy(tfmdata)
+ local characters={}
+ local originals=tfmdata.characters
+ local indices={}
+ local parentfont={ "font",1 }
+ local private=tfmdata.privateoffset or constructors.privateoffset
+ local reported=encdone[tfmfile][encfile]
+ local backmap=vector and table.swapped(vector)
+ local done={}
+ for index,name in sortedhash(encoding) do
+ local unicode=unicoding[name]
+ local original=originals[index]
+ if original then
+ if unicode then
+ original.unicode=unicode
+ else
+ unicode=private
+ private=private+1
+ if not reported then
+ report_tfm("glyph %a in font %a with encoding %a gets unicode %U",name,tfmfile,encfile,unicode)
+ end
+ end
+ characters[unicode]=original
+ indices[index]=unicode
+ original.name=name
+ if backmap then
+ original.index=backmap[name]
+ else
+ original.commands={ parentfont,charcommand[index] }
+ original.oindex=index
+ end
+ done[name]=true
+ elseif not done[name] then
+ report_tfm("bad index %a in font %a with name %a",index,tfmfile,name)
+ end
+ end
+ encdone[tfmfile][encfile]=true
+ for k,v in next,characters do
+ local kerns=v.kerns
+ if kerns then
+ local t={}
+ for k,v in next,kerns do
+ local i=indices[k]
+ if i then
+ t[i]=v
+ end
+ end
+ v.kerns=next(t) and t or nil
+ end
+ local ligatures=v.ligatures
+ if ligatures then
+ local t={}
+ for k,v in next,ligatures do
+ local i=indices[k]
+ if i then
+ t[i]=v
+ v.char=indices[v.char]
+ end
+ end
+ v.ligatures=next(t) and t or nil
+ end
+ end
+ tfmdata.fonts={ { id=virtualid } }
+ tfmdata.characters=characters
+ tfmdata.fullname=tfmdata.fullname or tfmdata.name
+ tfmdata.psname=file.nameonly(pfbfile or tfmdata.name)
+ tfmdata.filename=pfbfile
+ tfmdata.encodingbytes=2
+ tfmdata.format="type1"
+ tfmdata.tounicode=1
+ tfmdata.embedding="subset"
+ tfmdata.usedbitmap=bitmap and virtualid
+ tfmdata.private=private
+ return tfmdata
+ end
+end
+do
+ local template=[[
+/CIDInit /ProcSet findresource begin
+ 12 dict begin
+ begincmap
+ /CIDSystemInfo << /Registry (TeX) /Ordering (bitmap-%s) /Supplement 0 >> def
+ /CMapName /TeX-bitmap-%s def
+ /CMapType 2 def
+ 1 begincodespacerange
+ <00>
+ endcodespacerange
+ %s beginbfchar
+%s
+ endbfchar
+ endcmap
+CMapName currentdict /CMap defineresource pop end
+end
+end
+]]
+ local flushstreamobject=lpdf and lpdf.flushstreamobject
+ local setfontattributes=lpdf and lpdf.setfontattributes
+ if not flushstreamobject then
+ flushstreamobject=function(data)
+ return pdf.obj { immediate=true,type="stream",string=data }
+ end
+ end
+ if not setfontattributes then
+ setfontattributes=function(id,data)
+ return pdf.setfontattributes(id,data)
+ end
+ end
+ function tfm.addtounicode(tfmdata)
+ local id=tfmdata.usedbitmap
+ local map={}
+ local char={}
+ for k,v in next,tfmdata.characters do
+ local index=v.oindex
+ local tounicode=v.tounicode
+ if index and tounicode then
+ map[index]=tounicode
+ end
+ end
+ for k,v in sortedhash(map) do
+ char[#char+1]=format("<%02X> <%s>",k,v)
+ end
+ char=concat(char,"\n")
+ local stream=format(template,id,id,#char,char)
+ local reference=flushstreamobject(stream,nil,true)
+ setfontattributes(id,format("/ToUnicode %i 0 R",reference))
+ end
+end
+do
+ local everywhere={ ["*"]={ ["*"]=true } }
+ local noflags={ false,false,false,false }
+ local function enhance_normalize_features(data)
+ local ligatures=setmetatableindex("table")
+ local kerns=setmetatableindex("table")
+ local characters=data.characters
+ for u,c in next,characters do
+ local l=c.ligatures
+ local k=c.kerns
+ if l then
+ ligatures[u]=l
+ for u,v in next,l do
+ l[u]={ ligature=v.char }
+ end
+ c.ligatures=nil
+ end
+ if k then
+ kerns[u]=k
+ for u,v in next,k do
+ k[u]=v
+ end
+ c.kerns=nil
+ end
+ end
+ for u,l in next,ligatures do
+ for k,v in next,l do
+ local vl=v.ligature
+ local dl=ligatures[vl]
+ if dl then
+ for kk,vv in next,dl do
+ v[kk]=vv
+ end
+ end
+ end
+ end
+ local features={
+ gpos={},
+ gsub={},
+ }
+ local sequences={
+ }
+ if next(ligatures) then
+ features.gsub.liga=everywhere
+ data.properties.hasligatures=true
+ sequences[#sequences+1]={
+ features={
+ liga=everywhere,
+ },
+ flags=noflags,
+ name="s_s_0",
+ nofsteps=1,
+ order={ "liga" },
+ type="gsub_ligature",
+ steps={
+ {
+ coverage=ligatures,
+ },
+ },
+ }
+ end
+ if next(kerns) then
+ features.gpos.kern=everywhere
+ data.properties.haskerns=true
+ sequences[#sequences+1]={
+ features={
+ kern=everywhere,
+ },
+ flags=noflags,
+ name="p_s_0",
+ nofsteps=1,
+ order={ "kern" },
+ type="gpos_pair",
+ steps={
+ {
+ format="kern",
+ coverage=kerns,
+ },
+ },
+ }
+ end
+ data.resources.features=features
+ data.resources.sequences=sequences
+ data.shared.resources=data.shared.resources or resources
+ end
+ registertfmenhancer("normalize features",enhance_normalize_features)
+ registertfmenhancer("check extra features",otfenhancers.enhance)
+end
+registertfmfeature {
+ name="mode",
+ description="mode",
+ initializers={
+ base=otf.modeinitializer,
+ node=otf.modeinitializer,
+ }
+}
+registertfmfeature {
+ name="features",
+ description="features",
+ default=true,
+ initializers={
+ base=otf.basemodeinitializer,
+ node=otf.nodemodeinitializer,
+ },
+ processors={
+ node=otf.featuresprocessor,
+ }
+}
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “fonts-tfm”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-lua” 55b281fb98f7bd848fc19928f376f647] ---
+
+if not modules then modules={} end modules ['font-lua']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local trace_defining=false trackers.register("fonts.defining",function(v) trace_defining=v end)
+local report_lua=logs.reporter("fonts","lua loading")
+local fonts=fonts
+local readers=fonts.readers
+fonts.formats.lua="lua"
+local function check_lua(specification,fullname)
+ local fullname=resolvers.findfile(fullname) or ""
+ if fullname~="" then
+ local loader=loadfile(fullname)
+ loader=loader and loader()
+ return loader and loader(specification)
+ end
+end
+readers.check_lua=check_lua
+function readers.lua(specification)
+ local original=specification.specification
+ if trace_defining then
+ report_lua("using lua reader for %a",original)
+ end
+ local fullname=specification.filename or ""
+ if fullname=="" then
+ local forced=specification.forced or ""
+ if forced~="" then
+ fullname=specification.name.."."..forced
+ else
+ fullname=specification.name
+ end
+ end
+ return check_lua(specification,fullname)
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-lua”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-def” c525b9f55da1c736a1f6939c0a6f8f00] ---
+
+if not modules then modules={} end modules ['font-def']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local lower,gsub=string.lower,string.gsub
+local tostring,next=tostring,next
+local lpegmatch=lpeg.match
+local suffixonly,removesuffix,basename=file.suffix,file.removesuffix,file.basename
+local formatters=string.formatters
+local sortedhash,sortedkeys=table.sortedhash,table.sortedkeys
+local allocate=utilities.storage.allocate
+local trace_defining=false trackers .register("fonts.defining",function(v) trace_defining=v end)
+local directive_embedall=false directives.register("fonts.embedall",function(v) directive_embedall=v end)
+trackers.register("fonts.loading","fonts.defining","otf.loading","afm.loading","tfm.loading")
+local report_defining=logs.reporter("fonts","defining")
+local fonts=fonts
+local fontdata=fonts.hashes.identifiers
+local readers=fonts.readers
+local definers=fonts.definers
+local specifiers=fonts.specifiers
+local constructors=fonts.constructors
+local fontgoodies=fonts.goodies
+readers.sequence=allocate { 'otf','ttf','afm','tfm','lua' }
+local variants=allocate()
+specifiers.variants=variants
+definers.methods=definers.methods or {}
+local internalized=allocate()
+local loadedfonts=constructors.loadedfonts
+local designsizes=constructors.designsizes
+local resolvefile=fontgoodies and fontgoodies.filenames and fontgoodies.filenames.resolve or function(s) return s end
+local function makespecification(specification,lookup,name,sub,method,detail,size)
+ size=size or 655360
+ if not lookup or lookup=="" then
+ lookup=definers.defaultlookup
+ end
+ if trace_defining then
+ report_defining("specification %a, lookup %a, name %a, sub %a, method %a, detail %a",
+ specification,lookup,name,sub,method,detail)
+ end
+ local t={
+ lookup=lookup,
+ specification=specification,
+ size=size,
+ name=name,
+ sub=sub,
+ method=method,
+ detail=detail,
+ resolved="",
+ forced="",
+ features={},
+ }
+ return t
+end
+definers.makespecification=makespecification
+if context then
+ local splitter,splitspecifiers=nil,""
+ local P,C,S,Cc,Cs=lpeg.P,lpeg.C,lpeg.S,lpeg.Cc,lpeg.Cs
+ local left=P("(")
+ local right=P(")")
+ local colon=P(":")
+ local space=P(" ")
+ local lbrace=P("{")
+ local rbrace=P("}")
+ definers.defaultlookup="file"
+ local prefixpattern=P(false)
+ local function addspecifier(symbol)
+ splitspecifiers=splitspecifiers..symbol
+ local method=S(splitspecifiers)
+ local lookup=C(prefixpattern)*colon
+ local sub=left*C(P(1-left-right-method)^1)*right
+ local specification=C(method)*C(P(1)^1)
+ local name=Cs((lbrace/"")*(1-rbrace)^1*(rbrace/"")+(1-sub-specification)^1)
+ splitter=P((lookup+Cc(""))*name*(sub+Cc(""))*(specification+Cc("")))
+ end
+ local function addlookup(str)
+ prefixpattern=prefixpattern+P(str)
+ end
+ definers.addlookup=addlookup
+ addlookup("file")
+ addlookup("name")
+ addlookup("spec")
+ local function getspecification(str)
+ return lpegmatch(splitter,str or "")
+ end
+ definers.getspecification=getspecification
+ function definers.registersplit(symbol,action,verbosename)
+ addspecifier(symbol)
+ variants[symbol]=action
+ if verbosename then
+ variants[verbosename]=action
+ end
+ end
+ function definers.analyze(specification,size)
+ local lookup,name,sub,method,detail=getspecification(specification or "")
+ return makespecification(specification,lookup,name,sub,method,detail,size)
+ end
+end
+definers.resolvers=definers.resolvers or {}
+local resolvers=definers.resolvers
+function resolvers.file(specification)
+ local name=resolvefile(specification.name)
+ local suffix=lower(suffixonly(name))
+ if fonts.formats[suffix] then
+ specification.forced=suffix
+ specification.forcedname=name
+ specification.name=removesuffix(name)
+ else
+ specification.name=name
+ end
+end
+function resolvers.name(specification)
+ local resolve=fonts.names.resolve
+ if resolve then
+ local resolved,sub,subindex,instance=resolve(specification.name,specification.sub,specification)
+ if resolved then
+ specification.resolved=resolved
+ specification.sub=sub
+ specification.subindex=subindex
+ if instance then
+ specification.instance=instance
+ local features=specification.features
+ if not features then
+ features={}
+ specification.features=features
+ end
+ local normal=features.normal
+ if not normal then
+ normal={}
+ features.normal=normal
+ end
+ normal.instance=instance
+ end
+ local suffix=lower(suffixonly(resolved))
+ if fonts.formats[suffix] then
+ specification.forced=suffix
+ specification.forcedname=resolved
+ specification.name=removesuffix(resolved)
+ else
+ specification.name=resolved
+ end
+ end
+ else
+ resolvers.file(specification)
+ end
+end
+function resolvers.spec(specification)
+ local resolvespec=fonts.names.resolvespec
+ if resolvespec then
+ local resolved,sub,subindex=resolvespec(specification.name,specification.sub,specification)
+ if resolved then
+ specification.resolved=resolved
+ specification.sub=sub
+ specification.subindex=subindex
+ specification.forced=lower(suffixonly(resolved))
+ specification.forcedname=resolved
+ specification.name=removesuffix(resolved)
+ end
+ else
+ resolvers.name(specification)
+ end
+end
+function definers.resolve(specification)
+ if not specification.resolved or specification.resolved=="" then
+ local r=resolvers[specification.lookup]
+ if r then
+ r(specification)
+ end
+ end
+ if specification.forced=="" then
+ specification.forced=nil
+ specification.forcedname=nil
+ end
+ specification.hash=lower(specification.name..' @ '..constructors.hashfeatures(specification))
+ if specification.sub and specification.sub~="" then
+ specification.hash=specification.sub..' @ '..specification.hash
+ end
+ return specification
+end
+function definers.applypostprocessors(tfmdata)
+ local postprocessors=tfmdata.postprocessors
+ if postprocessors then
+ local properties=tfmdata.properties
+ for i=1,#postprocessors do
+ local extrahash=postprocessors[i](tfmdata)
+ if type(extrahash)=="string" and extrahash~="" then
+ extrahash=gsub(lower(extrahash),"[^a-z]","-")
+ properties.fullname=formatters["%s-%s"](properties.fullname,extrahash)
+ end
+ end
+ end
+ return tfmdata
+end
+local function checkembedding(tfmdata)
+ local properties=tfmdata.properties
+ local embedding
+ if directive_embedall then
+ embedding="full"
+ elseif properties and properties.filename and constructors.dontembed[properties.filename] then
+ embedding="no"
+ else
+ embedding="subset"
+ end
+ if properties then
+ properties.embedding=embedding
+ else
+ tfmdata.properties={ embedding=embedding }
+ end
+ tfmdata.embedding=embedding
+end
+local function checkfeatures(tfmdata)
+ local resources=tfmdata.resources
+ local shared=tfmdata.shared
+ if resources and shared then
+ local features=resources.features
+ local usedfeatures=shared.features
+ if features and usedfeatures then
+ local usedlanguage=usedfeatures.language or "dflt"
+ local usedscript=usedfeatures.script or "dflt"
+ local function check(what)
+ if what then
+ local foundlanguages={}
+ for feature,scripts in next,what do
+ if usedscript=="auto" or scripts["*"] then
+ elseif not scripts[usedscript] then
+ else
+ for script,languages in next,scripts do
+ if languages["*"] then
+ elseif context and not languages[usedlanguage] then
+ report_defining("font %!font:name!, feature %a, script %a, no language %a",
+ tfmdata,feature,script,usedlanguage)
+ end
+ end
+ end
+ for script,languages in next,scripts do
+ for language in next,languages do
+ foundlanguages[language]=true
+ end
+ end
+ end
+ if false then
+ foundlanguages["*"]=nil
+ foundlanguages=sortedkeys(foundlanguages)
+ for feature,scripts in sortedhash(what) do
+ for script,languages in next,scripts do
+ if not languages["*"] then
+ for i=1,#foundlanguages do
+ local language=foundlanguages[i]
+ if context and not languages[language] then
+ report_defining("font %!font:name!, feature %a, script %a, no language %a",
+ tfmdata,feature,script,language)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ check(features.gsub)
+ check(features.gpos)
+ end
+ end
+end
+function definers.loadfont(specification)
+ local hash=constructors.hashinstance(specification)
+ local tfmdata=loadedfonts[hash]
+ if not tfmdata then
+ local forced=specification.forced or ""
+ if forced~="" then
+ local reader=readers[lower(forced)]
+ tfmdata=reader and reader(specification)
+ if not tfmdata then
+ report_defining("forced type %a of %a not found",forced,specification.name)
+ end
+ else
+ local sequence=readers.sequence
+ for s=1,#sequence do
+ local reader=sequence[s]
+ if readers[reader] then
+ if trace_defining then
+ report_defining("trying (reader sequence driven) type %a for %a with file %a",reader,specification.name,specification.filename)
+ end
+ tfmdata=readers[reader](specification)
+ if tfmdata then
+ break
+ else
+ specification.filename=nil
+ end
+ end
+ end
+ end
+ if tfmdata then
+ tfmdata=definers.applypostprocessors(tfmdata)
+ checkembedding(tfmdata)
+ loadedfonts[hash]=tfmdata
+ designsizes[specification.hash]=tfmdata.parameters.designsize
+ checkfeatures(tfmdata)
+ end
+ end
+ if not tfmdata then
+ report_defining("font with asked name %a is not found using lookup %a",specification.name,specification.lookup)
+ end
+ return tfmdata
+end
+function constructors.readanddefine(name,size)
+ local specification=definers.analyze(name,size)
+ local method=specification.method
+ if method and variants[method] then
+ specification=variants[method](specification)
+ end
+ specification=definers.resolve(specification)
+ local hash=constructors.hashinstance(specification)
+ local id=definers.registered(hash)
+ if not id then
+ local tfmdata=definers.loadfont(specification)
+ if tfmdata then
+ tfmdata.properties.hash=hash
+ id=font.define(tfmdata)
+ definers.register(tfmdata,id)
+ else
+ id=0
+ end
+ end
+ return fontdata[id],id
+end
+function definers.registered(hash)
+ local id=internalized[hash]
+ return id,id and fontdata[id]
+end
+function definers.register(tfmdata,id)
+ if tfmdata and id then
+ local hash=tfmdata.properties.hash
+ if not hash then
+ report_defining("registering font, id %a, name %a, invalid hash",id,tfmdata.properties.filename or "?")
+ elseif not internalized[hash] then
+ internalized[hash]=id
+ if trace_defining then
+ report_defining("registering font, id %s, hash %a",id,hash)
+ end
+ fontdata[id]=tfmdata
+ end
+ end
+end
+function definers.read(specification,size,id)
+ statistics.starttiming(fonts)
+ if type(specification)=="string" then
+ specification=definers.analyze(specification,size)
+ end
+ local method=specification.method
+ if method and variants[method] then
+ specification=variants[method](specification)
+ end
+ specification=definers.resolve(specification)
+ local hash=constructors.hashinstance(specification)
+ local tfmdata=definers.registered(hash)
+ if tfmdata then
+ if trace_defining then
+ report_defining("already hashed: %s",hash)
+ end
+ else
+ tfmdata=definers.loadfont(specification)
+ if tfmdata then
+ if trace_defining then
+ report_defining("loaded and hashed: %s",hash)
+ end
+ tfmdata.properties.hash=hash
+ if id then
+ definers.register(tfmdata,id)
+ end
+ else
+ if trace_defining then
+ report_defining("not loaded and hashed: %s",hash)
+ end
+ end
+ end
+ if not tfmdata then
+ report_defining("unknown font %a, loading aborted",specification.name)
+ elseif trace_defining and type(tfmdata)=="table" then
+ local properties=tfmdata.properties or {}
+ local parameters=tfmdata.parameters or {}
+ report_defining("using %a font with id %a, name %a, size %a, bytes %a, encoding %a, fullname %a, filename %a",
+ properties.format or "unknown",id or "-",properties.name,parameters.size,properties.encodingbytes,
+ properties.encodingname,properties.fullname,basename(properties.filename))
+ end
+ statistics.stoptiming(fonts)
+ return tfmdata
+end
+function font.getfont(id)
+ return fontdata[id]
+end
+if not context then
+ callbacks.register('define_font',definers.read,"definition of fonts (tfmdata preparation)")
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-def”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “fonts-def” 5ad79120ebc5e60f4d322fb3ee13bffe] ---
+
+if not modules then modules={} end modules ['luatex-fonts-def']={
+ version=1.001,
+ comment="companion to luatex-*.tex",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+if context then
+ os.exit()
+end
+local fonts=fonts
+fonts.constructors.namemode="specification"
+function fonts.definers.getspecification(str)
+ return "",str,"",":",str
+end
+local list={}
+local function issome () list.lookup='name' end
+local function isfile () list.lookup='file' end
+local function isname () list.lookup='name' end
+local function thename(s) list.name=s end
+local function issub (v) list.sub=v end
+local function iscrap (s) list.crap=string.lower(s) end
+local function iskey (k,v) list[k]=v end
+local function istrue (s) list[s]=true end
+local function isfalse(s) list[s]=false end
+local P,S,R,C,Cs=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs
+local spaces=P(" ")^0
+local namespec=Cs((P("{")/"")*(1-S("}"))^0*(P("}")/"")+(1-S("/:("))^0)
+local crapspec=spaces*P("/")*(((1-P(":"))^0)/iscrap)*spaces
+local filename_1=P("file:")/isfile*(namespec/thename)
+local filename_2=P("[")*P(true)/isfile*(((1-P("]"))^0)/thename)*P("]")
+local fontname_1=P("name:")/isname*(namespec/thename)
+local fontname_2=P(true)/issome*(namespec/thename)
+local sometext=R("az","AZ","09")^1
+local somekey=R("az","AZ","09")^1
+local somevalue=(P("{")/"")*(1-P("}"))^0*(P("}")/"")+(1-S(";"))^1
+local truevalue=P("+")*spaces*(sometext/istrue)
+local falsevalue=P("-")*spaces*(sometext/isfalse)
+local keyvalue=(C(somekey)*spaces*P("=")*spaces*C(somevalue))/iskey
+local somevalue=sometext/istrue
+local subvalue=P("(")*(C(P(1-S("()"))^1)/issub)*P(")")
+local option=spaces*(keyvalue+falsevalue+truevalue+somevalue)*spaces
+local options=P(":")*spaces*(P(";")^0*option)^0
+local pattern=(filename_1+filename_2+fontname_1+fontname_2)*subvalue^0*crapspec^0*options^0
+function fonts.definers.analyze(str,size)
+ local specification=fonts.definers.makespecification(str,nil,nil,nil,":",nil,size)
+ list={}
+ lpeg.match(pattern,str)
+ list.crap=nil
+ if list.name then
+ specification.name=list.name
+ list.name=nil
+ end
+ if list.lookup then
+ specification.lookup=list.lookup
+ list.lookup=nil
+ end
+ if list.sub then
+ specification.sub=list.sub
+ list.sub=nil
+ end
+ specification.features.normal=fonts.handlers.otf.features.normalize(list)
+ list=nil
+ return specification
+end
+function fonts.definers.applypostprocessors(tfmdata)
+ local postprocessors=tfmdata.postprocessors
+ if postprocessors then
+ for i=1,#postprocessors do
+ local extrahash=postprocessors[i](tfmdata)
+ if type(extrahash)=="string" and extrahash~="" then
+ extrahash=string.gsub(lower(extrahash),"[^a-z]","-")
+ tfmdata.properties.fullname=format("%s-%s",tfmdata.properties.fullname,extrahash)
+ end
+ end
+ end
+ return tfmdata
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “fonts-def”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “fonts-ext” 01015ab3758cdc2af29394e6d502a91a] ---
+
+if not modules then modules={} end modules ['luatex-fonts-ext']={
+ version=1.001,
+ comment="companion to luatex-*.tex",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+if context then
+ os.exit()
+end
+local byte=string.byte
+local fonts=fonts
+local handlers=fonts.handlers
+local otf=handlers.otf
+local afm=handlers.afm
+local registerotffeature=otf.features.register
+local registerafmfeature=afm.features.register
+function fonts.loggers.onetimemessage() end
+fonts.protrusions=fonts.protrusions or {}
+fonts.protrusions.setups=fonts.protrusions.setups or {}
+local setups=fonts.protrusions.setups
+setups['default']={
+ factor=1,
+ left=1,
+ right=1,
+ [0x002C]={ 0,1 },
+ [0x002E]={ 0,1 },
+ [0x003A]={ 0,1 },
+ [0x003B]={ 0,1 },
+ [0x002D]={ 0,1 },
+ [0x2013]={ 0,0.50 },
+ [0x2014]={ 0,0.33 },
+ [0x3001]={ 0,1 },
+ [0x3002]={ 0,1 },
+ [0x060C]={ 0,1 },
+ [0x061B]={ 0,1 },
+ [0x06D4]={ 0,1 },
+}
+local function initializeprotrusion(tfmdata,value)
+ if value then
+ local setup=setups[value]
+ if setup then
+ local factor,left,right=setup.factor or 1,setup.left or 1,setup.right or 1
+ local emwidth=tfmdata.parameters.quad
+ tfmdata.parameters.protrusion={
+ auto=true,
+ }
+ for i,chr in next,tfmdata.characters do
+ local v,pl,pr=setup[i],nil,nil
+ if v then
+ pl,pr=v[1],v[2]
+ end
+ if pl and pl~=0 then chr.left_protruding=left*pl*factor end
+ if pr and pr~=0 then chr.right_protruding=right*pr*factor end
+ end
+ end
+ end
+end
+local specification={
+ name="protrusion",
+ description="shift characters into the left and or right margin",
+ initializers={
+ base=initializeprotrusion,
+ node=initializeprotrusion,
+ }
+}
+registerotffeature(specification)
+registerafmfeature(specification)
+fonts.expansions=fonts.expansions or {}
+fonts.expansions.setups=fonts.expansions.setups or {}
+local setups=fonts.expansions.setups
+setups['default']={
+ stretch=2,
+ shrink=2,
+ step=.5,
+ factor=1,
+ [byte('A')]=0.5,[byte('B')]=0.7,[byte('C')]=0.7,[byte('D')]=0.5,[byte('E')]=0.7,
+ [byte('F')]=0.7,[byte('G')]=0.5,[byte('H')]=0.7,[byte('K')]=0.7,[byte('M')]=0.7,
+ [byte('N')]=0.7,[byte('O')]=0.5,[byte('P')]=0.7,[byte('Q')]=0.5,[byte('R')]=0.7,
+ [byte('S')]=0.7,[byte('U')]=0.7,[byte('W')]=0.7,[byte('Z')]=0.7,
+ [byte('a')]=0.7,[byte('b')]=0.7,[byte('c')]=0.7,[byte('d')]=0.7,[byte('e')]=0.7,
+ [byte('g')]=0.7,[byte('h')]=0.7,[byte('k')]=0.7,[byte('m')]=0.7,[byte('n')]=0.7,
+ [byte('o')]=0.7,[byte('p')]=0.7,[byte('q')]=0.7,[byte('s')]=0.7,[byte('u')]=0.7,
+ [byte('w')]=0.7,[byte('z')]=0.7,
+ [byte('2')]=0.7,[byte('3')]=0.7,[byte('6')]=0.7,[byte('8')]=0.7,[byte('9')]=0.7,
+}
+local function initializeexpansion(tfmdata,value)
+ if value then
+ local setup=setups[value]
+ if setup then
+ local factor=setup.factor or 1
+ tfmdata.parameters.expansion={
+ stretch=10*(setup.stretch or 0),
+ shrink=10*(setup.shrink or 0),
+ step=10*(setup.step or 0),
+ auto=true,
+ }
+ for i,chr in next,tfmdata.characters do
+ local v=setup[i]
+ if v and v~=0 then
+ chr.expansion_factor=v*factor
+ else
+ chr.expansion_factor=factor
+ end
+ end
+ end
+ end
+end
+local specification={
+ name="expansion",
+ description="apply hz optimization",
+ initializers={
+ base=initializeexpansion,
+ node=initializeexpansion,
+ }
+}
+registerotffeature(specification)
+registerafmfeature(specification)
+if not otf.features.normalize then
+ otf.features.normalize=function(t)
+ if t.rand then
+ t.rand="random"
+ end
+ return t
+ end
+end
+function fonts.helpers.nametoslot(name)
+ local t=type(name)
+ if t=="string" then
+ local tfmdata=fonts.hashes.identifiers[currentfont()]
+ local shared=tfmdata and tfmdata.shared
+ local fntdata=shared and shared.rawdata
+ return fntdata and fntdata.resources.unicodes[name]
+ elseif t=="number" then
+ return n
+ end
+end
+fonts.encodings=fonts.encodings or {}
+local reencodings={}
+fonts.encodings.reencodings=reencodings
+local function specialreencode(tfmdata,value)
+ local encoding=value and reencodings[value]
+ if encoding then
+ local temp={}
+ local char=tfmdata.characters
+ for k,v in next,encoding do
+ temp[k]=char[v]
+ end
+ for k,v in next,temp do
+ char[k]=temp[k]
+ end
+ return string.format("reencoded:%s",value)
+ end
+end
+local function initialize(tfmdata,value)
+ tfmdata.postprocessors=tfmdata.postprocessors or {}
+ table.insert(tfmdata.postprocessors,
+ function(tfmdata)
+ return specialreencode(tfmdata,value)
+ end
+ )
+end
+registerotffeature {
+ name="reencode",
+ description="reencode characters",
+ manipulators={
+ base=initialize,
+ node=initialize,
+ }
+}
+local function initialize(tfmdata,key,value)
+ if value then
+ tfmdata.mathparameters=nil
+ end
+end
+registerotffeature {
+ name="ignoremathconstants",
+ description="ignore math constants table",
+ initializers={
+ base=initialize,
+ node=initialize,
+ }
+}
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “fonts-ext”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-imp-tex” 77c374b0ef00c2fb12188ec42beb4257] ---
+
+if not modules then modules={} end modules ['font-imp-tex']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local next=next
+local fonts=fonts
+local otf=fonts.handlers.otf
+local registerotffeature=otf.features.register
+local addotffeature=otf.addfeature
+local specification={
+ type="ligature",
+ order={ "tlig" },
+ prepend=true,
+ data={
+ [0x2013]={ 0x002D,0x002D },
+ [0x2014]={ 0x002D,0x002D,0x002D },
+ },
+}
+addotffeature("tlig",specification)
+registerotffeature {
+ name="tlig",
+ description="tex ligatures",
+}
+local specification={
+ type="substitution",
+ order={ "trep" },
+ prepend=true,
+ data={
+ [0x0027]=0x2019,
+ },
+}
+addotffeature("trep",specification)
+registerotffeature {
+ name="trep",
+ description="tex replacements",
+}
+local anum_arabic={
+ [0x0030]=0x0660,
+ [0x0031]=0x0661,
+ [0x0032]=0x0662,
+ [0x0033]=0x0663,
+ [0x0034]=0x0664,
+ [0x0035]=0x0665,
+ [0x0036]=0x0666,
+ [0x0037]=0x0667,
+ [0x0038]=0x0668,
+ [0x0039]=0x0669,
+}
+local anum_persian={
+ [0x0030]=0x06F0,
+ [0x0031]=0x06F1,
+ [0x0032]=0x06F2,
+ [0x0033]=0x06F3,
+ [0x0034]=0x06F4,
+ [0x0035]=0x06F5,
+ [0x0036]=0x06F6,
+ [0x0037]=0x06F7,
+ [0x0038]=0x06F8,
+ [0x0039]=0x06F9,
+}
+local function valid(data)
+ local features=data.resources.features
+ if features then
+ for k,v in next,features do
+ for k,v in next,v do
+ if v.arab then
+ return true
+ end
+ end
+ end
+ end
+end
+local specification={
+ {
+ type="substitution",
+ features={ arab={ urd=true,dflt=true } },
+ order={ "anum" },
+ data=anum_arabic,
+ valid=valid,
+ },
+ {
+ type="substitution",
+ features={ arab={ urd=true } },
+ order={ "anum" },
+ data=anum_persian,
+ valid=valid,
+ },
+}
+addotffeature("anum",specification)
+registerotffeature {
+ name="anum",
+ description="arabic digits",
+}
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-imp-tex”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-imp-ligatures” 043daa4fcccf2560868da359d71d3a4a] ---
+
+if not modules then modules={} end modules ['font-imp-ligatures']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local lpegmatch=lpeg.match
+local utfsplit=utf.split
+local settings_to_array=utilities.parsers.settings_to_array
+local fonts=fonts
+local otf=fonts.handlers.otf
+local registerotffeature=otf.features.register
+local addotffeature=otf.addfeature
+local lookups={}
+local protect={}
+local revert={}
+local zwjchar=0x200C
+local zwj={ zwjchar }
+addotffeature {
+ name="blockligatures",
+ type="chainsubstitution",
+ nocheck=true,
+ prepend=true,
+ future=true,
+ lookups={
+ {
+ type="multiple",
+ data=lookups,
+ },
+ },
+ data={
+ rules=protect,
+ }
+}
+addotffeature {
+ name="blockligatures",
+ type="chainsubstitution",
+ nocheck=true,
+ append=true,
+ overload=false,
+ lookups={
+ {
+ type="ligature",
+ data=lookups,
+ },
+ },
+ data={
+ rules=revert,
+ }
+}
+registerotffeature {
+ name='blockligatures',
+ description='block certain ligatures',
+}
+local splitter=lpeg.splitat(":")
+local function blockligatures(str)
+ local t=settings_to_array(str)
+ for i=1,#t do
+ local ti=t[i]
+ local before,current,after=lpegmatch(splitter,ti)
+ if current and after then
+ if before then
+ before=utfsplit(before)
+ for i=1,#before do
+ before[i]={ before[i] }
+ end
+ end
+ if current then
+ current=utfsplit(current)
+ end
+ if after then
+ after=utfsplit(after)
+ for i=1,#after do
+ after[i]={ after[i] }
+ end
+ end
+ else
+ before=nil
+ current=utfsplit(ti)
+ after=nil
+ end
+ if #current>1 then
+ local one=current[1]
+ local two=current[2]
+ lookups[one]={ one,zwjchar }
+ local one={ one }
+ local two={ two }
+ local new=#protect+1
+ protect[new]={
+ before=before,
+ current={ one,two },
+ after=after,
+ lookups={ 1 },
+ }
+ revert[new]={
+ current={ one,zwj },
+ after={ two },
+ lookups={ 1 },
+ }
+ end
+ end
+end
+otf.helpers.blockligatures=blockligatures
+if context then
+ interfaces.implement {
+ name="blockligatures",
+ arguments="string",
+ actions=blockligatures,
+ }
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-imp-ligatures”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-imp-italics” fe1ca80fb5ea4a2f8d2d5c484e7ba913] ---
+
+if not modules then modules={} end modules ['font-imp-italics']={
+ version=1.001,
+ comment="companion to font-ini.mkiv and hand-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local next=next
+local fonts=fonts
+local handlers=fonts.handlers
+local registerotffeature=handlers.otf.features.register
+local registerafmfeature=handlers.afm.features.register
+local function initialize(tfmdata,key,value)
+ for unicode,character in next,tfmdata.characters do
+ local olditalic=character.italic
+ if olditalic and olditalic~=0 then
+ character.width=character.width+olditalic
+ character.italic=0
+ end
+ end
+end
+local specification={
+ name="italicwidths",
+ description="add italic to width",
+ manipulators={
+ base=initialize,
+ node=initialize,
+ }
+}
+registerotffeature(specification)
+registerafmfeature(specification)
+local function initialize(tfmdata,value)
+ if value then
+ local parameters=tfmdata.parameters
+ local italicangle=parameters.italicangle
+ if italicangle and italicangle~=0 then
+ local properties=tfmdata.properties
+ local factor=tonumber(value) or 1
+ properties.hasitalics=true
+ properties.autoitalicamount=factor*(parameters.uwidth or 40)/2
+ end
+ end
+end
+local specification={
+ name="itlc",
+ description="italic correction",
+ initializers={
+ base=initialize,
+ node=initialize,
+ }
+}
+registerotffeature(specification)
+registerafmfeature(specification)
+if context then
+ local function initialize(tfmdata,value)
+ tfmdata.properties.textitalics=toboolean(value)
+ end
+ local specification={
+ name="textitalics",
+ description="use alternative text italic correction",
+ initializers={
+ base=initialize,
+ node=initialize,
+ }
+ }
+ registerotffeature(specification)
+ registerafmfeature(specification)
+end
+if context then
+ local letter=characters.is_letter
+ local always=true
+ local function collapseitalics(tfmdata,key,value)
+ local threshold=value==true and 100 or tonumber(value)
+ if threshold and threshold>0 then
+ if threshold>100 then
+ threshold=100
+ end
+ for unicode,data in next,tfmdata.characters do
+ if always or letter[unicode] or letter[data.unicode] then
+ local italic=data.italic
+ if italic and italic~=0 then
+ local width=data.width
+ if width and width~=0 then
+ local delta=threshold*italic/100
+ data.width=width+delta
+ data.italic=italic-delta
+ end
+ end
+ end
+ end
+ end
+ end
+ local dimensions_specification={
+ name="collapseitalics",
+ description="collapse italics",
+ manipulators={
+ base=collapseitalics,
+ node=collapseitalics,
+ }
+ }
+ registerotffeature(dimensions_specification)
+ registerafmfeature(dimensions_specification)
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-imp-italics”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “font-imp-effects” 73a660359a0ec71e44cc2b7225a715ac] ---
+
+if not modules then modules={} end modules ['font-imp-effects']={
+ version=1.001,
+ comment="companion to font-ini.mkiv",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local next,type,tonumber=next,type,tonumber
+local is_boolean=string.is_boolean
+local fonts=fonts
+local handlers=fonts.handlers
+local registerotffeature=handlers.otf.features.register
+local registerafmfeature=handlers.afm.features.register
+local settings_to_hash=utilities.parsers.settings_to_hash_colon_too
+local helpers=fonts.helpers
+local prependcommands=helpers.prependcommands
+local charcommand=helpers.commands.char
+local leftcommand=helpers.commands.left
+local rightcommand=helpers.commands.right
+local upcommand=helpers.commands.up
+local downcommand=helpers.commands.down
+local dummycommand=helpers.commands.dummy
+local report_effect=logs.reporter("fonts","effect")
+local report_slant=logs.reporter("fonts","slant")
+local report_extend=logs.reporter("fonts","extend")
+local report_squeeze=logs.reporter("fonts","squeeze")
+local trace=false
+trackers.register("fonts.effect",function(v) trace=v end)
+trackers.register("fonts.slant",function(v) trace=v end)
+trackers.register("fonts.extend",function(v) trace=v end)
+trackers.register("fonts.squeeze",function(v) trace=v end)
+local function initializeslant(tfmdata,value)
+ value=tonumber(value)
+ if not value then
+ value=0
+ elseif value>1 then
+ value=1
+ elseif value<-1 then
+ value=-1
+ end
+ if trace then
+ report_slant("applying %0.3f",value)
+ end
+ tfmdata.parameters.slantfactor=value
+end
+local specification={
+ name="slant",
+ description="slant glyphs",
+ initializers={
+ base=initializeslant,
+ node=initializeslant,
+ }
+}
+registerotffeature(specification)
+registerafmfeature(specification)
+local function initializeextend(tfmdata,value)
+ value=tonumber(value)
+ if not value then
+ value=0
+ elseif value>10 then
+ value=10
+ elseif value<-10 then
+ value=-10
+ end
+ if trace then
+ report_extend("applying %0.3f",value)
+ end
+ tfmdata.parameters.extendfactor=value
+end
+local specification={
+ name="extend",
+ description="scale glyphs horizontally",
+ initializers={
+ base=initializeextend,
+ node=initializeextend,
+ }
+}
+registerotffeature(specification)
+registerafmfeature(specification)
+local function initializesqueeze(tfmdata,value)
+ value=tonumber(value)
+ if not value then
+ value=0
+ elseif value>10 then
+ value=10
+ elseif value<-10 then
+ value=-10
+ end
+ if trace then
+ report_squeeze("applying %0.3f",value)
+ end
+ tfmdata.parameters.squeezefactor=value
+end
+local specification={
+ name="squeeze",
+ description="scale glyphs vertically",
+ initializers={
+ base=initializesqueeze,
+ node=initializesqueeze,
+ }
+}
+registerotffeature(specification)
+registerafmfeature(specification)
+local effects={
+ inner=0,
+ normal=0,
+ outer=1,
+ outline=1,
+ both=2,
+ hidden=3,
+}
+local function initializeeffect(tfmdata,value)
+ local spec
+ if type(value)=="number" then
+ spec={ width=value }
+ else
+ spec=settings_to_hash(value)
+ end
+ local effect=spec.effect or "both"
+ local width=tonumber(spec.width) or 0
+ local mode=effects[effect]
+ if not mode then
+ report_effect("invalid effect %a",effect)
+ elseif width==0 and mode==0 then
+ report_effect("invalid width %a for effect %a",width,effect)
+ else
+ local parameters=tfmdata.parameters
+ local properties=tfmdata.properties
+ parameters.mode=mode
+ parameters.width=width*1000
+ if is_boolean(spec.auto)==true then
+ local squeeze=1-width/20
+ local average=(1-squeeze)*width*100
+ spec.squeeze=squeeze
+ spec.extend=1+width/2
+ spec.wdelta=average
+ spec.hdelta=average/2
+ spec.ddelta=average/2
+ spec.vshift=average/2
+ end
+ local factor=tonumber(spec.factor) or 0
+ local hfactor=tonumber(spec.hfactor) or factor
+ local vfactor=tonumber(spec.vfactor) or factor
+ local delta=tonumber(spec.delta) or 1
+ local wdelta=tonumber(spec.wdelta) or delta
+ local hdelta=tonumber(spec.hdelta) or delta
+ local ddelta=tonumber(spec.ddelta) or hdelta
+ local vshift=tonumber(spec.vshift) or 0
+ local slant=spec.slant
+ local extend=spec.extend
+ local squeeze=spec.squeeze
+ if slant then
+ initializeslant(tfmdata,slant)
+ end
+ if extend then
+ initializeextend(tfmdata,extend)
+ end
+ if squeeze then
+ initializesqueeze(tfmdata,squeeze)
+ end
+ properties.effect={
+ effect=effect,
+ width=width,
+ factor=factor,
+ hfactor=hfactor,
+ vfactor=vfactor,
+ wdelta=wdelta,
+ hdelta=hdelta,
+ ddelta=ddelta,
+ vshift=vshift,
+ slant=tfmdata.parameters.slantfactor,
+ extend=tfmdata.parameters.extendfactor,
+ squeeze=tfmdata.parameters.squeezefactor,
+ }
+ end
+end
+local rules={
+ "RadicalRuleThickness",
+ "OverbarRuleThickness",
+ "FractionRuleThickness",
+ "UnderbarRuleThickness",
+}
+local function setmathparameters(tfmdata,characters,mathparameters,dx,dy,squeeze)
+ if delta~=0 then
+ for i=1,#rules do
+ local name=rules[i]
+ local value=mathparameters[name]
+ if value then
+ mathparameters[name]=(squeeze or 1)*(value+dx)
+ end
+ end
+ end
+end
+local function setmathcharacters(tfmdata,characters,mathparameters,dx,dy,squeeze,wdelta,hdelta,ddelta)
+ local function wdpatch(char)
+ if wsnap~=0 then
+ char.width=char.width+wdelta/2
+ end
+ end
+ local function htpatch(char)
+ if hsnap~=0 then
+ local height=char.height
+ if height then
+ char.height=char.height+2*dy
+ end
+ end
+ end
+ local character=characters[0x221A]
+ if character and character.next then
+ local char=character
+ local next=character.next
+ wdpatch(char)
+ htpatch(char)
+ while next do
+ char=characters[next]
+ wdpatch(char)
+ htpatch(char)
+ next=char.next
+ end
+ if char then
+ local v=char.vert_variants
+ if v then
+ local top=v[#v]
+ if top then
+ local char=characters[top.glyph]
+ htpatch(char)
+ end
+ end
+ end
+ end
+end
+local function manipulateeffect(tfmdata)
+ local effect=tfmdata.properties.effect
+ if effect then
+ local characters=tfmdata.characters
+ local parameters=tfmdata.parameters
+ local mathparameters=tfmdata.mathparameters
+ local multiplier=effect.width*100
+ local factor=parameters.factor
+ local hfactor=parameters.hfactor
+ local vfactor=parameters.vfactor
+ local wdelta=effect.wdelta*hfactor*multiplier
+ local hdelta=effect.hdelta*vfactor*multiplier
+ local ddelta=effect.ddelta*vfactor*multiplier
+ local vshift=effect.vshift*vfactor*multiplier
+ local squeeze=effect.squeeze
+ local hshift=wdelta/2
+ local dx=multiplier*vfactor
+ local dy=vshift
+ local factor=(1+effect.factor)*factor
+ local hfactor=(1+effect.hfactor)*hfactor
+ local vfactor=(1+effect.vfactor)*vfactor
+ local vshift=vshift~=0 and upcommand[vshift] or false
+ for unicode,character in next,characters do
+ local oldwidth=character.width
+ local oldheight=character.height
+ local olddepth=character.depth
+ if oldwidth and oldwidth>0 then
+ character.width=oldwidth+wdelta
+ local commands=character.commands
+ local hshift=rightcommand[hshift]
+ if vshift then
+ if commands then
+ prependcommands (commands,
+ hshift,
+ vshift
+ )
+ else
+ character.commands={
+ hshift,
+ vshift,
+ charcommand[unicode]
+ }
+ end
+ else
+ if commands then
+ prependcommands (commands,
+ hshift
+ )
+ else
+ character.commands={
+ hshift,
+ charcommand[unicode]
+ }
+ end
+ end
+ end
+ if oldheight and oldheight>0 then
+ character.height=oldheight+hdelta
+ end
+ if olddepth and olddepth>0 then
+ character.depth=olddepth+ddelta
+ end
+ end
+ if mathparameters then
+ setmathparameters(tfmdata,characters,mathparameters,dx,dy,squeeze)
+ setmathcharacters(tfmdata,characters,mathparameters,dx,dy,squeeze,wdelta,hdelta,ddelta)
+ end
+ parameters.factor=factor
+ parameters.hfactor=hfactor
+ parameters.vfactor=vfactor
+ if trace then
+ report_effect("applying")
+ report_effect(" effect : %s",effect.effect)
+ report_effect(" width : %s => %s",effect.width,multiplier)
+ report_effect(" factor : %s => %s",effect.factor,factor )
+ report_effect(" hfactor : %s => %s",effect.hfactor,hfactor)
+ report_effect(" vfactor : %s => %s",effect.vfactor,vfactor)
+ report_effect(" wdelta : %s => %s",effect.wdelta,wdelta)
+ report_effect(" hdelta : %s => %s",effect.hdelta,hdelta)
+ report_effect(" ddelta : %s => %s",effect.ddelta,ddelta)
+ end
+ end
+end
+local specification={
+ name="effect",
+ description="apply effects to glyphs",
+ initializers={
+ base=initializeeffect,
+ node=initializeeffect,
+ },
+ manipulators={
+ base=manipulateeffect,
+ node=manipulateeffect,
+ },
+}
+registerotffeature(specification)
+registerafmfeature(specification)
+local function initializeoutline(tfmdata,value)
+ value=tonumber(value)
+ if not value then
+ value=0
+ else
+ value=tonumber(value) or 0
+ end
+ local parameters=tfmdata.parameters
+ local properties=tfmdata.properties
+ parameters.mode=effects.outline
+ parameters.width=value*1000
+ properties.effect={
+ effect=effect,
+ width=width,
+ }
+end
+local specification={
+ name="outline",
+ description="outline glyphs",
+ initializers={
+ base=initializeoutline,
+ node=initializeoutline,
+ }
+}
+registerotffeature(specification)
+registerafmfeature(specification)
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “font-imp-effects”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “fonts-lig” b9dbe77ce747d4c35bb2a20ffbe5aa51] ---
+
+
+fonts.handlers.otf.addfeature {
+ ["dataset"]={
+ {
+ ["data"]={
+ ["À"]={ "A","̀" },
+ ["Á"]={ "A","́" },
+ ["Â"]={ "A","̂" },
+ ["Ã"]={ "A","̃" },
+ ["Ä"]={ "A","̈" },
+ ["Å"]={ "A","̊" },
+ ["Ç"]={ "C","̧" },
+ ["È"]={ "E","̀" },
+ ["É"]={ "E","́" },
+ ["Ê"]={ "E","̂" },
+ ["Ë"]={ "E","̈" },
+ ["Ì"]={ "I","̀" },
+ ["Í"]={ "I","́" },
+ ["Î"]={ "I","̂" },
+ ["Ï"]={ "I","̈" },
+ ["Ñ"]={ "N","̃" },
+ ["Ò"]={ "O","̀" },
+ ["Ó"]={ "O","́" },
+ ["Ô"]={ "O","̂" },
+ ["Õ"]={ "O","̃" },
+ ["Ö"]={ "O","̈" },
+ ["Ù"]={ "U","̀" },
+ ["Ú"]={ "U","́" },
+ ["Û"]={ "U","̂" },
+ ["Ü"]={ "U","̈" },
+ ["Ý"]={ "Y","́" },
+ ["à"]={ "a","̀" },
+ ["á"]={ "a","́" },
+ ["â"]={ "a","̂" },
+ ["ã"]={ "a","̃" },
+ ["ä"]={ "a","̈" },
+ ["å"]={ "a","̊" },
+ ["ç"]={ "c","̧" },
+ ["è"]={ "e","̀" },
+ ["é"]={ "e","́" },
+ ["ê"]={ "e","̂" },
+ ["ë"]={ "e","̈" },
+ ["ì"]={ "i","̀" },
+ ["í"]={ "i","́" },
+ ["î"]={ "i","̂" },
+ ["ï"]={ "i","̈" },
+ ["ñ"]={ "n","̃" },
+ ["ò"]={ "o","̀" },
+ ["ó"]={ "o","́" },
+ ["ô"]={ "o","̂" },
+ ["õ"]={ "o","̃" },
+ ["ö"]={ "o","̈" },
+ ["ù"]={ "u","̀" },
+ ["ú"]={ "u","́" },
+ ["û"]={ "u","̂" },
+ ["ü"]={ "u","̈" },
+ ["ý"]={ "y","́" },
+ ["ÿ"]={ "y","̈" },
+ ["Ā"]={ "A","̄" },
+ ["ā"]={ "a","̄" },
+ ["Ă"]={ "A","̆" },
+ ["ă"]={ "a","̆" },
+ ["Ą"]={ "A","̨" },
+ ["ą"]={ "a","̨" },
+ ["Ć"]={ "C","́" },
+ ["ć"]={ "c","́" },
+ ["Ĉ"]={ "C","̂" },
+ ["ĉ"]={ "c","̂" },
+ ["Ċ"]={ "C","̇" },
+ ["ċ"]={ "c","̇" },
+ ["Č"]={ "C","̌" },
+ ["č"]={ "c","̌" },
+ ["Ď"]={ "D","̌" },
+ ["ď"]={ "d","̌" },
+ ["Ē"]={ "E","̄" },
+ ["ē"]={ "e","̄" },
+ ["Ĕ"]={ "E","̆" },
+ ["ĕ"]={ "e","̆" },
+ ["Ė"]={ "E","̇" },
+ ["ė"]={ "e","̇" },
+ ["Ę"]={ "E","̨" },
+ ["ę"]={ "e","̨" },
+ ["Ě"]={ "E","̌" },
+ ["ě"]={ "e","̌" },
+ ["Ĝ"]={ "G","̂" },
+ ["ĝ"]={ "g","̂" },
+ ["Ğ"]={ "G","̆" },
+ ["ğ"]={ "g","̆" },
+ ["Ġ"]={ "G","̇" },
+ ["ġ"]={ "g","̇" },
+ ["Ģ"]={ "G","̧" },
+ ["ģ"]={ "g","̧" },
+ ["Ĥ"]={ "H","̂" },
+ ["ĥ"]={ "h","̂" },
+ ["Ĩ"]={ "I","̃" },
+ ["ĩ"]={ "i","̃" },
+ ["Ī"]={ "I","̄" },
+ ["ī"]={ "i","̄" },
+ ["Ĭ"]={ "I","̆" },
+ ["ĭ"]={ "i","̆" },
+ ["Į"]={ "I","̨" },
+ ["į"]={ "i","̨" },
+ ["İ"]={ "I","̇" },
+ ["Ĵ"]={ "J","̂" },
+ ["ĵ"]={ "j","̂" },
+ ["Ķ"]={ "K","̧" },
+ ["ķ"]={ "k","̧" },
+ ["Ĺ"]={ "L","́" },
+ ["ĺ"]={ "l","́" },
+ ["Ļ"]={ "L","̧" },
+ ["ļ"]={ "l","̧" },
+ ["Ľ"]={ "L","̌" },
+ ["ľ"]={ "l","̌" },
+ ["Ń"]={ "N","́" },
+ ["ń"]={ "n","́" },
+ ["Ņ"]={ "N","̧" },
+ ["ņ"]={ "n","̧" },
+ ["Ň"]={ "N","̌" },
+ ["ň"]={ "n","̌" },
+ ["Ō"]={ "O","̄" },
+ ["ō"]={ "o","̄" },
+ ["Ŏ"]={ "O","̆" },
+ ["ŏ"]={ "o","̆" },
+ ["Ő"]={ "O","̋" },
+ ["ő"]={ "o","̋" },
+ ["Ŕ"]={ "R","́" },
+ ["ŕ"]={ "r","́" },
+ ["Ŗ"]={ "R","̧" },
+ ["ŗ"]={ "r","̧" },
+ ["Ř"]={ "R","̌" },
+ ["ř"]={ "r","̌" },
+ ["Ś"]={ "S","́" },
+ ["ś"]={ "s","́" },
+ ["Ŝ"]={ "S","̂" },
+ ["ŝ"]={ "s","̂" },
+ ["Ş"]={ "S","̧" },
+ ["ş"]={ "s","̧" },
+ ["Š"]={ "S","̌" },
+ ["š"]={ "s","̌" },
+ ["Ţ"]={ "T","̧" },
+ ["ţ"]={ "t","̧" },
+ ["Ť"]={ "T","̌" },
+ ["ť"]={ "t","̌" },
+ ["Ũ"]={ "U","̃" },
+ ["ũ"]={ "u","̃" },
+ ["Ū"]={ "U","̄" },
+ ["ū"]={ "u","̄" },
+ ["Ŭ"]={ "U","̆" },
+ ["ŭ"]={ "u","̆" },
+ ["Ů"]={ "U","̊" },
+ ["ů"]={ "u","̊" },
+ ["Ű"]={ "U","̋" },
+ ["ű"]={ "u","̋" },
+ ["Ų"]={ "U","̨" },
+ ["ų"]={ "u","̨" },
+ ["Ŵ"]={ "W","̂" },
+ ["ŵ"]={ "w","̂" },
+ ["Ŷ"]={ "Y","̂" },
+ ["ŷ"]={ "y","̂" },
+ ["Ÿ"]={ "Y","̈" },
+ ["Ź"]={ "Z","́" },
+ ["ź"]={ "z","́" },
+ ["Ż"]={ "Z","̇" },
+ ["ż"]={ "z","̇" },
+ ["Ž"]={ "Z","̌" },
+ ["ž"]={ "z","̌" },
+ ["Ơ"]={ "O","̛" },
+ ["ơ"]={ "o","̛" },
+ ["Ư"]={ "U","̛" },
+ ["ư"]={ "u","̛" },
+ ["Ǎ"]={ "A","̌" },
+ ["ǎ"]={ "a","̌" },
+ ["Ǐ"]={ "I","̌" },
+ ["ǐ"]={ "i","̌" },
+ ["Ǒ"]={ "O","̌" },
+ ["ǒ"]={ "o","̌" },
+ ["Ǔ"]={ "U","̌" },
+ ["ǔ"]={ "u","̌" },
+ ["Ǖ"]={ "Ü","̄" },
+ ["ǖ"]={ "ü","̄" },
+ ["Ǘ"]={ "Ü","́" },
+ ["ǘ"]={ "ü","́" },
+ ["Ǚ"]={ "Ü","̌" },
+ ["ǚ"]={ "ü","̌" },
+ ["Ǜ"]={ "Ü","̀" },
+ ["ǜ"]={ "ü","̀" },
+ ["Ǟ"]={ "Ä","̄" },
+ ["ǟ"]={ "ä","̄" },
+ ["Ǡ"]={ "Ȧ","̄" },
+ ["ǡ"]={ "ȧ","̄" },
+ ["Ǣ"]={ "Æ","̄" },
+ ["ǣ"]={ "æ","̄" },
+ ["Ǧ"]={ "G","̌" },
+ ["ǧ"]={ "g","̌" },
+ ["Ǩ"]={ "K","̌" },
+ ["ǩ"]={ "k","̌" },
+ ["Ǫ"]={ "O","̨" },
+ ["ǫ"]={ "o","̨" },
+ ["Ǭ"]={ "Ǫ","̄" },
+ ["ǭ"]={ "ǫ","̄" },
+ ["Ǯ"]={ "Ʒ","̌" },
+ ["ǯ"]={ "ʒ","̌" },
+ ["ǰ"]={ "j","̌" },
+ ["Ǵ"]={ "G","́" },
+ ["ǵ"]={ "g","́" },
+ ["Ǹ"]={ "N","̀" },
+ ["ǹ"]={ "n","̀" },
+ ["Ǻ"]={ "Å","́" },
+ ["ǻ"]={ "å","́" },
+ ["Ǽ"]={ "Æ","́" },
+ ["ǽ"]={ "æ","́" },
+ ["Ǿ"]={ "Ø","́" },
+ ["ǿ"]={ "ø","́" },
+ ["Ȁ"]={ "A","̏" },
+ ["ȁ"]={ "a","̏" },
+ ["Ȃ"]={ "A","̑" },
+ ["ȃ"]={ "a","̑" },
+ ["Ȅ"]={ "E","̏" },
+ ["ȅ"]={ "e","̏" },
+ ["Ȇ"]={ "E","̑" },
+ ["ȇ"]={ "e","̑" },
+ ["Ȉ"]={ "I","̏" },
+ ["ȉ"]={ "i","̏" },
+ ["Ȋ"]={ "I","̑" },
+ ["ȋ"]={ "i","̑" },
+ ["Ȍ"]={ "O","̏" },
+ ["ȍ"]={ "o","̏" },
+ ["Ȏ"]={ "O","̑" },
+ ["ȏ"]={ "o","̑" },
+ ["Ȑ"]={ "R","̏" },
+ ["ȑ"]={ "r","̏" },
+ ["Ȓ"]={ "R","̑" },
+ ["ȓ"]={ "r","̑" },
+ ["Ȕ"]={ "U","̏" },
+ ["ȕ"]={ "u","̏" },
+ ["Ȗ"]={ "U","̑" },
+ ["ȗ"]={ "u","̑" },
+ ["Ș"]={ "S","̦" },
+ ["ș"]={ "s","̦" },
+ ["Ț"]={ "T","̦" },
+ ["ț"]={ "t","̦" },
+ ["Ȟ"]={ "H","̌" },
+ ["ȟ"]={ "h","̌" },
+ ["Ȧ"]={ "A","̇" },
+ ["ȧ"]={ "a","̇" },
+ ["Ȩ"]={ "E","̧" },
+ ["ȩ"]={ "e","̧" },
+ ["Ȫ"]={ "Ö","̄" },
+ ["ȫ"]={ "ö","̄" },
+ ["Ȭ"]={ "Õ","̄" },
+ ["ȭ"]={ "õ","̄" },
+ ["Ȯ"]={ "O","̇" },
+ ["ȯ"]={ "o","̇" },
+ ["Ȱ"]={ "Ȯ","̄" },
+ ["ȱ"]={ "ȯ","̄" },
+ ["Ȳ"]={ "Y","̄" },
+ ["ȳ"]={ "y","̄" },
+ ["̈́"]={ "̈","́" },
+ ["΅"]={ "¨","́" },
+ ["Ά"]={ "Α","́" },
+ ["Έ"]={ "Ε","́" },
+ ["Ή"]={ "Η","́" },
+ ["Ί"]={ "Ι","́" },
+ ["Ό"]={ "Ο","́" },
+ ["Ύ"]={ "Υ","́" },
+ ["Ώ"]={ "Ω","́" },
+ ["ΐ"]={ "ϊ","́" },
+ ["Ϊ"]={ "Ι","̈" },
+ ["Ϋ"]={ "Υ","̈" },
+ ["ά"]={ "α","́" },
+ ["έ"]={ "ε","́" },
+ ["ή"]={ "η","́" },
+ ["ί"]={ "ι","́" },
+ ["ΰ"]={ "ϋ","́" },
+ ["ϊ"]={ "ι","̈" },
+ ["ϋ"]={ "υ","̈" },
+ ["ό"]={ "ο","́" },
+ ["ύ"]={ "υ","́" },
+ ["ώ"]={ "ω","́" },
+ ["ϓ"]={ "ϒ","́" },
+ ["ϔ"]={ "ϒ","̈" },
+ ["Ѐ"]={ "Е","̀" },
+ ["Ё"]={ "Е","̈" },
+ ["Ѓ"]={ "Г","́" },
+ ["Ї"]={ "І","̈" },
+ ["Ќ"]={ "К","́" },
+ ["Ѝ"]={ "И","̀" },
+ ["Ў"]={ "У","̆" },
+ ["Й"]={ "И","̆" },
+ ["й"]={ "и","̆" },
+ ["ѐ"]={ "е","̀" },
+ ["ё"]={ "е","̈" },
+ ["ѓ"]={ "г","́" },
+ ["ї"]={ "і","̈" },
+ ["ќ"]={ "к","́" },
+ ["ѝ"]={ "и","̀" },
+ ["ў"]={ "у","̆" },
+ ["Ѷ"]={ "Ѵ","̏" },
+ ["ѷ"]={ "ѵ","̏" },
+ ["Ӂ"]={ "Ж","̆" },
+ ["ӂ"]={ "ж","̆" },
+ ["Ӑ"]={ "А","̆" },
+ ["ӑ"]={ "а","̆" },
+ ["Ӓ"]={ "А","̈" },
+ ["ӓ"]={ "а","̈" },
+ ["Ӗ"]={ "Е","̆" },
+ ["ӗ"]={ "е","̆" },
+ ["Ӛ"]={ "Ә","̈" },
+ ["ӛ"]={ "ә","̈" },
+ ["Ӝ"]={ "Ж","̈" },
+ ["ӝ"]={ "ж","̈" },
+ ["Ӟ"]={ "З","̈" },
+ ["ӟ"]={ "з","̈" },
+ ["Ӣ"]={ "И","̄" },
+ ["ӣ"]={ "и","̄" },
+ ["Ӥ"]={ "И","̈" },
+ ["ӥ"]={ "и","̈" },
+ ["Ӧ"]={ "О","̈" },
+ ["ӧ"]={ "о","̈" },
+ ["Ӫ"]={ "Ө","̈" },
+ ["ӫ"]={ "ө","̈" },
+ ["Ӭ"]={ "Э","̈" },
+ ["ӭ"]={ "э","̈" },
+ ["Ӯ"]={ "У","̄" },
+ ["ӯ"]={ "у","̄" },
+ ["Ӱ"]={ "У","̈" },
+ ["ӱ"]={ "у","̈" },
+ ["Ӳ"]={ "У","̋" },
+ ["ӳ"]={ "у","̋" },
+ ["Ӵ"]={ "Ч","̈" },
+ ["ӵ"]={ "ч","̈" },
+ ["Ӹ"]={ "Ы","̈" },
+ ["ӹ"]={ "ы","̈" },
+ ["آ"]={ "ا","ٓ" },
+ ["أ"]={ "ا","ٔ" },
+ ["ؤ"]={ "و","ٔ" },
+ ["إ"]={ "ا","ٕ" },
+ ["ئ"]={ "ي","ٔ" },
+ ["ۀ"]={ "ە","ٔ" },
+ ["ۂ"]={ "ہ","ٔ" },
+ ["ۓ"]={ "ے","ٔ" },
+ ["ऩ"]={ "न","़" },
+ ["ऱ"]={ "र","़" },
+ ["ऴ"]={ "ळ","़" },
+ ["क़"]={ "क","़" },
+ ["ख़"]={ "ख","़" },
+ ["ग़"]={ "ग","़" },
+ ["ज़"]={ "ज","़" },
+ ["ड़"]={ "ड","़" },
+ ["ढ़"]={ "ढ","़" },
+ ["फ़"]={ "फ","़" },
+ ["य़"]={ "य","़" },
+ ["ো"]={ "ে","া" },
+ ["ৌ"]={ "ে","ৗ" },
+ ["ড়"]={ "ড","়" },
+ ["ঢ়"]={ "ঢ","়" },
+ ["য়"]={ "য","়" },
+ ["ਲ਼"]={ "ਲ","਼" },
+ ["ਸ਼"]={ "ਸ","਼" },
+ ["ਖ਼"]={ "ਖ","਼" },
+ ["ਗ਼"]={ "ਗ","਼" },
+ ["ਜ਼"]={ "ਜ","਼" },
+ ["ਫ਼"]={ "ਫ","਼" },
+ ["ୈ"]={ "େ","ୖ" },
+ ["ୋ"]={ "େ","ା" },
+ ["ୌ"]={ "େ","ୗ" },
+ ["ଡ଼"]={ "ଡ","଼" },
+ ["ଢ଼"]={ "ଢ","଼" },
+ ["ஔ"]={ "ஒ","ௗ" },
+ ["ொ"]={ "ெ","ா" },
+ ["ோ"]={ "ே","ா" },
+ ["ௌ"]={ "ெ","ௗ" },
+ ["ై"]={ "ె","ౖ" },
+ ["ೀ"]={ "ಿ","ೕ" },
+ ["ೇ"]={ "ೆ","ೕ" },
+ ["ೈ"]={ "ೆ","ೖ" },
+ ["ೊ"]={ "ೆ","ೂ" },
+ ["ೋ"]={ "ೊ","ೕ" },
+ ["ൊ"]={ "െ","ാ" },
+ ["ോ"]={ "േ","ാ" },
+ ["ൌ"]={ "െ","ൗ" },
+ ["ේ"]={ "ෙ","්" },
+ ["ො"]={ "ෙ","ා" },
+ ["ෝ"]={ "ො","්" },
+ ["ෞ"]={ "ෙ","ෟ" },
+ ["གྷ"]={ "ག","ྷ" },
+ ["ཌྷ"]={ "ཌ","ྷ" },
+ ["དྷ"]={ "ད","ྷ" },
+ ["བྷ"]={ "བ","ྷ" },
+ ["ཛྷ"]={ "ཛ","ྷ" },
+ ["ཀྵ"]={ "ཀ","ྵ" },
+ ["ཱི"]={ "ཱ","ི" },
+ ["ཱུ"]={ "ཱ","ུ" },
+ ["ྲྀ"]={ "ྲ","ྀ" },
+ ["ླྀ"]={ "ླ","ྀ" },
+ ["ཱྀ"]={ "ཱ","ྀ" },
+ ["ྒྷ"]={ "ྒ","ྷ" },
+ ["ྜྷ"]={ "ྜ","ྷ" },
+ ["ྡྷ"]={ "ྡ","ྷ" },
+ ["ྦྷ"]={ "ྦ","ྷ" },
+ ["ྫྷ"]={ "ྫ","ྷ" },
+ ["ྐྵ"]={ "ྐ","ྵ" },
+ ["ဦ"]={ "ဥ","ီ" },
+ ["ᬆ"]={ "ᬅ","ᬵ" },
+ ["ᬈ"]={ "ᬇ","ᬵ" },
+ ["ᬊ"]={ "ᬉ","ᬵ" },
+ ["ᬌ"]={ "ᬋ","ᬵ" },
+ ["ᬎ"]={ "ᬍ","ᬵ" },
+ ["ᬒ"]={ "ᬑ","ᬵ" },
+ ["ᬻ"]={ "ᬺ","ᬵ" },
+ ["ᬽ"]={ "ᬼ","ᬵ" },
+ ["ᭀ"]={ "ᬾ","ᬵ" },
+ ["ᭁ"]={ "ᬿ","ᬵ" },
+ ["ᭃ"]={ "ᭂ","ᬵ" },
+ ["Ḁ"]={ "A","̥" },
+ ["ḁ"]={ "a","̥" },
+ ["Ḃ"]={ "B","̇" },
+ ["ḃ"]={ "b","̇" },
+ ["Ḅ"]={ "B","̣" },
+ ["ḅ"]={ "b","̣" },
+ ["Ḇ"]={ "B","̱" },
+ ["ḇ"]={ "b","̱" },
+ ["Ḉ"]={ "Ç","́" },
+ ["ḉ"]={ "ç","́" },
+ ["Ḋ"]={ "D","̇" },
+ ["ḋ"]={ "d","̇" },
+ ["Ḍ"]={ "D","̣" },
+ ["ḍ"]={ "d","̣" },
+ ["Ḏ"]={ "D","̱" },
+ ["ḏ"]={ "d","̱" },
+ ["Ḑ"]={ "D","̧" },
+ ["ḑ"]={ "d","̧" },
+ ["Ḓ"]={ "D","̭" },
+ ["ḓ"]={ "d","̭" },
+ ["Ḕ"]={ "Ē","̀" },
+ ["ḕ"]={ "ē","̀" },
+ ["Ḗ"]={ "Ē","́" },
+ ["ḗ"]={ "ē","́" },
+ ["Ḙ"]={ "E","̭" },
+ ["ḙ"]={ "e","̭" },
+ ["Ḛ"]={ "E","̰" },
+ ["ḛ"]={ "e","̰" },
+ ["Ḝ"]={ "Ȩ","̆" },
+ ["ḝ"]={ "ȩ","̆" },
+ ["Ḟ"]={ "F","̇" },
+ ["ḟ"]={ "f","̇" },
+ ["Ḡ"]={ "G","̄" },
+ ["ḡ"]={ "g","̄" },
+ ["Ḣ"]={ "H","̇" },
+ ["ḣ"]={ "h","̇" },
+ ["Ḥ"]={ "H","̣" },
+ ["ḥ"]={ "h","̣" },
+ ["Ḧ"]={ "H","̈" },
+ ["ḧ"]={ "h","̈" },
+ ["Ḩ"]={ "H","̧" },
+ ["ḩ"]={ "h","̧" },
+ ["Ḫ"]={ "H","̮" },
+ ["ḫ"]={ "h","̮" },
+ ["Ḭ"]={ "I","̰" },
+ ["ḭ"]={ "i","̰" },
+ ["Ḯ"]={ "Ï","́" },
+ ["ḯ"]={ "ï","́" },
+ ["Ḱ"]={ "K","́" },
+ ["ḱ"]={ "k","́" },
+ ["Ḳ"]={ "K","̣" },
+ ["ḳ"]={ "k","̣" },
+ ["Ḵ"]={ "K","̱" },
+ ["ḵ"]={ "k","̱" },
+ ["Ḷ"]={ "L","̣" },
+ ["ḷ"]={ "l","̣" },
+ ["Ḹ"]={ "Ḷ","̄" },
+ ["ḹ"]={ "ḷ","̄" },
+ ["Ḻ"]={ "L","̱" },
+ ["ḻ"]={ "l","̱" },
+ ["Ḽ"]={ "L","̭" },
+ ["ḽ"]={ "l","̭" },
+ ["Ḿ"]={ "M","́" },
+ ["ḿ"]={ "m","́" },
+ ["Ṁ"]={ "M","̇" },
+ ["ṁ"]={ "m","̇" },
+ ["Ṃ"]={ "M","̣" },
+ ["ṃ"]={ "m","̣" },
+ ["Ṅ"]={ "N","̇" },
+ ["ṅ"]={ "n","̇" },
+ ["Ṇ"]={ "N","̣" },
+ ["ṇ"]={ "n","̣" },
+ ["Ṉ"]={ "N","̱" },
+ ["ṉ"]={ "n","̱" },
+ ["Ṋ"]={ "N","̭" },
+ ["ṋ"]={ "n","̭" },
+ ["Ṍ"]={ "Õ","́" },
+ ["ṍ"]={ "õ","́" },
+ ["Ṏ"]={ "Õ","̈" },
+ ["ṏ"]={ "õ","̈" },
+ ["Ṑ"]={ "Ō","̀" },
+ ["ṑ"]={ "ō","̀" },
+ ["Ṓ"]={ "Ō","́" },
+ ["ṓ"]={ "ō","́" },
+ ["Ṕ"]={ "P","́" },
+ ["ṕ"]={ "p","́" },
+ ["Ṗ"]={ "P","̇" },
+ ["ṗ"]={ "p","̇" },
+ ["Ṙ"]={ "R","̇" },
+ ["ṙ"]={ "r","̇" },
+ ["Ṛ"]={ "R","̣" },
+ ["ṛ"]={ "r","̣" },
+ ["Ṝ"]={ "Ṛ","̄" },
+ ["ṝ"]={ "ṛ","̄" },
+ ["Ṟ"]={ "R","̱" },
+ ["ṟ"]={ "r","̱" },
+ ["Ṡ"]={ "S","̇" },
+ ["ṡ"]={ "s","̇" },
+ ["Ṣ"]={ "S","̣" },
+ ["ṣ"]={ "s","̣" },
+ ["Ṥ"]={ "Ś","̇" },
+ ["ṥ"]={ "ś","̇" },
+ ["Ṧ"]={ "Š","̇" },
+ ["ṧ"]={ "š","̇" },
+ ["Ṩ"]={ "Ṣ","̇" },
+ ["ṩ"]={ "ṣ","̇" },
+ ["Ṫ"]={ "T","̇" },
+ ["ṫ"]={ "t","̇" },
+ ["Ṭ"]={ "T","̣" },
+ ["ṭ"]={ "t","̣" },
+ ["Ṯ"]={ "T","̱" },
+ ["ṯ"]={ "t","̱" },
+ ["Ṱ"]={ "T","̭" },
+ ["ṱ"]={ "t","̭" },
+ ["Ṳ"]={ "U","̤" },
+ ["ṳ"]={ "u","̤" },
+ ["Ṵ"]={ "U","̰" },
+ ["ṵ"]={ "u","̰" },
+ ["Ṷ"]={ "U","̭" },
+ ["ṷ"]={ "u","̭" },
+ ["Ṹ"]={ "Ũ","́" },
+ ["ṹ"]={ "ũ","́" },
+ ["Ṻ"]={ "Ū","̈" },
+ ["ṻ"]={ "ū","̈" },
+ ["Ṽ"]={ "V","̃" },
+ ["ṽ"]={ "v","̃" },
+ ["Ṿ"]={ "V","̣" },
+ ["ṿ"]={ "v","̣" },
+ ["Ẁ"]={ "W","̀" },
+ ["ẁ"]={ "w","̀" },
+ ["Ẃ"]={ "W","́" },
+ ["ẃ"]={ "w","́" },
+ ["Ẅ"]={ "W","̈" },
+ ["ẅ"]={ "w","̈" },
+ ["Ẇ"]={ "W","̇" },
+ ["ẇ"]={ "w","̇" },
+ ["Ẉ"]={ "W","̣" },
+ ["ẉ"]={ "w","̣" },
+ ["Ẋ"]={ "X","̇" },
+ ["ẋ"]={ "x","̇" },
+ ["Ẍ"]={ "X","̈" },
+ ["ẍ"]={ "x","̈" },
+ ["Ẏ"]={ "Y","̇" },
+ ["ẏ"]={ "y","̇" },
+ ["Ẑ"]={ "Z","̂" },
+ ["ẑ"]={ "z","̂" },
+ ["Ẓ"]={ "Z","̣" },
+ ["ẓ"]={ "z","̣" },
+ ["Ẕ"]={ "Z","̱" },
+ ["ẕ"]={ "z","̱" },
+ ["ẖ"]={ "h","̱" },
+ ["ẗ"]={ "t","̈" },
+ ["ẘ"]={ "w","̊" },
+ ["ẙ"]={ "y","̊" },
+ ["ẛ"]={ "ſ","̇" },
+ ["Ạ"]={ "A","̣" },
+ ["ạ"]={ "a","̣" },
+ ["Ả"]={ "A","̉" },
+ ["ả"]={ "a","̉" },
+ ["Ấ"]={ "Â","́" },
+ ["ấ"]={ "â","́" },
+ ["Ầ"]={ "Â","̀" },
+ ["ầ"]={ "â","̀" },
+ ["Ẩ"]={ "Â","̉" },
+ ["ẩ"]={ "â","̉" },
+ ["Ẫ"]={ "Â","̃" },
+ ["ẫ"]={ "â","̃" },
+ ["Ậ"]={ "Ạ","̂" },
+ ["ậ"]={ "ạ","̂" },
+ ["Ắ"]={ "Ă","́" },
+ ["ắ"]={ "ă","́" },
+ ["Ằ"]={ "Ă","̀" },
+ ["ằ"]={ "ă","̀" },
+ ["Ẳ"]={ "Ă","̉" },
+ ["ẳ"]={ "ă","̉" },
+ ["Ẵ"]={ "Ă","̃" },
+ ["ẵ"]={ "ă","̃" },
+ ["Ặ"]={ "Ạ","̆" },
+ ["ặ"]={ "ạ","̆" },
+ ["Ẹ"]={ "E","̣" },
+ ["ẹ"]={ "e","̣" },
+ ["Ẻ"]={ "E","̉" },
+ ["ẻ"]={ "e","̉" },
+ ["Ẽ"]={ "E","̃" },
+ ["ẽ"]={ "e","̃" },
+ ["Ế"]={ "Ê","́" },
+ ["ế"]={ "ê","́" },
+ ["Ề"]={ "Ê","̀" },
+ ["ề"]={ "ê","̀" },
+ ["Ể"]={ "Ê","̉" },
+ ["ể"]={ "ê","̉" },
+ ["Ễ"]={ "Ê","̃" },
+ ["ễ"]={ "ê","̃" },
+ ["Ệ"]={ "Ẹ","̂" },
+ ["ệ"]={ "ẹ","̂" },
+ ["Ỉ"]={ "I","̉" },
+ ["ỉ"]={ "i","̉" },
+ ["Ị"]={ "I","̣" },
+ ["ị"]={ "i","̣" },
+ ["Ọ"]={ "O","̣" },
+ ["ọ"]={ "o","̣" },
+ ["Ỏ"]={ "O","̉" },
+ ["ỏ"]={ "o","̉" },
+ ["Ố"]={ "Ô","́" },
+ ["ố"]={ "ô","́" },
+ ["Ồ"]={ "Ô","̀" },
+ ["ồ"]={ "ô","̀" },
+ ["Ổ"]={ "Ô","̉" },
+ ["ổ"]={ "ô","̉" },
+ ["Ỗ"]={ "Ô","̃" },
+ ["ỗ"]={ "ô","̃" },
+ ["Ộ"]={ "Ọ","̂" },
+ ["ộ"]={ "ọ","̂" },
+ ["Ớ"]={ "Ơ","́" },
+ ["ớ"]={ "ơ","́" },
+ ["Ờ"]={ "Ơ","̀" },
+ ["ờ"]={ "ơ","̀" },
+ ["Ở"]={ "Ơ","̉" },
+ ["ở"]={ "ơ","̉" },
+ ["Ỡ"]={ "Ơ","̃" },
+ ["ỡ"]={ "ơ","̃" },
+ ["Ợ"]={ "Ơ","̣" },
+ ["ợ"]={ "ơ","̣" },
+ ["Ụ"]={ "U","̣" },
+ ["ụ"]={ "u","̣" },
+ ["Ủ"]={ "U","̉" },
+ ["ủ"]={ "u","̉" },
+ ["Ứ"]={ "Ư","́" },
+ ["ứ"]={ "ư","́" },
+ ["Ừ"]={ "Ư","̀" },
+ ["ừ"]={ "ư","̀" },
+ ["Ử"]={ "Ư","̉" },
+ ["ử"]={ "ư","̉" },
+ ["Ữ"]={ "Ư","̃" },
+ ["ữ"]={ "ư","̃" },
+ ["Ự"]={ "Ư","̣" },
+ ["ự"]={ "ư","̣" },
+ ["Ỳ"]={ "Y","̀" },
+ ["ỳ"]={ "y","̀" },
+ ["Ỵ"]={ "Y","̣" },
+ ["ỵ"]={ "y","̣" },
+ ["Ỷ"]={ "Y","̉" },
+ ["ỷ"]={ "y","̉" },
+ ["Ỹ"]={ "Y","̃" },
+ ["ỹ"]={ "y","̃" },
+ ["ἀ"]={ "α","̓" },
+ ["ἁ"]={ "α","̔" },
+ ["ἂ"]={ "ἀ","̀" },
+ ["ἃ"]={ "ἁ","̀" },
+ ["ἄ"]={ "ἀ","́" },
+ ["ἅ"]={ "ἁ","́" },
+ ["ἆ"]={ "ἀ","͂" },
+ ["ἇ"]={ "ἁ","͂" },
+ ["Ἀ"]={ "Α","̓" },
+ ["Ἁ"]={ "Α","̔" },
+ ["Ἂ"]={ "Ἀ","̀" },
+ ["Ἃ"]={ "Ἁ","̀" },
+ ["Ἄ"]={ "Ἀ","́" },
+ ["Ἅ"]={ "Ἁ","́" },
+ ["Ἆ"]={ "Ἀ","͂" },
+ ["Ἇ"]={ "Ἁ","͂" },
+ ["ἐ"]={ "ε","̓" },
+ ["ἑ"]={ "ε","̔" },
+ ["ἒ"]={ "ἐ","̀" },
+ ["ἓ"]={ "ἑ","̀" },
+ ["ἔ"]={ "ἐ","́" },
+ ["ἕ"]={ "ἑ","́" },
+ ["Ἐ"]={ "Ε","̓" },
+ ["Ἑ"]={ "Ε","̔" },
+ ["Ἒ"]={ "Ἐ","̀" },
+ ["Ἓ"]={ "Ἑ","̀" },
+ ["Ἔ"]={ "Ἐ","́" },
+ ["Ἕ"]={ "Ἑ","́" },
+ ["ἠ"]={ "η","̓" },
+ ["ἡ"]={ "η","̔" },
+ ["ἢ"]={ "ἠ","̀" },
+ ["ἣ"]={ "ἡ","̀" },
+ ["ἤ"]={ "ἠ","́" },
+ ["ἥ"]={ "ἡ","́" },
+ ["ἦ"]={ "ἠ","͂" },
+ ["ἧ"]={ "ἡ","͂" },
+ ["Ἠ"]={ "Η","̓" },
+ ["Ἡ"]={ "Η","̔" },
+ ["Ἢ"]={ "Ἠ","̀" },
+ ["Ἣ"]={ "Ἡ","̀" },
+ ["Ἤ"]={ "Ἠ","́" },
+ ["Ἥ"]={ "Ἡ","́" },
+ ["Ἦ"]={ "Ἠ","͂" },
+ ["Ἧ"]={ "Ἡ","͂" },
+ ["ἰ"]={ "ι","̓" },
+ ["ἱ"]={ "ι","̔" },
+ ["ἲ"]={ "ἰ","̀" },
+ ["ἳ"]={ "ἱ","̀" },
+ ["ἴ"]={ "ἰ","́" },
+ ["ἵ"]={ "ἱ","́" },
+ ["ἶ"]={ "ἰ","͂" },
+ ["ἷ"]={ "ἱ","͂" },
+ ["Ἰ"]={ "Ι","̓" },
+ ["Ἱ"]={ "Ι","̔" },
+ ["Ἲ"]={ "Ἰ","̀" },
+ ["Ἳ"]={ "Ἱ","̀" },
+ ["Ἴ"]={ "Ἰ","́" },
+ ["Ἵ"]={ "Ἱ","́" },
+ ["Ἶ"]={ "Ἰ","͂" },
+ ["Ἷ"]={ "Ἱ","͂" },
+ ["ὀ"]={ "ο","̓" },
+ ["ὁ"]={ "ο","̔" },
+ ["ὂ"]={ "ὀ","̀" },
+ ["ὃ"]={ "ὁ","̀" },
+ ["ὄ"]={ "ὀ","́" },
+ ["ὅ"]={ "ὁ","́" },
+ ["Ὀ"]={ "Ο","̓" },
+ ["Ὁ"]={ "Ο","̔" },
+ ["Ὂ"]={ "Ὀ","̀" },
+ ["Ὃ"]={ "Ὁ","̀" },
+ ["Ὄ"]={ "Ὀ","́" },
+ ["Ὅ"]={ "Ὁ","́" },
+ ["ὐ"]={ "υ","̓" },
+ ["ὑ"]={ "υ","̔" },
+ ["ὒ"]={ "ὐ","̀" },
+ ["ὓ"]={ "ὑ","̀" },
+ ["ὔ"]={ "ὐ","́" },
+ ["ὕ"]={ "ὑ","́" },
+ ["ὖ"]={ "ὐ","͂" },
+ ["ὗ"]={ "ὑ","͂" },
+ ["Ὑ"]={ "Υ","̔" },
+ ["Ὓ"]={ "Ὑ","̀" },
+ ["Ὕ"]={ "Ὑ","́" },
+ ["Ὗ"]={ "Ὑ","͂" },
+ ["ὠ"]={ "ω","̓" },
+ ["ὡ"]={ "ω","̔" },
+ ["ὢ"]={ "ὠ","̀" },
+ ["ὣ"]={ "ὡ","̀" },
+ ["ὤ"]={ "ὠ","́" },
+ ["ὥ"]={ "ὡ","́" },
+ ["ὦ"]={ "ὠ","͂" },
+ ["ὧ"]={ "ὡ","͂" },
+ ["Ὠ"]={ "Ω","̓" },
+ ["Ὡ"]={ "Ω","̔" },
+ ["Ὢ"]={ "Ὠ","̀" },
+ ["Ὣ"]={ "Ὡ","̀" },
+ ["Ὤ"]={ "Ὠ","́" },
+ ["Ὥ"]={ "Ὡ","́" },
+ ["Ὦ"]={ "Ὠ","͂" },
+ ["Ὧ"]={ "Ὡ","͂" },
+ ["ὰ"]={ "α","̀" },
+ ["ὲ"]={ "ε","̀" },
+ ["ὴ"]={ "η","̀" },
+ ["ὶ"]={ "ι","̀" },
+ ["ὸ"]={ "ο","̀" },
+ ["ὺ"]={ "υ","̀" },
+ ["ὼ"]={ "ω","̀" },
+ ["ᾀ"]={ "ἀ","ͅ" },
+ ["ᾁ"]={ "ἁ","ͅ" },
+ ["ᾂ"]={ "ἂ","ͅ" },
+ ["ᾃ"]={ "ἃ","ͅ" },
+ ["ᾄ"]={ "ἄ","ͅ" },
+ ["ᾅ"]={ "ἅ","ͅ" },
+ ["ᾆ"]={ "ἆ","ͅ" },
+ ["ᾇ"]={ "ἇ","ͅ" },
+ ["ᾈ"]={ "Ἀ","ͅ" },
+ ["ᾉ"]={ "Ἁ","ͅ" },
+ ["ᾊ"]={ "Ἂ","ͅ" },
+ ["ᾋ"]={ "Ἃ","ͅ" },
+ ["ᾌ"]={ "Ἄ","ͅ" },
+ ["ᾍ"]={ "Ἅ","ͅ" },
+ ["ᾎ"]={ "Ἆ","ͅ" },
+ ["ᾏ"]={ "Ἇ","ͅ" },
+ ["ᾐ"]={ "ἠ","ͅ" },
+ ["ᾑ"]={ "ἡ","ͅ" },
+ ["ᾒ"]={ "ἢ","ͅ" },
+ ["ᾓ"]={ "ἣ","ͅ" },
+ ["ᾔ"]={ "ἤ","ͅ" },
+ ["ᾕ"]={ "ἥ","ͅ" },
+ ["ᾖ"]={ "ἦ","ͅ" },
+ ["ᾗ"]={ "ἧ","ͅ" },
+ ["ᾘ"]={ "Ἠ","ͅ" },
+ ["ᾙ"]={ "Ἡ","ͅ" },
+ ["ᾚ"]={ "Ἢ","ͅ" },
+ ["ᾛ"]={ "Ἣ","ͅ" },
+ ["ᾜ"]={ "Ἤ","ͅ" },
+ ["ᾝ"]={ "Ἥ","ͅ" },
+ ["ᾞ"]={ "Ἦ","ͅ" },
+ ["ᾟ"]={ "Ἧ","ͅ" },
+ ["ᾠ"]={ "ὠ","ͅ" },
+ ["ᾡ"]={ "ὡ","ͅ" },
+ ["ᾢ"]={ "ὢ","ͅ" },
+ ["ᾣ"]={ "ὣ","ͅ" },
+ ["ᾤ"]={ "ὤ","ͅ" },
+ ["ᾥ"]={ "ὥ","ͅ" },
+ ["ᾦ"]={ "ὦ","ͅ" },
+ ["ᾧ"]={ "ὧ","ͅ" },
+ ["ᾨ"]={ "Ὠ","ͅ" },
+ ["ᾩ"]={ "Ὡ","ͅ" },
+ ["ᾪ"]={ "Ὢ","ͅ" },
+ ["ᾫ"]={ "Ὣ","ͅ" },
+ ["ᾬ"]={ "Ὤ","ͅ" },
+ ["ᾭ"]={ "Ὥ","ͅ" },
+ ["ᾮ"]={ "Ὦ","ͅ" },
+ ["ᾯ"]={ "Ὧ","ͅ" },
+ ["ᾰ"]={ "α","̆" },
+ ["ᾱ"]={ "α","̄" },
+ ["ᾲ"]={ "ὰ","ͅ" },
+ ["ᾳ"]={ "α","ͅ" },
+ ["ᾴ"]={ "ά","ͅ" },
+ ["ᾶ"]={ "α","͂" },
+ ["ᾷ"]={ "ᾶ","ͅ" },
+ ["Ᾰ"]={ "Α","̆" },
+ ["Ᾱ"]={ "Α","̄" },
+ ["Ὰ"]={ "Α","̀" },
+ ["ᾼ"]={ "Α","ͅ" },
+ ["῁"]={ "¨","͂" },
+ ["ῂ"]={ "ὴ","ͅ" },
+ ["ῃ"]={ "η","ͅ" },
+ ["ῄ"]={ "ή","ͅ" },
+ ["ῆ"]={ "η","͂" },
+ ["ῇ"]={ "ῆ","ͅ" },
+ ["Ὲ"]={ "Ε","̀" },
+ ["Ὴ"]={ "Η","̀" },
+ ["ῌ"]={ "Η","ͅ" },
+ ["῍"]={ "᾿","̀" },
+ ["῎"]={ "᾿","́" },
+ ["῏"]={ "᾿","͂" },
+ ["ῐ"]={ "ι","̆" },
+ ["ῑ"]={ "ι","̄" },
+ ["ῒ"]={ "ϊ","̀" },
+ ["ῖ"]={ "ι","͂" },
+ ["ῗ"]={ "ϊ","͂" },
+ ["Ῐ"]={ "Ι","̆" },
+ ["Ῑ"]={ "Ι","̄" },
+ ["Ὶ"]={ "Ι","̀" },
+ ["῝"]={ "῾","̀" },
+ ["῞"]={ "῾","́" },
+ ["῟"]={ "῾","͂" },
+ ["ῠ"]={ "υ","̆" },
+ ["ῡ"]={ "υ","̄" },
+ ["ῢ"]={ "ϋ","̀" },
+ ["ῤ"]={ "ρ","̓" },
+ ["ῥ"]={ "ρ","̔" },
+ ["ῦ"]={ "υ","͂" },
+ ["ῧ"]={ "ϋ","͂" },
+ ["Ῠ"]={ "Υ","̆" },
+ ["Ῡ"]={ "Υ","̄" },
+ ["Ὺ"]={ "Υ","̀" },
+ ["Ῥ"]={ "Ρ","̔" },
+ ["῭"]={ "¨","̀" },
+ ["ῲ"]={ "ὼ","ͅ" },
+ ["ῳ"]={ "ω","ͅ" },
+ ["ῴ"]={ "ώ","ͅ" },
+ ["ῶ"]={ "ω","͂" },
+ ["ῷ"]={ "ῶ","ͅ" },
+ ["Ὸ"]={ "Ο","̀" },
+ ["Ὼ"]={ "Ω","̀" },
+ ["ῼ"]={ "Ω","ͅ" },
+ ["↚"]={ "←","̸" },
+ ["↛"]={ "→","̸" },
+ ["↮"]={ "↔","̸" },
+ ["⇍"]={ "⇐","̸" },
+ ["⇎"]={ "⇔","̸" },
+ ["⇏"]={ "⇒","̸" },
+ ["∄"]={ "∃","̸" },
+ ["∉"]={ "∈","̸" },
+ ["∌"]={ "∋","̸" },
+ ["∤"]={ "∣","̸" },
+ ["∦"]={ "∥","̸" },
+ ["≁"]={ "∼","̸" },
+ ["≄"]={ "≃","̸" },
+ ["≇"]={ "≅","̸" },
+ ["≉"]={ "≈","̸" },
+ ["≠"]={ "=","̸" },
+ ["≢"]={ "≡","̸" },
+ ["≭"]={ "≍","̸" },
+ ["≮"]={ "<","̸" },
+ ["≯"]={ ">","̸" },
+ ["≰"]={ "≤","̸" },
+ ["≱"]={ "≥","̸" },
+ ["≴"]={ "≲","̸" },
+ ["≵"]={ "≳","̸" },
+ ["≸"]={ "≶","̸" },
+ ["≹"]={ "≷","̸" },
+ ["⊀"]={ "≺","̸" },
+ ["⊁"]={ "≻","̸" },
+ ["⊄"]={ "⊂","̸" },
+ ["⊅"]={ "⊃","̸" },
+ ["⊈"]={ "⊆","̸" },
+ ["⊉"]={ "⊇","̸" },
+ ["⊬"]={ "⊢","̸" },
+ ["⊭"]={ "⊨","̸" },
+ ["⊮"]={ "⊩","̸" },
+ ["⊯"]={ "⊫","̸" },
+ ["⋠"]={ "≼","̸" },
+ ["⋡"]={ "≽","̸" },
+ ["⋢"]={ "⊑","̸" },
+ ["⋣"]={ "⊒","̸" },
+ ["⋪"]={ "⊲","̸" },
+ ["⋫"]={ "⊳","̸" },
+ ["⋬"]={ "⊴","̸" },
+ ["⋭"]={ "⊵","̸" },
+ ["⫝̸"]={ "⫝","̸" },
+ ["が"]={ "か","゙" },
+ ["ぎ"]={ "き","゙" },
+ ["ぐ"]={ "く","゙" },
+ ["げ"]={ "け","゙" },
+ ["ご"]={ "こ","゙" },
+ ["ざ"]={ "さ","゙" },
+ ["じ"]={ "し","゙" },
+ ["ず"]={ "す","゙" },
+ ["ぜ"]={ "せ","゙" },
+ ["ぞ"]={ "そ","゙" },
+ ["だ"]={ "た","゙" },
+ ["ぢ"]={ "ち","゙" },
+ ["づ"]={ "つ","゙" },
+ ["で"]={ "て","゙" },
+ ["ど"]={ "と","゙" },
+ ["ば"]={ "は","゙" },
+ ["ぱ"]={ "は","゚" },
+ ["び"]={ "ひ","゙" },
+ ["ぴ"]={ "ひ","゚" },
+ ["ぶ"]={ "ふ","゙" },
+ ["ぷ"]={ "ふ","゚" },
+ ["べ"]={ "へ","゙" },
+ ["ぺ"]={ "へ","゚" },
+ ["ぼ"]={ "ほ","゙" },
+ ["ぽ"]={ "ほ","゚" },
+ ["ゔ"]={ "う","゙" },
+ ["ゞ"]={ "ゝ","゙" },
+ ["ガ"]={ "カ","゙" },
+ ["ギ"]={ "キ","゙" },
+ ["グ"]={ "ク","゙" },
+ ["ゲ"]={ "ケ","゙" },
+ ["ゴ"]={ "コ","゙" },
+ ["ザ"]={ "サ","゙" },
+ ["ジ"]={ "シ","゙" },
+ ["ズ"]={ "ス","゙" },
+ ["ゼ"]={ "セ","゙" },
+ ["ゾ"]={ "ソ","゙" },
+ ["ダ"]={ "タ","゙" },
+ ["ヂ"]={ "チ","゙" },
+ ["ヅ"]={ "ツ","゙" },
+ ["デ"]={ "テ","゙" },
+ ["ド"]={ "ト","゙" },
+ ["バ"]={ "ハ","゙" },
+ ["パ"]={ "ハ","゚" },
+ ["ビ"]={ "ヒ","゙" },
+ ["ピ"]={ "ヒ","゚" },
+ ["ブ"]={ "フ","゙" },
+ ["プ"]={ "フ","゚" },
+ ["ベ"]={ "ヘ","゙" },
+ ["ペ"]={ "ヘ","゚" },
+ ["ボ"]={ "ホ","゙" },
+ ["ポ"]={ "ホ","゚" },
+ ["ヴ"]={ "ウ","゙" },
+ ["ヷ"]={ "ワ","゙" },
+ ["ヸ"]={ "ヰ","゙" },
+ ["ヹ"]={ "ヱ","゙" },
+ ["ヺ"]={ "ヲ","゙" },
+ ["ヾ"]={ "ヽ","゙" },
+ ["יִ"]={ "י","ִ" },
+ ["ײַ"]={ "ײ","ַ" },
+ ["שׁ"]={ "ש","ׁ" },
+ ["שׂ"]={ "ש","ׂ" },
+ ["שּׁ"]={ "שּ","ׁ" },
+ ["שּׂ"]={ "שּ","ׂ" },
+ ["אַ"]={ "א","ַ" },
+ ["אָ"]={ "א","ָ" },
+ ["אּ"]={ "א","ּ" },
+ ["בּ"]={ "ב","ּ" },
+ ["גּ"]={ "ג","ּ" },
+ ["דּ"]={ "ד","ּ" },
+ ["הּ"]={ "ה","ּ" },
+ ["וּ"]={ "ו","ּ" },
+ ["זּ"]={ "ז","ּ" },
+ ["טּ"]={ "ט","ּ" },
+ ["יּ"]={ "י","ּ" },
+ ["ךּ"]={ "ך","ּ" },
+ ["כּ"]={ "כ","ּ" },
+ ["לּ"]={ "ל","ּ" },
+ ["מּ"]={ "מ","ּ" },
+ ["נּ"]={ "נ","ּ" },
+ ["סּ"]={ "ס","ּ" },
+ ["ףּ"]={ "ף","ּ" },
+ ["פּ"]={ "פ","ּ" },
+ ["צּ"]={ "צ","ּ" },
+ ["קּ"]={ "ק","ּ" },
+ ["רּ"]={ "ר","ּ" },
+ ["שּ"]={ "ש","ּ" },
+ ["תּ"]={ "ת","ּ" },
+ ["וֹ"]={ "ו","ֹ" },
+ ["בֿ"]={ "ב","ֿ" },
+ ["כֿ"]={ "כ","ֿ" },
+ ["פֿ"]={ "פ","ֿ" },
+ ["𑂚"]={ "𑂙","𑂺" },
+ ["𑂜"]={ "𑂛","𑂺" },
+ ["𑂫"]={ "𑂥","𑂺" },
+ ["𑄮"]={ "𑄱","𑄧" },
+ ["𑄯"]={ "𑄲","𑄧" },
+ ["𑍋"]={ "𑍇","𑌾" },
+ ["𑍌"]={ "𑍇","𑍗" },
+ ["𑒻"]={ "𑒹","𑒺" },
+ ["𑒼"]={ "𑒹","𑒰" },
+ ["𑒾"]={ "𑒹","𑒽" },
+ ["𑖺"]={ "𑖸","𑖯" },
+ ["𑖻"]={ "𑖹","𑖯" },
+ ["𝅗𝅥"]={ "𝅗","𝅥" },
+ ["𝅘𝅥"]={ "𝅘","𝅥" },
+ ["𝅘𝅥𝅮"]={ "𝅘𝅥","𝅮" },
+ ["𝅘𝅥𝅯"]={ "𝅘𝅥","𝅯" },
+ ["𝅘𝅥𝅰"]={ "𝅘𝅥","𝅰" },
+ ["𝅘𝅥𝅱"]={ "𝅘𝅥","𝅱" },
+ ["𝅘𝅥𝅲"]={ "𝅘𝅥","𝅲" },
+ ["𝆹𝅥"]={ "𝆹","𝅥" },
+ ["𝆺𝅥"]={ "𝆺","𝅥" },
+ ["𝆹𝅥𝅮"]={ "𝆹𝅥","𝅮" },
+ ["𝆺𝅥𝅮"]={ "𝆺𝅥","𝅮" },
+ ["𝆹𝅥𝅯"]={ "𝆹𝅥","𝅯" },
+ ["𝆺𝅥𝅯"]={ "𝆺𝅥","𝅯" },
+ },
+ },
+ {
+ ["data"]={
+ ["À"]={ "A","̀" },
+ ["Á"]={ "A","́" },
+ ["Â"]={ "A","̂" },
+ ["Ã"]={ "A","̃" },
+ ["Ä"]={ "A","̈" },
+ ["Å"]={ "A","̊" },
+ ["Ç"]={ "C","̧" },
+ ["È"]={ "E","̀" },
+ ["É"]={ "E","́" },
+ ["Ê"]={ "E","̂" },
+ ["Ë"]={ "E","̈" },
+ ["Ì"]={ "I","̀" },
+ ["Í"]={ "I","́" },
+ ["Î"]={ "I","̂" },
+ ["Ï"]={ "I","̈" },
+ ["Ñ"]={ "N","̃" },
+ ["Ò"]={ "O","̀" },
+ ["Ó"]={ "O","́" },
+ ["Ô"]={ "O","̂" },
+ ["Õ"]={ "O","̃" },
+ ["Ö"]={ "O","̈" },
+ ["Ù"]={ "U","̀" },
+ ["Ú"]={ "U","́" },
+ ["Û"]={ "U","̂" },
+ ["Ü"]={ "U","̈" },
+ ["Ý"]={ "Y","́" },
+ ["à"]={ "a","̀" },
+ ["á"]={ "a","́" },
+ ["â"]={ "a","̂" },
+ ["ã"]={ "a","̃" },
+ ["ä"]={ "a","̈" },
+ ["å"]={ "a","̊" },
+ ["ç"]={ "c","̧" },
+ ["è"]={ "e","̀" },
+ ["é"]={ "e","́" },
+ ["ê"]={ "e","̂" },
+ ["ë"]={ "e","̈" },
+ ["ì"]={ "i","̀" },
+ ["í"]={ "i","́" },
+ ["î"]={ "i","̂" },
+ ["ï"]={ "i","̈" },
+ ["ñ"]={ "n","̃" },
+ ["ò"]={ "o","̀" },
+ ["ó"]={ "o","́" },
+ ["ô"]={ "o","̂" },
+ ["õ"]={ "o","̃" },
+ ["ö"]={ "o","̈" },
+ ["ù"]={ "u","̀" },
+ ["ú"]={ "u","́" },
+ ["û"]={ "u","̂" },
+ ["ü"]={ "u","̈" },
+ ["ý"]={ "y","́" },
+ ["ÿ"]={ "y","̈" },
+ ["Ā"]={ "A","̄" },
+ ["ā"]={ "a","̄" },
+ ["Ă"]={ "A","̆" },
+ ["ă"]={ "a","̆" },
+ ["Ą"]={ "A","̨" },
+ ["ą"]={ "a","̨" },
+ ["Ć"]={ "C","́" },
+ ["ć"]={ "c","́" },
+ ["Ĉ"]={ "C","̂" },
+ ["ĉ"]={ "c","̂" },
+ ["Ċ"]={ "C","̇" },
+ ["ċ"]={ "c","̇" },
+ ["Č"]={ "C","̌" },
+ ["č"]={ "c","̌" },
+ ["Ď"]={ "D","̌" },
+ ["ď"]={ "d","̌" },
+ ["Ē"]={ "E","̄" },
+ ["ē"]={ "e","̄" },
+ ["Ĕ"]={ "E","̆" },
+ ["ĕ"]={ "e","̆" },
+ ["Ė"]={ "E","̇" },
+ ["ė"]={ "e","̇" },
+ ["Ę"]={ "E","̨" },
+ ["ę"]={ "e","̨" },
+ ["Ě"]={ "E","̌" },
+ ["ě"]={ "e","̌" },
+ ["Ĝ"]={ "G","̂" },
+ ["ĝ"]={ "g","̂" },
+ ["Ğ"]={ "G","̆" },
+ ["ğ"]={ "g","̆" },
+ ["Ġ"]={ "G","̇" },
+ ["ġ"]={ "g","̇" },
+ ["Ģ"]={ "G","̧" },
+ ["ģ"]={ "g","̧" },
+ ["Ĥ"]={ "H","̂" },
+ ["ĥ"]={ "h","̂" },
+ ["Ĩ"]={ "I","̃" },
+ ["ĩ"]={ "i","̃" },
+ ["Ī"]={ "I","̄" },
+ ["ī"]={ "i","̄" },
+ ["Ĭ"]={ "I","̆" },
+ ["ĭ"]={ "i","̆" },
+ ["Į"]={ "I","̨" },
+ ["į"]={ "i","̨" },
+ ["İ"]={ "I","̇" },
+ ["Ĵ"]={ "J","̂" },
+ ["ĵ"]={ "j","̂" },
+ ["Ķ"]={ "K","̧" },
+ ["ķ"]={ "k","̧" },
+ ["Ĺ"]={ "L","́" },
+ ["ĺ"]={ "l","́" },
+ ["Ļ"]={ "L","̧" },
+ ["ļ"]={ "l","̧" },
+ ["Ľ"]={ "L","̌" },
+ ["ľ"]={ "l","̌" },
+ ["Ń"]={ "N","́" },
+ ["ń"]={ "n","́" },
+ ["Ņ"]={ "N","̧" },
+ ["ņ"]={ "n","̧" },
+ ["Ň"]={ "N","̌" },
+ ["ň"]={ "n","̌" },
+ ["Ō"]={ "O","̄" },
+ ["ō"]={ "o","̄" },
+ ["Ŏ"]={ "O","̆" },
+ ["ŏ"]={ "o","̆" },
+ ["Ő"]={ "O","̋" },
+ ["ő"]={ "o","̋" },
+ ["Ŕ"]={ "R","́" },
+ ["ŕ"]={ "r","́" },
+ ["Ŗ"]={ "R","̧" },
+ ["ŗ"]={ "r","̧" },
+ ["Ř"]={ "R","̌" },
+ ["ř"]={ "r","̌" },
+ ["Ś"]={ "S","́" },
+ ["ś"]={ "s","́" },
+ ["Ŝ"]={ "S","̂" },
+ ["ŝ"]={ "s","̂" },
+ ["Ş"]={ "S","̧" },
+ ["ş"]={ "s","̧" },
+ ["Š"]={ "S","̌" },
+ ["š"]={ "s","̌" },
+ ["Ţ"]={ "T","̧" },
+ ["ţ"]={ "t","̧" },
+ ["Ť"]={ "T","̌" },
+ ["ť"]={ "t","̌" },
+ ["Ũ"]={ "U","̃" },
+ ["ũ"]={ "u","̃" },
+ ["Ū"]={ "U","̄" },
+ ["ū"]={ "u","̄" },
+ ["Ŭ"]={ "U","̆" },
+ ["ŭ"]={ "u","̆" },
+ ["Ů"]={ "U","̊" },
+ ["ů"]={ "u","̊" },
+ ["Ű"]={ "U","̋" },
+ ["ű"]={ "u","̋" },
+ ["Ų"]={ "U","̨" },
+ ["ų"]={ "u","̨" },
+ ["Ŵ"]={ "W","̂" },
+ ["ŵ"]={ "w","̂" },
+ ["Ŷ"]={ "Y","̂" },
+ ["ŷ"]={ "y","̂" },
+ ["Ÿ"]={ "Y","̈" },
+ ["Ź"]={ "Z","́" },
+ ["ź"]={ "z","́" },
+ ["Ż"]={ "Z","̇" },
+ ["ż"]={ "z","̇" },
+ ["Ž"]={ "Z","̌" },
+ ["ž"]={ "z","̌" },
+ ["Ơ"]={ "O","̛" },
+ ["ơ"]={ "o","̛" },
+ ["Ư"]={ "U","̛" },
+ ["ư"]={ "u","̛" },
+ ["Ǎ"]={ "A","̌" },
+ ["ǎ"]={ "a","̌" },
+ ["Ǐ"]={ "I","̌" },
+ ["ǐ"]={ "i","̌" },
+ ["Ǒ"]={ "O","̌" },
+ ["ǒ"]={ "o","̌" },
+ ["Ǔ"]={ "U","̌" },
+ ["ǔ"]={ "u","̌" },
+ ["Ǖ"]={ "Ü","̄" },
+ ["ǖ"]={ "ü","̄" },
+ ["Ǘ"]={ "Ü","́" },
+ ["ǘ"]={ "ü","́" },
+ ["Ǚ"]={ "Ü","̌" },
+ ["ǚ"]={ "ü","̌" },
+ ["Ǜ"]={ "Ü","̀" },
+ ["ǜ"]={ "ü","̀" },
+ ["Ǟ"]={ "Ä","̄" },
+ ["ǟ"]={ "ä","̄" },
+ ["Ǡ"]={ "Ȧ","̄" },
+ ["ǡ"]={ "ȧ","̄" },
+ ["Ǣ"]={ "Æ","̄" },
+ ["ǣ"]={ "æ","̄" },
+ ["Ǧ"]={ "G","̌" },
+ ["ǧ"]={ "g","̌" },
+ ["Ǩ"]={ "K","̌" },
+ ["ǩ"]={ "k","̌" },
+ ["Ǫ"]={ "O","̨" },
+ ["ǫ"]={ "o","̨" },
+ ["Ǭ"]={ "Ǫ","̄" },
+ ["ǭ"]={ "ǫ","̄" },
+ ["Ǯ"]={ "Ʒ","̌" },
+ ["ǯ"]={ "ʒ","̌" },
+ ["ǰ"]={ "j","̌" },
+ ["Ǵ"]={ "G","́" },
+ ["ǵ"]={ "g","́" },
+ ["Ǹ"]={ "N","̀" },
+ ["ǹ"]={ "n","̀" },
+ ["Ǻ"]={ "Å","́" },
+ ["ǻ"]={ "å","́" },
+ ["Ǽ"]={ "Æ","́" },
+ ["ǽ"]={ "æ","́" },
+ ["Ǿ"]={ "Ø","́" },
+ ["ǿ"]={ "ø","́" },
+ ["Ȁ"]={ "A","̏" },
+ ["ȁ"]={ "a","̏" },
+ ["Ȃ"]={ "A","̑" },
+ ["ȃ"]={ "a","̑" },
+ ["Ȅ"]={ "E","̏" },
+ ["ȅ"]={ "e","̏" },
+ ["Ȇ"]={ "E","̑" },
+ ["ȇ"]={ "e","̑" },
+ ["Ȉ"]={ "I","̏" },
+ ["ȉ"]={ "i","̏" },
+ ["Ȋ"]={ "I","̑" },
+ ["ȋ"]={ "i","̑" },
+ ["Ȍ"]={ "O","̏" },
+ ["ȍ"]={ "o","̏" },
+ ["Ȏ"]={ "O","̑" },
+ ["ȏ"]={ "o","̑" },
+ ["Ȑ"]={ "R","̏" },
+ ["ȑ"]={ "r","̏" },
+ ["Ȓ"]={ "R","̑" },
+ ["ȓ"]={ "r","̑" },
+ ["Ȕ"]={ "U","̏" },
+ ["ȕ"]={ "u","̏" },
+ ["Ȗ"]={ "U","̑" },
+ ["ȗ"]={ "u","̑" },
+ ["Ș"]={ "S","̦" },
+ ["ș"]={ "s","̦" },
+ ["Ț"]={ "T","̦" },
+ ["ț"]={ "t","̦" },
+ ["Ȟ"]={ "H","̌" },
+ ["ȟ"]={ "h","̌" },
+ ["Ȧ"]={ "A","̇" },
+ ["ȧ"]={ "a","̇" },
+ ["Ȩ"]={ "E","̧" },
+ ["ȩ"]={ "e","̧" },
+ ["Ȫ"]={ "Ö","̄" },
+ ["ȫ"]={ "ö","̄" },
+ ["Ȭ"]={ "Õ","̄" },
+ ["ȭ"]={ "õ","̄" },
+ ["Ȯ"]={ "O","̇" },
+ ["ȯ"]={ "o","̇" },
+ ["Ȱ"]={ "Ȯ","̄" },
+ ["ȱ"]={ "ȯ","̄" },
+ ["Ȳ"]={ "Y","̄" },
+ ["ȳ"]={ "y","̄" },
+ ["̈́"]={ "̈","́" },
+ ["΅"]={ "¨","́" },
+ ["Ά"]={ "Α","́" },
+ ["Έ"]={ "Ε","́" },
+ ["Ή"]={ "Η","́" },
+ ["Ί"]={ "Ι","́" },
+ ["Ό"]={ "Ο","́" },
+ ["Ύ"]={ "Υ","́" },
+ ["Ώ"]={ "Ω","́" },
+ ["ΐ"]={ "ϊ","́" },
+ ["Ϊ"]={ "Ι","̈" },
+ ["Ϋ"]={ "Υ","̈" },
+ ["ά"]={ "α","́" },
+ ["έ"]={ "ε","́" },
+ ["ή"]={ "η","́" },
+ ["ί"]={ "ι","́" },
+ ["ΰ"]={ "ϋ","́" },
+ ["ϊ"]={ "ι","̈" },
+ ["ϋ"]={ "υ","̈" },
+ ["ό"]={ "ο","́" },
+ ["ύ"]={ "υ","́" },
+ ["ώ"]={ "ω","́" },
+ ["ϓ"]={ "ϒ","́" },
+ ["ϔ"]={ "ϒ","̈" },
+ ["Ѐ"]={ "Е","̀" },
+ ["Ё"]={ "Е","̈" },
+ ["Ѓ"]={ "Г","́" },
+ ["Ї"]={ "І","̈" },
+ ["Ќ"]={ "К","́" },
+ ["Ѝ"]={ "И","̀" },
+ ["Ў"]={ "У","̆" },
+ ["Й"]={ "И","̆" },
+ ["й"]={ "и","̆" },
+ ["ѐ"]={ "е","̀" },
+ ["ё"]={ "е","̈" },
+ ["ѓ"]={ "г","́" },
+ ["ї"]={ "і","̈" },
+ ["ќ"]={ "к","́" },
+ ["ѝ"]={ "и","̀" },
+ ["ў"]={ "у","̆" },
+ ["Ѷ"]={ "Ѵ","̏" },
+ ["ѷ"]={ "ѵ","̏" },
+ ["Ӂ"]={ "Ж","̆" },
+ ["ӂ"]={ "ж","̆" },
+ ["Ӑ"]={ "А","̆" },
+ ["ӑ"]={ "а","̆" },
+ ["Ӓ"]={ "А","̈" },
+ ["ӓ"]={ "а","̈" },
+ ["Ӗ"]={ "Е","̆" },
+ ["ӗ"]={ "е","̆" },
+ ["Ӛ"]={ "Ә","̈" },
+ ["ӛ"]={ "ә","̈" },
+ ["Ӝ"]={ "Ж","̈" },
+ ["ӝ"]={ "ж","̈" },
+ ["Ӟ"]={ "З","̈" },
+ ["ӟ"]={ "з","̈" },
+ ["Ӣ"]={ "И","̄" },
+ ["ӣ"]={ "и","̄" },
+ ["Ӥ"]={ "И","̈" },
+ ["ӥ"]={ "и","̈" },
+ ["Ӧ"]={ "О","̈" },
+ ["ӧ"]={ "о","̈" },
+ ["Ӫ"]={ "Ө","̈" },
+ ["ӫ"]={ "ө","̈" },
+ ["Ӭ"]={ "Э","̈" },
+ ["ӭ"]={ "э","̈" },
+ ["Ӯ"]={ "У","̄" },
+ ["ӯ"]={ "у","̄" },
+ ["Ӱ"]={ "У","̈" },
+ ["ӱ"]={ "у","̈" },
+ ["Ӳ"]={ "У","̋" },
+ ["ӳ"]={ "у","̋" },
+ ["Ӵ"]={ "Ч","̈" },
+ ["ӵ"]={ "ч","̈" },
+ ["Ӹ"]={ "Ы","̈" },
+ ["ӹ"]={ "ы","̈" },
+ ["آ"]={ "ا","ٓ" },
+ ["أ"]={ "ا","ٔ" },
+ ["ؤ"]={ "و","ٔ" },
+ ["إ"]={ "ا","ٕ" },
+ ["ئ"]={ "ي","ٔ" },
+ ["ۀ"]={ "ە","ٔ" },
+ ["ۂ"]={ "ہ","ٔ" },
+ ["ۓ"]={ "ے","ٔ" },
+ ["ऩ"]={ "न","़" },
+ ["ऱ"]={ "र","़" },
+ ["ऴ"]={ "ळ","़" },
+ ["क़"]={ "क","़" },
+ ["ख़"]={ "ख","़" },
+ ["ग़"]={ "ग","़" },
+ ["ज़"]={ "ज","़" },
+ ["ड़"]={ "ड","़" },
+ ["ढ़"]={ "ढ","़" },
+ ["फ़"]={ "फ","़" },
+ ["य़"]={ "य","़" },
+ ["ো"]={ "ে","া" },
+ ["ৌ"]={ "ে","ৗ" },
+ ["ড়"]={ "ড","়" },
+ ["ঢ়"]={ "ঢ","়" },
+ ["য়"]={ "য","়" },
+ ["ਲ਼"]={ "ਲ","਼" },
+ ["ਸ਼"]={ "ਸ","਼" },
+ ["ਖ਼"]={ "ਖ","਼" },
+ ["ਗ਼"]={ "ਗ","਼" },
+ ["ਜ਼"]={ "ਜ","਼" },
+ ["ਫ਼"]={ "ਫ","਼" },
+ ["ୈ"]={ "େ","ୖ" },
+ ["ୋ"]={ "େ","ା" },
+ ["ୌ"]={ "େ","ୗ" },
+ ["ଡ଼"]={ "ଡ","଼" },
+ ["ଢ଼"]={ "ଢ","଼" },
+ ["ஔ"]={ "ஒ","ௗ" },
+ ["ொ"]={ "ெ","ா" },
+ ["ோ"]={ "ே","ா" },
+ ["ௌ"]={ "ெ","ௗ" },
+ ["ై"]={ "ె","ౖ" },
+ ["ೀ"]={ "ಿ","ೕ" },
+ ["ೇ"]={ "ೆ","ೕ" },
+ ["ೈ"]={ "ೆ","ೖ" },
+ ["ೊ"]={ "ೆ","ೂ" },
+ ["ೋ"]={ "ೊ","ೕ" },
+ ["ൊ"]={ "െ","ാ" },
+ ["ോ"]={ "േ","ാ" },
+ ["ൌ"]={ "െ","ൗ" },
+ ["ේ"]={ "ෙ","්" },
+ ["ො"]={ "ෙ","ා" },
+ ["ෝ"]={ "ො","්" },
+ ["ෞ"]={ "ෙ","ෟ" },
+ ["གྷ"]={ "ག","ྷ" },
+ ["ཌྷ"]={ "ཌ","ྷ" },
+ ["དྷ"]={ "ད","ྷ" },
+ ["བྷ"]={ "བ","ྷ" },
+ ["ཛྷ"]={ "ཛ","ྷ" },
+ ["ཀྵ"]={ "ཀ","ྵ" },
+ ["ཱི"]={ "ཱ","ི" },
+ ["ཱུ"]={ "ཱ","ུ" },
+ ["ྲྀ"]={ "ྲ","ྀ" },
+ ["ླྀ"]={ "ླ","ྀ" },
+ ["ཱྀ"]={ "ཱ","ྀ" },
+ ["ྒྷ"]={ "ྒ","ྷ" },
+ ["ྜྷ"]={ "ྜ","ྷ" },
+ ["ྡྷ"]={ "ྡ","ྷ" },
+ ["ྦྷ"]={ "ྦ","ྷ" },
+ ["ྫྷ"]={ "ྫ","ྷ" },
+ ["ྐྵ"]={ "ྐ","ྵ" },
+ ["ဦ"]={ "ဥ","ီ" },
+ ["ᬆ"]={ "ᬅ","ᬵ" },
+ ["ᬈ"]={ "ᬇ","ᬵ" },
+ ["ᬊ"]={ "ᬉ","ᬵ" },
+ ["ᬌ"]={ "ᬋ","ᬵ" },
+ ["ᬎ"]={ "ᬍ","ᬵ" },
+ ["ᬒ"]={ "ᬑ","ᬵ" },
+ ["ᬻ"]={ "ᬺ","ᬵ" },
+ ["ᬽ"]={ "ᬼ","ᬵ" },
+ ["ᭀ"]={ "ᬾ","ᬵ" },
+ ["ᭁ"]={ "ᬿ","ᬵ" },
+ ["ᭃ"]={ "ᭂ","ᬵ" },
+ ["Ḁ"]={ "A","̥" },
+ ["ḁ"]={ "a","̥" },
+ ["Ḃ"]={ "B","̇" },
+ ["ḃ"]={ "b","̇" },
+ ["Ḅ"]={ "B","̣" },
+ ["ḅ"]={ "b","̣" },
+ ["Ḇ"]={ "B","̱" },
+ ["ḇ"]={ "b","̱" },
+ ["Ḉ"]={ "Ç","́" },
+ ["ḉ"]={ "ç","́" },
+ ["Ḋ"]={ "D","̇" },
+ ["ḋ"]={ "d","̇" },
+ ["Ḍ"]={ "D","̣" },
+ ["ḍ"]={ "d","̣" },
+ ["Ḏ"]={ "D","̱" },
+ ["ḏ"]={ "d","̱" },
+ ["Ḑ"]={ "D","̧" },
+ ["ḑ"]={ "d","̧" },
+ ["Ḓ"]={ "D","̭" },
+ ["ḓ"]={ "d","̭" },
+ ["Ḕ"]={ "Ē","̀" },
+ ["ḕ"]={ "ē","̀" },
+ ["Ḗ"]={ "Ē","́" },
+ ["ḗ"]={ "ē","́" },
+ ["Ḙ"]={ "E","̭" },
+ ["ḙ"]={ "e","̭" },
+ ["Ḛ"]={ "E","̰" },
+ ["ḛ"]={ "e","̰" },
+ ["Ḝ"]={ "Ȩ","̆" },
+ ["ḝ"]={ "ȩ","̆" },
+ ["Ḟ"]={ "F","̇" },
+ ["ḟ"]={ "f","̇" },
+ ["Ḡ"]={ "G","̄" },
+ ["ḡ"]={ "g","̄" },
+ ["Ḣ"]={ "H","̇" },
+ ["ḣ"]={ "h","̇" },
+ ["Ḥ"]={ "H","̣" },
+ ["ḥ"]={ "h","̣" },
+ ["Ḧ"]={ "H","̈" },
+ ["ḧ"]={ "h","̈" },
+ ["Ḩ"]={ "H","̧" },
+ ["ḩ"]={ "h","̧" },
+ ["Ḫ"]={ "H","̮" },
+ ["ḫ"]={ "h","̮" },
+ ["Ḭ"]={ "I","̰" },
+ ["ḭ"]={ "i","̰" },
+ ["Ḯ"]={ "Ï","́" },
+ ["ḯ"]={ "ï","́" },
+ ["Ḱ"]={ "K","́" },
+ ["ḱ"]={ "k","́" },
+ ["Ḳ"]={ "K","̣" },
+ ["ḳ"]={ "k","̣" },
+ ["Ḵ"]={ "K","̱" },
+ ["ḵ"]={ "k","̱" },
+ ["Ḷ"]={ "L","̣" },
+ ["ḷ"]={ "l","̣" },
+ ["Ḹ"]={ "Ḷ","̄" },
+ ["ḹ"]={ "ḷ","̄" },
+ ["Ḻ"]={ "L","̱" },
+ ["ḻ"]={ "l","̱" },
+ ["Ḽ"]={ "L","̭" },
+ ["ḽ"]={ "l","̭" },
+ ["Ḿ"]={ "M","́" },
+ ["ḿ"]={ "m","́" },
+ ["Ṁ"]={ "M","̇" },
+ ["ṁ"]={ "m","̇" },
+ ["Ṃ"]={ "M","̣" },
+ ["ṃ"]={ "m","̣" },
+ ["Ṅ"]={ "N","̇" },
+ ["ṅ"]={ "n","̇" },
+ ["Ṇ"]={ "N","̣" },
+ ["ṇ"]={ "n","̣" },
+ ["Ṉ"]={ "N","̱" },
+ ["ṉ"]={ "n","̱" },
+ ["Ṋ"]={ "N","̭" },
+ ["ṋ"]={ "n","̭" },
+ ["Ṍ"]={ "Õ","́" },
+ ["ṍ"]={ "õ","́" },
+ ["Ṏ"]={ "Õ","̈" },
+ ["ṏ"]={ "õ","̈" },
+ ["Ṑ"]={ "Ō","̀" },
+ ["ṑ"]={ "ō","̀" },
+ ["Ṓ"]={ "Ō","́" },
+ ["ṓ"]={ "ō","́" },
+ ["Ṕ"]={ "P","́" },
+ ["ṕ"]={ "p","́" },
+ ["Ṗ"]={ "P","̇" },
+ ["ṗ"]={ "p","̇" },
+ ["Ṙ"]={ "R","̇" },
+ ["ṙ"]={ "r","̇" },
+ ["Ṛ"]={ "R","̣" },
+ ["ṛ"]={ "r","̣" },
+ ["Ṝ"]={ "Ṛ","̄" },
+ ["ṝ"]={ "ṛ","̄" },
+ ["Ṟ"]={ "R","̱" },
+ ["ṟ"]={ "r","̱" },
+ ["Ṡ"]={ "S","̇" },
+ ["ṡ"]={ "s","̇" },
+ ["Ṣ"]={ "S","̣" },
+ ["ṣ"]={ "s","̣" },
+ ["Ṥ"]={ "Ś","̇" },
+ ["ṥ"]={ "ś","̇" },
+ ["Ṧ"]={ "Š","̇" },
+ ["ṧ"]={ "š","̇" },
+ ["Ṩ"]={ "Ṣ","̇" },
+ ["ṩ"]={ "ṣ","̇" },
+ ["Ṫ"]={ "T","̇" },
+ ["ṫ"]={ "t","̇" },
+ ["Ṭ"]={ "T","̣" },
+ ["ṭ"]={ "t","̣" },
+ ["Ṯ"]={ "T","̱" },
+ ["ṯ"]={ "t","̱" },
+ ["Ṱ"]={ "T","̭" },
+ ["ṱ"]={ "t","̭" },
+ ["Ṳ"]={ "U","̤" },
+ ["ṳ"]={ "u","̤" },
+ ["Ṵ"]={ "U","̰" },
+ ["ṵ"]={ "u","̰" },
+ ["Ṷ"]={ "U","̭" },
+ ["ṷ"]={ "u","̭" },
+ ["Ṹ"]={ "Ũ","́" },
+ ["ṹ"]={ "ũ","́" },
+ ["Ṻ"]={ "Ū","̈" },
+ ["ṻ"]={ "ū","̈" },
+ ["Ṽ"]={ "V","̃" },
+ ["ṽ"]={ "v","̃" },
+ ["Ṿ"]={ "V","̣" },
+ ["ṿ"]={ "v","̣" },
+ ["Ẁ"]={ "W","̀" },
+ ["ẁ"]={ "w","̀" },
+ ["Ẃ"]={ "W","́" },
+ ["ẃ"]={ "w","́" },
+ ["Ẅ"]={ "W","̈" },
+ ["ẅ"]={ "w","̈" },
+ ["Ẇ"]={ "W","̇" },
+ ["ẇ"]={ "w","̇" },
+ ["Ẉ"]={ "W","̣" },
+ ["ẉ"]={ "w","̣" },
+ ["Ẋ"]={ "X","̇" },
+ ["ẋ"]={ "x","̇" },
+ ["Ẍ"]={ "X","̈" },
+ ["ẍ"]={ "x","̈" },
+ ["Ẏ"]={ "Y","̇" },
+ ["ẏ"]={ "y","̇" },
+ ["Ẑ"]={ "Z","̂" },
+ ["ẑ"]={ "z","̂" },
+ ["Ẓ"]={ "Z","̣" },
+ ["ẓ"]={ "z","̣" },
+ ["Ẕ"]={ "Z","̱" },
+ ["ẕ"]={ "z","̱" },
+ ["ẖ"]={ "h","̱" },
+ ["ẗ"]={ "t","̈" },
+ ["ẘ"]={ "w","̊" },
+ ["ẙ"]={ "y","̊" },
+ ["ẛ"]={ "ſ","̇" },
+ ["Ạ"]={ "A","̣" },
+ ["ạ"]={ "a","̣" },
+ ["Ả"]={ "A","̉" },
+ ["ả"]={ "a","̉" },
+ ["Ấ"]={ "Â","́" },
+ ["ấ"]={ "â","́" },
+ ["Ầ"]={ "Â","̀" },
+ ["ầ"]={ "â","̀" },
+ ["Ẩ"]={ "Â","̉" },
+ ["ẩ"]={ "â","̉" },
+ ["Ẫ"]={ "Â","̃" },
+ ["ẫ"]={ "â","̃" },
+ ["Ậ"]={ "Ạ","̂" },
+ ["ậ"]={ "ạ","̂" },
+ ["Ắ"]={ "Ă","́" },
+ ["ắ"]={ "ă","́" },
+ ["Ằ"]={ "Ă","̀" },
+ ["ằ"]={ "ă","̀" },
+ ["Ẳ"]={ "Ă","̉" },
+ ["ẳ"]={ "ă","̉" },
+ ["Ẵ"]={ "Ă","̃" },
+ ["ẵ"]={ "ă","̃" },
+ ["Ặ"]={ "Ạ","̆" },
+ ["ặ"]={ "ạ","̆" },
+ ["Ẹ"]={ "E","̣" },
+ ["ẹ"]={ "e","̣" },
+ ["Ẻ"]={ "E","̉" },
+ ["ẻ"]={ "e","̉" },
+ ["Ẽ"]={ "E","̃" },
+ ["ẽ"]={ "e","̃" },
+ ["Ế"]={ "Ê","́" },
+ ["ế"]={ "ê","́" },
+ ["Ề"]={ "Ê","̀" },
+ ["ề"]={ "ê","̀" },
+ ["Ể"]={ "Ê","̉" },
+ ["ể"]={ "ê","̉" },
+ ["Ễ"]={ "Ê","̃" },
+ ["ễ"]={ "ê","̃" },
+ ["Ệ"]={ "Ẹ","̂" },
+ ["ệ"]={ "ẹ","̂" },
+ ["Ỉ"]={ "I","̉" },
+ ["ỉ"]={ "i","̉" },
+ ["Ị"]={ "I","̣" },
+ ["ị"]={ "i","̣" },
+ ["Ọ"]={ "O","̣" },
+ ["ọ"]={ "o","̣" },
+ ["Ỏ"]={ "O","̉" },
+ ["ỏ"]={ "o","̉" },
+ ["Ố"]={ "Ô","́" },
+ ["ố"]={ "ô","́" },
+ ["Ồ"]={ "Ô","̀" },
+ ["ồ"]={ "ô","̀" },
+ ["Ổ"]={ "Ô","̉" },
+ ["ổ"]={ "ô","̉" },
+ ["Ỗ"]={ "Ô","̃" },
+ ["ỗ"]={ "ô","̃" },
+ ["Ộ"]={ "Ọ","̂" },
+ ["ộ"]={ "ọ","̂" },
+ ["Ớ"]={ "Ơ","́" },
+ ["ớ"]={ "ơ","́" },
+ ["Ờ"]={ "Ơ","̀" },
+ ["ờ"]={ "ơ","̀" },
+ ["Ở"]={ "Ơ","̉" },
+ ["ở"]={ "ơ","̉" },
+ ["Ỡ"]={ "Ơ","̃" },
+ ["ỡ"]={ "ơ","̃" },
+ ["Ợ"]={ "Ơ","̣" },
+ ["ợ"]={ "ơ","̣" },
+ ["Ụ"]={ "U","̣" },
+ ["ụ"]={ "u","̣" },
+ ["Ủ"]={ "U","̉" },
+ ["ủ"]={ "u","̉" },
+ ["Ứ"]={ "Ư","́" },
+ ["ứ"]={ "ư","́" },
+ ["Ừ"]={ "Ư","̀" },
+ ["ừ"]={ "ư","̀" },
+ ["Ử"]={ "Ư","̉" },
+ ["ử"]={ "ư","̉" },
+ ["Ữ"]={ "Ư","̃" },
+ ["ữ"]={ "ư","̃" },
+ ["Ự"]={ "Ư","̣" },
+ ["ự"]={ "ư","̣" },
+ ["Ỳ"]={ "Y","̀" },
+ ["ỳ"]={ "y","̀" },
+ ["Ỵ"]={ "Y","̣" },
+ ["ỵ"]={ "y","̣" },
+ ["Ỷ"]={ "Y","̉" },
+ ["ỷ"]={ "y","̉" },
+ ["Ỹ"]={ "Y","̃" },
+ ["ỹ"]={ "y","̃" },
+ ["ἀ"]={ "α","̓" },
+ ["ἁ"]={ "α","̔" },
+ ["ἂ"]={ "ἀ","̀" },
+ ["ἃ"]={ "ἁ","̀" },
+ ["ἄ"]={ "ἀ","́" },
+ ["ἅ"]={ "ἁ","́" },
+ ["ἆ"]={ "ἀ","͂" },
+ ["ἇ"]={ "ἁ","͂" },
+ ["Ἀ"]={ "Α","̓" },
+ ["Ἁ"]={ "Α","̔" },
+ ["Ἂ"]={ "Ἀ","̀" },
+ ["Ἃ"]={ "Ἁ","̀" },
+ ["Ἄ"]={ "Ἀ","́" },
+ ["Ἅ"]={ "Ἁ","́" },
+ ["Ἆ"]={ "Ἀ","͂" },
+ ["Ἇ"]={ "Ἁ","͂" },
+ ["ἐ"]={ "ε","̓" },
+ ["ἑ"]={ "ε","̔" },
+ ["ἒ"]={ "ἐ","̀" },
+ ["ἓ"]={ "ἑ","̀" },
+ ["ἔ"]={ "ἐ","́" },
+ ["ἕ"]={ "ἑ","́" },
+ ["Ἐ"]={ "Ε","̓" },
+ ["Ἑ"]={ "Ε","̔" },
+ ["Ἒ"]={ "Ἐ","̀" },
+ ["Ἓ"]={ "Ἑ","̀" },
+ ["Ἔ"]={ "Ἐ","́" },
+ ["Ἕ"]={ "Ἑ","́" },
+ ["ἠ"]={ "η","̓" },
+ ["ἡ"]={ "η","̔" },
+ ["ἢ"]={ "ἠ","̀" },
+ ["ἣ"]={ "ἡ","̀" },
+ ["ἤ"]={ "ἠ","́" },
+ ["ἥ"]={ "ἡ","́" },
+ ["ἦ"]={ "ἠ","͂" },
+ ["ἧ"]={ "ἡ","͂" },
+ ["Ἠ"]={ "Η","̓" },
+ ["Ἡ"]={ "Η","̔" },
+ ["Ἢ"]={ "Ἠ","̀" },
+ ["Ἣ"]={ "Ἡ","̀" },
+ ["Ἤ"]={ "Ἠ","́" },
+ ["Ἥ"]={ "Ἡ","́" },
+ ["Ἦ"]={ "Ἠ","͂" },
+ ["Ἧ"]={ "Ἡ","͂" },
+ ["ἰ"]={ "ι","̓" },
+ ["ἱ"]={ "ι","̔" },
+ ["ἲ"]={ "ἰ","̀" },
+ ["ἳ"]={ "ἱ","̀" },
+ ["ἴ"]={ "ἰ","́" },
+ ["ἵ"]={ "ἱ","́" },
+ ["ἶ"]={ "ἰ","͂" },
+ ["ἷ"]={ "ἱ","͂" },
+ ["Ἰ"]={ "Ι","̓" },
+ ["Ἱ"]={ "Ι","̔" },
+ ["Ἲ"]={ "Ἰ","̀" },
+ ["Ἳ"]={ "Ἱ","̀" },
+ ["Ἴ"]={ "Ἰ","́" },
+ ["Ἵ"]={ "Ἱ","́" },
+ ["Ἶ"]={ "Ἰ","͂" },
+ ["Ἷ"]={ "Ἱ","͂" },
+ ["ὀ"]={ "ο","̓" },
+ ["ὁ"]={ "ο","̔" },
+ ["ὂ"]={ "ὀ","̀" },
+ ["ὃ"]={ "ὁ","̀" },
+ ["ὄ"]={ "ὀ","́" },
+ ["ὅ"]={ "ὁ","́" },
+ ["Ὀ"]={ "Ο","̓" },
+ ["Ὁ"]={ "Ο","̔" },
+ ["Ὂ"]={ "Ὀ","̀" },
+ ["Ὃ"]={ "Ὁ","̀" },
+ ["Ὄ"]={ "Ὀ","́" },
+ ["Ὅ"]={ "Ὁ","́" },
+ ["ὐ"]={ "υ","̓" },
+ ["ὑ"]={ "υ","̔" },
+ ["ὒ"]={ "ὐ","̀" },
+ ["ὓ"]={ "ὑ","̀" },
+ ["ὔ"]={ "ὐ","́" },
+ ["ὕ"]={ "ὑ","́" },
+ ["ὖ"]={ "ὐ","͂" },
+ ["ὗ"]={ "ὑ","͂" },
+ ["Ὑ"]={ "Υ","̔" },
+ ["Ὓ"]={ "Ὑ","̀" },
+ ["Ὕ"]={ "Ὑ","́" },
+ ["Ὗ"]={ "Ὑ","͂" },
+ ["ὠ"]={ "ω","̓" },
+ ["ὡ"]={ "ω","̔" },
+ ["ὢ"]={ "ὠ","̀" },
+ ["ὣ"]={ "ὡ","̀" },
+ ["ὤ"]={ "ὠ","́" },
+ ["ὥ"]={ "ὡ","́" },
+ ["ὦ"]={ "ὠ","͂" },
+ ["ὧ"]={ "ὡ","͂" },
+ ["Ὠ"]={ "Ω","̓" },
+ ["Ὡ"]={ "Ω","̔" },
+ ["Ὢ"]={ "Ὠ","̀" },
+ ["Ὣ"]={ "Ὡ","̀" },
+ ["Ὤ"]={ "Ὠ","́" },
+ ["Ὥ"]={ "Ὡ","́" },
+ ["Ὦ"]={ "Ὠ","͂" },
+ ["Ὧ"]={ "Ὡ","͂" },
+ ["ὰ"]={ "α","̀" },
+ ["ὲ"]={ "ε","̀" },
+ ["ὴ"]={ "η","̀" },
+ ["ὶ"]={ "ι","̀" },
+ ["ὸ"]={ "ο","̀" },
+ ["ὺ"]={ "υ","̀" },
+ ["ὼ"]={ "ω","̀" },
+ ["ᾀ"]={ "ἀ","ͅ" },
+ ["ᾁ"]={ "ἁ","ͅ" },
+ ["ᾂ"]={ "ἂ","ͅ" },
+ ["ᾃ"]={ "ἃ","ͅ" },
+ ["ᾄ"]={ "ἄ","ͅ" },
+ ["ᾅ"]={ "ἅ","ͅ" },
+ ["ᾆ"]={ "ἆ","ͅ" },
+ ["ᾇ"]={ "ἇ","ͅ" },
+ ["ᾈ"]={ "Ἀ","ͅ" },
+ ["ᾉ"]={ "Ἁ","ͅ" },
+ ["ᾊ"]={ "Ἂ","ͅ" },
+ ["ᾋ"]={ "Ἃ","ͅ" },
+ ["ᾌ"]={ "Ἄ","ͅ" },
+ ["ᾍ"]={ "Ἅ","ͅ" },
+ ["ᾎ"]={ "Ἆ","ͅ" },
+ ["ᾏ"]={ "Ἇ","ͅ" },
+ ["ᾐ"]={ "ἠ","ͅ" },
+ ["ᾑ"]={ "ἡ","ͅ" },
+ ["ᾒ"]={ "ἢ","ͅ" },
+ ["ᾓ"]={ "ἣ","ͅ" },
+ ["ᾔ"]={ "ἤ","ͅ" },
+ ["ᾕ"]={ "ἥ","ͅ" },
+ ["ᾖ"]={ "ἦ","ͅ" },
+ ["ᾗ"]={ "ἧ","ͅ" },
+ ["ᾘ"]={ "Ἠ","ͅ" },
+ ["ᾙ"]={ "Ἡ","ͅ" },
+ ["ᾚ"]={ "Ἢ","ͅ" },
+ ["ᾛ"]={ "Ἣ","ͅ" },
+ ["ᾜ"]={ "Ἤ","ͅ" },
+ ["ᾝ"]={ "Ἥ","ͅ" },
+ ["ᾞ"]={ "Ἦ","ͅ" },
+ ["ᾟ"]={ "Ἧ","ͅ" },
+ ["ᾠ"]={ "ὠ","ͅ" },
+ ["ᾡ"]={ "ὡ","ͅ" },
+ ["ᾢ"]={ "ὢ","ͅ" },
+ ["ᾣ"]={ "ὣ","ͅ" },
+ ["ᾤ"]={ "ὤ","ͅ" },
+ ["ᾥ"]={ "ὥ","ͅ" },
+ ["ᾦ"]={ "ὦ","ͅ" },
+ ["ᾧ"]={ "ὧ","ͅ" },
+ ["ᾨ"]={ "Ὠ","ͅ" },
+ ["ᾩ"]={ "Ὡ","ͅ" },
+ ["ᾪ"]={ "Ὢ","ͅ" },
+ ["ᾫ"]={ "Ὣ","ͅ" },
+ ["ᾬ"]={ "Ὤ","ͅ" },
+ ["ᾭ"]={ "Ὥ","ͅ" },
+ ["ᾮ"]={ "Ὦ","ͅ" },
+ ["ᾯ"]={ "Ὧ","ͅ" },
+ ["ᾰ"]={ "α","̆" },
+ ["ᾱ"]={ "α","̄" },
+ ["ᾲ"]={ "ὰ","ͅ" },
+ ["ᾳ"]={ "α","ͅ" },
+ ["ᾴ"]={ "ά","ͅ" },
+ ["ᾶ"]={ "α","͂" },
+ ["ᾷ"]={ "ᾶ","ͅ" },
+ ["Ᾰ"]={ "Α","̆" },
+ ["Ᾱ"]={ "Α","̄" },
+ ["Ὰ"]={ "Α","̀" },
+ ["ᾼ"]={ "Α","ͅ" },
+ ["῁"]={ "¨","͂" },
+ ["ῂ"]={ "ὴ","ͅ" },
+ ["ῃ"]={ "η","ͅ" },
+ ["ῄ"]={ "ή","ͅ" },
+ ["ῆ"]={ "η","͂" },
+ ["ῇ"]={ "ῆ","ͅ" },
+ ["Ὲ"]={ "Ε","̀" },
+ ["Ὴ"]={ "Η","̀" },
+ ["ῌ"]={ "Η","ͅ" },
+ ["῍"]={ "᾿","̀" },
+ ["῎"]={ "᾿","́" },
+ ["῏"]={ "᾿","͂" },
+ ["ῐ"]={ "ι","̆" },
+ ["ῑ"]={ "ι","̄" },
+ ["ῒ"]={ "ϊ","̀" },
+ ["ῖ"]={ "ι","͂" },
+ ["ῗ"]={ "ϊ","͂" },
+ ["Ῐ"]={ "Ι","̆" },
+ ["Ῑ"]={ "Ι","̄" },
+ ["Ὶ"]={ "Ι","̀" },
+ ["῝"]={ "῾","̀" },
+ ["῞"]={ "῾","́" },
+ ["῟"]={ "῾","͂" },
+ ["ῠ"]={ "υ","̆" },
+ ["ῡ"]={ "υ","̄" },
+ ["ῢ"]={ "ϋ","̀" },
+ ["ῤ"]={ "ρ","̓" },
+ ["ῥ"]={ "ρ","̔" },
+ ["ῦ"]={ "υ","͂" },
+ ["ῧ"]={ "ϋ","͂" },
+ ["Ῠ"]={ "Υ","̆" },
+ ["Ῡ"]={ "Υ","̄" },
+ ["Ὺ"]={ "Υ","̀" },
+ ["Ῥ"]={ "Ρ","̔" },
+ ["῭"]={ "¨","̀" },
+ ["ῲ"]={ "ὼ","ͅ" },
+ ["ῳ"]={ "ω","ͅ" },
+ ["ῴ"]={ "ώ","ͅ" },
+ ["ῶ"]={ "ω","͂" },
+ ["ῷ"]={ "ῶ","ͅ" },
+ ["Ὸ"]={ "Ο","̀" },
+ ["Ὼ"]={ "Ω","̀" },
+ ["ῼ"]={ "Ω","ͅ" },
+ ["↚"]={ "←","̸" },
+ ["↛"]={ "→","̸" },
+ ["↮"]={ "↔","̸" },
+ ["⇍"]={ "⇐","̸" },
+ ["⇎"]={ "⇔","̸" },
+ ["⇏"]={ "⇒","̸" },
+ ["∄"]={ "∃","̸" },
+ ["∉"]={ "∈","̸" },
+ ["∌"]={ "∋","̸" },
+ ["∤"]={ "∣","̸" },
+ ["∦"]={ "∥","̸" },
+ ["≁"]={ "∼","̸" },
+ ["≄"]={ "≃","̸" },
+ ["≇"]={ "≅","̸" },
+ ["≉"]={ "≈","̸" },
+ ["≠"]={ "=","̸" },
+ ["≢"]={ "≡","̸" },
+ ["≭"]={ "≍","̸" },
+ ["≮"]={ "<","̸" },
+ ["≯"]={ ">","̸" },
+ ["≰"]={ "≤","̸" },
+ ["≱"]={ "≥","̸" },
+ ["≴"]={ "≲","̸" },
+ ["≵"]={ "≳","̸" },
+ ["≸"]={ "≶","̸" },
+ ["≹"]={ "≷","̸" },
+ ["⊀"]={ "≺","̸" },
+ ["⊁"]={ "≻","̸" },
+ ["⊄"]={ "⊂","̸" },
+ ["⊅"]={ "⊃","̸" },
+ ["⊈"]={ "⊆","̸" },
+ ["⊉"]={ "⊇","̸" },
+ ["⊬"]={ "⊢","̸" },
+ ["⊭"]={ "⊨","̸" },
+ ["⊮"]={ "⊩","̸" },
+ ["⊯"]={ "⊫","̸" },
+ ["⋠"]={ "≼","̸" },
+ ["⋡"]={ "≽","̸" },
+ ["⋢"]={ "⊑","̸" },
+ ["⋣"]={ "⊒","̸" },
+ ["⋪"]={ "⊲","̸" },
+ ["⋫"]={ "⊳","̸" },
+ ["⋬"]={ "⊴","̸" },
+ ["⋭"]={ "⊵","̸" },
+ ["⫝̸"]={ "⫝","̸" },
+ ["が"]={ "か","゙" },
+ ["ぎ"]={ "き","゙" },
+ ["ぐ"]={ "く","゙" },
+ ["げ"]={ "け","゙" },
+ ["ご"]={ "こ","゙" },
+ ["ざ"]={ "さ","゙" },
+ ["じ"]={ "し","゙" },
+ ["ず"]={ "す","゙" },
+ ["ぜ"]={ "せ","゙" },
+ ["ぞ"]={ "そ","゙" },
+ ["だ"]={ "た","゙" },
+ ["ぢ"]={ "ち","゙" },
+ ["づ"]={ "つ","゙" },
+ ["で"]={ "て","゙" },
+ ["ど"]={ "と","゙" },
+ ["ば"]={ "は","゙" },
+ ["ぱ"]={ "は","゚" },
+ ["び"]={ "ひ","゙" },
+ ["ぴ"]={ "ひ","゚" },
+ ["ぶ"]={ "ふ","゙" },
+ ["ぷ"]={ "ふ","゚" },
+ ["べ"]={ "へ","゙" },
+ ["ぺ"]={ "へ","゚" },
+ ["ぼ"]={ "ほ","゙" },
+ ["ぽ"]={ "ほ","゚" },
+ ["ゔ"]={ "う","゙" },
+ ["ゞ"]={ "ゝ","゙" },
+ ["ガ"]={ "カ","゙" },
+ ["ギ"]={ "キ","゙" },
+ ["グ"]={ "ク","゙" },
+ ["ゲ"]={ "ケ","゙" },
+ ["ゴ"]={ "コ","゙" },
+ ["ザ"]={ "サ","゙" },
+ ["ジ"]={ "シ","゙" },
+ ["ズ"]={ "ス","゙" },
+ ["ゼ"]={ "セ","゙" },
+ ["ゾ"]={ "ソ","゙" },
+ ["ダ"]={ "タ","゙" },
+ ["ヂ"]={ "チ","゙" },
+ ["ヅ"]={ "ツ","゙" },
+ ["デ"]={ "テ","゙" },
+ ["ド"]={ "ト","゙" },
+ ["バ"]={ "ハ","゙" },
+ ["パ"]={ "ハ","゚" },
+ ["ビ"]={ "ヒ","゙" },
+ ["ピ"]={ "ヒ","゚" },
+ ["ブ"]={ "フ","゙" },
+ ["プ"]={ "フ","゚" },
+ ["ベ"]={ "ヘ","゙" },
+ ["ペ"]={ "ヘ","゚" },
+ ["ボ"]={ "ホ","゙" },
+ ["ポ"]={ "ホ","゚" },
+ ["ヴ"]={ "ウ","゙" },
+ ["ヷ"]={ "ワ","゙" },
+ ["ヸ"]={ "ヰ","゙" },
+ ["ヹ"]={ "ヱ","゙" },
+ ["ヺ"]={ "ヲ","゙" },
+ ["ヾ"]={ "ヽ","゙" },
+ ["יִ"]={ "י","ִ" },
+ ["ײַ"]={ "ײ","ַ" },
+ ["שׁ"]={ "ש","ׁ" },
+ ["שׂ"]={ "ש","ׂ" },
+ ["שּׁ"]={ "שּ","ׁ" },
+ ["שּׂ"]={ "שּ","ׂ" },
+ ["אַ"]={ "א","ַ" },
+ ["אָ"]={ "א","ָ" },
+ ["אּ"]={ "א","ּ" },
+ ["בּ"]={ "ב","ּ" },
+ ["גּ"]={ "ג","ּ" },
+ ["דּ"]={ "ד","ּ" },
+ ["הּ"]={ "ה","ּ" },
+ ["וּ"]={ "ו","ּ" },
+ ["זּ"]={ "ז","ּ" },
+ ["טּ"]={ "ט","ּ" },
+ ["יּ"]={ "י","ּ" },
+ ["ךּ"]={ "ך","ּ" },
+ ["כּ"]={ "כ","ּ" },
+ ["לּ"]={ "ל","ּ" },
+ ["מּ"]={ "מ","ּ" },
+ ["נּ"]={ "נ","ּ" },
+ ["סּ"]={ "ס","ּ" },
+ ["ףּ"]={ "ף","ּ" },
+ ["פּ"]={ "פ","ּ" },
+ ["צּ"]={ "צ","ּ" },
+ ["קּ"]={ "ק","ּ" },
+ ["רּ"]={ "ר","ּ" },
+ ["שּ"]={ "ש","ּ" },
+ ["תּ"]={ "ת","ּ" },
+ ["וֹ"]={ "ו","ֹ" },
+ ["בֿ"]={ "ב","ֿ" },
+ ["כֿ"]={ "כ","ֿ" },
+ ["פֿ"]={ "פ","ֿ" },
+ ["𑂚"]={ "𑂙","𑂺" },
+ ["𑂜"]={ "𑂛","𑂺" },
+ ["𑂫"]={ "𑂥","𑂺" },
+ ["𑄮"]={ "𑄱","𑄧" },
+ ["𑄯"]={ "𑄲","𑄧" },
+ ["𑍋"]={ "𑍇","𑌾" },
+ ["𑍌"]={ "𑍇","𑍗" },
+ ["𑒻"]={ "𑒹","𑒺" },
+ ["𑒼"]={ "𑒹","𑒰" },
+ ["𑒾"]={ "𑒹","𑒽" },
+ ["𑖺"]={ "𑖸","𑖯" },
+ ["𑖻"]={ "𑖹","𑖯" },
+ ["𝅗𝅥"]={ "𝅗","𝅥" },
+ ["𝅘𝅥"]={ "𝅘","𝅥" },
+ ["𝅘𝅥𝅮"]={ "𝅘𝅥","𝅮" },
+ ["𝅘𝅥𝅯"]={ "𝅘𝅥","𝅯" },
+ ["𝅘𝅥𝅰"]={ "𝅘𝅥","𝅰" },
+ ["𝅘𝅥𝅱"]={ "𝅘𝅥","𝅱" },
+ ["𝅘𝅥𝅲"]={ "𝅘𝅥","𝅲" },
+ ["𝆹𝅥"]={ "𝆹","𝅥" },
+ ["𝆺𝅥"]={ "𝆺","𝅥" },
+ ["𝆹𝅥𝅮"]={ "𝆹𝅥","𝅮" },
+ ["𝆺𝅥𝅮"]={ "𝆺𝅥","𝅮" },
+ ["𝆹𝅥𝅯"]={ "𝆹𝅥","𝅯" },
+ ["𝆺𝅥𝅯"]={ "𝆺𝅥","𝅯" },
+ },
+ },
+ },
+ ["name"]="collapse",
+ ["prepend"]=true,
+ ["type"]="ligature",
+}
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “fonts-lig”] ---
+
+
+do --- [luaotfload, fontloader-2020-05-01.lua scope for “fonts-gbn” d25472d54c4841db43a745764a63533e] ---
+
+if not modules then modules={} end modules ['luatex-fonts-gbn']={
+ version=1.001,
+ comment="companion to luatex-*.tex",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+if context then
+ os.exit()
+end
+local next=next
+local fonts=fonts
+local nodes=nodes
+local nuts=nodes.nuts
+local traverse_id=nuts.traverse_id
+local flush_node=nuts.flush_node
+local glyph_code=nodes.nodecodes.glyph
+local disc_code=nodes.nodecodes.disc
+local tonode=nuts.tonode
+local tonut=nuts.tonut
+local getfont=nuts.getfont
+local getchar=nuts.getchar
+local getid=nuts.getid
+local getboth=nuts.getboth
+local getprev=nuts.getprev
+local getnext=nuts.getnext
+local getdisc=nuts.getdisc
+local setchar=nuts.setchar
+local setlink=nuts.setlink
+local setprev=nuts.setprev
+local n_ligaturing=node.ligaturing
+local n_kerning=node.kerning
+local d_ligaturing=nuts.ligaturing
+local d_kerning=nuts.kerning
+local basemodepass=true
+local function l_warning() logs.report("fonts","don't call 'node.ligaturing' directly") l_warning=nil end
+local function k_warning() logs.report("fonts","don't call 'node.kerning' directly") k_warning=nil end
+function node.ligaturing(...)
+ if basemodepass and l_warning then
+ l_warning()
+ end
+ return n_ligaturing(...)
+end
+function node.kerning(...)
+ if basemodepass and k_warning then
+ k_warning()
+ end
+ return n_kerning(...)
+end
+function nuts.ligaturing(...)
+ if basemodepass and l_warning then
+ l_warning()
+ end
+ return d_ligaturing(...)
+end
+function nuts.kerning(...)
+ if basemodepass and k_warning then
+ k_warning()
+ end
+ return d_kerning(...)
+end
+function nodes.handlers.setbasemodepass(v)
+ basemodepass=v
+end
+local function nodepass(head,groupcode,size,packtype,direction)
+ local fontdata=fonts.hashes.identifiers
+ if fontdata then
+ local usedfonts={}
+ local basefonts={}
+ local prevfont=nil
+ local basefont=nil
+ local variants=nil
+ local redundant=nil
+ local nofused=0
+ for n in traverse_id(glyph_code,head) do
+ local font=getfont(n)
+ if font~=prevfont then
+ if basefont then
+ basefont[2]=getprev(n)
+ end
+ prevfont=font
+ local used=usedfonts[font]
+ if not used then
+ local tfmdata=fontdata[font]
+ if tfmdata then
+ local shared=tfmdata.shared
+ if shared then
+ local processors=shared.processes
+ if processors and #processors>0 then
+ usedfonts[font]=processors
+ nofused=nofused+1
+ elseif basemodepass then
+ basefont={ n,nil }
+ basefonts[#basefonts+1]=basefont
+ end
+ end
+ local resources=tfmdata.resources
+ variants=resources and resources.variants
+ variants=variants and next(variants) and variants or false
+ end
+ else
+ local tfmdata=fontdata[prevfont]
+ if tfmdata then
+ local resources=tfmdata.resources
+ variants=resources and resources.variants
+ variants=variants and next(variants) and variants or false
+ end
+ end
+ end
+ if variants then
+ local char=getchar(n)
+ if (char>=0xFE00 and char<=0xFE0F) or (char>=0xE0100 and char<=0xE01EF) then
+ local hash=variants[char]
+ if hash then
+ local p=getprev(n)
+ if p and getid(p)==glyph_code then
+ local variant=hash[getchar(p)]
+ if variant then
+ setchar(p,variant)
+ end
+ end
+ end
+ if not redundant then
+ redundant={ n }
+ else
+ redundant[#redundant+1]=n
+ end
+ end
+ end
+ end
+ local nofbasefonts=#basefonts
+ if redundant then
+ for i=1,#redundant do
+ local r=redundant[i]
+ local p,n=getboth(r)
+ if r==head then
+ head=n
+ setprev(n)
+ else
+ setlink(p,n)
+ end
+ if nofbasefonts>0 then
+ for i=1,nofbasefonts do
+ local bi=basefonts[i]
+ if r==bi[1] then
+ bi[1]=n
+ end
+ if r==bi[2] then
+ bi[2]=n
+ end
+ end
+ end
+ flush_node(r)
+ end
+ end
+ for d in traverse_id(disc_code,head) do
+ local _,_,r=getdisc(d)
+ if r then
+ for n in traverse_id(glyph_code,r) do
+ local font=getfont(n)
+ if font~=prevfont then
+ prevfont=font
+ local used=usedfonts[font]
+ if not used then
+ local tfmdata=fontdata[font]
+ if tfmdata then
+ local shared=tfmdata.shared
+ if shared then
+ local processors=shared.processes
+ if processors and #processors>0 then
+ usedfonts[font]=processors
+ nofused=nofused+1
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if next(usedfonts) then
+ for font,processors in next,usedfonts do
+ for i=1,#processors do
+ head=processors[i](head,font,0,direction,nofused) or head
+ end
+ end
+ end
+ if basemodepass and nofbasefonts>0 then
+ for i=1,nofbasefonts do
+ local range=basefonts[i]
+ local start=range[1]
+ local stop=range[2]
+ if start then
+ local front=head==start
+ local prev,next
+ if stop then
+ next=getnext(stop)
+ start,stop=d_ligaturing(start,stop)
+ start,stop=d_kerning(start,stop)
+ else
+ prev=getprev(start)
+ start=d_ligaturing(start)
+ start=d_kerning(start)
+ end
+ if prev then
+ setlink(prev,start)
+ end
+ if next then
+ setlink(stop,next)
+ end
+ if front and head~=start then
+ head=start
+ end
+ end
+ end
+ end
+ end
+ return head
+end
+local function basepass(head)
+ if basemodepass then
+ head=d_ligaturing(head)
+ head=d_kerning(head)
+ end
+ return head
+end
+local protectpass=node.direct.protect_glyphs
+local injectpass=nodes.injections.handler
+function nodes.handlers.nodepass(head,...)
+ if head then
+ return tonode(nodepass(tonut(head),...))
+ end
+end
+function nodes.handlers.basepass(head)
+ if head then
+ return tonode(basepass(tonut(head)))
+ end
+end
+function nodes.handlers.injectpass(head)
+ if head then
+ return tonode(injectpass(tonut(head)))
+ end
+end
+function nodes.handlers.protectpass(head)
+ if head then
+ protectpass(tonut(head))
+ return head
+ end
+end
+function nodes.simple_font_handler(head,groupcode,size,packtype,direction)
+ if head then
+ head=tonut(head)
+ head=nodepass(head,groupcode,size,packtype,direction)
+ head=injectpass(head)
+ if not basemodepass then
+ head=basepass(head)
+ end
+ protectpass(head)
+ head=tonode(head)
+ end
+ return head
+end
+
+end --- [luaotfload, fontloader-2020-05-01.lua scope for “fonts-gbn”] ---
+
+
+--- vim:ft=lua:sw=2:ts=8:et:tw=79
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-basics-gen.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-basics-gen.lua
index f52fec69676..3959ca02221 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-basics-gen.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-basics-gen.lua
@@ -189,7 +189,7 @@ local readables = { }
local usingjit = jit
if not caches.namespace or caches.namespace == "" or caches.namespace == "context" then
- caches.namespace = 'generic-dev'
+ caches.namespace = 'generic'
end
do
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-basics-nod.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-basics-nod.lua
index be82277bd49..0fb768cf83f 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-basics-nod.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-basics-nod.lua
@@ -96,7 +96,6 @@ nuts.tonut = tonut
nuts.getattr = direct.get_attribute
nuts.getboth = direct.getboth
nuts.getchar = direct.getchar
-nuts.getcomponents = direct.getcomponents
nuts.getdirection = direct.getdirection
nuts.getdisc = direct.getdisc
nuts.getreplace = direct.getreplace
@@ -137,7 +136,6 @@ nuts.isglyph = direct.is_glyph
nuts.copy = direct.copy
nuts.copy_list = direct.copy_list
nuts.copy_node = direct.copy
-nuts.delete = direct.delete
nuts.end_of_math = direct.end_of_math
nuts.flush = direct.flush
nuts.flush_list = direct.flush_list
@@ -196,9 +194,8 @@ local getnext = nuts.getnext
local setlink = nuts.setlink
local getfield = nuts.getfield
local setfield = nuts.setfield
-local getcomponents = nuts.getcomponents
-local setcomponents = nuts.setcomponents
-
+local getsubtype = nuts.getsubtype
+local isglyph = nuts.isglyph
local find_tail = nuts.tail
local flush_list = nuts.flush_list
local flush_node = nuts.flush_node
@@ -206,40 +203,72 @@ local traverse_id = nuts.traverse_id
local copy_node = nuts.copy_node
local glyph_code = nodes.nodecodes.glyph
+local ligature_code = nodes.glyphcodes.ligature
+
+do
-function nuts.copy_no_components(g,copyinjection)
- local components = getcomponents(g)
- if components then
- setcomponents(g)
- local n = copy_node(g)
- if copyinjection then
- copyinjection(n,g)
+ local get_components = node.direct.getcomponents
+ local set_components = node.direct.setcomponents
+
+ local function copy_no_components(g,copyinjection)
+ local components = get_components(g)
+ if components then
+ set_components(g)
+ local n = copy_node(g)
+ if copyinjection then
+ copyinjection(n,g)
+ end
+ set_components(g,components)
+ -- maybe also upgrade the subtype but we don't use it anyway
+ return n
+ else
+ local n = copy_node(g)
+ if copyinjection then
+ copyinjection(n,g)
+ end
+ return n
end
- setcomponents(g,components)
- -- maybe also upgrade the subtype but we don't use it anyway
- return n
- else
- local n = copy_node(g)
- if copyinjection then
- copyinjection(n,g)
+ end
+
+ local function copy_only_glyphs(current)
+ local head = nil
+ local previous = nil
+ for n in traverse_id(glyph_code,current) do
+ n = copy_node(n)
+ if head then
+ setlink(previous,n)
+ else
+ head = n
+ end
+ previous = n
end
- return n
+ return head
end
-end
-function nuts.copy_only_glyphs(current)
- local head = nil
- local previous = nil
- for n in traverse_id(glyph_code,current) do
- n = copy_node(n)
- if head then
- setlink(previous,n)
- else
- head = n
+ local function count_components(start,marks)
+ local char = isglyph(start)
+ if char then
+ if getsubtype(start) == ligature_code then
+ local n = 0
+ local components = get_components(start)
+ while components do
+ n = n + count_components(components,marks)
+ components = getnext(components)
+ end
+ return n
+ elseif not marks[char] then
+ return 1
+ end
end
- previous = n
+ return 0
end
- return head
+
+ nuts.set_components = set_components
+ nuts.get_components = get_components
+ nuts.copy_only_glyphs = copy_only_glyphs
+ nuts.copy_no_components = copy_no_components
+ nuts.count_components = count_components
+
end
nuts.uses_font = direct.uses_font
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-cff.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-cff.lua
index 5f79ba7a332..72b0a038f17 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-cff.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-cff.lua
@@ -184,6 +184,15 @@ local cffreaders = {
readulong,
}
+directives.register("fonts.streamreader",function()
+ cffreaders = {
+ readbyte,
+ readushort,
+ readuint,
+ readulong,
+ }
+end)
+
-- The header contains information about its own size.
local function readheader(f)
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-con.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-con.lua
index e42d20d4e1f..1bb63aa5192 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-con.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-con.lua
@@ -1139,6 +1139,7 @@ hashmethods.normal = function(list)
m = m + 1
t[m] = k .. '=' .. tostring(v)
end
+ sort(t)
s[n] = k .. '={' .. concat(t,",") .. "}"
else
s[n] = k .. '=' .. tostring(v)
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-dsp.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-dsp.lua
index 7777f9c6ad4..3058be37b9a 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-dsp.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-dsp.lua
@@ -3237,7 +3237,8 @@ function readers.sbix(f,fontdata,specification)
return b.ppem < a.ppem
end
end)
- local glyphs = { }
+ local glyphs = { }
+ local delayed = CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 or fonts.handlers.typethree
for i=1,nofstrikes do
local strike = strikes[i]
local strikeppem = strike.ppem
@@ -3254,13 +3255,28 @@ function readers.sbix(f,fontdata,specification)
local datasize = nextoffset - glyphoffset
if datasize > 0 then
setposition(f,strikeoffset + glyphoffset)
+ local x = readshort(f)
+ local y = readshort(f)
+ local tag = readtag(f) -- or just skip, we never needed it till now
+ local size = datasize - 8
+ local data = nil
+ local offset = nil
+ if delayed then
+ offset = getposition(f)
+ data = nil
+ else
+ data = readstring(f,size)
+ size = nil
+ end
shapes[i] = {
- x = readshort(f),
- y = readshort(f),
- tag = readtag(f), -- maybe for tracing
- data = readstring(f,datasize-8),
- ppem = strikeppem, -- not used, for tracing
- ppi = strikeppi, -- not used, for tracing
+ x = x,
+ y = y,
+ o = offset,
+ s = size,
+ data = data,
+ -- tag = tag, -- maybe for tracing
+ -- ppem = strikeppem, -- not used, for tracing
+ -- ppi = strikeppi, -- not used, for tracing
}
done = done + 1
if done == nofglyphs then
@@ -3462,32 +3478,48 @@ do
local default = { width = 0, height = 0 }
local glyphs = fontdata.glyphs
+ local delayed = CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 or fonts.handlers.typethree
for index, subtable in sortedhash(shapes) do
if type(subtable) == "table" then
local data = nil
+ local size = nil
local metrics = default
local format = subtable.format
local offset = subtable.offsets[index]
setposition(f,offset)
if format == 17 then
metrics = getsmallmetrics(f)
- data = readstring(f,readulong(f))
+ size = true
elseif format == 18 then
metrics = getbigmetrics(f)
- data = readstring(f,readulong(f))
+ size = true
elseif format == 19 then
metrics = subtable.metrics
- data = readstring(f,readulong(f))
+ size = true
else
-- forget about it
end
+ if size then
+ size = readulong(f)
+ if delayed then
+ offset = getposition(f)
+ data = nil
+ else
+ offset = nil
+ data = readstring(f,size)
+ size = nil
+ end
+ else
+ offset = nil
+ end
local x = metrics.width
local y = metrics.height
shapes[index] = {
- -- maybe some metrics
x = x,
y = y,
+ o = offset,
+ s = size,
data = data,
}
-- I'll look into this in more details when needed
@@ -3498,12 +3530,11 @@ do
local height = width * y/x
glyph.boundingbox = { 0, 0, width, height }
end
-
else
shapes[index] = {
x = 0,
y = 0,
- data = "",
+ data = "", -- or just nil
}
end
end
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-map.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-map.lua
index d931b822e55..84a28a8b7ed 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-map.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-map.lua
@@ -12,7 +12,7 @@ local match, format, find, concat, gsub, lower = string.match, string.format, st
local P, R, S, C, Ct, Cc, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Ct, lpeg.Cc, lpeg.match
local formatters = string.formatters
local sortedhash, sortedkeys = table.sortedhash, table.sortedkeys
-local rshift = bit32.rshift
+local idiv = number.idiv
local trace_loading = false trackers.register("fonts.loading", function(v) trace_loading = v end)
local trace_mapping = false trackers.register("fonts.mapping", function(v) trace_mapping = v end)
@@ -23,44 +23,23 @@ local report_fonts = logs.reporter("fonts","loading") -- not otf only
local force_ligatures = false directives.register("fonts.mapping.forceligatures",function(v) force_ligatures = v end)
-local fonts = fonts or { }
-local mappings = fonts.mappings or { }
-fonts.mappings = mappings
-
-local allocate = utilities.storage.allocate
-
---[[ldx--
-Eventually this code will disappear because map files are kind
-of obsolete. Some code may move to runtime or auxiliary modules.
-The name to unciode related code will stay of course.
---ldx]]--
-
--- local function loadlumtable(filename) -- will move to font goodies
--- local lumname = file.replacesuffix(file.basename(filename),"lum")
--- local lumfile = resolvers.findfile(lumname,"map") or ""
--- if lumfile ~= "" and lfs.isfile(lumfile) then
--- if trace_loading or trace_mapping then
--- report_fonts("loading map table %a",lumfile)
--- end
--- lumunic = dofile(lumfile)
--- return lumunic, lumfile
--- end
--- end
+local fonts = fonts or { }
+local mappings = fonts.mappings or { }
+fonts.mappings = mappings
-local hex = R("AF","af","09")
------ hexfour = (hex*hex*hex*hex) / function(s) return tonumber(s,16) end
------ hexsix = (hex*hex*hex*hex*hex*hex) / function(s) return tonumber(s,16) end
-local hexfour = (hex*hex*hex^-2) / function(s) return tonumber(s,16) end
-local hexsix = (hex*hex*hex^-4) / function(s) return tonumber(s,16) end
-local dec = (R("09")^1) / tonumber
-local period = P(".")
-local unicode = (P("uni") + P("UNI")) * (hexfour * (period + P(-1)) * Cc(false) + Ct(hexfour^1) * Cc(true)) -- base planes
-local ucode = (P("u") + P("U") ) * (hexsix * (period + P(-1)) * Cc(false) + Ct(hexsix ^1) * Cc(true)) -- extended
-local index = P("index") * dec * Cc(false)
+local allocate = utilities.storage.allocate
-local parser = unicode + ucode + index
+local hex = R("AF","af","09")
+local hexfour = (hex*hex*hex^-2) / function(s) return tonumber(s,16) end
+local hexsix = (hex*hex*hex^-4) / function(s) return tonumber(s,16) end
+local dec = (R("09")^1) / tonumber
+local period = P(".")
+local unicode = (P("uni") + P("UNI")) * (hexfour * (period + P(-1)) * Cc(false) + Ct(hexfour^1) * Cc(true)) -- base planes
+local ucode = (P("u") + P("U") ) * (hexsix * (period + P(-1)) * Cc(false) + Ct(hexsix ^1) * Cc(true)) -- extended
+local index = P("index") * dec * Cc(false)
-local parsers = { }
+local parser = unicode + ucode + index
+local parsers = { }
local function makenameparser(str)
if not str or str == "" then
@@ -75,82 +54,24 @@ local function makenameparser(str)
end
end
-local f_single = formatters["%04X"]
-local f_double = formatters["%04X%04X"]
-
--- floor(x/256) => rshift(x, 8)
--- floor(x/1024) => rshift(x,10)
-
--- 0.684 0.661 0,672 0.650 : cache at lua end (more mem)
--- 0.682 0,672 0.698 0.657 : no cache (moderate mem i.e. lua strings)
--- 0.644 0.647 0.655 0.645 : convert in c (less mem in theory)
-
--- local tounicodes = table.setmetatableindex(function(t,unicode)
--- local s
--- if unicode < 0xD7FF or (unicode > 0xDFFF and unicode <= 0xFFFF) then
--- s = f_single(unicode)
--- else
--- unicode = unicode - 0x10000
--- s = f_double(rshift(unicode,10)+0xD800,unicode%1024+0xDC00)
--- end
--- t[unicode] = s
--- return s
--- end)
---
--- local function tounicode16(unicode,name)
--- local s = tounicodes[unicode]
--- if s then
--- return s
--- else
--- report_fonts("can't convert %a in %a into tounicode",unicode,name)
--- end
--- end
---
--- local function tounicode16sequence(unicodes,name)
--- local t = { }
--- for l=1,#unicodes do
--- local u = unicodes[l]
--- local s = tounicodes[u]
--- if s then
--- t[l] = s
--- else
--- report_fonts ("can't convert %a in %a into tounicode",u,name)
--- return
--- end
--- end
--- return concat(t)
--- end
---
--- local function tounicode(unicode,name)
--- if type(unicode) == "table" then
--- local t = { }
--- for l=1,#unicode do
--- local u = unicode[l]
--- local s = tounicodes[u]
--- if s then
--- t[l] = s
--- else
--- report_fonts ("can't convert %a in %a into tounicode",u,name)
--- return
--- end
--- end
--- return concat(t)
--- else
--- local s = tounicodes[unicode]
--- if s then
--- return s
--- else
--- report_fonts("can't convert %a in %a into tounicode",unicode,name)
--- end
--- end
--- end
+local f_single = formatters["%04X"]
+local f_double = formatters["%04X%04X"]
+local s_unknown = "FFFD"
local function tounicode16(unicode)
if unicode < 0xD7FF or (unicode > 0xDFFF and unicode <= 0xFFFF) then
return f_single(unicode)
+ elseif unicode >= 0x00E000 and unicode <= 0x00F8FF then
+ return s_unknown
+ elseif unicode >= 0x0F0000 and unicode <= 0x0FFFFF then
+ return s_unknown
+ elseif unicode >= 0x100000 and unicode <= 0x10FFFF then
+ return s_unknown
+ elseif unicode >= 0x00D800 and unicode <= 0x00DFFF then
+ return s_unknown
else
unicode = unicode - 0x10000
- return f_double(rshift(unicode,10)+0xD800,unicode%1024+0xDC00)
+ return f_double(idiv(k,0x400)+0xD800,unicode%0x400+0xDC00)
end
end
@@ -160,132 +81,33 @@ local function tounicode16sequence(unicodes)
local u = unicodes[l]
if u < 0xD7FF or (u > 0xDFFF and u <= 0xFFFF) then
t[l] = f_single(u)
+ elseif unicode >= 0x00E000 and unicode <= 0x00F8FF then
+ t[l] = s_unknown
+ elseif unicode >= 0x0F0000 and unicode <= 0x0FFFFF then
+ t[l] = s_unknown
+ elseif unicode >= 0x100000 and unicode <= 0x10FFFF then
+ t[l] = s_unknown
+ -- elseif unicode >= 0x00D800 and unicode <= 0x00DFFF then
+ elseif unicode >= 0x00D7FF and unicode <= 0x00DFFF then
+ t[l] = s_unknown
else
u = u - 0x10000
- t[l] = f_double(rshift(u,10)+0xD800,u%1024+0xDC00)
+ t[l] = f_double(idiv(k,0x400)+0xD800,u%0x400+0xDC00)
end
end
return concat(t)
end
--- local function tounicode(unicode)
--- if type(unicode) == "table" then
--- local t = { }
--- for l=1,#unicode do
--- local u = unicode[l]
--- if u < 0xD7FF or (u > 0xDFFF and u <= 0xFFFF) then
--- t[l] = f_single(u)
--- else
--- u = u - 0x10000
--- t[l] = f_double(rshift(u,10)+0xD800,u%1024+0xDC00)
--- end
--- end
--- return concat(t)
--- else
--- if unicode < 0xD7FF or (unicode > 0xDFFF and unicode <= 0xFFFF) then
--- return f_single(unicode)
--- else
--- unicode = unicode - 0x10000
--- return f_double(rshift(unicode,10)+0xD800,unicode%1024+0xDC00)
--- end
--- end
--- end
-
-local unknown = f_single(0xFFFD)
-
--- local function tounicode(unicode)
--- if type(unicode) == "table" then
--- local t = { }
--- for l=1,#unicode do
--- t[l] = tounicode(unicode[l])
--- end
--- return concat(t)
--- elseif unicode >= 0x00E000 and unicode <= 0x00F8FF then
--- return unknown
--- elseif unicode >= 0x0F0000 and unicode <= 0x0FFFFF then
--- return unknown
--- elseif unicode >= 0x100000 and unicode <= 0x10FFFF then
--- return unknown
--- elseif unicode < 0xD7FF or (unicode > 0xDFFF and unicode <= 0xFFFF) then
--- return f_single(unicode)
--- else
--- unicode = unicode - 0x10000
--- return f_double(rshift(unicode,10)+0xD800,unicode%1024+0xDC00)
--- end
--- end
-
--- local hash = table.setmetatableindex(function(t,k)
--- local v
--- if k >= 0x00E000 and k <= 0x00F8FF then
--- v = unknown
--- elseif k >= 0x0F0000 and k <= 0x0FFFFF then
--- v = unknown
--- elseif k >= 0x100000 and k <= 0x10FFFF then
--- v = unknown
--- elseif k < 0xD7FF or (k > 0xDFFF and k <= 0xFFFF) then
--- v = f_single(k)
--- else
--- local k = k - 0x10000
--- v = f_double(rshift(k,10)+0xD800,k%1024+0xDC00)
--- end
--- t[k] = v
--- return v
--- end)
---
--- table.makeweak(hash)
---
--- local function tounicode(unicode)
--- if type(unicode) == "table" then
--- local t = { }
--- for l=1,#unicode do
--- t[l] = hash[unicode[l]]
--- end
--- return concat(t)
--- else
--- return hash[unicode]
--- end
--- end
local hash = { }
local conc = { }
--- table.makeweak(hash)
-
--- table.setmetatableindex(hash,function(t,k)
--- if type(k) == "table" then
--- local n = #k
--- for l=1,n do
--- conc[l] = hash[k[l]]
--- end
--- return concat(conc,"",1,n)
--- end
--- local v
--- if k >= 0x00E000 and k <= 0x00F8FF then
--- v = unknown
--- elseif k >= 0x0F0000 and k <= 0x0FFFFF then
--- v = unknown
--- elseif k >= 0x100000 and k <= 0x10FFFF then
--- v = unknown
--- elseif k < 0xD7FF or (k > 0xDFFF and k <= 0xFFFF) then
--- v = f_single(k)
--- else
--- local k = k - 0x10000
--- v = f_double(rshift(k,10)+0xD800,k%1024+0xDC00)
--- end
--- t[k] = v
--- return v
--- end)
---
--- local function tounicode(unicode)
--- return hash[unicode]
--- end
-
table.setmetatableindex(hash,function(t,k)
if k < 0xD7FF or (k > 0xDFFF and k <= 0xFFFF) then
v = f_single(k)
else
local k = k - 0x10000
- v = f_double(rshift(k,10)+0xD800,k%1024+0xDC00)
+ v = f_double(idiv(k,0x400)+0xD800,k%0x400+0xDC00)
end
t[k] = v
return v
@@ -299,11 +121,14 @@ local function tounicode(k)
end
return concat(conc,"",1,n)
elseif k >= 0x00E000 and k <= 0x00F8FF then
- return unknown
+ return s_unknown
elseif k >= 0x0F0000 and k <= 0x0FFFFF then
- return unknown
+ return s_unknown
elseif k >= 0x100000 and k <= 0x10FFFF then
- return unknown
+ return s_unknown
+ -- elseif k >= 0x00D800 and k <= 0x00DFFF then
+ elseif k >= 0x00D7FF and k <= 0x00DFFF then
+ return s_unknown
else
return hash[k]
end
@@ -314,7 +139,6 @@ local function fromunicode16(str)
return tonumber(str,16)
else
local l, r = match(str,"(....)(....)")
- -- return (tonumber(l,16))*0x400 + tonumber(r,16) - 0xDC00
return 0x10000 + (tonumber(l,16)-0xD800)*0x400 + tonumber(r,16) - 0xDC00
end
end
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ocl.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ocl.lua
index 77e1538f94d..1890e5ec54e 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ocl.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ocl.lua
@@ -49,6 +49,10 @@ if context then
else
+ -- Actually we don't need a generic branch at all because (according the the
+ -- internet) other macro packages rely on hb for emoji etc and never used this
+ -- feature of the font loader. So maybe I should just remove this from generic.
+
local tounicode = fonts.mappings.tounicode16
function otf.getactualtext(s)
@@ -401,7 +405,7 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) -- kind = png|svg
-- The down and right will change too (we can move that elsewhere). We have
-- a different treatment in lmtx but the next kind of works. These images are
-- a mess anyway as in svg the bbox can be messed up absent). A png image
- -- needs the x/y. I might normalize this once we moev to lmtx exlusively.
+ -- needs the x/y. I might normalize this once we move to lmtx exlusively.
character.commands = {
not unicode and actualb or { "pdf", "page", (getactualtext(unicode)) },
-- lmtx (when we deal with depth in vfimage, currently disabled):
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-osd.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-osd.lua
index b97ac9c6f57..87453d9e2d9 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-osd.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-osd.lua
@@ -113,6 +113,8 @@ local setprev = nuts.setprev
local setchar = nuts.setchar
local getprop = nuts.getprop
local setprop = nuts.setprop
+local getstate = nuts.getstate
+local setstate = nuts.setstate
local ischar = nuts.ischar
@@ -128,7 +130,6 @@ local unsetvalue = attributes.unsetvalue
local fontdata = fonts.hashes.identifiers
-local a_state = attributes.private('state')
local a_syllabe = attributes.private('syllabe')
local dotted_circle = 0x25CC
@@ -958,7 +959,7 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
current = start
else
current = getnext(n)
- setprop(start,a_state,s_rphf)
+ setstate(start,s_rphf)
end
end
@@ -993,9 +994,9 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
local nextcurrent = copy_node(current)
copyinjection(nextcurrent,current) -- KE: necessary? HH: probably not as positioning comes later and we rawget/set
setlink(tempcurrent,nextcurrent)
- setprop(tempcurrent,a_state,s_blwf)
+ setstate(tempcurrent,s_blwf)
tempcurrent = processcharacters(tempcurrent,font)
- setprop(tempcurrent,a_state,unsetvalue)
+ setstate(tempcurrent,unsetvalue)
if getchar(next) == getchar(tempcurrent) then
flush_list(tempcurrent)
if show_syntax_errors then
@@ -1021,7 +1022,7 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
-- find base consonant
local char = getchar(current)
if consonant[char] then
- setprop(current,a_state,s_half)
+ setstate(current,s_half)
if not firstcons then
firstcons = current
end
@@ -1030,10 +1031,10 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
base = current
elseif blwfcache[char] then
-- consonant has below-base form
- setprop(current,a_state,s_blwf)
+ setstate(current,s_blwf)
elseif pstfcache[char] then
-- consonant has post-base form
- setprop(current,a_state,s_pstf)
+ setstate(current,s_pstf)
else
base = current
end
@@ -1107,15 +1108,15 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
while current ~= stop do
local next = getnext(current)
if next ~= stop and halant[getchar(next)] and getchar(getnext(next)) == c_zwnj then
- setprop(current,a_state,unsetvalue)
+ setstate(current,unsetvalue)
end
current = next
end
- if base ~= stop and getprop(base,a_state) then -- a_state can also be init
+ if base ~= stop and getstate(base) then -- state can also be init
local next = getnext(base)
if halant[getchar(next)] and not (next ~= stop and getchar(getnext(next)) == c_zwj) then
- setprop(base,a_state,unsetvalue)
+ setstate(base,unsetvalue)
end
end
@@ -1261,7 +1262,7 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
end
bn = next
end
- if getprop(current,a_state) == s_rphf then
+ if getstate(current,s_rphf) then
-- position Reph (Ra + H) after post-base 'matra' (if any) since these
-- become marks on the 'matra', not on the base glyph
if b ~= current then
@@ -1357,7 +1358,7 @@ function handlers.devanagari_reorder_matras(head,start) -- no leak
local char = ischar(current,startfont)
local next = getnext(current)
if char and getprop(current,a_syllabe) == startattr then
- if halant[char] then -- a_state can also be init
+ if halant[char] then -- state can also be init
if next then
local char = ischar(next,startfont)
if char and zw_char[char] and getprop(next,a_syllabe) == startattr then
@@ -1373,7 +1374,7 @@ function handlers.devanagari_reorder_matras(head,start) -- no leak
-- setlink(current,start,next) -- maybe
start = startnext
break
- -- elseif consonant[char] and ( not getprop(current,a_state) or getprop(current,a_state) == s_init) then
+ -- elseif consonant[char] and (not getstate(current) or getstate(current,s_init) then
-- startnext = getnext(start)
-- head = remove_node(head,start)
-- if current == head then
@@ -1473,7 +1474,7 @@ function handlers.devanagari_reorder_reph(head,start)
while current do
local char = ischar(current,startfont)
if char and getprop(current,a_syllabe) == startattr then
- if consonant[char] and not getprop(current,a_state) == s_pref then
+ if consonant[char] and not getstate(current,s_pref) then
startnext = getnext(start)
head = remove_node(head,start)
setlink(current,start)
@@ -1504,7 +1505,7 @@ function handlers.devanagari_reorder_reph(head,start)
while current do
local char = ischar(current,startfont)
if char and getprop(current,a_syllabe) == startattr then
- if getprop(current,a_state) == s_pstf then -- post-base
+ if getstate(current,s_pstf) then -- post-base
startnext = getnext(start)
head = remove_node(head,start)
setlink(getprev(current),start)
@@ -1547,7 +1548,7 @@ function handlers.devanagari_reorder_reph(head,start)
while current do
local char = ischar(current,startfont)
if char and getprop(current,a_syllabe) == startattr then
- local state = getprop(current,a_state)
+ local state = getstate(current)
if before_subscript[rephbase] and (state == s_blwf or state == s_pstf) then
c = current
elseif after_subscript[rephbase] and (state == s_pstf) then
@@ -1628,7 +1629,7 @@ function handlers.devanagari_reorder_pre_base_reordering_consonants(head,start)
local char = ischar(current,startfont)
local next = getnext(current)
if char and getprop(current,a_syllabe) == startattr then
- if halant[char] then -- a_state can also be init
+ if halant[char] then -- state can also be init
if next then
local char = ischar(next,startfont)
if char and zw_char[char] and getprop(next,a_syllabe) == startattr then
@@ -1645,7 +1646,7 @@ function handlers.devanagari_reorder_pre_base_reordering_consonants(head,start)
reordered_pre_base_reordering_consonants[start] = true
start = startnext
return head, start, true
- -- elseif consonant[char] and ( not getprop(current,a_state) or getprop(current,a_state) == s_init) then
+ -- elseif consonant[char] and (not getstate(current) or getstate(current,s_init)) then
-- startnext = getnext(start)
-- head = remove_node(head,start)
-- if current == head then
@@ -1668,7 +1669,7 @@ function handlers.devanagari_reorder_pre_base_reordering_consonants(head,start)
local current = getprev(start)
while current and getprop(current,a_syllabe) == startattr do
local char = ischar(current)
- if ( not dependent_vowel[char] and not getprop(current,a_state) or getprop(current,a_state) == s_init) then
+ if (not dependent_vowel[char] and (not getstate(current) or getstate(current,s_init))) then
startnext = getnext(start)
head = remove_node(head,start)
if current == head then
@@ -1764,7 +1765,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
if afternext and zw_char[getchar(afternext)] then -- ZWJ and ZWNJ prevent creation of reph
current = afternext -- getnext(next)
elseif current == start then
- setprop(current,a_state,s_rphf)
+ setstate(current,s_rphf)
current = next
else
current = next
@@ -1784,9 +1785,9 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
if found then -- pre-base: pref Halant + Consonant
local next = getnext(current)
if found[getchar(next)] or contextchain(found, next) then
- if (not getprop(current,a_state) and not getprop(next,a_state)) then --KE: a_state can also be init...
- setprop(current,a_state,s_pref)
- setprop(next,a_state,s_pref)
+ if (not getstate(current) and not getstate(next)) then --KE: state can also be init...
+ setstate(current,s_pref)
+ setstate(next,s_pref)
current = next
end
end
@@ -1806,8 +1807,8 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
if found[getchar(next)] or contextchain(found, next) then
if next ~= stop and getchar(getnext(next)) == c_zwnj then -- zwnj prevent creation of half
current = next
- elseif (not getprop(current,a_state)) then --KE: a_state can also be init...
- setprop(current,a_state,s_half)
+ elseif (not getstate(current)) then --KE: state can also be init...
+ setstate(current,s_half)
if not halfpos then
halfpos = current
end
@@ -1828,9 +1829,9 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
if found then
local next = getnext(current)
if found[getchar(next)] or contextchain(found, next) then
- if (not getprop(current,a_state) and not getprop(next,a_state)) then --KE: a_state can also be init...
- setprop(current,a_state,s_blwf)
- setprop(next,a_state,s_blwf)
+ if (not getstate(current) and not getstate(next)) then --KE: state can also be init...
+ setstate(current,s_blwf)
+ setstate(next,s_blwf)
current = next
subpos = current
end
@@ -1849,9 +1850,9 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
if found then
local next = getnext(current)
if found[getchar(next)] or contextchain(found, next) then
- if (not getprop(current,a_state) and not getprop(next,a_state)) then --KE: a_state can also be init...
- setprop(current,a_state,s_pstf)
- setprop(next,a_state,s_pstf)
+ if (not getstate(current) and not getstate(next)) then -- KE: state can also be init...
+ setstate(current,s_pstf)
+ setstate(next,s_pstf)
current = next
postpos = current
end
@@ -1865,7 +1866,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
local current, base, firstcons = start, nil, nil
- if getprop(start,a_state) == s_rphf then
+ if getstate(start,s_rphf) then
-- if syllable starts with Ra + H and script has 'Reph' then exclude Reph from candidates for base consonants
current = getnext(getnext(start))
end
@@ -1895,13 +1896,13 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
local tmp = getnext(next)
local changestop = next == stop
setnext(next)
- setprop(current,a_state,s_pref)
+ setstate(current,s_pref)
current = processcharacters(current,font)
- setprop(current,a_state,s_blwf)
+ setstate(current,s_blwf)
current = processcharacters(current,font)
- setprop(current,a_state,s_pstf)
+ setstate(current,s_pstf)
current = processcharacters(current,font)
- setprop(current,a_state,unsetvalue)
+ setstate(current,unsetvalue)
if halant[getchar(current)] then
setnext(getnext(current),tmp)
if show_syntax_errors then
@@ -1927,7 +1928,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
firstcons = current
end
-- check whether consonant has below-base or post-base form or is pre-base reordering Ra
- local a = getprop(current,a_state)
+ local a = getstate(current)
if not (a == s_blwf or a == s_pstf or (a ~= s_rphf and a ~= s_blwf and ra[getchar(current)])) then
base = current
end
@@ -1941,13 +1942,13 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
end
if not base then
- if getprop(start,a_state) == s_rphf then
- setprop(start,a_state,unsetvalue)
+ if getstate(start,s_rphf) then
+ setstate(start,unsetvalue)
end
return head, stop, nbspaces
else
- if getprop(base,a_state) then -- a_state can also be init
- setprop(base,a_state,unsetvalue)
+ if getstate(base) then -- state can also be init
+ setstate(base,unsetvalue)
end
basepos = base
end
@@ -2004,7 +2005,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
local ppos = getprev(pos) -- necessary?
while ppos and getprop(ppos,a_syllabe) == getprop(pos,a_syllabe) do
- if getprop(ppos,a_state) == s_pref then
+ if getstate(ppos,s_pref) then
pos = ppos
end
ppos = getprev(ppos)
@@ -2086,7 +2087,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
while current ~= last do
local char = getchar(current)
local cn = getnext(current)
- if halant[char] and ra[ischar(cn)] and getprop(cn,a_state) ~= s_rphf and getprop(cn,a_state) ~= s_blwf then
+ if halant[char] and ra[ischar(cn)] and (not getstate(cn,s_rphf)) and (not getstate(cn,s_blwf)) then
if after_main[ischar(cn)] then
local prev = getprev(current)
local next = getnext(cn)
@@ -2730,8 +2731,8 @@ local function method_one(head,font,attr)
while current do
local char = ischar(current,font)
if char then
- if n == 0 and not getprop(current,a_state) then
- setprop(current,a_state,s_init)
+ if n == 0 and not getstate(current) then
+ setstate(current,s_init)
end
n = n + 1
else
@@ -2820,7 +2821,7 @@ local function method_two(head,font,attr)
end
if not syllableend and show_syntax_errors then
local char = ischar(current,font)
- if char and not getprop(current,a_state) then -- a_state can also be init
+ if char and not getstate(current) then -- state can also be init
local mark = mark_four[char]
if mark then
head, current = inject_syntax_error(head,current,char)
@@ -2840,8 +2841,8 @@ local function method_two(head,font,attr)
while current do
local char = ischar(current,font)
if char then
- if n == 0 and not getprop(current,a_state) then -- a_state can also be init
- setprop(current,a_state,s_init)
+ if n == 0 and not getstate(current) then -- state can also be init
+ setstate(current,s_init)
end
n = n + 1
else
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ota.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ota.lua
index 3d217b3f4d0..6cbf4bb86fe 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ota.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ota.lua
@@ -27,8 +27,6 @@ local methods = allocate()
analyzers.initializers = initializers
analyzers.methods = methods
-local a_state = attributes.private('state')
-
local nuts = nodes.nuts
local tonut = nuts.tonut
@@ -60,6 +58,26 @@ local registerotffeature = otffeatures.register
process features right.
--ldx]]--
+local setstate = nuts.setstate
+local getstate = nuts.getstate
+
+if not setstate or not getstate then
+ -- generic (might move to the nod lib)
+ setstate = function(n,v)
+ setprop(n,"state",v)
+ end
+ getstate = function(n,v)
+ local s = getprop(n,"state")
+ if v then
+ return s == v
+ else
+ return s
+ end
+ end
+ nuts.setstate = setstate
+ nuts.getstate = getstate
+end
+
-- never use these numbers directly
local s_init = 1 local s_rphf = 7
@@ -120,37 +138,37 @@ function analyzers.setstate(head,font)
current = tonut(current)
while current do
local char, id = ischar(current,font)
- if char and not getprop(current,a_state) then
+ if char and not getstate(current) then
done = true
local d = descriptions[char]
if d then
if d.class == "mark" then
done = true
- setprop(current,a_state,s_mark)
+ setstate(current,s_mark)
elseif useunicodemarks and categories[char] == "mn" then
done = true
- setprop(current,a_state,s_mark)
+ setstate(current,s_mark)
elseif n == 0 then
first, last, n = current, current, 1
- setprop(current,a_state,s_init)
+ setstate(current,s_init)
else
last, n = current, n+1
- setprop(current,a_state,s_medi)
+ setstate(current,s_medi)
end
else -- finish
if first and first == last then
- setprop(last,a_state,s_isol)
+ setstate(last,s_isol)
elseif last then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
end
first, last, n = nil, nil, 0
end
elseif char == false then
-- other font
if first and first == last then
- setprop(last,a_state,s_isol)
+ setstate(last,s_isol)
elseif last then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
end
first, last, n = nil, nil, 0
if id == math_code then
@@ -160,13 +178,13 @@ function analyzers.setstate(head,font)
-- always in the middle .. it doesn't make much sense to assign a property
-- here ... we might at some point decide to flag the components when present
-- but even then it's kind of bogus
- setprop(current,a_state,s_medi)
+ setstate(current,s_medi)
last = current
else -- finish
if first and first == last then
- setprop(last,a_state,s_isol)
+ setstate(last,s_isol)
elseif last then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
end
first, last, n = nil, nil, 0
if id == math_code then
@@ -176,9 +194,9 @@ function analyzers.setstate(head,font)
current = getnext(current)
end
if first and first == last then
- setprop(last,a_state,s_isol)
+ setstate(last,s_isol)
elseif last then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
end
return head, done
end
@@ -308,91 +326,91 @@ function methods.arab(head,font,attr)
current = tonut(current)
while current do
local char, id = ischar(current,font)
- if char and not getprop(current,a_state) then
+ if char and not getstate(current) then
done = true
local classifier = classifiers[char]
if not classifier then
if last then
if c_last == s_medi or c_last == s_fina then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
else
warning(last,"fina")
- setprop(last,a_state,s_error)
+ setstate(last,s_error)
end
first, last = nil, nil
elseif first then
if c_first == s_medi or c_first == s_fina then
- setprop(first,a_state,s_isol)
+ setstate(first,s_isol)
else
warning(first,"isol")
- setprop(first,a_state,s_error)
+ setstate(first,s_error)
end
first = nil
end
elseif classifier == s_mark then
- setprop(current,a_state,s_mark)
+ setstate(current,s_mark)
elseif classifier == s_isol then
if last then
if c_last == s_medi or c_last == s_fina then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
else
warning(last,"fina")
- setprop(last,a_state,s_error)
+ setstate(last,s_error)
end
first, last = nil, nil
elseif first then
if c_first == s_medi or c_first == s_fina then
- setprop(first,a_state,s_isol)
+ setstate(first,s_isol)
else
warning(first,"isol")
- setprop(first,a_state,s_error)
+ setstate(first,s_error)
end
first = nil
end
- setprop(current,a_state,s_isol)
+ setstate(current,s_isol)
elseif classifier == s_medi then
if first then
last = current
c_last = classifier
- setprop(current,a_state,s_medi)
+ setstate(current,s_medi)
else
- setprop(current,a_state,s_init)
+ setstate(current,s_init)
first = current
c_first = classifier
end
elseif classifier == s_fina then
if last then
- if getprop(last,a_state) ~= s_init then
- setprop(last,a_state,s_medi)
+ if getstate(last) ~= s_init then
+ setstate(last,s_medi)
end
- setprop(current,a_state,s_fina)
+ setstate(current,s_fina)
first, last = nil, nil
elseif first then
- -- if getprop(first,a_state) ~= s_init then
+ -- if getstate(first) ~= s_init then
-- -- needs checking
- -- setprop(first,a_state,s_medi)
+ -- setstate(first,s_medi)
-- end
- setprop(current,a_state,s_fina)
+ setstate(current,s_fina)
first = nil
else
- setprop(current,a_state,s_isol)
+ setstate(current,s_isol)
end
else -- classifier == s_rest
- setprop(current,a_state,s_rest)
+ setstate(current,s_rest)
if last then
if c_last == s_medi or c_last == s_fina then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
else
warning(last,"fina")
- setprop(last,a_state,s_error)
+ setstate(last,s_error)
end
first, last = nil, nil
elseif first then
if c_first == s_medi or c_first == s_fina then
- setprop(first,a_state,s_isol)
+ setstate(first,s_isol)
else
warning(first,"isol")
- setprop(first,a_state,s_error)
+ setstate(first,s_error)
end
first = nil
end
@@ -400,18 +418,18 @@ function methods.arab(head,font,attr)
else
if last then
if c_last == s_medi or c_last == s_fina then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
else
warning(last,"fina")
- setprop(last,a_state,s_error)
+ setstate(last,s_error)
end
first, last = nil, nil
elseif first then
if c_first == s_medi or c_first == s_fina then
- setprop(first,a_state,s_isol)
+ setstate(first,s_isol)
else
warning(first,"isol")
- setprop(first,a_state,s_error)
+ setstate(first,s_error)
end
first = nil
end
@@ -423,17 +441,17 @@ function methods.arab(head,font,attr)
end
if last then
if c_last == s_medi or c_last == s_fina then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
else
warning(last,"fina")
- setprop(last,a_state,s_error)
+ setstate(last,s_error)
end
elseif first then
if c_first == s_medi or c_first == s_fina then
- setprop(first,a_state,s_isol)
+ setstate(first,s_isol)
else
warning(first,"isol")
- setprop(first,a_state,s_error)
+ setstate(first,s_error)
end
end
return head, done
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otj.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otj.lua
index 2e7878d3dfd..bec52d813fb 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otj.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otj.lua
@@ -110,7 +110,7 @@ local properties = nodes.properties.data
local fontkern = nuts.pool and nuts.pool.fontkern -- context
local italickern = nuts.pool and nuts.pool.italickern -- context
-local useitalickerns = false
+local useitalickerns = false -- context only
directives.register("fonts.injections.useitalics", function(v)
if v then
@@ -119,7 +119,7 @@ directives.register("fonts.injections.useitalics", function(v)
useitalickerns = v
end)
-do if not fontkern then -- generic
+if not fontkern then -- generic
local thekern = nuts.new("kern",0) -- fontkern
local setkern = nuts.setkern
@@ -131,9 +131,9 @@ do if not fontkern then -- generic
return n
end
-end end
+end
-do if not italickern then -- generic
+if not italickern then -- generic
local thekern = nuts.new("kern",3) -- italiccorrection
local setkern = nuts.setkern
@@ -145,7 +145,7 @@ do if not italickern then -- generic
return n
end
-end end
+end
function injections.installnewkern() end -- obsolete
@@ -664,7 +664,15 @@ local function inject_kerns_only(head,where)
-- left|glyph|right
local leftkern = i.leftkern
if leftkern and leftkern ~= 0 then
- head = insert_node_before(head,current,fontkern(leftkern))
+ if prev and getid(prev) == glue_code then
+ if useitalickerns then
+ head = insert_node_before(head,current,italickern(leftkern))
+ else
+ setwidth(prev, getwidth(prev) + leftkern)
+ end
+ else
+ head = insert_node_before(head,current,fontkern(leftkern))
+ end
end
end
if prevdisc then
@@ -819,12 +827,26 @@ local function inject_positions_only(head,where)
if rightkern and leftkern == -rightkern then
setoffsets(current,leftkern,false)
rightkern = 0
+ elseif prev and getid(prev) == glue_code then
+ if useitalickerns then
+ head = insert_node_before(head,current,italickern(leftkern))
+ else
+ setwidth(prev, getwidth(prev) + leftkern)
+ end
else
head = insert_node_before(head,current,fontkern(leftkern))
end
end
if rightkern and rightkern ~= 0 then
- insert_node_after(head,current,fontkern(rightkern))
+ if next and getid(next) == glue_code then
+ if useitalickerns then
+ insert_node_after(head,current,italickern(rightkern))
+ else
+ setwidth(next, getwidth(next) + rightkern)
+ end
+ else
+ insert_node_after(head,current,fontkern(rightkern))
+ end
end
else
local i = p.emptyinjections
@@ -1270,12 +1292,26 @@ local function inject_everything(head,where)
if rightkern and leftkern == -rightkern then
setoffsets(current,leftkern,false)
rightkern = 0
+ elseif prev and getid(prev) == glue_code then
+ if useitalickerns then
+ head = insert_node_before(head,current,italickern(leftkern))
+ else
+ setwidth(prev, getwidth(prev) + leftkern)
+ end
else
head = insert_node_before(head,current,fontkern(leftkern))
end
end
if rightkern and rightkern ~= 0 then
- insert_node_after(head,current,fontkern(rightkern))
+ if next and getid(next) == glue_code then
+ if useitalickerns then
+ insert_node_after(head,current,italickern(rightkern))
+ else
+ setwidth(next, getwidth(next) + rightkern)
+ end
+ else
+ insert_node_after(head,current,fontkern(rightkern))
+ end
end
end
else
@@ -1518,7 +1554,7 @@ local function inject_everything(head,where)
end
--
if keepregisteredcounts then
- keepregisteredcounts = false
+ keepregisteredcounts = false
else
nofregisteredkerns = 0
nofregisteredpositions = 0
@@ -1707,16 +1743,18 @@ local function injectspaces(head)
if useitalickerns then
local new = rightkern * factor
if trace_spaces then
- report_spaces("%C [%p + %p]",nextchar,old,new)
+ report_spaces("[%p + %p] %C",old,new,nextchar)
end
insert_node_after(head,n,italickern(new))
else
local new = old + rightkern * factor
if trace_spaces then
- report_spaces("[%p -> %p] %C",nextchar,old,new)
+ report_spaces("[%p -> %p] %C",old,new,nextchar)
end
setwidth(n,new)
end
+ else
+ -- message
end
rightkern = false
end
@@ -1753,3 +1791,4 @@ function injections.handler(head,where)
return head
end
end
+
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otl.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otl.lua
index 5d3bd4230cb..aff4cc8c8d9 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otl.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otl.lua
@@ -52,7 +52,7 @@ local report_otf = logs.reporter("fonts","otf loading")
local fonts = fonts
local otf = fonts.handlers.otf
-otf.version = 3.110 -- beware: also sync font-mis.lua and in mtx-fonts
+otf.version = 3.111 -- beware: also sync font-mis.lua and in mtx-fonts
otf.cache = containers.define("fonts", "otl", otf.version, true)
otf.svgcache = containers.define("fonts", "svg", otf.version, true)
otf.pngcache = containers.define("fonts", "png", otf.version, true)
@@ -534,6 +534,9 @@ local converters = {
}
}
+-- We can get differences between daylight saving etc ... but it makes no sense to
+-- mess with trickery .. so be it when you use a different binary.
+
local function checkconversion(specification)
local filename = specification.filename
local converter = converters[lower(file.suffix(filename))]
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ots.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ots.lua
index c4f89c156be..3b6ea6a7269 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ots.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ots.lua
@@ -114,6 +114,14 @@ mechanisms. Both put some constraints on the code here.
--
-- Todo: just (0=l2r and 1=r2l) or maybe (r2l = true)
+-- Experiments with returning the data with the ischar are positive for lmtx but
+-- have a performance hit on mkiv because there we need to wrap ischardata (pending
+-- extensions to luatex which is unlikely to happen for such an experiment because
+-- we then can't remove it). Actually it might make generic slightly faster. Also,
+-- there are some corner cases where a data check comes before a char fetch and
+-- we're talking of millions of calls there. At some point I might make a version
+-- for lmtx that does it slightly different anyway.
+
local type, next, tonumber = type, next, tonumber
local random = math.random
local formatters = string.formatters
@@ -184,8 +192,7 @@ local setprev = nuts.setprev
local getboth = nuts.getboth
local setboth = nuts.setboth
local getid = nuts.getid
-local getprop = nuts.getprop
-local setprop = nuts.setprop
+local getstate = nuts.getstate
local getsubtype = nuts.getsubtype
local setsubtype = nuts.setsubtype
local getchar = nuts.getchar
@@ -194,15 +201,26 @@ local getdisc = nuts.getdisc
local setdisc = nuts.setdisc
local getreplace = nuts.getreplace
local setlink = nuts.setlink
-local getcomponents = nuts.getcomponents -- the original one, not yet node-aux
-local setcomponents = nuts.setcomponents -- the original one, not yet node-aux
local getwidth = nuts.getwidth
local getattr = nuts.getattr
local getglyphdata = nuts.getglyphdata
+---------------------------------------------------------------------------------------
+
+-- Beware: In ConTeXt components no longer are real components. We only keep track of
+-- their positions because some complex ligatures might need that. For the moment we
+-- use an x_ prefix because for now generic follows the other approach.
+
+local copy_no_components = nuts.copy_no_components
+local copy_only_glyphs = nuts.copy_only_glyphs
+local count_components = nuts.count_components
+local set_components = nuts.set_components
+local get_components = nuts.get_components
+
+---------------------------------------------------------------------------------------
+
local ischar = nuts.ischar
-local isglyph = nuts.isglyph
local usesfont = nuts.uses_font
local insert_node_after = nuts.insert_after
@@ -237,7 +255,6 @@ local localpar_code = nodecodes.localpar
local discretionarydisc_code = disccodes.discretionary
local ligatureglyph_code = glyphcodes.ligature
-local a_state = attributes.private('state')
local a_noligature = attributes.private("noligature")
local injections = nodes.injections
@@ -450,32 +467,6 @@ local function appenddisc(disc,list)
setdisc(disc,pre,post,replace)
end
--- start is a mark and we need to keep that one
-
-local copy_no_components = nuts.copy_no_components
-local copy_only_glyphs = nuts.copy_only_glyphs
-
-local set_components = setcomponents
-local take_components = getcomponents
-
-local function count_components(start,marks)
- local char = isglyph(start)
- if char then
- if getsubtype(start) == ligatureglyph_code then
- local i = 0
- local components = getcomponents(start)
- while components do
- i = i + count_components(components,marks)
- components = getnext(components)
- end
- return i
- elseif not marks[char] then
- return 1
- end
- end
- return 0
-end
-
local function markstoligature(head,start,stop,char)
if start == stop and getchar(start) == char then
return head, start
@@ -531,7 +522,7 @@ local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfou
setlink(prev,base,next)
if not discfound then
local deletemarks = not skiphash or hasmarks
- local components = start
+ local components = start -- not used
local baseindex = 0
local componentindex = 0
local head = base
@@ -542,19 +533,19 @@ local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfou
if not marks[char] then
baseindex = baseindex + componentindex
componentindex = count_components(start,marks)
- -- we can be more clever here: "not deletemarks or (skiphash and not skiphash[char])"
- -- and such:
+ -- we can be more clever here: "not deletemarks or (skiphash and not skiphash[char])"
+ -- and such:
elseif not deletemarks then
-- we can get a loop when the font expects otherwise (i.e. unexpected deletemarks)
setligaindex(start,baseindex + getligaindex(start,componentindex))
if trace_marks then
- logwarning("%s: keep mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start))
+ logwarning("%s: keep ligature mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start))
end
local n = copy_node(start)
copyinjection(n,start) -- is this ok ? we position later anyway
head, current = insert_node_after(head,current,n) -- unlikely that mark has components
elseif trace_marks then
- logwarning("%s: delete mark %s",pref(dataset,sequence),gref(char))
+ logwarning("%s: delete ligature mark %s",pref(dataset,sequence),gref(char))
end
start = getnext(start)
end
@@ -567,7 +558,7 @@ local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfou
if marks[char] then
setligaindex(start,baseindex + getligaindex(start,componentindex))
if trace_marks then
- logwarning("%s: set mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start))
+ logwarning("%s: set ligature mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start))
end
start = getnext(start)
else
@@ -586,18 +577,19 @@ local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfou
-- anyway
local pre, post, replace, pretail, posttail, replacetail = getdisc(discfound,true)
if not replace then
+ -- looks like we never come here as it's not okay
local prev = getprev(base)
- local comp = take_components(base)
+ -- local comp = get_components(base) -- already set
local copied = copy_only_glyphs(comp)
if pre then
setlink(discprev,pre)
else
setnext(discprev) -- also blocks funny assignments
end
- pre = comp
+ pre = comp -- is start
if post then
setlink(posttail,discnext)
- setprev(post)
+ setprev(post) -- nil anyway
else
post = discnext
setprev(discnext) -- also blocks funny assignments
@@ -3179,7 +3171,7 @@ local function testrun(disc,t_run,c_run,...)
end
local pre, post, replace, pretail, posttail, replacetail = getdisc(disc,true)
local renewed = false
- if (post or replace) then -- and prev then -- hm, we can start with a disc
+ if post or replace then -- and prev then -- hm, we can start with a disc
if post then
setlink(posttail,next)
else
@@ -3287,28 +3279,6 @@ local function testrun(disc,t_run,c_run,...)
return getnext(disc), renewed
end
--- We can make some assumptions with respect to discretionaries. First of all it is very
--- unlikely that some of the analysis related attributes applies. Then we can also assume
--- that the ConTeXt specific dynamic attribute is different, although we do use explicit
--- discretionaries (maybe we need to tag those some day). So, at least for now, we don't
--- have the following test in the sub runs:
---
--- -- local a = getglyhpdata(start)
--- -- if a then
--- -- a = (a == attr) and (not attribute or getprop(start,a_state) == attribute)
--- -- else
--- -- a = not attribute or getprop(start,a_state) == attribute
--- -- end
--- -- if a then
---
--- but use this instead:
---
--- -- local a = getglyphdata(start)
--- -- if not a or (a == attr) then
---
--- and even that one is probably not needed. However, we can handle interesting
--- cases now:
---
-- 1{2{\oldstyle\discretionary{3}{4}{5}}6}7\par
-- 1{2\discretionary{3{\oldstyle3}}{{\oldstyle4}4}{5{\oldstyle5}5}6}7\par
@@ -3317,6 +3287,7 @@ local nesting = 0
local function c_run_single(head,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler)
local done = false
local sweep = sweephead[head]
+ local start
if sweep then
start = sweep
-- sweephead[head] = nil
@@ -3420,7 +3391,7 @@ local function t_run_single(start,stop,font,attr,lookupcache)
ss = nil
end
end
-lookupmatch = lg
+ lookupmatch = lg
else
break
end
@@ -3431,14 +3402,14 @@ lookupmatch = lg
if l and l.ligature then -- so we test for ligature
lastd = d
end
--- why not: if not l then break elseif l.ligature then return d end
+ -- why not: if not l then break elseif l.ligature then return d end
else
--- why not: break
+ -- why not: break
-- no match (yet)
end
else
-- go on can be a mixed one
--- why not: break
+ -- why not: break
end
if lastd then
return lastd
@@ -3461,7 +3432,7 @@ local function k_run_single(sub,injection,last,font,attr,lookupcache,step,datase
if n == last then
break
end
- local char = ischar(n)
+ local char = ischar(n,font)
if char then
local lookupmatch = lookupcache[char]
if lookupmatch then
@@ -3478,6 +3449,7 @@ end
local function c_run_multiple(head,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler)
local done = false
local sweep = sweephead[head]
+ local start
if sweep then
start = sweep
-- sweephead[head] = nil
@@ -3590,7 +3562,7 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
ss = nil
end
end
-lookupmatch = lg
+ lookupmatch = lg
else
break
end
@@ -3711,26 +3683,6 @@ otf.helpers.pardirstate = pardirstate
do
- -- reference:
- --
- -- local a = attr and getglyphdata(start)
- -- if a then
- -- a = (a == attr) and (not attribute or getprop(start,a_state) == attribute)
- -- else
- -- a = not attribute or getprop(start,a_state) == attribute
- -- end
- --
- -- used:
- --
- -- local a -- happens often so no assignment is faster
- -- if attr then
- -- if getglyphdata(start) == attr and (not attribute or getprop(start,a_state) == attribute) then
- -- a = true
- -- end
- -- elseif not attribute or getprop(start,a_state) == attribute then
- -- a = true
- -- end
-
-- This is a measurable experimental speedup (only with hyphenated text and multiple
-- fonts per processor call), especially for fonts with lots of contextual lookups.
@@ -3911,10 +3863,10 @@ do
if lookupmatch then
local a -- happens often so no assignment is faster
if attr then
- if getglyphdata(start) == attr and (not attribute or getprop(start,a_state) == attribute) then
+ if getglyphdata(start) == attr and (not attribute or getstate(start,attribute)) then
a = true
end
- elseif not attribute or getprop(start,a_state) == attribute then
+ elseif not attribute or getstate(start,attribute) then
a = true
end
if a then
@@ -3978,10 +3930,10 @@ do
if m then
local a -- happens often so no assignment is faster
if attr then
- if getglyphdata(start) == attr and (not attribute or getprop(start,a_state) == attribute) then
+ if getglyphdata(start) == attr and (not attribute or getstate(start,attribute)) then
a = true
end
- elseif not attribute or getprop(start,a_state) == attribute then
+ elseif not attribute or getstate(start,attribute) then
a = true
end
if a then
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-oup.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-oup.lua
index 0e7e25808ca..2c49bc993f9 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-oup.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-oup.lua
@@ -1368,65 +1368,6 @@ function readers.pack(data)
end
end
- -- -- This was an experiment to see if we can bypass the luajit limits but loading is
- -- -- still an issue due to other limits so we don't use this ... actually it can
- -- -- prevent a luajittex crash but i don't care too much about that as we can't use
- -- -- that engine anyway then.
- --
- -- local function check(t)
- -- if type(t) == "table" then
- -- local s = sortedkeys(t)
- -- local n = #s
- -- if n <= 10 then
- -- return
- -- end
- -- local ranges = { }
- -- local first, last
- -- for i=1,#s do
- -- local ti = s[i]
- -- if not first then
- -- first = ti
- -- last = ti
- -- elseif ti == last + 1 then
- -- last = ti
- -- elseif last - first < 10 then
- -- -- we could permits a few exceptions
- -- return
- -- else
- -- ranges[#ranges+1] = { first, last }
- -- first, last = nil, nil
- -- end
- -- end
- -- if #ranges > 0 then
- -- return {
- -- ranges = ranges
- -- }
- -- end
- -- end
- -- end
- --
- -- local function pack_boolean(v)
- -- local tag
- -- local r = check(v)
- -- if r then
- -- v = r
- -- tag = tabstr_normal(v)
- -- else
- -- tag = tabstr_boolean(v)
- -- end
- -- local ht = h[tag]
- -- if ht then
- -- c[ht] = c[ht] + 1
- -- return ht
- -- else
- -- nt = nt + 1
- -- t[nt] = v
- -- h[tag] = nt
- -- c[nt] = 1
- -- return nt
- -- end
- -- end
-
local function pack_final(v)
-- v == number
if c[v] <= criterium then
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-table.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-table.lua
index 98b377bdc1c..c20bd4733c4 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-table.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-table.lua
@@ -525,84 +525,15 @@ function table.fromhash(t)
return hsh
end
-local noquotes, hexify, handle, compact, inline, functions, metacheck
+local noquotes, hexify, handle, compact, inline, functions, metacheck, accurate
local reserved = table.tohash { -- intercept a language inconvenience: no reserved words as key
'and', 'break', 'do', 'else', 'elseif', 'end', 'false', 'for', 'function', 'if',
'in', 'local', 'nil', 'not', 'or', 'repeat', 'return', 'then', 'true', 'until', 'while',
- 'NaN', 'goto',
+ 'NaN', 'goto', 'const',
}
--- local function is_simple_table(t)
--- if #t > 0 then
--- local n = 0
--- for _,v in next, t do
--- n = n + 1
--- end
--- if n == #t then
--- local tt, nt = { }, 0
--- for i=1,#t do
--- local v = t[i]
--- local tv = type(v)
--- if tv == "number" then
--- nt = nt + 1
--- if hexify then
--- tt[nt] = format("0x%X",v)
--- else
--- tt[nt] = tostring(v) -- tostring not needed
--- end
--- elseif tv == "string" then
--- nt = nt + 1
--- tt[nt] = format("%q",v)
--- elseif tv == "boolean" then
--- nt = nt + 1
--- tt[nt] = v and "true" or "false"
--- else
--- return nil
--- end
--- end
--- return tt
--- end
--- end
--- return nil
--- end
-
--- local function is_simple_table(t)
--- local nt = #t
--- if nt > 0 then
--- local n = 0
--- for _,v in next, t do
--- n = n + 1
--- -- if type(v) == "table" then
--- -- return nil
--- -- end
--- end
--- if n == nt then
--- local tt = { }
--- for i=1,nt do
--- local v = t[i]
--- local tv = type(v)
--- if tv == "number" then
--- if hexify then
--- tt[i] = format("0x%X",v)
--- else
--- tt[i] = tostring(v) -- tostring not needed
--- end
--- elseif tv == "string" then
--- tt[i] = format("%q",v)
--- elseif tv == "boolean" then
--- tt[i] = v and "true" or "false"
--- else
--- return nil
--- end
--- end
--- return tt
--- end
--- end
--- return nil
--- end
-
-local function is_simple_table(t,hexify) -- also used in util-tab so maybe public
+local function is_simple_table(t,hexify,accurate) -- also used in util-tab so maybe public
local nt = #t
if nt > 0 then
local n = 0
@@ -623,6 +554,8 @@ local function is_simple_table(t,hexify) -- also used in util-tab so maybe publi
-- tt[i] = v -- not needed tostring(v)
if hexify then
tt[i] = format("0x%X",v)
+ elseif accurate then
+ tt[i] = format("%q",v)
else
tt[i] = v -- not needed tostring(v)
end
@@ -644,6 +577,8 @@ local function is_simple_table(t,hexify) -- also used in util-tab so maybe publi
-- tt[i+1] = v -- not needed tostring(v)
if hexify then
tt[i+1] = format("0x%X",v)
+ elseif accurate then
+ tt[i+1] = format("%q",v)
else
tt[i+1] = v -- not needed tostring(v)
end
@@ -738,6 +673,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tv == "number" then
if hexify then
handle(format("%s 0x%X,",depth,v))
+ elseif accurate then
+ handle(format("%s %q,",depth,v))
else
handle(format("%s %s,",depth,v)) -- %.99g
end
@@ -747,7 +684,7 @@ local function do_serialize(root,name,depth,level,indexed)
if next(v) == nil then
handle(format("%s {},",depth))
elseif inline then -- and #t > 0
- local st = is_simple_table(v,hexify)
+ local st = is_simple_table(v,hexify,accurate)
if st then
handle(format("%s { %s },",depth,concat(st,", ")))
else
@@ -775,12 +712,16 @@ local function do_serialize(root,name,depth,level,indexed)
if tk == "number" then
if hexify then
handle(format("%s [0x%X]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v)) -- %.99g
end
elseif tk == "boolean" then
if hexify then
handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v)) -- %.99g
end
@@ -789,12 +730,16 @@ local function do_serialize(root,name,depth,level,indexed)
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
handle(format("%s %s=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s %s=%q,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v)) -- %.99g
end
else
if hexify then
handle(format("%s [%q]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v)) -- %.99g
end
@@ -803,6 +748,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk == "number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -820,6 +767,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk == "number" then
if hexify then
handle(format("%s [0x%X]={},",depth,k))
+ elseif accurate then
+ handle(format("%s [%q]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -833,11 +782,13 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s [%q]={},",depth,k))
end
elseif inline then
- local st = is_simple_table(v,hexify)
+ local st = is_simple_table(v,hexify,accurate)
if st then
if tk == "number" then
if hexify then
handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
+ elseif accurate then
+ handle(format("%s [%q]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -860,6 +811,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk == "number" then
if hexify then
handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
+ elseif accurate then
+ handle(format("%s [%q]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -881,6 +834,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk == "number" then
if hexify then
handle(format("%s [0x%X]=load(%q),",depth,k,f))
+ elseif accurate then
+ handle(format("%s [%q]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -899,6 +854,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk == "number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -927,6 +884,7 @@ local function serialize(_handle,root,name,specification) -- handle wins
if type(specification) == "table" then
noquotes = specification.noquotes
hexify = specification.hexify
+ accurate = specification.accurate
handle = _handle or specification.handle or print
functions = specification.functions
compact = specification.compact
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua
index ce2794cf366..32f25b931ed 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua
@@ -1,6 +1,6 @@
-- merged file : c:/data/develop/context/sources/luatex-fonts-merged.lua
-- parent file : c:/data/develop/context/sources/luatex-fonts.lua
--- merge date : 01/26/20 18:34:44
+-- merge date : 2020-04-30 11:10
do -- begin closure to overcome local limits and interference
@@ -1383,13 +1383,13 @@ function table.fromhash(t)
end
return hsh
end
-local noquotes,hexify,handle,compact,inline,functions,metacheck
+local noquotes,hexify,handle,compact,inline,functions,metacheck,accurate
local reserved=table.tohash {
'and','break','do','else','elseif','end','false','for','function','if',
'in','local','nil','not','or','repeat','return','then','true','until','while',
- 'NaN','goto',
+ 'NaN','goto','const',
}
-local function is_simple_table(t,hexify)
+local function is_simple_table(t,hexify,accurate)
local nt=#t
if nt>0 then
local n=0
@@ -1408,6 +1408,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i]=format("0x%X",v)
+ elseif accurate then
+ tt[i]=format("%q",v)
else
tt[i]=v
end
@@ -1428,6 +1430,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i+1]=format("0x%X",v)
+ elseif accurate then
+ tt[i+1]=format("%q",v)
else
tt[i+1]=v
end
@@ -1499,6 +1503,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tv=="number" then
if hexify then
handle(format("%s 0x%X,",depth,v))
+ elseif accurate then
+ handle(format("%s %q,",depth,v))
else
handle(format("%s %s,",depth,v))
end
@@ -1508,7 +1514,7 @@ local function do_serialize(root,name,depth,level,indexed)
if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
handle(format("%s { %s },",depth,concat(st,", ")))
else
@@ -1536,12 +1542,16 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
elseif tk=="boolean" then
if hexify then
handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v))
end
@@ -1549,12 +1559,16 @@ local function do_serialize(root,name,depth,level,indexed)
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
handle(format("%s %s=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s %s=%q,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v))
end
else
if hexify then
handle(format("%s [%q]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
@@ -1563,6 +1577,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -1579,6 +1595,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={},",depth,k))
+ elseif accurate then
+ handle(format("%s [%q]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -1591,11 +1609,13 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s [%q]={},",depth,k))
end
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
+ elseif accurate then
+ handle(format("%s [%q]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -1617,6 +1637,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
+ elseif accurate then
+ handle(format("%s [%q]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -1636,6 +1658,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=load(%q),",depth,k,f))
+ elseif accurate then
+ handle(format("%s [%q]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -1653,6 +1677,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -1676,6 +1702,7 @@ local function serialize(_handle,root,name,specification)
if type(specification)=="table" then
noquotes=specification.noquotes
hexify=specification.hexify
+ accurate=specification.accurate
handle=_handle or specification.handle or print
functions=specification.functions
compact=specification.compact
@@ -3493,9 +3520,12 @@ local format_left=function(f)
return format("a%s..utfpadding(a%s,%i)",n,n,-f)
end
end
-local format_q=function()
+local format_q=JITSUPPORTED and function()
n=n+1
return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n)
+end or function()
+ n=n+1
+ return format("(a%s ~= nil and format('%%q',a%s) or '')",n,n)
end
local format_Q=function()
n=n+1
@@ -4893,7 +4923,6 @@ nuts.tonut=tonut
nuts.getattr=direct.get_attribute
nuts.getboth=direct.getboth
nuts.getchar=direct.getchar
-nuts.getcomponents=direct.getcomponents
nuts.getdirection=direct.getdirection
nuts.getdisc=direct.getdisc
nuts.getreplace=direct.getreplace
@@ -4931,7 +4960,6 @@ nuts.isglyph=direct.is_glyph
nuts.copy=direct.copy
nuts.copy_list=direct.copy_list
nuts.copy_node=direct.copy
-nuts.delete=direct.delete
nuts.end_of_math=direct.end_of_math
nuts.flush=direct.flush
nuts.flush_list=direct.flush_list
@@ -4979,45 +5007,72 @@ local getnext=nuts.getnext
local setlink=nuts.setlink
local getfield=nuts.getfield
local setfield=nuts.setfield
-local getcomponents=nuts.getcomponents
-local setcomponents=nuts.setcomponents
+local getsubtype=nuts.getsubtype
+local isglyph=nuts.isglyph
local find_tail=nuts.tail
local flush_list=nuts.flush_list
local flush_node=nuts.flush_node
local traverse_id=nuts.traverse_id
local copy_node=nuts.copy_node
local glyph_code=nodes.nodecodes.glyph
-function nuts.copy_no_components(g,copyinjection)
- local components=getcomponents(g)
- if components then
- setcomponents(g)
- local n=copy_node(g)
- if copyinjection then
- copyinjection(n,g)
- end
- setcomponents(g,components)
- return n
- else
- local n=copy_node(g)
- if copyinjection then
- copyinjection(n,g)
+local ligature_code=nodes.glyphcodes.ligature
+do
+ local get_components=node.direct.getcomponents
+ local set_components=node.direct.setcomponents
+ local function copy_no_components(g,copyinjection)
+ local components=get_components(g)
+ if components then
+ set_components(g)
+ local n=copy_node(g)
+ if copyinjection then
+ copyinjection(n,g)
+ end
+ set_components(g,components)
+ return n
+ else
+ local n=copy_node(g)
+ if copyinjection then
+ copyinjection(n,g)
+ end
+ return n
end
- return n
end
-end
-function nuts.copy_only_glyphs(current)
- local head=nil
- local previous=nil
- for n in traverse_id(glyph_code,current) do
- n=copy_node(n)
- if head then
- setlink(previous,n)
- else
- head=n
+ local function copy_only_glyphs(current)
+ local head=nil
+ local previous=nil
+ for n in traverse_id(glyph_code,current) do
+ n=copy_node(n)
+ if head then
+ setlink(previous,n)
+ else
+ head=n
+ end
+ previous=n
end
- previous=n
+ return head
end
- return head
+ local function count_components(start,marks)
+ local char=isglyph(start)
+ if char then
+ if getsubtype(start)==ligature_code then
+ local n=0
+ local components=get_components(start)
+ while components do
+ n=n+count_components(components,marks)
+ components=getnext(components)
+ end
+ return n
+ elseif not marks[char] then
+ return 1
+ end
+ end
+ return 0
+ end
+ nuts.set_components=set_components
+ nuts.get_components=get_components
+ nuts.copy_only_glyphs=copy_only_glyphs
+ nuts.copy_no_components=copy_no_components
+ nuts.count_components=count_components
end
nuts.uses_font=direct.uses_font
do
@@ -9634,6 +9689,7 @@ hashmethods.normal=function(list)
m=m+1
t[m]=k..'='..tostring(v)
end
+ sort(t)
s[n]=k..'={'..concat(t,",").."}"
else
s[n]=k..'='..tostring(v)
@@ -10323,7 +10379,7 @@ local match,format,find,concat,gsub,lower=string.match,string.format,string.find
local P,R,S,C,Ct,Cc,lpegmatch=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Ct,lpeg.Cc,lpeg.match
local formatters=string.formatters
local sortedhash,sortedkeys=table.sortedhash,table.sortedkeys
-local rshift=bit32.rshift
+local idiv=number.idiv
local trace_loading=false trackers.register("fonts.loading",function(v) trace_loading=v end)
local trace_mapping=false trackers.register("fonts.mapping",function(v) trace_mapping=v end)
local report_fonts=logs.reporter("fonts","loading")
@@ -10356,12 +10412,21 @@ local function makenameparser(str)
end
local f_single=formatters["%04X"]
local f_double=formatters["%04X%04X"]
+local s_unknown="FFFD"
local function tounicode16(unicode)
if unicode<0xD7FF or (unicode>0xDFFF and unicode<=0xFFFF) then
return f_single(unicode)
+ elseif unicode>=0x00E000 and unicode<=0x00F8FF then
+ return s_unknown
+ elseif unicode>=0x0F0000 and unicode<=0x0FFFFF then
+ return s_unknown
+ elseif unicode>=0x100000 and unicode<=0x10FFFF then
+ return s_unknown
+ elseif unicode>=0x00D800 and unicode<=0x00DFFF then
+ return s_unknown
else
unicode=unicode-0x10000
- return f_double(rshift(unicode,10)+0xD800,unicode%1024+0xDC00)
+ return f_double(idiv(k,0x400)+0xD800,unicode%0x400+0xDC00)
end
end
local function tounicode16sequence(unicodes)
@@ -10370,14 +10435,21 @@ local function tounicode16sequence(unicodes)
local u=unicodes[l]
if u<0xD7FF or (u>0xDFFF and u<=0xFFFF) then
t[l]=f_single(u)
+ elseif unicode>=0x00E000 and unicode<=0x00F8FF then
+ t[l]=s_unknown
+ elseif unicode>=0x0F0000 and unicode<=0x0FFFFF then
+ t[l]=s_unknown
+ elseif unicode>=0x100000 and unicode<=0x10FFFF then
+ t[l]=s_unknown
+ elseif unicode>=0x00D7FF and unicode<=0x00DFFF then
+ t[l]=s_unknown
else
u=u-0x10000
- t[l]=f_double(rshift(u,10)+0xD800,u%1024+0xDC00)
+ t[l]=f_double(idiv(k,0x400)+0xD800,u%0x400+0xDC00)
end
end
return concat(t)
end
-local unknown=f_single(0xFFFD)
local hash={}
local conc={}
table.setmetatableindex(hash,function(t,k)
@@ -10385,7 +10457,7 @@ table.setmetatableindex(hash,function(t,k)
v=f_single(k)
else
local k=k-0x10000
- v=f_double(rshift(k,10)+0xD800,k%1024+0xDC00)
+ v=f_double(idiv(k,0x400)+0xD800,k%0x400+0xDC00)
end
t[k]=v
return v
@@ -10398,11 +10470,13 @@ local function tounicode(k)
end
return concat(conc,"",1,n)
elseif k>=0x00E000 and k<=0x00F8FF then
- return unknown
+ return s_unknown
elseif k>=0x0F0000 and k<=0x0FFFFF then
- return unknown
+ return s_unknown
elseif k>=0x100000 and k<=0x10FFFF then
- return unknown
+ return s_unknown
+ elseif k>=0x00D7FF and k<=0x00DFFF then
+ return s_unknown
else
return hash[k]
end
@@ -14148,6 +14222,14 @@ local cffreaders={
readuint,
readulong,
}
+directives.register("fonts.streamreader",function()
+ cffreaders={
+ readbyte,
+ readushort,
+ readuint,
+ readulong,
+ }
+end)
local function readheader(f)
local offset=getposition(f)
local major=readbyte(f)
@@ -20032,6 +20114,7 @@ function readers.sbix(f,fontdata,specification)
end
end)
local glyphs={}
+ local delayed=CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 or fonts.handlers.typethree
for i=1,nofstrikes do
local strike=strikes[i]
local strikeppem=strike.ppem
@@ -20048,13 +20131,25 @@ function readers.sbix(f,fontdata,specification)
local datasize=nextoffset-glyphoffset
if datasize>0 then
setposition(f,strikeoffset+glyphoffset)
+ local x=readshort(f)
+ local y=readshort(f)
+ local tag=readtag(f)
+ local size=datasize-8
+ local data=nil
+ local offset=nil
+ if delayed then
+ offset=getposition(f)
+ data=nil
+ else
+ data=readstring(f,size)
+ size=nil
+ end
shapes[i]={
- x=readshort(f),
- y=readshort(f),
- tag=readtag(f),
- data=readstring(f,datasize-8),
- ppem=strikeppem,
- ppi=strikeppi,
+ x=x,
+ y=y,
+ o=offset,
+ s=size,
+ data=data,
}
done=done+1
if done==nofglyphs then
@@ -20233,29 +20328,46 @@ do
end
local default={ width=0,height=0 }
local glyphs=fontdata.glyphs
+ local delayed=CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 or fonts.handlers.typethree
for index,subtable in sortedhash(shapes) do
if type(subtable)=="table" then
local data=nil
+ local size=nil
local metrics=default
local format=subtable.format
local offset=subtable.offsets[index]
setposition(f,offset)
if format==17 then
metrics=getsmallmetrics(f)
- data=readstring(f,readulong(f))
+ size=true
elseif format==18 then
metrics=getbigmetrics(f)
- data=readstring(f,readulong(f))
+ size=true
elseif format==19 then
metrics=subtable.metrics
- data=readstring(f,readulong(f))
+ size=true
+ else
+ end
+ if size then
+ size=readulong(f)
+ if delayed then
+ offset=getposition(f)
+ data=nil
+ else
+ offset=nil
+ data=readstring(f,size)
+ size=nil
+ end
else
+ offset=nil
end
local x=metrics.width
local y=metrics.height
shapes[index]={
x=x,
y=y,
+ o=offset,
+ s=size,
data=data,
}
local glyph=glyphs[index]
@@ -23251,7 +23363,7 @@ local trace_defining=false registertracker("fonts.defining",function(v) trace_d
local report_otf=logs.reporter("fonts","otf loading")
local fonts=fonts
local otf=fonts.handlers.otf
-otf.version=3.110
+otf.version=3.111
otf.cache=containers.define("fonts","otl",otf.version,true)
otf.svgcache=containers.define("fonts","svg",otf.version,true)
otf.pngcache=containers.define("fonts","png",otf.version,true)
@@ -24452,14 +24564,14 @@ local insert_node_after=nuts.insert_after
local properties=nodes.properties.data
local fontkern=nuts.pool and nuts.pool.fontkern
local italickern=nuts.pool and nuts.pool.italickern
-local useitalickerns=false
+local useitalickerns=false
directives.register("fonts.injections.useitalics",function(v)
if v then
report_injections("using italics for space kerns (tracing only)")
end
useitalickerns=v
end)
-do if not fontkern then
+if not fontkern then
local thekern=nuts.new("kern",0)
local setkern=nuts.setkern
local copy_node=nuts.copy_node
@@ -24468,8 +24580,8 @@ do if not fontkern then
setkern(n,k)
return n
end
-end end
-do if not italickern then
+end
+if not italickern then
local thekern=nuts.new("kern",3)
local setkern=nuts.setkern
local copy_node=nuts.copy_node
@@ -24478,7 +24590,7 @@ do if not italickern then
setkern(n,k)
return n
end
-end end
+end
function injections.installnewkern() end
local nofregisteredkerns=0
local nofregisteredpositions=0
@@ -24931,7 +25043,15 @@ local function inject_kerns_only(head,where)
if i then
local leftkern=i.leftkern
if leftkern and leftkern~=0 then
- head=insert_node_before(head,current,fontkern(leftkern))
+ if prev and getid(prev)==glue_code then
+ if useitalickerns then
+ head=insert_node_before(head,current,italickern(leftkern))
+ else
+ setwidth(prev,getwidth(prev)+leftkern)
+ end
+ else
+ head=insert_node_before(head,current,fontkern(leftkern))
+ end
end
end
if prevdisc then
@@ -25074,12 +25194,26 @@ local function inject_positions_only(head,where)
if rightkern and leftkern==-rightkern then
setoffsets(current,leftkern,false)
rightkern=0
+ elseif prev and getid(prev)==glue_code then
+ if useitalickerns then
+ head=insert_node_before(head,current,italickern(leftkern))
+ else
+ setwidth(prev,getwidth(prev)+leftkern)
+ end
else
head=insert_node_before(head,current,fontkern(leftkern))
end
end
if rightkern and rightkern~=0 then
- insert_node_after(head,current,fontkern(rightkern))
+ if next and getid(next)==glue_code then
+ if useitalickerns then
+ insert_node_after(head,current,italickern(rightkern))
+ else
+ setwidth(next,getwidth(next)+rightkern)
+ end
+ else
+ insert_node_after(head,current,fontkern(rightkern))
+ end
end
else
local i=p.emptyinjections
@@ -25427,12 +25561,26 @@ local function inject_everything(head,where)
if rightkern and leftkern==-rightkern then
setoffsets(current,leftkern,false)
rightkern=0
+ elseif prev and getid(prev)==glue_code then
+ if useitalickerns then
+ head=insert_node_before(head,current,italickern(leftkern))
+ else
+ setwidth(prev,getwidth(prev)+leftkern)
+ end
else
head=insert_node_before(head,current,fontkern(leftkern))
end
end
if rightkern and rightkern~=0 then
- insert_node_after(head,current,fontkern(rightkern))
+ if next and getid(next)==glue_code then
+ if useitalickerns then
+ insert_node_after(head,current,italickern(rightkern))
+ else
+ setwidth(next,getwidth(next)+rightkern)
+ end
+ else
+ insert_node_after(head,current,fontkern(rightkern))
+ end
end
end
else
@@ -25798,16 +25946,17 @@ local function injectspaces(head)
if useitalickerns then
local new=rightkern*factor
if trace_spaces then
- report_spaces("%C [%p + %p]",nextchar,old,new)
+ report_spaces("[%p + %p] %C",old,new,nextchar)
end
insert_node_after(head,n,italickern(new))
else
local new=old+rightkern*factor
if trace_spaces then
- report_spaces("[%p -> %p] %C",nextchar,old,new)
+ report_spaces("[%p -> %p] %C",old,new,nextchar)
end
setwidth(n,new)
end
+ else
end
rightkern=false
end
@@ -25860,7 +26009,6 @@ local initializers=allocate()
local methods=allocate()
analyzers.initializers=initializers
analyzers.methods=methods
-local a_state=attributes.private('state')
local nuts=nodes.nuts
local tonut=nuts.tonut
local getnext=nuts.getnext
@@ -25880,6 +26028,23 @@ local categories=characters and characters.categories or {}
local chardata=characters and characters.data
local otffeatures=fonts.constructors.features.otf
local registerotffeature=otffeatures.register
+local setstate=nuts.setstate
+local getstate=nuts.getstate
+if not setstate or not getstate then
+ setstate=function(n,v)
+ setprop(n,"state",v)
+ end
+ getstate=function(n,v)
+ local s=getprop(n,"state")
+ if v then
+ return s==v
+ else
+ return s
+ end
+ end
+ nuts.setstate=setstate
+ nuts.getstate=getstate
+end
local s_init=1 local s_rphf=7
local s_medi=2 local s_half=8
local s_fina=3 local s_pref=9
@@ -25927,49 +26092,49 @@ function analyzers.setstate(head,font)
current=tonut(current)
while current do
local char,id=ischar(current,font)
- if char and not getprop(current,a_state) then
+ if char and not getstate(current) then
done=true
local d=descriptions[char]
if d then
if d.class=="mark" then
done=true
- setprop(current,a_state,s_mark)
+ setstate(current,s_mark)
elseif useunicodemarks and categories[char]=="mn" then
done=true
- setprop(current,a_state,s_mark)
+ setstate(current,s_mark)
elseif n==0 then
first,last,n=current,current,1
- setprop(current,a_state,s_init)
+ setstate(current,s_init)
else
last,n=current,n+1
- setprop(current,a_state,s_medi)
+ setstate(current,s_medi)
end
else
if first and first==last then
- setprop(last,a_state,s_isol)
+ setstate(last,s_isol)
elseif last then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
end
first,last,n=nil,nil,0
end
elseif char==false then
if first and first==last then
- setprop(last,a_state,s_isol)
+ setstate(last,s_isol)
elseif last then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
end
first,last,n=nil,nil,0
if id==math_code then
current=end_of_math(current)
end
elseif id==disc_code then
- setprop(current,a_state,s_medi)
+ setstate(current,s_medi)
last=current
else
if first and first==last then
- setprop(last,a_state,s_isol)
+ setstate(last,s_isol)
elseif last then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
end
first,last,n=nil,nil,0
if id==math_code then
@@ -25979,9 +26144,9 @@ function analyzers.setstate(head,font)
current=getnext(current)
end
if first and first==last then
- setprop(last,a_state,s_isol)
+ setstate(last,s_isol)
elseif last then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
end
return head,done
end
@@ -26085,87 +26250,87 @@ function methods.arab(head,font,attr)
current=tonut(current)
while current do
local char,id=ischar(current,font)
- if char and not getprop(current,a_state) then
+ if char and not getstate(current) then
done=true
local classifier=classifiers[char]
if not classifier then
if last then
if c_last==s_medi or c_last==s_fina then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
else
warning(last,"fina")
- setprop(last,a_state,s_error)
+ setstate(last,s_error)
end
first,last=nil,nil
elseif first then
if c_first==s_medi or c_first==s_fina then
- setprop(first,a_state,s_isol)
+ setstate(first,s_isol)
else
warning(first,"isol")
- setprop(first,a_state,s_error)
+ setstate(first,s_error)
end
first=nil
end
elseif classifier==s_mark then
- setprop(current,a_state,s_mark)
+ setstate(current,s_mark)
elseif classifier==s_isol then
if last then
if c_last==s_medi or c_last==s_fina then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
else
warning(last,"fina")
- setprop(last,a_state,s_error)
+ setstate(last,s_error)
end
first,last=nil,nil
elseif first then
if c_first==s_medi or c_first==s_fina then
- setprop(first,a_state,s_isol)
+ setstate(first,s_isol)
else
warning(first,"isol")
- setprop(first,a_state,s_error)
+ setstate(first,s_error)
end
first=nil
end
- setprop(current,a_state,s_isol)
+ setstate(current,s_isol)
elseif classifier==s_medi then
if first then
last=current
c_last=classifier
- setprop(current,a_state,s_medi)
+ setstate(current,s_medi)
else
- setprop(current,a_state,s_init)
+ setstate(current,s_init)
first=current
c_first=classifier
end
elseif classifier==s_fina then
if last then
- if getprop(last,a_state)~=s_init then
- setprop(last,a_state,s_medi)
+ if getstate(last)~=s_init then
+ setstate(last,s_medi)
end
- setprop(current,a_state,s_fina)
+ setstate(current,s_fina)
first,last=nil,nil
elseif first then
- setprop(current,a_state,s_fina)
+ setstate(current,s_fina)
first=nil
else
- setprop(current,a_state,s_isol)
+ setstate(current,s_isol)
end
else
- setprop(current,a_state,s_rest)
+ setstate(current,s_rest)
if last then
if c_last==s_medi or c_last==s_fina then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
else
warning(last,"fina")
- setprop(last,a_state,s_error)
+ setstate(last,s_error)
end
first,last=nil,nil
elseif first then
if c_first==s_medi or c_first==s_fina then
- setprop(first,a_state,s_isol)
+ setstate(first,s_isol)
else
warning(first,"isol")
- setprop(first,a_state,s_error)
+ setstate(first,s_error)
end
first=nil
end
@@ -26173,18 +26338,18 @@ function methods.arab(head,font,attr)
else
if last then
if c_last==s_medi or c_last==s_fina then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
else
warning(last,"fina")
- setprop(last,a_state,s_error)
+ setstate(last,s_error)
end
first,last=nil,nil
elseif first then
if c_first==s_medi or c_first==s_fina then
- setprop(first,a_state,s_isol)
+ setstate(first,s_isol)
else
warning(first,"isol")
- setprop(first,a_state,s_error)
+ setstate(first,s_error)
end
first=nil
end
@@ -26196,17 +26361,17 @@ function methods.arab(head,font,attr)
end
if last then
if c_last==s_medi or c_last==s_fina then
- setprop(last,a_state,s_fina)
+ setstate(last,s_fina)
else
warning(last,"fina")
- setprop(last,a_state,s_error)
+ setstate(last,s_error)
end
elseif first then
if c_first==s_medi or c_first==s_fina then
- setprop(first,a_state,s_isol)
+ setstate(first,s_isol)
else
warning(first,"isol")
- setprop(first,a_state,s_error)
+ setstate(first,s_error)
end
end
return head,done
@@ -26286,8 +26451,7 @@ local setprev=nuts.setprev
local getboth=nuts.getboth
local setboth=nuts.setboth
local getid=nuts.getid
-local getprop=nuts.getprop
-local setprop=nuts.setprop
+local getstate=nuts.getstate
local getsubtype=nuts.getsubtype
local setsubtype=nuts.setsubtype
local getchar=nuts.getchar
@@ -26296,13 +26460,15 @@ local getdisc=nuts.getdisc
local setdisc=nuts.setdisc
local getreplace=nuts.getreplace
local setlink=nuts.setlink
-local getcomponents=nuts.getcomponents
-local setcomponents=nuts.setcomponents
local getwidth=nuts.getwidth
local getattr=nuts.getattr
local getglyphdata=nuts.getglyphdata
+local copy_no_components=nuts.copy_no_components
+local copy_only_glyphs=nuts.copy_only_glyphs
+local count_components=nuts.count_components
+local set_components=nuts.set_components
+local get_components=nuts.get_components
local ischar=nuts.ischar
-local isglyph=nuts.isglyph
local usesfont=nuts.uses_font
local insert_node_after=nuts.insert_after
local copy_node=nuts.copy
@@ -26327,7 +26493,6 @@ local dir_code=nodecodes.dir
local localpar_code=nodecodes.localpar
local discretionarydisc_code=disccodes.discretionary
local ligatureglyph_code=glyphcodes.ligature
-local a_state=attributes.private('state')
local a_noligature=attributes.private("noligature")
local injections=nodes.injections
local setmark=injections.setmark
@@ -26488,27 +26653,6 @@ local function appenddisc(disc,list)
end
setdisc(disc,pre,post,replace)
end
-local copy_no_components=nuts.copy_no_components
-local copy_only_glyphs=nuts.copy_only_glyphs
-local set_components=setcomponents
-local take_components=getcomponents
-local function count_components(start,marks)
- local char=isglyph(start)
- if char then
- if getsubtype(start)==ligatureglyph_code then
- local i=0
- local components=getcomponents(start)
- while components do
- i=i+count_components(components,marks)
- components=getnext(components)
- end
- return i
- elseif not marks[char] then
- return 1
- end
- end
- return 0
-end
local function markstoligature(head,start,stop,char)
if start==stop and getchar(start)==char then
return head,start
@@ -26554,7 +26698,7 @@ local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfou
setlink(prev,base,next)
if not discfound then
local deletemarks=not skiphash or hasmarks
- local components=start
+ local components=start
local baseindex=0
local componentindex=0
local head=base
@@ -26567,13 +26711,13 @@ local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfou
elseif not deletemarks then
setligaindex(start,baseindex+getligaindex(start,componentindex))
if trace_marks then
- logwarning("%s: keep mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start))
+ logwarning("%s: keep ligature mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start))
end
local n=copy_node(start)
copyinjection(n,start)
head,current=insert_node_after(head,current,n)
elseif trace_marks then
- logwarning("%s: delete mark %s",pref(dataset,sequence),gref(char))
+ logwarning("%s: delete ligature mark %s",pref(dataset,sequence),gref(char))
end
start=getnext(start)
end
@@ -26584,7 +26728,7 @@ local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfou
if marks[char] then
setligaindex(start,baseindex+getligaindex(start,componentindex))
if trace_marks then
- logwarning("%s: set mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start))
+ logwarning("%s: set ligature mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start))
end
start=getnext(start)
else
@@ -26600,17 +26744,16 @@ local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfou
local pre,post,replace,pretail,posttail,replacetail=getdisc(discfound,true)
if not replace then
local prev=getprev(base)
- local comp=take_components(base)
local copied=copy_only_glyphs(comp)
if pre then
setlink(discprev,pre)
else
setnext(discprev)
end
- pre=comp
+ pre=comp
if post then
setlink(posttail,discnext)
- setprev(post)
+ setprev(post)
else
post=discnext
setprev(discnext)
@@ -28794,7 +28937,7 @@ local function testrun(disc,t_run,c_run,...)
end
local pre,post,replace,pretail,posttail,replacetail=getdisc(disc,true)
local renewed=false
- if (post or replace) then
+ if post or replace then
if post then
setlink(posttail,next)
else
@@ -28894,6 +29037,7 @@ local nesting=0
local function c_run_single(head,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler)
local done=false
local sweep=sweephead[head]
+ local start
if sweep then
start=sweep
sweephead[head]=false
@@ -28987,7 +29131,7 @@ local function t_run_single(start,stop,font,attr,lookupcache)
ss=nil
end
end
-lookupmatch=lg
+ lookupmatch=lg
else
break
end
@@ -29022,7 +29166,7 @@ local function k_run_single(sub,injection,last,font,attr,lookupcache,step,datase
if n==last then
break
end
- local char=ischar(n)
+ local char=ischar(n,font)
if char then
local lookupmatch=lookupcache[char]
if lookupmatch then
@@ -29038,6 +29182,7 @@ end
local function c_run_multiple(head,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler)
local done=false
local sweep=sweephead[head]
+ local start
if sweep then
start=sweep
sweephead[head]=false
@@ -29141,7 +29286,7 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
ss=nil
end
end
-lookupmatch=lg
+ lookupmatch=lg
else
break
end
@@ -29364,10 +29509,10 @@ do
if lookupmatch then
local a
if attr then
- if getglyphdata(start)==attr and (not attribute or getprop(start,a_state)==attribute) then
+ if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then
a=true
end
- elseif not attribute or getprop(start,a_state)==attribute then
+ elseif not attribute or getstate(start,attribute) then
a=true
end
if a then
@@ -29420,10 +29565,10 @@ do
if m then
local a
if attr then
- if getglyphdata(start)==attr and (not attribute or getprop(start,a_state)==attribute) then
+ if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then
a=true
end
- elseif not attribute or getprop(start,a_state)==attribute then
+ elseif not attribute or getstate(start,attribute) then
a=true
end
if a then
@@ -29866,6 +30011,8 @@ local setprev=nuts.setprev
local setchar=nuts.setchar
local getprop=nuts.getprop
local setprop=nuts.setprop
+local getstate=nuts.getstate
+local setstate=nuts.setstate
local ischar=nuts.ischar
local insert_node_after=nuts.insert_after
local copy_node=nuts.copy
@@ -29875,7 +30022,6 @@ local flush_node=nuts.flush_node
local copyinjection=nodes.injections.copy
local unsetvalue=attributes.unsetvalue
local fontdata=fonts.hashes.identifiers
-local a_state=attributes.private('state')
local a_syllabe=attributes.private('syllabe')
local dotted_circle=0x25CC
local c_nbsp=0x00A0
@@ -30608,7 +30754,7 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
current=start
else
current=getnext(n)
- setprop(start,a_state,s_rphf)
+ setstate(start,s_rphf)
end
end
if getchar(current)==c_nbsp then
@@ -30641,9 +30787,9 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
local nextcurrent=copy_node(current)
copyinjection(nextcurrent,current)
setlink(tempcurrent,nextcurrent)
- setprop(tempcurrent,a_state,s_blwf)
+ setstate(tempcurrent,s_blwf)
tempcurrent=processcharacters(tempcurrent,font)
- setprop(tempcurrent,a_state,unsetvalue)
+ setstate(tempcurrent,unsetvalue)
if getchar(next)==getchar(tempcurrent) then
flush_list(tempcurrent)
if show_syntax_errors then
@@ -30667,7 +30813,7 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
while not basefound do
local char=getchar(current)
if consonant[char] then
- setprop(current,a_state,s_half)
+ setstate(current,s_half)
if not firstcons then
firstcons=current
end
@@ -30675,9 +30821,9 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
if not base then
base=current
elseif blwfcache[char] then
- setprop(current,a_state,s_blwf)
+ setstate(current,s_blwf)
elseif pstfcache[char] then
- setprop(current,a_state,s_pstf)
+ setstate(current,s_pstf)
else
base=current
end
@@ -30742,14 +30888,14 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
while current~=stop do
local next=getnext(current)
if next~=stop and halant[getchar(next)] and getchar(getnext(next))==c_zwnj then
- setprop(current,a_state,unsetvalue)
+ setstate(current,unsetvalue)
end
current=next
end
- if base~=stop and getprop(base,a_state) then
+ if base~=stop and getstate(base) then
local next=getnext(base)
if halant[getchar(next)] and not (next~=stop and getchar(getnext(next))==c_zwj) then
- setprop(base,a_state,unsetvalue)
+ setstate(base,unsetvalue)
end
end
local current,allreordered,moved=start,false,{ [base]=true }
@@ -30886,7 +31032,7 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
end
bn=next
end
- if getprop(current,a_state)==s_rphf then
+ if getstate(current,s_rphf) then
if b~=current then
if current==start then
if head==start then
@@ -31037,7 +31183,7 @@ function handlers.devanagari_reorder_reph(head,start)
while current do
local char=ischar(current,startfont)
if char and getprop(current,a_syllabe)==startattr then
- if consonant[char] and not getprop(current,a_state)==s_pref then
+ if consonant[char] and not getstate(current,s_pref) then
startnext=getnext(start)
head=remove_node(head,start)
setlink(current,start)
@@ -31061,7 +31207,7 @@ function handlers.devanagari_reorder_reph(head,start)
while current do
local char=ischar(current,startfont)
if char and getprop(current,a_syllabe)==startattr then
- if getprop(current,a_state)==s_pstf then
+ if getstate(current,s_pstf) then
startnext=getnext(start)
head=remove_node(head,start)
setlink(getprev(current),start)
@@ -31094,7 +31240,7 @@ function handlers.devanagari_reorder_reph(head,start)
while current do
local char=ischar(current,startfont)
if char and getprop(current,a_syllabe)==startattr then
- local state=getprop(current,a_state)
+ local state=getstate(current)
if before_subscript[rephbase] and (state==s_blwf or state==s_pstf) then
c=current
elseif after_subscript[rephbase] and (state==s_pstf) then
@@ -31174,7 +31320,7 @@ function handlers.devanagari_reorder_pre_base_reordering_consonants(head,start)
local current=getprev(start)
while current and getprop(current,a_syllabe)==startattr do
local char=ischar(current)
- if (not dependent_vowel[char] and not getprop(current,a_state) or getprop(current,a_state)==s_init) then
+ if (not dependent_vowel[char] and (not getstate(current) or getstate(current,s_init))) then
startnext=getnext(start)
head=remove_node(head,start)
if current==head then
@@ -31254,7 +31400,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
if afternext and zw_char[getchar(afternext)] then
current=afternext
elseif current==start then
- setprop(current,a_state,s_rphf)
+ setstate(current,s_rphf)
current=next
else
current=next
@@ -31274,9 +31420,9 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
if found then
local next=getnext(current)
if found[getchar(next)] or contextchain(found,next) then
- if (not getprop(current,a_state) and not getprop(next,a_state)) then
- setprop(current,a_state,s_pref)
- setprop(next,a_state,s_pref)
+ if (not getstate(current) and not getstate(next)) then
+ setstate(current,s_pref)
+ setstate(next,s_pref)
current=next
end
end
@@ -31296,8 +31442,8 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
if found[getchar(next)] or contextchain(found,next) then
if next~=stop and getchar(getnext(next))==c_zwnj then
current=next
- elseif (not getprop(current,a_state)) then
- setprop(current,a_state,s_half)
+ elseif (not getstate(current)) then
+ setstate(current,s_half)
if not halfpos then
halfpos=current
end
@@ -31318,9 +31464,9 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
if found then
local next=getnext(current)
if found[getchar(next)] or contextchain(found,next) then
- if (not getprop(current,a_state) and not getprop(next,a_state)) then
- setprop(current,a_state,s_blwf)
- setprop(next,a_state,s_blwf)
+ if (not getstate(current) and not getstate(next)) then
+ setstate(current,s_blwf)
+ setstate(next,s_blwf)
current=next
subpos=current
end
@@ -31339,9 +31485,9 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
if found then
local next=getnext(current)
if found[getchar(next)] or contextchain(found,next) then
- if (not getprop(current,a_state) and not getprop(next,a_state)) then
- setprop(current,a_state,s_pstf)
- setprop(next,a_state,s_pstf)
+ if (not getstate(current) and not getstate(next)) then
+ setstate(current,s_pstf)
+ setstate(next,s_pstf)
current=next
postpos=current
end
@@ -31353,7 +31499,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
end
end
local current,base,firstcons=start,nil,nil
- if getprop(start,a_state)==s_rphf then
+ if getstate(start,s_rphf) then
current=getnext(getnext(start))
end
if current~=getnext(stop) and getchar(current)==c_nbsp then
@@ -31380,13 +31526,13 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
local tmp=getnext(next)
local changestop=next==stop
setnext(next)
- setprop(current,a_state,s_pref)
+ setstate(current,s_pref)
current=processcharacters(current,font)
- setprop(current,a_state,s_blwf)
+ setstate(current,s_blwf)
current=processcharacters(current,font)
- setprop(current,a_state,s_pstf)
+ setstate(current,s_pstf)
current=processcharacters(current,font)
- setprop(current,a_state,unsetvalue)
+ setstate(current,unsetvalue)
if halant[getchar(current)] then
setnext(getnext(current),tmp)
if show_syntax_errors then
@@ -31411,7 +31557,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
if not firstcons then
firstcons=current
end
- local a=getprop(current,a_state)
+ local a=getstate(current)
if not (a==s_blwf or a==s_pstf or (a~=s_rphf and a~=s_blwf and ra[getchar(current)])) then
base=current
end
@@ -31424,13 +31570,13 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
end
end
if not base then
- if getprop(start,a_state)==s_rphf then
- setprop(start,a_state,unsetvalue)
+ if getstate(start,s_rphf) then
+ setstate(start,unsetvalue)
end
return head,stop,nbspaces
else
- if getprop(base,a_state) then
- setprop(base,a_state,unsetvalue)
+ if getstate(base) then
+ setstate(base,unsetvalue)
end
basepos=base
end
@@ -31476,7 +31622,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
end
local ppos=getprev(pos)
while ppos and getprop(ppos,a_syllabe)==getprop(pos,a_syllabe) do
- if getprop(ppos,a_state)==s_pref then
+ if getstate(ppos,s_pref) then
pos=ppos
end
ppos=getprev(ppos)
@@ -31548,7 +31694,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
while current~=last do
local char=getchar(current)
local cn=getnext(current)
- if halant[char] and ra[ischar(cn)] and getprop(cn,a_state)~=s_rphf and getprop(cn,a_state)~=s_blwf then
+ if halant[char] and ra[ischar(cn)] and (not getstate(cn,s_rphf)) and (not getstate(cn,s_blwf)) then
if after_main[ischar(cn)] then
local prev=getprev(current)
local next=getnext(cn)
@@ -32148,8 +32294,8 @@ local function method_one(head,font,attr)
while current do
local char=ischar(current,font)
if char then
- if n==0 and not getprop(current,a_state) then
- setprop(current,a_state,s_init)
+ if n==0 and not getstate(current) then
+ setstate(current,s_init)
end
n=n+1
else
@@ -32225,7 +32371,7 @@ local function method_two(head,font,attr)
end
if not syllableend and show_syntax_errors then
local char=ischar(current,font)
- if char and not getprop(current,a_state) then
+ if char and not getstate(current) then
local mark=mark_four[char]
if mark then
head,current=inject_syntax_error(head,current,char)
@@ -32243,8 +32389,8 @@ local function method_two(head,font,attr)
while current do
local char=ischar(current,font)
if char then
- if n==0 and not getprop(current,a_state) then
- setprop(current,a_state,s_init)
+ if n==0 and not getstate(current) then
+ setstate(current,s_init)
end
n=n+1
else
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-util-str.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-util-str.lua
index 68c9be5860b..aba7859c31e 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-util-str.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-util-str.lua
@@ -701,14 +701,18 @@ local format_left = function(f)
end
end
-local format_q = function()
+local format_q = JITSUPPORTED and function()
n = n + 1
-- lua 5.3 has a different q than lua 5.2 (which does a tostring on numbers)
-- return format("(a%s ~= nil and format('%%q',a%s) or '')",n,n)
return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n)
-- return format("(a%s ~= nil and escapedquotes(tostring(a%s)) or '')",n,n)
+end or function()
+ n = n + 1
+ return format("(a%s ~= nil and format('%%q',a%s) or '')",n,n)
end
+
local format_Q = function() -- fast escaping
n = n + 1
-- return format("format('%%q',tostring(a%s))",n)
@@ -1269,7 +1273,6 @@ local function make(t,str)
f = function() return str end
end
end
- -- if jit then jit.on(f,true) end
t[str] = f
return f
end
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-auxiliary.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-auxiliary.lua
index f6539dca8d6..02f52f59bd7 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-auxiliary.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-auxiliary.lua
@@ -6,8 +6,8 @@
local ProvidesLuaModule = {
name = "luaotfload-auxiliary",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / auxiliary functions",
license = "GPL v2.0"
}
@@ -215,7 +215,7 @@ local function determine_capheight(fontdata)
local refchar = characters [refcp]
if refchar then
logreport ("both", 4, "aux",
- "picked height of character ‘%s’ (U+%d) as \\fontdimen8 \z
+ "picked height of character '%s' (U+%04X) as \\fontdimen8 \z
candidate",
capheight_reference_chars [i], refcp)
return refchar.height
@@ -729,7 +729,7 @@ end
--- https://github.com/lualatex/luaotfload/pull/61#issuecomment-17776975
--- string -> (int * int)
-local scan_external_dir = function (dir)
+local function scan_external_dir (dir)
local old_names, new_names = names.data()
if not old_names then
old_names = load_names()
@@ -918,7 +918,7 @@ end
local function inject_callbacks (lst)
if not lst and next (lst) then return false end
- local inject = function (def)
+ local function inject (def)
local cb, fn, id = unpack (def)
cb = tostring (cb)
id = tostring (id)
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-characters.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-characters.lua
index ded3b3eaf08..94ea5f035a5 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-characters.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-characters.lua
@@ -13153,6 +13153,66 @@ return {
linebreak="al",
unicodeslot=0x8BD,
},
+ [0x8BE]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8BE,
+ },
+ [0x8BF]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8BF,
+ },
+ [0x8C0]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8C0,
+ },
+ [0x8C1]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8C1,
+ },
+ [0x8C2]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8C2,
+ },
+ [0x8C3]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8C3,
+ },
+ [0x8C4]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8C4,
+ },
+ [0x8C5]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8C5,
+ },
+ [0x8C6]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8C6,
+ },
+ [0x8C7]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x8C7,
+ },
[0x8D3]={
category="mn",
direction="nsm",
@@ -16830,6 +16890,12 @@ return {
linebreak="cm",
unicodeslot=0xB4D,
},
+ [0xB55]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xB55,
+ },
[0xB56]={
category="mn",
direction="nsm",
@@ -18964,6 +19030,12 @@ return {
linebreak="cm",
unicodeslot=0xD03,
},
+ [0xD04]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xD04,
+ },
[0xD05]={
category="lo",
direction="l",
@@ -19788,6 +19860,12 @@ return {
linebreak="al",
unicodeslot=0xD7F,
},
+ [0xD81]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xD81,
+ },
[0xD82]={
category="mc",
direction="l",
@@ -38161,6 +38239,18 @@ return {
linebreak="cm",
unicodeslot=0x1ABE,
},
+ [0x1ABF]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1ABF,
+ },
+ [0x1AC0]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1AC0,
+ },
[0x1B00]={
category="mn",
direction="nsm",
@@ -64006,6 +64096,12 @@ return {
linebreak="al",
unicodeslot=0x2B95,
},
+ [0x2B97]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B97,
+ },
[0x2B98]={
category="so",
direction="on",
@@ -67888,6 +67984,24 @@ return {
linebreak="ba",
unicodeslot=0x2E4F,
},
+ [0x2E50]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2E50,
+ },
+ [0x2E51]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2E51,
+ },
+ [0x2E52]={
+ category="po",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2E52,
+ },
[0x2E80]={
category="so",
direction="on",
@@ -72941,6 +73055,36 @@ return {
linebreak="id",
unicodeslot=0x31BA,
},
+ [0x31BB]={
+ category="lo",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31BB,
+ },
+ [0x31BC]={
+ category="lo",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31BC,
+ },
+ [0x31BD]={
+ category="lo",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31BD,
+ },
+ [0x31BE]={
+ category="lo",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31BE,
+ },
+ [0x31BF]={
+ category="lo",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31BF,
+ },
[0x31C0]={
category="so",
direction="on",
@@ -88902,6 +89046,42 @@ return {
linebreak="al",
unicodeslot=0xA7C6,
},
+ [0xA7C7]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7C7,
+ },
+ [0xA7C8]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7C8,
+ },
+ [0xA7C9]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7C9,
+ },
+ [0xA7CA]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7CA,
+ },
+ [0xA7F5]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7F5,
+ },
+ [0xA7F6]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7F6,
+ },
[0xA7F7]={
category="lo",
direction="l",
@@ -89222,6 +89402,12 @@ return {
linebreak="al",
unicodeslot=0xA82B,
},
+ [0xA82C]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xA82C,
+ },
[0xA830]={
category="no",
direction="l",
@@ -93612,6 +93798,31 @@ return {
linebreak="al",
unicodeslot=0xAB67,
},
+ [0xAB68]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB68,
+ },
+ [0xAB69]={
+ category="lm",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x28D },
+ unicodeslot=0xAB69,
+ },
+ [0xAB6A]={
+ category="sk",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xAB6A,
+ },
+ [0xAB6B]={
+ category="sk",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xAB6B,
+ },
[0xAB70]={
category="ll",
direction="l",
@@ -108218,6 +108429,12 @@ return {
linebreak="al",
unicodeslot=0x1019B,
},
+ [0x1019C]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1019C,
+ },
[0x101A0]={
category="so",
direction="on",
@@ -120044,6 +120261,288 @@ return {
linebreak="al",
unicodeslot=0x10E7E,
},
+ [0x10E80]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E80,
+ },
+ [0x10E81]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E81,
+ },
+ [0x10E82]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E82,
+ },
+ [0x10E83]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E83,
+ },
+ [0x10E84]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E84,
+ },
+ [0x10E85]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E85,
+ },
+ [0x10E86]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E86,
+ },
+ [0x10E87]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E87,
+ },
+ [0x10E88]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E88,
+ },
+ [0x10E89]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E89,
+ },
+ [0x10E8A]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E8A,
+ },
+ [0x10E8B]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E8B,
+ },
+ [0x10E8C]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E8C,
+ },
+ [0x10E8D]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E8D,
+ },
+ [0x10E8E]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E8E,
+ },
+ [0x10E8F]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E8F,
+ },
+ [0x10E90]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E90,
+ },
+ [0x10E91]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E91,
+ },
+ [0x10E92]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E92,
+ },
+ [0x10E93]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E93,
+ },
+ [0x10E94]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E94,
+ },
+ [0x10E95]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E95,
+ },
+ [0x10E96]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E96,
+ },
+ [0x10E97]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E97,
+ },
+ [0x10E98]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E98,
+ },
+ [0x10E99]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E99,
+ },
+ [0x10E9A]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E9A,
+ },
+ [0x10E9B]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E9B,
+ },
+ [0x10E9C]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E9C,
+ },
+ [0x10E9D]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E9D,
+ },
+ [0x10E9E]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E9E,
+ },
+ [0x10E9F]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10E9F,
+ },
+ [0x10EA0]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10EA0,
+ },
+ [0x10EA1]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10EA1,
+ },
+ [0x10EA2]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10EA2,
+ },
+ [0x10EA3]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10EA3,
+ },
+ [0x10EA4]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10EA4,
+ },
+ [0x10EA5]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10EA5,
+ },
+ [0x10EA6]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10EA6,
+ },
+ [0x10EA7]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10EA7,
+ },
+ [0x10EA8]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10EA8,
+ },
+ [0x10EA9]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10EA9,
+ },
+ [0x10EAB]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10EAB,
+ },
+ [0x10EAC]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10EAC,
+ },
+ [0x10EAD]={
+ category="pd",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x10EAD,
+ },
+ [0x10EB0]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10EB0,
+ },
+ [0x10EB1]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10EB1,
+ },
[0x10F00]={
category="lo",
direction="r",
@@ -120536,6 +121035,174 @@ return {
linebreak="al",
unicodeslot=0x10F59,
},
+ [0x10FB0]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FB0,
+ },
+ [0x10FB1]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FB1,
+ },
+ [0x10FB2]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FB2,
+ },
+ [0x10FB3]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FB3,
+ },
+ [0x10FB4]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FB4,
+ },
+ [0x10FB5]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FB5,
+ },
+ [0x10FB6]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FB6,
+ },
+ [0x10FB7]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FB7,
+ },
+ [0x10FB8]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FB8,
+ },
+ [0x10FB9]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FB9,
+ },
+ [0x10FBA]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FBA,
+ },
+ [0x10FBB]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FBB,
+ },
+ [0x10FBC]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FBC,
+ },
+ [0x10FBD]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FBD,
+ },
+ [0x10FBE]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FBE,
+ },
+ [0x10FBF]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FBF,
+ },
+ [0x10FC0]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FC0,
+ },
+ [0x10FC1]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FC1,
+ },
+ [0x10FC2]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FC2,
+ },
+ [0x10FC3]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FC3,
+ },
+ [0x10FC4]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FC4,
+ },
+ [0x10FC5]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FC5,
+ },
+ [0x10FC6]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FC6,
+ },
+ [0x10FC7]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FC7,
+ },
+ [0x10FC8]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FC8,
+ },
+ [0x10FC9]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FC9,
+ },
+ [0x10FCA]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FCA,
+ },
+ [0x10FCB]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FCB,
+ },
[0x10FE0]={
category="lo",
direction="r",
@@ -122365,6 +123032,12 @@ return {
linebreak="cm",
unicodeslot=0x11146,
},
+ [0x11147]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11147,
+ },
[0x11150]={
category="lo",
direction="l",
@@ -123067,6 +123740,18 @@ return {
linebreak="al",
unicodeslot=0x111CD,
},
+ [0x111CE]={
+ category="mc",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x111CE,
+ },
+ [0x111CF]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x111CF,
+ },
[0x111D0]={
category="nd",
direction="l",
@@ -125355,6 +126040,12 @@ return {
linebreak="nu",
unicodeslot=0x11459,
},
+ [0x1145A]={
+ category="po",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1145A,
+ },
[0x1145B]={
category="po",
direction="l",
@@ -125379,6 +126070,18 @@ return {
linebreak="al",
unicodeslot=0x1145F,
},
+ [0x11460]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11460,
+ },
+ [0x11461]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11461,
+ },
[0x11480]={
category="lo",
direction="l",
@@ -128594,6 +129297,439 @@ return {
linebreak="al",
unicodeslot=0x118FF,
},
+ [0x11900]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11900,
+ },
+ [0x11901]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11901,
+ },
+ [0x11902]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11902,
+ },
+ [0x11903]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11903,
+ },
+ [0x11904]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11904,
+ },
+ [0x11905]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11905,
+ },
+ [0x11906]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11906,
+ },
+ [0x11909]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11909,
+ },
+ [0x1190C]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1190C,
+ },
+ [0x1190D]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1190D,
+ },
+ [0x1190E]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1190E,
+ },
+ [0x1190F]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1190F,
+ },
+ [0x11910]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11910,
+ },
+ [0x11911]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11911,
+ },
+ [0x11912]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11912,
+ },
+ [0x11913]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11913,
+ },
+ [0x11915]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11915,
+ },
+ [0x11916]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11916,
+ },
+ [0x11918]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11918,
+ },
+ [0x11919]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11919,
+ },
+ [0x1191A]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1191A,
+ },
+ [0x1191B]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1191B,
+ },
+ [0x1191C]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1191C,
+ },
+ [0x1191D]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1191D,
+ },
+ [0x1191E]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1191E,
+ },
+ [0x1191F]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1191F,
+ },
+ [0x11920]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11920,
+ },
+ [0x11921]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11921,
+ },
+ [0x11922]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11922,
+ },
+ [0x11923]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11923,
+ },
+ [0x11924]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11924,
+ },
+ [0x11925]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11925,
+ },
+ [0x11926]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11926,
+ },
+ [0x11927]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11927,
+ },
+ [0x11928]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11928,
+ },
+ [0x11929]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11929,
+ },
+ [0x1192A]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1192A,
+ },
+ [0x1192B]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1192B,
+ },
+ [0x1192C]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1192C,
+ },
+ [0x1192D]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1192D,
+ },
+ [0x1192E]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1192E,
+ },
+ [0x1192F]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1192F,
+ },
+ [0x11930]={
+ category="mc",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11930,
+ },
+ [0x11931]={
+ category="mc",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11931,
+ },
+ [0x11932]={
+ category="mc",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11932,
+ },
+ [0x11933]={
+ category="mc",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11933,
+ },
+ [0x11934]={
+ category="mc",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11934,
+ },
+ [0x11935]={
+ category="mc",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11935,
+ },
+ [0x11937]={
+ category="mc",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11937,
+ },
+ [0x11938]={
+ category="mc",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x11935, 0x11930 },
+ unicodeslot=0x11938,
+ },
+ [0x1193B]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1193B,
+ },
+ [0x1193C]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1193C,
+ },
+ [0x1193D]={
+ category="mc",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1193D,
+ },
+ [0x1193E]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1193E,
+ },
+ [0x1193F]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1193F,
+ },
+ [0x11940]={
+ category="mc",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11940,
+ },
+ [0x11941]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11941,
+ },
+ [0x11942]={
+ category="mc",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x11942,
+ },
+ [0x11943]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x11943,
+ },
+ [0x11944]={
+ category="po",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x11944,
+ },
+ [0x11945]={
+ category="po",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x11945,
+ },
+ [0x11946]={
+ category="po",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x11946,
+ },
+ [0x11950]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11950,
+ },
+ [0x11951]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11951,
+ },
+ [0x11952]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11952,
+ },
+ [0x11953]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11953,
+ },
+ [0x11954]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11954,
+ },
+ [0x11955]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11955,
+ },
+ [0x11956]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11956,
+ },
+ [0x11957]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11957,
+ },
+ [0x11958]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11958,
+ },
+ [0x11959]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x11959,
+ },
[0x119A0]={
category="lo",
direction="l",
@@ -132224,6 +133360,12 @@ return {
linebreak="al",
unicodeslot=0x11EF8,
},
+ [0x11FB0]={
+ category="lo",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FB0,
+ },
[0x11FC0]={
category="no",
direction="l",
@@ -156026,6 +157168,24 @@ return {
linebreak="ns",
unicodeslot=0x16FE3,
},
+ [0x16FE4]={
+ category="mn",
+ direction="nsm",
+ linebreak="gl",
+ unicodeslot=0x16FE4,
+ },
+ [0x16FF0]={
+ category="mc",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x16FF0,
+ },
+ [0x16FF1]={
+ category="mc",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x16FF1,
+ },
[0x18800]={
category="lo",
direction="l",
@@ -160556,38113 +161716,42677 @@ return {
linebreak="id",
unicodeslot=0x18AF2,
},
- [0x1B000]={
+ [0x18AF3]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B000,
+ unicodeslot=0x18AF3,
},
- [0x1B001]={
+ [0x18AF4]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B001,
+ unicodeslot=0x18AF4,
},
- [0x1B002]={
+ [0x18AF5]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B002,
+ unicodeslot=0x18AF5,
},
- [0x1B003]={
+ [0x18AF6]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B003,
+ unicodeslot=0x18AF6,
},
- [0x1B004]={
+ [0x18AF7]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B004,
+ unicodeslot=0x18AF7,
},
- [0x1B005]={
+ [0x18AF8]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B005,
+ unicodeslot=0x18AF8,
},
- [0x1B006]={
+ [0x18AF9]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B006,
+ unicodeslot=0x18AF9,
},
- [0x1B007]={
+ [0x18AFA]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B007,
+ unicodeslot=0x18AFA,
},
- [0x1B008]={
+ [0x18AFB]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B008,
+ unicodeslot=0x18AFB,
},
- [0x1B009]={
+ [0x18AFC]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B009,
+ unicodeslot=0x18AFC,
},
- [0x1B00A]={
+ [0x18AFD]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B00A,
+ unicodeslot=0x18AFD,
},
- [0x1B00B]={
+ [0x18AFE]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B00B,
+ unicodeslot=0x18AFE,
},
- [0x1B00C]={
+ [0x18AFF]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B00C,
+ unicodeslot=0x18AFF,
},
- [0x1B00D]={
+ [0x18B00]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B00D,
+ linebreak="al",
+ unicodeslot=0x18B00,
},
- [0x1B00E]={
+ [0x18B01]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B00E,
+ linebreak="al",
+ unicodeslot=0x18B01,
},
- [0x1B00F]={
+ [0x18B02]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B00F,
+ linebreak="al",
+ unicodeslot=0x18B02,
},
- [0x1B010]={
+ [0x18B03]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B010,
+ linebreak="al",
+ unicodeslot=0x18B03,
},
- [0x1B011]={
+ [0x18B04]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B011,
+ linebreak="al",
+ unicodeslot=0x18B04,
},
- [0x1B012]={
+ [0x18B05]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B012,
+ linebreak="al",
+ unicodeslot=0x18B05,
},
- [0x1B013]={
+ [0x18B06]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B013,
+ linebreak="al",
+ unicodeslot=0x18B06,
},
- [0x1B014]={
+ [0x18B07]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B014,
+ linebreak="al",
+ unicodeslot=0x18B07,
},
- [0x1B015]={
+ [0x18B08]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B015,
+ linebreak="al",
+ unicodeslot=0x18B08,
},
- [0x1B016]={
+ [0x18B09]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B016,
+ linebreak="al",
+ unicodeslot=0x18B09,
},
- [0x1B017]={
+ [0x18B0A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B017,
+ linebreak="al",
+ unicodeslot=0x18B0A,
},
- [0x1B018]={
+ [0x18B0B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B018,
+ linebreak="al",
+ unicodeslot=0x18B0B,
},
- [0x1B019]={
+ [0x18B0C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B019,
+ linebreak="al",
+ unicodeslot=0x18B0C,
},
- [0x1B01A]={
+ [0x18B0D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B01A,
+ linebreak="al",
+ unicodeslot=0x18B0D,
},
- [0x1B01B]={
+ [0x18B0E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B01B,
+ linebreak="al",
+ unicodeslot=0x18B0E,
},
- [0x1B01C]={
+ [0x18B0F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B01C,
+ linebreak="al",
+ unicodeslot=0x18B0F,
},
- [0x1B01D]={
+ [0x18B10]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B01D,
+ linebreak="al",
+ unicodeslot=0x18B10,
},
- [0x1B01E]={
+ [0x18B11]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B01E,
+ linebreak="al",
+ unicodeslot=0x18B11,
},
- [0x1B01F]={
+ [0x18B12]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B01F,
+ linebreak="al",
+ unicodeslot=0x18B12,
},
- [0x1B020]={
+ [0x18B13]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B020,
+ linebreak="al",
+ unicodeslot=0x18B13,
},
- [0x1B021]={
+ [0x18B14]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B021,
+ linebreak="al",
+ unicodeslot=0x18B14,
},
- [0x1B022]={
+ [0x18B15]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B022,
+ linebreak="al",
+ unicodeslot=0x18B15,
},
- [0x1B023]={
+ [0x18B16]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B023,
+ linebreak="al",
+ unicodeslot=0x18B16,
},
- [0x1B024]={
+ [0x18B17]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B024,
+ linebreak="al",
+ unicodeslot=0x18B17,
},
- [0x1B025]={
+ [0x18B18]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B025,
+ linebreak="al",
+ unicodeslot=0x18B18,
},
- [0x1B026]={
+ [0x18B19]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B026,
+ linebreak="al",
+ unicodeslot=0x18B19,
},
- [0x1B027]={
+ [0x18B1A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B027,
+ linebreak="al",
+ unicodeslot=0x18B1A,
},
- [0x1B028]={
+ [0x18B1B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B028,
+ linebreak="al",
+ unicodeslot=0x18B1B,
},
- [0x1B029]={
+ [0x18B1C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B029,
+ linebreak="al",
+ unicodeslot=0x18B1C,
},
- [0x1B02A]={
+ [0x18B1D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B02A,
+ linebreak="al",
+ unicodeslot=0x18B1D,
},
- [0x1B02B]={
+ [0x18B1E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B02B,
+ linebreak="al",
+ unicodeslot=0x18B1E,
},
- [0x1B02C]={
+ [0x18B1F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B02C,
+ linebreak="al",
+ unicodeslot=0x18B1F,
},
- [0x1B02D]={
+ [0x18B20]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B02D,
+ linebreak="al",
+ unicodeslot=0x18B20,
},
- [0x1B02E]={
+ [0x18B21]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B02E,
+ linebreak="al",
+ unicodeslot=0x18B21,
},
- [0x1B02F]={
+ [0x18B22]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B02F,
+ linebreak="al",
+ unicodeslot=0x18B22,
},
- [0x1B030]={
+ [0x18B23]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B030,
+ linebreak="al",
+ unicodeslot=0x18B23,
},
- [0x1B031]={
+ [0x18B24]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B031,
+ linebreak="al",
+ unicodeslot=0x18B24,
},
- [0x1B032]={
+ [0x18B25]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B032,
+ linebreak="al",
+ unicodeslot=0x18B25,
},
- [0x1B033]={
+ [0x18B26]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B033,
+ linebreak="al",
+ unicodeslot=0x18B26,
},
- [0x1B034]={
+ [0x18B27]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B034,
+ linebreak="al",
+ unicodeslot=0x18B27,
},
- [0x1B035]={
+ [0x18B28]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B035,
+ linebreak="al",
+ unicodeslot=0x18B28,
},
- [0x1B036]={
+ [0x18B29]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B036,
+ linebreak="al",
+ unicodeslot=0x18B29,
},
- [0x1B037]={
+ [0x18B2A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B037,
+ linebreak="al",
+ unicodeslot=0x18B2A,
},
- [0x1B038]={
+ [0x18B2B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B038,
+ linebreak="al",
+ unicodeslot=0x18B2B,
},
- [0x1B039]={
+ [0x18B2C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B039,
+ linebreak="al",
+ unicodeslot=0x18B2C,
},
- [0x1B03A]={
+ [0x18B2D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B03A,
+ linebreak="al",
+ unicodeslot=0x18B2D,
},
- [0x1B03B]={
+ [0x18B2E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B03B,
+ linebreak="al",
+ unicodeslot=0x18B2E,
},
- [0x1B03C]={
+ [0x18B2F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B03C,
+ linebreak="al",
+ unicodeslot=0x18B2F,
},
- [0x1B03D]={
+ [0x18B30]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B03D,
+ linebreak="al",
+ unicodeslot=0x18B30,
},
- [0x1B03E]={
+ [0x18B31]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B03E,
+ linebreak="al",
+ unicodeslot=0x18B31,
},
- [0x1B03F]={
+ [0x18B32]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B03F,
+ linebreak="al",
+ unicodeslot=0x18B32,
},
- [0x1B040]={
+ [0x18B33]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B040,
+ linebreak="al",
+ unicodeslot=0x18B33,
},
- [0x1B041]={
+ [0x18B34]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B041,
+ linebreak="al",
+ unicodeslot=0x18B34,
},
- [0x1B042]={
+ [0x18B35]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B042,
+ linebreak="al",
+ unicodeslot=0x18B35,
},
- [0x1B043]={
+ [0x18B36]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B043,
+ linebreak="al",
+ unicodeslot=0x18B36,
},
- [0x1B044]={
+ [0x18B37]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B044,
+ linebreak="al",
+ unicodeslot=0x18B37,
},
- [0x1B045]={
+ [0x18B38]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B045,
+ linebreak="al",
+ unicodeslot=0x18B38,
},
- [0x1B046]={
+ [0x18B39]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B046,
+ linebreak="al",
+ unicodeslot=0x18B39,
},
- [0x1B047]={
+ [0x18B3A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B047,
+ linebreak="al",
+ unicodeslot=0x18B3A,
},
- [0x1B048]={
+ [0x18B3B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B048,
+ linebreak="al",
+ unicodeslot=0x18B3B,
},
- [0x1B049]={
+ [0x18B3C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B049,
+ linebreak="al",
+ unicodeslot=0x18B3C,
},
- [0x1B04A]={
+ [0x18B3D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B04A,
+ linebreak="al",
+ unicodeslot=0x18B3D,
},
- [0x1B04B]={
+ [0x18B3E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B04B,
+ linebreak="al",
+ unicodeslot=0x18B3E,
},
- [0x1B04C]={
+ [0x18B3F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B04C,
+ linebreak="al",
+ unicodeslot=0x18B3F,
},
- [0x1B04D]={
+ [0x18B40]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B04D,
+ linebreak="al",
+ unicodeslot=0x18B40,
},
- [0x1B04E]={
+ [0x18B41]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B04E,
+ linebreak="al",
+ unicodeslot=0x18B41,
},
- [0x1B04F]={
+ [0x18B42]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B04F,
+ linebreak="al",
+ unicodeslot=0x18B42,
},
- [0x1B050]={
+ [0x18B43]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B050,
+ linebreak="al",
+ unicodeslot=0x18B43,
},
- [0x1B051]={
+ [0x18B44]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B051,
+ linebreak="al",
+ unicodeslot=0x18B44,
},
- [0x1B052]={
+ [0x18B45]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B052,
+ linebreak="al",
+ unicodeslot=0x18B45,
},
- [0x1B053]={
+ [0x18B46]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B053,
+ linebreak="al",
+ unicodeslot=0x18B46,
},
- [0x1B054]={
+ [0x18B47]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B054,
+ linebreak="al",
+ unicodeslot=0x18B47,
},
- [0x1B055]={
+ [0x18B48]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B055,
+ linebreak="al",
+ unicodeslot=0x18B48,
},
- [0x1B056]={
+ [0x18B49]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B056,
+ linebreak="al",
+ unicodeslot=0x18B49,
},
- [0x1B057]={
+ [0x18B4A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B057,
+ linebreak="al",
+ unicodeslot=0x18B4A,
},
- [0x1B058]={
+ [0x18B4B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B058,
+ linebreak="al",
+ unicodeslot=0x18B4B,
},
- [0x1B059]={
+ [0x18B4C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B059,
+ linebreak="al",
+ unicodeslot=0x18B4C,
},
- [0x1B05A]={
+ [0x18B4D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B05A,
+ linebreak="al",
+ unicodeslot=0x18B4D,
},
- [0x1B05B]={
+ [0x18B4E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B05B,
+ linebreak="al",
+ unicodeslot=0x18B4E,
},
- [0x1B05C]={
+ [0x18B4F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B05C,
+ linebreak="al",
+ unicodeslot=0x18B4F,
},
- [0x1B05D]={
+ [0x18B50]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B05D,
+ linebreak="al",
+ unicodeslot=0x18B50,
},
- [0x1B05E]={
+ [0x18B51]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B05E,
+ linebreak="al",
+ unicodeslot=0x18B51,
},
- [0x1B05F]={
+ [0x18B52]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B05F,
+ linebreak="al",
+ unicodeslot=0x18B52,
},
- [0x1B060]={
+ [0x18B53]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B060,
+ linebreak="al",
+ unicodeslot=0x18B53,
},
- [0x1B061]={
+ [0x18B54]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B061,
+ linebreak="al",
+ unicodeslot=0x18B54,
},
- [0x1B062]={
+ [0x18B55]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B062,
+ linebreak="al",
+ unicodeslot=0x18B55,
},
- [0x1B063]={
+ [0x18B56]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B063,
+ linebreak="al",
+ unicodeslot=0x18B56,
},
- [0x1B064]={
+ [0x18B57]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B064,
+ linebreak="al",
+ unicodeslot=0x18B57,
},
- [0x1B065]={
+ [0x18B58]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B065,
+ linebreak="al",
+ unicodeslot=0x18B58,
},
- [0x1B066]={
+ [0x18B59]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B066,
+ linebreak="al",
+ unicodeslot=0x18B59,
},
- [0x1B067]={
+ [0x18B5A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B067,
+ linebreak="al",
+ unicodeslot=0x18B5A,
},
- [0x1B068]={
+ [0x18B5B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B068,
+ linebreak="al",
+ unicodeslot=0x18B5B,
},
- [0x1B069]={
+ [0x18B5C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B069,
+ linebreak="al",
+ unicodeslot=0x18B5C,
},
- [0x1B06A]={
+ [0x18B5D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B06A,
+ linebreak="al",
+ unicodeslot=0x18B5D,
},
- [0x1B06B]={
+ [0x18B5E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B06B,
+ linebreak="al",
+ unicodeslot=0x18B5E,
},
- [0x1B06C]={
+ [0x18B5F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B06C,
+ linebreak="al",
+ unicodeslot=0x18B5F,
},
- [0x1B06D]={
+ [0x18B60]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B06D,
+ linebreak="al",
+ unicodeslot=0x18B60,
},
- [0x1B06E]={
+ [0x18B61]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B06E,
+ linebreak="al",
+ unicodeslot=0x18B61,
},
- [0x1B06F]={
+ [0x18B62]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B06F,
+ linebreak="al",
+ unicodeslot=0x18B62,
},
- [0x1B070]={
+ [0x18B63]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B070,
+ linebreak="al",
+ unicodeslot=0x18B63,
},
- [0x1B071]={
+ [0x18B64]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B071,
+ linebreak="al",
+ unicodeslot=0x18B64,
},
- [0x1B072]={
+ [0x18B65]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B072,
+ linebreak="al",
+ unicodeslot=0x18B65,
},
- [0x1B073]={
+ [0x18B66]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B073,
+ linebreak="al",
+ unicodeslot=0x18B66,
},
- [0x1B074]={
+ [0x18B67]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B074,
+ linebreak="al",
+ unicodeslot=0x18B67,
},
- [0x1B075]={
+ [0x18B68]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B075,
+ linebreak="al",
+ unicodeslot=0x18B68,
},
- [0x1B076]={
+ [0x18B69]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B076,
+ linebreak="al",
+ unicodeslot=0x18B69,
},
- [0x1B077]={
+ [0x18B6A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B077,
+ linebreak="al",
+ unicodeslot=0x18B6A,
},
- [0x1B078]={
+ [0x18B6B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B078,
+ linebreak="al",
+ unicodeslot=0x18B6B,
},
- [0x1B079]={
+ [0x18B6C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B079,
+ linebreak="al",
+ unicodeslot=0x18B6C,
},
- [0x1B07A]={
+ [0x18B6D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B07A,
+ linebreak="al",
+ unicodeslot=0x18B6D,
},
- [0x1B07B]={
+ [0x18B6E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B07B,
+ linebreak="al",
+ unicodeslot=0x18B6E,
},
- [0x1B07C]={
+ [0x18B6F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B07C,
+ linebreak="al",
+ unicodeslot=0x18B6F,
},
- [0x1B07D]={
+ [0x18B70]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B07D,
+ linebreak="al",
+ unicodeslot=0x18B70,
},
- [0x1B07E]={
+ [0x18B71]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B07E,
+ linebreak="al",
+ unicodeslot=0x18B71,
},
- [0x1B07F]={
+ [0x18B72]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B07F,
+ linebreak="al",
+ unicodeslot=0x18B72,
},
- [0x1B080]={
+ [0x18B73]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B080,
+ linebreak="al",
+ unicodeslot=0x18B73,
},
- [0x1B081]={
+ [0x18B74]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B081,
+ linebreak="al",
+ unicodeslot=0x18B74,
},
- [0x1B082]={
+ [0x18B75]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B082,
+ linebreak="al",
+ unicodeslot=0x18B75,
},
- [0x1B083]={
+ [0x18B76]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B083,
+ linebreak="al",
+ unicodeslot=0x18B76,
},
- [0x1B084]={
+ [0x18B77]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B084,
+ linebreak="al",
+ unicodeslot=0x18B77,
},
- [0x1B085]={
+ [0x18B78]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B085,
+ linebreak="al",
+ unicodeslot=0x18B78,
},
- [0x1B086]={
+ [0x18B79]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B086,
+ linebreak="al",
+ unicodeslot=0x18B79,
},
- [0x1B087]={
+ [0x18B7A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B087,
+ linebreak="al",
+ unicodeslot=0x18B7A,
},
- [0x1B088]={
+ [0x18B7B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B088,
+ linebreak="al",
+ unicodeslot=0x18B7B,
},
- [0x1B089]={
+ [0x18B7C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B089,
+ linebreak="al",
+ unicodeslot=0x18B7C,
},
- [0x1B08A]={
+ [0x18B7D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B08A,
+ linebreak="al",
+ unicodeslot=0x18B7D,
},
- [0x1B08B]={
+ [0x18B7E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B08B,
+ linebreak="al",
+ unicodeslot=0x18B7E,
},
- [0x1B08C]={
+ [0x18B7F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B08C,
+ linebreak="al",
+ unicodeslot=0x18B7F,
},
- [0x1B08D]={
+ [0x18B80]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B08D,
+ linebreak="al",
+ unicodeslot=0x18B80,
},
- [0x1B08E]={
+ [0x18B81]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B08E,
+ linebreak="al",
+ unicodeslot=0x18B81,
},
- [0x1B08F]={
+ [0x18B82]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B08F,
+ linebreak="al",
+ unicodeslot=0x18B82,
},
- [0x1B090]={
+ [0x18B83]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B090,
+ linebreak="al",
+ unicodeslot=0x18B83,
},
- [0x1B091]={
+ [0x18B84]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B091,
+ linebreak="al",
+ unicodeslot=0x18B84,
},
- [0x1B092]={
+ [0x18B85]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B092,
+ linebreak="al",
+ unicodeslot=0x18B85,
},
- [0x1B093]={
+ [0x18B86]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B093,
+ linebreak="al",
+ unicodeslot=0x18B86,
},
- [0x1B094]={
+ [0x18B87]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B094,
+ linebreak="al",
+ unicodeslot=0x18B87,
},
- [0x1B095]={
+ [0x18B88]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B095,
+ linebreak="al",
+ unicodeslot=0x18B88,
},
- [0x1B096]={
+ [0x18B89]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B096,
+ linebreak="al",
+ unicodeslot=0x18B89,
},
- [0x1B097]={
+ [0x18B8A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B097,
+ linebreak="al",
+ unicodeslot=0x18B8A,
},
- [0x1B098]={
+ [0x18B8B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B098,
+ linebreak="al",
+ unicodeslot=0x18B8B,
},
- [0x1B099]={
+ [0x18B8C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B099,
+ linebreak="al",
+ unicodeslot=0x18B8C,
},
- [0x1B09A]={
+ [0x18B8D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B09A,
+ linebreak="al",
+ unicodeslot=0x18B8D,
},
- [0x1B09B]={
+ [0x18B8E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B09B,
+ linebreak="al",
+ unicodeslot=0x18B8E,
},
- [0x1B09C]={
+ [0x18B8F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B09C,
+ linebreak="al",
+ unicodeslot=0x18B8F,
},
- [0x1B09D]={
+ [0x18B90]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B09D,
+ linebreak="al",
+ unicodeslot=0x18B90,
},
- [0x1B09E]={
+ [0x18B91]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B09E,
+ linebreak="al",
+ unicodeslot=0x18B91,
},
- [0x1B09F]={
+ [0x18B92]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B09F,
+ linebreak="al",
+ unicodeslot=0x18B92,
},
- [0x1B0A0]={
+ [0x18B93]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0A0,
+ linebreak="al",
+ unicodeslot=0x18B93,
},
- [0x1B0A1]={
+ [0x18B94]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0A1,
+ linebreak="al",
+ unicodeslot=0x18B94,
},
- [0x1B0A2]={
+ [0x18B95]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0A2,
+ linebreak="al",
+ unicodeslot=0x18B95,
},
- [0x1B0A3]={
+ [0x18B96]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0A3,
+ linebreak="al",
+ unicodeslot=0x18B96,
},
- [0x1B0A4]={
+ [0x18B97]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0A4,
+ linebreak="al",
+ unicodeslot=0x18B97,
},
- [0x1B0A5]={
+ [0x18B98]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0A5,
+ linebreak="al",
+ unicodeslot=0x18B98,
},
- [0x1B0A6]={
+ [0x18B99]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0A6,
+ linebreak="al",
+ unicodeslot=0x18B99,
},
- [0x1B0A7]={
+ [0x18B9A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0A7,
+ linebreak="al",
+ unicodeslot=0x18B9A,
},
- [0x1B0A8]={
+ [0x18B9B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0A8,
+ linebreak="al",
+ unicodeslot=0x18B9B,
},
- [0x1B0A9]={
+ [0x18B9C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0A9,
+ linebreak="al",
+ unicodeslot=0x18B9C,
},
- [0x1B0AA]={
+ [0x18B9D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0AA,
+ linebreak="al",
+ unicodeslot=0x18B9D,
},
- [0x1B0AB]={
+ [0x18B9E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0AB,
+ linebreak="al",
+ unicodeslot=0x18B9E,
},
- [0x1B0AC]={
+ [0x18B9F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0AC,
+ linebreak="al",
+ unicodeslot=0x18B9F,
},
- [0x1B0AD]={
+ [0x18BA0]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0AD,
+ linebreak="al",
+ unicodeslot=0x18BA0,
},
- [0x1B0AE]={
+ [0x18BA1]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0AE,
+ linebreak="al",
+ unicodeslot=0x18BA1,
},
- [0x1B0AF]={
+ [0x18BA2]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0AF,
+ linebreak="al",
+ unicodeslot=0x18BA2,
},
- [0x1B0B0]={
+ [0x18BA3]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0B0,
+ linebreak="al",
+ unicodeslot=0x18BA3,
},
- [0x1B0B1]={
+ [0x18BA4]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0B1,
+ linebreak="al",
+ unicodeslot=0x18BA4,
},
- [0x1B0B2]={
+ [0x18BA5]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0B2,
+ linebreak="al",
+ unicodeslot=0x18BA5,
},
- [0x1B0B3]={
+ [0x18BA6]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0B3,
+ linebreak="al",
+ unicodeslot=0x18BA6,
},
- [0x1B0B4]={
+ [0x18BA7]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0B4,
+ linebreak="al",
+ unicodeslot=0x18BA7,
},
- [0x1B0B5]={
+ [0x18BA8]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0B5,
+ linebreak="al",
+ unicodeslot=0x18BA8,
},
- [0x1B0B6]={
+ [0x18BA9]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0B6,
+ linebreak="al",
+ unicodeslot=0x18BA9,
},
- [0x1B0B7]={
+ [0x18BAA]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0B7,
+ linebreak="al",
+ unicodeslot=0x18BAA,
},
- [0x1B0B8]={
+ [0x18BAB]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0B8,
+ linebreak="al",
+ unicodeslot=0x18BAB,
},
- [0x1B0B9]={
+ [0x18BAC]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0B9,
+ linebreak="al",
+ unicodeslot=0x18BAC,
},
- [0x1B0BA]={
+ [0x18BAD]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0BA,
+ linebreak="al",
+ unicodeslot=0x18BAD,
},
- [0x1B0BB]={
+ [0x18BAE]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0BB,
+ linebreak="al",
+ unicodeslot=0x18BAE,
},
- [0x1B0BC]={
+ [0x18BAF]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0BC,
+ linebreak="al",
+ unicodeslot=0x18BAF,
},
- [0x1B0BD]={
+ [0x18BB0]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0BD,
+ linebreak="al",
+ unicodeslot=0x18BB0,
},
- [0x1B0BE]={
+ [0x18BB1]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0BE,
+ linebreak="al",
+ unicodeslot=0x18BB1,
},
- [0x1B0BF]={
+ [0x18BB2]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0BF,
+ linebreak="al",
+ unicodeslot=0x18BB2,
},
- [0x1B0C0]={
+ [0x18BB3]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0C0,
+ linebreak="al",
+ unicodeslot=0x18BB3,
},
- [0x1B0C1]={
+ [0x18BB4]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0C1,
+ linebreak="al",
+ unicodeslot=0x18BB4,
},
- [0x1B0C2]={
+ [0x18BB5]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0C2,
+ linebreak="al",
+ unicodeslot=0x18BB5,
},
- [0x1B0C3]={
+ [0x18BB6]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0C3,
+ linebreak="al",
+ unicodeslot=0x18BB6,
},
- [0x1B0C4]={
+ [0x18BB7]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0C4,
+ linebreak="al",
+ unicodeslot=0x18BB7,
},
- [0x1B0C5]={
+ [0x18BB8]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0C5,
+ linebreak="al",
+ unicodeslot=0x18BB8,
},
- [0x1B0C6]={
+ [0x18BB9]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0C6,
+ linebreak="al",
+ unicodeslot=0x18BB9,
},
- [0x1B0C7]={
+ [0x18BBA]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0C7,
+ linebreak="al",
+ unicodeslot=0x18BBA,
},
- [0x1B0C8]={
+ [0x18BBB]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0C8,
+ linebreak="al",
+ unicodeslot=0x18BBB,
},
- [0x1B0C9]={
+ [0x18BBC]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0C9,
+ linebreak="al",
+ unicodeslot=0x18BBC,
},
- [0x1B0CA]={
+ [0x18BBD]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0CA,
+ linebreak="al",
+ unicodeslot=0x18BBD,
},
- [0x1B0CB]={
+ [0x18BBE]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0CB,
+ linebreak="al",
+ unicodeslot=0x18BBE,
},
- [0x1B0CC]={
+ [0x18BBF]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0CC,
+ linebreak="al",
+ unicodeslot=0x18BBF,
},
- [0x1B0CD]={
+ [0x18BC0]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0CD,
+ linebreak="al",
+ unicodeslot=0x18BC0,
},
- [0x1B0CE]={
+ [0x18BC1]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0CE,
+ linebreak="al",
+ unicodeslot=0x18BC1,
},
- [0x1B0CF]={
+ [0x18BC2]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0CF,
+ linebreak="al",
+ unicodeslot=0x18BC2,
},
- [0x1B0D0]={
+ [0x18BC3]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0D0,
+ linebreak="al",
+ unicodeslot=0x18BC3,
},
- [0x1B0D1]={
+ [0x18BC4]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0D1,
+ linebreak="al",
+ unicodeslot=0x18BC4,
},
- [0x1B0D2]={
+ [0x18BC5]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0D2,
+ linebreak="al",
+ unicodeslot=0x18BC5,
},
- [0x1B0D3]={
+ [0x18BC6]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0D3,
+ linebreak="al",
+ unicodeslot=0x18BC6,
},
- [0x1B0D4]={
+ [0x18BC7]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0D4,
+ linebreak="al",
+ unicodeslot=0x18BC7,
},
- [0x1B0D5]={
+ [0x18BC8]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0D5,
+ linebreak="al",
+ unicodeslot=0x18BC8,
},
- [0x1B0D6]={
+ [0x18BC9]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0D6,
+ linebreak="al",
+ unicodeslot=0x18BC9,
},
- [0x1B0D7]={
+ [0x18BCA]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0D7,
+ linebreak="al",
+ unicodeslot=0x18BCA,
},
- [0x1B0D8]={
+ [0x18BCB]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0D8,
+ linebreak="al",
+ unicodeslot=0x18BCB,
},
- [0x1B0D9]={
+ [0x18BCC]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0D9,
+ linebreak="al",
+ unicodeslot=0x18BCC,
},
- [0x1B0DA]={
+ [0x18BCD]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0DA,
+ linebreak="al",
+ unicodeslot=0x18BCD,
},
- [0x1B0DB]={
+ [0x18BCE]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0DB,
+ linebreak="al",
+ unicodeslot=0x18BCE,
},
- [0x1B0DC]={
+ [0x18BCF]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0DC,
+ linebreak="al",
+ unicodeslot=0x18BCF,
},
- [0x1B0DD]={
+ [0x18BD0]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0DD,
+ linebreak="al",
+ unicodeslot=0x18BD0,
},
- [0x1B0DE]={
+ [0x18BD1]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0DE,
+ linebreak="al",
+ unicodeslot=0x18BD1,
},
- [0x1B0DF]={
+ [0x18BD2]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0DF,
+ linebreak="al",
+ unicodeslot=0x18BD2,
},
- [0x1B0E0]={
+ [0x18BD3]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0E0,
+ linebreak="al",
+ unicodeslot=0x18BD3,
},
- [0x1B0E1]={
+ [0x18BD4]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0E1,
+ linebreak="al",
+ unicodeslot=0x18BD4,
},
- [0x1B0E2]={
+ [0x18BD5]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0E2,
+ linebreak="al",
+ unicodeslot=0x18BD5,
},
- [0x1B0E3]={
+ [0x18BD6]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0E3,
+ linebreak="al",
+ unicodeslot=0x18BD6,
},
- [0x1B0E4]={
+ [0x18BD7]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0E4,
+ linebreak="al",
+ unicodeslot=0x18BD7,
},
- [0x1B0E5]={
+ [0x18BD8]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0E5,
+ linebreak="al",
+ unicodeslot=0x18BD8,
},
- [0x1B0E6]={
+ [0x18BD9]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0E6,
+ linebreak="al",
+ unicodeslot=0x18BD9,
},
- [0x1B0E7]={
+ [0x18BDA]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0E7,
+ linebreak="al",
+ unicodeslot=0x18BDA,
},
- [0x1B0E8]={
+ [0x18BDB]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0E8,
+ linebreak="al",
+ unicodeslot=0x18BDB,
},
- [0x1B0E9]={
+ [0x18BDC]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0E9,
+ linebreak="al",
+ unicodeslot=0x18BDC,
},
- [0x1B0EA]={
+ [0x18BDD]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0EA,
+ linebreak="al",
+ unicodeslot=0x18BDD,
},
- [0x1B0EB]={
+ [0x18BDE]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0EB,
+ linebreak="al",
+ unicodeslot=0x18BDE,
},
- [0x1B0EC]={
+ [0x18BDF]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0EC,
+ linebreak="al",
+ unicodeslot=0x18BDF,
},
- [0x1B0ED]={
+ [0x18BE0]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0ED,
+ linebreak="al",
+ unicodeslot=0x18BE0,
},
- [0x1B0EE]={
+ [0x18BE1]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0EE,
+ linebreak="al",
+ unicodeslot=0x18BE1,
},
- [0x1B0EF]={
+ [0x18BE2]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0EF,
+ linebreak="al",
+ unicodeslot=0x18BE2,
},
- [0x1B0F0]={
+ [0x18BE3]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0F0,
+ linebreak="al",
+ unicodeslot=0x18BE3,
},
- [0x1B0F1]={
+ [0x18BE4]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0F1,
+ linebreak="al",
+ unicodeslot=0x18BE4,
},
- [0x1B0F2]={
+ [0x18BE5]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0F2,
+ linebreak="al",
+ unicodeslot=0x18BE5,
},
- [0x1B0F3]={
+ [0x18BE6]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0F3,
+ linebreak="al",
+ unicodeslot=0x18BE6,
},
- [0x1B0F4]={
+ [0x18BE7]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0F4,
+ linebreak="al",
+ unicodeslot=0x18BE7,
},
- [0x1B0F5]={
+ [0x18BE8]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0F5,
+ linebreak="al",
+ unicodeslot=0x18BE8,
},
- [0x1B0F6]={
+ [0x18BE9]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0F6,
+ linebreak="al",
+ unicodeslot=0x18BE9,
},
- [0x1B0F7]={
+ [0x18BEA]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0F7,
+ linebreak="al",
+ unicodeslot=0x18BEA,
},
- [0x1B0F8]={
+ [0x18BEB]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0F8,
+ linebreak="al",
+ unicodeslot=0x18BEB,
},
- [0x1B0F9]={
+ [0x18BEC]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0F9,
+ linebreak="al",
+ unicodeslot=0x18BEC,
},
- [0x1B0FA]={
+ [0x18BED]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0FA,
+ linebreak="al",
+ unicodeslot=0x18BED,
},
- [0x1B0FB]={
+ [0x18BEE]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0FB,
+ linebreak="al",
+ unicodeslot=0x18BEE,
},
- [0x1B0FC]={
+ [0x18BEF]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0FC,
+ linebreak="al",
+ unicodeslot=0x18BEF,
},
- [0x1B0FD]={
+ [0x18BF0]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0FD,
+ linebreak="al",
+ unicodeslot=0x18BF0,
},
- [0x1B0FE]={
+ [0x18BF1]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0FE,
+ linebreak="al",
+ unicodeslot=0x18BF1,
},
- [0x1B0FF]={
+ [0x18BF2]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B0FF,
+ linebreak="al",
+ unicodeslot=0x18BF2,
},
- [0x1B100]={
+ [0x18BF3]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B100,
+ linebreak="al",
+ unicodeslot=0x18BF3,
},
- [0x1B101]={
+ [0x18BF4]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B101,
+ linebreak="al",
+ unicodeslot=0x18BF4,
},
- [0x1B102]={
+ [0x18BF5]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B102,
+ linebreak="al",
+ unicodeslot=0x18BF5,
},
- [0x1B103]={
+ [0x18BF6]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B103,
+ linebreak="al",
+ unicodeslot=0x18BF6,
},
- [0x1B104]={
+ [0x18BF7]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B104,
+ linebreak="al",
+ unicodeslot=0x18BF7,
},
- [0x1B105]={
+ [0x18BF8]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B105,
+ linebreak="al",
+ unicodeslot=0x18BF8,
},
- [0x1B106]={
+ [0x18BF9]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B106,
+ linebreak="al",
+ unicodeslot=0x18BF9,
},
- [0x1B107]={
+ [0x18BFA]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B107,
+ linebreak="al",
+ unicodeslot=0x18BFA,
},
- [0x1B108]={
+ [0x18BFB]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B108,
+ linebreak="al",
+ unicodeslot=0x18BFB,
},
- [0x1B109]={
+ [0x18BFC]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B109,
+ linebreak="al",
+ unicodeslot=0x18BFC,
},
- [0x1B10A]={
+ [0x18BFD]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B10A,
+ linebreak="al",
+ unicodeslot=0x18BFD,
},
- [0x1B10B]={
+ [0x18BFE]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B10B,
+ linebreak="al",
+ unicodeslot=0x18BFE,
},
- [0x1B10C]={
+ [0x18BFF]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B10C,
+ linebreak="al",
+ unicodeslot=0x18BFF,
},
- [0x1B10D]={
+ [0x18C00]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B10D,
+ linebreak="al",
+ unicodeslot=0x18C00,
},
- [0x1B10E]={
+ [0x18C01]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B10E,
+ linebreak="al",
+ unicodeslot=0x18C01,
},
- [0x1B10F]={
+ [0x18C02]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B10F,
+ linebreak="al",
+ unicodeslot=0x18C02,
},
- [0x1B110]={
+ [0x18C03]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B110,
+ linebreak="al",
+ unicodeslot=0x18C03,
},
- [0x1B111]={
+ [0x18C04]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B111,
+ linebreak="al",
+ unicodeslot=0x18C04,
},
- [0x1B112]={
+ [0x18C05]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B112,
+ linebreak="al",
+ unicodeslot=0x18C05,
},
- [0x1B113]={
+ [0x18C06]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B113,
+ linebreak="al",
+ unicodeslot=0x18C06,
},
- [0x1B114]={
+ [0x18C07]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B114,
+ linebreak="al",
+ unicodeslot=0x18C07,
},
- [0x1B115]={
+ [0x18C08]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B115,
+ linebreak="al",
+ unicodeslot=0x18C08,
},
- [0x1B116]={
+ [0x18C09]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B116,
+ linebreak="al",
+ unicodeslot=0x18C09,
},
- [0x1B117]={
+ [0x18C0A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B117,
+ linebreak="al",
+ unicodeslot=0x18C0A,
},
- [0x1B118]={
+ [0x18C0B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B118,
+ linebreak="al",
+ unicodeslot=0x18C0B,
},
- [0x1B119]={
+ [0x18C0C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B119,
+ linebreak="al",
+ unicodeslot=0x18C0C,
},
- [0x1B11A]={
+ [0x18C0D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B11A,
+ linebreak="al",
+ unicodeslot=0x18C0D,
},
- [0x1B11B]={
+ [0x18C0E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B11B,
+ linebreak="al",
+ unicodeslot=0x18C0E,
},
- [0x1B11C]={
+ [0x18C0F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B11C,
+ linebreak="al",
+ unicodeslot=0x18C0F,
},
- [0x1B11D]={
+ [0x18C10]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B11D,
+ linebreak="al",
+ unicodeslot=0x18C10,
},
- [0x1B11E]={
+ [0x18C11]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B11E,
+ linebreak="al",
+ unicodeslot=0x18C11,
},
- [0x1B150]={
+ [0x18C12]={
category="lo",
direction="l",
- linebreak="cj",
- unicodeslot=0x1B150,
+ linebreak="al",
+ unicodeslot=0x18C12,
},
- [0x1B151]={
+ [0x18C13]={
category="lo",
direction="l",
- linebreak="cj",
- unicodeslot=0x1B151,
+ linebreak="al",
+ unicodeslot=0x18C13,
},
- [0x1B152]={
+ [0x18C14]={
category="lo",
direction="l",
- linebreak="cj",
- unicodeslot=0x1B152,
+ linebreak="al",
+ unicodeslot=0x18C14,
},
- [0x1B164]={
+ [0x18C15]={
category="lo",
direction="l",
- linebreak="cj",
- unicodeslot=0x1B164,
+ linebreak="al",
+ unicodeslot=0x18C15,
},
- [0x1B165]={
+ [0x18C16]={
category="lo",
direction="l",
- linebreak="cj",
- unicodeslot=0x1B165,
+ linebreak="al",
+ unicodeslot=0x18C16,
},
- [0x1B166]={
+ [0x18C17]={
category="lo",
direction="l",
- linebreak="cj",
- unicodeslot=0x1B166,
+ linebreak="al",
+ unicodeslot=0x18C17,
},
- [0x1B167]={
+ [0x18C18]={
category="lo",
direction="l",
- linebreak="cj",
- unicodeslot=0x1B167,
+ linebreak="al",
+ unicodeslot=0x18C18,
},
- [0x1B170]={
+ [0x18C19]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B170,
+ linebreak="al",
+ unicodeslot=0x18C19,
},
- [0x1B171]={
+ [0x18C1A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B171,
+ linebreak="al",
+ unicodeslot=0x18C1A,
},
- [0x1B172]={
+ [0x18C1B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B172,
+ linebreak="al",
+ unicodeslot=0x18C1B,
},
- [0x1B173]={
+ [0x18C1C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B173,
+ linebreak="al",
+ unicodeslot=0x18C1C,
},
- [0x1B174]={
+ [0x18C1D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B174,
+ linebreak="al",
+ unicodeslot=0x18C1D,
},
- [0x1B175]={
+ [0x18C1E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B175,
+ linebreak="al",
+ unicodeslot=0x18C1E,
},
- [0x1B176]={
+ [0x18C1F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B176,
+ linebreak="al",
+ unicodeslot=0x18C1F,
},
- [0x1B177]={
+ [0x18C20]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B177,
+ linebreak="al",
+ unicodeslot=0x18C20,
},
- [0x1B178]={
+ [0x18C21]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B178,
+ linebreak="al",
+ unicodeslot=0x18C21,
},
- [0x1B179]={
+ [0x18C22]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B179,
+ linebreak="al",
+ unicodeslot=0x18C22,
},
- [0x1B17A]={
+ [0x18C23]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B17A,
+ linebreak="al",
+ unicodeslot=0x18C23,
},
- [0x1B17B]={
+ [0x18C24]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B17B,
+ linebreak="al",
+ unicodeslot=0x18C24,
},
- [0x1B17C]={
+ [0x18C25]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B17C,
+ linebreak="al",
+ unicodeslot=0x18C25,
},
- [0x1B17D]={
+ [0x18C26]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B17D,
+ linebreak="al",
+ unicodeslot=0x18C26,
},
- [0x1B17E]={
+ [0x18C27]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B17E,
+ linebreak="al",
+ unicodeslot=0x18C27,
},
- [0x1B17F]={
+ [0x18C28]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B17F,
+ linebreak="al",
+ unicodeslot=0x18C28,
},
- [0x1B180]={
+ [0x18C29]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B180,
+ linebreak="al",
+ unicodeslot=0x18C29,
},
- [0x1B181]={
+ [0x18C2A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B181,
+ linebreak="al",
+ unicodeslot=0x18C2A,
},
- [0x1B182]={
+ [0x18C2B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B182,
+ linebreak="al",
+ unicodeslot=0x18C2B,
},
- [0x1B183]={
+ [0x18C2C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B183,
+ linebreak="al",
+ unicodeslot=0x18C2C,
},
- [0x1B184]={
+ [0x18C2D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B184,
+ linebreak="al",
+ unicodeslot=0x18C2D,
},
- [0x1B185]={
+ [0x18C2E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B185,
+ linebreak="al",
+ unicodeslot=0x18C2E,
},
- [0x1B186]={
+ [0x18C2F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B186,
+ linebreak="al",
+ unicodeslot=0x18C2F,
},
- [0x1B187]={
+ [0x18C30]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B187,
+ linebreak="al",
+ unicodeslot=0x18C30,
},
- [0x1B188]={
+ [0x18C31]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B188,
+ linebreak="al",
+ unicodeslot=0x18C31,
},
- [0x1B189]={
+ [0x18C32]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B189,
+ linebreak="al",
+ unicodeslot=0x18C32,
},
- [0x1B18A]={
+ [0x18C33]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B18A,
+ linebreak="al",
+ unicodeslot=0x18C33,
},
- [0x1B18B]={
+ [0x18C34]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B18B,
+ linebreak="al",
+ unicodeslot=0x18C34,
},
- [0x1B18C]={
+ [0x18C35]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B18C,
+ linebreak="al",
+ unicodeslot=0x18C35,
},
- [0x1B18D]={
+ [0x18C36]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B18D,
+ linebreak="al",
+ unicodeslot=0x18C36,
},
- [0x1B18E]={
+ [0x18C37]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B18E,
+ linebreak="al",
+ unicodeslot=0x18C37,
},
- [0x1B18F]={
+ [0x18C38]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B18F,
+ linebreak="al",
+ unicodeslot=0x18C38,
},
- [0x1B190]={
+ [0x18C39]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B190,
+ linebreak="al",
+ unicodeslot=0x18C39,
},
- [0x1B191]={
+ [0x18C3A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B191,
+ linebreak="al",
+ unicodeslot=0x18C3A,
},
- [0x1B192]={
+ [0x18C3B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B192,
+ linebreak="al",
+ unicodeslot=0x18C3B,
},
- [0x1B193]={
+ [0x18C3C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B193,
+ linebreak="al",
+ unicodeslot=0x18C3C,
},
- [0x1B194]={
+ [0x18C3D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B194,
+ linebreak="al",
+ unicodeslot=0x18C3D,
},
- [0x1B195]={
+ [0x18C3E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B195,
+ linebreak="al",
+ unicodeslot=0x18C3E,
},
- [0x1B196]={
+ [0x18C3F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B196,
+ linebreak="al",
+ unicodeslot=0x18C3F,
},
- [0x1B197]={
+ [0x18C40]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B197,
+ linebreak="al",
+ unicodeslot=0x18C40,
},
- [0x1B198]={
+ [0x18C41]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B198,
+ linebreak="al",
+ unicodeslot=0x18C41,
},
- [0x1B199]={
+ [0x18C42]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B199,
+ linebreak="al",
+ unicodeslot=0x18C42,
},
- [0x1B19A]={
+ [0x18C43]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B19A,
+ linebreak="al",
+ unicodeslot=0x18C43,
},
- [0x1B19B]={
+ [0x18C44]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B19B,
+ linebreak="al",
+ unicodeslot=0x18C44,
},
- [0x1B19C]={
+ [0x18C45]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B19C,
+ linebreak="al",
+ unicodeslot=0x18C45,
},
- [0x1B19D]={
+ [0x18C46]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B19D,
+ linebreak="al",
+ unicodeslot=0x18C46,
},
- [0x1B19E]={
+ [0x18C47]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B19E,
+ linebreak="al",
+ unicodeslot=0x18C47,
},
- [0x1B19F]={
+ [0x18C48]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B19F,
+ linebreak="al",
+ unicodeslot=0x18C48,
},
- [0x1B1A0]={
+ [0x18C49]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1A0,
+ linebreak="al",
+ unicodeslot=0x18C49,
},
- [0x1B1A1]={
+ [0x18C4A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1A1,
+ linebreak="al",
+ unicodeslot=0x18C4A,
},
- [0x1B1A2]={
+ [0x18C4B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1A2,
+ linebreak="al",
+ unicodeslot=0x18C4B,
},
- [0x1B1A3]={
+ [0x18C4C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1A3,
+ linebreak="al",
+ unicodeslot=0x18C4C,
},
- [0x1B1A4]={
+ [0x18C4D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1A4,
+ linebreak="al",
+ unicodeslot=0x18C4D,
},
- [0x1B1A5]={
+ [0x18C4E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1A5,
+ linebreak="al",
+ unicodeslot=0x18C4E,
},
- [0x1B1A6]={
+ [0x18C4F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1A6,
+ linebreak="al",
+ unicodeslot=0x18C4F,
},
- [0x1B1A7]={
+ [0x18C50]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1A7,
+ linebreak="al",
+ unicodeslot=0x18C50,
},
- [0x1B1A8]={
+ [0x18C51]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1A8,
+ linebreak="al",
+ unicodeslot=0x18C51,
},
- [0x1B1A9]={
+ [0x18C52]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1A9,
+ linebreak="al",
+ unicodeslot=0x18C52,
},
- [0x1B1AA]={
+ [0x18C53]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1AA,
+ linebreak="al",
+ unicodeslot=0x18C53,
},
- [0x1B1AB]={
+ [0x18C54]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1AB,
+ linebreak="al",
+ unicodeslot=0x18C54,
},
- [0x1B1AC]={
+ [0x18C55]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1AC,
+ linebreak="al",
+ unicodeslot=0x18C55,
},
- [0x1B1AD]={
+ [0x18C56]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1AD,
+ linebreak="al",
+ unicodeslot=0x18C56,
},
- [0x1B1AE]={
+ [0x18C57]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1AE,
+ linebreak="al",
+ unicodeslot=0x18C57,
},
- [0x1B1AF]={
+ [0x18C58]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1AF,
+ linebreak="al",
+ unicodeslot=0x18C58,
},
- [0x1B1B0]={
+ [0x18C59]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1B0,
+ linebreak="al",
+ unicodeslot=0x18C59,
},
- [0x1B1B1]={
+ [0x18C5A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1B1,
+ linebreak="al",
+ unicodeslot=0x18C5A,
},
- [0x1B1B2]={
+ [0x18C5B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1B2,
+ linebreak="al",
+ unicodeslot=0x18C5B,
},
- [0x1B1B3]={
+ [0x18C5C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1B3,
+ linebreak="al",
+ unicodeslot=0x18C5C,
},
- [0x1B1B4]={
+ [0x18C5D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1B4,
+ linebreak="al",
+ unicodeslot=0x18C5D,
},
- [0x1B1B5]={
+ [0x18C5E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1B5,
+ linebreak="al",
+ unicodeslot=0x18C5E,
},
- [0x1B1B6]={
+ [0x18C5F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1B6,
+ linebreak="al",
+ unicodeslot=0x18C5F,
},
- [0x1B1B7]={
+ [0x18C60]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1B7,
+ linebreak="al",
+ unicodeslot=0x18C60,
},
- [0x1B1B8]={
+ [0x18C61]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1B8,
+ linebreak="al",
+ unicodeslot=0x18C61,
},
- [0x1B1B9]={
+ [0x18C62]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1B9,
+ linebreak="al",
+ unicodeslot=0x18C62,
},
- [0x1B1BA]={
+ [0x18C63]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1BA,
+ linebreak="al",
+ unicodeslot=0x18C63,
},
- [0x1B1BB]={
+ [0x18C64]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1BB,
+ linebreak="al",
+ unicodeslot=0x18C64,
},
- [0x1B1BC]={
+ [0x18C65]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1BC,
+ linebreak="al",
+ unicodeslot=0x18C65,
},
- [0x1B1BD]={
+ [0x18C66]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1BD,
+ linebreak="al",
+ unicodeslot=0x18C66,
},
- [0x1B1BE]={
+ [0x18C67]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1BE,
+ linebreak="al",
+ unicodeslot=0x18C67,
},
- [0x1B1BF]={
+ [0x18C68]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1BF,
+ linebreak="al",
+ unicodeslot=0x18C68,
},
- [0x1B1C0]={
+ [0x18C69]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1C0,
+ linebreak="al",
+ unicodeslot=0x18C69,
},
- [0x1B1C1]={
+ [0x18C6A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1C1,
+ linebreak="al",
+ unicodeslot=0x18C6A,
},
- [0x1B1C2]={
+ [0x18C6B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1C2,
+ linebreak="al",
+ unicodeslot=0x18C6B,
},
- [0x1B1C3]={
+ [0x18C6C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1C3,
+ linebreak="al",
+ unicodeslot=0x18C6C,
},
- [0x1B1C4]={
+ [0x18C6D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1C4,
+ linebreak="al",
+ unicodeslot=0x18C6D,
},
- [0x1B1C5]={
+ [0x18C6E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1C5,
+ linebreak="al",
+ unicodeslot=0x18C6E,
},
- [0x1B1C6]={
+ [0x18C6F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1C6,
+ linebreak="al",
+ unicodeslot=0x18C6F,
},
- [0x1B1C7]={
+ [0x18C70]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1C7,
+ linebreak="al",
+ unicodeslot=0x18C70,
},
- [0x1B1C8]={
+ [0x18C71]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1C8,
+ linebreak="al",
+ unicodeslot=0x18C71,
},
- [0x1B1C9]={
+ [0x18C72]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1C9,
+ linebreak="al",
+ unicodeslot=0x18C72,
},
- [0x1B1CA]={
+ [0x18C73]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1CA,
+ linebreak="al",
+ unicodeslot=0x18C73,
},
- [0x1B1CB]={
+ [0x18C74]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1CB,
+ linebreak="al",
+ unicodeslot=0x18C74,
},
- [0x1B1CC]={
+ [0x18C75]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1CC,
+ linebreak="al",
+ unicodeslot=0x18C75,
},
- [0x1B1CD]={
+ [0x18C76]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1CD,
+ linebreak="al",
+ unicodeslot=0x18C76,
},
- [0x1B1CE]={
+ [0x18C77]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1CE,
+ linebreak="al",
+ unicodeslot=0x18C77,
},
- [0x1B1CF]={
+ [0x18C78]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1CF,
+ linebreak="al",
+ unicodeslot=0x18C78,
},
- [0x1B1D0]={
+ [0x18C79]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1D0,
+ linebreak="al",
+ unicodeslot=0x18C79,
},
- [0x1B1D1]={
+ [0x18C7A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1D1,
+ linebreak="al",
+ unicodeslot=0x18C7A,
},
- [0x1B1D2]={
+ [0x18C7B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1D2,
+ linebreak="al",
+ unicodeslot=0x18C7B,
},
- [0x1B1D3]={
+ [0x18C7C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1D3,
+ linebreak="al",
+ unicodeslot=0x18C7C,
},
- [0x1B1D4]={
+ [0x18C7D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1D4,
+ linebreak="al",
+ unicodeslot=0x18C7D,
},
- [0x1B1D5]={
+ [0x18C7E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1D5,
+ linebreak="al",
+ unicodeslot=0x18C7E,
},
- [0x1B1D6]={
+ [0x18C7F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1D6,
+ linebreak="al",
+ unicodeslot=0x18C7F,
},
- [0x1B1D7]={
+ [0x18C80]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1D7,
+ linebreak="al",
+ unicodeslot=0x18C80,
},
- [0x1B1D8]={
+ [0x18C81]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1D8,
+ linebreak="al",
+ unicodeslot=0x18C81,
},
- [0x1B1D9]={
+ [0x18C82]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1D9,
+ linebreak="al",
+ unicodeslot=0x18C82,
},
- [0x1B1DA]={
+ [0x18C83]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1DA,
+ linebreak="al",
+ unicodeslot=0x18C83,
},
- [0x1B1DB]={
+ [0x18C84]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1DB,
+ linebreak="al",
+ unicodeslot=0x18C84,
},
- [0x1B1DC]={
+ [0x18C85]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1DC,
+ linebreak="al",
+ unicodeslot=0x18C85,
},
- [0x1B1DD]={
+ [0x18C86]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1DD,
+ linebreak="al",
+ unicodeslot=0x18C86,
},
- [0x1B1DE]={
+ [0x18C87]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1DE,
+ linebreak="al",
+ unicodeslot=0x18C87,
},
- [0x1B1DF]={
+ [0x18C88]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1DF,
+ linebreak="al",
+ unicodeslot=0x18C88,
},
- [0x1B1E0]={
+ [0x18C89]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1E0,
+ linebreak="al",
+ unicodeslot=0x18C89,
},
- [0x1B1E1]={
+ [0x18C8A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1E1,
+ linebreak="al",
+ unicodeslot=0x18C8A,
},
- [0x1B1E2]={
+ [0x18C8B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1E2,
+ linebreak="al",
+ unicodeslot=0x18C8B,
},
- [0x1B1E3]={
+ [0x18C8C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1E3,
+ linebreak="al",
+ unicodeslot=0x18C8C,
},
- [0x1B1E4]={
+ [0x18C8D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1E4,
+ linebreak="al",
+ unicodeslot=0x18C8D,
},
- [0x1B1E5]={
+ [0x18C8E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1E5,
+ linebreak="al",
+ unicodeslot=0x18C8E,
},
- [0x1B1E6]={
+ [0x18C8F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1E6,
+ linebreak="al",
+ unicodeslot=0x18C8F,
},
- [0x1B1E7]={
+ [0x18C90]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1E7,
+ linebreak="al",
+ unicodeslot=0x18C90,
},
- [0x1B1E8]={
+ [0x18C91]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1E8,
+ linebreak="al",
+ unicodeslot=0x18C91,
},
- [0x1B1E9]={
+ [0x18C92]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1E9,
+ linebreak="al",
+ unicodeslot=0x18C92,
},
- [0x1B1EA]={
+ [0x18C93]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1EA,
+ linebreak="al",
+ unicodeslot=0x18C93,
},
- [0x1B1EB]={
+ [0x18C94]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1EB,
+ linebreak="al",
+ unicodeslot=0x18C94,
},
- [0x1B1EC]={
+ [0x18C95]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1EC,
+ linebreak="al",
+ unicodeslot=0x18C95,
},
- [0x1B1ED]={
+ [0x18C96]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1ED,
+ linebreak="al",
+ unicodeslot=0x18C96,
},
- [0x1B1EE]={
+ [0x18C97]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1EE,
+ linebreak="al",
+ unicodeslot=0x18C97,
},
- [0x1B1EF]={
+ [0x18C98]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1EF,
+ linebreak="al",
+ unicodeslot=0x18C98,
},
- [0x1B1F0]={
+ [0x18C99]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1F0,
+ linebreak="al",
+ unicodeslot=0x18C99,
},
- [0x1B1F1]={
+ [0x18C9A]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1F1,
+ linebreak="al",
+ unicodeslot=0x18C9A,
},
- [0x1B1F2]={
+ [0x18C9B]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1F2,
+ linebreak="al",
+ unicodeslot=0x18C9B,
},
- [0x1B1F3]={
+ [0x18C9C]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1F3,
+ linebreak="al",
+ unicodeslot=0x18C9C,
},
- [0x1B1F4]={
+ [0x18C9D]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1F4,
+ linebreak="al",
+ unicodeslot=0x18C9D,
},
- [0x1B1F5]={
+ [0x18C9E]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1F5,
+ linebreak="al",
+ unicodeslot=0x18C9E,
},
- [0x1B1F6]={
+ [0x18C9F]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1F6,
+ linebreak="al",
+ unicodeslot=0x18C9F,
},
- [0x1B1F7]={
+ [0x18CA0]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1F7,
+ linebreak="al",
+ unicodeslot=0x18CA0,
},
- [0x1B1F8]={
+ [0x18CA1]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1F8,
+ linebreak="al",
+ unicodeslot=0x18CA1,
},
- [0x1B1F9]={
+ [0x18CA2]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1F9,
+ linebreak="al",
+ unicodeslot=0x18CA2,
},
- [0x1B1FA]={
+ [0x18CA3]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1FA,
+ linebreak="al",
+ unicodeslot=0x18CA3,
},
- [0x1B1FB]={
+ [0x18CA4]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1FB,
+ linebreak="al",
+ unicodeslot=0x18CA4,
},
- [0x1B1FC]={
+ [0x18CA5]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1FC,
+ linebreak="al",
+ unicodeslot=0x18CA5,
},
- [0x1B1FD]={
+ [0x18CA6]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1FD,
+ linebreak="al",
+ unicodeslot=0x18CA6,
},
- [0x1B1FE]={
+ [0x18CA7]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1FE,
+ linebreak="al",
+ unicodeslot=0x18CA7,
},
- [0x1B1FF]={
+ [0x18CA8]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B1FF,
+ linebreak="al",
+ unicodeslot=0x18CA8,
},
- [0x1B200]={
+ [0x18CA9]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B200,
+ linebreak="al",
+ unicodeslot=0x18CA9,
},
- [0x1B201]={
+ [0x18CAA]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B201,
+ linebreak="al",
+ unicodeslot=0x18CAA,
},
- [0x1B202]={
+ [0x18CAB]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B202,
+ linebreak="al",
+ unicodeslot=0x18CAB,
},
- [0x1B203]={
+ [0x18CAC]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B203,
+ linebreak="al",
+ unicodeslot=0x18CAC,
},
- [0x1B204]={
+ [0x18CAD]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B204,
+ linebreak="al",
+ unicodeslot=0x18CAD,
},
- [0x1B205]={
+ [0x18CAE]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B205,
+ linebreak="al",
+ unicodeslot=0x18CAE,
},
- [0x1B206]={
+ [0x18CAF]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B206,
+ linebreak="al",
+ unicodeslot=0x18CAF,
},
- [0x1B207]={
+ [0x18CB0]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B207,
+ linebreak="al",
+ unicodeslot=0x18CB0,
},
- [0x1B208]={
+ [0x18CB1]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B208,
+ linebreak="al",
+ unicodeslot=0x18CB1,
},
- [0x1B209]={
+ [0x18CB2]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B209,
+ linebreak="al",
+ unicodeslot=0x18CB2,
},
- [0x1B20A]={
+ [0x18CB3]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B20A,
+ linebreak="al",
+ unicodeslot=0x18CB3,
},
- [0x1B20B]={
+ [0x18CB4]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B20B,
+ linebreak="al",
+ unicodeslot=0x18CB4,
},
- [0x1B20C]={
+ [0x18CB5]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B20C,
+ linebreak="al",
+ unicodeslot=0x18CB5,
},
- [0x1B20D]={
+ [0x18CB6]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B20D,
+ linebreak="al",
+ unicodeslot=0x18CB6,
},
- [0x1B20E]={
+ [0x18CB7]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B20E,
+ linebreak="al",
+ unicodeslot=0x18CB7,
},
- [0x1B20F]={
+ [0x18CB8]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B20F,
+ linebreak="al",
+ unicodeslot=0x18CB8,
},
- [0x1B210]={
+ [0x18CB9]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B210,
+ linebreak="al",
+ unicodeslot=0x18CB9,
},
- [0x1B211]={
+ [0x18CBA]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B211,
+ linebreak="al",
+ unicodeslot=0x18CBA,
},
- [0x1B212]={
+ [0x18CBB]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B212,
+ linebreak="al",
+ unicodeslot=0x18CBB,
},
- [0x1B213]={
+ [0x18CBC]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B213,
+ linebreak="al",
+ unicodeslot=0x18CBC,
},
- [0x1B214]={
+ [0x18CBD]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B214,
+ linebreak="al",
+ unicodeslot=0x18CBD,
},
- [0x1B215]={
+ [0x18CBE]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B215,
+ linebreak="al",
+ unicodeslot=0x18CBE,
},
- [0x1B216]={
+ [0x18CBF]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B216,
+ linebreak="al",
+ unicodeslot=0x18CBF,
},
- [0x1B217]={
+ [0x18CC0]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B217,
+ linebreak="al",
+ unicodeslot=0x18CC0,
},
- [0x1B218]={
+ [0x18CC1]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B218,
+ linebreak="al",
+ unicodeslot=0x18CC1,
},
- [0x1B219]={
+ [0x18CC2]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B219,
+ linebreak="al",
+ unicodeslot=0x18CC2,
},
- [0x1B21A]={
+ [0x18CC3]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B21A,
+ linebreak="al",
+ unicodeslot=0x18CC3,
},
- [0x1B21B]={
+ [0x18CC4]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B21B,
+ linebreak="al",
+ unicodeslot=0x18CC4,
},
- [0x1B21C]={
+ [0x18CC5]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B21C,
+ linebreak="al",
+ unicodeslot=0x18CC5,
},
- [0x1B21D]={
+ [0x18CC6]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B21D,
+ linebreak="al",
+ unicodeslot=0x18CC6,
},
- [0x1B21E]={
+ [0x18CC7]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B21E,
+ linebreak="al",
+ unicodeslot=0x18CC7,
},
- [0x1B21F]={
+ [0x18CC8]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B21F,
+ linebreak="al",
+ unicodeslot=0x18CC8,
},
- [0x1B220]={
+ [0x18CC9]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B220,
+ linebreak="al",
+ unicodeslot=0x18CC9,
},
- [0x1B221]={
+ [0x18CCA]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B221,
+ linebreak="al",
+ unicodeslot=0x18CCA,
},
- [0x1B222]={
+ [0x18CCB]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B222,
+ linebreak="al",
+ unicodeslot=0x18CCB,
},
- [0x1B223]={
+ [0x18CCC]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B223,
+ linebreak="al",
+ unicodeslot=0x18CCC,
},
- [0x1B224]={
+ [0x18CCD]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B224,
+ linebreak="al",
+ unicodeslot=0x18CCD,
},
- [0x1B225]={
+ [0x18CCE]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B225,
+ linebreak="al",
+ unicodeslot=0x18CCE,
},
- [0x1B226]={
+ [0x18CCF]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B226,
+ linebreak="al",
+ unicodeslot=0x18CCF,
},
- [0x1B227]={
+ [0x18CD0]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B227,
+ linebreak="al",
+ unicodeslot=0x18CD0,
},
- [0x1B228]={
+ [0x18CD1]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B228,
+ linebreak="al",
+ unicodeslot=0x18CD1,
},
- [0x1B229]={
+ [0x18CD2]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B229,
+ linebreak="al",
+ unicodeslot=0x18CD2,
},
- [0x1B22A]={
+ [0x18CD3]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B22A,
+ linebreak="al",
+ unicodeslot=0x18CD3,
},
- [0x1B22B]={
+ [0x18CD4]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B22B,
+ linebreak="al",
+ unicodeslot=0x18CD4,
},
- [0x1B22C]={
+ [0x18CD5]={
category="lo",
direction="l",
- linebreak="id",
- unicodeslot=0x1B22C,
+ linebreak="al",
+ unicodeslot=0x18CD5,
},
- [0x1B22D]={
+ [0x1B000]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B22D,
+ unicodeslot=0x1B000,
},
- [0x1B22E]={
+ [0x1B001]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B22E,
+ unicodeslot=0x1B001,
},
- [0x1B22F]={
+ [0x1B002]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B22F,
+ unicodeslot=0x1B002,
},
- [0x1B230]={
+ [0x1B003]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B230,
+ unicodeslot=0x1B003,
},
- [0x1B231]={
+ [0x1B004]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B231,
+ unicodeslot=0x1B004,
},
- [0x1B232]={
+ [0x1B005]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B232,
+ unicodeslot=0x1B005,
},
- [0x1B233]={
+ [0x1B006]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B233,
+ unicodeslot=0x1B006,
},
- [0x1B234]={
+ [0x1B007]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B234,
+ unicodeslot=0x1B007,
},
- [0x1B235]={
+ [0x1B008]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B235,
+ unicodeslot=0x1B008,
},
- [0x1B236]={
+ [0x1B009]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B236,
+ unicodeslot=0x1B009,
},
- [0x1B237]={
+ [0x1B00A]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B237,
+ unicodeslot=0x1B00A,
},
- [0x1B238]={
+ [0x1B00B]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B238,
+ unicodeslot=0x1B00B,
},
- [0x1B239]={
+ [0x1B00C]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B239,
+ unicodeslot=0x1B00C,
},
- [0x1B23A]={
+ [0x1B00D]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B23A,
+ unicodeslot=0x1B00D,
},
- [0x1B23B]={
+ [0x1B00E]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B23B,
+ unicodeslot=0x1B00E,
},
- [0x1B23C]={
+ [0x1B00F]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B23C,
+ unicodeslot=0x1B00F,
},
- [0x1B23D]={
+ [0x1B010]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B23D,
+ unicodeslot=0x1B010,
},
- [0x1B23E]={
+ [0x1B011]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B23E,
+ unicodeslot=0x1B011,
},
- [0x1B23F]={
+ [0x1B012]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B23F,
+ unicodeslot=0x1B012,
},
- [0x1B240]={
+ [0x1B013]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B240,
+ unicodeslot=0x1B013,
},
- [0x1B241]={
+ [0x1B014]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B241,
+ unicodeslot=0x1B014,
},
- [0x1B242]={
+ [0x1B015]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B242,
+ unicodeslot=0x1B015,
},
- [0x1B243]={
+ [0x1B016]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B243,
+ unicodeslot=0x1B016,
},
- [0x1B244]={
+ [0x1B017]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B244,
+ unicodeslot=0x1B017,
},
- [0x1B245]={
+ [0x1B018]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B245,
+ unicodeslot=0x1B018,
},
- [0x1B246]={
+ [0x1B019]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B246,
+ unicodeslot=0x1B019,
},
- [0x1B247]={
+ [0x1B01A]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B247,
+ unicodeslot=0x1B01A,
},
- [0x1B248]={
+ [0x1B01B]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B248,
+ unicodeslot=0x1B01B,
},
- [0x1B249]={
+ [0x1B01C]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B249,
+ unicodeslot=0x1B01C,
},
- [0x1B24A]={
+ [0x1B01D]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B24A,
+ unicodeslot=0x1B01D,
},
- [0x1B24B]={
+ [0x1B01E]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B24B,
+ unicodeslot=0x1B01E,
},
- [0x1B24C]={
+ [0x1B01F]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B24C,
+ unicodeslot=0x1B01F,
},
- [0x1B24D]={
+ [0x1B020]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B24D,
+ unicodeslot=0x1B020,
},
- [0x1B24E]={
+ [0x1B021]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B24E,
+ unicodeslot=0x1B021,
},
- [0x1B24F]={
+ [0x1B022]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B24F,
+ unicodeslot=0x1B022,
},
- [0x1B250]={
+ [0x1B023]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B250,
+ unicodeslot=0x1B023,
},
- [0x1B251]={
+ [0x1B024]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B251,
+ unicodeslot=0x1B024,
},
- [0x1B252]={
+ [0x1B025]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B252,
+ unicodeslot=0x1B025,
},
- [0x1B253]={
+ [0x1B026]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B253,
+ unicodeslot=0x1B026,
},
- [0x1B254]={
+ [0x1B027]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B254,
+ unicodeslot=0x1B027,
},
- [0x1B255]={
+ [0x1B028]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B255,
+ unicodeslot=0x1B028,
},
- [0x1B256]={
+ [0x1B029]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B256,
+ unicodeslot=0x1B029,
},
- [0x1B257]={
+ [0x1B02A]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B257,
+ unicodeslot=0x1B02A,
},
- [0x1B258]={
+ [0x1B02B]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B258,
+ unicodeslot=0x1B02B,
},
- [0x1B259]={
+ [0x1B02C]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B259,
+ unicodeslot=0x1B02C,
},
- [0x1B25A]={
+ [0x1B02D]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B25A,
+ unicodeslot=0x1B02D,
},
- [0x1B25B]={
+ [0x1B02E]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B25B,
+ unicodeslot=0x1B02E,
},
- [0x1B25C]={
+ [0x1B02F]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B25C,
+ unicodeslot=0x1B02F,
},
- [0x1B25D]={
+ [0x1B030]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B25D,
+ unicodeslot=0x1B030,
},
- [0x1B25E]={
+ [0x1B031]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B25E,
+ unicodeslot=0x1B031,
},
- [0x1B25F]={
+ [0x1B032]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B25F,
+ unicodeslot=0x1B032,
},
- [0x1B260]={
+ [0x1B033]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B260,
+ unicodeslot=0x1B033,
},
- [0x1B261]={
+ [0x1B034]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B261,
+ unicodeslot=0x1B034,
},
- [0x1B262]={
+ [0x1B035]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B262,
+ unicodeslot=0x1B035,
},
- [0x1B263]={
+ [0x1B036]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B263,
+ unicodeslot=0x1B036,
},
- [0x1B264]={
+ [0x1B037]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B264,
+ unicodeslot=0x1B037,
},
- [0x1B265]={
+ [0x1B038]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B265,
+ unicodeslot=0x1B038,
},
- [0x1B266]={
+ [0x1B039]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B266,
+ unicodeslot=0x1B039,
},
- [0x1B267]={
+ [0x1B03A]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B267,
+ unicodeslot=0x1B03A,
},
- [0x1B268]={
+ [0x1B03B]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B268,
+ unicodeslot=0x1B03B,
},
- [0x1B269]={
+ [0x1B03C]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B269,
+ unicodeslot=0x1B03C,
},
- [0x1B26A]={
+ [0x1B03D]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B26A,
+ unicodeslot=0x1B03D,
},
- [0x1B26B]={
+ [0x1B03E]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B26B,
+ unicodeslot=0x1B03E,
},
- [0x1B26C]={
+ [0x1B03F]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B26C,
+ unicodeslot=0x1B03F,
},
- [0x1B26D]={
+ [0x1B040]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B26D,
+ unicodeslot=0x1B040,
},
- [0x1B26E]={
+ [0x1B041]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B26E,
+ unicodeslot=0x1B041,
},
- [0x1B26F]={
+ [0x1B042]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B26F,
+ unicodeslot=0x1B042,
},
- [0x1B270]={
+ [0x1B043]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B270,
+ unicodeslot=0x1B043,
},
- [0x1B271]={
+ [0x1B044]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B271,
+ unicodeslot=0x1B044,
},
- [0x1B272]={
+ [0x1B045]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B272,
+ unicodeslot=0x1B045,
},
- [0x1B273]={
+ [0x1B046]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B273,
+ unicodeslot=0x1B046,
},
- [0x1B274]={
+ [0x1B047]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B274,
+ unicodeslot=0x1B047,
},
- [0x1B275]={
+ [0x1B048]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B275,
+ unicodeslot=0x1B048,
},
- [0x1B276]={
+ [0x1B049]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B276,
+ unicodeslot=0x1B049,
},
- [0x1B277]={
+ [0x1B04A]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B277,
+ unicodeslot=0x1B04A,
},
- [0x1B278]={
+ [0x1B04B]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B278,
+ unicodeslot=0x1B04B,
},
- [0x1B279]={
+ [0x1B04C]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B279,
+ unicodeslot=0x1B04C,
},
- [0x1B27A]={
+ [0x1B04D]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B27A,
+ unicodeslot=0x1B04D,
},
- [0x1B27B]={
+ [0x1B04E]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B27B,
+ unicodeslot=0x1B04E,
},
- [0x1B27C]={
+ [0x1B04F]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B27C,
+ unicodeslot=0x1B04F,
},
- [0x1B27D]={
+ [0x1B050]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B27D,
+ unicodeslot=0x1B050,
},
- [0x1B27E]={
+ [0x1B051]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B27E,
+ unicodeslot=0x1B051,
},
- [0x1B27F]={
+ [0x1B052]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B27F,
+ unicodeslot=0x1B052,
},
- [0x1B280]={
+ [0x1B053]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B280,
+ unicodeslot=0x1B053,
},
- [0x1B281]={
+ [0x1B054]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B281,
+ unicodeslot=0x1B054,
},
- [0x1B282]={
+ [0x1B055]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B282,
+ unicodeslot=0x1B055,
},
- [0x1B283]={
+ [0x1B056]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B283,
+ unicodeslot=0x1B056,
},
- [0x1B284]={
+ [0x1B057]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B284,
+ unicodeslot=0x1B057,
},
- [0x1B285]={
+ [0x1B058]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B285,
+ unicodeslot=0x1B058,
},
- [0x1B286]={
+ [0x1B059]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B286,
+ unicodeslot=0x1B059,
},
- [0x1B287]={
+ [0x1B05A]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B287,
+ unicodeslot=0x1B05A,
},
- [0x1B288]={
+ [0x1B05B]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B288,
+ unicodeslot=0x1B05B,
},
- [0x1B289]={
+ [0x1B05C]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B289,
+ unicodeslot=0x1B05C,
},
- [0x1B28A]={
+ [0x1B05D]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B28A,
+ unicodeslot=0x1B05D,
},
- [0x1B28B]={
+ [0x1B05E]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B28B,
+ unicodeslot=0x1B05E,
},
- [0x1B28C]={
+ [0x1B05F]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B28C,
+ unicodeslot=0x1B05F,
},
- [0x1B28D]={
+ [0x1B060]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B28D,
+ unicodeslot=0x1B060,
},
- [0x1B28E]={
+ [0x1B061]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B28E,
+ unicodeslot=0x1B061,
},
- [0x1B28F]={
+ [0x1B062]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B28F,
+ unicodeslot=0x1B062,
},
- [0x1B290]={
+ [0x1B063]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B290,
+ unicodeslot=0x1B063,
},
- [0x1B291]={
+ [0x1B064]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B291,
+ unicodeslot=0x1B064,
},
- [0x1B292]={
+ [0x1B065]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B292,
+ unicodeslot=0x1B065,
},
- [0x1B293]={
+ [0x1B066]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B293,
+ unicodeslot=0x1B066,
},
- [0x1B294]={
+ [0x1B067]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B294,
+ unicodeslot=0x1B067,
},
- [0x1B295]={
+ [0x1B068]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B295,
+ unicodeslot=0x1B068,
},
- [0x1B296]={
+ [0x1B069]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B296,
+ unicodeslot=0x1B069,
},
- [0x1B297]={
+ [0x1B06A]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B297,
+ unicodeslot=0x1B06A,
},
- [0x1B298]={
+ [0x1B06B]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B298,
+ unicodeslot=0x1B06B,
},
- [0x1B299]={
+ [0x1B06C]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B299,
+ unicodeslot=0x1B06C,
},
- [0x1B29A]={
+ [0x1B06D]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B29A,
+ unicodeslot=0x1B06D,
},
- [0x1B29B]={
+ [0x1B06E]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B29B,
+ unicodeslot=0x1B06E,
},
- [0x1B29C]={
+ [0x1B06F]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B29C,
+ unicodeslot=0x1B06F,
},
- [0x1B29D]={
+ [0x1B070]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B29D,
+ unicodeslot=0x1B070,
},
- [0x1B29E]={
+ [0x1B071]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B29E,
+ unicodeslot=0x1B071,
},
- [0x1B29F]={
+ [0x1B072]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B29F,
+ unicodeslot=0x1B072,
},
- [0x1B2A0]={
+ [0x1B073]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2A0,
+ unicodeslot=0x1B073,
},
- [0x1B2A1]={
+ [0x1B074]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2A1,
+ unicodeslot=0x1B074,
},
- [0x1B2A2]={
+ [0x1B075]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2A2,
+ unicodeslot=0x1B075,
},
- [0x1B2A3]={
+ [0x1B076]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2A3,
+ unicodeslot=0x1B076,
},
- [0x1B2A4]={
+ [0x1B077]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2A4,
+ unicodeslot=0x1B077,
},
- [0x1B2A5]={
+ [0x1B078]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2A5,
+ unicodeslot=0x1B078,
},
- [0x1B2A6]={
+ [0x1B079]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2A6,
+ unicodeslot=0x1B079,
},
- [0x1B2A7]={
+ [0x1B07A]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2A7,
+ unicodeslot=0x1B07A,
},
- [0x1B2A8]={
+ [0x1B07B]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2A8,
+ unicodeslot=0x1B07B,
},
- [0x1B2A9]={
+ [0x1B07C]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2A9,
+ unicodeslot=0x1B07C,
},
- [0x1B2AA]={
+ [0x1B07D]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2AA,
+ unicodeslot=0x1B07D,
},
- [0x1B2AB]={
+ [0x1B07E]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2AB,
+ unicodeslot=0x1B07E,
},
- [0x1B2AC]={
+ [0x1B07F]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2AC,
+ unicodeslot=0x1B07F,
},
- [0x1B2AD]={
+ [0x1B080]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2AD,
+ unicodeslot=0x1B080,
},
- [0x1B2AE]={
+ [0x1B081]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2AE,
+ unicodeslot=0x1B081,
},
- [0x1B2AF]={
+ [0x1B082]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2AF,
+ unicodeslot=0x1B082,
},
- [0x1B2B0]={
+ [0x1B083]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2B0,
+ unicodeslot=0x1B083,
},
- [0x1B2B1]={
+ [0x1B084]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2B1,
+ unicodeslot=0x1B084,
},
- [0x1B2B2]={
+ [0x1B085]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2B2,
+ unicodeslot=0x1B085,
},
- [0x1B2B3]={
+ [0x1B086]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2B3,
+ unicodeslot=0x1B086,
},
- [0x1B2B4]={
+ [0x1B087]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2B4,
+ unicodeslot=0x1B087,
},
- [0x1B2B5]={
+ [0x1B088]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2B5,
+ unicodeslot=0x1B088,
},
- [0x1B2B6]={
+ [0x1B089]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2B6,
+ unicodeslot=0x1B089,
},
- [0x1B2B7]={
+ [0x1B08A]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2B7,
+ unicodeslot=0x1B08A,
},
- [0x1B2B8]={
+ [0x1B08B]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2B8,
+ unicodeslot=0x1B08B,
},
- [0x1B2B9]={
+ [0x1B08C]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2B9,
+ unicodeslot=0x1B08C,
},
- [0x1B2BA]={
+ [0x1B08D]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2BA,
+ unicodeslot=0x1B08D,
},
- [0x1B2BB]={
+ [0x1B08E]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2BB,
+ unicodeslot=0x1B08E,
},
- [0x1B2BC]={
+ [0x1B08F]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2BC,
+ unicodeslot=0x1B08F,
},
- [0x1B2BD]={
+ [0x1B090]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2BD,
+ unicodeslot=0x1B090,
},
- [0x1B2BE]={
+ [0x1B091]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2BE,
+ unicodeslot=0x1B091,
},
- [0x1B2BF]={
+ [0x1B092]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2BF,
+ unicodeslot=0x1B092,
},
- [0x1B2C0]={
+ [0x1B093]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2C0,
+ unicodeslot=0x1B093,
},
- [0x1B2C1]={
+ [0x1B094]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2C1,
+ unicodeslot=0x1B094,
},
- [0x1B2C2]={
+ [0x1B095]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2C2,
+ unicodeslot=0x1B095,
},
- [0x1B2C3]={
+ [0x1B096]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2C3,
+ unicodeslot=0x1B096,
},
- [0x1B2C4]={
+ [0x1B097]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2C4,
+ unicodeslot=0x1B097,
},
- [0x1B2C5]={
+ [0x1B098]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2C5,
+ unicodeslot=0x1B098,
},
- [0x1B2C6]={
+ [0x1B099]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2C6,
+ unicodeslot=0x1B099,
},
- [0x1B2C7]={
+ [0x1B09A]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2C7,
+ unicodeslot=0x1B09A,
},
- [0x1B2C8]={
+ [0x1B09B]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2C8,
+ unicodeslot=0x1B09B,
},
- [0x1B2C9]={
+ [0x1B09C]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2C9,
+ unicodeslot=0x1B09C,
},
- [0x1B2CA]={
+ [0x1B09D]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2CA,
+ unicodeslot=0x1B09D,
},
- [0x1B2CB]={
+ [0x1B09E]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2CB,
+ unicodeslot=0x1B09E,
},
- [0x1B2CC]={
+ [0x1B09F]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2CC,
+ unicodeslot=0x1B09F,
},
- [0x1B2CD]={
+ [0x1B0A0]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2CD,
+ unicodeslot=0x1B0A0,
},
- [0x1B2CE]={
+ [0x1B0A1]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2CE,
+ unicodeslot=0x1B0A1,
},
- [0x1B2CF]={
+ [0x1B0A2]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2CF,
+ unicodeslot=0x1B0A2,
},
- [0x1B2D0]={
+ [0x1B0A3]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2D0,
+ unicodeslot=0x1B0A3,
},
- [0x1B2D1]={
+ [0x1B0A4]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2D1,
+ unicodeslot=0x1B0A4,
},
- [0x1B2D2]={
+ [0x1B0A5]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2D2,
+ unicodeslot=0x1B0A5,
},
- [0x1B2D3]={
+ [0x1B0A6]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2D3,
+ unicodeslot=0x1B0A6,
},
- [0x1B2D4]={
+ [0x1B0A7]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2D4,
+ unicodeslot=0x1B0A7,
},
- [0x1B2D5]={
+ [0x1B0A8]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2D5,
+ unicodeslot=0x1B0A8,
},
- [0x1B2D6]={
+ [0x1B0A9]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2D6,
+ unicodeslot=0x1B0A9,
},
- [0x1B2D7]={
+ [0x1B0AA]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2D7,
+ unicodeslot=0x1B0AA,
},
- [0x1B2D8]={
+ [0x1B0AB]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2D8,
+ unicodeslot=0x1B0AB,
},
- [0x1B2D9]={
+ [0x1B0AC]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2D9,
+ unicodeslot=0x1B0AC,
},
- [0x1B2DA]={
+ [0x1B0AD]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2DA,
+ unicodeslot=0x1B0AD,
},
- [0x1B2DB]={
+ [0x1B0AE]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2DB,
+ unicodeslot=0x1B0AE,
},
- [0x1B2DC]={
+ [0x1B0AF]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2DC,
+ unicodeslot=0x1B0AF,
},
- [0x1B2DD]={
+ [0x1B0B0]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2DD,
+ unicodeslot=0x1B0B0,
},
- [0x1B2DE]={
+ [0x1B0B1]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2DE,
+ unicodeslot=0x1B0B1,
},
- [0x1B2DF]={
+ [0x1B0B2]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2DF,
+ unicodeslot=0x1B0B2,
},
- [0x1B2E0]={
+ [0x1B0B3]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2E0,
+ unicodeslot=0x1B0B3,
},
- [0x1B2E1]={
+ [0x1B0B4]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2E1,
+ unicodeslot=0x1B0B4,
},
- [0x1B2E2]={
+ [0x1B0B5]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2E2,
+ unicodeslot=0x1B0B5,
},
- [0x1B2E3]={
+ [0x1B0B6]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2E3,
+ unicodeslot=0x1B0B6,
},
- [0x1B2E4]={
+ [0x1B0B7]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2E4,
+ unicodeslot=0x1B0B7,
},
- [0x1B2E5]={
+ [0x1B0B8]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2E5,
+ unicodeslot=0x1B0B8,
},
- [0x1B2E6]={
+ [0x1B0B9]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2E6,
+ unicodeslot=0x1B0B9,
},
- [0x1B2E7]={
+ [0x1B0BA]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2E7,
+ unicodeslot=0x1B0BA,
},
- [0x1B2E8]={
+ [0x1B0BB]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2E8,
+ unicodeslot=0x1B0BB,
},
- [0x1B2E9]={
+ [0x1B0BC]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2E9,
+ unicodeslot=0x1B0BC,
},
- [0x1B2EA]={
+ [0x1B0BD]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2EA,
+ unicodeslot=0x1B0BD,
},
- [0x1B2EB]={
+ [0x1B0BE]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2EB,
+ unicodeslot=0x1B0BE,
},
- [0x1B2EC]={
+ [0x1B0BF]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2EC,
+ unicodeslot=0x1B0BF,
},
- [0x1B2ED]={
+ [0x1B0C0]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2ED,
+ unicodeslot=0x1B0C0,
},
- [0x1B2EE]={
+ [0x1B0C1]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2EE,
+ unicodeslot=0x1B0C1,
},
- [0x1B2EF]={
+ [0x1B0C2]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2EF,
+ unicodeslot=0x1B0C2,
},
- [0x1B2F0]={
+ [0x1B0C3]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2F0,
+ unicodeslot=0x1B0C3,
},
- [0x1B2F1]={
+ [0x1B0C4]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2F1,
+ unicodeslot=0x1B0C4,
},
- [0x1B2F2]={
+ [0x1B0C5]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2F2,
+ unicodeslot=0x1B0C5,
},
- [0x1B2F3]={
+ [0x1B0C6]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2F3,
+ unicodeslot=0x1B0C6,
},
- [0x1B2F4]={
+ [0x1B0C7]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2F4,
+ unicodeslot=0x1B0C7,
},
- [0x1B2F5]={
+ [0x1B0C8]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2F5,
+ unicodeslot=0x1B0C8,
},
- [0x1B2F6]={
+ [0x1B0C9]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2F6,
+ unicodeslot=0x1B0C9,
},
- [0x1B2F7]={
+ [0x1B0CA]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2F7,
+ unicodeslot=0x1B0CA,
},
- [0x1B2F8]={
+ [0x1B0CB]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2F8,
+ unicodeslot=0x1B0CB,
},
- [0x1B2F9]={
+ [0x1B0CC]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2F9,
+ unicodeslot=0x1B0CC,
},
- [0x1B2FA]={
+ [0x1B0CD]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2FA,
+ unicodeslot=0x1B0CD,
},
- [0x1B2FB]={
+ [0x1B0CE]={
category="lo",
direction="l",
linebreak="id",
- unicodeslot=0x1B2FB,
+ unicodeslot=0x1B0CE,
},
- [0x1BC00]={
+ [0x1B0CF]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC00,
+ linebreak="id",
+ unicodeslot=0x1B0CF,
},
- [0x1BC01]={
+ [0x1B0D0]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC01,
+ linebreak="id",
+ unicodeslot=0x1B0D0,
},
- [0x1BC02]={
+ [0x1B0D1]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC02,
+ linebreak="id",
+ unicodeslot=0x1B0D1,
},
- [0x1BC03]={
+ [0x1B0D2]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC03,
+ linebreak="id",
+ unicodeslot=0x1B0D2,
},
- [0x1BC04]={
+ [0x1B0D3]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC04,
+ linebreak="id",
+ unicodeslot=0x1B0D3,
},
- [0x1BC05]={
+ [0x1B0D4]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC05,
+ linebreak="id",
+ unicodeslot=0x1B0D4,
},
- [0x1BC06]={
+ [0x1B0D5]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC06,
+ linebreak="id",
+ unicodeslot=0x1B0D5,
},
- [0x1BC07]={
+ [0x1B0D6]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC07,
+ linebreak="id",
+ unicodeslot=0x1B0D6,
},
- [0x1BC08]={
+ [0x1B0D7]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC08,
+ linebreak="id",
+ unicodeslot=0x1B0D7,
},
- [0x1BC09]={
+ [0x1B0D8]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC09,
+ linebreak="id",
+ unicodeslot=0x1B0D8,
},
- [0x1BC0A]={
+ [0x1B0D9]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC0A,
+ linebreak="id",
+ unicodeslot=0x1B0D9,
},
- [0x1BC0B]={
+ [0x1B0DA]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC0B,
+ linebreak="id",
+ unicodeslot=0x1B0DA,
},
- [0x1BC0C]={
+ [0x1B0DB]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC0C,
+ linebreak="id",
+ unicodeslot=0x1B0DB,
},
- [0x1BC0D]={
+ [0x1B0DC]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC0D,
+ linebreak="id",
+ unicodeslot=0x1B0DC,
},
- [0x1BC0E]={
+ [0x1B0DD]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC0E,
+ linebreak="id",
+ unicodeslot=0x1B0DD,
},
- [0x1BC0F]={
+ [0x1B0DE]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC0F,
+ linebreak="id",
+ unicodeslot=0x1B0DE,
},
- [0x1BC10]={
+ [0x1B0DF]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC10,
+ linebreak="id",
+ unicodeslot=0x1B0DF,
},
- [0x1BC11]={
+ [0x1B0E0]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC11,
+ linebreak="id",
+ unicodeslot=0x1B0E0,
},
- [0x1BC12]={
+ [0x1B0E1]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC12,
+ linebreak="id",
+ unicodeslot=0x1B0E1,
},
- [0x1BC13]={
+ [0x1B0E2]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC13,
+ linebreak="id",
+ unicodeslot=0x1B0E2,
},
- [0x1BC14]={
+ [0x1B0E3]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC14,
+ linebreak="id",
+ unicodeslot=0x1B0E3,
},
- [0x1BC15]={
+ [0x1B0E4]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC15,
+ linebreak="id",
+ unicodeslot=0x1B0E4,
},
- [0x1BC16]={
+ [0x1B0E5]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC16,
+ linebreak="id",
+ unicodeslot=0x1B0E5,
},
- [0x1BC17]={
+ [0x1B0E6]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC17,
+ linebreak="id",
+ unicodeslot=0x1B0E6,
},
- [0x1BC18]={
+ [0x1B0E7]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC18,
+ linebreak="id",
+ unicodeslot=0x1B0E7,
},
- [0x1BC19]={
+ [0x1B0E8]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC19,
+ linebreak="id",
+ unicodeslot=0x1B0E8,
},
- [0x1BC1A]={
+ [0x1B0E9]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC1A,
+ linebreak="id",
+ unicodeslot=0x1B0E9,
},
- [0x1BC1B]={
+ [0x1B0EA]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC1B,
+ linebreak="id",
+ unicodeslot=0x1B0EA,
},
- [0x1BC1C]={
+ [0x1B0EB]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC1C,
+ linebreak="id",
+ unicodeslot=0x1B0EB,
},
- [0x1BC1D]={
+ [0x1B0EC]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC1D,
+ linebreak="id",
+ unicodeslot=0x1B0EC,
},
- [0x1BC1E]={
+ [0x1B0ED]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC1E,
+ linebreak="id",
+ unicodeslot=0x1B0ED,
},
- [0x1BC1F]={
+ [0x1B0EE]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC1F,
+ linebreak="id",
+ unicodeslot=0x1B0EE,
},
- [0x1BC20]={
+ [0x1B0EF]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC20,
+ linebreak="id",
+ unicodeslot=0x1B0EF,
},
- [0x1BC21]={
+ [0x1B0F0]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC21,
+ linebreak="id",
+ unicodeslot=0x1B0F0,
},
- [0x1BC22]={
+ [0x1B0F1]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC22,
+ linebreak="id",
+ unicodeslot=0x1B0F1,
},
- [0x1BC23]={
+ [0x1B0F2]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC23,
+ linebreak="id",
+ unicodeslot=0x1B0F2,
},
- [0x1BC24]={
+ [0x1B0F3]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC24,
+ linebreak="id",
+ unicodeslot=0x1B0F3,
},
- [0x1BC25]={
+ [0x1B0F4]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC25,
+ linebreak="id",
+ unicodeslot=0x1B0F4,
},
- [0x1BC26]={
+ [0x1B0F5]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC26,
+ linebreak="id",
+ unicodeslot=0x1B0F5,
},
- [0x1BC27]={
+ [0x1B0F6]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC27,
+ linebreak="id",
+ unicodeslot=0x1B0F6,
},
- [0x1BC28]={
+ [0x1B0F7]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC28,
+ linebreak="id",
+ unicodeslot=0x1B0F7,
},
- [0x1BC29]={
+ [0x1B0F8]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC29,
+ linebreak="id",
+ unicodeslot=0x1B0F8,
},
- [0x1BC2A]={
+ [0x1B0F9]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC2A,
+ linebreak="id",
+ unicodeslot=0x1B0F9,
},
- [0x1BC2B]={
+ [0x1B0FA]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC2B,
+ linebreak="id",
+ unicodeslot=0x1B0FA,
},
- [0x1BC2C]={
+ [0x1B0FB]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC2C,
+ linebreak="id",
+ unicodeslot=0x1B0FB,
},
- [0x1BC2D]={
+ [0x1B0FC]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC2D,
+ linebreak="id",
+ unicodeslot=0x1B0FC,
},
- [0x1BC2E]={
+ [0x1B0FD]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC2E,
+ linebreak="id",
+ unicodeslot=0x1B0FD,
},
- [0x1BC2F]={
+ [0x1B0FE]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC2F,
+ linebreak="id",
+ unicodeslot=0x1B0FE,
},
- [0x1BC30]={
+ [0x1B0FF]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC30,
+ linebreak="id",
+ unicodeslot=0x1B0FF,
},
- [0x1BC31]={
+ [0x1B100]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC31,
+ linebreak="id",
+ unicodeslot=0x1B100,
},
- [0x1BC32]={
+ [0x1B101]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC32,
+ linebreak="id",
+ unicodeslot=0x1B101,
},
- [0x1BC33]={
+ [0x1B102]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC33,
+ linebreak="id",
+ unicodeslot=0x1B102,
},
- [0x1BC34]={
+ [0x1B103]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC34,
+ linebreak="id",
+ unicodeslot=0x1B103,
},
- [0x1BC35]={
+ [0x1B104]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC35,
+ linebreak="id",
+ unicodeslot=0x1B104,
},
- [0x1BC36]={
+ [0x1B105]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC36,
+ linebreak="id",
+ unicodeslot=0x1B105,
},
- [0x1BC37]={
+ [0x1B106]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC37,
+ linebreak="id",
+ unicodeslot=0x1B106,
},
- [0x1BC38]={
+ [0x1B107]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC38,
+ linebreak="id",
+ unicodeslot=0x1B107,
},
- [0x1BC39]={
+ [0x1B108]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC39,
+ linebreak="id",
+ unicodeslot=0x1B108,
},
- [0x1BC3A]={
+ [0x1B109]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC3A,
+ linebreak="id",
+ unicodeslot=0x1B109,
},
- [0x1BC3B]={
+ [0x1B10A]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC3B,
+ linebreak="id",
+ unicodeslot=0x1B10A,
},
- [0x1BC3C]={
+ [0x1B10B]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC3C,
+ linebreak="id",
+ unicodeslot=0x1B10B,
},
- [0x1BC3D]={
+ [0x1B10C]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC3D,
+ linebreak="id",
+ unicodeslot=0x1B10C,
},
- [0x1BC3E]={
+ [0x1B10D]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC3E,
+ linebreak="id",
+ unicodeslot=0x1B10D,
},
- [0x1BC3F]={
+ [0x1B10E]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC3F,
+ linebreak="id",
+ unicodeslot=0x1B10E,
},
- [0x1BC40]={
+ [0x1B10F]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC40,
+ linebreak="id",
+ unicodeslot=0x1B10F,
},
- [0x1BC41]={
+ [0x1B110]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC41,
+ linebreak="id",
+ unicodeslot=0x1B110,
},
- [0x1BC42]={
+ [0x1B111]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC42,
+ linebreak="id",
+ unicodeslot=0x1B111,
},
- [0x1BC43]={
+ [0x1B112]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC43,
+ linebreak="id",
+ unicodeslot=0x1B112,
},
- [0x1BC44]={
+ [0x1B113]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC44,
+ linebreak="id",
+ unicodeslot=0x1B113,
},
- [0x1BC45]={
+ [0x1B114]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC45,
+ linebreak="id",
+ unicodeslot=0x1B114,
},
- [0x1BC46]={
+ [0x1B115]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC46,
+ linebreak="id",
+ unicodeslot=0x1B115,
},
- [0x1BC47]={
+ [0x1B116]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC47,
+ linebreak="id",
+ unicodeslot=0x1B116,
},
- [0x1BC48]={
+ [0x1B117]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC48,
+ linebreak="id",
+ unicodeslot=0x1B117,
},
- [0x1BC49]={
+ [0x1B118]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC49,
+ linebreak="id",
+ unicodeslot=0x1B118,
},
- [0x1BC4A]={
+ [0x1B119]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC4A,
+ linebreak="id",
+ unicodeslot=0x1B119,
},
- [0x1BC4B]={
+ [0x1B11A]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC4B,
+ linebreak="id",
+ unicodeslot=0x1B11A,
},
- [0x1BC4C]={
+ [0x1B11B]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC4C,
+ linebreak="id",
+ unicodeslot=0x1B11B,
},
- [0x1BC4D]={
+ [0x1B11C]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC4D,
+ linebreak="id",
+ unicodeslot=0x1B11C,
},
- [0x1BC4E]={
+ [0x1B11D]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC4E,
+ linebreak="id",
+ unicodeslot=0x1B11D,
},
- [0x1BC4F]={
+ [0x1B11E]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC4F,
+ linebreak="id",
+ unicodeslot=0x1B11E,
},
- [0x1BC50]={
+ [0x1B150]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC50,
+ linebreak="cj",
+ unicodeslot=0x1B150,
},
- [0x1BC51]={
+ [0x1B151]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC51,
+ linebreak="cj",
+ unicodeslot=0x1B151,
},
- [0x1BC52]={
+ [0x1B152]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC52,
+ linebreak="cj",
+ unicodeslot=0x1B152,
},
- [0x1BC53]={
+ [0x1B164]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC53,
+ linebreak="cj",
+ unicodeslot=0x1B164,
},
- [0x1BC54]={
+ [0x1B165]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC54,
+ linebreak="cj",
+ unicodeslot=0x1B165,
},
- [0x1BC55]={
+ [0x1B166]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC55,
+ linebreak="cj",
+ unicodeslot=0x1B166,
},
- [0x1BC56]={
+ [0x1B167]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC56,
+ linebreak="cj",
+ unicodeslot=0x1B167,
},
- [0x1BC57]={
+ [0x1B170]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC57,
+ linebreak="id",
+ unicodeslot=0x1B170,
},
- [0x1BC58]={
+ [0x1B171]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC58,
+ linebreak="id",
+ unicodeslot=0x1B171,
},
- [0x1BC59]={
+ [0x1B172]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC59,
+ linebreak="id",
+ unicodeslot=0x1B172,
},
- [0x1BC5A]={
+ [0x1B173]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC5A,
+ linebreak="id",
+ unicodeslot=0x1B173,
},
- [0x1BC5B]={
+ [0x1B174]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC5B,
+ linebreak="id",
+ unicodeslot=0x1B174,
},
- [0x1BC5C]={
+ [0x1B175]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC5C,
+ linebreak="id",
+ unicodeslot=0x1B175,
},
- [0x1BC5D]={
+ [0x1B176]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC5D,
+ linebreak="id",
+ unicodeslot=0x1B176,
},
- [0x1BC5E]={
+ [0x1B177]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC5E,
+ linebreak="id",
+ unicodeslot=0x1B177,
},
- [0x1BC5F]={
+ [0x1B178]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC5F,
+ linebreak="id",
+ unicodeslot=0x1B178,
},
- [0x1BC60]={
+ [0x1B179]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC60,
+ linebreak="id",
+ unicodeslot=0x1B179,
},
- [0x1BC61]={
+ [0x1B17A]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC61,
+ linebreak="id",
+ unicodeslot=0x1B17A,
},
- [0x1BC62]={
+ [0x1B17B]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC62,
+ linebreak="id",
+ unicodeslot=0x1B17B,
},
- [0x1BC63]={
+ [0x1B17C]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC63,
+ linebreak="id",
+ unicodeslot=0x1B17C,
},
- [0x1BC64]={
+ [0x1B17D]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC64,
+ linebreak="id",
+ unicodeslot=0x1B17D,
},
- [0x1BC65]={
+ [0x1B17E]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC65,
+ linebreak="id",
+ unicodeslot=0x1B17E,
},
- [0x1BC66]={
+ [0x1B17F]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC66,
+ linebreak="id",
+ unicodeslot=0x1B17F,
},
- [0x1BC67]={
+ [0x1B180]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC67,
+ linebreak="id",
+ unicodeslot=0x1B180,
},
- [0x1BC68]={
+ [0x1B181]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC68,
+ linebreak="id",
+ unicodeslot=0x1B181,
},
- [0x1BC69]={
+ [0x1B182]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC69,
+ linebreak="id",
+ unicodeslot=0x1B182,
},
- [0x1BC6A]={
+ [0x1B183]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC6A,
+ linebreak="id",
+ unicodeslot=0x1B183,
},
- [0x1BC70]={
+ [0x1B184]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC70,
+ linebreak="id",
+ unicodeslot=0x1B184,
},
- [0x1BC71]={
+ [0x1B185]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC71,
+ linebreak="id",
+ unicodeslot=0x1B185,
},
- [0x1BC72]={
+ [0x1B186]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC72,
+ linebreak="id",
+ unicodeslot=0x1B186,
},
- [0x1BC73]={
+ [0x1B187]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC73,
+ linebreak="id",
+ unicodeslot=0x1B187,
},
- [0x1BC74]={
+ [0x1B188]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC74,
+ linebreak="id",
+ unicodeslot=0x1B188,
},
- [0x1BC75]={
+ [0x1B189]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC75,
+ linebreak="id",
+ unicodeslot=0x1B189,
},
- [0x1BC76]={
+ [0x1B18A]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC76,
+ linebreak="id",
+ unicodeslot=0x1B18A,
},
- [0x1BC77]={
+ [0x1B18B]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC77,
+ linebreak="id",
+ unicodeslot=0x1B18B,
},
- [0x1BC78]={
+ [0x1B18C]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC78,
+ linebreak="id",
+ unicodeslot=0x1B18C,
},
- [0x1BC79]={
+ [0x1B18D]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC79,
+ linebreak="id",
+ unicodeslot=0x1B18D,
},
- [0x1BC7A]={
+ [0x1B18E]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC7A,
+ linebreak="id",
+ unicodeslot=0x1B18E,
},
- [0x1BC7B]={
+ [0x1B18F]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC7B,
+ linebreak="id",
+ unicodeslot=0x1B18F,
},
- [0x1BC7C]={
+ [0x1B190]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC7C,
+ linebreak="id",
+ unicodeslot=0x1B190,
},
- [0x1BC80]={
+ [0x1B191]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC80,
+ linebreak="id",
+ unicodeslot=0x1B191,
},
- [0x1BC81]={
+ [0x1B192]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC81,
+ linebreak="id",
+ unicodeslot=0x1B192,
},
- [0x1BC82]={
+ [0x1B193]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC82,
+ linebreak="id",
+ unicodeslot=0x1B193,
},
- [0x1BC83]={
+ [0x1B194]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC83,
+ linebreak="id",
+ unicodeslot=0x1B194,
},
- [0x1BC84]={
+ [0x1B195]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC84,
+ linebreak="id",
+ unicodeslot=0x1B195,
},
- [0x1BC85]={
+ [0x1B196]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC85,
+ linebreak="id",
+ unicodeslot=0x1B196,
},
- [0x1BC86]={
+ [0x1B197]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC86,
+ linebreak="id",
+ unicodeslot=0x1B197,
},
- [0x1BC87]={
+ [0x1B198]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC87,
+ linebreak="id",
+ unicodeslot=0x1B198,
},
- [0x1BC88]={
+ [0x1B199]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC88,
+ linebreak="id",
+ unicodeslot=0x1B199,
},
- [0x1BC90]={
+ [0x1B19A]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC90,
+ linebreak="id",
+ unicodeslot=0x1B19A,
},
- [0x1BC91]={
+ [0x1B19B]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC91,
+ linebreak="id",
+ unicodeslot=0x1B19B,
},
- [0x1BC92]={
+ [0x1B19C]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC92,
+ linebreak="id",
+ unicodeslot=0x1B19C,
},
- [0x1BC93]={
+ [0x1B19D]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC93,
+ linebreak="id",
+ unicodeslot=0x1B19D,
},
- [0x1BC94]={
+ [0x1B19E]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC94,
+ linebreak="id",
+ unicodeslot=0x1B19E,
},
- [0x1BC95]={
+ [0x1B19F]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC95,
+ linebreak="id",
+ unicodeslot=0x1B19F,
},
- [0x1BC96]={
+ [0x1B1A0]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC96,
+ linebreak="id",
+ unicodeslot=0x1B1A0,
},
- [0x1BC97]={
+ [0x1B1A1]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC97,
+ linebreak="id",
+ unicodeslot=0x1B1A1,
},
- [0x1BC98]={
+ [0x1B1A2]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC98,
+ linebreak="id",
+ unicodeslot=0x1B1A2,
},
- [0x1BC99]={
+ [0x1B1A3]={
category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC99,
+ linebreak="id",
+ unicodeslot=0x1B1A3,
},
- [0x1BC9C]={
- category="so",
+ [0x1B1A4]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1BC9C,
- },
- [0x1BC9D]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1BC9D,
- },
- [0x1BC9E]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1BC9E,
+ linebreak="id",
+ unicodeslot=0x1B1A4,
},
- [0x1BC9F]={
- category="po",
+ [0x1B1A5]={
+ category="lo",
direction="l",
- linebreak="ba",
- unicodeslot=0x1BC9F,
- },
- [0x1BCA0]={
- category="cf",
- direction="bn",
- linebreak="cm",
- unicodeslot=0x1BCA0,
- },
- [0x1BCA1]={
- category="cf",
- direction="bn",
- linebreak="cm",
- unicodeslot=0x1BCA1,
- },
- [0x1BCA2]={
- category="cf",
- direction="bn",
- linebreak="cm",
- unicodeslot=0x1BCA2,
- },
- [0x1BCA3]={
- category="cf",
- direction="bn",
- linebreak="cm",
- unicodeslot=0x1BCA3,
+ linebreak="id",
+ unicodeslot=0x1B1A5,
},
- [0x1D000]={
- category="so",
+ [0x1B1A6]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D000,
+ linebreak="id",
+ unicodeslot=0x1B1A6,
},
- [0x1D001]={
- category="so",
+ [0x1B1A7]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D001,
+ linebreak="id",
+ unicodeslot=0x1B1A7,
},
- [0x1D002]={
- category="so",
+ [0x1B1A8]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D002,
+ linebreak="id",
+ unicodeslot=0x1B1A8,
},
- [0x1D003]={
- category="so",
+ [0x1B1A9]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D003,
+ linebreak="id",
+ unicodeslot=0x1B1A9,
},
- [0x1D004]={
- category="so",
+ [0x1B1AA]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D004,
+ linebreak="id",
+ unicodeslot=0x1B1AA,
},
- [0x1D005]={
- category="so",
+ [0x1B1AB]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D005,
+ linebreak="id",
+ unicodeslot=0x1B1AB,
},
- [0x1D006]={
- category="so",
+ [0x1B1AC]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D006,
+ linebreak="id",
+ unicodeslot=0x1B1AC,
},
- [0x1D007]={
- category="so",
+ [0x1B1AD]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D007,
+ linebreak="id",
+ unicodeslot=0x1B1AD,
},
- [0x1D008]={
- category="so",
+ [0x1B1AE]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D008,
+ linebreak="id",
+ unicodeslot=0x1B1AE,
},
- [0x1D009]={
- category="so",
+ [0x1B1AF]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D009,
+ linebreak="id",
+ unicodeslot=0x1B1AF,
},
- [0x1D00A]={
- category="so",
+ [0x1B1B0]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D00A,
+ linebreak="id",
+ unicodeslot=0x1B1B0,
},
- [0x1D00B]={
- category="so",
+ [0x1B1B1]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D00B,
+ linebreak="id",
+ unicodeslot=0x1B1B1,
},
- [0x1D00C]={
- category="so",
+ [0x1B1B2]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D00C,
+ linebreak="id",
+ unicodeslot=0x1B1B2,
},
- [0x1D00D]={
- category="so",
+ [0x1B1B3]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D00D,
+ linebreak="id",
+ unicodeslot=0x1B1B3,
},
- [0x1D00E]={
- category="so",
+ [0x1B1B4]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D00E,
+ linebreak="id",
+ unicodeslot=0x1B1B4,
},
- [0x1D00F]={
- category="so",
+ [0x1B1B5]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D00F,
+ linebreak="id",
+ unicodeslot=0x1B1B5,
},
- [0x1D010]={
- category="so",
+ [0x1B1B6]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D010,
+ linebreak="id",
+ unicodeslot=0x1B1B6,
},
- [0x1D011]={
- category="so",
+ [0x1B1B7]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D011,
+ linebreak="id",
+ unicodeslot=0x1B1B7,
},
- [0x1D012]={
- category="so",
+ [0x1B1B8]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D012,
+ linebreak="id",
+ unicodeslot=0x1B1B8,
},
- [0x1D013]={
- category="so",
+ [0x1B1B9]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D013,
+ linebreak="id",
+ unicodeslot=0x1B1B9,
},
- [0x1D014]={
- category="so",
+ [0x1B1BA]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D014,
+ linebreak="id",
+ unicodeslot=0x1B1BA,
},
- [0x1D015]={
- category="so",
+ [0x1B1BB]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D015,
+ linebreak="id",
+ unicodeslot=0x1B1BB,
},
- [0x1D016]={
- category="so",
+ [0x1B1BC]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D016,
+ linebreak="id",
+ unicodeslot=0x1B1BC,
},
- [0x1D017]={
- category="so",
+ [0x1B1BD]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D017,
+ linebreak="id",
+ unicodeslot=0x1B1BD,
},
- [0x1D018]={
- category="so",
+ [0x1B1BE]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D018,
+ linebreak="id",
+ unicodeslot=0x1B1BE,
},
- [0x1D019]={
- category="so",
+ [0x1B1BF]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D019,
+ linebreak="id",
+ unicodeslot=0x1B1BF,
},
- [0x1D01A]={
- category="so",
+ [0x1B1C0]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D01A,
+ linebreak="id",
+ unicodeslot=0x1B1C0,
},
- [0x1D01B]={
- category="so",
+ [0x1B1C1]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D01B,
+ linebreak="id",
+ unicodeslot=0x1B1C1,
},
- [0x1D01C]={
- category="so",
+ [0x1B1C2]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D01C,
+ linebreak="id",
+ unicodeslot=0x1B1C2,
},
- [0x1D01D]={
- category="so",
+ [0x1B1C3]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D01D,
+ linebreak="id",
+ unicodeslot=0x1B1C3,
},
- [0x1D01E]={
- category="so",
+ [0x1B1C4]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D01E,
+ linebreak="id",
+ unicodeslot=0x1B1C4,
},
- [0x1D01F]={
- category="so",
+ [0x1B1C5]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D01F,
+ linebreak="id",
+ unicodeslot=0x1B1C5,
},
- [0x1D020]={
- category="so",
+ [0x1B1C6]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D020,
+ linebreak="id",
+ unicodeslot=0x1B1C6,
},
- [0x1D021]={
- category="so",
+ [0x1B1C7]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D021,
+ linebreak="id",
+ unicodeslot=0x1B1C7,
},
- [0x1D022]={
- category="so",
+ [0x1B1C8]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D022,
+ linebreak="id",
+ unicodeslot=0x1B1C8,
},
- [0x1D023]={
- category="so",
+ [0x1B1C9]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D023,
+ linebreak="id",
+ unicodeslot=0x1B1C9,
},
- [0x1D024]={
- category="so",
+ [0x1B1CA]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D024,
+ linebreak="id",
+ unicodeslot=0x1B1CA,
},
- [0x1D025]={
- category="so",
+ [0x1B1CB]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D025,
+ linebreak="id",
+ unicodeslot=0x1B1CB,
},
- [0x1D026]={
- category="so",
+ [0x1B1CC]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D026,
+ linebreak="id",
+ unicodeslot=0x1B1CC,
},
- [0x1D027]={
- category="so",
+ [0x1B1CD]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D027,
+ linebreak="id",
+ unicodeslot=0x1B1CD,
},
- [0x1D028]={
- category="so",
+ [0x1B1CE]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D028,
+ linebreak="id",
+ unicodeslot=0x1B1CE,
},
- [0x1D029]={
- category="so",
+ [0x1B1CF]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D029,
+ linebreak="id",
+ unicodeslot=0x1B1CF,
},
- [0x1D02A]={
- category="so",
+ [0x1B1D0]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D02A,
+ linebreak="id",
+ unicodeslot=0x1B1D0,
},
- [0x1D02B]={
- category="so",
+ [0x1B1D1]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D02B,
+ linebreak="id",
+ unicodeslot=0x1B1D1,
},
- [0x1D02C]={
- category="so",
+ [0x1B1D2]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D02C,
+ linebreak="id",
+ unicodeslot=0x1B1D2,
},
- [0x1D02D]={
- category="so",
+ [0x1B1D3]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D02D,
+ linebreak="id",
+ unicodeslot=0x1B1D3,
},
- [0x1D02E]={
- category="so",
+ [0x1B1D4]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D02E,
+ linebreak="id",
+ unicodeslot=0x1B1D4,
},
- [0x1D02F]={
- category="so",
+ [0x1B1D5]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D02F,
+ linebreak="id",
+ unicodeslot=0x1B1D5,
},
- [0x1D030]={
- category="so",
+ [0x1B1D6]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D030,
+ linebreak="id",
+ unicodeslot=0x1B1D6,
},
- [0x1D031]={
- category="so",
+ [0x1B1D7]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D031,
+ linebreak="id",
+ unicodeslot=0x1B1D7,
},
- [0x1D032]={
- category="so",
+ [0x1B1D8]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D032,
+ linebreak="id",
+ unicodeslot=0x1B1D8,
},
- [0x1D033]={
- category="so",
+ [0x1B1D9]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D033,
+ linebreak="id",
+ unicodeslot=0x1B1D9,
},
- [0x1D034]={
- category="so",
+ [0x1B1DA]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D034,
+ linebreak="id",
+ unicodeslot=0x1B1DA,
},
- [0x1D035]={
- category="so",
+ [0x1B1DB]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D035,
+ linebreak="id",
+ unicodeslot=0x1B1DB,
},
- [0x1D036]={
- category="so",
+ [0x1B1DC]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D036,
+ linebreak="id",
+ unicodeslot=0x1B1DC,
},
- [0x1D037]={
- category="so",
+ [0x1B1DD]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D037,
+ linebreak="id",
+ unicodeslot=0x1B1DD,
},
- [0x1D038]={
- category="so",
+ [0x1B1DE]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D038,
+ linebreak="id",
+ unicodeslot=0x1B1DE,
},
- [0x1D039]={
- category="so",
+ [0x1B1DF]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D039,
+ linebreak="id",
+ unicodeslot=0x1B1DF,
},
- [0x1D03A]={
- category="so",
+ [0x1B1E0]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D03A,
+ linebreak="id",
+ unicodeslot=0x1B1E0,
},
- [0x1D03B]={
- category="so",
+ [0x1B1E1]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D03B,
+ linebreak="id",
+ unicodeslot=0x1B1E1,
},
- [0x1D03C]={
- category="so",
+ [0x1B1E2]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D03C,
+ linebreak="id",
+ unicodeslot=0x1B1E2,
},
- [0x1D03D]={
- category="so",
+ [0x1B1E3]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D03D,
+ linebreak="id",
+ unicodeslot=0x1B1E3,
},
- [0x1D03E]={
- category="so",
+ [0x1B1E4]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D03E,
+ linebreak="id",
+ unicodeslot=0x1B1E4,
},
- [0x1D03F]={
- category="so",
+ [0x1B1E5]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D03F,
+ linebreak="id",
+ unicodeslot=0x1B1E5,
},
- [0x1D040]={
- category="so",
+ [0x1B1E6]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D040,
+ linebreak="id",
+ unicodeslot=0x1B1E6,
},
- [0x1D041]={
- category="so",
+ [0x1B1E7]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D041,
+ linebreak="id",
+ unicodeslot=0x1B1E7,
},
- [0x1D042]={
- category="so",
+ [0x1B1E8]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D042,
+ linebreak="id",
+ unicodeslot=0x1B1E8,
},
- [0x1D043]={
- category="so",
+ [0x1B1E9]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D043,
+ linebreak="id",
+ unicodeslot=0x1B1E9,
},
- [0x1D044]={
- category="so",
+ [0x1B1EA]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D044,
+ linebreak="id",
+ unicodeslot=0x1B1EA,
},
- [0x1D045]={
- category="so",
+ [0x1B1EB]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D045,
+ linebreak="id",
+ unicodeslot=0x1B1EB,
},
- [0x1D046]={
- category="so",
+ [0x1B1EC]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D046,
+ linebreak="id",
+ unicodeslot=0x1B1EC,
},
- [0x1D047]={
- category="so",
+ [0x1B1ED]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D047,
+ linebreak="id",
+ unicodeslot=0x1B1ED,
},
- [0x1D048]={
- category="so",
+ [0x1B1EE]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D048,
+ linebreak="id",
+ unicodeslot=0x1B1EE,
},
- [0x1D049]={
- category="so",
+ [0x1B1EF]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D049,
+ linebreak="id",
+ unicodeslot=0x1B1EF,
},
- [0x1D04A]={
- category="so",
+ [0x1B1F0]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D04A,
+ linebreak="id",
+ unicodeslot=0x1B1F0,
},
- [0x1D04B]={
- category="so",
+ [0x1B1F1]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D04B,
+ linebreak="id",
+ unicodeslot=0x1B1F1,
},
- [0x1D04C]={
- category="so",
+ [0x1B1F2]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D04C,
+ linebreak="id",
+ unicodeslot=0x1B1F2,
},
- [0x1D04D]={
- category="so",
+ [0x1B1F3]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D04D,
+ linebreak="id",
+ unicodeslot=0x1B1F3,
},
- [0x1D04E]={
- category="so",
+ [0x1B1F4]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D04E,
+ linebreak="id",
+ unicodeslot=0x1B1F4,
},
- [0x1D04F]={
- category="so",
+ [0x1B1F5]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D04F,
+ linebreak="id",
+ unicodeslot=0x1B1F5,
},
- [0x1D050]={
- category="so",
+ [0x1B1F6]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D050,
+ linebreak="id",
+ unicodeslot=0x1B1F6,
},
- [0x1D051]={
- category="so",
+ [0x1B1F7]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D051,
+ linebreak="id",
+ unicodeslot=0x1B1F7,
},
- [0x1D052]={
- category="so",
+ [0x1B1F8]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D052,
+ linebreak="id",
+ unicodeslot=0x1B1F8,
},
- [0x1D053]={
- category="so",
+ [0x1B1F9]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D053,
+ linebreak="id",
+ unicodeslot=0x1B1F9,
},
- [0x1D054]={
- category="so",
+ [0x1B1FA]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D054,
+ linebreak="id",
+ unicodeslot=0x1B1FA,
},
- [0x1D055]={
- category="so",
+ [0x1B1FB]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D055,
+ linebreak="id",
+ unicodeslot=0x1B1FB,
},
- [0x1D056]={
- category="so",
+ [0x1B1FC]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D056,
+ linebreak="id",
+ unicodeslot=0x1B1FC,
},
- [0x1D057]={
- category="so",
+ [0x1B1FD]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D057,
+ linebreak="id",
+ unicodeslot=0x1B1FD,
},
- [0x1D058]={
- category="so",
+ [0x1B1FE]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D058,
+ linebreak="id",
+ unicodeslot=0x1B1FE,
},
- [0x1D059]={
- category="so",
+ [0x1B1FF]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D059,
+ linebreak="id",
+ unicodeslot=0x1B1FF,
},
- [0x1D05A]={
- category="so",
+ [0x1B200]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D05A,
+ linebreak="id",
+ unicodeslot=0x1B200,
},
- [0x1D05B]={
- category="so",
+ [0x1B201]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D05B,
+ linebreak="id",
+ unicodeslot=0x1B201,
},
- [0x1D05C]={
- category="so",
+ [0x1B202]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D05C,
+ linebreak="id",
+ unicodeslot=0x1B202,
},
- [0x1D05D]={
- category="so",
+ [0x1B203]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D05D,
+ linebreak="id",
+ unicodeslot=0x1B203,
},
- [0x1D05E]={
- category="so",
+ [0x1B204]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D05E,
+ linebreak="id",
+ unicodeslot=0x1B204,
},
- [0x1D05F]={
- category="so",
+ [0x1B205]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D05F,
+ linebreak="id",
+ unicodeslot=0x1B205,
},
- [0x1D060]={
- category="so",
+ [0x1B206]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D060,
+ linebreak="id",
+ unicodeslot=0x1B206,
},
- [0x1D061]={
- category="so",
+ [0x1B207]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D061,
+ linebreak="id",
+ unicodeslot=0x1B207,
},
- [0x1D062]={
- category="so",
+ [0x1B208]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D062,
+ linebreak="id",
+ unicodeslot=0x1B208,
},
- [0x1D063]={
- category="so",
+ [0x1B209]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D063,
+ linebreak="id",
+ unicodeslot=0x1B209,
},
- [0x1D064]={
- category="so",
+ [0x1B20A]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D064,
+ linebreak="id",
+ unicodeslot=0x1B20A,
},
- [0x1D065]={
- category="so",
+ [0x1B20B]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D065,
+ linebreak="id",
+ unicodeslot=0x1B20B,
},
- [0x1D066]={
- category="so",
+ [0x1B20C]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D066,
+ linebreak="id",
+ unicodeslot=0x1B20C,
},
- [0x1D067]={
- category="so",
+ [0x1B20D]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D067,
+ linebreak="id",
+ unicodeslot=0x1B20D,
},
- [0x1D068]={
- category="so",
+ [0x1B20E]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D068,
+ linebreak="id",
+ unicodeslot=0x1B20E,
},
- [0x1D069]={
- category="so",
+ [0x1B20F]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D069,
+ linebreak="id",
+ unicodeslot=0x1B20F,
},
- [0x1D06A]={
- category="so",
+ [0x1B210]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D06A,
+ linebreak="id",
+ unicodeslot=0x1B210,
},
- [0x1D06B]={
- category="so",
+ [0x1B211]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D06B,
+ linebreak="id",
+ unicodeslot=0x1B211,
},
- [0x1D06C]={
- category="so",
+ [0x1B212]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D06C,
+ linebreak="id",
+ unicodeslot=0x1B212,
},
- [0x1D06D]={
- category="so",
+ [0x1B213]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D06D,
+ linebreak="id",
+ unicodeslot=0x1B213,
},
- [0x1D06E]={
- category="so",
+ [0x1B214]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D06E,
+ linebreak="id",
+ unicodeslot=0x1B214,
},
- [0x1D06F]={
- category="so",
+ [0x1B215]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D06F,
+ linebreak="id",
+ unicodeslot=0x1B215,
},
- [0x1D070]={
- category="so",
+ [0x1B216]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D070,
+ linebreak="id",
+ unicodeslot=0x1B216,
},
- [0x1D071]={
- category="so",
+ [0x1B217]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D071,
+ linebreak="id",
+ unicodeslot=0x1B217,
},
- [0x1D072]={
- category="so",
+ [0x1B218]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D072,
+ linebreak="id",
+ unicodeslot=0x1B218,
},
- [0x1D073]={
- category="so",
+ [0x1B219]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D073,
+ linebreak="id",
+ unicodeslot=0x1B219,
},
- [0x1D074]={
- category="so",
+ [0x1B21A]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D074,
+ linebreak="id",
+ unicodeslot=0x1B21A,
},
- [0x1D075]={
- category="so",
+ [0x1B21B]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D075,
+ linebreak="id",
+ unicodeslot=0x1B21B,
},
- [0x1D076]={
- category="so",
+ [0x1B21C]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D076,
+ linebreak="id",
+ unicodeslot=0x1B21C,
},
- [0x1D077]={
- category="so",
+ [0x1B21D]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D077,
+ linebreak="id",
+ unicodeslot=0x1B21D,
},
- [0x1D078]={
- category="so",
+ [0x1B21E]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D078,
+ linebreak="id",
+ unicodeslot=0x1B21E,
},
- [0x1D079]={
- category="so",
+ [0x1B21F]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D079,
+ linebreak="id",
+ unicodeslot=0x1B21F,
},
- [0x1D07A]={
- category="so",
+ [0x1B220]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D07A,
+ linebreak="id",
+ unicodeslot=0x1B220,
},
- [0x1D07B]={
- category="so",
+ [0x1B221]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D07B,
+ linebreak="id",
+ unicodeslot=0x1B221,
},
- [0x1D07C]={
- category="so",
+ [0x1B222]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D07C,
+ linebreak="id",
+ unicodeslot=0x1B222,
},
- [0x1D07D]={
- category="so",
+ [0x1B223]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D07D,
+ linebreak="id",
+ unicodeslot=0x1B223,
},
- [0x1D07E]={
- category="so",
+ [0x1B224]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D07E,
+ linebreak="id",
+ unicodeslot=0x1B224,
},
- [0x1D07F]={
- category="so",
+ [0x1B225]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D07F,
+ linebreak="id",
+ unicodeslot=0x1B225,
},
- [0x1D080]={
- category="so",
+ [0x1B226]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D080,
+ linebreak="id",
+ unicodeslot=0x1B226,
},
- [0x1D081]={
- category="so",
+ [0x1B227]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D081,
+ linebreak="id",
+ unicodeslot=0x1B227,
},
- [0x1D082]={
- category="so",
+ [0x1B228]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D082,
+ linebreak="id",
+ unicodeslot=0x1B228,
},
- [0x1D083]={
- category="so",
+ [0x1B229]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D083,
+ linebreak="id",
+ unicodeslot=0x1B229,
},
- [0x1D084]={
- category="so",
+ [0x1B22A]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D084,
+ linebreak="id",
+ unicodeslot=0x1B22A,
},
- [0x1D085]={
- category="so",
+ [0x1B22B]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D085,
+ linebreak="id",
+ unicodeslot=0x1B22B,
},
- [0x1D086]={
- category="so",
+ [0x1B22C]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D086,
+ linebreak="id",
+ unicodeslot=0x1B22C,
},
- [0x1D087]={
- category="so",
+ [0x1B22D]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D087,
+ linebreak="id",
+ unicodeslot=0x1B22D,
},
- [0x1D088]={
- category="so",
+ [0x1B22E]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D088,
+ linebreak="id",
+ unicodeslot=0x1B22E,
},
- [0x1D089]={
- category="so",
+ [0x1B22F]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D089,
+ linebreak="id",
+ unicodeslot=0x1B22F,
},
- [0x1D08A]={
- category="so",
+ [0x1B230]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D08A,
+ linebreak="id",
+ unicodeslot=0x1B230,
},
- [0x1D08B]={
- category="so",
+ [0x1B231]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D08B,
+ linebreak="id",
+ unicodeslot=0x1B231,
},
- [0x1D08C]={
- category="so",
+ [0x1B232]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D08C,
+ linebreak="id",
+ unicodeslot=0x1B232,
},
- [0x1D08D]={
- category="so",
+ [0x1B233]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D08D,
+ linebreak="id",
+ unicodeslot=0x1B233,
},
- [0x1D08E]={
- category="so",
+ [0x1B234]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D08E,
+ linebreak="id",
+ unicodeslot=0x1B234,
},
- [0x1D08F]={
- category="so",
+ [0x1B235]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D08F,
+ linebreak="id",
+ unicodeslot=0x1B235,
},
- [0x1D090]={
- category="so",
+ [0x1B236]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D090,
+ linebreak="id",
+ unicodeslot=0x1B236,
},
- [0x1D091]={
- category="so",
+ [0x1B237]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D091,
+ linebreak="id",
+ unicodeslot=0x1B237,
},
- [0x1D092]={
- category="so",
+ [0x1B238]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D092,
+ linebreak="id",
+ unicodeslot=0x1B238,
},
- [0x1D093]={
- category="so",
+ [0x1B239]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D093,
+ linebreak="id",
+ unicodeslot=0x1B239,
},
- [0x1D094]={
- category="so",
+ [0x1B23A]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D094,
+ linebreak="id",
+ unicodeslot=0x1B23A,
},
- [0x1D095]={
- category="so",
+ [0x1B23B]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D095,
+ linebreak="id",
+ unicodeslot=0x1B23B,
},
- [0x1D096]={
- category="so",
+ [0x1B23C]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D096,
+ linebreak="id",
+ unicodeslot=0x1B23C,
},
- [0x1D097]={
- category="so",
+ [0x1B23D]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D097,
+ linebreak="id",
+ unicodeslot=0x1B23D,
},
- [0x1D098]={
- category="so",
+ [0x1B23E]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D098,
+ linebreak="id",
+ unicodeslot=0x1B23E,
},
- [0x1D099]={
- category="so",
+ [0x1B23F]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D099,
+ linebreak="id",
+ unicodeslot=0x1B23F,
},
- [0x1D09A]={
- category="so",
+ [0x1B240]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D09A,
+ linebreak="id",
+ unicodeslot=0x1B240,
},
- [0x1D09B]={
- category="so",
+ [0x1B241]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D09B,
+ linebreak="id",
+ unicodeslot=0x1B241,
},
- [0x1D09C]={
- category="so",
+ [0x1B242]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D09C,
+ linebreak="id",
+ unicodeslot=0x1B242,
},
- [0x1D09D]={
- category="so",
+ [0x1B243]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D09D,
+ linebreak="id",
+ unicodeslot=0x1B243,
},
- [0x1D09E]={
- category="so",
+ [0x1B244]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D09E,
+ linebreak="id",
+ unicodeslot=0x1B244,
},
- [0x1D09F]={
- category="so",
+ [0x1B245]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D09F,
+ linebreak="id",
+ unicodeslot=0x1B245,
},
- [0x1D0A0]={
- category="so",
+ [0x1B246]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0A0,
+ linebreak="id",
+ unicodeslot=0x1B246,
},
- [0x1D0A1]={
- category="so",
+ [0x1B247]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0A1,
+ linebreak="id",
+ unicodeslot=0x1B247,
},
- [0x1D0A2]={
- category="so",
+ [0x1B248]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0A2,
+ linebreak="id",
+ unicodeslot=0x1B248,
},
- [0x1D0A3]={
- category="so",
+ [0x1B249]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0A3,
+ linebreak="id",
+ unicodeslot=0x1B249,
},
- [0x1D0A4]={
- category="so",
+ [0x1B24A]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0A4,
+ linebreak="id",
+ unicodeslot=0x1B24A,
},
- [0x1D0A5]={
- category="so",
+ [0x1B24B]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0A5,
+ linebreak="id",
+ unicodeslot=0x1B24B,
},
- [0x1D0A6]={
- category="so",
+ [0x1B24C]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0A6,
+ linebreak="id",
+ unicodeslot=0x1B24C,
},
- [0x1D0A7]={
- category="so",
+ [0x1B24D]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0A7,
+ linebreak="id",
+ unicodeslot=0x1B24D,
},
- [0x1D0A8]={
- category="so",
+ [0x1B24E]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0A8,
+ linebreak="id",
+ unicodeslot=0x1B24E,
},
- [0x1D0A9]={
- category="so",
+ [0x1B24F]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0A9,
+ linebreak="id",
+ unicodeslot=0x1B24F,
},
- [0x1D0AA]={
- category="so",
+ [0x1B250]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0AA,
+ linebreak="id",
+ unicodeslot=0x1B250,
},
- [0x1D0AB]={
- category="so",
+ [0x1B251]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0AB,
+ linebreak="id",
+ unicodeslot=0x1B251,
},
- [0x1D0AC]={
- category="so",
+ [0x1B252]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0AC,
+ linebreak="id",
+ unicodeslot=0x1B252,
},
- [0x1D0AD]={
- category="so",
+ [0x1B253]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0AD,
+ linebreak="id",
+ unicodeslot=0x1B253,
},
- [0x1D0AE]={
- category="so",
+ [0x1B254]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0AE,
+ linebreak="id",
+ unicodeslot=0x1B254,
},
- [0x1D0AF]={
- category="so",
+ [0x1B255]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0AF,
+ linebreak="id",
+ unicodeslot=0x1B255,
},
- [0x1D0B0]={
- category="so",
+ [0x1B256]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0B0,
+ linebreak="id",
+ unicodeslot=0x1B256,
},
- [0x1D0B1]={
- category="so",
+ [0x1B257]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0B1,
+ linebreak="id",
+ unicodeslot=0x1B257,
},
- [0x1D0B2]={
- category="so",
+ [0x1B258]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0B2,
+ linebreak="id",
+ unicodeslot=0x1B258,
},
- [0x1D0B3]={
- category="so",
+ [0x1B259]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0B3,
+ linebreak="id",
+ unicodeslot=0x1B259,
},
- [0x1D0B4]={
- category="so",
+ [0x1B25A]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0B4,
+ linebreak="id",
+ unicodeslot=0x1B25A,
},
- [0x1D0B5]={
- category="so",
+ [0x1B25B]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0B5,
+ linebreak="id",
+ unicodeslot=0x1B25B,
},
- [0x1D0B6]={
- category="so",
+ [0x1B25C]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0B6,
+ linebreak="id",
+ unicodeslot=0x1B25C,
},
- [0x1D0B7]={
- category="so",
+ [0x1B25D]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0B7,
+ linebreak="id",
+ unicodeslot=0x1B25D,
},
- [0x1D0B8]={
- category="so",
+ [0x1B25E]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0B8,
+ linebreak="id",
+ unicodeslot=0x1B25E,
},
- [0x1D0B9]={
- category="so",
+ [0x1B25F]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0B9,
+ linebreak="id",
+ unicodeslot=0x1B25F,
},
- [0x1D0BA]={
- category="so",
+ [0x1B260]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0BA,
+ linebreak="id",
+ unicodeslot=0x1B260,
},
- [0x1D0BB]={
- category="so",
+ [0x1B261]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0BB,
+ linebreak="id",
+ unicodeslot=0x1B261,
},
- [0x1D0BC]={
- category="so",
+ [0x1B262]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0BC,
+ linebreak="id",
+ unicodeslot=0x1B262,
},
- [0x1D0BD]={
- category="so",
+ [0x1B263]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0BD,
+ linebreak="id",
+ unicodeslot=0x1B263,
},
- [0x1D0BE]={
- category="so",
+ [0x1B264]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0BE,
+ linebreak="id",
+ unicodeslot=0x1B264,
},
- [0x1D0BF]={
- category="so",
+ [0x1B265]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0BF,
+ linebreak="id",
+ unicodeslot=0x1B265,
},
- [0x1D0C0]={
- category="so",
+ [0x1B266]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0C0,
+ linebreak="id",
+ unicodeslot=0x1B266,
},
- [0x1D0C1]={
- category="so",
+ [0x1B267]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0C1,
+ linebreak="id",
+ unicodeslot=0x1B267,
},
- [0x1D0C2]={
- category="so",
+ [0x1B268]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0C2,
+ linebreak="id",
+ unicodeslot=0x1B268,
},
- [0x1D0C3]={
- category="so",
+ [0x1B269]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0C3,
+ linebreak="id",
+ unicodeslot=0x1B269,
},
- [0x1D0C4]={
- category="so",
+ [0x1B26A]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0C4,
+ linebreak="id",
+ unicodeslot=0x1B26A,
},
- [0x1D0C5]={
- category="so",
+ [0x1B26B]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0C5,
+ linebreak="id",
+ unicodeslot=0x1B26B,
},
- [0x1D0C6]={
- category="so",
+ [0x1B26C]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0C6,
+ linebreak="id",
+ unicodeslot=0x1B26C,
},
- [0x1D0C7]={
- category="so",
+ [0x1B26D]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0C7,
+ linebreak="id",
+ unicodeslot=0x1B26D,
},
- [0x1D0C8]={
- category="so",
+ [0x1B26E]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0C8,
+ linebreak="id",
+ unicodeslot=0x1B26E,
},
- [0x1D0C9]={
- category="so",
+ [0x1B26F]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0C9,
+ linebreak="id",
+ unicodeslot=0x1B26F,
},
- [0x1D0CA]={
- category="so",
+ [0x1B270]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0CA,
+ linebreak="id",
+ unicodeslot=0x1B270,
},
- [0x1D0CB]={
- category="so",
+ [0x1B271]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0CB,
+ linebreak="id",
+ unicodeslot=0x1B271,
},
- [0x1D0CC]={
- category="so",
+ [0x1B272]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0CC,
+ linebreak="id",
+ unicodeslot=0x1B272,
},
- [0x1D0CD]={
- category="so",
+ [0x1B273]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0CD,
+ linebreak="id",
+ unicodeslot=0x1B273,
},
- [0x1D0CE]={
- category="so",
+ [0x1B274]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0CE,
+ linebreak="id",
+ unicodeslot=0x1B274,
},
- [0x1D0CF]={
- category="so",
+ [0x1B275]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0CF,
+ linebreak="id",
+ unicodeslot=0x1B275,
},
- [0x1D0D0]={
- category="so",
+ [0x1B276]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0D0,
+ linebreak="id",
+ unicodeslot=0x1B276,
},
- [0x1D0D1]={
- category="so",
+ [0x1B277]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0D1,
+ linebreak="id",
+ unicodeslot=0x1B277,
},
- [0x1D0D2]={
- category="so",
+ [0x1B278]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0D2,
+ linebreak="id",
+ unicodeslot=0x1B278,
},
- [0x1D0D3]={
- category="so",
+ [0x1B279]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0D3,
+ linebreak="id",
+ unicodeslot=0x1B279,
},
- [0x1D0D4]={
- category="so",
+ [0x1B27A]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0D4,
+ linebreak="id",
+ unicodeslot=0x1B27A,
},
- [0x1D0D5]={
- category="so",
+ [0x1B27B]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0D5,
+ linebreak="id",
+ unicodeslot=0x1B27B,
},
- [0x1D0D6]={
- category="so",
+ [0x1B27C]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0D6,
+ linebreak="id",
+ unicodeslot=0x1B27C,
},
- [0x1D0D7]={
- category="so",
+ [0x1B27D]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0D7,
+ linebreak="id",
+ unicodeslot=0x1B27D,
},
- [0x1D0D8]={
- category="so",
+ [0x1B27E]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0D8,
+ linebreak="id",
+ unicodeslot=0x1B27E,
},
- [0x1D0D9]={
- category="so",
+ [0x1B27F]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0D9,
+ linebreak="id",
+ unicodeslot=0x1B27F,
},
- [0x1D0DA]={
- category="so",
+ [0x1B280]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0DA,
+ linebreak="id",
+ unicodeslot=0x1B280,
},
- [0x1D0DB]={
- category="so",
+ [0x1B281]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0DB,
+ linebreak="id",
+ unicodeslot=0x1B281,
},
- [0x1D0DC]={
- category="so",
+ [0x1B282]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0DC,
+ linebreak="id",
+ unicodeslot=0x1B282,
},
- [0x1D0DD]={
- category="so",
+ [0x1B283]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0DD,
+ linebreak="id",
+ unicodeslot=0x1B283,
},
- [0x1D0DE]={
- category="so",
+ [0x1B284]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0DE,
+ linebreak="id",
+ unicodeslot=0x1B284,
},
- [0x1D0DF]={
- category="so",
+ [0x1B285]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0DF,
+ linebreak="id",
+ unicodeslot=0x1B285,
},
- [0x1D0E0]={
- category="so",
+ [0x1B286]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0E0,
+ linebreak="id",
+ unicodeslot=0x1B286,
},
- [0x1D0E1]={
- category="so",
+ [0x1B287]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0E1,
+ linebreak="id",
+ unicodeslot=0x1B287,
},
- [0x1D0E2]={
- category="so",
+ [0x1B288]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0E2,
+ linebreak="id",
+ unicodeslot=0x1B288,
},
- [0x1D0E3]={
- category="so",
+ [0x1B289]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0E3,
+ linebreak="id",
+ unicodeslot=0x1B289,
},
- [0x1D0E4]={
- category="so",
+ [0x1B28A]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0E4,
+ linebreak="id",
+ unicodeslot=0x1B28A,
},
- [0x1D0E5]={
- category="so",
+ [0x1B28B]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0E5,
+ linebreak="id",
+ unicodeslot=0x1B28B,
},
- [0x1D0E6]={
- category="so",
+ [0x1B28C]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0E6,
+ linebreak="id",
+ unicodeslot=0x1B28C,
},
- [0x1D0E7]={
- category="so",
+ [0x1B28D]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0E7,
+ linebreak="id",
+ unicodeslot=0x1B28D,
},
- [0x1D0E8]={
- category="so",
+ [0x1B28E]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0E8,
+ linebreak="id",
+ unicodeslot=0x1B28E,
},
- [0x1D0E9]={
- category="so",
+ [0x1B28F]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0E9,
+ linebreak="id",
+ unicodeslot=0x1B28F,
},
- [0x1D0EA]={
- category="so",
+ [0x1B290]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0EA,
+ linebreak="id",
+ unicodeslot=0x1B290,
},
- [0x1D0EB]={
- category="so",
+ [0x1B291]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0EB,
+ linebreak="id",
+ unicodeslot=0x1B291,
},
- [0x1D0EC]={
- category="so",
+ [0x1B292]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0EC,
+ linebreak="id",
+ unicodeslot=0x1B292,
},
- [0x1D0ED]={
- category="so",
+ [0x1B293]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0ED,
+ linebreak="id",
+ unicodeslot=0x1B293,
},
- [0x1D0EE]={
- category="so",
+ [0x1B294]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0EE,
+ linebreak="id",
+ unicodeslot=0x1B294,
},
- [0x1D0EF]={
- category="so",
+ [0x1B295]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0EF,
+ linebreak="id",
+ unicodeslot=0x1B295,
},
- [0x1D0F0]={
- category="so",
+ [0x1B296]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0F0,
+ linebreak="id",
+ unicodeslot=0x1B296,
},
- [0x1D0F1]={
- category="so",
+ [0x1B297]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0F1,
+ linebreak="id",
+ unicodeslot=0x1B297,
},
- [0x1D0F2]={
- category="so",
+ [0x1B298]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0F2,
+ linebreak="id",
+ unicodeslot=0x1B298,
},
- [0x1D0F3]={
- category="so",
+ [0x1B299]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0F3,
+ linebreak="id",
+ unicodeslot=0x1B299,
},
- [0x1D0F4]={
- category="so",
+ [0x1B29A]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0F4,
+ linebreak="id",
+ unicodeslot=0x1B29A,
},
- [0x1D0F5]={
- category="so",
+ [0x1B29B]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D0F5,
+ linebreak="id",
+ unicodeslot=0x1B29B,
},
- [0x1D100]={
- category="so",
+ [0x1B29C]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D100,
+ linebreak="id",
+ unicodeslot=0x1B29C,
},
- [0x1D101]={
- category="so",
+ [0x1B29D]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D101,
+ linebreak="id",
+ unicodeslot=0x1B29D,
},
- [0x1D102]={
- category="so",
+ [0x1B29E]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D102,
+ linebreak="id",
+ unicodeslot=0x1B29E,
},
- [0x1D103]={
- category="so",
+ [0x1B29F]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D103,
+ linebreak="id",
+ unicodeslot=0x1B29F,
},
- [0x1D104]={
- category="so",
+ [0x1B2A0]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D104,
+ linebreak="id",
+ unicodeslot=0x1B2A0,
},
- [0x1D105]={
- category="so",
+ [0x1B2A1]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D105,
+ linebreak="id",
+ unicodeslot=0x1B2A1,
},
- [0x1D106]={
- category="so",
+ [0x1B2A2]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D106,
+ linebreak="id",
+ unicodeslot=0x1B2A2,
},
- [0x1D107]={
- category="so",
+ [0x1B2A3]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D107,
+ linebreak="id",
+ unicodeslot=0x1B2A3,
},
- [0x1D108]={
- category="so",
+ [0x1B2A4]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D108,
+ linebreak="id",
+ unicodeslot=0x1B2A4,
},
- [0x1D109]={
- category="so",
+ [0x1B2A5]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D109,
+ linebreak="id",
+ unicodeslot=0x1B2A5,
},
- [0x1D10A]={
- category="so",
+ [0x1B2A6]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D10A,
+ linebreak="id",
+ unicodeslot=0x1B2A6,
},
- [0x1D10B]={
- category="so",
+ [0x1B2A7]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D10B,
+ linebreak="id",
+ unicodeslot=0x1B2A7,
},
- [0x1D10C]={
- category="so",
+ [0x1B2A8]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D10C,
+ linebreak="id",
+ unicodeslot=0x1B2A8,
},
- [0x1D10D]={
- category="so",
+ [0x1B2A9]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D10D,
+ linebreak="id",
+ unicodeslot=0x1B2A9,
},
- [0x1D10E]={
- category="so",
+ [0x1B2AA]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D10E,
+ linebreak="id",
+ unicodeslot=0x1B2AA,
},
- [0x1D10F]={
- category="so",
+ [0x1B2AB]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D10F,
+ linebreak="id",
+ unicodeslot=0x1B2AB,
},
- [0x1D110]={
- category="so",
+ [0x1B2AC]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D110,
+ linebreak="id",
+ unicodeslot=0x1B2AC,
},
- [0x1D111]={
- category="so",
+ [0x1B2AD]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D111,
+ linebreak="id",
+ unicodeslot=0x1B2AD,
},
- [0x1D112]={
- category="so",
+ [0x1B2AE]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D112,
+ linebreak="id",
+ unicodeslot=0x1B2AE,
},
- [0x1D113]={
- category="so",
+ [0x1B2AF]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D113,
+ linebreak="id",
+ unicodeslot=0x1B2AF,
},
- [0x1D114]={
- category="so",
+ [0x1B2B0]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D114,
+ linebreak="id",
+ unicodeslot=0x1B2B0,
},
- [0x1D115]={
- category="so",
+ [0x1B2B1]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D115,
+ linebreak="id",
+ unicodeslot=0x1B2B1,
},
- [0x1D116]={
- category="so",
+ [0x1B2B2]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D116,
+ linebreak="id",
+ unicodeslot=0x1B2B2,
},
- [0x1D117]={
- category="so",
+ [0x1B2B3]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D117,
+ linebreak="id",
+ unicodeslot=0x1B2B3,
},
- [0x1D118]={
- category="so",
+ [0x1B2B4]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D118,
+ linebreak="id",
+ unicodeslot=0x1B2B4,
},
- [0x1D119]={
- category="so",
+ [0x1B2B5]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D119,
+ linebreak="id",
+ unicodeslot=0x1B2B5,
},
- [0x1D11A]={
- category="so",
+ [0x1B2B6]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D11A,
+ linebreak="id",
+ unicodeslot=0x1B2B6,
},
- [0x1D11B]={
- category="so",
+ [0x1B2B7]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D11B,
+ linebreak="id",
+ unicodeslot=0x1B2B7,
},
- [0x1D11C]={
- category="so",
+ [0x1B2B8]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D11C,
+ linebreak="id",
+ unicodeslot=0x1B2B8,
},
- [0x1D11D]={
- category="so",
+ [0x1B2B9]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D11D,
+ linebreak="id",
+ unicodeslot=0x1B2B9,
},
- [0x1D11E]={
- category="so",
+ [0x1B2BA]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D11E,
+ linebreak="id",
+ unicodeslot=0x1B2BA,
},
- [0x1D11F]={
- category="so",
+ [0x1B2BB]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D11F,
+ linebreak="id",
+ unicodeslot=0x1B2BB,
},
- [0x1D120]={
- category="so",
+ [0x1B2BC]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D120,
+ linebreak="id",
+ unicodeslot=0x1B2BC,
},
- [0x1D121]={
- category="so",
+ [0x1B2BD]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D121,
+ linebreak="id",
+ unicodeslot=0x1B2BD,
},
- [0x1D122]={
- category="so",
+ [0x1B2BE]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D122,
+ linebreak="id",
+ unicodeslot=0x1B2BE,
},
- [0x1D123]={
- category="so",
+ [0x1B2BF]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D123,
+ linebreak="id",
+ unicodeslot=0x1B2BF,
},
- [0x1D124]={
- category="so",
+ [0x1B2C0]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D124,
+ linebreak="id",
+ unicodeslot=0x1B2C0,
},
- [0x1D125]={
- category="so",
+ [0x1B2C1]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D125,
+ linebreak="id",
+ unicodeslot=0x1B2C1,
},
- [0x1D126]={
- category="so",
+ [0x1B2C2]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D126,
+ linebreak="id",
+ unicodeslot=0x1B2C2,
},
- [0x1D129]={
- category="so",
+ [0x1B2C3]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D129,
+ linebreak="id",
+ unicodeslot=0x1B2C3,
},
- [0x1D12A]={
- category="so",
+ [0x1B2C4]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D12A,
+ linebreak="id",
+ unicodeslot=0x1B2C4,
},
- [0x1D12B]={
- category="so",
+ [0x1B2C5]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D12B,
+ linebreak="id",
+ unicodeslot=0x1B2C5,
},
- [0x1D12C]={
- category="so",
+ [0x1B2C6]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D12C,
+ linebreak="id",
+ unicodeslot=0x1B2C6,
},
- [0x1D12D]={
- category="so",
+ [0x1B2C7]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D12D,
+ linebreak="id",
+ unicodeslot=0x1B2C7,
},
- [0x1D12E]={
- category="so",
+ [0x1B2C8]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D12E,
+ linebreak="id",
+ unicodeslot=0x1B2C8,
},
- [0x1D12F]={
- category="so",
+ [0x1B2C9]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D12F,
+ linebreak="id",
+ unicodeslot=0x1B2C9,
},
- [0x1D130]={
- category="so",
+ [0x1B2CA]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D130,
+ linebreak="id",
+ unicodeslot=0x1B2CA,
},
- [0x1D131]={
- category="so",
+ [0x1B2CB]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D131,
+ linebreak="id",
+ unicodeslot=0x1B2CB,
},
- [0x1D132]={
- category="so",
+ [0x1B2CC]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D132,
+ linebreak="id",
+ unicodeslot=0x1B2CC,
},
- [0x1D133]={
- category="so",
+ [0x1B2CD]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D133,
+ linebreak="id",
+ unicodeslot=0x1B2CD,
},
- [0x1D134]={
- category="so",
+ [0x1B2CE]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D134,
+ linebreak="id",
+ unicodeslot=0x1B2CE,
},
- [0x1D135]={
- category="so",
+ [0x1B2CF]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D135,
+ linebreak="id",
+ unicodeslot=0x1B2CF,
},
- [0x1D136]={
- category="so",
+ [0x1B2D0]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D136,
+ linebreak="id",
+ unicodeslot=0x1B2D0,
},
- [0x1D137]={
- category="so",
+ [0x1B2D1]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D137,
+ linebreak="id",
+ unicodeslot=0x1B2D1,
},
- [0x1D138]={
- category="so",
+ [0x1B2D2]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D138,
+ linebreak="id",
+ unicodeslot=0x1B2D2,
},
- [0x1D139]={
- category="so",
+ [0x1B2D3]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D139,
+ linebreak="id",
+ unicodeslot=0x1B2D3,
},
- [0x1D13A]={
- category="so",
+ [0x1B2D4]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D13A,
+ linebreak="id",
+ unicodeslot=0x1B2D4,
},
- [0x1D13B]={
- category="so",
+ [0x1B2D5]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D13B,
+ linebreak="id",
+ unicodeslot=0x1B2D5,
},
- [0x1D13C]={
- category="so",
+ [0x1B2D6]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D13C,
+ linebreak="id",
+ unicodeslot=0x1B2D6,
},
- [0x1D13D]={
- category="so",
+ [0x1B2D7]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D13D,
+ linebreak="id",
+ unicodeslot=0x1B2D7,
},
- [0x1D13E]={
- category="so",
+ [0x1B2D8]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D13E,
+ linebreak="id",
+ unicodeslot=0x1B2D8,
},
- [0x1D13F]={
- category="so",
+ [0x1B2D9]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D13F,
+ linebreak="id",
+ unicodeslot=0x1B2D9,
},
- [0x1D140]={
- category="so",
+ [0x1B2DA]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D140,
+ linebreak="id",
+ unicodeslot=0x1B2DA,
},
- [0x1D141]={
- category="so",
+ [0x1B2DB]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D141,
+ linebreak="id",
+ unicodeslot=0x1B2DB,
},
- [0x1D142]={
- category="so",
+ [0x1B2DC]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D142,
+ linebreak="id",
+ unicodeslot=0x1B2DC,
},
- [0x1D143]={
- category="so",
+ [0x1B2DD]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D143,
+ linebreak="id",
+ unicodeslot=0x1B2DD,
},
- [0x1D144]={
- category="so",
+ [0x1B2DE]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D144,
+ linebreak="id",
+ unicodeslot=0x1B2DE,
},
- [0x1D145]={
- category="so",
+ [0x1B2DF]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D145,
+ linebreak="id",
+ unicodeslot=0x1B2DF,
},
- [0x1D146]={
- category="so",
+ [0x1B2E0]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D146,
+ linebreak="id",
+ unicodeslot=0x1B2E0,
},
- [0x1D147]={
- category="so",
+ [0x1B2E1]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D147,
+ linebreak="id",
+ unicodeslot=0x1B2E1,
},
- [0x1D148]={
- category="so",
+ [0x1B2E2]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D148,
+ linebreak="id",
+ unicodeslot=0x1B2E2,
},
- [0x1D149]={
- category="so",
+ [0x1B2E3]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D149,
+ linebreak="id",
+ unicodeslot=0x1B2E3,
},
- [0x1D14A]={
- category="so",
+ [0x1B2E4]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D14A,
+ linebreak="id",
+ unicodeslot=0x1B2E4,
},
- [0x1D14B]={
- category="so",
+ [0x1B2E5]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D14B,
+ linebreak="id",
+ unicodeslot=0x1B2E5,
},
- [0x1D14C]={
- category="so",
+ [0x1B2E6]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D14C,
+ linebreak="id",
+ unicodeslot=0x1B2E6,
},
- [0x1D14D]={
- category="so",
+ [0x1B2E7]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D14D,
+ linebreak="id",
+ unicodeslot=0x1B2E7,
},
- [0x1D14E]={
- category="so",
+ [0x1B2E8]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D14E,
+ linebreak="id",
+ unicodeslot=0x1B2E8,
},
- [0x1D14F]={
- category="so",
+ [0x1B2E9]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D14F,
+ linebreak="id",
+ unicodeslot=0x1B2E9,
},
- [0x1D150]={
- category="so",
+ [0x1B2EA]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D150,
+ linebreak="id",
+ unicodeslot=0x1B2EA,
},
- [0x1D151]={
- category="so",
+ [0x1B2EB]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D151,
+ linebreak="id",
+ unicodeslot=0x1B2EB,
},
- [0x1D152]={
- category="so",
+ [0x1B2EC]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D152,
+ linebreak="id",
+ unicodeslot=0x1B2EC,
},
- [0x1D153]={
- category="so",
+ [0x1B2ED]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D153,
+ linebreak="id",
+ unicodeslot=0x1B2ED,
},
- [0x1D154]={
- category="so",
+ [0x1B2EE]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D154,
+ linebreak="id",
+ unicodeslot=0x1B2EE,
},
- [0x1D155]={
- category="so",
+ [0x1B2EF]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D155,
+ linebreak="id",
+ unicodeslot=0x1B2EF,
},
- [0x1D156]={
- category="so",
+ [0x1B2F0]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D156,
+ linebreak="id",
+ unicodeslot=0x1B2F0,
},
- [0x1D157]={
- category="so",
+ [0x1B2F1]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D157,
+ linebreak="id",
+ unicodeslot=0x1B2F1,
},
- [0x1D158]={
- category="so",
+ [0x1B2F2]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D158,
+ linebreak="id",
+ unicodeslot=0x1B2F2,
},
- [0x1D159]={
- category="so",
+ [0x1B2F3]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D159,
+ linebreak="id",
+ unicodeslot=0x1B2F3,
},
- [0x1D15A]={
- category="so",
+ [0x1B2F4]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D15A,
+ linebreak="id",
+ unicodeslot=0x1B2F4,
},
- [0x1D15B]={
- category="so",
+ [0x1B2F5]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D15B,
+ linebreak="id",
+ unicodeslot=0x1B2F5,
},
- [0x1D15C]={
- category="so",
+ [0x1B2F6]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D15C,
+ linebreak="id",
+ unicodeslot=0x1B2F6,
},
- [0x1D15D]={
- category="so",
+ [0x1B2F7]={
+ category="lo",
direction="l",
- linebreak="al",
- unicodeslot=0x1D15D,
+ linebreak="id",
+ unicodeslot=0x1B2F7,
},
- [0x1D15E]={
- category="so",
+ [0x1B2F8]={
+ category="lo",
direction="l",
- linebreak="al",
- specials={ "char", 0x1D157, 0x1D165 },
- unicodeslot=0x1D15E,
+ linebreak="id",
+ unicodeslot=0x1B2F8,
},
- [0x1D15F]={
- category="so",
+ [0x1B2F9]={
+ category="lo",
direction="l",
- linebreak="al",
- specials={ "char", 0x1D158, 0x1D165 },
- unicodeslot=0x1D15F,
+ linebreak="id",
+ unicodeslot=0x1B2F9,
},
- [0x1D160]={
- category="so",
+ [0x1B2FA]={
+ category="lo",
direction="l",
- linebreak="al",
- specials={ "char", 0x1D15F, 0x1D16E },
- unicodeslot=0x1D160,
+ linebreak="id",
+ unicodeslot=0x1B2FA,
},
- [0x1D161]={
- category="so",
+ [0x1B2FB]={
+ category="lo",
direction="l",
- linebreak="al",
- specials={ "char", 0x1D15F, 0x1D16F },
- unicodeslot=0x1D161,
+ linebreak="id",
+ unicodeslot=0x1B2FB,
},
- [0x1D162]={
- category="so",
+ [0x1BC00]={
+ category="lo",
direction="l",
linebreak="al",
- specials={ "char", 0x1D15F, 0x1D170 },
- unicodeslot=0x1D162,
+ unicodeslot=0x1BC00,
},
- [0x1D163]={
- category="so",
+ [0x1BC01]={
+ category="lo",
direction="l",
linebreak="al",
- specials={ "char", 0x1D15F, 0x1D171 },
- unicodeslot=0x1D163,
+ unicodeslot=0x1BC01,
},
- [0x1D164]={
- category="so",
+ [0x1BC02]={
+ category="lo",
direction="l",
linebreak="al",
- specials={ "char", 0x1D15F, 0x1D172 },
- unicodeslot=0x1D164,
+ unicodeslot=0x1BC02,
},
- [0x1D165]={
- category="mc",
+ [0x1BC03]={
+ category="lo",
direction="l",
- linebreak="cm",
- unicodeslot=0x1D165,
+ linebreak="al",
+ unicodeslot=0x1BC03,
},
- [0x1D166]={
- category="mc",
+ [0x1BC04]={
+ category="lo",
direction="l",
- linebreak="cm",
- unicodeslot=0x1D166,
- },
- [0x1D167]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D167,
- },
- [0x1D168]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D168,
- },
- [0x1D169]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D169,
+ linebreak="al",
+ unicodeslot=0x1BC04,
},
- [0x1D16A]={
- category="so",
+ [0x1BC05]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D16A,
+ unicodeslot=0x1BC05,
},
- [0x1D16B]={
- category="so",
+ [0x1BC06]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D16B,
+ unicodeslot=0x1BC06,
},
- [0x1D16C]={
- category="so",
+ [0x1BC07]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D16C,
+ unicodeslot=0x1BC07,
},
- [0x1D16D]={
- category="mc",
+ [0x1BC08]={
+ category="lo",
direction="l",
- linebreak="cm",
- unicodeslot=0x1D16D,
+ linebreak="al",
+ unicodeslot=0x1BC08,
},
- [0x1D16E]={
- category="mc",
+ [0x1BC09]={
+ category="lo",
direction="l",
- linebreak="cm",
- unicodeslot=0x1D16E,
+ linebreak="al",
+ unicodeslot=0x1BC09,
},
- [0x1D16F]={
- category="mc",
+ [0x1BC0A]={
+ category="lo",
direction="l",
- linebreak="cm",
- unicodeslot=0x1D16F,
+ linebreak="al",
+ unicodeslot=0x1BC0A,
},
- [0x1D170]={
- category="mc",
+ [0x1BC0B]={
+ category="lo",
direction="l",
- linebreak="cm",
- unicodeslot=0x1D170,
+ linebreak="al",
+ unicodeslot=0x1BC0B,
},
- [0x1D171]={
- category="mc",
+ [0x1BC0C]={
+ category="lo",
direction="l",
- linebreak="cm",
- unicodeslot=0x1D171,
+ linebreak="al",
+ unicodeslot=0x1BC0C,
},
- [0x1D172]={
- category="mc",
+ [0x1BC0D]={
+ category="lo",
direction="l",
- linebreak="cm",
- unicodeslot=0x1D172,
- },
- [0x1D173]={
- category="cf",
- direction="bn",
- linebreak="cm",
- unicodeslot=0x1D173,
- },
- [0x1D174]={
- category="cf",
- direction="bn",
- linebreak="cm",
- unicodeslot=0x1D174,
- },
- [0x1D175]={
- category="cf",
- direction="bn",
- linebreak="cm",
- unicodeslot=0x1D175,
- },
- [0x1D176]={
- category="cf",
- direction="bn",
- linebreak="cm",
- unicodeslot=0x1D176,
- },
- [0x1D177]={
- category="cf",
- direction="bn",
- linebreak="cm",
- unicodeslot=0x1D177,
- },
- [0x1D178]={
- category="cf",
- direction="bn",
- linebreak="cm",
- unicodeslot=0x1D178,
- },
- [0x1D179]={
- category="cf",
- direction="bn",
- linebreak="cm",
- unicodeslot=0x1D179,
- },
- [0x1D17A]={
- category="cf",
- direction="bn",
- linebreak="cm",
- unicodeslot=0x1D17A,
- },
- [0x1D17B]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D17B,
- },
- [0x1D17C]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D17C,
- },
- [0x1D17D]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D17D,
- },
- [0x1D17E]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D17E,
- },
- [0x1D17F]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D17F,
- },
- [0x1D180]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D180,
- },
- [0x1D181]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D181,
- },
- [0x1D182]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D182,
+ linebreak="al",
+ unicodeslot=0x1BC0D,
},
- [0x1D183]={
- category="so",
+ [0x1BC0E]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D183,
+ unicodeslot=0x1BC0E,
},
- [0x1D184]={
- category="so",
+ [0x1BC0F]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D184,
- },
- [0x1D185]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D185,
- },
- [0x1D186]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D186,
- },
- [0x1D187]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D187,
- },
- [0x1D188]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D188,
- },
- [0x1D189]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D189,
- },
- [0x1D18A]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D18A,
- },
- [0x1D18B]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D18B,
+ unicodeslot=0x1BC0F,
},
- [0x1D18C]={
- category="so",
+ [0x1BC10]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D18C,
+ unicodeslot=0x1BC10,
},
- [0x1D18D]={
- category="so",
+ [0x1BC11]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D18D,
+ unicodeslot=0x1BC11,
},
- [0x1D18E]={
- category="so",
+ [0x1BC12]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D18E,
+ unicodeslot=0x1BC12,
},
- [0x1D18F]={
- category="so",
+ [0x1BC13]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D18F,
+ unicodeslot=0x1BC13,
},
- [0x1D190]={
- category="so",
+ [0x1BC14]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D190,
+ unicodeslot=0x1BC14,
},
- [0x1D191]={
- category="so",
+ [0x1BC15]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D191,
+ unicodeslot=0x1BC15,
},
- [0x1D192]={
- category="so",
+ [0x1BC16]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D192,
+ unicodeslot=0x1BC16,
},
- [0x1D193]={
- category="so",
+ [0x1BC17]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D193,
+ unicodeslot=0x1BC17,
},
- [0x1D194]={
- category="so",
+ [0x1BC18]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D194,
+ unicodeslot=0x1BC18,
},
- [0x1D195]={
- category="so",
+ [0x1BC19]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D195,
+ unicodeslot=0x1BC19,
},
- [0x1D196]={
- category="so",
+ [0x1BC1A]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D196,
+ unicodeslot=0x1BC1A,
},
- [0x1D197]={
- category="so",
+ [0x1BC1B]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D197,
+ unicodeslot=0x1BC1B,
},
- [0x1D198]={
- category="so",
+ [0x1BC1C]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D198,
+ unicodeslot=0x1BC1C,
},
- [0x1D199]={
- category="so",
+ [0x1BC1D]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D199,
+ unicodeslot=0x1BC1D,
},
- [0x1D19A]={
- category="so",
+ [0x1BC1E]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D19A,
+ unicodeslot=0x1BC1E,
},
- [0x1D19B]={
- category="so",
+ [0x1BC1F]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D19B,
+ unicodeslot=0x1BC1F,
},
- [0x1D19C]={
- category="so",
+ [0x1BC20]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D19C,
+ unicodeslot=0x1BC20,
},
- [0x1D19D]={
- category="so",
+ [0x1BC21]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D19D,
+ unicodeslot=0x1BC21,
},
- [0x1D19E]={
- category="so",
+ [0x1BC22]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D19E,
+ unicodeslot=0x1BC22,
},
- [0x1D19F]={
- category="so",
+ [0x1BC23]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D19F,
+ unicodeslot=0x1BC23,
},
- [0x1D1A0]={
- category="so",
+ [0x1BC24]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1A0,
+ unicodeslot=0x1BC24,
},
- [0x1D1A1]={
- category="so",
+ [0x1BC25]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1A1,
+ unicodeslot=0x1BC25,
},
- [0x1D1A2]={
- category="so",
+ [0x1BC26]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1A2,
+ unicodeslot=0x1BC26,
},
- [0x1D1A3]={
- category="so",
+ [0x1BC27]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1A3,
+ unicodeslot=0x1BC27,
},
- [0x1D1A4]={
- category="so",
+ [0x1BC28]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1A4,
+ unicodeslot=0x1BC28,
},
- [0x1D1A5]={
- category="so",
+ [0x1BC29]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1A5,
+ unicodeslot=0x1BC29,
},
- [0x1D1A6]={
- category="so",
+ [0x1BC2A]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1A6,
+ unicodeslot=0x1BC2A,
},
- [0x1D1A7]={
- category="so",
+ [0x1BC2B]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1A7,
+ unicodeslot=0x1BC2B,
},
- [0x1D1A8]={
- category="so",
+ [0x1BC2C]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1A8,
+ unicodeslot=0x1BC2C,
},
- [0x1D1A9]={
- category="so",
+ [0x1BC2D]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1A9,
- },
- [0x1D1AA]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D1AA,
- },
- [0x1D1AB]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D1AB,
- },
- [0x1D1AC]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D1AC,
- },
- [0x1D1AD]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D1AD,
+ unicodeslot=0x1BC2D,
},
- [0x1D1AE]={
- category="so",
+ [0x1BC2E]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1AE,
+ unicodeslot=0x1BC2E,
},
- [0x1D1AF]={
- category="so",
+ [0x1BC2F]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1AF,
+ unicodeslot=0x1BC2F,
},
- [0x1D1B0]={
- category="so",
+ [0x1BC30]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1B0,
+ unicodeslot=0x1BC30,
},
- [0x1D1B1]={
- category="so",
+ [0x1BC31]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1B1,
+ unicodeslot=0x1BC31,
},
- [0x1D1B2]={
- category="so",
+ [0x1BC32]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1B2,
+ unicodeslot=0x1BC32,
},
- [0x1D1B3]={
- category="so",
+ [0x1BC33]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1B3,
+ unicodeslot=0x1BC33,
},
- [0x1D1B4]={
- category="so",
+ [0x1BC34]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1B4,
+ unicodeslot=0x1BC34,
},
- [0x1D1B5]={
- category="so",
+ [0x1BC35]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1B5,
+ unicodeslot=0x1BC35,
},
- [0x1D1B6]={
- category="so",
+ [0x1BC36]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1B6,
+ unicodeslot=0x1BC36,
},
- [0x1D1B7]={
- category="so",
+ [0x1BC37]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1B7,
+ unicodeslot=0x1BC37,
},
- [0x1D1B8]={
- category="so",
+ [0x1BC38]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1B8,
+ unicodeslot=0x1BC38,
},
- [0x1D1B9]={
- category="so",
+ [0x1BC39]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1B9,
+ unicodeslot=0x1BC39,
},
- [0x1D1BA]={
- category="so",
+ [0x1BC3A]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1BA,
+ unicodeslot=0x1BC3A,
},
- [0x1D1BB]={
- category="so",
+ [0x1BC3B]={
+ category="lo",
direction="l",
linebreak="al",
- specials={ "char", 0x1D1B9, 0x1D165 },
- unicodeslot=0x1D1BB,
+ unicodeslot=0x1BC3B,
},
- [0x1D1BC]={
- category="so",
+ [0x1BC3C]={
+ category="lo",
direction="l",
linebreak="al",
- specials={ "char", 0x1D1BA, 0x1D165 },
- unicodeslot=0x1D1BC,
+ unicodeslot=0x1BC3C,
},
- [0x1D1BD]={
- category="so",
+ [0x1BC3D]={
+ category="lo",
direction="l",
linebreak="al",
- specials={ "char", 0x1D1BB, 0x1D16E },
- unicodeslot=0x1D1BD,
+ unicodeslot=0x1BC3D,
},
- [0x1D1BE]={
- category="so",
+ [0x1BC3E]={
+ category="lo",
direction="l",
linebreak="al",
- specials={ "char", 0x1D1BC, 0x1D16E },
- unicodeslot=0x1D1BE,
+ unicodeslot=0x1BC3E,
},
- [0x1D1BF]={
- category="so",
+ [0x1BC3F]={
+ category="lo",
direction="l",
linebreak="al",
- specials={ "char", 0x1D1BB, 0x1D16F },
- unicodeslot=0x1D1BF,
+ unicodeslot=0x1BC3F,
},
- [0x1D1C0]={
- category="so",
+ [0x1BC40]={
+ category="lo",
direction="l",
linebreak="al",
- specials={ "char", 0x1D1BC, 0x1D16F },
- unicodeslot=0x1D1C0,
+ unicodeslot=0x1BC40,
},
- [0x1D1C1]={
- category="so",
+ [0x1BC41]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1C1,
+ unicodeslot=0x1BC41,
},
- [0x1D1C2]={
- category="so",
+ [0x1BC42]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1C2,
+ unicodeslot=0x1BC42,
},
- [0x1D1C3]={
- category="so",
+ [0x1BC43]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1C3,
+ unicodeslot=0x1BC43,
},
- [0x1D1C4]={
- category="so",
+ [0x1BC44]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1C4,
+ unicodeslot=0x1BC44,
},
- [0x1D1C5]={
- category="so",
+ [0x1BC45]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1C5,
+ unicodeslot=0x1BC45,
},
- [0x1D1C6]={
- category="so",
+ [0x1BC46]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1C6,
+ unicodeslot=0x1BC46,
},
- [0x1D1C7]={
- category="so",
+ [0x1BC47]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1C7,
+ unicodeslot=0x1BC47,
},
- [0x1D1C8]={
- category="so",
+ [0x1BC48]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1C8,
+ unicodeslot=0x1BC48,
},
- [0x1D1C9]={
- category="so",
+ [0x1BC49]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1C9,
+ unicodeslot=0x1BC49,
},
- [0x1D1CA]={
- category="so",
+ [0x1BC4A]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1CA,
+ unicodeslot=0x1BC4A,
},
- [0x1D1CB]={
- category="so",
+ [0x1BC4B]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1CB,
+ unicodeslot=0x1BC4B,
},
- [0x1D1CC]={
- category="so",
+ [0x1BC4C]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1CC,
+ unicodeslot=0x1BC4C,
},
- [0x1D1CD]={
- category="so",
+ [0x1BC4D]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1CD,
+ unicodeslot=0x1BC4D,
},
- [0x1D1CE]={
- category="so",
+ [0x1BC4E]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1CE,
+ unicodeslot=0x1BC4E,
},
- [0x1D1CF]={
- category="so",
+ [0x1BC4F]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1CF,
+ unicodeslot=0x1BC4F,
},
- [0x1D1D0]={
- category="so",
+ [0x1BC50]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1D0,
+ unicodeslot=0x1BC50,
},
- [0x1D1D1]={
- category="so",
+ [0x1BC51]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1D1,
+ unicodeslot=0x1BC51,
},
- [0x1D1D2]={
- category="so",
+ [0x1BC52]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1D2,
+ unicodeslot=0x1BC52,
},
- [0x1D1D3]={
- category="so",
+ [0x1BC53]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1D3,
+ unicodeslot=0x1BC53,
},
- [0x1D1D4]={
- category="so",
+ [0x1BC54]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1D4,
+ unicodeslot=0x1BC54,
},
- [0x1D1D5]={
- category="so",
+ [0x1BC55]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1D5,
+ unicodeslot=0x1BC55,
},
- [0x1D1D6]={
- category="so",
+ [0x1BC56]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1D6,
+ unicodeslot=0x1BC56,
},
- [0x1D1D7]={
- category="so",
+ [0x1BC57]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1D7,
+ unicodeslot=0x1BC57,
},
- [0x1D1D8]={
- category="so",
+ [0x1BC58]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1D8,
+ unicodeslot=0x1BC58,
},
- [0x1D1D9]={
- category="so",
+ [0x1BC59]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1D9,
+ unicodeslot=0x1BC59,
},
- [0x1D1DA]={
- category="so",
+ [0x1BC5A]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1DA,
+ unicodeslot=0x1BC5A,
},
- [0x1D1DB]={
- category="so",
+ [0x1BC5B]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1DB,
+ unicodeslot=0x1BC5B,
},
- [0x1D1DC]={
- category="so",
+ [0x1BC5C]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1DC,
+ unicodeslot=0x1BC5C,
},
- [0x1D1DD]={
- category="so",
+ [0x1BC5D]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1DD,
+ unicodeslot=0x1BC5D,
},
- [0x1D1DE]={
- category="so",
+ [0x1BC5E]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1DE,
+ unicodeslot=0x1BC5E,
},
- [0x1D1DF]={
- category="so",
+ [0x1BC5F]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1DF,
+ unicodeslot=0x1BC5F,
},
- [0x1D1E0]={
- category="so",
+ [0x1BC60]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1E0,
+ unicodeslot=0x1BC60,
},
- [0x1D1E1]={
- category="so",
+ [0x1BC61]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1E1,
+ unicodeslot=0x1BC61,
},
- [0x1D1E2]={
- category="so",
+ [0x1BC62]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1E2,
+ unicodeslot=0x1BC62,
},
- [0x1D1E3]={
- category="so",
+ [0x1BC63]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1E3,
+ unicodeslot=0x1BC63,
},
- [0x1D1E4]={
- category="so",
+ [0x1BC64]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1E4,
+ unicodeslot=0x1BC64,
},
- [0x1D1E5]={
- category="so",
+ [0x1BC65]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1E5,
+ unicodeslot=0x1BC65,
},
- [0x1D1E6]={
- category="so",
+ [0x1BC66]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1E6,
+ unicodeslot=0x1BC66,
},
- [0x1D1E7]={
- category="so",
+ [0x1BC67]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1E7,
+ unicodeslot=0x1BC67,
},
- [0x1D1E8]={
- category="so",
+ [0x1BC68]={
+ category="lo",
direction="l",
linebreak="al",
- unicodeslot=0x1D1E8,
+ unicodeslot=0x1BC68,
},
- [0x1D200]={
- category="so",
- direction="on",
+ [0x1BC69]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D200,
+ unicodeslot=0x1BC69,
},
- [0x1D201]={
- category="so",
- direction="on",
+ [0x1BC6A]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D201,
+ unicodeslot=0x1BC6A,
},
- [0x1D202]={
- category="so",
- direction="on",
+ [0x1BC70]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D202,
+ unicodeslot=0x1BC70,
},
- [0x1D203]={
- category="so",
- direction="on",
+ [0x1BC71]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D203,
+ unicodeslot=0x1BC71,
},
- [0x1D204]={
- category="so",
- direction="on",
+ [0x1BC72]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D204,
+ unicodeslot=0x1BC72,
},
- [0x1D205]={
- category="so",
- direction="on",
+ [0x1BC73]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D205,
+ unicodeslot=0x1BC73,
},
- [0x1D206]={
- category="so",
- direction="on",
+ [0x1BC74]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D206,
+ unicodeslot=0x1BC74,
},
- [0x1D207]={
- category="so",
- direction="on",
+ [0x1BC75]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D207,
+ unicodeslot=0x1BC75,
},
- [0x1D208]={
- category="so",
- direction="on",
+ [0x1BC76]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D208,
+ unicodeslot=0x1BC76,
},
- [0x1D209]={
- category="so",
- direction="on",
+ [0x1BC77]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D209,
+ unicodeslot=0x1BC77,
},
- [0x1D20A]={
- category="so",
- direction="on",
+ [0x1BC78]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D20A,
+ unicodeslot=0x1BC78,
},
- [0x1D20B]={
- category="so",
- direction="on",
+ [0x1BC79]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D20B,
+ unicodeslot=0x1BC79,
},
- [0x1D20C]={
- category="so",
- direction="on",
+ [0x1BC7A]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D20C,
+ unicodeslot=0x1BC7A,
},
- [0x1D20D]={
- category="so",
- direction="on",
+ [0x1BC7B]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D20D,
+ unicodeslot=0x1BC7B,
},
- [0x1D20E]={
- category="so",
- direction="on",
+ [0x1BC7C]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D20E,
+ unicodeslot=0x1BC7C,
},
- [0x1D20F]={
- category="so",
- direction="on",
+ [0x1BC80]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D20F,
+ unicodeslot=0x1BC80,
},
- [0x1D210]={
- category="so",
- direction="on",
+ [0x1BC81]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D210,
+ unicodeslot=0x1BC81,
},
- [0x1D211]={
- category="so",
- direction="on",
+ [0x1BC82]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D211,
+ unicodeslot=0x1BC82,
},
- [0x1D212]={
- category="so",
- direction="on",
+ [0x1BC83]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D212,
+ unicodeslot=0x1BC83,
},
- [0x1D213]={
- category="so",
- direction="on",
+ [0x1BC84]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D213,
+ unicodeslot=0x1BC84,
},
- [0x1D214]={
- category="so",
- direction="on",
+ [0x1BC85]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D214,
+ unicodeslot=0x1BC85,
},
- [0x1D215]={
- category="so",
- direction="on",
+ [0x1BC86]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D215,
+ unicodeslot=0x1BC86,
},
- [0x1D216]={
- category="so",
- direction="on",
+ [0x1BC87]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D216,
+ unicodeslot=0x1BC87,
},
- [0x1D217]={
- category="so",
- direction="on",
+ [0x1BC88]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D217,
+ unicodeslot=0x1BC88,
},
- [0x1D218]={
- category="so",
- direction="on",
+ [0x1BC90]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D218,
+ unicodeslot=0x1BC90,
},
- [0x1D219]={
- category="so",
- direction="on",
+ [0x1BC91]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D219,
+ unicodeslot=0x1BC91,
},
- [0x1D21A]={
- category="so",
- direction="on",
+ [0x1BC92]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D21A,
+ unicodeslot=0x1BC92,
},
- [0x1D21B]={
- category="so",
- direction="on",
+ [0x1BC93]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D21B,
+ unicodeslot=0x1BC93,
},
- [0x1D21C]={
- category="so",
- direction="on",
+ [0x1BC94]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D21C,
+ unicodeslot=0x1BC94,
},
- [0x1D21D]={
- category="so",
- direction="on",
+ [0x1BC95]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D21D,
+ unicodeslot=0x1BC95,
},
- [0x1D21E]={
- category="so",
- direction="on",
+ [0x1BC96]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D21E,
+ unicodeslot=0x1BC96,
},
- [0x1D21F]={
- category="so",
- direction="on",
+ [0x1BC97]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D21F,
+ unicodeslot=0x1BC97,
},
- [0x1D220]={
- category="so",
- direction="on",
+ [0x1BC98]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D220,
+ unicodeslot=0x1BC98,
},
- [0x1D221]={
- category="so",
- direction="on",
+ [0x1BC99]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D221,
+ unicodeslot=0x1BC99,
},
- [0x1D222]={
+ [0x1BC9C]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D222,
+ unicodeslot=0x1BC9C,
},
- [0x1D223]={
+ [0x1BC9D]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1BC9D,
+ },
+ [0x1BC9E]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1BC9E,
+ },
+ [0x1BC9F]={
+ category="po",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1BC9F,
+ },
+ [0x1BCA0]={
+ category="cf",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1BCA0,
+ },
+ [0x1BCA1]={
+ category="cf",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1BCA1,
+ },
+ [0x1BCA2]={
+ category="cf",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1BCA2,
+ },
+ [0x1BCA3]={
+ category="cf",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1BCA3,
+ },
+ [0x1D000]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D223,
+ unicodeslot=0x1D000,
},
- [0x1D224]={
+ [0x1D001]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D224,
+ unicodeslot=0x1D001,
},
- [0x1D225]={
+ [0x1D002]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D225,
+ unicodeslot=0x1D002,
},
- [0x1D226]={
+ [0x1D003]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D226,
+ unicodeslot=0x1D003,
},
- [0x1D227]={
+ [0x1D004]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D227,
+ unicodeslot=0x1D004,
},
- [0x1D228]={
+ [0x1D005]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D228,
+ unicodeslot=0x1D005,
},
- [0x1D229]={
+ [0x1D006]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D229,
+ unicodeslot=0x1D006,
},
- [0x1D22A]={
+ [0x1D007]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D22A,
+ unicodeslot=0x1D007,
},
- [0x1D22B]={
+ [0x1D008]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D22B,
+ unicodeslot=0x1D008,
},
- [0x1D22C]={
+ [0x1D009]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D22C,
+ unicodeslot=0x1D009,
},
- [0x1D22D]={
+ [0x1D00A]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D22D,
+ unicodeslot=0x1D00A,
},
- [0x1D22E]={
+ [0x1D00B]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D22E,
+ unicodeslot=0x1D00B,
},
- [0x1D22F]={
+ [0x1D00C]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D22F,
+ unicodeslot=0x1D00C,
},
- [0x1D230]={
+ [0x1D00D]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D230,
+ unicodeslot=0x1D00D,
},
- [0x1D231]={
+ [0x1D00E]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D231,
+ unicodeslot=0x1D00E,
},
- [0x1D232]={
+ [0x1D00F]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D232,
+ unicodeslot=0x1D00F,
},
- [0x1D233]={
+ [0x1D010]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D233,
+ unicodeslot=0x1D010,
},
- [0x1D234]={
+ [0x1D011]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D234,
+ unicodeslot=0x1D011,
},
- [0x1D235]={
+ [0x1D012]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D235,
+ unicodeslot=0x1D012,
},
- [0x1D236]={
+ [0x1D013]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D236,
+ unicodeslot=0x1D013,
},
- [0x1D237]={
+ [0x1D014]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D237,
+ unicodeslot=0x1D014,
},
- [0x1D238]={
+ [0x1D015]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D238,
+ unicodeslot=0x1D015,
},
- [0x1D239]={
+ [0x1D016]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D239,
+ unicodeslot=0x1D016,
},
- [0x1D23A]={
+ [0x1D017]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D23A,
+ unicodeslot=0x1D017,
},
- [0x1D23B]={
+ [0x1D018]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D23B,
+ unicodeslot=0x1D018,
},
- [0x1D23C]={
+ [0x1D019]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D23C,
+ unicodeslot=0x1D019,
},
- [0x1D23D]={
+ [0x1D01A]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D23D,
+ unicodeslot=0x1D01A,
},
- [0x1D23E]={
+ [0x1D01B]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D23E,
+ unicodeslot=0x1D01B,
},
- [0x1D23F]={
+ [0x1D01C]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D23F,
+ unicodeslot=0x1D01C,
},
- [0x1D240]={
+ [0x1D01D]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D240,
+ unicodeslot=0x1D01D,
},
- [0x1D241]={
+ [0x1D01E]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D241,
- },
- [0x1D242]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D242,
- },
- [0x1D243]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D243,
- },
- [0x1D244]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1D244,
+ unicodeslot=0x1D01E,
},
- [0x1D245]={
+ [0x1D01F]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D245,
+ unicodeslot=0x1D01F,
},
- [0x1D2E0]={
- category="no",
+ [0x1D020]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2E0,
+ unicodeslot=0x1D020,
},
- [0x1D2E1]={
- category="no",
+ [0x1D021]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2E1,
+ unicodeslot=0x1D021,
},
- [0x1D2E2]={
- category="no",
+ [0x1D022]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2E2,
+ unicodeslot=0x1D022,
},
- [0x1D2E3]={
- category="no",
+ [0x1D023]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2E3,
+ unicodeslot=0x1D023,
},
- [0x1D2E4]={
- category="no",
+ [0x1D024]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2E4,
+ unicodeslot=0x1D024,
},
- [0x1D2E5]={
- category="no",
+ [0x1D025]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2E5,
+ unicodeslot=0x1D025,
},
- [0x1D2E6]={
- category="no",
+ [0x1D026]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2E6,
+ unicodeslot=0x1D026,
},
- [0x1D2E7]={
- category="no",
+ [0x1D027]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2E7,
+ unicodeslot=0x1D027,
},
- [0x1D2E8]={
- category="no",
+ [0x1D028]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2E8,
+ unicodeslot=0x1D028,
},
- [0x1D2E9]={
- category="no",
+ [0x1D029]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2E9,
+ unicodeslot=0x1D029,
},
- [0x1D2EA]={
- category="no",
+ [0x1D02A]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2EA,
+ unicodeslot=0x1D02A,
},
- [0x1D2EB]={
- category="no",
+ [0x1D02B]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2EB,
+ unicodeslot=0x1D02B,
},
- [0x1D2EC]={
- category="no",
+ [0x1D02C]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2EC,
+ unicodeslot=0x1D02C,
},
- [0x1D2ED]={
- category="no",
+ [0x1D02D]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2ED,
+ unicodeslot=0x1D02D,
},
- [0x1D2EE]={
- category="no",
+ [0x1D02E]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2EE,
+ unicodeslot=0x1D02E,
},
- [0x1D2EF]={
- category="no",
+ [0x1D02F]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2EF,
+ unicodeslot=0x1D02F,
},
- [0x1D2F0]={
- category="no",
+ [0x1D030]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2F0,
+ unicodeslot=0x1D030,
},
- [0x1D2F1]={
- category="no",
+ [0x1D031]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2F1,
+ unicodeslot=0x1D031,
},
- [0x1D2F2]={
- category="no",
+ [0x1D032]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2F2,
+ unicodeslot=0x1D032,
},
- [0x1D2F3]={
- category="no",
+ [0x1D033]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D2F3,
+ unicodeslot=0x1D033,
},
- [0x1D300]={
+ [0x1D034]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D300,
+ unicodeslot=0x1D034,
},
- [0x1D301]={
+ [0x1D035]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D301,
+ unicodeslot=0x1D035,
},
- [0x1D302]={
+ [0x1D036]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D302,
+ unicodeslot=0x1D036,
},
- [0x1D303]={
+ [0x1D037]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D303,
+ unicodeslot=0x1D037,
},
- [0x1D304]={
+ [0x1D038]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D304,
+ unicodeslot=0x1D038,
},
- [0x1D305]={
+ [0x1D039]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D305,
+ unicodeslot=0x1D039,
},
- [0x1D306]={
+ [0x1D03A]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D306,
+ unicodeslot=0x1D03A,
},
- [0x1D307]={
+ [0x1D03B]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D307,
+ unicodeslot=0x1D03B,
},
- [0x1D308]={
+ [0x1D03C]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D308,
+ unicodeslot=0x1D03C,
},
- [0x1D309]={
+ [0x1D03D]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D309,
+ unicodeslot=0x1D03D,
},
- [0x1D30A]={
+ [0x1D03E]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D30A,
+ unicodeslot=0x1D03E,
},
- [0x1D30B]={
+ [0x1D03F]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D30B,
+ unicodeslot=0x1D03F,
},
- [0x1D30C]={
+ [0x1D040]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D30C,
+ unicodeslot=0x1D040,
},
- [0x1D30D]={
+ [0x1D041]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D30D,
+ unicodeslot=0x1D041,
},
- [0x1D30E]={
+ [0x1D042]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D30E,
+ unicodeslot=0x1D042,
},
- [0x1D30F]={
+ [0x1D043]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D30F,
+ unicodeslot=0x1D043,
},
- [0x1D310]={
+ [0x1D044]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D310,
+ unicodeslot=0x1D044,
},
- [0x1D311]={
+ [0x1D045]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D311,
+ unicodeslot=0x1D045,
},
- [0x1D312]={
+ [0x1D046]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D312,
+ unicodeslot=0x1D046,
},
- [0x1D313]={
+ [0x1D047]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D313,
+ unicodeslot=0x1D047,
},
- [0x1D314]={
+ [0x1D048]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D314,
+ unicodeslot=0x1D048,
},
- [0x1D315]={
+ [0x1D049]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D315,
+ unicodeslot=0x1D049,
},
- [0x1D316]={
+ [0x1D04A]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D316,
+ unicodeslot=0x1D04A,
},
- [0x1D317]={
+ [0x1D04B]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D317,
+ unicodeslot=0x1D04B,
},
- [0x1D318]={
+ [0x1D04C]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D318,
+ unicodeslot=0x1D04C,
},
- [0x1D319]={
+ [0x1D04D]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D319,
+ unicodeslot=0x1D04D,
},
- [0x1D31A]={
+ [0x1D04E]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D31A,
+ unicodeslot=0x1D04E,
},
- [0x1D31B]={
+ [0x1D04F]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D31B,
+ unicodeslot=0x1D04F,
},
- [0x1D31C]={
+ [0x1D050]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D31C,
+ unicodeslot=0x1D050,
},
- [0x1D31D]={
+ [0x1D051]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D31D,
+ unicodeslot=0x1D051,
},
- [0x1D31E]={
+ [0x1D052]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D31E,
+ unicodeslot=0x1D052,
},
- [0x1D31F]={
+ [0x1D053]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D31F,
+ unicodeslot=0x1D053,
},
- [0x1D320]={
+ [0x1D054]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D320,
+ unicodeslot=0x1D054,
},
- [0x1D321]={
+ [0x1D055]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D321,
+ unicodeslot=0x1D055,
},
- [0x1D322]={
+ [0x1D056]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D322,
+ unicodeslot=0x1D056,
},
- [0x1D323]={
+ [0x1D057]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D323,
+ unicodeslot=0x1D057,
},
- [0x1D324]={
+ [0x1D058]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D324,
+ unicodeslot=0x1D058,
},
- [0x1D325]={
+ [0x1D059]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D325,
+ unicodeslot=0x1D059,
},
- [0x1D326]={
+ [0x1D05A]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D326,
+ unicodeslot=0x1D05A,
},
- [0x1D327]={
+ [0x1D05B]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D327,
+ unicodeslot=0x1D05B,
},
- [0x1D328]={
+ [0x1D05C]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D328,
+ unicodeslot=0x1D05C,
},
- [0x1D329]={
+ [0x1D05D]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D329,
+ unicodeslot=0x1D05D,
},
- [0x1D32A]={
+ [0x1D05E]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D32A,
+ unicodeslot=0x1D05E,
},
- [0x1D32B]={
+ [0x1D05F]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D32B,
+ unicodeslot=0x1D05F,
},
- [0x1D32C]={
+ [0x1D060]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D32C,
+ unicodeslot=0x1D060,
},
- [0x1D32D]={
+ [0x1D061]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D32D,
+ unicodeslot=0x1D061,
},
- [0x1D32E]={
+ [0x1D062]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D32E,
+ unicodeslot=0x1D062,
},
- [0x1D32F]={
+ [0x1D063]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D32F,
+ unicodeslot=0x1D063,
},
- [0x1D330]={
+ [0x1D064]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D330,
+ unicodeslot=0x1D064,
},
- [0x1D331]={
+ [0x1D065]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D331,
+ unicodeslot=0x1D065,
},
- [0x1D332]={
+ [0x1D066]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D332,
+ unicodeslot=0x1D066,
},
- [0x1D333]={
+ [0x1D067]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D333,
+ unicodeslot=0x1D067,
},
- [0x1D334]={
+ [0x1D068]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D334,
+ unicodeslot=0x1D068,
},
- [0x1D335]={
+ [0x1D069]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D335,
+ unicodeslot=0x1D069,
},
- [0x1D336]={
+ [0x1D06A]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D336,
+ unicodeslot=0x1D06A,
},
- [0x1D337]={
+ [0x1D06B]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D337,
+ unicodeslot=0x1D06B,
},
- [0x1D338]={
+ [0x1D06C]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D338,
+ unicodeslot=0x1D06C,
},
- [0x1D339]={
+ [0x1D06D]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D339,
+ unicodeslot=0x1D06D,
},
- [0x1D33A]={
+ [0x1D06E]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D33A,
+ unicodeslot=0x1D06E,
},
- [0x1D33B]={
+ [0x1D06F]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D33B,
+ unicodeslot=0x1D06F,
},
- [0x1D33C]={
+ [0x1D070]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D33C,
+ unicodeslot=0x1D070,
},
- [0x1D33D]={
+ [0x1D071]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D33D,
+ unicodeslot=0x1D071,
},
- [0x1D33E]={
+ [0x1D072]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D33E,
+ unicodeslot=0x1D072,
},
- [0x1D33F]={
+ [0x1D073]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D33F,
+ unicodeslot=0x1D073,
},
- [0x1D340]={
+ [0x1D074]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D340,
+ unicodeslot=0x1D074,
},
- [0x1D341]={
+ [0x1D075]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D341,
+ unicodeslot=0x1D075,
},
- [0x1D342]={
+ [0x1D076]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D342,
+ unicodeslot=0x1D076,
},
- [0x1D343]={
+ [0x1D077]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D343,
+ unicodeslot=0x1D077,
},
- [0x1D344]={
+ [0x1D078]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D344,
+ unicodeslot=0x1D078,
},
- [0x1D345]={
+ [0x1D079]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D345,
+ unicodeslot=0x1D079,
},
- [0x1D346]={
+ [0x1D07A]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D346,
+ unicodeslot=0x1D07A,
},
- [0x1D347]={
+ [0x1D07B]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D347,
+ unicodeslot=0x1D07B,
},
- [0x1D348]={
+ [0x1D07C]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D348,
+ unicodeslot=0x1D07C,
},
- [0x1D349]={
+ [0x1D07D]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D349,
+ unicodeslot=0x1D07D,
},
- [0x1D34A]={
+ [0x1D07E]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D34A,
+ unicodeslot=0x1D07E,
},
- [0x1D34B]={
+ [0x1D07F]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D34B,
+ unicodeslot=0x1D07F,
},
- [0x1D34C]={
+ [0x1D080]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D34C,
+ unicodeslot=0x1D080,
},
- [0x1D34D]={
+ [0x1D081]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D34D,
+ unicodeslot=0x1D081,
},
- [0x1D34E]={
+ [0x1D082]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D34E,
+ unicodeslot=0x1D082,
},
- [0x1D34F]={
+ [0x1D083]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D34F,
+ unicodeslot=0x1D083,
},
- [0x1D350]={
+ [0x1D084]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D350,
+ unicodeslot=0x1D084,
},
- [0x1D351]={
+ [0x1D085]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D351,
+ unicodeslot=0x1D085,
},
- [0x1D352]={
+ [0x1D086]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D352,
+ unicodeslot=0x1D086,
},
- [0x1D353]={
+ [0x1D087]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D353,
+ unicodeslot=0x1D087,
},
- [0x1D354]={
+ [0x1D088]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D354,
+ unicodeslot=0x1D088,
},
- [0x1D355]={
+ [0x1D089]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D355,
+ unicodeslot=0x1D089,
},
- [0x1D356]={
+ [0x1D08A]={
category="so",
- direction="on",
+ direction="l",
linebreak="al",
- unicodeslot=0x1D356,
+ unicodeslot=0x1D08A,
},
- [0x1D360]={
- category="no",
+ [0x1D08B]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D360,
+ unicodeslot=0x1D08B,
},
- [0x1D361]={
- category="no",
+ [0x1D08C]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D361,
+ unicodeslot=0x1D08C,
},
- [0x1D362]={
- category="no",
+ [0x1D08D]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D362,
+ unicodeslot=0x1D08D,
},
- [0x1D363]={
- category="no",
+ [0x1D08E]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D363,
+ unicodeslot=0x1D08E,
},
- [0x1D364]={
- category="no",
+ [0x1D08F]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D364,
+ unicodeslot=0x1D08F,
},
- [0x1D365]={
- category="no",
+ [0x1D090]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D365,
+ unicodeslot=0x1D090,
},
- [0x1D366]={
- category="no",
+ [0x1D091]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D366,
+ unicodeslot=0x1D091,
},
- [0x1D367]={
- category="no",
+ [0x1D092]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D367,
+ unicodeslot=0x1D092,
},
- [0x1D368]={
- category="no",
+ [0x1D093]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D368,
+ unicodeslot=0x1D093,
},
- [0x1D369]={
- category="no",
+ [0x1D094]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D369,
+ unicodeslot=0x1D094,
},
- [0x1D36A]={
- category="no",
+ [0x1D095]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D36A,
+ unicodeslot=0x1D095,
},
- [0x1D36B]={
- category="no",
+ [0x1D096]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D36B,
+ unicodeslot=0x1D096,
},
- [0x1D36C]={
- category="no",
+ [0x1D097]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D36C,
+ unicodeslot=0x1D097,
},
- [0x1D36D]={
- category="no",
+ [0x1D098]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D36D,
+ unicodeslot=0x1D098,
},
- [0x1D36E]={
- category="no",
+ [0x1D099]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D36E,
+ unicodeslot=0x1D099,
},
- [0x1D36F]={
- category="no",
+ [0x1D09A]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D36F,
+ unicodeslot=0x1D09A,
},
- [0x1D370]={
- category="no",
+ [0x1D09B]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D370,
+ unicodeslot=0x1D09B,
},
- [0x1D371]={
- category="no",
+ [0x1D09C]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D371,
+ unicodeslot=0x1D09C,
},
- [0x1D372]={
- category="no",
+ [0x1D09D]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D372,
+ unicodeslot=0x1D09D,
},
- [0x1D373]={
- category="no",
+ [0x1D09E]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D373,
+ unicodeslot=0x1D09E,
},
- [0x1D374]={
- category="no",
+ [0x1D09F]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D374,
+ unicodeslot=0x1D09F,
},
- [0x1D375]={
- category="no",
+ [0x1D0A0]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D375,
+ unicodeslot=0x1D0A0,
},
- [0x1D376]={
- category="no",
+ [0x1D0A1]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D376,
+ unicodeslot=0x1D0A1,
},
- [0x1D377]={
- category="no",
+ [0x1D0A2]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D377,
+ unicodeslot=0x1D0A2,
},
- [0x1D378]={
- category="no",
+ [0x1D0A3]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D378,
+ unicodeslot=0x1D0A3,
},
- [0x1D400]={
- category="lu",
+ [0x1D0A4]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x41 },
- unicodeslot=0x1D400,
+ unicodeslot=0x1D0A4,
},
- [0x1D401]={
- category="lu",
+ [0x1D0A5]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x42 },
- unicodeslot=0x1D401,
+ unicodeslot=0x1D0A5,
},
- [0x1D402]={
- category="lu",
+ [0x1D0A6]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x43 },
- unicodeslot=0x1D402,
+ unicodeslot=0x1D0A6,
},
- [0x1D403]={
- category="lu",
+ [0x1D0A7]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x44 },
- unicodeslot=0x1D403,
+ unicodeslot=0x1D0A7,
},
- [0x1D404]={
- category="lu",
+ [0x1D0A8]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x45 },
- unicodeslot=0x1D404,
+ unicodeslot=0x1D0A8,
},
- [0x1D405]={
- category="lu",
+ [0x1D0A9]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x46 },
- unicodeslot=0x1D405,
+ unicodeslot=0x1D0A9,
},
- [0x1D406]={
- category="lu",
+ [0x1D0AA]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x47 },
- unicodeslot=0x1D406,
+ unicodeslot=0x1D0AA,
},
- [0x1D407]={
- category="lu",
+ [0x1D0AB]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x48 },
- unicodeslot=0x1D407,
+ unicodeslot=0x1D0AB,
},
- [0x1D408]={
- category="lu",
+ [0x1D0AC]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x49 },
- unicodeslot=0x1D408,
+ unicodeslot=0x1D0AC,
},
- [0x1D409]={
- category="lu",
+ [0x1D0AD]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4A },
- unicodeslot=0x1D409,
+ unicodeslot=0x1D0AD,
},
- [0x1D40A]={
- category="lu",
+ [0x1D0AE]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4B },
- unicodeslot=0x1D40A,
+ unicodeslot=0x1D0AE,
},
- [0x1D40B]={
- category="lu",
+ [0x1D0AF]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4C },
- unicodeslot=0x1D40B,
+ unicodeslot=0x1D0AF,
},
- [0x1D40C]={
- category="lu",
+ [0x1D0B0]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4D },
- unicodeslot=0x1D40C,
+ unicodeslot=0x1D0B0,
},
- [0x1D40D]={
- category="lu",
+ [0x1D0B1]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4E },
- unicodeslot=0x1D40D,
+ unicodeslot=0x1D0B1,
},
- [0x1D40E]={
- category="lu",
+ [0x1D0B2]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4F },
- unicodeslot=0x1D40E,
+ unicodeslot=0x1D0B2,
},
- [0x1D40F]={
- category="lu",
+ [0x1D0B3]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x50 },
- unicodeslot=0x1D40F,
+ unicodeslot=0x1D0B3,
},
- [0x1D410]={
- category="lu",
+ [0x1D0B4]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x51 },
- unicodeslot=0x1D410,
+ unicodeslot=0x1D0B4,
},
- [0x1D411]={
- category="lu",
+ [0x1D0B5]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x52 },
- unicodeslot=0x1D411,
+ unicodeslot=0x1D0B5,
},
- [0x1D412]={
- category="lu",
+ [0x1D0B6]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x53 },
- unicodeslot=0x1D412,
+ unicodeslot=0x1D0B6,
},
- [0x1D413]={
- category="lu",
+ [0x1D0B7]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x54 },
- unicodeslot=0x1D413,
+ unicodeslot=0x1D0B7,
},
- [0x1D414]={
- category="lu",
+ [0x1D0B8]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x55 },
- unicodeslot=0x1D414,
+ unicodeslot=0x1D0B8,
},
- [0x1D415]={
- category="lu",
+ [0x1D0B9]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x56 },
- unicodeslot=0x1D415,
+ unicodeslot=0x1D0B9,
},
- [0x1D416]={
- category="lu",
+ [0x1D0BA]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x57 },
- unicodeslot=0x1D416,
+ unicodeslot=0x1D0BA,
},
- [0x1D417]={
- category="lu",
+ [0x1D0BB]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x58 },
- unicodeslot=0x1D417,
+ unicodeslot=0x1D0BB,
},
- [0x1D418]={
- category="lu",
+ [0x1D0BC]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x59 },
- unicodeslot=0x1D418,
+ unicodeslot=0x1D0BC,
},
- [0x1D419]={
- category="lu",
+ [0x1D0BD]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x5A },
- unicodeslot=0x1D419,
+ unicodeslot=0x1D0BD,
},
- [0x1D41A]={
- category="ll",
+ [0x1D0BE]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x61 },
- unicodeslot=0x1D41A,
+ unicodeslot=0x1D0BE,
},
- [0x1D41B]={
- category="ll",
+ [0x1D0BF]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x62 },
- unicodeslot=0x1D41B,
+ unicodeslot=0x1D0BF,
},
- [0x1D41C]={
- category="ll",
+ [0x1D0C0]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x63 },
- unicodeslot=0x1D41C,
+ unicodeslot=0x1D0C0,
},
- [0x1D41D]={
- category="ll",
+ [0x1D0C1]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x64 },
- unicodeslot=0x1D41D,
+ unicodeslot=0x1D0C1,
},
- [0x1D41E]={
- category="ll",
+ [0x1D0C2]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x65 },
- unicodeslot=0x1D41E,
+ unicodeslot=0x1D0C2,
},
- [0x1D41F]={
- category="ll",
+ [0x1D0C3]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x66 },
- unicodeslot=0x1D41F,
+ unicodeslot=0x1D0C3,
},
- [0x1D420]={
- category="ll",
+ [0x1D0C4]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x67 },
- unicodeslot=0x1D420,
+ unicodeslot=0x1D0C4,
},
- [0x1D421]={
- category="ll",
+ [0x1D0C5]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x68 },
- unicodeslot=0x1D421,
+ unicodeslot=0x1D0C5,
},
- [0x1D422]={
- category="ll",
+ [0x1D0C6]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x69 },
- unicodeslot=0x1D422,
+ unicodeslot=0x1D0C6,
},
- [0x1D423]={
- category="ll",
+ [0x1D0C7]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6A },
- unicodeslot=0x1D423,
+ unicodeslot=0x1D0C7,
},
- [0x1D424]={
- category="ll",
+ [0x1D0C8]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6B },
- unicodeslot=0x1D424,
+ unicodeslot=0x1D0C8,
},
- [0x1D425]={
- category="ll",
+ [0x1D0C9]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6C },
- unicodeslot=0x1D425,
+ unicodeslot=0x1D0C9,
},
- [0x1D426]={
- category="ll",
+ [0x1D0CA]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6D },
- unicodeslot=0x1D426,
+ unicodeslot=0x1D0CA,
},
- [0x1D427]={
- category="ll",
+ [0x1D0CB]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6E },
- unicodeslot=0x1D427,
+ unicodeslot=0x1D0CB,
},
- [0x1D428]={
- category="ll",
+ [0x1D0CC]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6F },
- unicodeslot=0x1D428,
+ unicodeslot=0x1D0CC,
},
- [0x1D429]={
- category="ll",
+ [0x1D0CD]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x70 },
- unicodeslot=0x1D429,
+ unicodeslot=0x1D0CD,
},
- [0x1D42A]={
- category="ll",
+ [0x1D0CE]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x71 },
- unicodeslot=0x1D42A,
+ unicodeslot=0x1D0CE,
},
- [0x1D42B]={
- category="ll",
+ [0x1D0CF]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x72 },
- unicodeslot=0x1D42B,
+ unicodeslot=0x1D0CF,
},
- [0x1D42C]={
- category="ll",
+ [0x1D0D0]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x73 },
- unicodeslot=0x1D42C,
+ unicodeslot=0x1D0D0,
},
- [0x1D42D]={
- category="ll",
+ [0x1D0D1]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x74 },
- unicodeslot=0x1D42D,
+ unicodeslot=0x1D0D1,
},
- [0x1D42E]={
- category="ll",
+ [0x1D0D2]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x75 },
- unicodeslot=0x1D42E,
+ unicodeslot=0x1D0D2,
},
- [0x1D42F]={
- category="ll",
+ [0x1D0D3]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x76 },
- unicodeslot=0x1D42F,
+ unicodeslot=0x1D0D3,
},
- [0x1D430]={
- category="ll",
+ [0x1D0D4]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x77 },
- unicodeslot=0x1D430,
+ unicodeslot=0x1D0D4,
},
- [0x1D431]={
- category="ll",
+ [0x1D0D5]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x78 },
- unicodeslot=0x1D431,
+ unicodeslot=0x1D0D5,
},
- [0x1D432]={
- category="ll",
+ [0x1D0D6]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x79 },
- unicodeslot=0x1D432,
+ unicodeslot=0x1D0D6,
},
- [0x1D433]={
- category="ll",
+ [0x1D0D7]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x7A },
- unicodeslot=0x1D433,
+ unicodeslot=0x1D0D7,
},
- [0x1D434]={
- category="lu",
+ [0x1D0D8]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x41 },
- unicodeslot=0x1D434,
+ unicodeslot=0x1D0D8,
},
- [0x1D435]={
- category="lu",
+ [0x1D0D9]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x42 },
- unicodeslot=0x1D435,
+ unicodeslot=0x1D0D9,
},
- [0x1D436]={
- category="lu",
+ [0x1D0DA]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x43 },
- unicodeslot=0x1D436,
+ unicodeslot=0x1D0DA,
},
- [0x1D437]={
- category="lu",
+ [0x1D0DB]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x44 },
- unicodeslot=0x1D437,
+ unicodeslot=0x1D0DB,
},
- [0x1D438]={
- category="lu",
+ [0x1D0DC]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x45 },
- unicodeslot=0x1D438,
+ unicodeslot=0x1D0DC,
},
- [0x1D439]={
- category="lu",
+ [0x1D0DD]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x46 },
- unicodeslot=0x1D439,
+ unicodeslot=0x1D0DD,
},
- [0x1D43A]={
- category="lu",
+ [0x1D0DE]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x47 },
- unicodeslot=0x1D43A,
+ unicodeslot=0x1D0DE,
},
- [0x1D43B]={
- category="lu",
+ [0x1D0DF]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x48 },
- unicodeslot=0x1D43B,
+ unicodeslot=0x1D0DF,
},
- [0x1D43C]={
- category="lu",
+ [0x1D0E0]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x49 },
- unicodeslot=0x1D43C,
+ unicodeslot=0x1D0E0,
},
- [0x1D43D]={
- category="lu",
+ [0x1D0E1]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4A },
- unicodeslot=0x1D43D,
+ unicodeslot=0x1D0E1,
},
- [0x1D43E]={
- category="lu",
+ [0x1D0E2]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4B },
- unicodeslot=0x1D43E,
+ unicodeslot=0x1D0E2,
},
- [0x1D43F]={
- category="lu",
+ [0x1D0E3]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4C },
- unicodeslot=0x1D43F,
+ unicodeslot=0x1D0E3,
},
- [0x1D440]={
- category="lu",
+ [0x1D0E4]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4D },
- unicodeslot=0x1D440,
+ unicodeslot=0x1D0E4,
},
- [0x1D441]={
- category="lu",
+ [0x1D0E5]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4E },
- unicodeslot=0x1D441,
+ unicodeslot=0x1D0E5,
},
- [0x1D442]={
- category="lu",
+ [0x1D0E6]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4F },
- unicodeslot=0x1D442,
+ unicodeslot=0x1D0E6,
},
- [0x1D443]={
- category="lu",
+ [0x1D0E7]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x50 },
- unicodeslot=0x1D443,
+ unicodeslot=0x1D0E7,
},
- [0x1D444]={
- category="lu",
+ [0x1D0E8]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x51 },
- unicodeslot=0x1D444,
+ unicodeslot=0x1D0E8,
},
- [0x1D445]={
- category="lu",
+ [0x1D0E9]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x52 },
- unicodeslot=0x1D445,
+ unicodeslot=0x1D0E9,
},
- [0x1D446]={
- category="lu",
+ [0x1D0EA]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x53 },
- unicodeslot=0x1D446,
+ unicodeslot=0x1D0EA,
},
- [0x1D447]={
- category="lu",
+ [0x1D0EB]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x54 },
- unicodeslot=0x1D447,
+ unicodeslot=0x1D0EB,
},
- [0x1D448]={
- category="lu",
+ [0x1D0EC]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x55 },
- unicodeslot=0x1D448,
+ unicodeslot=0x1D0EC,
},
- [0x1D449]={
- category="lu",
+ [0x1D0ED]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x56 },
- unicodeslot=0x1D449,
+ unicodeslot=0x1D0ED,
},
- [0x1D44A]={
- category="lu",
+ [0x1D0EE]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x57 },
- unicodeslot=0x1D44A,
+ unicodeslot=0x1D0EE,
},
- [0x1D44B]={
- category="lu",
+ [0x1D0EF]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x58 },
- unicodeslot=0x1D44B,
+ unicodeslot=0x1D0EF,
},
- [0x1D44C]={
- category="lu",
+ [0x1D0F0]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x59 },
- unicodeslot=0x1D44C,
+ unicodeslot=0x1D0F0,
},
- [0x1D44D]={
- category="lu",
+ [0x1D0F1]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x5A },
- unicodeslot=0x1D44D,
+ unicodeslot=0x1D0F1,
},
- [0x1D44E]={
- category="ll",
+ [0x1D0F2]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x61 },
- unicodeslot=0x1D44E,
+ unicodeslot=0x1D0F2,
},
- [0x1D44F]={
- category="ll",
+ [0x1D0F3]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x62 },
- unicodeslot=0x1D44F,
+ unicodeslot=0x1D0F3,
},
- [0x1D450]={
- category="ll",
+ [0x1D0F4]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x63 },
- unicodeslot=0x1D450,
+ unicodeslot=0x1D0F4,
},
- [0x1D451]={
- category="ll",
+ [0x1D0F5]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x64 },
- unicodeslot=0x1D451,
+ unicodeslot=0x1D0F5,
},
- [0x1D452]={
- category="ll",
+ [0x1D100]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x65 },
- unicodeslot=0x1D452,
+ unicodeslot=0x1D100,
},
- [0x1D453]={
- category="ll",
+ [0x1D101]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x66 },
- unicodeslot=0x1D453,
+ unicodeslot=0x1D101,
},
- [0x1D454]={
- category="ll",
+ [0x1D102]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x67 },
- unicodeslot=0x1D454,
+ unicodeslot=0x1D102,
},
- [0x1D456]={
- category="ll",
+ [0x1D103]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x69 },
- unicodeslot=0x1D456,
+ unicodeslot=0x1D103,
},
- [0x1D457]={
- category="ll",
+ [0x1D104]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6A },
- unicodeslot=0x1D457,
+ unicodeslot=0x1D104,
},
- [0x1D458]={
- category="ll",
+ [0x1D105]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6B },
- unicodeslot=0x1D458,
+ unicodeslot=0x1D105,
},
- [0x1D459]={
- category="ll",
+ [0x1D106]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6C },
- unicodeslot=0x1D459,
+ unicodeslot=0x1D106,
},
- [0x1D45A]={
- category="ll",
+ [0x1D107]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6D },
- unicodeslot=0x1D45A,
+ unicodeslot=0x1D107,
},
- [0x1D45B]={
- category="ll",
+ [0x1D108]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6E },
- unicodeslot=0x1D45B,
+ unicodeslot=0x1D108,
},
- [0x1D45C]={
- category="ll",
+ [0x1D109]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6F },
- unicodeslot=0x1D45C,
+ unicodeslot=0x1D109,
},
- [0x1D45D]={
- category="ll",
+ [0x1D10A]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x70 },
- unicodeslot=0x1D45D,
+ unicodeslot=0x1D10A,
},
- [0x1D45E]={
- category="ll",
+ [0x1D10B]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x71 },
- unicodeslot=0x1D45E,
+ unicodeslot=0x1D10B,
},
- [0x1D45F]={
- category="ll",
+ [0x1D10C]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x72 },
- unicodeslot=0x1D45F,
+ unicodeslot=0x1D10C,
},
- [0x1D460]={
- category="ll",
+ [0x1D10D]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x73 },
- unicodeslot=0x1D460,
+ unicodeslot=0x1D10D,
},
- [0x1D461]={
- category="ll",
+ [0x1D10E]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x74 },
- unicodeslot=0x1D461,
+ unicodeslot=0x1D10E,
},
- [0x1D462]={
- category="ll",
+ [0x1D10F]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x75 },
- unicodeslot=0x1D462,
+ unicodeslot=0x1D10F,
},
- [0x1D463]={
- category="ll",
+ [0x1D110]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x76 },
- unicodeslot=0x1D463,
+ unicodeslot=0x1D110,
},
- [0x1D464]={
- category="ll",
+ [0x1D111]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x77 },
- unicodeslot=0x1D464,
+ unicodeslot=0x1D111,
},
- [0x1D465]={
- category="ll",
+ [0x1D112]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x78 },
- unicodeslot=0x1D465,
+ unicodeslot=0x1D112,
},
- [0x1D466]={
- category="ll",
+ [0x1D113]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x79 },
- unicodeslot=0x1D466,
+ unicodeslot=0x1D113,
},
- [0x1D467]={
- category="ll",
+ [0x1D114]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x7A },
- unicodeslot=0x1D467,
+ unicodeslot=0x1D114,
},
- [0x1D468]={
- category="lu",
+ [0x1D115]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x41 },
- unicodeslot=0x1D468,
+ unicodeslot=0x1D115,
},
- [0x1D469]={
- category="lu",
+ [0x1D116]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x42 },
- unicodeslot=0x1D469,
+ unicodeslot=0x1D116,
},
- [0x1D46A]={
- category="lu",
+ [0x1D117]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x43 },
- unicodeslot=0x1D46A,
+ unicodeslot=0x1D117,
},
- [0x1D46B]={
- category="lu",
+ [0x1D118]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x44 },
- unicodeslot=0x1D46B,
+ unicodeslot=0x1D118,
},
- [0x1D46C]={
- category="lu",
+ [0x1D119]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x45 },
- unicodeslot=0x1D46C,
+ unicodeslot=0x1D119,
},
- [0x1D46D]={
- category="lu",
+ [0x1D11A]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x46 },
- unicodeslot=0x1D46D,
+ unicodeslot=0x1D11A,
},
- [0x1D46E]={
- category="lu",
+ [0x1D11B]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x47 },
- unicodeslot=0x1D46E,
+ unicodeslot=0x1D11B,
},
- [0x1D46F]={
- category="lu",
+ [0x1D11C]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x48 },
- unicodeslot=0x1D46F,
+ unicodeslot=0x1D11C,
},
- [0x1D470]={
- category="lu",
+ [0x1D11D]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x49 },
- unicodeslot=0x1D470,
+ unicodeslot=0x1D11D,
},
- [0x1D471]={
- category="lu",
+ [0x1D11E]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4A },
- unicodeslot=0x1D471,
+ unicodeslot=0x1D11E,
},
- [0x1D472]={
- category="lu",
+ [0x1D11F]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4B },
- unicodeslot=0x1D472,
+ unicodeslot=0x1D11F,
},
- [0x1D473]={
- category="lu",
+ [0x1D120]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4C },
- unicodeslot=0x1D473,
+ unicodeslot=0x1D120,
},
- [0x1D474]={
- category="lu",
+ [0x1D121]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4D },
- unicodeslot=0x1D474,
+ unicodeslot=0x1D121,
},
- [0x1D475]={
- category="lu",
+ [0x1D122]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4E },
- unicodeslot=0x1D475,
+ unicodeslot=0x1D122,
},
- [0x1D476]={
- category="lu",
+ [0x1D123]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4F },
- unicodeslot=0x1D476,
+ unicodeslot=0x1D123,
},
- [0x1D477]={
- category="lu",
+ [0x1D124]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x50 },
- unicodeslot=0x1D477,
+ unicodeslot=0x1D124,
},
- [0x1D478]={
- category="lu",
+ [0x1D125]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x51 },
- unicodeslot=0x1D478,
+ unicodeslot=0x1D125,
},
- [0x1D479]={
- category="lu",
+ [0x1D126]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x52 },
- unicodeslot=0x1D479,
+ unicodeslot=0x1D126,
},
- [0x1D47A]={
- category="lu",
+ [0x1D129]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x53 },
- unicodeslot=0x1D47A,
+ unicodeslot=0x1D129,
},
- [0x1D47B]={
- category="lu",
+ [0x1D12A]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x54 },
- unicodeslot=0x1D47B,
+ unicodeslot=0x1D12A,
},
- [0x1D47C]={
- category="lu",
+ [0x1D12B]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x55 },
- unicodeslot=0x1D47C,
+ unicodeslot=0x1D12B,
},
- [0x1D47D]={
- category="lu",
+ [0x1D12C]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x56 },
- unicodeslot=0x1D47D,
+ unicodeslot=0x1D12C,
},
- [0x1D47E]={
- category="lu",
+ [0x1D12D]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x57 },
- unicodeslot=0x1D47E,
+ unicodeslot=0x1D12D,
},
- [0x1D47F]={
- category="lu",
+ [0x1D12E]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x58 },
- unicodeslot=0x1D47F,
+ unicodeslot=0x1D12E,
},
- [0x1D480]={
- category="lu",
+ [0x1D12F]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x59 },
- unicodeslot=0x1D480,
+ unicodeslot=0x1D12F,
},
- [0x1D481]={
- category="lu",
+ [0x1D130]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x5A },
- unicodeslot=0x1D481,
+ unicodeslot=0x1D130,
},
- [0x1D482]={
- category="ll",
+ [0x1D131]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x61 },
- unicodeslot=0x1D482,
+ unicodeslot=0x1D131,
},
- [0x1D483]={
- category="ll",
+ [0x1D132]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x62 },
- unicodeslot=0x1D483,
+ unicodeslot=0x1D132,
},
- [0x1D484]={
- category="ll",
+ [0x1D133]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x63 },
- unicodeslot=0x1D484,
+ unicodeslot=0x1D133,
},
- [0x1D485]={
- category="ll",
+ [0x1D134]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x64 },
- unicodeslot=0x1D485,
+ unicodeslot=0x1D134,
},
- [0x1D486]={
- category="ll",
+ [0x1D135]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x65 },
- unicodeslot=0x1D486,
+ unicodeslot=0x1D135,
},
- [0x1D487]={
- category="ll",
+ [0x1D136]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x66 },
- unicodeslot=0x1D487,
+ unicodeslot=0x1D136,
},
- [0x1D488]={
- category="ll",
+ [0x1D137]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x67 },
- unicodeslot=0x1D488,
+ unicodeslot=0x1D137,
},
- [0x1D489]={
- category="ll",
+ [0x1D138]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x68 },
- unicodeslot=0x1D489,
+ unicodeslot=0x1D138,
},
- [0x1D48A]={
- category="ll",
+ [0x1D139]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x69 },
- unicodeslot=0x1D48A,
+ unicodeslot=0x1D139,
},
- [0x1D48B]={
- category="ll",
+ [0x1D13A]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6A },
- unicodeslot=0x1D48B,
+ unicodeslot=0x1D13A,
},
- [0x1D48C]={
- category="ll",
+ [0x1D13B]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6B },
- unicodeslot=0x1D48C,
+ unicodeslot=0x1D13B,
},
- [0x1D48D]={
- category="ll",
+ [0x1D13C]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6C },
- unicodeslot=0x1D48D,
+ unicodeslot=0x1D13C,
},
- [0x1D48E]={
- category="ll",
+ [0x1D13D]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6D },
- unicodeslot=0x1D48E,
+ unicodeslot=0x1D13D,
},
- [0x1D48F]={
- category="ll",
+ [0x1D13E]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6E },
- unicodeslot=0x1D48F,
+ unicodeslot=0x1D13E,
},
- [0x1D490]={
- category="ll",
+ [0x1D13F]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6F },
- unicodeslot=0x1D490,
+ unicodeslot=0x1D13F,
},
- [0x1D491]={
- category="ll",
+ [0x1D140]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x70 },
- unicodeslot=0x1D491,
+ unicodeslot=0x1D140,
},
- [0x1D492]={
- category="ll",
+ [0x1D141]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x71 },
- unicodeslot=0x1D492,
+ unicodeslot=0x1D141,
},
- [0x1D493]={
- category="ll",
+ [0x1D142]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x72 },
- unicodeslot=0x1D493,
+ unicodeslot=0x1D142,
},
- [0x1D494]={
- category="ll",
+ [0x1D143]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x73 },
- unicodeslot=0x1D494,
+ unicodeslot=0x1D143,
},
- [0x1D495]={
- category="ll",
+ [0x1D144]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x74 },
- unicodeslot=0x1D495,
+ unicodeslot=0x1D144,
},
- [0x1D496]={
- category="ll",
+ [0x1D145]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x75 },
- unicodeslot=0x1D496,
+ unicodeslot=0x1D145,
},
- [0x1D497]={
- category="ll",
+ [0x1D146]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x76 },
- unicodeslot=0x1D497,
+ unicodeslot=0x1D146,
},
- [0x1D498]={
- category="ll",
+ [0x1D147]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x77 },
- unicodeslot=0x1D498,
+ unicodeslot=0x1D147,
},
- [0x1D499]={
- category="ll",
+ [0x1D148]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x78 },
- unicodeslot=0x1D499,
+ unicodeslot=0x1D148,
},
- [0x1D49A]={
- category="ll",
+ [0x1D149]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x79 },
- unicodeslot=0x1D49A,
+ unicodeslot=0x1D149,
},
- [0x1D49B]={
- category="ll",
+ [0x1D14A]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x7A },
- unicodeslot=0x1D49B,
+ unicodeslot=0x1D14A,
},
- [0x1D49C]={
- category="lu",
+ [0x1D14B]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x41 },
- unicodeslot=0x1D49C,
+ unicodeslot=0x1D14B,
},
- [0x1D49E]={
- category="lu",
+ [0x1D14C]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x43 },
- unicodeslot=0x1D49E,
+ unicodeslot=0x1D14C,
},
- [0x1D49F]={
- category="lu",
+ [0x1D14D]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x44 },
- unicodeslot=0x1D49F,
+ unicodeslot=0x1D14D,
},
- [0x1D4A2]={
- category="lu",
+ [0x1D14E]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x47 },
- unicodeslot=0x1D4A2,
+ unicodeslot=0x1D14E,
},
- [0x1D4A5]={
- category="lu",
+ [0x1D14F]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4A },
- unicodeslot=0x1D4A5,
+ unicodeslot=0x1D14F,
},
- [0x1D4A6]={
- category="lu",
+ [0x1D150]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4B },
- unicodeslot=0x1D4A6,
+ unicodeslot=0x1D150,
},
- [0x1D4A9]={
- category="lu",
+ [0x1D151]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4E },
- unicodeslot=0x1D4A9,
+ unicodeslot=0x1D151,
},
- [0x1D4AA]={
- category="lu",
+ [0x1D152]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4F },
- unicodeslot=0x1D4AA,
+ unicodeslot=0x1D152,
},
- [0x1D4AB]={
- category="lu",
+ [0x1D153]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x50 },
- unicodeslot=0x1D4AB,
+ unicodeslot=0x1D153,
},
- [0x1D4AC]={
- category="lu",
+ [0x1D154]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x51 },
- unicodeslot=0x1D4AC,
+ unicodeslot=0x1D154,
},
- [0x1D4AE]={
- category="lu",
+ [0x1D155]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x53 },
- unicodeslot=0x1D4AE,
+ unicodeslot=0x1D155,
},
- [0x1D4AF]={
- category="lu",
+ [0x1D156]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x54 },
- unicodeslot=0x1D4AF,
+ unicodeslot=0x1D156,
},
- [0x1D4B0]={
- category="lu",
+ [0x1D157]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x55 },
- unicodeslot=0x1D4B0,
+ unicodeslot=0x1D157,
},
- [0x1D4B1]={
- category="lu",
+ [0x1D158]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x56 },
- unicodeslot=0x1D4B1,
+ unicodeslot=0x1D158,
},
- [0x1D4B2]={
- category="lu",
+ [0x1D159]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x57 },
- unicodeslot=0x1D4B2,
+ unicodeslot=0x1D159,
},
- [0x1D4B3]={
- category="lu",
+ [0x1D15A]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x58 },
- unicodeslot=0x1D4B3,
+ unicodeslot=0x1D15A,
},
- [0x1D4B4]={
- category="lu",
+ [0x1D15B]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x59 },
- unicodeslot=0x1D4B4,
+ unicodeslot=0x1D15B,
},
- [0x1D4B5]={
- category="lu",
+ [0x1D15C]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x5A },
- unicodeslot=0x1D4B5,
+ unicodeslot=0x1D15C,
},
- [0x1D4B6]={
- category="ll",
+ [0x1D15D]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x61 },
- unicodeslot=0x1D4B6,
+ unicodeslot=0x1D15D,
},
- [0x1D4B7]={
- category="ll",
+ [0x1D15E]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x62 },
- unicodeslot=0x1D4B7,
+ specials={ "char", 0x1D157, 0x1D165 },
+ unicodeslot=0x1D15E,
},
- [0x1D4B8]={
- category="ll",
+ [0x1D15F]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x63 },
- unicodeslot=0x1D4B8,
+ specials={ "char", 0x1D158, 0x1D165 },
+ unicodeslot=0x1D15F,
},
- [0x1D4B9]={
- category="ll",
+ [0x1D160]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x64 },
- unicodeslot=0x1D4B9,
+ specials={ "char", 0x1D15F, 0x1D16E },
+ unicodeslot=0x1D160,
},
- [0x1D4BB]={
- category="ll",
+ [0x1D161]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x66 },
- unicodeslot=0x1D4BB,
+ specials={ "char", 0x1D15F, 0x1D16F },
+ unicodeslot=0x1D161,
},
- [0x1D4BD]={
- category="ll",
+ [0x1D162]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x68 },
- unicodeslot=0x1D4BD,
+ specials={ "char", 0x1D15F, 0x1D170 },
+ unicodeslot=0x1D162,
},
- [0x1D4BE]={
- category="ll",
+ [0x1D163]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x69 },
- unicodeslot=0x1D4BE,
+ specials={ "char", 0x1D15F, 0x1D171 },
+ unicodeslot=0x1D163,
},
- [0x1D4BF]={
- category="ll",
+ [0x1D164]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6A },
- unicodeslot=0x1D4BF,
+ specials={ "char", 0x1D15F, 0x1D172 },
+ unicodeslot=0x1D164,
},
- [0x1D4C0]={
- category="ll",
+ [0x1D165]={
+ category="mc",
direction="l",
- linebreak="al",
- specials={ "font", 0x6B },
- unicodeslot=0x1D4C0,
+ linebreak="cm",
+ unicodeslot=0x1D165,
},
- [0x1D4C1]={
- category="ll",
+ [0x1D166]={
+ category="mc",
direction="l",
- linebreak="al",
- specials={ "font", 0x6C },
- unicodeslot=0x1D4C1,
+ linebreak="cm",
+ unicodeslot=0x1D166,
},
- [0x1D4C2]={
- category="ll",
- direction="l",
- linebreak="al",
- specials={ "font", 0x6D },
- unicodeslot=0x1D4C2,
+ [0x1D167]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D167,
},
- [0x1D4C3]={
- category="ll",
+ [0x1D168]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D168,
+ },
+ [0x1D169]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D169,
+ },
+ [0x1D16A]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6E },
- unicodeslot=0x1D4C3,
+ unicodeslot=0x1D16A,
},
- [0x1D4C5]={
- category="ll",
+ [0x1D16B]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x70 },
- unicodeslot=0x1D4C5,
+ unicodeslot=0x1D16B,
},
- [0x1D4C6]={
- category="ll",
+ [0x1D16C]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x71 },
- unicodeslot=0x1D4C6,
+ unicodeslot=0x1D16C,
},
- [0x1D4C7]={
- category="ll",
+ [0x1D16D]={
+ category="mc",
direction="l",
- linebreak="al",
- specials={ "font", 0x72 },
- unicodeslot=0x1D4C7,
+ linebreak="cm",
+ unicodeslot=0x1D16D,
},
- [0x1D4C8]={
- category="ll",
+ [0x1D16E]={
+ category="mc",
direction="l",
- linebreak="al",
- specials={ "font", 0x73 },
- unicodeslot=0x1D4C8,
+ linebreak="cm",
+ unicodeslot=0x1D16E,
},
- [0x1D4C9]={
- category="ll",
+ [0x1D16F]={
+ category="mc",
direction="l",
- linebreak="al",
- specials={ "font", 0x74 },
- unicodeslot=0x1D4C9,
+ linebreak="cm",
+ unicodeslot=0x1D16F,
},
- [0x1D4CA]={
- category="ll",
+ [0x1D170]={
+ category="mc",
direction="l",
- linebreak="al",
- specials={ "font", 0x75 },
- unicodeslot=0x1D4CA,
+ linebreak="cm",
+ unicodeslot=0x1D170,
},
- [0x1D4CB]={
- category="ll",
+ [0x1D171]={
+ category="mc",
direction="l",
- linebreak="al",
- specials={ "font", 0x76 },
- unicodeslot=0x1D4CB,
+ linebreak="cm",
+ unicodeslot=0x1D171,
},
- [0x1D4CC]={
- category="ll",
+ [0x1D172]={
+ category="mc",
direction="l",
- linebreak="al",
- specials={ "font", 0x77 },
- unicodeslot=0x1D4CC,
+ linebreak="cm",
+ unicodeslot=0x1D172,
},
- [0x1D4CD]={
- category="ll",
+ [0x1D173]={
+ category="cf",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D173,
+ },
+ [0x1D174]={
+ category="cf",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D174,
+ },
+ [0x1D175]={
+ category="cf",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D175,
+ },
+ [0x1D176]={
+ category="cf",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D176,
+ },
+ [0x1D177]={
+ category="cf",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D177,
+ },
+ [0x1D178]={
+ category="cf",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D178,
+ },
+ [0x1D179]={
+ category="cf",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D179,
+ },
+ [0x1D17A]={
+ category="cf",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D17A,
+ },
+ [0x1D17B]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D17B,
+ },
+ [0x1D17C]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D17C,
+ },
+ [0x1D17D]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D17D,
+ },
+ [0x1D17E]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D17E,
+ },
+ [0x1D17F]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D17F,
+ },
+ [0x1D180]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D180,
+ },
+ [0x1D181]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D181,
+ },
+ [0x1D182]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D182,
+ },
+ [0x1D183]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x78 },
- unicodeslot=0x1D4CD,
+ unicodeslot=0x1D183,
},
- [0x1D4CE]={
- category="ll",
+ [0x1D184]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x79 },
- unicodeslot=0x1D4CE,
+ unicodeslot=0x1D184,
},
- [0x1D4CF]={
- category="ll",
+ [0x1D185]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D185,
+ },
+ [0x1D186]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D186,
+ },
+ [0x1D187]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D187,
+ },
+ [0x1D188]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D188,
+ },
+ [0x1D189]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D189,
+ },
+ [0x1D18A]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D18A,
+ },
+ [0x1D18B]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D18B,
+ },
+ [0x1D18C]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x7A },
- unicodeslot=0x1D4CF,
+ unicodeslot=0x1D18C,
},
- [0x1D4D0]={
- category="lu",
+ [0x1D18D]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x41 },
- unicodeslot=0x1D4D0,
+ unicodeslot=0x1D18D,
},
- [0x1D4D1]={
- category="lu",
+ [0x1D18E]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x42 },
- unicodeslot=0x1D4D1,
+ unicodeslot=0x1D18E,
},
- [0x1D4D2]={
- category="lu",
+ [0x1D18F]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x43 },
- unicodeslot=0x1D4D2,
+ unicodeslot=0x1D18F,
},
- [0x1D4D3]={
- category="lu",
+ [0x1D190]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x44 },
- unicodeslot=0x1D4D3,
+ unicodeslot=0x1D190,
},
- [0x1D4D4]={
- category="lu",
+ [0x1D191]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x45 },
- unicodeslot=0x1D4D4,
+ unicodeslot=0x1D191,
},
- [0x1D4D5]={
- category="lu",
+ [0x1D192]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x46 },
- unicodeslot=0x1D4D5,
+ unicodeslot=0x1D192,
},
- [0x1D4D6]={
- category="lu",
+ [0x1D193]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x47 },
- unicodeslot=0x1D4D6,
+ unicodeslot=0x1D193,
},
- [0x1D4D7]={
- category="lu",
+ [0x1D194]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x48 },
- unicodeslot=0x1D4D7,
+ unicodeslot=0x1D194,
},
- [0x1D4D8]={
- category="lu",
+ [0x1D195]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x49 },
- unicodeslot=0x1D4D8,
+ unicodeslot=0x1D195,
},
- [0x1D4D9]={
- category="lu",
+ [0x1D196]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4A },
- unicodeslot=0x1D4D9,
+ unicodeslot=0x1D196,
},
- [0x1D4DA]={
- category="lu",
+ [0x1D197]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4B },
- unicodeslot=0x1D4DA,
+ unicodeslot=0x1D197,
},
- [0x1D4DB]={
- category="lu",
+ [0x1D198]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4C },
- unicodeslot=0x1D4DB,
+ unicodeslot=0x1D198,
},
- [0x1D4DC]={
- category="lu",
+ [0x1D199]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4D },
- unicodeslot=0x1D4DC,
+ unicodeslot=0x1D199,
},
- [0x1D4DD]={
- category="lu",
+ [0x1D19A]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4E },
- unicodeslot=0x1D4DD,
+ unicodeslot=0x1D19A,
},
- [0x1D4DE]={
- category="lu",
+ [0x1D19B]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4F },
- unicodeslot=0x1D4DE,
+ unicodeslot=0x1D19B,
},
- [0x1D4DF]={
- category="lu",
+ [0x1D19C]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x50 },
- unicodeslot=0x1D4DF,
+ unicodeslot=0x1D19C,
},
- [0x1D4E0]={
- category="lu",
+ [0x1D19D]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x51 },
- unicodeslot=0x1D4E0,
+ unicodeslot=0x1D19D,
},
- [0x1D4E1]={
- category="lu",
+ [0x1D19E]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x52 },
- unicodeslot=0x1D4E1,
+ unicodeslot=0x1D19E,
},
- [0x1D4E2]={
- category="lu",
+ [0x1D19F]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x53 },
- unicodeslot=0x1D4E2,
+ unicodeslot=0x1D19F,
},
- [0x1D4E3]={
- category="lu",
+ [0x1D1A0]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x54 },
- unicodeslot=0x1D4E3,
+ unicodeslot=0x1D1A0,
},
- [0x1D4E4]={
- category="lu",
+ [0x1D1A1]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x55 },
- unicodeslot=0x1D4E4,
+ unicodeslot=0x1D1A1,
},
- [0x1D4E5]={
- category="lu",
+ [0x1D1A2]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x56 },
- unicodeslot=0x1D4E5,
+ unicodeslot=0x1D1A2,
},
- [0x1D4E6]={
- category="lu",
+ [0x1D1A3]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x57 },
- unicodeslot=0x1D4E6,
+ unicodeslot=0x1D1A3,
},
- [0x1D4E7]={
- category="lu",
+ [0x1D1A4]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x58 },
- unicodeslot=0x1D4E7,
+ unicodeslot=0x1D1A4,
},
- [0x1D4E8]={
- category="lu",
+ [0x1D1A5]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x59 },
- unicodeslot=0x1D4E8,
+ unicodeslot=0x1D1A5,
},
- [0x1D4E9]={
- category="lu",
+ [0x1D1A6]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x5A },
- unicodeslot=0x1D4E9,
+ unicodeslot=0x1D1A6,
},
- [0x1D4EA]={
- category="ll",
+ [0x1D1A7]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x61 },
- unicodeslot=0x1D4EA,
+ unicodeslot=0x1D1A7,
},
- [0x1D4EB]={
- category="ll",
+ [0x1D1A8]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x62 },
- unicodeslot=0x1D4EB,
+ unicodeslot=0x1D1A8,
},
- [0x1D4EC]={
- category="ll",
+ [0x1D1A9]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x63 },
- unicodeslot=0x1D4EC,
+ unicodeslot=0x1D1A9,
},
- [0x1D4ED]={
- category="ll",
- direction="l",
- linebreak="al",
- specials={ "font", 0x64 },
- unicodeslot=0x1D4ED,
+ [0x1D1AA]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D1AA,
},
- [0x1D4EE]={
- category="ll",
+ [0x1D1AB]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D1AB,
+ },
+ [0x1D1AC]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D1AC,
+ },
+ [0x1D1AD]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D1AD,
+ },
+ [0x1D1AE]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x65 },
- unicodeslot=0x1D4EE,
+ unicodeslot=0x1D1AE,
},
- [0x1D4EF]={
- category="ll",
+ [0x1D1AF]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x66 },
- unicodeslot=0x1D4EF,
+ unicodeslot=0x1D1AF,
},
- [0x1D4F0]={
- category="ll",
+ [0x1D1B0]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x67 },
- unicodeslot=0x1D4F0,
+ unicodeslot=0x1D1B0,
},
- [0x1D4F1]={
- category="ll",
+ [0x1D1B1]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x68 },
- unicodeslot=0x1D4F1,
+ unicodeslot=0x1D1B1,
},
- [0x1D4F2]={
- category="ll",
+ [0x1D1B2]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x69 },
- unicodeslot=0x1D4F2,
+ unicodeslot=0x1D1B2,
},
- [0x1D4F3]={
- category="ll",
+ [0x1D1B3]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6A },
- unicodeslot=0x1D4F3,
+ unicodeslot=0x1D1B3,
},
- [0x1D4F4]={
- category="ll",
+ [0x1D1B4]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6B },
- unicodeslot=0x1D4F4,
+ unicodeslot=0x1D1B4,
},
- [0x1D4F5]={
- category="ll",
+ [0x1D1B5]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6C },
- unicodeslot=0x1D4F5,
+ unicodeslot=0x1D1B5,
},
- [0x1D4F6]={
- category="ll",
+ [0x1D1B6]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6D },
- unicodeslot=0x1D4F6,
+ unicodeslot=0x1D1B6,
},
- [0x1D4F7]={
- category="ll",
+ [0x1D1B7]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6E },
- unicodeslot=0x1D4F7,
+ unicodeslot=0x1D1B7,
},
- [0x1D4F8]={
- category="ll",
+ [0x1D1B8]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6F },
- unicodeslot=0x1D4F8,
+ unicodeslot=0x1D1B8,
},
- [0x1D4F9]={
- category="ll",
+ [0x1D1B9]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x70 },
- unicodeslot=0x1D4F9,
+ unicodeslot=0x1D1B9,
},
- [0x1D4FA]={
- category="ll",
+ [0x1D1BA]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x71 },
- unicodeslot=0x1D4FA,
+ unicodeslot=0x1D1BA,
},
- [0x1D4FB]={
- category="ll",
+ [0x1D1BB]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x72 },
- unicodeslot=0x1D4FB,
+ specials={ "char", 0x1D1B9, 0x1D165 },
+ unicodeslot=0x1D1BB,
},
- [0x1D4FC]={
- category="ll",
+ [0x1D1BC]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x73 },
- unicodeslot=0x1D4FC,
+ specials={ "char", 0x1D1BA, 0x1D165 },
+ unicodeslot=0x1D1BC,
},
- [0x1D4FD]={
- category="ll",
+ [0x1D1BD]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x74 },
- unicodeslot=0x1D4FD,
+ specials={ "char", 0x1D1BB, 0x1D16E },
+ unicodeslot=0x1D1BD,
},
- [0x1D4FE]={
- category="ll",
+ [0x1D1BE]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x75 },
- unicodeslot=0x1D4FE,
+ specials={ "char", 0x1D1BC, 0x1D16E },
+ unicodeslot=0x1D1BE,
},
- [0x1D4FF]={
- category="ll",
+ [0x1D1BF]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x76 },
- unicodeslot=0x1D4FF,
+ specials={ "char", 0x1D1BB, 0x1D16F },
+ unicodeslot=0x1D1BF,
},
- [0x1D500]={
- category="ll",
+ [0x1D1C0]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x77 },
- unicodeslot=0x1D500,
+ specials={ "char", 0x1D1BC, 0x1D16F },
+ unicodeslot=0x1D1C0,
},
- [0x1D501]={
- category="ll",
+ [0x1D1C1]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x78 },
- unicodeslot=0x1D501,
+ unicodeslot=0x1D1C1,
},
- [0x1D502]={
- category="ll",
+ [0x1D1C2]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x79 },
- unicodeslot=0x1D502,
+ unicodeslot=0x1D1C2,
},
- [0x1D503]={
- category="ll",
+ [0x1D1C3]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x7A },
- unicodeslot=0x1D503,
+ unicodeslot=0x1D1C3,
},
- [0x1D504]={
- category="lu",
+ [0x1D1C4]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x41 },
- unicodeslot=0x1D504,
+ unicodeslot=0x1D1C4,
},
- [0x1D505]={
- category="lu",
+ [0x1D1C5]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x42 },
- unicodeslot=0x1D505,
+ unicodeslot=0x1D1C5,
},
- [0x1D507]={
- category="lu",
+ [0x1D1C6]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x44 },
- unicodeslot=0x1D507,
+ unicodeslot=0x1D1C6,
},
- [0x1D508]={
- category="lu",
+ [0x1D1C7]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x45 },
- unicodeslot=0x1D508,
+ unicodeslot=0x1D1C7,
},
- [0x1D509]={
- category="lu",
+ [0x1D1C8]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x46 },
- unicodeslot=0x1D509,
+ unicodeslot=0x1D1C8,
},
- [0x1D50A]={
- category="lu",
+ [0x1D1C9]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x47 },
- unicodeslot=0x1D50A,
+ unicodeslot=0x1D1C9,
},
- [0x1D50D]={
- category="lu",
+ [0x1D1CA]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4A },
- unicodeslot=0x1D50D,
+ unicodeslot=0x1D1CA,
},
- [0x1D50E]={
- category="lu",
+ [0x1D1CB]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4B },
- unicodeslot=0x1D50E,
+ unicodeslot=0x1D1CB,
},
- [0x1D50F]={
- category="lu",
+ [0x1D1CC]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4C },
- unicodeslot=0x1D50F,
+ unicodeslot=0x1D1CC,
},
- [0x1D510]={
- category="lu",
+ [0x1D1CD]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4D },
- unicodeslot=0x1D510,
+ unicodeslot=0x1D1CD,
},
- [0x1D511]={
- category="lu",
+ [0x1D1CE]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4E },
- unicodeslot=0x1D511,
+ unicodeslot=0x1D1CE,
},
- [0x1D512]={
- category="lu",
+ [0x1D1CF]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x4F },
- unicodeslot=0x1D512,
+ unicodeslot=0x1D1CF,
},
- [0x1D513]={
- category="lu",
+ [0x1D1D0]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x50 },
- unicodeslot=0x1D513,
+ unicodeslot=0x1D1D0,
},
- [0x1D514]={
- category="lu",
+ [0x1D1D1]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x51 },
- unicodeslot=0x1D514,
+ unicodeslot=0x1D1D1,
},
- [0x1D516]={
- category="lu",
+ [0x1D1D2]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x53 },
- unicodeslot=0x1D516,
+ unicodeslot=0x1D1D2,
},
- [0x1D517]={
- category="lu",
+ [0x1D1D3]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x54 },
- unicodeslot=0x1D517,
+ unicodeslot=0x1D1D3,
},
- [0x1D518]={
- category="lu",
+ [0x1D1D4]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x55 },
- unicodeslot=0x1D518,
+ unicodeslot=0x1D1D4,
},
- [0x1D519]={
- category="lu",
+ [0x1D1D5]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x56 },
- unicodeslot=0x1D519,
+ unicodeslot=0x1D1D5,
},
- [0x1D51A]={
- category="lu",
+ [0x1D1D6]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x57 },
- unicodeslot=0x1D51A,
+ unicodeslot=0x1D1D6,
},
- [0x1D51B]={
- category="lu",
+ [0x1D1D7]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x58 },
- unicodeslot=0x1D51B,
+ unicodeslot=0x1D1D7,
},
- [0x1D51C]={
- category="lu",
+ [0x1D1D8]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x59 },
- unicodeslot=0x1D51C,
+ unicodeslot=0x1D1D8,
},
- [0x1D51E]={
- category="ll",
+ [0x1D1D9]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x61 },
- unicodeslot=0x1D51E,
+ unicodeslot=0x1D1D9,
},
- [0x1D51F]={
- category="ll",
+ [0x1D1DA]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x62 },
- unicodeslot=0x1D51F,
+ unicodeslot=0x1D1DA,
},
- [0x1D520]={
- category="ll",
+ [0x1D1DB]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x63 },
- unicodeslot=0x1D520,
+ unicodeslot=0x1D1DB,
},
- [0x1D521]={
- category="ll",
+ [0x1D1DC]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x64 },
- unicodeslot=0x1D521,
+ unicodeslot=0x1D1DC,
},
- [0x1D522]={
- category="ll",
+ [0x1D1DD]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x65 },
- unicodeslot=0x1D522,
+ unicodeslot=0x1D1DD,
},
- [0x1D523]={
- category="ll",
+ [0x1D1DE]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x66 },
- unicodeslot=0x1D523,
+ unicodeslot=0x1D1DE,
},
- [0x1D524]={
- category="ll",
+ [0x1D1DF]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x67 },
- unicodeslot=0x1D524,
+ unicodeslot=0x1D1DF,
},
- [0x1D525]={
- category="ll",
+ [0x1D1E0]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x68 },
- unicodeslot=0x1D525,
+ unicodeslot=0x1D1E0,
},
- [0x1D526]={
- category="ll",
+ [0x1D1E1]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x69 },
- unicodeslot=0x1D526,
+ unicodeslot=0x1D1E1,
},
- [0x1D527]={
- category="ll",
+ [0x1D1E2]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6A },
- unicodeslot=0x1D527,
+ unicodeslot=0x1D1E2,
},
- [0x1D528]={
- category="ll",
+ [0x1D1E3]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6B },
- unicodeslot=0x1D528,
+ unicodeslot=0x1D1E3,
},
- [0x1D529]={
- category="ll",
+ [0x1D1E4]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6C },
- unicodeslot=0x1D529,
+ unicodeslot=0x1D1E4,
},
- [0x1D52A]={
- category="ll",
+ [0x1D1E5]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6D },
- unicodeslot=0x1D52A,
+ unicodeslot=0x1D1E5,
},
- [0x1D52B]={
- category="ll",
+ [0x1D1E6]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6E },
- unicodeslot=0x1D52B,
+ unicodeslot=0x1D1E6,
},
- [0x1D52C]={
- category="ll",
+ [0x1D1E7]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x6F },
- unicodeslot=0x1D52C,
+ unicodeslot=0x1D1E7,
},
- [0x1D52D]={
- category="ll",
+ [0x1D1E8]={
+ category="so",
direction="l",
linebreak="al",
- specials={ "font", 0x70 },
- unicodeslot=0x1D52D,
+ unicodeslot=0x1D1E8,
},
- [0x1D52E]={
- category="ll",
- direction="l",
+ [0x1D200]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x71 },
- unicodeslot=0x1D52E,
+ unicodeslot=0x1D200,
},
- [0x1D52F]={
- category="ll",
- direction="l",
+ [0x1D201]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x72 },
- unicodeslot=0x1D52F,
+ unicodeslot=0x1D201,
},
- [0x1D530]={
- category="ll",
- direction="l",
+ [0x1D202]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x73 },
- unicodeslot=0x1D530,
+ unicodeslot=0x1D202,
},
- [0x1D531]={
- category="ll",
- direction="l",
+ [0x1D203]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x74 },
- unicodeslot=0x1D531,
+ unicodeslot=0x1D203,
},
- [0x1D532]={
- category="ll",
- direction="l",
+ [0x1D204]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x75 },
- unicodeslot=0x1D532,
+ unicodeslot=0x1D204,
},
- [0x1D533]={
- category="ll",
- direction="l",
+ [0x1D205]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x76 },
- unicodeslot=0x1D533,
+ unicodeslot=0x1D205,
},
- [0x1D534]={
- category="ll",
- direction="l",
+ [0x1D206]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x77 },
- unicodeslot=0x1D534,
+ unicodeslot=0x1D206,
},
- [0x1D535]={
- category="ll",
- direction="l",
+ [0x1D207]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x78 },
- unicodeslot=0x1D535,
+ unicodeslot=0x1D207,
},
- [0x1D536]={
- category="ll",
- direction="l",
+ [0x1D208]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x79 },
- unicodeslot=0x1D536,
+ unicodeslot=0x1D208,
},
- [0x1D537]={
- category="ll",
- direction="l",
+ [0x1D209]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x7A },
- unicodeslot=0x1D537,
+ unicodeslot=0x1D209,
},
- [0x1D538]={
- category="lu",
- direction="l",
+ [0x1D20A]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x41 },
- unicodeslot=0x1D538,
+ unicodeslot=0x1D20A,
},
- [0x1D539]={
- category="lu",
- direction="l",
+ [0x1D20B]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x42 },
- unicodeslot=0x1D539,
+ unicodeslot=0x1D20B,
},
- [0x1D53B]={
- category="lu",
- direction="l",
+ [0x1D20C]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x44 },
- unicodeslot=0x1D53B,
+ unicodeslot=0x1D20C,
},
- [0x1D53C]={
- category="lu",
- direction="l",
+ [0x1D20D]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x45 },
- unicodeslot=0x1D53C,
+ unicodeslot=0x1D20D,
},
- [0x1D53D]={
- category="lu",
- direction="l",
+ [0x1D20E]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x46 },
- unicodeslot=0x1D53D,
+ unicodeslot=0x1D20E,
},
- [0x1D53E]={
- category="lu",
- direction="l",
+ [0x1D20F]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x47 },
- unicodeslot=0x1D53E,
+ unicodeslot=0x1D20F,
},
- [0x1D540]={
- category="lu",
- direction="l",
+ [0x1D210]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x49 },
- unicodeslot=0x1D540,
+ unicodeslot=0x1D210,
},
- [0x1D541]={
- category="lu",
- direction="l",
+ [0x1D211]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x4A },
- unicodeslot=0x1D541,
+ unicodeslot=0x1D211,
},
- [0x1D542]={
- category="lu",
- direction="l",
+ [0x1D212]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x4B },
- unicodeslot=0x1D542,
+ unicodeslot=0x1D212,
},
- [0x1D543]={
- category="lu",
- direction="l",
+ [0x1D213]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x4C },
- unicodeslot=0x1D543,
+ unicodeslot=0x1D213,
},
- [0x1D544]={
- category="lu",
- direction="l",
+ [0x1D214]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x4D },
- unicodeslot=0x1D544,
+ unicodeslot=0x1D214,
},
- [0x1D546]={
- category="lu",
- direction="l",
+ [0x1D215]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x4F },
- unicodeslot=0x1D546,
+ unicodeslot=0x1D215,
},
- [0x1D54A]={
- category="lu",
- direction="l",
+ [0x1D216]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x53 },
- unicodeslot=0x1D54A,
+ unicodeslot=0x1D216,
},
- [0x1D54B]={
- category="lu",
- direction="l",
+ [0x1D217]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x54 },
- unicodeslot=0x1D54B,
+ unicodeslot=0x1D217,
},
- [0x1D54C]={
- category="lu",
- direction="l",
+ [0x1D218]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x55 },
- unicodeslot=0x1D54C,
+ unicodeslot=0x1D218,
},
- [0x1D54D]={
- category="lu",
- direction="l",
+ [0x1D219]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x56 },
- unicodeslot=0x1D54D,
+ unicodeslot=0x1D219,
},
- [0x1D54E]={
- category="lu",
- direction="l",
+ [0x1D21A]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x57 },
- unicodeslot=0x1D54E,
+ unicodeslot=0x1D21A,
},
- [0x1D54F]={
- category="lu",
- direction="l",
+ [0x1D21B]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x58 },
- unicodeslot=0x1D54F,
+ unicodeslot=0x1D21B,
},
- [0x1D550]={
- category="lu",
- direction="l",
+ [0x1D21C]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x59 },
- unicodeslot=0x1D550,
+ unicodeslot=0x1D21C,
},
- [0x1D552]={
- category="ll",
- direction="l",
+ [0x1D21D]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x61 },
- unicodeslot=0x1D552,
+ unicodeslot=0x1D21D,
},
- [0x1D553]={
- category="ll",
- direction="l",
+ [0x1D21E]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x62 },
- unicodeslot=0x1D553,
+ unicodeslot=0x1D21E,
},
- [0x1D554]={
- category="ll",
- direction="l",
+ [0x1D21F]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x63 },
- unicodeslot=0x1D554,
+ unicodeslot=0x1D21F,
},
- [0x1D555]={
- category="ll",
- direction="l",
+ [0x1D220]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x64 },
- unicodeslot=0x1D555,
+ unicodeslot=0x1D220,
},
- [0x1D556]={
- category="ll",
- direction="l",
+ [0x1D221]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x65 },
- unicodeslot=0x1D556,
+ unicodeslot=0x1D221,
},
- [0x1D557]={
- category="ll",
- direction="l",
+ [0x1D222]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x66 },
- unicodeslot=0x1D557,
+ unicodeslot=0x1D222,
},
- [0x1D558]={
- category="ll",
- direction="l",
+ [0x1D223]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x67 },
- unicodeslot=0x1D558,
+ unicodeslot=0x1D223,
},
- [0x1D559]={
- category="ll",
- direction="l",
+ [0x1D224]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x68 },
- unicodeslot=0x1D559,
+ unicodeslot=0x1D224,
},
- [0x1D55A]={
- category="ll",
- direction="l",
+ [0x1D225]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x69 },
- unicodeslot=0x1D55A,
+ unicodeslot=0x1D225,
},
- [0x1D55B]={
- category="ll",
- direction="l",
+ [0x1D226]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x6A },
- unicodeslot=0x1D55B,
+ unicodeslot=0x1D226,
},
- [0x1D55C]={
- category="ll",
- direction="l",
+ [0x1D227]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x6B },
- unicodeslot=0x1D55C,
+ unicodeslot=0x1D227,
},
- [0x1D55D]={
- category="ll",
- direction="l",
+ [0x1D228]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x6C },
- unicodeslot=0x1D55D,
+ unicodeslot=0x1D228,
},
- [0x1D55E]={
- category="ll",
- direction="l",
+ [0x1D229]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x6D },
- unicodeslot=0x1D55E,
+ unicodeslot=0x1D229,
},
- [0x1D55F]={
- category="ll",
- direction="l",
+ [0x1D22A]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x6E },
- unicodeslot=0x1D55F,
+ unicodeslot=0x1D22A,
},
- [0x1D560]={
- category="ll",
- direction="l",
+ [0x1D22B]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x6F },
- unicodeslot=0x1D560,
+ unicodeslot=0x1D22B,
},
- [0x1D561]={
- category="ll",
- direction="l",
+ [0x1D22C]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x70 },
- unicodeslot=0x1D561,
+ unicodeslot=0x1D22C,
},
- [0x1D562]={
- category="ll",
- direction="l",
+ [0x1D22D]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x71 },
- unicodeslot=0x1D562,
+ unicodeslot=0x1D22D,
},
- [0x1D563]={
- category="ll",
- direction="l",
+ [0x1D22E]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x72 },
- unicodeslot=0x1D563,
+ unicodeslot=0x1D22E,
},
- [0x1D564]={
- category="ll",
- direction="l",
+ [0x1D22F]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x73 },
- unicodeslot=0x1D564,
+ unicodeslot=0x1D22F,
},
- [0x1D565]={
- category="ll",
- direction="l",
+ [0x1D230]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x74 },
- unicodeslot=0x1D565,
+ unicodeslot=0x1D230,
},
- [0x1D566]={
- category="ll",
- direction="l",
+ [0x1D231]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x75 },
- unicodeslot=0x1D566,
+ unicodeslot=0x1D231,
},
- [0x1D567]={
- category="ll",
- direction="l",
+ [0x1D232]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x76 },
- unicodeslot=0x1D567,
+ unicodeslot=0x1D232,
},
- [0x1D568]={
- category="ll",
- direction="l",
+ [0x1D233]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x77 },
- unicodeslot=0x1D568,
+ unicodeslot=0x1D233,
},
- [0x1D569]={
- category="ll",
- direction="l",
+ [0x1D234]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x78 },
- unicodeslot=0x1D569,
+ unicodeslot=0x1D234,
},
- [0x1D56A]={
- category="ll",
- direction="l",
+ [0x1D235]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x79 },
- unicodeslot=0x1D56A,
+ unicodeslot=0x1D235,
},
- [0x1D56B]={
- category="ll",
- direction="l",
+ [0x1D236]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x7A },
- unicodeslot=0x1D56B,
+ unicodeslot=0x1D236,
},
- [0x1D56C]={
- category="lu",
- direction="l",
+ [0x1D237]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x41 },
- unicodeslot=0x1D56C,
+ unicodeslot=0x1D237,
},
- [0x1D56D]={
- category="lu",
- direction="l",
+ [0x1D238]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x42 },
- unicodeslot=0x1D56D,
+ unicodeslot=0x1D238,
},
- [0x1D56E]={
- category="lu",
- direction="l",
+ [0x1D239]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x43 },
- unicodeslot=0x1D56E,
+ unicodeslot=0x1D239,
},
- [0x1D56F]={
- category="lu",
- direction="l",
+ [0x1D23A]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x44 },
- unicodeslot=0x1D56F,
+ unicodeslot=0x1D23A,
},
- [0x1D570]={
- category="lu",
- direction="l",
+ [0x1D23B]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x45 },
- unicodeslot=0x1D570,
+ unicodeslot=0x1D23B,
},
- [0x1D571]={
- category="lu",
- direction="l",
+ [0x1D23C]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x46 },
- unicodeslot=0x1D571,
+ unicodeslot=0x1D23C,
},
- [0x1D572]={
- category="lu",
- direction="l",
+ [0x1D23D]={
+ category="so",
+ direction="on",
linebreak="al",
- specials={ "font", 0x47 },
- unicodeslot=0x1D572,
+ unicodeslot=0x1D23D,
},
- [0x1D573]={
- category="lu",
+ [0x1D23E]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D23E,
+ },
+ [0x1D23F]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D23F,
+ },
+ [0x1D240]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D240,
+ },
+ [0x1D241]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D241,
+ },
+ [0x1D242]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D242,
+ },
+ [0x1D243]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D243,
+ },
+ [0x1D244]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D244,
+ },
+ [0x1D245]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D245,
+ },
+ [0x1D2E0]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x48 },
- unicodeslot=0x1D573,
+ unicodeslot=0x1D2E0,
},
- [0x1D574]={
- category="lu",
+ [0x1D2E1]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x49 },
- unicodeslot=0x1D574,
+ unicodeslot=0x1D2E1,
},
- [0x1D575]={
- category="lu",
+ [0x1D2E2]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x4A },
- unicodeslot=0x1D575,
+ unicodeslot=0x1D2E2,
},
- [0x1D576]={
- category="lu",
+ [0x1D2E3]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x4B },
- unicodeslot=0x1D576,
+ unicodeslot=0x1D2E3,
},
- [0x1D577]={
- category="lu",
+ [0x1D2E4]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x4C },
- unicodeslot=0x1D577,
+ unicodeslot=0x1D2E4,
},
- [0x1D578]={
- category="lu",
+ [0x1D2E5]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x4D },
- unicodeslot=0x1D578,
+ unicodeslot=0x1D2E5,
},
- [0x1D579]={
- category="lu",
+ [0x1D2E6]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x4E },
- unicodeslot=0x1D579,
+ unicodeslot=0x1D2E6,
},
- [0x1D57A]={
- category="lu",
+ [0x1D2E7]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x4F },
- unicodeslot=0x1D57A,
+ unicodeslot=0x1D2E7,
},
- [0x1D57B]={
- category="lu",
+ [0x1D2E8]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x50 },
- unicodeslot=0x1D57B,
+ unicodeslot=0x1D2E8,
},
- [0x1D57C]={
- category="lu",
+ [0x1D2E9]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x51 },
- unicodeslot=0x1D57C,
+ unicodeslot=0x1D2E9,
},
- [0x1D57D]={
- category="lu",
+ [0x1D2EA]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x52 },
- unicodeslot=0x1D57D,
+ unicodeslot=0x1D2EA,
},
- [0x1D57E]={
- category="lu",
+ [0x1D2EB]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x53 },
- unicodeslot=0x1D57E,
+ unicodeslot=0x1D2EB,
},
- [0x1D57F]={
- category="lu",
+ [0x1D2EC]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x54 },
- unicodeslot=0x1D57F,
+ unicodeslot=0x1D2EC,
},
- [0x1D580]={
- category="lu",
+ [0x1D2ED]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x55 },
- unicodeslot=0x1D580,
+ unicodeslot=0x1D2ED,
},
- [0x1D581]={
- category="lu",
+ [0x1D2EE]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x56 },
- unicodeslot=0x1D581,
+ unicodeslot=0x1D2EE,
},
- [0x1D582]={
- category="lu",
+ [0x1D2EF]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x57 },
- unicodeslot=0x1D582,
+ unicodeslot=0x1D2EF,
},
- [0x1D583]={
- category="lu",
+ [0x1D2F0]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x58 },
- unicodeslot=0x1D583,
+ unicodeslot=0x1D2F0,
},
- [0x1D584]={
- category="lu",
+ [0x1D2F1]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x59 },
- unicodeslot=0x1D584,
+ unicodeslot=0x1D2F1,
},
- [0x1D585]={
- category="lu",
+ [0x1D2F2]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x5A },
- unicodeslot=0x1D585,
+ unicodeslot=0x1D2F2,
},
- [0x1D586]={
- category="ll",
+ [0x1D2F3]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x61 },
- unicodeslot=0x1D586,
+ unicodeslot=0x1D2F3,
},
- [0x1D587]={
- category="ll",
+ [0x1D300]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D300,
+ },
+ [0x1D301]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D301,
+ },
+ [0x1D302]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D302,
+ },
+ [0x1D303]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D303,
+ },
+ [0x1D304]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D304,
+ },
+ [0x1D305]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D305,
+ },
+ [0x1D306]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D306,
+ },
+ [0x1D307]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D307,
+ },
+ [0x1D308]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D308,
+ },
+ [0x1D309]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D309,
+ },
+ [0x1D30A]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D30A,
+ },
+ [0x1D30B]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D30B,
+ },
+ [0x1D30C]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D30C,
+ },
+ [0x1D30D]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D30D,
+ },
+ [0x1D30E]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D30E,
+ },
+ [0x1D30F]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D30F,
+ },
+ [0x1D310]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D310,
+ },
+ [0x1D311]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D311,
+ },
+ [0x1D312]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D312,
+ },
+ [0x1D313]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D313,
+ },
+ [0x1D314]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D314,
+ },
+ [0x1D315]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D315,
+ },
+ [0x1D316]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D316,
+ },
+ [0x1D317]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D317,
+ },
+ [0x1D318]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D318,
+ },
+ [0x1D319]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D319,
+ },
+ [0x1D31A]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D31A,
+ },
+ [0x1D31B]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D31B,
+ },
+ [0x1D31C]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D31C,
+ },
+ [0x1D31D]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D31D,
+ },
+ [0x1D31E]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D31E,
+ },
+ [0x1D31F]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D31F,
+ },
+ [0x1D320]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D320,
+ },
+ [0x1D321]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D321,
+ },
+ [0x1D322]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D322,
+ },
+ [0x1D323]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D323,
+ },
+ [0x1D324]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D324,
+ },
+ [0x1D325]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D325,
+ },
+ [0x1D326]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D326,
+ },
+ [0x1D327]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D327,
+ },
+ [0x1D328]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D328,
+ },
+ [0x1D329]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D329,
+ },
+ [0x1D32A]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D32A,
+ },
+ [0x1D32B]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D32B,
+ },
+ [0x1D32C]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D32C,
+ },
+ [0x1D32D]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D32D,
+ },
+ [0x1D32E]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D32E,
+ },
+ [0x1D32F]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D32F,
+ },
+ [0x1D330]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D330,
+ },
+ [0x1D331]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D331,
+ },
+ [0x1D332]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D332,
+ },
+ [0x1D333]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D333,
+ },
+ [0x1D334]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D334,
+ },
+ [0x1D335]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D335,
+ },
+ [0x1D336]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D336,
+ },
+ [0x1D337]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D337,
+ },
+ [0x1D338]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D338,
+ },
+ [0x1D339]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D339,
+ },
+ [0x1D33A]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D33A,
+ },
+ [0x1D33B]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D33B,
+ },
+ [0x1D33C]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D33C,
+ },
+ [0x1D33D]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D33D,
+ },
+ [0x1D33E]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D33E,
+ },
+ [0x1D33F]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D33F,
+ },
+ [0x1D340]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D340,
+ },
+ [0x1D341]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D341,
+ },
+ [0x1D342]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D342,
+ },
+ [0x1D343]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D343,
+ },
+ [0x1D344]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D344,
+ },
+ [0x1D345]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D345,
+ },
+ [0x1D346]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D346,
+ },
+ [0x1D347]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D347,
+ },
+ [0x1D348]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D348,
+ },
+ [0x1D349]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D349,
+ },
+ [0x1D34A]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D34A,
+ },
+ [0x1D34B]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D34B,
+ },
+ [0x1D34C]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D34C,
+ },
+ [0x1D34D]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D34D,
+ },
+ [0x1D34E]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D34E,
+ },
+ [0x1D34F]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D34F,
+ },
+ [0x1D350]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D350,
+ },
+ [0x1D351]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D351,
+ },
+ [0x1D352]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D352,
+ },
+ [0x1D353]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D353,
+ },
+ [0x1D354]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D354,
+ },
+ [0x1D355]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D355,
+ },
+ [0x1D356]={
+ category="so",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D356,
+ },
+ [0x1D360]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x62 },
- unicodeslot=0x1D587,
+ unicodeslot=0x1D360,
},
- [0x1D588]={
- category="ll",
+ [0x1D361]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x63 },
- unicodeslot=0x1D588,
+ unicodeslot=0x1D361,
},
- [0x1D589]={
- category="ll",
+ [0x1D362]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x64 },
- unicodeslot=0x1D589,
+ unicodeslot=0x1D362,
},
- [0x1D58A]={
- category="ll",
+ [0x1D363]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x65 },
- unicodeslot=0x1D58A,
+ unicodeslot=0x1D363,
},
- [0x1D58B]={
- category="ll",
+ [0x1D364]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x66 },
- unicodeslot=0x1D58B,
+ unicodeslot=0x1D364,
},
- [0x1D58C]={
- category="ll",
+ [0x1D365]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x67 },
- unicodeslot=0x1D58C,
+ unicodeslot=0x1D365,
},
- [0x1D58D]={
- category="ll",
+ [0x1D366]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x68 },
- unicodeslot=0x1D58D,
+ unicodeslot=0x1D366,
},
- [0x1D58E]={
- category="ll",
+ [0x1D367]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x69 },
- unicodeslot=0x1D58E,
+ unicodeslot=0x1D367,
},
- [0x1D58F]={
- category="ll",
+ [0x1D368]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x6A },
- unicodeslot=0x1D58F,
+ unicodeslot=0x1D368,
},
- [0x1D590]={
- category="ll",
+ [0x1D369]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x6B },
- unicodeslot=0x1D590,
+ unicodeslot=0x1D369,
},
- [0x1D591]={
- category="ll",
+ [0x1D36A]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x6C },
- unicodeslot=0x1D591,
+ unicodeslot=0x1D36A,
},
- [0x1D592]={
- category="ll",
+ [0x1D36B]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x6D },
- unicodeslot=0x1D592,
+ unicodeslot=0x1D36B,
},
- [0x1D593]={
- category="ll",
+ [0x1D36C]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x6E },
- unicodeslot=0x1D593,
+ unicodeslot=0x1D36C,
},
- [0x1D594]={
- category="ll",
+ [0x1D36D]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x6F },
- unicodeslot=0x1D594,
+ unicodeslot=0x1D36D,
},
- [0x1D595]={
- category="ll",
+ [0x1D36E]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x70 },
- unicodeslot=0x1D595,
+ unicodeslot=0x1D36E,
},
- [0x1D596]={
- category="ll",
+ [0x1D36F]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x71 },
- unicodeslot=0x1D596,
+ unicodeslot=0x1D36F,
},
- [0x1D597]={
- category="ll",
+ [0x1D370]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x72 },
- unicodeslot=0x1D597,
+ unicodeslot=0x1D370,
},
- [0x1D598]={
- category="ll",
+ [0x1D371]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x73 },
- unicodeslot=0x1D598,
+ unicodeslot=0x1D371,
},
- [0x1D599]={
- category="ll",
+ [0x1D372]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x74 },
- unicodeslot=0x1D599,
+ unicodeslot=0x1D372,
},
- [0x1D59A]={
- category="ll",
+ [0x1D373]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x75 },
- unicodeslot=0x1D59A,
+ unicodeslot=0x1D373,
},
- [0x1D59B]={
- category="ll",
+ [0x1D374]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x76 },
- unicodeslot=0x1D59B,
+ unicodeslot=0x1D374,
},
- [0x1D59C]={
- category="ll",
+ [0x1D375]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x77 },
- unicodeslot=0x1D59C,
+ unicodeslot=0x1D375,
},
- [0x1D59D]={
- category="ll",
+ [0x1D376]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x78 },
- unicodeslot=0x1D59D,
+ unicodeslot=0x1D376,
},
- [0x1D59E]={
- category="ll",
+ [0x1D377]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x79 },
- unicodeslot=0x1D59E,
+ unicodeslot=0x1D377,
},
- [0x1D59F]={
- category="ll",
+ [0x1D378]={
+ category="no",
direction="l",
linebreak="al",
- specials={ "font", 0x7A },
- unicodeslot=0x1D59F,
+ unicodeslot=0x1D378,
},
- [0x1D5A0]={
+ [0x1D400]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x41 },
- unicodeslot=0x1D5A0,
+ unicodeslot=0x1D400,
},
- [0x1D5A1]={
+ [0x1D401]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x42 },
- unicodeslot=0x1D5A1,
+ unicodeslot=0x1D401,
},
- [0x1D5A2]={
+ [0x1D402]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x43 },
- unicodeslot=0x1D5A2,
+ unicodeslot=0x1D402,
},
- [0x1D5A3]={
+ [0x1D403]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x44 },
- unicodeslot=0x1D5A3,
+ unicodeslot=0x1D403,
},
- [0x1D5A4]={
+ [0x1D404]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x45 },
- unicodeslot=0x1D5A4,
+ unicodeslot=0x1D404,
},
- [0x1D5A5]={
+ [0x1D405]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x46 },
- unicodeslot=0x1D5A5,
+ unicodeslot=0x1D405,
},
- [0x1D5A6]={
+ [0x1D406]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x47 },
- unicodeslot=0x1D5A6,
+ unicodeslot=0x1D406,
},
- [0x1D5A7]={
+ [0x1D407]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x48 },
- unicodeslot=0x1D5A7,
+ unicodeslot=0x1D407,
},
- [0x1D5A8]={
+ [0x1D408]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x49 },
- unicodeslot=0x1D5A8,
+ unicodeslot=0x1D408,
},
- [0x1D5A9]={
+ [0x1D409]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4A },
- unicodeslot=0x1D5A9,
+ unicodeslot=0x1D409,
},
- [0x1D5AA]={
+ [0x1D40A]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4B },
- unicodeslot=0x1D5AA,
+ unicodeslot=0x1D40A,
},
- [0x1D5AB]={
+ [0x1D40B]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4C },
- unicodeslot=0x1D5AB,
+ unicodeslot=0x1D40B,
},
- [0x1D5AC]={
+ [0x1D40C]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4D },
- unicodeslot=0x1D5AC,
+ unicodeslot=0x1D40C,
},
- [0x1D5AD]={
+ [0x1D40D]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4E },
- unicodeslot=0x1D5AD,
+ unicodeslot=0x1D40D,
},
- [0x1D5AE]={
+ [0x1D40E]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4F },
- unicodeslot=0x1D5AE,
+ unicodeslot=0x1D40E,
},
- [0x1D5AF]={
+ [0x1D40F]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x50 },
- unicodeslot=0x1D5AF,
+ unicodeslot=0x1D40F,
},
- [0x1D5B0]={
+ [0x1D410]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x51 },
- unicodeslot=0x1D5B0,
+ unicodeslot=0x1D410,
},
- [0x1D5B1]={
+ [0x1D411]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x52 },
- unicodeslot=0x1D5B1,
+ unicodeslot=0x1D411,
},
- [0x1D5B2]={
+ [0x1D412]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x53 },
- unicodeslot=0x1D5B2,
+ unicodeslot=0x1D412,
},
- [0x1D5B3]={
+ [0x1D413]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x54 },
- unicodeslot=0x1D5B3,
+ unicodeslot=0x1D413,
},
- [0x1D5B4]={
+ [0x1D414]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x55 },
- unicodeslot=0x1D5B4,
+ unicodeslot=0x1D414,
},
- [0x1D5B5]={
+ [0x1D415]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x56 },
- unicodeslot=0x1D5B5,
+ unicodeslot=0x1D415,
},
- [0x1D5B6]={
+ [0x1D416]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x57 },
- unicodeslot=0x1D5B6,
+ unicodeslot=0x1D416,
},
- [0x1D5B7]={
+ [0x1D417]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x58 },
- unicodeslot=0x1D5B7,
+ unicodeslot=0x1D417,
},
- [0x1D5B8]={
+ [0x1D418]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x59 },
- unicodeslot=0x1D5B8,
+ unicodeslot=0x1D418,
},
- [0x1D5B9]={
+ [0x1D419]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x5A },
- unicodeslot=0x1D5B9,
+ unicodeslot=0x1D419,
},
- [0x1D5BA]={
+ [0x1D41A]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x61 },
- unicodeslot=0x1D5BA,
+ unicodeslot=0x1D41A,
},
- [0x1D5BB]={
+ [0x1D41B]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x62 },
- unicodeslot=0x1D5BB,
+ unicodeslot=0x1D41B,
},
- [0x1D5BC]={
+ [0x1D41C]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x63 },
- unicodeslot=0x1D5BC,
+ unicodeslot=0x1D41C,
},
- [0x1D5BD]={
+ [0x1D41D]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x64 },
- unicodeslot=0x1D5BD,
+ unicodeslot=0x1D41D,
},
- [0x1D5BE]={
+ [0x1D41E]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x65 },
- unicodeslot=0x1D5BE,
+ unicodeslot=0x1D41E,
},
- [0x1D5BF]={
+ [0x1D41F]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x66 },
- unicodeslot=0x1D5BF,
+ unicodeslot=0x1D41F,
},
- [0x1D5C0]={
+ [0x1D420]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x67 },
- unicodeslot=0x1D5C0,
+ unicodeslot=0x1D420,
},
- [0x1D5C1]={
+ [0x1D421]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x68 },
- unicodeslot=0x1D5C1,
+ unicodeslot=0x1D421,
},
- [0x1D5C2]={
+ [0x1D422]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x69 },
- unicodeslot=0x1D5C2,
+ unicodeslot=0x1D422,
},
- [0x1D5C3]={
+ [0x1D423]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6A },
- unicodeslot=0x1D5C3,
+ unicodeslot=0x1D423,
},
- [0x1D5C4]={
+ [0x1D424]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6B },
- unicodeslot=0x1D5C4,
+ unicodeslot=0x1D424,
},
- [0x1D5C5]={
+ [0x1D425]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6C },
- unicodeslot=0x1D5C5,
+ unicodeslot=0x1D425,
},
- [0x1D5C6]={
+ [0x1D426]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6D },
- unicodeslot=0x1D5C6,
+ unicodeslot=0x1D426,
},
- [0x1D5C7]={
+ [0x1D427]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6E },
- unicodeslot=0x1D5C7,
+ unicodeslot=0x1D427,
},
- [0x1D5C8]={
+ [0x1D428]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6F },
- unicodeslot=0x1D5C8,
+ unicodeslot=0x1D428,
},
- [0x1D5C9]={
+ [0x1D429]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x70 },
- unicodeslot=0x1D5C9,
+ unicodeslot=0x1D429,
},
- [0x1D5CA]={
+ [0x1D42A]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x71 },
- unicodeslot=0x1D5CA,
+ unicodeslot=0x1D42A,
},
- [0x1D5CB]={
+ [0x1D42B]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x72 },
- unicodeslot=0x1D5CB,
+ unicodeslot=0x1D42B,
},
- [0x1D5CC]={
+ [0x1D42C]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x73 },
- unicodeslot=0x1D5CC,
+ unicodeslot=0x1D42C,
},
- [0x1D5CD]={
+ [0x1D42D]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x74 },
- unicodeslot=0x1D5CD,
+ unicodeslot=0x1D42D,
},
- [0x1D5CE]={
+ [0x1D42E]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x75 },
- unicodeslot=0x1D5CE,
+ unicodeslot=0x1D42E,
},
- [0x1D5CF]={
+ [0x1D42F]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x76 },
- unicodeslot=0x1D5CF,
+ unicodeslot=0x1D42F,
},
- [0x1D5D0]={
+ [0x1D430]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x77 },
- unicodeslot=0x1D5D0,
+ unicodeslot=0x1D430,
},
- [0x1D5D1]={
+ [0x1D431]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x78 },
- unicodeslot=0x1D5D1,
+ unicodeslot=0x1D431,
},
- [0x1D5D2]={
+ [0x1D432]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x79 },
- unicodeslot=0x1D5D2,
+ unicodeslot=0x1D432,
},
- [0x1D5D3]={
+ [0x1D433]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x7A },
- unicodeslot=0x1D5D3,
+ unicodeslot=0x1D433,
},
- [0x1D5D4]={
+ [0x1D434]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x41 },
- unicodeslot=0x1D5D4,
+ unicodeslot=0x1D434,
},
- [0x1D5D5]={
+ [0x1D435]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x42 },
- unicodeslot=0x1D5D5,
+ unicodeslot=0x1D435,
},
- [0x1D5D6]={
+ [0x1D436]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x43 },
- unicodeslot=0x1D5D6,
+ unicodeslot=0x1D436,
},
- [0x1D5D7]={
+ [0x1D437]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x44 },
- unicodeslot=0x1D5D7,
+ unicodeslot=0x1D437,
},
- [0x1D5D8]={
+ [0x1D438]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x45 },
- unicodeslot=0x1D5D8,
+ unicodeslot=0x1D438,
},
- [0x1D5D9]={
+ [0x1D439]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x46 },
- unicodeslot=0x1D5D9,
+ unicodeslot=0x1D439,
},
- [0x1D5DA]={
+ [0x1D43A]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x47 },
- unicodeslot=0x1D5DA,
+ unicodeslot=0x1D43A,
},
- [0x1D5DB]={
+ [0x1D43B]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x48 },
- unicodeslot=0x1D5DB,
+ unicodeslot=0x1D43B,
},
- [0x1D5DC]={
+ [0x1D43C]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x49 },
- unicodeslot=0x1D5DC,
+ unicodeslot=0x1D43C,
},
- [0x1D5DD]={
+ [0x1D43D]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4A },
- unicodeslot=0x1D5DD,
+ unicodeslot=0x1D43D,
},
- [0x1D5DE]={
+ [0x1D43E]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4B },
- unicodeslot=0x1D5DE,
+ unicodeslot=0x1D43E,
},
- [0x1D5DF]={
+ [0x1D43F]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4C },
- unicodeslot=0x1D5DF,
+ unicodeslot=0x1D43F,
},
- [0x1D5E0]={
+ [0x1D440]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4D },
- unicodeslot=0x1D5E0,
+ unicodeslot=0x1D440,
},
- [0x1D5E1]={
+ [0x1D441]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4E },
- unicodeslot=0x1D5E1,
+ unicodeslot=0x1D441,
},
- [0x1D5E2]={
+ [0x1D442]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4F },
- unicodeslot=0x1D5E2,
+ unicodeslot=0x1D442,
},
- [0x1D5E3]={
+ [0x1D443]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x50 },
- unicodeslot=0x1D5E3,
+ unicodeslot=0x1D443,
},
- [0x1D5E4]={
+ [0x1D444]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x51 },
- unicodeslot=0x1D5E4,
+ unicodeslot=0x1D444,
},
- [0x1D5E5]={
+ [0x1D445]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x52 },
- unicodeslot=0x1D5E5,
+ unicodeslot=0x1D445,
},
- [0x1D5E6]={
+ [0x1D446]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x53 },
- unicodeslot=0x1D5E6,
+ unicodeslot=0x1D446,
},
- [0x1D5E7]={
+ [0x1D447]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x54 },
- unicodeslot=0x1D5E7,
+ unicodeslot=0x1D447,
},
- [0x1D5E8]={
+ [0x1D448]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x55 },
- unicodeslot=0x1D5E8,
+ unicodeslot=0x1D448,
},
- [0x1D5E9]={
+ [0x1D449]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x56 },
- unicodeslot=0x1D5E9,
+ unicodeslot=0x1D449,
},
- [0x1D5EA]={
+ [0x1D44A]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x57 },
- unicodeslot=0x1D5EA,
+ unicodeslot=0x1D44A,
},
- [0x1D5EB]={
+ [0x1D44B]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x58 },
- unicodeslot=0x1D5EB,
+ unicodeslot=0x1D44B,
},
- [0x1D5EC]={
+ [0x1D44C]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x59 },
- unicodeslot=0x1D5EC,
+ unicodeslot=0x1D44C,
},
- [0x1D5ED]={
+ [0x1D44D]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x5A },
- unicodeslot=0x1D5ED,
+ unicodeslot=0x1D44D,
},
- [0x1D5EE]={
+ [0x1D44E]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x61 },
- unicodeslot=0x1D5EE,
+ unicodeslot=0x1D44E,
},
- [0x1D5EF]={
+ [0x1D44F]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x62 },
- unicodeslot=0x1D5EF,
+ unicodeslot=0x1D44F,
},
- [0x1D5F0]={
+ [0x1D450]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x63 },
- unicodeslot=0x1D5F0,
+ unicodeslot=0x1D450,
},
- [0x1D5F1]={
+ [0x1D451]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x64 },
- unicodeslot=0x1D5F1,
+ unicodeslot=0x1D451,
},
- [0x1D5F2]={
+ [0x1D452]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x65 },
- unicodeslot=0x1D5F2,
+ unicodeslot=0x1D452,
},
- [0x1D5F3]={
+ [0x1D453]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x66 },
- unicodeslot=0x1D5F3,
+ unicodeslot=0x1D453,
},
- [0x1D5F4]={
+ [0x1D454]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x67 },
- unicodeslot=0x1D5F4,
- },
- [0x1D5F5]={
- category="ll",
- direction="l",
- linebreak="al",
- specials={ "font", 0x68 },
- unicodeslot=0x1D5F5,
+ unicodeslot=0x1D454,
},
- [0x1D5F6]={
+ [0x1D456]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x69 },
- unicodeslot=0x1D5F6,
+ unicodeslot=0x1D456,
},
- [0x1D5F7]={
+ [0x1D457]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6A },
- unicodeslot=0x1D5F7,
+ unicodeslot=0x1D457,
},
- [0x1D5F8]={
+ [0x1D458]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6B },
- unicodeslot=0x1D5F8,
+ unicodeslot=0x1D458,
},
- [0x1D5F9]={
+ [0x1D459]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6C },
- unicodeslot=0x1D5F9,
+ unicodeslot=0x1D459,
},
- [0x1D5FA]={
+ [0x1D45A]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6D },
- unicodeslot=0x1D5FA,
+ unicodeslot=0x1D45A,
},
- [0x1D5FB]={
+ [0x1D45B]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6E },
- unicodeslot=0x1D5FB,
+ unicodeslot=0x1D45B,
},
- [0x1D5FC]={
+ [0x1D45C]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6F },
- unicodeslot=0x1D5FC,
+ unicodeslot=0x1D45C,
},
- [0x1D5FD]={
+ [0x1D45D]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x70 },
- unicodeslot=0x1D5FD,
+ unicodeslot=0x1D45D,
},
- [0x1D5FE]={
+ [0x1D45E]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x71 },
- unicodeslot=0x1D5FE,
+ unicodeslot=0x1D45E,
},
- [0x1D5FF]={
+ [0x1D45F]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x72 },
- unicodeslot=0x1D5FF,
+ unicodeslot=0x1D45F,
},
- [0x1D600]={
+ [0x1D460]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x73 },
- unicodeslot=0x1D600,
+ unicodeslot=0x1D460,
},
- [0x1D601]={
+ [0x1D461]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x74 },
- unicodeslot=0x1D601,
+ unicodeslot=0x1D461,
},
- [0x1D602]={
+ [0x1D462]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x75 },
- unicodeslot=0x1D602,
+ unicodeslot=0x1D462,
},
- [0x1D603]={
+ [0x1D463]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x76 },
- unicodeslot=0x1D603,
+ unicodeslot=0x1D463,
},
- [0x1D604]={
+ [0x1D464]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x77 },
- unicodeslot=0x1D604,
+ unicodeslot=0x1D464,
},
- [0x1D605]={
+ [0x1D465]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x78 },
- unicodeslot=0x1D605,
+ unicodeslot=0x1D465,
},
- [0x1D606]={
+ [0x1D466]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x79 },
- unicodeslot=0x1D606,
+ unicodeslot=0x1D466,
},
- [0x1D607]={
+ [0x1D467]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x7A },
- unicodeslot=0x1D607,
+ unicodeslot=0x1D467,
},
- [0x1D608]={
+ [0x1D468]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x41 },
- unicodeslot=0x1D608,
+ unicodeslot=0x1D468,
},
- [0x1D609]={
+ [0x1D469]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x42 },
- unicodeslot=0x1D609,
+ unicodeslot=0x1D469,
},
- [0x1D60A]={
+ [0x1D46A]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x43 },
- unicodeslot=0x1D60A,
+ unicodeslot=0x1D46A,
},
- [0x1D60B]={
+ [0x1D46B]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x44 },
- unicodeslot=0x1D60B,
+ unicodeslot=0x1D46B,
},
- [0x1D60C]={
+ [0x1D46C]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x45 },
- unicodeslot=0x1D60C,
+ unicodeslot=0x1D46C,
},
- [0x1D60D]={
+ [0x1D46D]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x46 },
- unicodeslot=0x1D60D,
+ unicodeslot=0x1D46D,
},
- [0x1D60E]={
+ [0x1D46E]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x47 },
- unicodeslot=0x1D60E,
+ unicodeslot=0x1D46E,
},
- [0x1D60F]={
+ [0x1D46F]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x48 },
- unicodeslot=0x1D60F,
+ unicodeslot=0x1D46F,
},
- [0x1D610]={
+ [0x1D470]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x49 },
- unicodeslot=0x1D610,
+ unicodeslot=0x1D470,
},
- [0x1D611]={
+ [0x1D471]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4A },
- unicodeslot=0x1D611,
+ unicodeslot=0x1D471,
},
- [0x1D612]={
+ [0x1D472]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4B },
- unicodeslot=0x1D612,
+ unicodeslot=0x1D472,
},
- [0x1D613]={
+ [0x1D473]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4C },
- unicodeslot=0x1D613,
+ unicodeslot=0x1D473,
},
- [0x1D614]={
+ [0x1D474]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4D },
- unicodeslot=0x1D614,
+ unicodeslot=0x1D474,
},
- [0x1D615]={
+ [0x1D475]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4E },
- unicodeslot=0x1D615,
+ unicodeslot=0x1D475,
},
- [0x1D616]={
+ [0x1D476]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4F },
- unicodeslot=0x1D616,
+ unicodeslot=0x1D476,
},
- [0x1D617]={
+ [0x1D477]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x50 },
- unicodeslot=0x1D617,
+ unicodeslot=0x1D477,
},
- [0x1D618]={
+ [0x1D478]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x51 },
- unicodeslot=0x1D618,
+ unicodeslot=0x1D478,
},
- [0x1D619]={
+ [0x1D479]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x52 },
- unicodeslot=0x1D619,
+ unicodeslot=0x1D479,
},
- [0x1D61A]={
+ [0x1D47A]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x53 },
- unicodeslot=0x1D61A,
+ unicodeslot=0x1D47A,
},
- [0x1D61B]={
+ [0x1D47B]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x54 },
- unicodeslot=0x1D61B,
+ unicodeslot=0x1D47B,
},
- [0x1D61C]={
+ [0x1D47C]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x55 },
- unicodeslot=0x1D61C,
+ unicodeslot=0x1D47C,
},
- [0x1D61D]={
+ [0x1D47D]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x56 },
- unicodeslot=0x1D61D,
+ unicodeslot=0x1D47D,
},
- [0x1D61E]={
+ [0x1D47E]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x57 },
- unicodeslot=0x1D61E,
+ unicodeslot=0x1D47E,
},
- [0x1D61F]={
+ [0x1D47F]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x58 },
- unicodeslot=0x1D61F,
+ unicodeslot=0x1D47F,
},
- [0x1D620]={
+ [0x1D480]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x59 },
- unicodeslot=0x1D620,
+ unicodeslot=0x1D480,
},
- [0x1D621]={
+ [0x1D481]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x5A },
- unicodeslot=0x1D621,
+ unicodeslot=0x1D481,
},
- [0x1D622]={
+ [0x1D482]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x61 },
- unicodeslot=0x1D622,
+ unicodeslot=0x1D482,
},
- [0x1D623]={
+ [0x1D483]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x62 },
- unicodeslot=0x1D623,
+ unicodeslot=0x1D483,
},
- [0x1D624]={
+ [0x1D484]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x63 },
- unicodeslot=0x1D624,
+ unicodeslot=0x1D484,
},
- [0x1D625]={
+ [0x1D485]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x64 },
- unicodeslot=0x1D625,
+ unicodeslot=0x1D485,
},
- [0x1D626]={
+ [0x1D486]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x65 },
- unicodeslot=0x1D626,
+ unicodeslot=0x1D486,
},
- [0x1D627]={
+ [0x1D487]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x66 },
- unicodeslot=0x1D627,
+ unicodeslot=0x1D487,
},
- [0x1D628]={
+ [0x1D488]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x67 },
- unicodeslot=0x1D628,
+ unicodeslot=0x1D488,
},
- [0x1D629]={
+ [0x1D489]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x68 },
- unicodeslot=0x1D629,
+ unicodeslot=0x1D489,
},
- [0x1D62A]={
+ [0x1D48A]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x69 },
- unicodeslot=0x1D62A,
+ unicodeslot=0x1D48A,
},
- [0x1D62B]={
+ [0x1D48B]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6A },
- unicodeslot=0x1D62B,
+ unicodeslot=0x1D48B,
},
- [0x1D62C]={
+ [0x1D48C]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6B },
- unicodeslot=0x1D62C,
+ unicodeslot=0x1D48C,
},
- [0x1D62D]={
+ [0x1D48D]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6C },
- unicodeslot=0x1D62D,
+ unicodeslot=0x1D48D,
},
- [0x1D62E]={
+ [0x1D48E]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6D },
- unicodeslot=0x1D62E,
+ unicodeslot=0x1D48E,
},
- [0x1D62F]={
+ [0x1D48F]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6E },
- unicodeslot=0x1D62F,
+ unicodeslot=0x1D48F,
},
- [0x1D630]={
+ [0x1D490]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6F },
- unicodeslot=0x1D630,
+ unicodeslot=0x1D490,
},
- [0x1D631]={
+ [0x1D491]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x70 },
- unicodeslot=0x1D631,
+ unicodeslot=0x1D491,
},
- [0x1D632]={
+ [0x1D492]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x71 },
- unicodeslot=0x1D632,
+ unicodeslot=0x1D492,
},
- [0x1D633]={
+ [0x1D493]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x72 },
- unicodeslot=0x1D633,
+ unicodeslot=0x1D493,
},
- [0x1D634]={
+ [0x1D494]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x73 },
- unicodeslot=0x1D634,
+ unicodeslot=0x1D494,
},
- [0x1D635]={
+ [0x1D495]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x74 },
- unicodeslot=0x1D635,
+ unicodeslot=0x1D495,
},
- [0x1D636]={
+ [0x1D496]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x75 },
- unicodeslot=0x1D636,
+ unicodeslot=0x1D496,
},
- [0x1D637]={
+ [0x1D497]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x76 },
- unicodeslot=0x1D637,
+ unicodeslot=0x1D497,
},
- [0x1D638]={
+ [0x1D498]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x77 },
- unicodeslot=0x1D638,
+ unicodeslot=0x1D498,
},
- [0x1D639]={
+ [0x1D499]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x78 },
- unicodeslot=0x1D639,
+ unicodeslot=0x1D499,
},
- [0x1D63A]={
+ [0x1D49A]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x79 },
- unicodeslot=0x1D63A,
+ unicodeslot=0x1D49A,
},
- [0x1D63B]={
+ [0x1D49B]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x7A },
- unicodeslot=0x1D63B,
+ unicodeslot=0x1D49B,
},
- [0x1D63C]={
+ [0x1D49C]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x41 },
- unicodeslot=0x1D63C,
- },
- [0x1D63D]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x42 },
- unicodeslot=0x1D63D,
+ unicodeslot=0x1D49C,
},
- [0x1D63E]={
+ [0x1D49E]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x43 },
- unicodeslot=0x1D63E,
+ unicodeslot=0x1D49E,
},
- [0x1D63F]={
+ [0x1D49F]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x44 },
- unicodeslot=0x1D63F,
- },
- [0x1D640]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x45 },
- unicodeslot=0x1D640,
- },
- [0x1D641]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x46 },
- unicodeslot=0x1D641,
+ unicodeslot=0x1D49F,
},
- [0x1D642]={
+ [0x1D4A2]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x47 },
- unicodeslot=0x1D642,
- },
- [0x1D643]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x48 },
- unicodeslot=0x1D643,
- },
- [0x1D644]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x49 },
- unicodeslot=0x1D644,
+ unicodeslot=0x1D4A2,
},
- [0x1D645]={
+ [0x1D4A5]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4A },
- unicodeslot=0x1D645,
+ unicodeslot=0x1D4A5,
},
- [0x1D646]={
+ [0x1D4A6]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4B },
- unicodeslot=0x1D646,
- },
- [0x1D647]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x4C },
- unicodeslot=0x1D647,
- },
- [0x1D648]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x4D },
- unicodeslot=0x1D648,
+ unicodeslot=0x1D4A6,
},
- [0x1D649]={
+ [0x1D4A9]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4E },
- unicodeslot=0x1D649,
+ unicodeslot=0x1D4A9,
},
- [0x1D64A]={
+ [0x1D4AA]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4F },
- unicodeslot=0x1D64A,
+ unicodeslot=0x1D4AA,
},
- [0x1D64B]={
+ [0x1D4AB]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x50 },
- unicodeslot=0x1D64B,
+ unicodeslot=0x1D4AB,
},
- [0x1D64C]={
+ [0x1D4AC]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x51 },
- unicodeslot=0x1D64C,
- },
- [0x1D64D]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x52 },
- unicodeslot=0x1D64D,
+ unicodeslot=0x1D4AC,
},
- [0x1D64E]={
+ [0x1D4AE]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x53 },
- unicodeslot=0x1D64E,
+ unicodeslot=0x1D4AE,
},
- [0x1D64F]={
+ [0x1D4AF]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x54 },
- unicodeslot=0x1D64F,
+ unicodeslot=0x1D4AF,
},
- [0x1D650]={
+ [0x1D4B0]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x55 },
- unicodeslot=0x1D650,
+ unicodeslot=0x1D4B0,
},
- [0x1D651]={
+ [0x1D4B1]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x56 },
- unicodeslot=0x1D651,
+ unicodeslot=0x1D4B1,
},
- [0x1D652]={
+ [0x1D4B2]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x57 },
- unicodeslot=0x1D652,
+ unicodeslot=0x1D4B2,
},
- [0x1D653]={
+ [0x1D4B3]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x58 },
- unicodeslot=0x1D653,
+ unicodeslot=0x1D4B3,
},
- [0x1D654]={
+ [0x1D4B4]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x59 },
- unicodeslot=0x1D654,
+ unicodeslot=0x1D4B4,
},
- [0x1D655]={
+ [0x1D4B5]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x5A },
- unicodeslot=0x1D655,
+ unicodeslot=0x1D4B5,
},
- [0x1D656]={
+ [0x1D4B6]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x61 },
- unicodeslot=0x1D656,
+ unicodeslot=0x1D4B6,
},
- [0x1D657]={
+ [0x1D4B7]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x62 },
- unicodeslot=0x1D657,
+ unicodeslot=0x1D4B7,
},
- [0x1D658]={
+ [0x1D4B8]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x63 },
- unicodeslot=0x1D658,
+ unicodeslot=0x1D4B8,
},
- [0x1D659]={
+ [0x1D4B9]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x64 },
- unicodeslot=0x1D659,
- },
- [0x1D65A]={
- category="ll",
- direction="l",
- linebreak="al",
- specials={ "font", 0x65 },
- unicodeslot=0x1D65A,
+ unicodeslot=0x1D4B9,
},
- [0x1D65B]={
+ [0x1D4BB]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x66 },
- unicodeslot=0x1D65B,
- },
- [0x1D65C]={
- category="ll",
- direction="l",
- linebreak="al",
- specials={ "font", 0x67 },
- unicodeslot=0x1D65C,
+ unicodeslot=0x1D4BB,
},
- [0x1D65D]={
+ [0x1D4BD]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x68 },
- unicodeslot=0x1D65D,
+ unicodeslot=0x1D4BD,
},
- [0x1D65E]={
+ [0x1D4BE]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x69 },
- unicodeslot=0x1D65E,
+ unicodeslot=0x1D4BE,
},
- [0x1D65F]={
+ [0x1D4BF]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6A },
- unicodeslot=0x1D65F,
+ unicodeslot=0x1D4BF,
},
- [0x1D660]={
+ [0x1D4C0]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6B },
- unicodeslot=0x1D660,
+ unicodeslot=0x1D4C0,
},
- [0x1D661]={
+ [0x1D4C1]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6C },
- unicodeslot=0x1D661,
+ unicodeslot=0x1D4C1,
},
- [0x1D662]={
+ [0x1D4C2]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6D },
- unicodeslot=0x1D662,
+ unicodeslot=0x1D4C2,
},
- [0x1D663]={
+ [0x1D4C3]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6E },
- unicodeslot=0x1D663,
- },
- [0x1D664]={
- category="ll",
- direction="l",
- linebreak="al",
- specials={ "font", 0x6F },
- unicodeslot=0x1D664,
+ unicodeslot=0x1D4C3,
},
- [0x1D665]={
+ [0x1D4C5]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x70 },
- unicodeslot=0x1D665,
+ unicodeslot=0x1D4C5,
},
- [0x1D666]={
+ [0x1D4C6]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x71 },
- unicodeslot=0x1D666,
+ unicodeslot=0x1D4C6,
},
- [0x1D667]={
+ [0x1D4C7]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x72 },
- unicodeslot=0x1D667,
+ unicodeslot=0x1D4C7,
},
- [0x1D668]={
+ [0x1D4C8]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x73 },
- unicodeslot=0x1D668,
+ unicodeslot=0x1D4C8,
},
- [0x1D669]={
+ [0x1D4C9]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x74 },
- unicodeslot=0x1D669,
+ unicodeslot=0x1D4C9,
},
- [0x1D66A]={
+ [0x1D4CA]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x75 },
- unicodeslot=0x1D66A,
+ unicodeslot=0x1D4CA,
},
- [0x1D66B]={
+ [0x1D4CB]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x76 },
- unicodeslot=0x1D66B,
+ unicodeslot=0x1D4CB,
},
- [0x1D66C]={
+ [0x1D4CC]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x77 },
- unicodeslot=0x1D66C,
+ unicodeslot=0x1D4CC,
},
- [0x1D66D]={
+ [0x1D4CD]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x78 },
- unicodeslot=0x1D66D,
+ unicodeslot=0x1D4CD,
},
- [0x1D66E]={
+ [0x1D4CE]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x79 },
- unicodeslot=0x1D66E,
+ unicodeslot=0x1D4CE,
},
- [0x1D66F]={
+ [0x1D4CF]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x7A },
- unicodeslot=0x1D66F,
+ unicodeslot=0x1D4CF,
},
- [0x1D670]={
+ [0x1D4D0]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x41 },
- unicodeslot=0x1D670,
+ unicodeslot=0x1D4D0,
},
- [0x1D671]={
+ [0x1D4D1]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x42 },
- unicodeslot=0x1D671,
+ unicodeslot=0x1D4D1,
},
- [0x1D672]={
+ [0x1D4D2]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x43 },
- unicodeslot=0x1D672,
+ unicodeslot=0x1D4D2,
},
- [0x1D673]={
+ [0x1D4D3]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x44 },
- unicodeslot=0x1D673,
+ unicodeslot=0x1D4D3,
},
- [0x1D674]={
+ [0x1D4D4]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x45 },
- unicodeslot=0x1D674,
+ unicodeslot=0x1D4D4,
},
- [0x1D675]={
+ [0x1D4D5]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x46 },
- unicodeslot=0x1D675,
+ unicodeslot=0x1D4D5,
},
- [0x1D676]={
+ [0x1D4D6]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x47 },
- unicodeslot=0x1D676,
+ unicodeslot=0x1D4D6,
},
- [0x1D677]={
+ [0x1D4D7]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x48 },
- unicodeslot=0x1D677,
+ unicodeslot=0x1D4D7,
},
- [0x1D678]={
+ [0x1D4D8]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x49 },
- unicodeslot=0x1D678,
+ unicodeslot=0x1D4D8,
},
- [0x1D679]={
+ [0x1D4D9]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4A },
- unicodeslot=0x1D679,
+ unicodeslot=0x1D4D9,
},
- [0x1D67A]={
+ [0x1D4DA]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4B },
- unicodeslot=0x1D67A,
+ unicodeslot=0x1D4DA,
},
- [0x1D67B]={
+ [0x1D4DB]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4C },
- unicodeslot=0x1D67B,
+ unicodeslot=0x1D4DB,
},
- [0x1D67C]={
+ [0x1D4DC]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4D },
- unicodeslot=0x1D67C,
+ unicodeslot=0x1D4DC,
},
- [0x1D67D]={
+ [0x1D4DD]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4E },
- unicodeslot=0x1D67D,
+ unicodeslot=0x1D4DD,
},
- [0x1D67E]={
+ [0x1D4DE]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x4F },
- unicodeslot=0x1D67E,
+ unicodeslot=0x1D4DE,
},
- [0x1D67F]={
+ [0x1D4DF]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x50 },
- unicodeslot=0x1D67F,
+ unicodeslot=0x1D4DF,
},
- [0x1D680]={
+ [0x1D4E0]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x51 },
- unicodeslot=0x1D680,
+ unicodeslot=0x1D4E0,
},
- [0x1D681]={
+ [0x1D4E1]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x52 },
- unicodeslot=0x1D681,
+ unicodeslot=0x1D4E1,
},
- [0x1D682]={
+ [0x1D4E2]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x53 },
- unicodeslot=0x1D682,
+ unicodeslot=0x1D4E2,
},
- [0x1D683]={
+ [0x1D4E3]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x54 },
- unicodeslot=0x1D683,
+ unicodeslot=0x1D4E3,
},
- [0x1D684]={
+ [0x1D4E4]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x55 },
- unicodeslot=0x1D684,
+ unicodeslot=0x1D4E4,
},
- [0x1D685]={
+ [0x1D4E5]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x56 },
- unicodeslot=0x1D685,
+ unicodeslot=0x1D4E5,
},
- [0x1D686]={
+ [0x1D4E6]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x57 },
- unicodeslot=0x1D686,
+ unicodeslot=0x1D4E6,
},
- [0x1D687]={
+ [0x1D4E7]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x58 },
- unicodeslot=0x1D687,
+ unicodeslot=0x1D4E7,
},
- [0x1D688]={
+ [0x1D4E8]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x59 },
- unicodeslot=0x1D688,
+ unicodeslot=0x1D4E8,
},
- [0x1D689]={
+ [0x1D4E9]={
category="lu",
direction="l",
linebreak="al",
specials={ "font", 0x5A },
- unicodeslot=0x1D689,
+ unicodeslot=0x1D4E9,
},
- [0x1D68A]={
+ [0x1D4EA]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x61 },
- unicodeslot=0x1D68A,
+ unicodeslot=0x1D4EA,
},
- [0x1D68B]={
+ [0x1D4EB]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x62 },
- unicodeslot=0x1D68B,
+ unicodeslot=0x1D4EB,
},
- [0x1D68C]={
+ [0x1D4EC]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x63 },
- unicodeslot=0x1D68C,
+ unicodeslot=0x1D4EC,
},
- [0x1D68D]={
+ [0x1D4ED]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x64 },
- unicodeslot=0x1D68D,
+ unicodeslot=0x1D4ED,
},
- [0x1D68E]={
+ [0x1D4EE]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x65 },
- unicodeslot=0x1D68E,
+ unicodeslot=0x1D4EE,
},
- [0x1D68F]={
+ [0x1D4EF]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x66 },
- unicodeslot=0x1D68F,
+ unicodeslot=0x1D4EF,
},
- [0x1D690]={
+ [0x1D4F0]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x67 },
- unicodeslot=0x1D690,
+ unicodeslot=0x1D4F0,
},
- [0x1D691]={
+ [0x1D4F1]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x68 },
- unicodeslot=0x1D691,
+ unicodeslot=0x1D4F1,
},
- [0x1D692]={
+ [0x1D4F2]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x69 },
- unicodeslot=0x1D692,
+ unicodeslot=0x1D4F2,
},
- [0x1D693]={
+ [0x1D4F3]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6A },
- unicodeslot=0x1D693,
+ unicodeslot=0x1D4F3,
},
- [0x1D694]={
+ [0x1D4F4]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6B },
- unicodeslot=0x1D694,
+ unicodeslot=0x1D4F4,
},
- [0x1D695]={
+ [0x1D4F5]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6C },
- unicodeslot=0x1D695,
+ unicodeslot=0x1D4F5,
},
- [0x1D696]={
+ [0x1D4F6]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6D },
- unicodeslot=0x1D696,
+ unicodeslot=0x1D4F6,
},
- [0x1D697]={
+ [0x1D4F7]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6E },
- unicodeslot=0x1D697,
+ unicodeslot=0x1D4F7,
},
- [0x1D698]={
+ [0x1D4F8]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x6F },
- unicodeslot=0x1D698,
+ unicodeslot=0x1D4F8,
},
- [0x1D699]={
+ [0x1D4F9]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x70 },
- unicodeslot=0x1D699,
+ unicodeslot=0x1D4F9,
},
- [0x1D69A]={
+ [0x1D4FA]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x71 },
- unicodeslot=0x1D69A,
+ unicodeslot=0x1D4FA,
},
- [0x1D69B]={
+ [0x1D4FB]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x72 },
- unicodeslot=0x1D69B,
+ unicodeslot=0x1D4FB,
},
- [0x1D69C]={
+ [0x1D4FC]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x73 },
- unicodeslot=0x1D69C,
+ unicodeslot=0x1D4FC,
},
- [0x1D69D]={
+ [0x1D4FD]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x74 },
- unicodeslot=0x1D69D,
+ unicodeslot=0x1D4FD,
},
- [0x1D69E]={
+ [0x1D4FE]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x75 },
- unicodeslot=0x1D69E,
+ unicodeslot=0x1D4FE,
},
- [0x1D69F]={
+ [0x1D4FF]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x76 },
- unicodeslot=0x1D69F,
+ unicodeslot=0x1D4FF,
},
- [0x1D6A0]={
+ [0x1D500]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x77 },
- unicodeslot=0x1D6A0,
+ unicodeslot=0x1D500,
},
- [0x1D6A1]={
+ [0x1D501]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x78 },
- unicodeslot=0x1D6A1,
+ unicodeslot=0x1D501,
},
- [0x1D6A2]={
+ [0x1D502]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x79 },
- unicodeslot=0x1D6A2,
+ unicodeslot=0x1D502,
},
- [0x1D6A3]={
+ [0x1D503]={
category="ll",
direction="l",
linebreak="al",
specials={ "font", 0x7A },
- unicodeslot=0x1D6A3,
+ unicodeslot=0x1D503,
},
- [0x1D6A4]={
- category="ll",
+ [0x1D504]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x131 },
- unicodeslot=0x1D6A4,
+ specials={ "font", 0x41 },
+ unicodeslot=0x1D504,
},
- [0x1D6A5]={
- category="ll",
+ [0x1D505]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x237 },
- unicodeslot=0x1D6A5,
+ specials={ "font", 0x42 },
+ unicodeslot=0x1D505,
},
- [0x1D6A8]={
+ [0x1D507]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x391 },
- unicodeslot=0x1D6A8,
+ specials={ "font", 0x44 },
+ unicodeslot=0x1D507,
},
- [0x1D6A9]={
+ [0x1D508]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x392 },
- unicodeslot=0x1D6A9,
+ specials={ "font", 0x45 },
+ unicodeslot=0x1D508,
},
- [0x1D6AA]={
+ [0x1D509]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x393 },
- unicodeslot=0x1D6AA,
+ specials={ "font", 0x46 },
+ unicodeslot=0x1D509,
},
- [0x1D6AB]={
+ [0x1D50A]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x394 },
- unicodeslot=0x1D6AB,
+ specials={ "font", 0x47 },
+ unicodeslot=0x1D50A,
},
- [0x1D6AC]={
+ [0x1D50D]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x395 },
- unicodeslot=0x1D6AC,
+ specials={ "font", 0x4A },
+ unicodeslot=0x1D50D,
},
- [0x1D6AD]={
+ [0x1D50E]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x396 },
- unicodeslot=0x1D6AD,
+ specials={ "font", 0x4B },
+ unicodeslot=0x1D50E,
},
- [0x1D6AE]={
+ [0x1D50F]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x397 },
- unicodeslot=0x1D6AE,
+ specials={ "font", 0x4C },
+ unicodeslot=0x1D50F,
},
- [0x1D6AF]={
+ [0x1D510]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x398 },
- unicodeslot=0x1D6AF,
- },
- [0x1D6B0]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x399 },
- unicodeslot=0x1D6B0,
- },
- [0x1D6B1]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x39A },
- unicodeslot=0x1D6B1,
- },
- [0x1D6B2]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x39B },
- unicodeslot=0x1D6B2,
- },
- [0x1D6B3]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x39C },
- unicodeslot=0x1D6B3,
- },
- [0x1D6B4]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x39D },
- unicodeslot=0x1D6B4,
- },
- [0x1D6B5]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x39E },
- unicodeslot=0x1D6B5,
+ specials={ "font", 0x4D },
+ unicodeslot=0x1D510,
},
- [0x1D6B6]={
+ [0x1D511]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39F },
- unicodeslot=0x1D6B6,
+ specials={ "font", 0x4E },
+ unicodeslot=0x1D511,
},
- [0x1D6B7]={
+ [0x1D512]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A0 },
- unicodeslot=0x1D6B7,
+ specials={ "font", 0x4F },
+ unicodeslot=0x1D512,
},
- [0x1D6B8]={
+ [0x1D513]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A1 },
- unicodeslot=0x1D6B8,
+ specials={ "font", 0x50 },
+ unicodeslot=0x1D513,
},
- [0x1D6B9]={
+ [0x1D514]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3F4 },
- unicodeslot=0x1D6B9,
+ specials={ "font", 0x51 },
+ unicodeslot=0x1D514,
},
- [0x1D6BA]={
+ [0x1D516]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A3 },
- unicodeslot=0x1D6BA,
+ specials={ "font", 0x53 },
+ unicodeslot=0x1D516,
},
- [0x1D6BB]={
+ [0x1D517]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A4 },
- unicodeslot=0x1D6BB,
+ specials={ "font", 0x54 },
+ unicodeslot=0x1D517,
},
- [0x1D6BC]={
+ [0x1D518]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A5 },
- unicodeslot=0x1D6BC,
+ specials={ "font", 0x55 },
+ unicodeslot=0x1D518,
},
- [0x1D6BD]={
+ [0x1D519]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A6 },
- unicodeslot=0x1D6BD,
+ specials={ "font", 0x56 },
+ unicodeslot=0x1D519,
},
- [0x1D6BE]={
+ [0x1D51A]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A7 },
- unicodeslot=0x1D6BE,
+ specials={ "font", 0x57 },
+ unicodeslot=0x1D51A,
},
- [0x1D6BF]={
+ [0x1D51B]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A8 },
- unicodeslot=0x1D6BF,
+ specials={ "font", 0x58 },
+ unicodeslot=0x1D51B,
},
- [0x1D6C0]={
+ [0x1D51C]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A9 },
- unicodeslot=0x1D6C0,
- },
- [0x1D6C1]={
- category="sm",
- direction="l",
- linebreak="al",
- specials={ "font", 0x2207 },
- unicodeslot=0x1D6C1,
- },
- [0x1D6C2]={
- category="ll",
- direction="l",
- linebreak="al",
- specials={ "font", 0x3B1 },
- unicodeslot=0x1D6C2,
- },
- [0x1D6C3]={
- category="ll",
- direction="l",
- linebreak="al",
- specials={ "font", 0x3B2 },
- unicodeslot=0x1D6C3,
- },
- [0x1D6C4]={
- category="ll",
- direction="l",
- linebreak="al",
- specials={ "font", 0x3B3 },
- unicodeslot=0x1D6C4,
- },
- [0x1D6C5]={
- category="ll",
- direction="l",
- linebreak="al",
- specials={ "font", 0x3B4 },
- unicodeslot=0x1D6C5,
- },
- [0x1D6C6]={
- category="ll",
- direction="l",
- linebreak="al",
- specials={ "font", 0x3B5 },
- unicodeslot=0x1D6C6,
+ specials={ "font", 0x59 },
+ unicodeslot=0x1D51C,
},
- [0x1D6C7]={
+ [0x1D51E]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B6 },
- unicodeslot=0x1D6C7,
+ specials={ "font", 0x61 },
+ unicodeslot=0x1D51E,
},
- [0x1D6C8]={
+ [0x1D51F]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B7 },
- unicodeslot=0x1D6C8,
+ specials={ "font", 0x62 },
+ unicodeslot=0x1D51F,
},
- [0x1D6C9]={
+ [0x1D520]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B8 },
- unicodeslot=0x1D6C9,
+ specials={ "font", 0x63 },
+ unicodeslot=0x1D520,
},
- [0x1D6CA]={
+ [0x1D521]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B9 },
- unicodeslot=0x1D6CA,
+ specials={ "font", 0x64 },
+ unicodeslot=0x1D521,
},
- [0x1D6CB]={
+ [0x1D522]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BA },
- unicodeslot=0x1D6CB,
+ specials={ "font", 0x65 },
+ unicodeslot=0x1D522,
},
- [0x1D6CC]={
+ [0x1D523]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BB },
- unicodeslot=0x1D6CC,
+ specials={ "font", 0x66 },
+ unicodeslot=0x1D523,
},
- [0x1D6CD]={
+ [0x1D524]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BC },
- unicodeslot=0x1D6CD,
+ specials={ "font", 0x67 },
+ unicodeslot=0x1D524,
},
- [0x1D6CE]={
+ [0x1D525]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BD },
- unicodeslot=0x1D6CE,
+ specials={ "font", 0x68 },
+ unicodeslot=0x1D525,
},
- [0x1D6CF]={
+ [0x1D526]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BE },
- unicodeslot=0x1D6CF,
+ specials={ "font", 0x69 },
+ unicodeslot=0x1D526,
},
- [0x1D6D0]={
+ [0x1D527]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BF },
- unicodeslot=0x1D6D0,
+ specials={ "font", 0x6A },
+ unicodeslot=0x1D527,
},
- [0x1D6D1]={
+ [0x1D528]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C0 },
- unicodeslot=0x1D6D1,
+ specials={ "font", 0x6B },
+ unicodeslot=0x1D528,
},
- [0x1D6D2]={
+ [0x1D529]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C1 },
- unicodeslot=0x1D6D2,
+ specials={ "font", 0x6C },
+ unicodeslot=0x1D529,
},
- [0x1D6D3]={
+ [0x1D52A]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C2 },
- unicodeslot=0x1D6D3,
+ specials={ "font", 0x6D },
+ unicodeslot=0x1D52A,
},
- [0x1D6D4]={
+ [0x1D52B]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C3 },
- unicodeslot=0x1D6D4,
+ specials={ "font", 0x6E },
+ unicodeslot=0x1D52B,
},
- [0x1D6D5]={
+ [0x1D52C]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C4 },
- unicodeslot=0x1D6D5,
+ specials={ "font", 0x6F },
+ unicodeslot=0x1D52C,
},
- [0x1D6D6]={
+ [0x1D52D]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C5 },
- unicodeslot=0x1D6D6,
+ specials={ "font", 0x70 },
+ unicodeslot=0x1D52D,
},
- [0x1D6D7]={
+ [0x1D52E]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C6 },
- unicodeslot=0x1D6D7,
+ specials={ "font", 0x71 },
+ unicodeslot=0x1D52E,
},
- [0x1D6D8]={
+ [0x1D52F]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C7 },
- unicodeslot=0x1D6D8,
+ specials={ "font", 0x72 },
+ unicodeslot=0x1D52F,
},
- [0x1D6D9]={
+ [0x1D530]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C8 },
- unicodeslot=0x1D6D9,
+ specials={ "font", 0x73 },
+ unicodeslot=0x1D530,
},
- [0x1D6DA]={
+ [0x1D531]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C9 },
- unicodeslot=0x1D6DA,
- },
- [0x1D6DB]={
- category="sm",
- direction="on",
- linebreak="al",
- specials={ "font", 0x2202 },
- unicodeslot=0x1D6DB,
+ specials={ "font", 0x74 },
+ unicodeslot=0x1D531,
},
- [0x1D6DC]={
+ [0x1D532]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3F5 },
- unicodeslot=0x1D6DC,
+ specials={ "font", 0x75 },
+ unicodeslot=0x1D532,
},
- [0x1D6DD]={
+ [0x1D533]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3D1 },
- unicodeslot=0x1D6DD,
+ specials={ "font", 0x76 },
+ unicodeslot=0x1D533,
},
- [0x1D6DE]={
+ [0x1D534]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3F0 },
- unicodeslot=0x1D6DE,
+ specials={ "font", 0x77 },
+ unicodeslot=0x1D534,
},
- [0x1D6DF]={
+ [0x1D535]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3D5 },
- unicodeslot=0x1D6DF,
+ specials={ "font", 0x78 },
+ unicodeslot=0x1D535,
},
- [0x1D6E0]={
+ [0x1D536]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3F1 },
- unicodeslot=0x1D6E0,
+ specials={ "font", 0x79 },
+ unicodeslot=0x1D536,
},
- [0x1D6E1]={
+ [0x1D537]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3D6 },
- unicodeslot=0x1D6E1,
- },
- [0x1D6E2]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x391 },
- unicodeslot=0x1D6E2,
- },
- [0x1D6E3]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x392 },
- unicodeslot=0x1D6E3,
- },
- [0x1D6E4]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x393 },
- unicodeslot=0x1D6E4,
- },
- [0x1D6E5]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x394 },
- unicodeslot=0x1D6E5,
- },
- [0x1D6E6]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x395 },
- unicodeslot=0x1D6E6,
- },
- [0x1D6E7]={
- category="lu",
- direction="l",
- linebreak="al",
- specials={ "font", 0x396 },
- unicodeslot=0x1D6E7,
+ specials={ "font", 0x7A },
+ unicodeslot=0x1D537,
},
- [0x1D6E8]={
+ [0x1D538]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x397 },
- unicodeslot=0x1D6E8,
+ specials={ "font", 0x41 },
+ unicodeslot=0x1D538,
},
- [0x1D6E9]={
+ [0x1D539]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x398 },
- unicodeslot=0x1D6E9,
+ specials={ "font", 0x42 },
+ unicodeslot=0x1D539,
},
- [0x1D6EA]={
+ [0x1D53B]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x399 },
- unicodeslot=0x1D6EA,
+ specials={ "font", 0x44 },
+ unicodeslot=0x1D53B,
},
- [0x1D6EB]={
+ [0x1D53C]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39A },
- unicodeslot=0x1D6EB,
+ specials={ "font", 0x45 },
+ unicodeslot=0x1D53C,
},
- [0x1D6EC]={
+ [0x1D53D]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39B },
- unicodeslot=0x1D6EC,
+ specials={ "font", 0x46 },
+ unicodeslot=0x1D53D,
},
- [0x1D6ED]={
+ [0x1D53E]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39C },
- unicodeslot=0x1D6ED,
+ specials={ "font", 0x47 },
+ unicodeslot=0x1D53E,
},
- [0x1D6EE]={
+ [0x1D540]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39D },
- unicodeslot=0x1D6EE,
+ specials={ "font", 0x49 },
+ unicodeslot=0x1D540,
},
- [0x1D6EF]={
+ [0x1D541]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39E },
- unicodeslot=0x1D6EF,
+ specials={ "font", 0x4A },
+ unicodeslot=0x1D541,
},
- [0x1D6F0]={
+ [0x1D542]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39F },
- unicodeslot=0x1D6F0,
+ specials={ "font", 0x4B },
+ unicodeslot=0x1D542,
},
- [0x1D6F1]={
+ [0x1D543]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A0 },
- unicodeslot=0x1D6F1,
+ specials={ "font", 0x4C },
+ unicodeslot=0x1D543,
},
- [0x1D6F2]={
+ [0x1D544]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A1 },
- unicodeslot=0x1D6F2,
+ specials={ "font", 0x4D },
+ unicodeslot=0x1D544,
},
- [0x1D6F3]={
+ [0x1D546]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3F4 },
- unicodeslot=0x1D6F3,
+ specials={ "font", 0x4F },
+ unicodeslot=0x1D546,
},
- [0x1D6F4]={
+ [0x1D54A]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A3 },
- unicodeslot=0x1D6F4,
+ specials={ "font", 0x53 },
+ unicodeslot=0x1D54A,
},
- [0x1D6F5]={
+ [0x1D54B]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A4 },
- unicodeslot=0x1D6F5,
+ specials={ "font", 0x54 },
+ unicodeslot=0x1D54B,
},
- [0x1D6F6]={
+ [0x1D54C]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A5 },
- unicodeslot=0x1D6F6,
+ specials={ "font", 0x55 },
+ unicodeslot=0x1D54C,
},
- [0x1D6F7]={
+ [0x1D54D]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A6 },
- unicodeslot=0x1D6F7,
+ specials={ "font", 0x56 },
+ unicodeslot=0x1D54D,
},
- [0x1D6F8]={
+ [0x1D54E]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A7 },
- unicodeslot=0x1D6F8,
+ specials={ "font", 0x57 },
+ unicodeslot=0x1D54E,
},
- [0x1D6F9]={
+ [0x1D54F]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A8 },
- unicodeslot=0x1D6F9,
+ specials={ "font", 0x58 },
+ unicodeslot=0x1D54F,
},
- [0x1D6FA]={
+ [0x1D550]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A9 },
- unicodeslot=0x1D6FA,
- },
- [0x1D6FB]={
- category="sm",
- direction="l",
- linebreak="al",
- specials={ "font", 0x2207 },
- unicodeslot=0x1D6FB,
- },
- [0x1D6FC]={
- category="ll",
- direction="l",
- linebreak="al",
- specials={ "font", 0x3B1 },
- unicodeslot=0x1D6FC,
- },
- [0x1D6FD]={
- category="ll",
- direction="l",
- linebreak="al",
- specials={ "font", 0x3B2 },
- unicodeslot=0x1D6FD,
- },
- [0x1D6FE]={
- category="ll",
- direction="l",
- linebreak="al",
- specials={ "font", 0x3B3 },
- unicodeslot=0x1D6FE,
- },
- [0x1D6FF]={
- category="ll",
- direction="l",
- linebreak="al",
- specials={ "font", 0x3B4 },
- unicodeslot=0x1D6FF,
+ specials={ "font", 0x59 },
+ unicodeslot=0x1D550,
},
- [0x1D700]={
+ [0x1D552]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B5 },
- unicodeslot=0x1D700,
+ specials={ "font", 0x61 },
+ unicodeslot=0x1D552,
},
- [0x1D701]={
+ [0x1D553]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B6 },
- unicodeslot=0x1D701,
+ specials={ "font", 0x62 },
+ unicodeslot=0x1D553,
},
- [0x1D702]={
+ [0x1D554]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B7 },
- unicodeslot=0x1D702,
+ specials={ "font", 0x63 },
+ unicodeslot=0x1D554,
},
- [0x1D703]={
+ [0x1D555]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B8 },
- unicodeslot=0x1D703,
+ specials={ "font", 0x64 },
+ unicodeslot=0x1D555,
},
- [0x1D704]={
+ [0x1D556]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B9 },
- unicodeslot=0x1D704,
+ specials={ "font", 0x65 },
+ unicodeslot=0x1D556,
},
- [0x1D705]={
+ [0x1D557]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BA },
- unicodeslot=0x1D705,
+ specials={ "font", 0x66 },
+ unicodeslot=0x1D557,
},
- [0x1D706]={
+ [0x1D558]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BB },
- unicodeslot=0x1D706,
+ specials={ "font", 0x67 },
+ unicodeslot=0x1D558,
},
- [0x1D707]={
+ [0x1D559]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BC },
- unicodeslot=0x1D707,
+ specials={ "font", 0x68 },
+ unicodeslot=0x1D559,
},
- [0x1D708]={
+ [0x1D55A]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BD },
- unicodeslot=0x1D708,
+ specials={ "font", 0x69 },
+ unicodeslot=0x1D55A,
},
- [0x1D709]={
+ [0x1D55B]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BE },
- unicodeslot=0x1D709,
+ specials={ "font", 0x6A },
+ unicodeslot=0x1D55B,
},
- [0x1D70A]={
+ [0x1D55C]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BF },
- unicodeslot=0x1D70A,
+ specials={ "font", 0x6B },
+ unicodeslot=0x1D55C,
},
- [0x1D70B]={
+ [0x1D55D]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C0 },
- unicodeslot=0x1D70B,
+ specials={ "font", 0x6C },
+ unicodeslot=0x1D55D,
},
- [0x1D70C]={
+ [0x1D55E]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C1 },
- unicodeslot=0x1D70C,
+ specials={ "font", 0x6D },
+ unicodeslot=0x1D55E,
},
- [0x1D70D]={
+ [0x1D55F]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C2 },
- unicodeslot=0x1D70D,
+ specials={ "font", 0x6E },
+ unicodeslot=0x1D55F,
},
- [0x1D70E]={
+ [0x1D560]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C3 },
- unicodeslot=0x1D70E,
+ specials={ "font", 0x6F },
+ unicodeslot=0x1D560,
},
- [0x1D70F]={
+ [0x1D561]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C4 },
- unicodeslot=0x1D70F,
+ specials={ "font", 0x70 },
+ unicodeslot=0x1D561,
},
- [0x1D710]={
+ [0x1D562]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C5 },
- unicodeslot=0x1D710,
+ specials={ "font", 0x71 },
+ unicodeslot=0x1D562,
},
- [0x1D711]={
+ [0x1D563]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C6 },
- unicodeslot=0x1D711,
+ specials={ "font", 0x72 },
+ unicodeslot=0x1D563,
},
- [0x1D712]={
+ [0x1D564]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C7 },
- unicodeslot=0x1D712,
+ specials={ "font", 0x73 },
+ unicodeslot=0x1D564,
},
- [0x1D713]={
+ [0x1D565]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C8 },
- unicodeslot=0x1D713,
+ specials={ "font", 0x74 },
+ unicodeslot=0x1D565,
},
- [0x1D714]={
+ [0x1D566]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C9 },
- unicodeslot=0x1D714,
- },
- [0x1D715]={
- category="sm",
- direction="on",
- linebreak="al",
- specials={ "font", 0x2202 },
- unicodeslot=0x1D715,
+ specials={ "font", 0x75 },
+ unicodeslot=0x1D566,
},
- [0x1D716]={
+ [0x1D567]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3F5 },
- unicodeslot=0x1D716,
+ specials={ "font", 0x76 },
+ unicodeslot=0x1D567,
},
- [0x1D717]={
+ [0x1D568]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3D1 },
- unicodeslot=0x1D717,
+ specials={ "font", 0x77 },
+ unicodeslot=0x1D568,
},
- [0x1D718]={
+ [0x1D569]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3F0 },
- unicodeslot=0x1D718,
+ specials={ "font", 0x78 },
+ unicodeslot=0x1D569,
},
- [0x1D719]={
+ [0x1D56A]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3D5 },
- unicodeslot=0x1D719,
+ specials={ "font", 0x79 },
+ unicodeslot=0x1D56A,
},
- [0x1D71A]={
+ [0x1D56B]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3F1 },
- unicodeslot=0x1D71A,
+ specials={ "font", 0x7A },
+ unicodeslot=0x1D56B,
},
- [0x1D71B]={
- category="ll",
+ [0x1D56C]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3D6 },
- unicodeslot=0x1D71B,
+ specials={ "font", 0x41 },
+ unicodeslot=0x1D56C,
},
- [0x1D71C]={
+ [0x1D56D]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x391 },
- unicodeslot=0x1D71C,
+ specials={ "font", 0x42 },
+ unicodeslot=0x1D56D,
},
- [0x1D71D]={
+ [0x1D56E]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x392 },
- unicodeslot=0x1D71D,
+ specials={ "font", 0x43 },
+ unicodeslot=0x1D56E,
},
- [0x1D71E]={
+ [0x1D56F]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x393 },
- unicodeslot=0x1D71E,
+ specials={ "font", 0x44 },
+ unicodeslot=0x1D56F,
},
- [0x1D71F]={
+ [0x1D570]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x394 },
- unicodeslot=0x1D71F,
+ specials={ "font", 0x45 },
+ unicodeslot=0x1D570,
},
- [0x1D720]={
+ [0x1D571]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x395 },
- unicodeslot=0x1D720,
+ specials={ "font", 0x46 },
+ unicodeslot=0x1D571,
},
- [0x1D721]={
+ [0x1D572]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x396 },
- unicodeslot=0x1D721,
+ specials={ "font", 0x47 },
+ unicodeslot=0x1D572,
},
- [0x1D722]={
+ [0x1D573]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x397 },
- unicodeslot=0x1D722,
+ specials={ "font", 0x48 },
+ unicodeslot=0x1D573,
},
- [0x1D723]={
+ [0x1D574]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x398 },
- unicodeslot=0x1D723,
+ specials={ "font", 0x49 },
+ unicodeslot=0x1D574,
},
- [0x1D724]={
+ [0x1D575]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x399 },
- unicodeslot=0x1D724,
+ specials={ "font", 0x4A },
+ unicodeslot=0x1D575,
},
- [0x1D725]={
+ [0x1D576]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39A },
- unicodeslot=0x1D725,
+ specials={ "font", 0x4B },
+ unicodeslot=0x1D576,
},
- [0x1D726]={
+ [0x1D577]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39B },
- unicodeslot=0x1D726,
+ specials={ "font", 0x4C },
+ unicodeslot=0x1D577,
},
- [0x1D727]={
+ [0x1D578]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39C },
- unicodeslot=0x1D727,
+ specials={ "font", 0x4D },
+ unicodeslot=0x1D578,
},
- [0x1D728]={
+ [0x1D579]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39D },
- unicodeslot=0x1D728,
+ specials={ "font", 0x4E },
+ unicodeslot=0x1D579,
},
- [0x1D729]={
+ [0x1D57A]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39E },
- unicodeslot=0x1D729,
+ specials={ "font", 0x4F },
+ unicodeslot=0x1D57A,
},
- [0x1D72A]={
+ [0x1D57B]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39F },
- unicodeslot=0x1D72A,
+ specials={ "font", 0x50 },
+ unicodeslot=0x1D57B,
},
- [0x1D72B]={
+ [0x1D57C]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A0 },
- unicodeslot=0x1D72B,
+ specials={ "font", 0x51 },
+ unicodeslot=0x1D57C,
},
- [0x1D72C]={
+ [0x1D57D]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A1 },
- unicodeslot=0x1D72C,
+ specials={ "font", 0x52 },
+ unicodeslot=0x1D57D,
},
- [0x1D72D]={
+ [0x1D57E]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3F4 },
- unicodeslot=0x1D72D,
+ specials={ "font", 0x53 },
+ unicodeslot=0x1D57E,
},
- [0x1D72E]={
+ [0x1D57F]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A3 },
- unicodeslot=0x1D72E,
+ specials={ "font", 0x54 },
+ unicodeslot=0x1D57F,
},
- [0x1D72F]={
+ [0x1D580]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A4 },
- unicodeslot=0x1D72F,
+ specials={ "font", 0x55 },
+ unicodeslot=0x1D580,
},
- [0x1D730]={
+ [0x1D581]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A5 },
- unicodeslot=0x1D730,
+ specials={ "font", 0x56 },
+ unicodeslot=0x1D581,
},
- [0x1D731]={
+ [0x1D582]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A6 },
- unicodeslot=0x1D731,
+ specials={ "font", 0x57 },
+ unicodeslot=0x1D582,
},
- [0x1D732]={
+ [0x1D583]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A7 },
- unicodeslot=0x1D732,
+ specials={ "font", 0x58 },
+ unicodeslot=0x1D583,
},
- [0x1D733]={
+ [0x1D584]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A8 },
- unicodeslot=0x1D733,
+ specials={ "font", 0x59 },
+ unicodeslot=0x1D584,
},
- [0x1D734]={
+ [0x1D585]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A9 },
- unicodeslot=0x1D734,
+ specials={ "font", 0x5A },
+ unicodeslot=0x1D585,
},
- [0x1D735]={
- category="sm",
+ [0x1D586]={
+ category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x2207 },
- unicodeslot=0x1D735,
+ specials={ "font", 0x61 },
+ unicodeslot=0x1D586,
},
- [0x1D736]={
+ [0x1D587]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B1 },
- unicodeslot=0x1D736,
+ specials={ "font", 0x62 },
+ unicodeslot=0x1D587,
},
- [0x1D737]={
+ [0x1D588]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B2 },
- unicodeslot=0x1D737,
+ specials={ "font", 0x63 },
+ unicodeslot=0x1D588,
},
- [0x1D738]={
+ [0x1D589]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B3 },
- unicodeslot=0x1D738,
+ specials={ "font", 0x64 },
+ unicodeslot=0x1D589,
},
- [0x1D739]={
+ [0x1D58A]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B4 },
- unicodeslot=0x1D739,
+ specials={ "font", 0x65 },
+ unicodeslot=0x1D58A,
},
- [0x1D73A]={
+ [0x1D58B]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B5 },
- unicodeslot=0x1D73A,
+ specials={ "font", 0x66 },
+ unicodeslot=0x1D58B,
},
- [0x1D73B]={
+ [0x1D58C]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B6 },
- unicodeslot=0x1D73B,
+ specials={ "font", 0x67 },
+ unicodeslot=0x1D58C,
},
- [0x1D73C]={
+ [0x1D58D]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B7 },
- unicodeslot=0x1D73C,
+ specials={ "font", 0x68 },
+ unicodeslot=0x1D58D,
},
- [0x1D73D]={
+ [0x1D58E]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B8 },
- unicodeslot=0x1D73D,
+ specials={ "font", 0x69 },
+ unicodeslot=0x1D58E,
},
- [0x1D73E]={
+ [0x1D58F]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B9 },
- unicodeslot=0x1D73E,
+ specials={ "font", 0x6A },
+ unicodeslot=0x1D58F,
},
- [0x1D73F]={
+ [0x1D590]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BA },
- unicodeslot=0x1D73F,
+ specials={ "font", 0x6B },
+ unicodeslot=0x1D590,
},
- [0x1D740]={
+ [0x1D591]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BB },
- unicodeslot=0x1D740,
+ specials={ "font", 0x6C },
+ unicodeslot=0x1D591,
},
- [0x1D741]={
+ [0x1D592]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BC },
- unicodeslot=0x1D741,
+ specials={ "font", 0x6D },
+ unicodeslot=0x1D592,
},
- [0x1D742]={
+ [0x1D593]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BD },
- unicodeslot=0x1D742,
+ specials={ "font", 0x6E },
+ unicodeslot=0x1D593,
},
- [0x1D743]={
+ [0x1D594]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BE },
- unicodeslot=0x1D743,
+ specials={ "font", 0x6F },
+ unicodeslot=0x1D594,
},
- [0x1D744]={
+ [0x1D595]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BF },
- unicodeslot=0x1D744,
+ specials={ "font", 0x70 },
+ unicodeslot=0x1D595,
},
- [0x1D745]={
+ [0x1D596]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C0 },
- unicodeslot=0x1D745,
+ specials={ "font", 0x71 },
+ unicodeslot=0x1D596,
},
- [0x1D746]={
+ [0x1D597]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C1 },
- unicodeslot=0x1D746,
+ specials={ "font", 0x72 },
+ unicodeslot=0x1D597,
},
- [0x1D747]={
+ [0x1D598]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C2 },
- unicodeslot=0x1D747,
+ specials={ "font", 0x73 },
+ unicodeslot=0x1D598,
},
- [0x1D748]={
+ [0x1D599]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C3 },
- unicodeslot=0x1D748,
+ specials={ "font", 0x74 },
+ unicodeslot=0x1D599,
},
- [0x1D749]={
+ [0x1D59A]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C4 },
- unicodeslot=0x1D749,
+ specials={ "font", 0x75 },
+ unicodeslot=0x1D59A,
},
- [0x1D74A]={
+ [0x1D59B]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C5 },
- unicodeslot=0x1D74A,
+ specials={ "font", 0x76 },
+ unicodeslot=0x1D59B,
},
- [0x1D74B]={
+ [0x1D59C]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C6 },
- unicodeslot=0x1D74B,
+ specials={ "font", 0x77 },
+ unicodeslot=0x1D59C,
},
- [0x1D74C]={
+ [0x1D59D]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C7 },
- unicodeslot=0x1D74C,
+ specials={ "font", 0x78 },
+ unicodeslot=0x1D59D,
},
- [0x1D74D]={
+ [0x1D59E]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C8 },
- unicodeslot=0x1D74D,
+ specials={ "font", 0x79 },
+ unicodeslot=0x1D59E,
},
- [0x1D74E]={
+ [0x1D59F]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C9 },
- unicodeslot=0x1D74E,
- },
- [0x1D74F]={
- category="sm",
- direction="on",
- linebreak="al",
- specials={ "font", 0x2202 },
- unicodeslot=0x1D74F,
+ specials={ "font", 0x7A },
+ unicodeslot=0x1D59F,
},
- [0x1D750]={
- category="ll",
+ [0x1D5A0]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3F5 },
- unicodeslot=0x1D750,
+ specials={ "font", 0x41 },
+ unicodeslot=0x1D5A0,
},
- [0x1D751]={
- category="ll",
+ [0x1D5A1]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3D1 },
- unicodeslot=0x1D751,
+ specials={ "font", 0x42 },
+ unicodeslot=0x1D5A1,
},
- [0x1D752]={
- category="ll",
+ [0x1D5A2]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3F0 },
- unicodeslot=0x1D752,
+ specials={ "font", 0x43 },
+ unicodeslot=0x1D5A2,
},
- [0x1D753]={
- category="ll",
+ [0x1D5A3]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3D5 },
- unicodeslot=0x1D753,
+ specials={ "font", 0x44 },
+ unicodeslot=0x1D5A3,
},
- [0x1D754]={
- category="ll",
+ [0x1D5A4]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3F1 },
- unicodeslot=0x1D754,
+ specials={ "font", 0x45 },
+ unicodeslot=0x1D5A4,
},
- [0x1D755]={
- category="ll",
+ [0x1D5A5]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3D6 },
- unicodeslot=0x1D755,
+ specials={ "font", 0x46 },
+ unicodeslot=0x1D5A5,
},
- [0x1D756]={
+ [0x1D5A6]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x391 },
- unicodeslot=0x1D756,
+ specials={ "font", 0x47 },
+ unicodeslot=0x1D5A6,
},
- [0x1D757]={
+ [0x1D5A7]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x392 },
- unicodeslot=0x1D757,
+ specials={ "font", 0x48 },
+ unicodeslot=0x1D5A7,
},
- [0x1D758]={
+ [0x1D5A8]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x393 },
- unicodeslot=0x1D758,
+ specials={ "font", 0x49 },
+ unicodeslot=0x1D5A8,
},
- [0x1D759]={
+ [0x1D5A9]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x394 },
- unicodeslot=0x1D759,
+ specials={ "font", 0x4A },
+ unicodeslot=0x1D5A9,
},
- [0x1D75A]={
+ [0x1D5AA]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x395 },
- unicodeslot=0x1D75A,
+ specials={ "font", 0x4B },
+ unicodeslot=0x1D5AA,
},
- [0x1D75B]={
+ [0x1D5AB]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x396 },
- unicodeslot=0x1D75B,
+ specials={ "font", 0x4C },
+ unicodeslot=0x1D5AB,
},
- [0x1D75C]={
+ [0x1D5AC]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x397 },
- unicodeslot=0x1D75C,
+ specials={ "font", 0x4D },
+ unicodeslot=0x1D5AC,
},
- [0x1D75D]={
+ [0x1D5AD]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x398 },
- unicodeslot=0x1D75D,
+ specials={ "font", 0x4E },
+ unicodeslot=0x1D5AD,
},
- [0x1D75E]={
+ [0x1D5AE]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x399 },
- unicodeslot=0x1D75E,
+ specials={ "font", 0x4F },
+ unicodeslot=0x1D5AE,
},
- [0x1D75F]={
+ [0x1D5AF]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39A },
- unicodeslot=0x1D75F,
+ specials={ "font", 0x50 },
+ unicodeslot=0x1D5AF,
},
- [0x1D760]={
+ [0x1D5B0]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39B },
- unicodeslot=0x1D760,
+ specials={ "font", 0x51 },
+ unicodeslot=0x1D5B0,
},
- [0x1D761]={
+ [0x1D5B1]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39C },
- unicodeslot=0x1D761,
+ specials={ "font", 0x52 },
+ unicodeslot=0x1D5B1,
},
- [0x1D762]={
+ [0x1D5B2]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39D },
- unicodeslot=0x1D762,
+ specials={ "font", 0x53 },
+ unicodeslot=0x1D5B2,
},
- [0x1D763]={
+ [0x1D5B3]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39E },
- unicodeslot=0x1D763,
+ specials={ "font", 0x54 },
+ unicodeslot=0x1D5B3,
},
- [0x1D764]={
+ [0x1D5B4]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39F },
- unicodeslot=0x1D764,
+ specials={ "font", 0x55 },
+ unicodeslot=0x1D5B4,
},
- [0x1D765]={
+ [0x1D5B5]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A0 },
- unicodeslot=0x1D765,
+ specials={ "font", 0x56 },
+ unicodeslot=0x1D5B5,
},
- [0x1D766]={
+ [0x1D5B6]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A1 },
- unicodeslot=0x1D766,
+ specials={ "font", 0x57 },
+ unicodeslot=0x1D5B6,
},
- [0x1D767]={
+ [0x1D5B7]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3F4 },
- unicodeslot=0x1D767,
+ specials={ "font", 0x58 },
+ unicodeslot=0x1D5B7,
},
- [0x1D768]={
+ [0x1D5B8]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A3 },
- unicodeslot=0x1D768,
+ specials={ "font", 0x59 },
+ unicodeslot=0x1D5B8,
},
- [0x1D769]={
+ [0x1D5B9]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A4 },
- unicodeslot=0x1D769,
+ specials={ "font", 0x5A },
+ unicodeslot=0x1D5B9,
},
- [0x1D76A]={
- category="lu",
+ [0x1D5BA]={
+ category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3A5 },
- unicodeslot=0x1D76A,
+ specials={ "font", 0x61 },
+ unicodeslot=0x1D5BA,
},
- [0x1D76B]={
- category="lu",
+ [0x1D5BB]={
+ category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3A6 },
- unicodeslot=0x1D76B,
+ specials={ "font", 0x62 },
+ unicodeslot=0x1D5BB,
},
- [0x1D76C]={
- category="lu",
+ [0x1D5BC]={
+ category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3A7 },
- unicodeslot=0x1D76C,
+ specials={ "font", 0x63 },
+ unicodeslot=0x1D5BC,
},
- [0x1D76D]={
- category="lu",
+ [0x1D5BD]={
+ category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3A8 },
- unicodeslot=0x1D76D,
+ specials={ "font", 0x64 },
+ unicodeslot=0x1D5BD,
},
- [0x1D76E]={
- category="lu",
+ [0x1D5BE]={
+ category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3A9 },
- unicodeslot=0x1D76E,
+ specials={ "font", 0x65 },
+ unicodeslot=0x1D5BE,
},
- [0x1D76F]={
- category="sm",
+ [0x1D5BF]={
+ category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x2207 },
- unicodeslot=0x1D76F,
+ specials={ "font", 0x66 },
+ unicodeslot=0x1D5BF,
},
- [0x1D770]={
+ [0x1D5C0]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B1 },
- unicodeslot=0x1D770,
+ specials={ "font", 0x67 },
+ unicodeslot=0x1D5C0,
},
- [0x1D771]={
+ [0x1D5C1]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B2 },
- unicodeslot=0x1D771,
+ specials={ "font", 0x68 },
+ unicodeslot=0x1D5C1,
},
- [0x1D772]={
+ [0x1D5C2]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B3 },
- unicodeslot=0x1D772,
+ specials={ "font", 0x69 },
+ unicodeslot=0x1D5C2,
},
- [0x1D773]={
+ [0x1D5C3]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B4 },
- unicodeslot=0x1D773,
+ specials={ "font", 0x6A },
+ unicodeslot=0x1D5C3,
},
- [0x1D774]={
+ [0x1D5C4]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B5 },
- unicodeslot=0x1D774,
+ specials={ "font", 0x6B },
+ unicodeslot=0x1D5C4,
},
- [0x1D775]={
+ [0x1D5C5]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B6 },
- unicodeslot=0x1D775,
+ specials={ "font", 0x6C },
+ unicodeslot=0x1D5C5,
},
- [0x1D776]={
+ [0x1D5C6]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B7 },
- unicodeslot=0x1D776,
+ specials={ "font", 0x6D },
+ unicodeslot=0x1D5C6,
},
- [0x1D777]={
+ [0x1D5C7]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B8 },
- unicodeslot=0x1D777,
+ specials={ "font", 0x6E },
+ unicodeslot=0x1D5C7,
},
- [0x1D778]={
+ [0x1D5C8]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B9 },
- unicodeslot=0x1D778,
+ specials={ "font", 0x6F },
+ unicodeslot=0x1D5C8,
},
- [0x1D779]={
+ [0x1D5C9]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BA },
- unicodeslot=0x1D779,
+ specials={ "font", 0x70 },
+ unicodeslot=0x1D5C9,
},
- [0x1D77A]={
+ [0x1D5CA]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BB },
- unicodeslot=0x1D77A,
+ specials={ "font", 0x71 },
+ unicodeslot=0x1D5CA,
},
- [0x1D77B]={
+ [0x1D5CB]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BC },
- unicodeslot=0x1D77B,
+ specials={ "font", 0x72 },
+ unicodeslot=0x1D5CB,
},
- [0x1D77C]={
+ [0x1D5CC]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BD },
- unicodeslot=0x1D77C,
+ specials={ "font", 0x73 },
+ unicodeslot=0x1D5CC,
},
- [0x1D77D]={
+ [0x1D5CD]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BE },
- unicodeslot=0x1D77D,
+ specials={ "font", 0x74 },
+ unicodeslot=0x1D5CD,
},
- [0x1D77E]={
+ [0x1D5CE]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BF },
- unicodeslot=0x1D77E,
+ specials={ "font", 0x75 },
+ unicodeslot=0x1D5CE,
},
- [0x1D77F]={
+ [0x1D5CF]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C0 },
- unicodeslot=0x1D77F,
+ specials={ "font", 0x76 },
+ unicodeslot=0x1D5CF,
},
- [0x1D780]={
+ [0x1D5D0]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C1 },
- unicodeslot=0x1D780,
+ specials={ "font", 0x77 },
+ unicodeslot=0x1D5D0,
},
- [0x1D781]={
+ [0x1D5D1]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C2 },
- unicodeslot=0x1D781,
+ specials={ "font", 0x78 },
+ unicodeslot=0x1D5D1,
},
- [0x1D782]={
+ [0x1D5D2]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C3 },
- unicodeslot=0x1D782,
+ specials={ "font", 0x79 },
+ unicodeslot=0x1D5D2,
},
- [0x1D783]={
+ [0x1D5D3]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C4 },
- unicodeslot=0x1D783,
+ specials={ "font", 0x7A },
+ unicodeslot=0x1D5D3,
},
- [0x1D784]={
+ [0x1D5D4]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x41 },
+ unicodeslot=0x1D5D4,
+ },
+ [0x1D5D5]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x42 },
+ unicodeslot=0x1D5D5,
+ },
+ [0x1D5D6]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x43 },
+ unicodeslot=0x1D5D6,
+ },
+ [0x1D5D7]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x44 },
+ unicodeslot=0x1D5D7,
+ },
+ [0x1D5D8]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x45 },
+ unicodeslot=0x1D5D8,
+ },
+ [0x1D5D9]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x46 },
+ unicodeslot=0x1D5D9,
+ },
+ [0x1D5DA]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x47 },
+ unicodeslot=0x1D5DA,
+ },
+ [0x1D5DB]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x48 },
+ unicodeslot=0x1D5DB,
+ },
+ [0x1D5DC]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x49 },
+ unicodeslot=0x1D5DC,
+ },
+ [0x1D5DD]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x4A },
+ unicodeslot=0x1D5DD,
+ },
+ [0x1D5DE]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x4B },
+ unicodeslot=0x1D5DE,
+ },
+ [0x1D5DF]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x4C },
+ unicodeslot=0x1D5DF,
+ },
+ [0x1D5E0]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x4D },
+ unicodeslot=0x1D5E0,
+ },
+ [0x1D5E1]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x4E },
+ unicodeslot=0x1D5E1,
+ },
+ [0x1D5E2]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x4F },
+ unicodeslot=0x1D5E2,
+ },
+ [0x1D5E3]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x50 },
+ unicodeslot=0x1D5E3,
+ },
+ [0x1D5E4]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x51 },
+ unicodeslot=0x1D5E4,
+ },
+ [0x1D5E5]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x52 },
+ unicodeslot=0x1D5E5,
+ },
+ [0x1D5E6]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x53 },
+ unicodeslot=0x1D5E6,
+ },
+ [0x1D5E7]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x54 },
+ unicodeslot=0x1D5E7,
+ },
+ [0x1D5E8]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x55 },
+ unicodeslot=0x1D5E8,
+ },
+ [0x1D5E9]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x56 },
+ unicodeslot=0x1D5E9,
+ },
+ [0x1D5EA]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x57 },
+ unicodeslot=0x1D5EA,
+ },
+ [0x1D5EB]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x58 },
+ unicodeslot=0x1D5EB,
+ },
+ [0x1D5EC]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x59 },
+ unicodeslot=0x1D5EC,
+ },
+ [0x1D5ED]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x5A },
+ unicodeslot=0x1D5ED,
+ },
+ [0x1D5EE]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C5 },
- unicodeslot=0x1D784,
+ specials={ "font", 0x61 },
+ unicodeslot=0x1D5EE,
},
- [0x1D785]={
+ [0x1D5EF]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C6 },
- unicodeslot=0x1D785,
+ specials={ "font", 0x62 },
+ unicodeslot=0x1D5EF,
},
- [0x1D786]={
+ [0x1D5F0]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C7 },
- unicodeslot=0x1D786,
+ specials={ "font", 0x63 },
+ unicodeslot=0x1D5F0,
},
- [0x1D787]={
+ [0x1D5F1]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C8 },
- unicodeslot=0x1D787,
+ specials={ "font", 0x64 },
+ unicodeslot=0x1D5F1,
},
- [0x1D788]={
+ [0x1D5F2]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C9 },
- unicodeslot=0x1D788,
+ specials={ "font", 0x65 },
+ unicodeslot=0x1D5F2,
},
- [0x1D789]={
- category="sm",
- direction="on",
+ [0x1D5F3]={
+ category="ll",
+ direction="l",
linebreak="al",
- specials={ "font", 0x2202 },
- unicodeslot=0x1D789,
+ specials={ "font", 0x66 },
+ unicodeslot=0x1D5F3,
},
- [0x1D78A]={
+ [0x1D5F4]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3F5 },
- unicodeslot=0x1D78A,
+ specials={ "font", 0x67 },
+ unicodeslot=0x1D5F4,
},
- [0x1D78B]={
+ [0x1D5F5]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3D1 },
- unicodeslot=0x1D78B,
+ specials={ "font", 0x68 },
+ unicodeslot=0x1D5F5,
},
- [0x1D78C]={
+ [0x1D5F6]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3F0 },
- unicodeslot=0x1D78C,
+ specials={ "font", 0x69 },
+ unicodeslot=0x1D5F6,
},
- [0x1D78D]={
+ [0x1D5F7]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3D5 },
- unicodeslot=0x1D78D,
+ specials={ "font", 0x6A },
+ unicodeslot=0x1D5F7,
},
- [0x1D78E]={
+ [0x1D5F8]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3F1 },
- unicodeslot=0x1D78E,
+ specials={ "font", 0x6B },
+ unicodeslot=0x1D5F8,
},
- [0x1D78F]={
+ [0x1D5F9]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3D6 },
- unicodeslot=0x1D78F,
+ specials={ "font", 0x6C },
+ unicodeslot=0x1D5F9,
},
- [0x1D790]={
- category="lu",
+ [0x1D5FA]={
+ category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x391 },
- unicodeslot=0x1D790,
+ specials={ "font", 0x6D },
+ unicodeslot=0x1D5FA,
},
- [0x1D791]={
- category="lu",
+ [0x1D5FB]={
+ category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x392 },
- unicodeslot=0x1D791,
+ specials={ "font", 0x6E },
+ unicodeslot=0x1D5FB,
},
- [0x1D792]={
- category="lu",
+ [0x1D5FC]={
+ category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x393 },
- unicodeslot=0x1D792,
+ specials={ "font", 0x6F },
+ unicodeslot=0x1D5FC,
},
- [0x1D793]={
- category="lu",
+ [0x1D5FD]={
+ category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x394 },
- unicodeslot=0x1D793,
+ specials={ "font", 0x70 },
+ unicodeslot=0x1D5FD,
},
- [0x1D794]={
+ [0x1D5FE]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x71 },
+ unicodeslot=0x1D5FE,
+ },
+ [0x1D5FF]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x72 },
+ unicodeslot=0x1D5FF,
+ },
+ [0x1D600]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x73 },
+ unicodeslot=0x1D600,
+ },
+ [0x1D601]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x74 },
+ unicodeslot=0x1D601,
+ },
+ [0x1D602]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x75 },
+ unicodeslot=0x1D602,
+ },
+ [0x1D603]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x76 },
+ unicodeslot=0x1D603,
+ },
+ [0x1D604]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x77 },
+ unicodeslot=0x1D604,
+ },
+ [0x1D605]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x78 },
+ unicodeslot=0x1D605,
+ },
+ [0x1D606]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x79 },
+ unicodeslot=0x1D606,
+ },
+ [0x1D607]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x7A },
+ unicodeslot=0x1D607,
+ },
+ [0x1D608]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x395 },
- unicodeslot=0x1D794,
+ specials={ "font", 0x41 },
+ unicodeslot=0x1D608,
},
- [0x1D795]={
+ [0x1D609]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x396 },
- unicodeslot=0x1D795,
+ specials={ "font", 0x42 },
+ unicodeslot=0x1D609,
},
- [0x1D796]={
+ [0x1D60A]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x397 },
- unicodeslot=0x1D796,
+ specials={ "font", 0x43 },
+ unicodeslot=0x1D60A,
},
- [0x1D797]={
+ [0x1D60B]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x398 },
- unicodeslot=0x1D797,
+ specials={ "font", 0x44 },
+ unicodeslot=0x1D60B,
},
- [0x1D798]={
+ [0x1D60C]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x399 },
- unicodeslot=0x1D798,
+ specials={ "font", 0x45 },
+ unicodeslot=0x1D60C,
},
- [0x1D799]={
+ [0x1D60D]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39A },
- unicodeslot=0x1D799,
+ specials={ "font", 0x46 },
+ unicodeslot=0x1D60D,
},
- [0x1D79A]={
+ [0x1D60E]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39B },
- unicodeslot=0x1D79A,
+ specials={ "font", 0x47 },
+ unicodeslot=0x1D60E,
},
- [0x1D79B]={
+ [0x1D60F]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39C },
- unicodeslot=0x1D79B,
+ specials={ "font", 0x48 },
+ unicodeslot=0x1D60F,
},
- [0x1D79C]={
+ [0x1D610]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39D },
- unicodeslot=0x1D79C,
+ specials={ "font", 0x49 },
+ unicodeslot=0x1D610,
},
- [0x1D79D]={
+ [0x1D611]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39E },
- unicodeslot=0x1D79D,
+ specials={ "font", 0x4A },
+ unicodeslot=0x1D611,
},
- [0x1D79E]={
+ [0x1D612]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x39F },
- unicodeslot=0x1D79E,
+ specials={ "font", 0x4B },
+ unicodeslot=0x1D612,
},
- [0x1D79F]={
+ [0x1D613]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A0 },
- unicodeslot=0x1D79F,
+ specials={ "font", 0x4C },
+ unicodeslot=0x1D613,
},
- [0x1D7A0]={
+ [0x1D614]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A1 },
- unicodeslot=0x1D7A0,
+ specials={ "font", 0x4D },
+ unicodeslot=0x1D614,
},
- [0x1D7A1]={
+ [0x1D615]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3F4 },
- unicodeslot=0x1D7A1,
+ specials={ "font", 0x4E },
+ unicodeslot=0x1D615,
},
- [0x1D7A2]={
+ [0x1D616]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A3 },
- unicodeslot=0x1D7A2,
+ specials={ "font", 0x4F },
+ unicodeslot=0x1D616,
},
- [0x1D7A3]={
+ [0x1D617]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A4 },
- unicodeslot=0x1D7A3,
+ specials={ "font", 0x50 },
+ unicodeslot=0x1D617,
},
- [0x1D7A4]={
+ [0x1D618]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A5 },
- unicodeslot=0x1D7A4,
+ specials={ "font", 0x51 },
+ unicodeslot=0x1D618,
},
- [0x1D7A5]={
+ [0x1D619]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A6 },
- unicodeslot=0x1D7A5,
+ specials={ "font", 0x52 },
+ unicodeslot=0x1D619,
},
- [0x1D7A6]={
+ [0x1D61A]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A7 },
- unicodeslot=0x1D7A6,
+ specials={ "font", 0x53 },
+ unicodeslot=0x1D61A,
},
- [0x1D7A7]={
+ [0x1D61B]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A8 },
- unicodeslot=0x1D7A7,
+ specials={ "font", 0x54 },
+ unicodeslot=0x1D61B,
},
- [0x1D7A8]={
+ [0x1D61C]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3A9 },
- unicodeslot=0x1D7A8,
+ specials={ "font", 0x55 },
+ unicodeslot=0x1D61C,
},
- [0x1D7A9]={
- category="sm",
+ [0x1D61D]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x2207 },
- unicodeslot=0x1D7A9,
+ specials={ "font", 0x56 },
+ unicodeslot=0x1D61D,
},
- [0x1D7AA]={
- category="ll",
+ [0x1D61E]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3B1 },
- unicodeslot=0x1D7AA,
+ specials={ "font", 0x57 },
+ unicodeslot=0x1D61E,
},
- [0x1D7AB]={
- category="ll",
+ [0x1D61F]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3B2 },
- unicodeslot=0x1D7AB,
+ specials={ "font", 0x58 },
+ unicodeslot=0x1D61F,
},
- [0x1D7AC]={
- category="ll",
+ [0x1D620]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3B3 },
- unicodeslot=0x1D7AC,
+ specials={ "font", 0x59 },
+ unicodeslot=0x1D620,
},
- [0x1D7AD]={
- category="ll",
+ [0x1D621]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3B4 },
- unicodeslot=0x1D7AD,
+ specials={ "font", 0x5A },
+ unicodeslot=0x1D621,
},
- [0x1D7AE]={
+ [0x1D622]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B5 },
- unicodeslot=0x1D7AE,
+ specials={ "font", 0x61 },
+ unicodeslot=0x1D622,
},
- [0x1D7AF]={
+ [0x1D623]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B6 },
- unicodeslot=0x1D7AF,
+ specials={ "font", 0x62 },
+ unicodeslot=0x1D623,
},
- [0x1D7B0]={
+ [0x1D624]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B7 },
- unicodeslot=0x1D7B0,
+ specials={ "font", 0x63 },
+ unicodeslot=0x1D624,
},
- [0x1D7B1]={
+ [0x1D625]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B8 },
- unicodeslot=0x1D7B1,
+ specials={ "font", 0x64 },
+ unicodeslot=0x1D625,
},
- [0x1D7B2]={
+ [0x1D626]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3B9 },
- unicodeslot=0x1D7B2,
+ specials={ "font", 0x65 },
+ unicodeslot=0x1D626,
},
- [0x1D7B3]={
+ [0x1D627]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BA },
- unicodeslot=0x1D7B3,
+ specials={ "font", 0x66 },
+ unicodeslot=0x1D627,
},
- [0x1D7B4]={
+ [0x1D628]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BB },
- unicodeslot=0x1D7B4,
+ specials={ "font", 0x67 },
+ unicodeslot=0x1D628,
},
- [0x1D7B5]={
+ [0x1D629]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BC },
- unicodeslot=0x1D7B5,
+ specials={ "font", 0x68 },
+ unicodeslot=0x1D629,
},
- [0x1D7B6]={
+ [0x1D62A]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BD },
- unicodeslot=0x1D7B6,
+ specials={ "font", 0x69 },
+ unicodeslot=0x1D62A,
},
- [0x1D7B7]={
+ [0x1D62B]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BE },
- unicodeslot=0x1D7B7,
+ specials={ "font", 0x6A },
+ unicodeslot=0x1D62B,
},
- [0x1D7B8]={
+ [0x1D62C]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3BF },
- unicodeslot=0x1D7B8,
+ specials={ "font", 0x6B },
+ unicodeslot=0x1D62C,
},
- [0x1D7B9]={
+ [0x1D62D]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C0 },
- unicodeslot=0x1D7B9,
+ specials={ "font", 0x6C },
+ unicodeslot=0x1D62D,
},
- [0x1D7BA]={
+ [0x1D62E]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C1 },
- unicodeslot=0x1D7BA,
+ specials={ "font", 0x6D },
+ unicodeslot=0x1D62E,
},
- [0x1D7BB]={
+ [0x1D62F]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C2 },
- unicodeslot=0x1D7BB,
+ specials={ "font", 0x6E },
+ unicodeslot=0x1D62F,
},
- [0x1D7BC]={
+ [0x1D630]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C3 },
- unicodeslot=0x1D7BC,
+ specials={ "font", 0x6F },
+ unicodeslot=0x1D630,
},
- [0x1D7BD]={
+ [0x1D631]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C4 },
- unicodeslot=0x1D7BD,
+ specials={ "font", 0x70 },
+ unicodeslot=0x1D631,
},
- [0x1D7BE]={
+ [0x1D632]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C5 },
- unicodeslot=0x1D7BE,
+ specials={ "font", 0x71 },
+ unicodeslot=0x1D632,
},
- [0x1D7BF]={
+ [0x1D633]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C6 },
- unicodeslot=0x1D7BF,
+ specials={ "font", 0x72 },
+ unicodeslot=0x1D633,
},
- [0x1D7C0]={
+ [0x1D634]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C7 },
- unicodeslot=0x1D7C0,
+ specials={ "font", 0x73 },
+ unicodeslot=0x1D634,
},
- [0x1D7C1]={
+ [0x1D635]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C8 },
- unicodeslot=0x1D7C1,
+ specials={ "font", 0x74 },
+ unicodeslot=0x1D635,
},
- [0x1D7C2]={
+ [0x1D636]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3C9 },
- unicodeslot=0x1D7C2,
+ specials={ "font", 0x75 },
+ unicodeslot=0x1D636,
},
- [0x1D7C3]={
- category="sm",
- direction="on",
+ [0x1D637]={
+ category="ll",
+ direction="l",
linebreak="al",
- specials={ "font", 0x2202 },
- unicodeslot=0x1D7C3,
+ specials={ "font", 0x76 },
+ unicodeslot=0x1D637,
},
- [0x1D7C4]={
+ [0x1D638]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3F5 },
- unicodeslot=0x1D7C4,
+ specials={ "font", 0x77 },
+ unicodeslot=0x1D638,
},
- [0x1D7C5]={
+ [0x1D639]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3D1 },
- unicodeslot=0x1D7C5,
+ specials={ "font", 0x78 },
+ unicodeslot=0x1D639,
},
- [0x1D7C6]={
+ [0x1D63A]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3F0 },
- unicodeslot=0x1D7C6,
+ specials={ "font", 0x79 },
+ unicodeslot=0x1D63A,
},
- [0x1D7C7]={
+ [0x1D63B]={
category="ll",
direction="l",
linebreak="al",
- specials={ "font", 0x3D5 },
- unicodeslot=0x1D7C7,
+ specials={ "font", 0x7A },
+ unicodeslot=0x1D63B,
},
- [0x1D7C8]={
- category="ll",
+ [0x1D63C]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3F1 },
- unicodeslot=0x1D7C8,
+ specials={ "font", 0x41 },
+ unicodeslot=0x1D63C,
},
- [0x1D7C9]={
- category="ll",
+ [0x1D63D]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3D6 },
- unicodeslot=0x1D7C9,
+ specials={ "font", 0x42 },
+ unicodeslot=0x1D63D,
},
- [0x1D7CA]={
+ [0x1D63E]={
category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3DC },
- unicodeslot=0x1D7CA,
+ specials={ "font", 0x43 },
+ unicodeslot=0x1D63E,
},
- [0x1D7CB]={
- category="ll",
+ [0x1D63F]={
+ category="lu",
direction="l",
linebreak="al",
- specials={ "font", 0x3DD },
- unicodeslot=0x1D7CB,
+ specials={ "font", 0x44 },
+ unicodeslot=0x1D63F,
},
- [0x1D7CE]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x30 },
- unicodeslot=0x1D7CE,
- },
- [0x1D7CF]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x31 },
- unicodeslot=0x1D7CF,
- },
- [0x1D7D0]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x32 },
- unicodeslot=0x1D7D0,
- },
- [0x1D7D1]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x33 },
- unicodeslot=0x1D7D1,
- },
- [0x1D7D2]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x34 },
- unicodeslot=0x1D7D2,
- },
- [0x1D7D3]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x35 },
- unicodeslot=0x1D7D3,
- },
- [0x1D7D4]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x36 },
- unicodeslot=0x1D7D4,
- },
- [0x1D7D5]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x37 },
- unicodeslot=0x1D7D5,
- },
- [0x1D7D6]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x38 },
- unicodeslot=0x1D7D6,
- },
- [0x1D7D7]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x39 },
- unicodeslot=0x1D7D7,
- },
- [0x1D7D8]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x30 },
- unicodeslot=0x1D7D8,
- },
- [0x1D7D9]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x31 },
- unicodeslot=0x1D7D9,
- },
- [0x1D7DA]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x32 },
- unicodeslot=0x1D7DA,
- },
- [0x1D7DB]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x33 },
- unicodeslot=0x1D7DB,
- },
- [0x1D7DC]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x34 },
- unicodeslot=0x1D7DC,
- },
- [0x1D7DD]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x35 },
- unicodeslot=0x1D7DD,
- },
- [0x1D7DE]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x36 },
- unicodeslot=0x1D7DE,
- },
- [0x1D7DF]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x37 },
- unicodeslot=0x1D7DF,
- },
- [0x1D7E0]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x38 },
- unicodeslot=0x1D7E0,
- },
- [0x1D7E1]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x39 },
- unicodeslot=0x1D7E1,
- },
- [0x1D7E2]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x30 },
- unicodeslot=0x1D7E2,
- },
- [0x1D7E3]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x31 },
- unicodeslot=0x1D7E3,
- },
- [0x1D7E4]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x32 },
- unicodeslot=0x1D7E4,
- },
- [0x1D7E5]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x33 },
- unicodeslot=0x1D7E5,
- },
- [0x1D7E6]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x34 },
- unicodeslot=0x1D7E6,
- },
- [0x1D7E7]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x35 },
- unicodeslot=0x1D7E7,
- },
- [0x1D7E8]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x36 },
- unicodeslot=0x1D7E8,
- },
- [0x1D7E9]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x37 },
- unicodeslot=0x1D7E9,
- },
- [0x1D7EA]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x38 },
- unicodeslot=0x1D7EA,
- },
- [0x1D7EB]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x39 },
- unicodeslot=0x1D7EB,
- },
- [0x1D7EC]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x30 },
- unicodeslot=0x1D7EC,
- },
- [0x1D7ED]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x31 },
- unicodeslot=0x1D7ED,
- },
- [0x1D7EE]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x32 },
- unicodeslot=0x1D7EE,
- },
- [0x1D7EF]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x33 },
- unicodeslot=0x1D7EF,
- },
- [0x1D7F0]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x34 },
- unicodeslot=0x1D7F0,
- },
- [0x1D7F1]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x35 },
- unicodeslot=0x1D7F1,
- },
- [0x1D7F2]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x36 },
- unicodeslot=0x1D7F2,
- },
- [0x1D7F3]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x37 },
- unicodeslot=0x1D7F3,
- },
- [0x1D7F4]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x38 },
- unicodeslot=0x1D7F4,
- },
- [0x1D7F5]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x39 },
- unicodeslot=0x1D7F5,
- },
- [0x1D7F6]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x30 },
- unicodeslot=0x1D7F6,
- },
- [0x1D7F7]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x31 },
- unicodeslot=0x1D7F7,
- },
- [0x1D7F8]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x32 },
- unicodeslot=0x1D7F8,
- },
- [0x1D7F9]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x33 },
- unicodeslot=0x1D7F9,
- },
- [0x1D7FA]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x34 },
- unicodeslot=0x1D7FA,
- },
- [0x1D7FB]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x35 },
- unicodeslot=0x1D7FB,
- },
- [0x1D7FC]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x36 },
- unicodeslot=0x1D7FC,
- },
- [0x1D7FD]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x37 },
- unicodeslot=0x1D7FD,
- },
- [0x1D7FE]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x38 },
- unicodeslot=0x1D7FE,
- },
- [0x1D7FF]={
- category="nd",
- direction="en",
- linebreak="nu",
- specials={ "font", 0x39 },
- unicodeslot=0x1D7FF,
- },
- [0x1D800]={
- category="so",
+ [0x1D640]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D800,
+ specials={ "font", 0x45 },
+ unicodeslot=0x1D640,
},
- [0x1D801]={
- category="so",
+ [0x1D641]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D801,
+ specials={ "font", 0x46 },
+ unicodeslot=0x1D641,
},
- [0x1D802]={
- category="so",
+ [0x1D642]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D802,
+ specials={ "font", 0x47 },
+ unicodeslot=0x1D642,
},
- [0x1D803]={
- category="so",
+ [0x1D643]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D803,
+ specials={ "font", 0x48 },
+ unicodeslot=0x1D643,
},
- [0x1D804]={
- category="so",
+ [0x1D644]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D804,
+ specials={ "font", 0x49 },
+ unicodeslot=0x1D644,
},
- [0x1D805]={
- category="so",
+ [0x1D645]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D805,
+ specials={ "font", 0x4A },
+ unicodeslot=0x1D645,
},
- [0x1D806]={
- category="so",
+ [0x1D646]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D806,
+ specials={ "font", 0x4B },
+ unicodeslot=0x1D646,
},
- [0x1D807]={
- category="so",
+ [0x1D647]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D807,
+ specials={ "font", 0x4C },
+ unicodeslot=0x1D647,
},
- [0x1D808]={
- category="so",
+ [0x1D648]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D808,
+ specials={ "font", 0x4D },
+ unicodeslot=0x1D648,
},
- [0x1D809]={
- category="so",
+ [0x1D649]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D809,
+ specials={ "font", 0x4E },
+ unicodeslot=0x1D649,
},
- [0x1D80A]={
- category="so",
+ [0x1D64A]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D80A,
+ specials={ "font", 0x4F },
+ unicodeslot=0x1D64A,
},
- [0x1D80B]={
- category="so",
+ [0x1D64B]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D80B,
+ specials={ "font", 0x50 },
+ unicodeslot=0x1D64B,
},
- [0x1D80C]={
- category="so",
+ [0x1D64C]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D80C,
+ specials={ "font", 0x51 },
+ unicodeslot=0x1D64C,
},
- [0x1D80D]={
- category="so",
+ [0x1D64D]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D80D,
+ specials={ "font", 0x52 },
+ unicodeslot=0x1D64D,
},
- [0x1D80E]={
- category="so",
+ [0x1D64E]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D80E,
+ specials={ "font", 0x53 },
+ unicodeslot=0x1D64E,
},
- [0x1D80F]={
- category="so",
+ [0x1D64F]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D80F,
+ specials={ "font", 0x54 },
+ unicodeslot=0x1D64F,
},
- [0x1D810]={
- category="so",
+ [0x1D650]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D810,
+ specials={ "font", 0x55 },
+ unicodeslot=0x1D650,
},
- [0x1D811]={
- category="so",
+ [0x1D651]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D811,
+ specials={ "font", 0x56 },
+ unicodeslot=0x1D651,
},
- [0x1D812]={
- category="so",
+ [0x1D652]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D812,
+ specials={ "font", 0x57 },
+ unicodeslot=0x1D652,
},
- [0x1D813]={
- category="so",
+ [0x1D653]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D813,
+ specials={ "font", 0x58 },
+ unicodeslot=0x1D653,
},
- [0x1D814]={
- category="so",
+ [0x1D654]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D814,
+ specials={ "font", 0x59 },
+ unicodeslot=0x1D654,
},
- [0x1D815]={
- category="so",
+ [0x1D655]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D815,
+ specials={ "font", 0x5A },
+ unicodeslot=0x1D655,
},
- [0x1D816]={
- category="so",
+ [0x1D656]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D816,
+ specials={ "font", 0x61 },
+ unicodeslot=0x1D656,
},
- [0x1D817]={
- category="so",
+ [0x1D657]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D817,
+ specials={ "font", 0x62 },
+ unicodeslot=0x1D657,
},
- [0x1D818]={
- category="so",
+ [0x1D658]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D818,
+ specials={ "font", 0x63 },
+ unicodeslot=0x1D658,
},
- [0x1D819]={
- category="so",
+ [0x1D659]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D819,
+ specials={ "font", 0x64 },
+ unicodeslot=0x1D659,
},
- [0x1D81A]={
- category="so",
+ [0x1D65A]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D81A,
+ specials={ "font", 0x65 },
+ unicodeslot=0x1D65A,
},
- [0x1D81B]={
- category="so",
+ [0x1D65B]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D81B,
+ specials={ "font", 0x66 },
+ unicodeslot=0x1D65B,
},
- [0x1D81C]={
- category="so",
+ [0x1D65C]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D81C,
+ specials={ "font", 0x67 },
+ unicodeslot=0x1D65C,
},
- [0x1D81D]={
- category="so",
+ [0x1D65D]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D81D,
+ specials={ "font", 0x68 },
+ unicodeslot=0x1D65D,
},
- [0x1D81E]={
- category="so",
+ [0x1D65E]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D81E,
+ specials={ "font", 0x69 },
+ unicodeslot=0x1D65E,
},
- [0x1D81F]={
- category="so",
+ [0x1D65F]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D81F,
+ specials={ "font", 0x6A },
+ unicodeslot=0x1D65F,
},
- [0x1D820]={
- category="so",
+ [0x1D660]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D820,
+ specials={ "font", 0x6B },
+ unicodeslot=0x1D660,
},
- [0x1D821]={
- category="so",
+ [0x1D661]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D821,
+ specials={ "font", 0x6C },
+ unicodeslot=0x1D661,
},
- [0x1D822]={
- category="so",
+ [0x1D662]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D822,
+ specials={ "font", 0x6D },
+ unicodeslot=0x1D662,
},
- [0x1D823]={
- category="so",
+ [0x1D663]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D823,
+ specials={ "font", 0x6E },
+ unicodeslot=0x1D663,
},
- [0x1D824]={
- category="so",
+ [0x1D664]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D824,
+ specials={ "font", 0x6F },
+ unicodeslot=0x1D664,
},
- [0x1D825]={
- category="so",
+ [0x1D665]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D825,
+ specials={ "font", 0x70 },
+ unicodeslot=0x1D665,
},
- [0x1D826]={
- category="so",
+ [0x1D666]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D826,
+ specials={ "font", 0x71 },
+ unicodeslot=0x1D666,
},
- [0x1D827]={
- category="so",
+ [0x1D667]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D827,
+ specials={ "font", 0x72 },
+ unicodeslot=0x1D667,
},
- [0x1D828]={
- category="so",
+ [0x1D668]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D828,
+ specials={ "font", 0x73 },
+ unicodeslot=0x1D668,
},
- [0x1D829]={
- category="so",
+ [0x1D669]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D829,
+ specials={ "font", 0x74 },
+ unicodeslot=0x1D669,
},
- [0x1D82A]={
- category="so",
+ [0x1D66A]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D82A,
+ specials={ "font", 0x75 },
+ unicodeslot=0x1D66A,
},
- [0x1D82B]={
- category="so",
+ [0x1D66B]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D82B,
+ specials={ "font", 0x76 },
+ unicodeslot=0x1D66B,
},
- [0x1D82C]={
- category="so",
+ [0x1D66C]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D82C,
+ specials={ "font", 0x77 },
+ unicodeslot=0x1D66C,
},
- [0x1D82D]={
- category="so",
+ [0x1D66D]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D82D,
+ specials={ "font", 0x78 },
+ unicodeslot=0x1D66D,
},
- [0x1D82E]={
- category="so",
+ [0x1D66E]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D82E,
+ specials={ "font", 0x79 },
+ unicodeslot=0x1D66E,
},
- [0x1D82F]={
- category="so",
+ [0x1D66F]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D82F,
+ specials={ "font", 0x7A },
+ unicodeslot=0x1D66F,
},
- [0x1D830]={
- category="so",
+ [0x1D670]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D830,
+ specials={ "font", 0x41 },
+ unicodeslot=0x1D670,
},
- [0x1D831]={
- category="so",
+ [0x1D671]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D831,
+ specials={ "font", 0x42 },
+ unicodeslot=0x1D671,
},
- [0x1D832]={
- category="so",
+ [0x1D672]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D832,
+ specials={ "font", 0x43 },
+ unicodeslot=0x1D672,
},
- [0x1D833]={
- category="so",
+ [0x1D673]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D833,
+ specials={ "font", 0x44 },
+ unicodeslot=0x1D673,
},
- [0x1D834]={
- category="so",
+ [0x1D674]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D834,
+ specials={ "font", 0x45 },
+ unicodeslot=0x1D674,
},
- [0x1D835]={
- category="so",
+ [0x1D675]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D835,
+ specials={ "font", 0x46 },
+ unicodeslot=0x1D675,
},
- [0x1D836]={
- category="so",
+ [0x1D676]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D836,
+ specials={ "font", 0x47 },
+ unicodeslot=0x1D676,
},
- [0x1D837]={
- category="so",
+ [0x1D677]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D837,
+ specials={ "font", 0x48 },
+ unicodeslot=0x1D677,
},
- [0x1D838]={
- category="so",
+ [0x1D678]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D838,
+ specials={ "font", 0x49 },
+ unicodeslot=0x1D678,
},
- [0x1D839]={
- category="so",
+ [0x1D679]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D839,
+ specials={ "font", 0x4A },
+ unicodeslot=0x1D679,
},
- [0x1D83A]={
- category="so",
+ [0x1D67A]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D83A,
+ specials={ "font", 0x4B },
+ unicodeslot=0x1D67A,
},
- [0x1D83B]={
- category="so",
+ [0x1D67B]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D83B,
+ specials={ "font", 0x4C },
+ unicodeslot=0x1D67B,
},
- [0x1D83C]={
- category="so",
+ [0x1D67C]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D83C,
+ specials={ "font", 0x4D },
+ unicodeslot=0x1D67C,
},
- [0x1D83D]={
- category="so",
+ [0x1D67D]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D83D,
+ specials={ "font", 0x4E },
+ unicodeslot=0x1D67D,
},
- [0x1D83E]={
- category="so",
+ [0x1D67E]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D83E,
+ specials={ "font", 0x4F },
+ unicodeslot=0x1D67E,
},
- [0x1D83F]={
- category="so",
+ [0x1D67F]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D83F,
+ specials={ "font", 0x50 },
+ unicodeslot=0x1D67F,
},
- [0x1D840]={
- category="so",
+ [0x1D680]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D840,
+ specials={ "font", 0x51 },
+ unicodeslot=0x1D680,
},
- [0x1D841]={
- category="so",
+ [0x1D681]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D841,
+ specials={ "font", 0x52 },
+ unicodeslot=0x1D681,
},
- [0x1D842]={
- category="so",
+ [0x1D682]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D842,
+ specials={ "font", 0x53 },
+ unicodeslot=0x1D682,
},
- [0x1D843]={
- category="so",
+ [0x1D683]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D843,
+ specials={ "font", 0x54 },
+ unicodeslot=0x1D683,
},
- [0x1D844]={
- category="so",
+ [0x1D684]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D844,
+ specials={ "font", 0x55 },
+ unicodeslot=0x1D684,
},
- [0x1D845]={
- category="so",
+ [0x1D685]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D845,
+ specials={ "font", 0x56 },
+ unicodeslot=0x1D685,
},
- [0x1D846]={
- category="so",
+ [0x1D686]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D846,
+ specials={ "font", 0x57 },
+ unicodeslot=0x1D686,
},
- [0x1D847]={
- category="so",
+ [0x1D687]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D847,
+ specials={ "font", 0x58 },
+ unicodeslot=0x1D687,
},
- [0x1D848]={
- category="so",
+ [0x1D688]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D848,
+ specials={ "font", 0x59 },
+ unicodeslot=0x1D688,
},
- [0x1D849]={
- category="so",
+ [0x1D689]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D849,
+ specials={ "font", 0x5A },
+ unicodeslot=0x1D689,
},
- [0x1D84A]={
- category="so",
+ [0x1D68A]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D84A,
+ specials={ "font", 0x61 },
+ unicodeslot=0x1D68A,
},
- [0x1D84B]={
- category="so",
+ [0x1D68B]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D84B,
+ specials={ "font", 0x62 },
+ unicodeslot=0x1D68B,
},
- [0x1D84C]={
- category="so",
+ [0x1D68C]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D84C,
+ specials={ "font", 0x63 },
+ unicodeslot=0x1D68C,
},
- [0x1D84D]={
- category="so",
+ [0x1D68D]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D84D,
+ specials={ "font", 0x64 },
+ unicodeslot=0x1D68D,
},
- [0x1D84E]={
- category="so",
+ [0x1D68E]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D84E,
+ specials={ "font", 0x65 },
+ unicodeslot=0x1D68E,
},
- [0x1D84F]={
- category="so",
+ [0x1D68F]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D84F,
+ specials={ "font", 0x66 },
+ unicodeslot=0x1D68F,
},
- [0x1D850]={
- category="so",
+ [0x1D690]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D850,
+ specials={ "font", 0x67 },
+ unicodeslot=0x1D690,
},
- [0x1D851]={
- category="so",
+ [0x1D691]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D851,
+ specials={ "font", 0x68 },
+ unicodeslot=0x1D691,
},
- [0x1D852]={
- category="so",
+ [0x1D692]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D852,
+ specials={ "font", 0x69 },
+ unicodeslot=0x1D692,
},
- [0x1D853]={
- category="so",
+ [0x1D693]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D853,
+ specials={ "font", 0x6A },
+ unicodeslot=0x1D693,
},
- [0x1D854]={
- category="so",
+ [0x1D694]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D854,
+ specials={ "font", 0x6B },
+ unicodeslot=0x1D694,
},
- [0x1D855]={
- category="so",
+ [0x1D695]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D855,
+ specials={ "font", 0x6C },
+ unicodeslot=0x1D695,
},
- [0x1D856]={
- category="so",
+ [0x1D696]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D856,
+ specials={ "font", 0x6D },
+ unicodeslot=0x1D696,
},
- [0x1D857]={
- category="so",
+ [0x1D697]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D857,
+ specials={ "font", 0x6E },
+ unicodeslot=0x1D697,
},
- [0x1D858]={
- category="so",
+ [0x1D698]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D858,
+ specials={ "font", 0x6F },
+ unicodeslot=0x1D698,
},
- [0x1D859]={
- category="so",
+ [0x1D699]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D859,
+ specials={ "font", 0x70 },
+ unicodeslot=0x1D699,
},
- [0x1D85A]={
- category="so",
+ [0x1D69A]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D85A,
+ specials={ "font", 0x71 },
+ unicodeslot=0x1D69A,
},
- [0x1D85B]={
- category="so",
+ [0x1D69B]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D85B,
+ specials={ "font", 0x72 },
+ unicodeslot=0x1D69B,
},
- [0x1D85C]={
- category="so",
+ [0x1D69C]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D85C,
+ specials={ "font", 0x73 },
+ unicodeslot=0x1D69C,
},
- [0x1D85D]={
- category="so",
+ [0x1D69D]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D85D,
+ specials={ "font", 0x74 },
+ unicodeslot=0x1D69D,
},
- [0x1D85E]={
- category="so",
+ [0x1D69E]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D85E,
+ specials={ "font", 0x75 },
+ unicodeslot=0x1D69E,
},
- [0x1D85F]={
- category="so",
+ [0x1D69F]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D85F,
+ specials={ "font", 0x76 },
+ unicodeslot=0x1D69F,
},
- [0x1D860]={
- category="so",
+ [0x1D6A0]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D860,
+ specials={ "font", 0x77 },
+ unicodeslot=0x1D6A0,
},
- [0x1D861]={
- category="so",
+ [0x1D6A1]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D861,
+ specials={ "font", 0x78 },
+ unicodeslot=0x1D6A1,
},
- [0x1D862]={
- category="so",
+ [0x1D6A2]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D862,
+ specials={ "font", 0x79 },
+ unicodeslot=0x1D6A2,
},
- [0x1D863]={
- category="so",
+ [0x1D6A3]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D863,
+ specials={ "font", 0x7A },
+ unicodeslot=0x1D6A3,
},
- [0x1D864]={
- category="so",
+ [0x1D6A4]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D864,
+ specials={ "font", 0x131 },
+ unicodeslot=0x1D6A4,
},
- [0x1D865]={
- category="so",
+ [0x1D6A5]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D865,
+ specials={ "font", 0x237 },
+ unicodeslot=0x1D6A5,
},
- [0x1D866]={
- category="so",
+ [0x1D6A8]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D866,
+ specials={ "font", 0x391 },
+ unicodeslot=0x1D6A8,
},
- [0x1D867]={
- category="so",
+ [0x1D6A9]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D867,
+ specials={ "font", 0x392 },
+ unicodeslot=0x1D6A9,
},
- [0x1D868]={
- category="so",
+ [0x1D6AA]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D868,
+ specials={ "font", 0x393 },
+ unicodeslot=0x1D6AA,
},
- [0x1D869]={
- category="so",
+ [0x1D6AB]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D869,
+ specials={ "font", 0x394 },
+ unicodeslot=0x1D6AB,
},
- [0x1D86A]={
- category="so",
+ [0x1D6AC]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D86A,
+ specials={ "font", 0x395 },
+ unicodeslot=0x1D6AC,
},
- [0x1D86B]={
- category="so",
+ [0x1D6AD]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D86B,
+ specials={ "font", 0x396 },
+ unicodeslot=0x1D6AD,
},
- [0x1D86C]={
- category="so",
+ [0x1D6AE]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D86C,
+ specials={ "font", 0x397 },
+ unicodeslot=0x1D6AE,
},
- [0x1D86D]={
- category="so",
+ [0x1D6AF]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D86D,
+ specials={ "font", 0x398 },
+ unicodeslot=0x1D6AF,
},
- [0x1D86E]={
- category="so",
+ [0x1D6B0]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D86E,
+ specials={ "font", 0x399 },
+ unicodeslot=0x1D6B0,
},
- [0x1D86F]={
- category="so",
+ [0x1D6B1]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D86F,
+ specials={ "font", 0x39A },
+ unicodeslot=0x1D6B1,
},
- [0x1D870]={
- category="so",
+ [0x1D6B2]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D870,
+ specials={ "font", 0x39B },
+ unicodeslot=0x1D6B2,
},
- [0x1D871]={
- category="so",
+ [0x1D6B3]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D871,
+ specials={ "font", 0x39C },
+ unicodeslot=0x1D6B3,
},
- [0x1D872]={
- category="so",
+ [0x1D6B4]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D872,
+ specials={ "font", 0x39D },
+ unicodeslot=0x1D6B4,
},
- [0x1D873]={
- category="so",
+ [0x1D6B5]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D873,
+ specials={ "font", 0x39E },
+ unicodeslot=0x1D6B5,
},
- [0x1D874]={
- category="so",
+ [0x1D6B6]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D874,
+ specials={ "font", 0x39F },
+ unicodeslot=0x1D6B6,
},
- [0x1D875]={
- category="so",
+ [0x1D6B7]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D875,
+ specials={ "font", 0x3A0 },
+ unicodeslot=0x1D6B7,
},
- [0x1D876]={
- category="so",
+ [0x1D6B8]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D876,
+ specials={ "font", 0x3A1 },
+ unicodeslot=0x1D6B8,
},
- [0x1D877]={
- category="so",
+ [0x1D6B9]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D877,
+ specials={ "font", 0x3F4 },
+ unicodeslot=0x1D6B9,
},
- [0x1D878]={
- category="so",
+ [0x1D6BA]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D878,
+ specials={ "font", 0x3A3 },
+ unicodeslot=0x1D6BA,
},
- [0x1D879]={
- category="so",
+ [0x1D6BB]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D879,
+ specials={ "font", 0x3A4 },
+ unicodeslot=0x1D6BB,
},
- [0x1D87A]={
- category="so",
+ [0x1D6BC]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D87A,
+ specials={ "font", 0x3A5 },
+ unicodeslot=0x1D6BC,
},
- [0x1D87B]={
- category="so",
+ [0x1D6BD]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D87B,
+ specials={ "font", 0x3A6 },
+ unicodeslot=0x1D6BD,
},
- [0x1D87C]={
- category="so",
+ [0x1D6BE]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D87C,
+ specials={ "font", 0x3A7 },
+ unicodeslot=0x1D6BE,
},
- [0x1D87D]={
- category="so",
+ [0x1D6BF]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D87D,
+ specials={ "font", 0x3A8 },
+ unicodeslot=0x1D6BF,
},
- [0x1D87E]={
- category="so",
+ [0x1D6C0]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D87E,
+ specials={ "font", 0x3A9 },
+ unicodeslot=0x1D6C0,
},
- [0x1D87F]={
- category="so",
+ [0x1D6C1]={
+ category="sm",
direction="l",
linebreak="al",
- unicodeslot=0x1D87F,
+ specials={ "font", 0x2207 },
+ unicodeslot=0x1D6C1,
},
- [0x1D880]={
- category="so",
+ [0x1D6C2]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D880,
+ specials={ "font", 0x3B1 },
+ unicodeslot=0x1D6C2,
},
- [0x1D881]={
- category="so",
+ [0x1D6C3]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D881,
+ specials={ "font", 0x3B2 },
+ unicodeslot=0x1D6C3,
},
- [0x1D882]={
- category="so",
+ [0x1D6C4]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D882,
+ specials={ "font", 0x3B3 },
+ unicodeslot=0x1D6C4,
},
- [0x1D883]={
- category="so",
+ [0x1D6C5]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D883,
+ specials={ "font", 0x3B4 },
+ unicodeslot=0x1D6C5,
},
- [0x1D884]={
- category="so",
+ [0x1D6C6]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D884,
+ specials={ "font", 0x3B5 },
+ unicodeslot=0x1D6C6,
},
- [0x1D885]={
- category="so",
+ [0x1D6C7]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D885,
+ specials={ "font", 0x3B6 },
+ unicodeslot=0x1D6C7,
},
- [0x1D886]={
- category="so",
+ [0x1D6C8]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D886,
+ specials={ "font", 0x3B7 },
+ unicodeslot=0x1D6C8,
},
- [0x1D887]={
- category="so",
+ [0x1D6C9]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D887,
+ specials={ "font", 0x3B8 },
+ unicodeslot=0x1D6C9,
},
- [0x1D888]={
- category="so",
+ [0x1D6CA]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D888,
+ specials={ "font", 0x3B9 },
+ unicodeslot=0x1D6CA,
},
- [0x1D889]={
- category="so",
+ [0x1D6CB]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D889,
+ specials={ "font", 0x3BA },
+ unicodeslot=0x1D6CB,
},
- [0x1D88A]={
- category="so",
+ [0x1D6CC]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D88A,
+ specials={ "font", 0x3BB },
+ unicodeslot=0x1D6CC,
},
- [0x1D88B]={
- category="so",
+ [0x1D6CD]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D88B,
+ specials={ "font", 0x3BC },
+ unicodeslot=0x1D6CD,
},
- [0x1D88C]={
- category="so",
+ [0x1D6CE]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D88C,
+ specials={ "font", 0x3BD },
+ unicodeslot=0x1D6CE,
},
- [0x1D88D]={
- category="so",
+ [0x1D6CF]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D88D,
+ specials={ "font", 0x3BE },
+ unicodeslot=0x1D6CF,
},
- [0x1D88E]={
- category="so",
+ [0x1D6D0]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D88E,
+ specials={ "font", 0x3BF },
+ unicodeslot=0x1D6D0,
},
- [0x1D88F]={
- category="so",
+ [0x1D6D1]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D88F,
+ specials={ "font", 0x3C0 },
+ unicodeslot=0x1D6D1,
},
- [0x1D890]={
- category="so",
+ [0x1D6D2]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D890,
+ specials={ "font", 0x3C1 },
+ unicodeslot=0x1D6D2,
},
- [0x1D891]={
- category="so",
+ [0x1D6D3]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D891,
+ specials={ "font", 0x3C2 },
+ unicodeslot=0x1D6D3,
},
- [0x1D892]={
- category="so",
+ [0x1D6D4]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D892,
+ specials={ "font", 0x3C3 },
+ unicodeslot=0x1D6D4,
},
- [0x1D893]={
- category="so",
+ [0x1D6D5]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D893,
+ specials={ "font", 0x3C4 },
+ unicodeslot=0x1D6D5,
},
- [0x1D894]={
- category="so",
+ [0x1D6D6]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D894,
+ specials={ "font", 0x3C5 },
+ unicodeslot=0x1D6D6,
},
- [0x1D895]={
- category="so",
+ [0x1D6D7]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D895,
+ specials={ "font", 0x3C6 },
+ unicodeslot=0x1D6D7,
},
- [0x1D896]={
- category="so",
+ [0x1D6D8]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D896,
+ specials={ "font", 0x3C7 },
+ unicodeslot=0x1D6D8,
},
- [0x1D897]={
- category="so",
+ [0x1D6D9]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D897,
+ specials={ "font", 0x3C8 },
+ unicodeslot=0x1D6D9,
},
- [0x1D898]={
- category="so",
+ [0x1D6DA]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D898,
+ specials={ "font", 0x3C9 },
+ unicodeslot=0x1D6DA,
},
- [0x1D899]={
- category="so",
- direction="l",
+ [0x1D6DB]={
+ category="sm",
+ direction="on",
linebreak="al",
- unicodeslot=0x1D899,
+ specials={ "font", 0x2202 },
+ unicodeslot=0x1D6DB,
},
- [0x1D89A]={
- category="so",
+ [0x1D6DC]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D89A,
+ specials={ "font", 0x3F5 },
+ unicodeslot=0x1D6DC,
},
- [0x1D89B]={
- category="so",
+ [0x1D6DD]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D89B,
+ specials={ "font", 0x3D1 },
+ unicodeslot=0x1D6DD,
},
- [0x1D89C]={
- category="so",
+ [0x1D6DE]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D89C,
+ specials={ "font", 0x3F0 },
+ unicodeslot=0x1D6DE,
},
- [0x1D89D]={
- category="so",
+ [0x1D6DF]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D89D,
+ specials={ "font", 0x3D5 },
+ unicodeslot=0x1D6DF,
},
- [0x1D89E]={
- category="so",
+ [0x1D6E0]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D89E,
+ specials={ "font", 0x3F1 },
+ unicodeslot=0x1D6E0,
},
- [0x1D89F]={
- category="so",
+ [0x1D6E1]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D89F,
+ specials={ "font", 0x3D6 },
+ unicodeslot=0x1D6E1,
},
- [0x1D8A0]={
- category="so",
+ [0x1D6E2]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8A0,
+ specials={ "font", 0x391 },
+ unicodeslot=0x1D6E2,
},
- [0x1D8A1]={
- category="so",
+ [0x1D6E3]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8A1,
+ specials={ "font", 0x392 },
+ unicodeslot=0x1D6E3,
},
- [0x1D8A2]={
- category="so",
+ [0x1D6E4]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8A2,
+ specials={ "font", 0x393 },
+ unicodeslot=0x1D6E4,
},
- [0x1D8A3]={
- category="so",
+ [0x1D6E5]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8A3,
+ specials={ "font", 0x394 },
+ unicodeslot=0x1D6E5,
},
- [0x1D8A4]={
- category="so",
+ [0x1D6E6]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8A4,
+ specials={ "font", 0x395 },
+ unicodeslot=0x1D6E6,
},
- [0x1D8A5]={
- category="so",
+ [0x1D6E7]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8A5,
+ specials={ "font", 0x396 },
+ unicodeslot=0x1D6E7,
},
- [0x1D8A6]={
- category="so",
+ [0x1D6E8]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8A6,
+ specials={ "font", 0x397 },
+ unicodeslot=0x1D6E8,
},
- [0x1D8A7]={
- category="so",
+ [0x1D6E9]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8A7,
+ specials={ "font", 0x398 },
+ unicodeslot=0x1D6E9,
},
- [0x1D8A8]={
- category="so",
+ [0x1D6EA]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8A8,
+ specials={ "font", 0x399 },
+ unicodeslot=0x1D6EA,
},
- [0x1D8A9]={
- category="so",
+ [0x1D6EB]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8A9,
+ specials={ "font", 0x39A },
+ unicodeslot=0x1D6EB,
},
- [0x1D8AA]={
- category="so",
+ [0x1D6EC]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8AA,
+ specials={ "font", 0x39B },
+ unicodeslot=0x1D6EC,
},
- [0x1D8AB]={
- category="so",
+ [0x1D6ED]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8AB,
+ specials={ "font", 0x39C },
+ unicodeslot=0x1D6ED,
},
- [0x1D8AC]={
- category="so",
+ [0x1D6EE]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8AC,
+ specials={ "font", 0x39D },
+ unicodeslot=0x1D6EE,
},
- [0x1D8AD]={
- category="so",
+ [0x1D6EF]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8AD,
+ specials={ "font", 0x39E },
+ unicodeslot=0x1D6EF,
},
- [0x1D8AE]={
- category="so",
+ [0x1D6F0]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8AE,
+ specials={ "font", 0x39F },
+ unicodeslot=0x1D6F0,
},
- [0x1D8AF]={
- category="so",
+ [0x1D6F1]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8AF,
+ specials={ "font", 0x3A0 },
+ unicodeslot=0x1D6F1,
},
- [0x1D8B0]={
- category="so",
+ [0x1D6F2]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8B0,
+ specials={ "font", 0x3A1 },
+ unicodeslot=0x1D6F2,
},
- [0x1D8B1]={
- category="so",
+ [0x1D6F3]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8B1,
+ specials={ "font", 0x3F4 },
+ unicodeslot=0x1D6F3,
},
- [0x1D8B2]={
- category="so",
+ [0x1D6F4]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8B2,
+ specials={ "font", 0x3A3 },
+ unicodeslot=0x1D6F4,
},
- [0x1D8B3]={
- category="so",
+ [0x1D6F5]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8B3,
+ specials={ "font", 0x3A4 },
+ unicodeslot=0x1D6F5,
},
- [0x1D8B4]={
- category="so",
+ [0x1D6F6]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8B4,
+ specials={ "font", 0x3A5 },
+ unicodeslot=0x1D6F6,
},
- [0x1D8B5]={
- category="so",
+ [0x1D6F7]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8B5,
+ specials={ "font", 0x3A6 },
+ unicodeslot=0x1D6F7,
},
- [0x1D8B6]={
- category="so",
+ [0x1D6F8]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8B6,
+ specials={ "font", 0x3A7 },
+ unicodeslot=0x1D6F8,
},
- [0x1D8B7]={
- category="so",
+ [0x1D6F9]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8B7,
+ specials={ "font", 0x3A8 },
+ unicodeslot=0x1D6F9,
},
- [0x1D8B8]={
- category="so",
+ [0x1D6FA]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8B8,
+ specials={ "font", 0x3A9 },
+ unicodeslot=0x1D6FA,
},
- [0x1D8B9]={
- category="so",
+ [0x1D6FB]={
+ category="sm",
direction="l",
linebreak="al",
- unicodeslot=0x1D8B9,
+ specials={ "font", 0x2207 },
+ unicodeslot=0x1D6FB,
},
- [0x1D8BA]={
- category="so",
+ [0x1D6FC]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8BA,
+ specials={ "font", 0x3B1 },
+ unicodeslot=0x1D6FC,
},
- [0x1D8BB]={
- category="so",
+ [0x1D6FD]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8BB,
+ specials={ "font", 0x3B2 },
+ unicodeslot=0x1D6FD,
},
- [0x1D8BC]={
- category="so",
+ [0x1D6FE]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8BC,
+ specials={ "font", 0x3B3 },
+ unicodeslot=0x1D6FE,
},
- [0x1D8BD]={
- category="so",
+ [0x1D6FF]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8BD,
+ specials={ "font", 0x3B4 },
+ unicodeslot=0x1D6FF,
},
- [0x1D8BE]={
- category="so",
+ [0x1D700]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8BE,
+ specials={ "font", 0x3B5 },
+ unicodeslot=0x1D700,
},
- [0x1D8BF]={
- category="so",
+ [0x1D701]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8BF,
+ specials={ "font", 0x3B6 },
+ unicodeslot=0x1D701,
},
- [0x1D8C0]={
- category="so",
+ [0x1D702]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8C0,
+ specials={ "font", 0x3B7 },
+ unicodeslot=0x1D702,
},
- [0x1D8C1]={
- category="so",
+ [0x1D703]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8C1,
+ specials={ "font", 0x3B8 },
+ unicodeslot=0x1D703,
},
- [0x1D8C2]={
- category="so",
+ [0x1D704]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8C2,
+ specials={ "font", 0x3B9 },
+ unicodeslot=0x1D704,
},
- [0x1D8C3]={
- category="so",
+ [0x1D705]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8C3,
+ specials={ "font", 0x3BA },
+ unicodeslot=0x1D705,
},
- [0x1D8C4]={
- category="so",
+ [0x1D706]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8C4,
+ specials={ "font", 0x3BB },
+ unicodeslot=0x1D706,
},
- [0x1D8C5]={
- category="so",
+ [0x1D707]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8C5,
+ specials={ "font", 0x3BC },
+ unicodeslot=0x1D707,
},
- [0x1D8C6]={
- category="so",
+ [0x1D708]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8C6,
+ specials={ "font", 0x3BD },
+ unicodeslot=0x1D708,
},
- [0x1D8C7]={
- category="so",
+ [0x1D709]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8C7,
+ specials={ "font", 0x3BE },
+ unicodeslot=0x1D709,
},
- [0x1D8C8]={
- category="so",
+ [0x1D70A]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8C8,
+ specials={ "font", 0x3BF },
+ unicodeslot=0x1D70A,
},
- [0x1D8C9]={
- category="so",
+ [0x1D70B]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8C9,
+ specials={ "font", 0x3C0 },
+ unicodeslot=0x1D70B,
},
- [0x1D8CA]={
- category="so",
+ [0x1D70C]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8CA,
+ specials={ "font", 0x3C1 },
+ unicodeslot=0x1D70C,
},
- [0x1D8CB]={
- category="so",
+ [0x1D70D]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8CB,
+ specials={ "font", 0x3C2 },
+ unicodeslot=0x1D70D,
},
- [0x1D8CC]={
- category="so",
+ [0x1D70E]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8CC,
+ specials={ "font", 0x3C3 },
+ unicodeslot=0x1D70E,
},
- [0x1D8CD]={
- category="so",
+ [0x1D70F]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8CD,
+ specials={ "font", 0x3C4 },
+ unicodeslot=0x1D70F,
},
- [0x1D8CE]={
- category="so",
+ [0x1D710]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8CE,
+ specials={ "font", 0x3C5 },
+ unicodeslot=0x1D710,
},
- [0x1D8CF]={
- category="so",
+ [0x1D711]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8CF,
+ specials={ "font", 0x3C6 },
+ unicodeslot=0x1D711,
},
- [0x1D8D0]={
- category="so",
+ [0x1D712]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8D0,
+ specials={ "font", 0x3C7 },
+ unicodeslot=0x1D712,
},
- [0x1D8D1]={
- category="so",
+ [0x1D713]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8D1,
+ specials={ "font", 0x3C8 },
+ unicodeslot=0x1D713,
},
- [0x1D8D2]={
- category="so",
+ [0x1D714]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8D2,
+ specials={ "font", 0x3C9 },
+ unicodeslot=0x1D714,
},
- [0x1D8D3]={
- category="so",
- direction="l",
+ [0x1D715]={
+ category="sm",
+ direction="on",
linebreak="al",
- unicodeslot=0x1D8D3,
+ specials={ "font", 0x2202 },
+ unicodeslot=0x1D715,
},
- [0x1D8D4]={
- category="so",
+ [0x1D716]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8D4,
+ specials={ "font", 0x3F5 },
+ unicodeslot=0x1D716,
},
- [0x1D8D5]={
- category="so",
+ [0x1D717]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8D5,
+ specials={ "font", 0x3D1 },
+ unicodeslot=0x1D717,
},
- [0x1D8D6]={
- category="so",
+ [0x1D718]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8D6,
+ specials={ "font", 0x3F0 },
+ unicodeslot=0x1D718,
},
- [0x1D8D7]={
- category="so",
+ [0x1D719]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8D7,
+ specials={ "font", 0x3D5 },
+ unicodeslot=0x1D719,
},
- [0x1D8D8]={
- category="so",
+ [0x1D71A]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8D8,
+ specials={ "font", 0x3F1 },
+ unicodeslot=0x1D71A,
},
- [0x1D8D9]={
- category="so",
+ [0x1D71B]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8D9,
+ specials={ "font", 0x3D6 },
+ unicodeslot=0x1D71B,
},
- [0x1D8DA]={
- category="so",
+ [0x1D71C]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8DA,
+ specials={ "font", 0x391 },
+ unicodeslot=0x1D71C,
},
- [0x1D8DB]={
- category="so",
+ [0x1D71D]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8DB,
+ specials={ "font", 0x392 },
+ unicodeslot=0x1D71D,
},
- [0x1D8DC]={
- category="so",
+ [0x1D71E]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8DC,
+ specials={ "font", 0x393 },
+ unicodeslot=0x1D71E,
},
- [0x1D8DD]={
- category="so",
+ [0x1D71F]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8DD,
+ specials={ "font", 0x394 },
+ unicodeslot=0x1D71F,
},
- [0x1D8DE]={
- category="so",
+ [0x1D720]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8DE,
+ specials={ "font", 0x395 },
+ unicodeslot=0x1D720,
},
- [0x1D8DF]={
- category="so",
+ [0x1D721]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8DF,
+ specials={ "font", 0x396 },
+ unicodeslot=0x1D721,
},
- [0x1D8E0]={
- category="so",
+ [0x1D722]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8E0,
+ specials={ "font", 0x397 },
+ unicodeslot=0x1D722,
},
- [0x1D8E1]={
- category="so",
+ [0x1D723]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8E1,
+ specials={ "font", 0x398 },
+ unicodeslot=0x1D723,
},
- [0x1D8E2]={
- category="so",
+ [0x1D724]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8E2,
+ specials={ "font", 0x399 },
+ unicodeslot=0x1D724,
},
- [0x1D8E3]={
- category="so",
+ [0x1D725]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8E3,
+ specials={ "font", 0x39A },
+ unicodeslot=0x1D725,
},
- [0x1D8E4]={
- category="so",
+ [0x1D726]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8E4,
+ specials={ "font", 0x39B },
+ unicodeslot=0x1D726,
},
- [0x1D8E5]={
- category="so",
+ [0x1D727]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8E5,
+ specials={ "font", 0x39C },
+ unicodeslot=0x1D727,
},
- [0x1D8E6]={
- category="so",
+ [0x1D728]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8E6,
+ specials={ "font", 0x39D },
+ unicodeslot=0x1D728,
},
- [0x1D8E7]={
- category="so",
+ [0x1D729]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8E7,
+ specials={ "font", 0x39E },
+ unicodeslot=0x1D729,
},
- [0x1D8E8]={
- category="so",
+ [0x1D72A]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8E8,
+ specials={ "font", 0x39F },
+ unicodeslot=0x1D72A,
},
- [0x1D8E9]={
- category="so",
+ [0x1D72B]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8E9,
+ specials={ "font", 0x3A0 },
+ unicodeslot=0x1D72B,
},
- [0x1D8EA]={
- category="so",
+ [0x1D72C]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8EA,
+ specials={ "font", 0x3A1 },
+ unicodeslot=0x1D72C,
},
- [0x1D8EB]={
- category="so",
+ [0x1D72D]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8EB,
+ specials={ "font", 0x3F4 },
+ unicodeslot=0x1D72D,
},
- [0x1D8EC]={
- category="so",
+ [0x1D72E]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8EC,
+ specials={ "font", 0x3A3 },
+ unicodeslot=0x1D72E,
},
- [0x1D8ED]={
- category="so",
+ [0x1D72F]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8ED,
+ specials={ "font", 0x3A4 },
+ unicodeslot=0x1D72F,
},
- [0x1D8EE]={
- category="so",
+ [0x1D730]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8EE,
+ specials={ "font", 0x3A5 },
+ unicodeslot=0x1D730,
},
- [0x1D8EF]={
- category="so",
+ [0x1D731]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8EF,
+ specials={ "font", 0x3A6 },
+ unicodeslot=0x1D731,
},
- [0x1D8F0]={
- category="so",
+ [0x1D732]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8F0,
+ specials={ "font", 0x3A7 },
+ unicodeslot=0x1D732,
},
- [0x1D8F1]={
- category="so",
+ [0x1D733]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8F1,
+ specials={ "font", 0x3A8 },
+ unicodeslot=0x1D733,
},
- [0x1D8F2]={
- category="so",
+ [0x1D734]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D8F2,
+ specials={ "font", 0x3A9 },
+ unicodeslot=0x1D734,
},
- [0x1D8F3]={
- category="so",
+ [0x1D735]={
+ category="sm",
direction="l",
linebreak="al",
- unicodeslot=0x1D8F3,
+ specials={ "font", 0x2207 },
+ unicodeslot=0x1D735,
},
- [0x1D8F4]={
- category="so",
+ [0x1D736]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8F4,
+ specials={ "font", 0x3B1 },
+ unicodeslot=0x1D736,
},
- [0x1D8F5]={
- category="so",
+ [0x1D737]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8F5,
+ specials={ "font", 0x3B2 },
+ unicodeslot=0x1D737,
},
- [0x1D8F6]={
- category="so",
+ [0x1D738]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8F6,
+ specials={ "font", 0x3B3 },
+ unicodeslot=0x1D738,
},
- [0x1D8F7]={
- category="so",
+ [0x1D739]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8F7,
+ specials={ "font", 0x3B4 },
+ unicodeslot=0x1D739,
},
- [0x1D8F8]={
- category="so",
+ [0x1D73A]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8F8,
+ specials={ "font", 0x3B5 },
+ unicodeslot=0x1D73A,
},
- [0x1D8F9]={
- category="so",
+ [0x1D73B]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8F9,
+ specials={ "font", 0x3B6 },
+ unicodeslot=0x1D73B,
},
- [0x1D8FA]={
- category="so",
+ [0x1D73C]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8FA,
+ specials={ "font", 0x3B7 },
+ unicodeslot=0x1D73C,
},
- [0x1D8FB]={
- category="so",
+ [0x1D73D]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8FB,
+ specials={ "font", 0x3B8 },
+ unicodeslot=0x1D73D,
},
- [0x1D8FC]={
- category="so",
+ [0x1D73E]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8FC,
+ specials={ "font", 0x3B9 },
+ unicodeslot=0x1D73E,
},
- [0x1D8FD]={
- category="so",
+ [0x1D73F]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8FD,
+ specials={ "font", 0x3BA },
+ unicodeslot=0x1D73F,
},
- [0x1D8FE]={
- category="so",
+ [0x1D740]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8FE,
+ specials={ "font", 0x3BB },
+ unicodeslot=0x1D740,
},
- [0x1D8FF]={
- category="so",
+ [0x1D741]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D8FF,
+ specials={ "font", 0x3BC },
+ unicodeslot=0x1D741,
},
- [0x1D900]={
- category="so",
+ [0x1D742]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D900,
+ specials={ "font", 0x3BD },
+ unicodeslot=0x1D742,
},
- [0x1D901]={
- category="so",
+ [0x1D743]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D901,
+ specials={ "font", 0x3BE },
+ unicodeslot=0x1D743,
},
- [0x1D902]={
- category="so",
+ [0x1D744]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D902,
+ specials={ "font", 0x3BF },
+ unicodeslot=0x1D744,
},
- [0x1D903]={
- category="so",
+ [0x1D745]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D903,
+ specials={ "font", 0x3C0 },
+ unicodeslot=0x1D745,
},
- [0x1D904]={
- category="so",
+ [0x1D746]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D904,
+ specials={ "font", 0x3C1 },
+ unicodeslot=0x1D746,
},
- [0x1D905]={
- category="so",
+ [0x1D747]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D905,
+ specials={ "font", 0x3C2 },
+ unicodeslot=0x1D747,
},
- [0x1D906]={
- category="so",
+ [0x1D748]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D906,
+ specials={ "font", 0x3C3 },
+ unicodeslot=0x1D748,
},
- [0x1D907]={
- category="so",
+ [0x1D749]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D907,
+ specials={ "font", 0x3C4 },
+ unicodeslot=0x1D749,
},
- [0x1D908]={
- category="so",
+ [0x1D74A]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D908,
+ specials={ "font", 0x3C5 },
+ unicodeslot=0x1D74A,
},
- [0x1D909]={
- category="so",
+ [0x1D74B]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D909,
+ specials={ "font", 0x3C6 },
+ unicodeslot=0x1D74B,
},
- [0x1D90A]={
- category="so",
+ [0x1D74C]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D90A,
+ specials={ "font", 0x3C7 },
+ unicodeslot=0x1D74C,
},
- [0x1D90B]={
- category="so",
+ [0x1D74D]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D90B,
+ specials={ "font", 0x3C8 },
+ unicodeslot=0x1D74D,
},
- [0x1D90C]={
- category="so",
+ [0x1D74E]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D90C,
+ specials={ "font", 0x3C9 },
+ unicodeslot=0x1D74E,
},
- [0x1D90D]={
- category="so",
- direction="l",
+ [0x1D74F]={
+ category="sm",
+ direction="on",
linebreak="al",
- unicodeslot=0x1D90D,
+ specials={ "font", 0x2202 },
+ unicodeslot=0x1D74F,
},
- [0x1D90E]={
- category="so",
+ [0x1D750]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D90E,
+ specials={ "font", 0x3F5 },
+ unicodeslot=0x1D750,
},
- [0x1D90F]={
- category="so",
+ [0x1D751]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D90F,
+ specials={ "font", 0x3D1 },
+ unicodeslot=0x1D751,
},
- [0x1D910]={
- category="so",
+ [0x1D752]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D910,
+ specials={ "font", 0x3F0 },
+ unicodeslot=0x1D752,
},
- [0x1D911]={
- category="so",
+ [0x1D753]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D911,
+ specials={ "font", 0x3D5 },
+ unicodeslot=0x1D753,
},
- [0x1D912]={
- category="so",
+ [0x1D754]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D912,
+ specials={ "font", 0x3F1 },
+ unicodeslot=0x1D754,
},
- [0x1D913]={
- category="so",
+ [0x1D755]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D913,
+ specials={ "font", 0x3D6 },
+ unicodeslot=0x1D755,
},
- [0x1D914]={
- category="so",
+ [0x1D756]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D914,
+ specials={ "font", 0x391 },
+ unicodeslot=0x1D756,
},
- [0x1D915]={
- category="so",
+ [0x1D757]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D915,
+ specials={ "font", 0x392 },
+ unicodeslot=0x1D757,
},
- [0x1D916]={
- category="so",
+ [0x1D758]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D916,
+ specials={ "font", 0x393 },
+ unicodeslot=0x1D758,
},
- [0x1D917]={
- category="so",
+ [0x1D759]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D917,
+ specials={ "font", 0x394 },
+ unicodeslot=0x1D759,
},
- [0x1D918]={
- category="so",
+ [0x1D75A]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D918,
+ specials={ "font", 0x395 },
+ unicodeslot=0x1D75A,
},
- [0x1D919]={
- category="so",
+ [0x1D75B]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D919,
+ specials={ "font", 0x396 },
+ unicodeslot=0x1D75B,
},
- [0x1D91A]={
- category="so",
+ [0x1D75C]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D91A,
+ specials={ "font", 0x397 },
+ unicodeslot=0x1D75C,
},
- [0x1D91B]={
- category="so",
+ [0x1D75D]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D91B,
+ specials={ "font", 0x398 },
+ unicodeslot=0x1D75D,
},
- [0x1D91C]={
- category="so",
+ [0x1D75E]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D91C,
+ specials={ "font", 0x399 },
+ unicodeslot=0x1D75E,
},
- [0x1D91D]={
- category="so",
+ [0x1D75F]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D91D,
+ specials={ "font", 0x39A },
+ unicodeslot=0x1D75F,
},
- [0x1D91E]={
- category="so",
+ [0x1D760]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D91E,
+ specials={ "font", 0x39B },
+ unicodeslot=0x1D760,
},
- [0x1D91F]={
- category="so",
+ [0x1D761]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D91F,
+ specials={ "font", 0x39C },
+ unicodeslot=0x1D761,
},
- [0x1D920]={
- category="so",
+ [0x1D762]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D920,
+ specials={ "font", 0x39D },
+ unicodeslot=0x1D762,
},
- [0x1D921]={
- category="so",
+ [0x1D763]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D921,
+ specials={ "font", 0x39E },
+ unicodeslot=0x1D763,
},
- [0x1D922]={
- category="so",
+ [0x1D764]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D922,
+ specials={ "font", 0x39F },
+ unicodeslot=0x1D764,
},
- [0x1D923]={
- category="so",
+ [0x1D765]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D923,
+ specials={ "font", 0x3A0 },
+ unicodeslot=0x1D765,
},
- [0x1D924]={
- category="so",
+ [0x1D766]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D924,
+ specials={ "font", 0x3A1 },
+ unicodeslot=0x1D766,
},
- [0x1D925]={
- category="so",
+ [0x1D767]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D925,
+ specials={ "font", 0x3F4 },
+ unicodeslot=0x1D767,
},
- [0x1D926]={
- category="so",
+ [0x1D768]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D926,
+ specials={ "font", 0x3A3 },
+ unicodeslot=0x1D768,
},
- [0x1D927]={
- category="so",
+ [0x1D769]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D927,
+ specials={ "font", 0x3A4 },
+ unicodeslot=0x1D769,
},
- [0x1D928]={
- category="so",
+ [0x1D76A]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D928,
+ specials={ "font", 0x3A5 },
+ unicodeslot=0x1D76A,
},
- [0x1D929]={
- category="so",
+ [0x1D76B]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D929,
+ specials={ "font", 0x3A6 },
+ unicodeslot=0x1D76B,
},
- [0x1D92A]={
- category="so",
+ [0x1D76C]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D92A,
+ specials={ "font", 0x3A7 },
+ unicodeslot=0x1D76C,
},
- [0x1D92B]={
- category="so",
+ [0x1D76D]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D92B,
+ specials={ "font", 0x3A8 },
+ unicodeslot=0x1D76D,
},
- [0x1D92C]={
- category="so",
+ [0x1D76E]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D92C,
+ specials={ "font", 0x3A9 },
+ unicodeslot=0x1D76E,
},
- [0x1D92D]={
- category="so",
+ [0x1D76F]={
+ category="sm",
direction="l",
linebreak="al",
- unicodeslot=0x1D92D,
+ specials={ "font", 0x2207 },
+ unicodeslot=0x1D76F,
},
- [0x1D92E]={
- category="so",
+ [0x1D770]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D92E,
+ specials={ "font", 0x3B1 },
+ unicodeslot=0x1D770,
},
- [0x1D92F]={
- category="so",
+ [0x1D771]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D92F,
+ specials={ "font", 0x3B2 },
+ unicodeslot=0x1D771,
},
- [0x1D930]={
- category="so",
+ [0x1D772]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D930,
+ specials={ "font", 0x3B3 },
+ unicodeslot=0x1D772,
},
- [0x1D931]={
- category="so",
+ [0x1D773]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D931,
+ specials={ "font", 0x3B4 },
+ unicodeslot=0x1D773,
},
- [0x1D932]={
- category="so",
+ [0x1D774]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D932,
+ specials={ "font", 0x3B5 },
+ unicodeslot=0x1D774,
},
- [0x1D933]={
- category="so",
+ [0x1D775]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D933,
+ specials={ "font", 0x3B6 },
+ unicodeslot=0x1D775,
},
- [0x1D934]={
- category="so",
+ [0x1D776]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D934,
+ specials={ "font", 0x3B7 },
+ unicodeslot=0x1D776,
},
- [0x1D935]={
- category="so",
+ [0x1D777]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D935,
+ specials={ "font", 0x3B8 },
+ unicodeslot=0x1D777,
},
- [0x1D936]={
- category="so",
+ [0x1D778]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D936,
+ specials={ "font", 0x3B9 },
+ unicodeslot=0x1D778,
},
- [0x1D937]={
- category="so",
+ [0x1D779]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D937,
+ specials={ "font", 0x3BA },
+ unicodeslot=0x1D779,
},
- [0x1D938]={
- category="so",
+ [0x1D77A]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D938,
+ specials={ "font", 0x3BB },
+ unicodeslot=0x1D77A,
},
- [0x1D939]={
- category="so",
+ [0x1D77B]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D939,
+ specials={ "font", 0x3BC },
+ unicodeslot=0x1D77B,
},
- [0x1D93A]={
- category="so",
+ [0x1D77C]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D93A,
+ specials={ "font", 0x3BD },
+ unicodeslot=0x1D77C,
},
- [0x1D93B]={
- category="so",
+ [0x1D77D]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D93B,
+ specials={ "font", 0x3BE },
+ unicodeslot=0x1D77D,
},
- [0x1D93C]={
- category="so",
+ [0x1D77E]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D93C,
+ specials={ "font", 0x3BF },
+ unicodeslot=0x1D77E,
},
- [0x1D93D]={
- category="so",
+ [0x1D77F]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D93D,
+ specials={ "font", 0x3C0 },
+ unicodeslot=0x1D77F,
},
- [0x1D93E]={
- category="so",
+ [0x1D780]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D93E,
+ specials={ "font", 0x3C1 },
+ unicodeslot=0x1D780,
},
- [0x1D93F]={
- category="so",
+ [0x1D781]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D93F,
+ specials={ "font", 0x3C2 },
+ unicodeslot=0x1D781,
},
- [0x1D940]={
- category="so",
+ [0x1D782]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D940,
+ specials={ "font", 0x3C3 },
+ unicodeslot=0x1D782,
},
- [0x1D941]={
- category="so",
+ [0x1D783]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D941,
+ specials={ "font", 0x3C4 },
+ unicodeslot=0x1D783,
},
- [0x1D942]={
- category="so",
+ [0x1D784]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D942,
+ specials={ "font", 0x3C5 },
+ unicodeslot=0x1D784,
},
- [0x1D943]={
- category="so",
+ [0x1D785]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D943,
+ specials={ "font", 0x3C6 },
+ unicodeslot=0x1D785,
},
- [0x1D944]={
- category="so",
+ [0x1D786]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D944,
+ specials={ "font", 0x3C7 },
+ unicodeslot=0x1D786,
},
- [0x1D945]={
- category="so",
+ [0x1D787]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D945,
+ specials={ "font", 0x3C8 },
+ unicodeslot=0x1D787,
},
- [0x1D946]={
- category="so",
+ [0x1D788]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D946,
+ specials={ "font", 0x3C9 },
+ unicodeslot=0x1D788,
},
- [0x1D947]={
- category="so",
- direction="l",
+ [0x1D789]={
+ category="sm",
+ direction="on",
linebreak="al",
- unicodeslot=0x1D947,
+ specials={ "font", 0x2202 },
+ unicodeslot=0x1D789,
},
- [0x1D948]={
- category="so",
+ [0x1D78A]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D948,
+ specials={ "font", 0x3F5 },
+ unicodeslot=0x1D78A,
},
- [0x1D949]={
- category="so",
+ [0x1D78B]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D949,
+ specials={ "font", 0x3D1 },
+ unicodeslot=0x1D78B,
},
- [0x1D94A]={
- category="so",
+ [0x1D78C]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D94A,
+ specials={ "font", 0x3F0 },
+ unicodeslot=0x1D78C,
},
- [0x1D94B]={
- category="so",
+ [0x1D78D]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D94B,
+ specials={ "font", 0x3D5 },
+ unicodeslot=0x1D78D,
},
- [0x1D94C]={
- category="so",
+ [0x1D78E]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D94C,
+ specials={ "font", 0x3F1 },
+ unicodeslot=0x1D78E,
},
- [0x1D94D]={
- category="so",
+ [0x1D78F]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D94D,
+ specials={ "font", 0x3D6 },
+ unicodeslot=0x1D78F,
},
- [0x1D94E]={
- category="so",
+ [0x1D790]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D94E,
+ specials={ "font", 0x391 },
+ unicodeslot=0x1D790,
},
- [0x1D94F]={
- category="so",
+ [0x1D791]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D94F,
+ specials={ "font", 0x392 },
+ unicodeslot=0x1D791,
},
- [0x1D950]={
- category="so",
+ [0x1D792]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D950,
+ specials={ "font", 0x393 },
+ unicodeslot=0x1D792,
},
- [0x1D951]={
- category="so",
+ [0x1D793]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D951,
+ specials={ "font", 0x394 },
+ unicodeslot=0x1D793,
},
- [0x1D952]={
- category="so",
+ [0x1D794]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D952,
+ specials={ "font", 0x395 },
+ unicodeslot=0x1D794,
},
- [0x1D953]={
- category="so",
+ [0x1D795]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D953,
+ specials={ "font", 0x396 },
+ unicodeslot=0x1D795,
},
- [0x1D954]={
- category="so",
+ [0x1D796]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D954,
+ specials={ "font", 0x397 },
+ unicodeslot=0x1D796,
},
- [0x1D955]={
- category="so",
+ [0x1D797]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D955,
+ specials={ "font", 0x398 },
+ unicodeslot=0x1D797,
},
- [0x1D956]={
- category="so",
+ [0x1D798]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D956,
+ specials={ "font", 0x399 },
+ unicodeslot=0x1D798,
},
- [0x1D957]={
- category="so",
+ [0x1D799]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D957,
+ specials={ "font", 0x39A },
+ unicodeslot=0x1D799,
},
- [0x1D958]={
- category="so",
+ [0x1D79A]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D958,
+ specials={ "font", 0x39B },
+ unicodeslot=0x1D79A,
},
- [0x1D959]={
- category="so",
+ [0x1D79B]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D959,
+ specials={ "font", 0x39C },
+ unicodeslot=0x1D79B,
},
- [0x1D95A]={
- category="so",
+ [0x1D79C]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D95A,
+ specials={ "font", 0x39D },
+ unicodeslot=0x1D79C,
},
- [0x1D95B]={
- category="so",
+ [0x1D79D]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D95B,
+ specials={ "font", 0x39E },
+ unicodeslot=0x1D79D,
},
- [0x1D95C]={
- category="so",
+ [0x1D79E]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D95C,
+ specials={ "font", 0x39F },
+ unicodeslot=0x1D79E,
},
- [0x1D95D]={
- category="so",
+ [0x1D79F]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D95D,
+ specials={ "font", 0x3A0 },
+ unicodeslot=0x1D79F,
},
- [0x1D95E]={
- category="so",
+ [0x1D7A0]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D95E,
+ specials={ "font", 0x3A1 },
+ unicodeslot=0x1D7A0,
},
- [0x1D95F]={
- category="so",
+ [0x1D7A1]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D95F,
+ specials={ "font", 0x3F4 },
+ unicodeslot=0x1D7A1,
},
- [0x1D960]={
- category="so",
+ [0x1D7A2]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D960,
+ specials={ "font", 0x3A3 },
+ unicodeslot=0x1D7A2,
},
- [0x1D961]={
- category="so",
+ [0x1D7A3]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D961,
+ specials={ "font", 0x3A4 },
+ unicodeslot=0x1D7A3,
},
- [0x1D962]={
- category="so",
+ [0x1D7A4]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D962,
+ specials={ "font", 0x3A5 },
+ unicodeslot=0x1D7A4,
},
- [0x1D963]={
- category="so",
+ [0x1D7A5]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D963,
+ specials={ "font", 0x3A6 },
+ unicodeslot=0x1D7A5,
},
- [0x1D964]={
- category="so",
+ [0x1D7A6]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D964,
+ specials={ "font", 0x3A7 },
+ unicodeslot=0x1D7A6,
},
- [0x1D965]={
- category="so",
+ [0x1D7A7]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D965,
+ specials={ "font", 0x3A8 },
+ unicodeslot=0x1D7A7,
},
- [0x1D966]={
- category="so",
+ [0x1D7A8]={
+ category="lu",
direction="l",
linebreak="al",
- unicodeslot=0x1D966,
+ specials={ "font", 0x3A9 },
+ unicodeslot=0x1D7A8,
},
- [0x1D967]={
- category="so",
+ [0x1D7A9]={
+ category="sm",
direction="l",
linebreak="al",
- unicodeslot=0x1D967,
+ specials={ "font", 0x2207 },
+ unicodeslot=0x1D7A9,
},
- [0x1D968]={
- category="so",
+ [0x1D7AA]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D968,
+ specials={ "font", 0x3B1 },
+ unicodeslot=0x1D7AA,
},
- [0x1D969]={
- category="so",
+ [0x1D7AB]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D969,
+ specials={ "font", 0x3B2 },
+ unicodeslot=0x1D7AB,
},
- [0x1D96A]={
- category="so",
+ [0x1D7AC]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D96A,
+ specials={ "font", 0x3B3 },
+ unicodeslot=0x1D7AC,
},
- [0x1D96B]={
- category="so",
+ [0x1D7AD]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D96B,
+ specials={ "font", 0x3B4 },
+ unicodeslot=0x1D7AD,
},
- [0x1D96C]={
- category="so",
+ [0x1D7AE]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D96C,
+ specials={ "font", 0x3B5 },
+ unicodeslot=0x1D7AE,
},
- [0x1D96D]={
- category="so",
+ [0x1D7AF]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D96D,
+ specials={ "font", 0x3B6 },
+ unicodeslot=0x1D7AF,
},
- [0x1D96E]={
- category="so",
+ [0x1D7B0]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D96E,
+ specials={ "font", 0x3B7 },
+ unicodeslot=0x1D7B0,
},
- [0x1D96F]={
- category="so",
+ [0x1D7B1]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D96F,
+ specials={ "font", 0x3B8 },
+ unicodeslot=0x1D7B1,
},
- [0x1D970]={
- category="so",
+ [0x1D7B2]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D970,
+ specials={ "font", 0x3B9 },
+ unicodeslot=0x1D7B2,
},
- [0x1D971]={
- category="so",
+ [0x1D7B3]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D971,
+ specials={ "font", 0x3BA },
+ unicodeslot=0x1D7B3,
},
- [0x1D972]={
- category="so",
+ [0x1D7B4]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D972,
+ specials={ "font", 0x3BB },
+ unicodeslot=0x1D7B4,
},
- [0x1D973]={
- category="so",
+ [0x1D7B5]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D973,
+ specials={ "font", 0x3BC },
+ unicodeslot=0x1D7B5,
},
- [0x1D974]={
- category="so",
+ [0x1D7B6]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D974,
+ specials={ "font", 0x3BD },
+ unicodeslot=0x1D7B6,
},
- [0x1D975]={
- category="so",
+ [0x1D7B7]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D975,
+ specials={ "font", 0x3BE },
+ unicodeslot=0x1D7B7,
},
- [0x1D976]={
- category="so",
+ [0x1D7B8]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D976,
+ specials={ "font", 0x3BF },
+ unicodeslot=0x1D7B8,
},
- [0x1D977]={
- category="so",
+ [0x1D7B9]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D977,
+ specials={ "font", 0x3C0 },
+ unicodeslot=0x1D7B9,
},
- [0x1D978]={
- category="so",
+ [0x1D7BA]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D978,
+ specials={ "font", 0x3C1 },
+ unicodeslot=0x1D7BA,
},
- [0x1D979]={
- category="so",
+ [0x1D7BB]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D979,
+ specials={ "font", 0x3C2 },
+ unicodeslot=0x1D7BB,
},
- [0x1D97A]={
- category="so",
+ [0x1D7BC]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D97A,
+ specials={ "font", 0x3C3 },
+ unicodeslot=0x1D7BC,
},
- [0x1D97B]={
- category="so",
+ [0x1D7BD]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D97B,
+ specials={ "font", 0x3C4 },
+ unicodeslot=0x1D7BD,
},
- [0x1D97C]={
- category="so",
+ [0x1D7BE]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D97C,
+ specials={ "font", 0x3C5 },
+ unicodeslot=0x1D7BE,
},
- [0x1D97D]={
- category="so",
+ [0x1D7BF]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D97D,
+ specials={ "font", 0x3C6 },
+ unicodeslot=0x1D7BF,
},
- [0x1D97E]={
- category="so",
+ [0x1D7C0]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D97E,
+ specials={ "font", 0x3C7 },
+ unicodeslot=0x1D7C0,
},
- [0x1D97F]={
- category="so",
+ [0x1D7C1]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D97F,
+ specials={ "font", 0x3C8 },
+ unicodeslot=0x1D7C1,
},
- [0x1D980]={
- category="so",
+ [0x1D7C2]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D980,
+ specials={ "font", 0x3C9 },
+ unicodeslot=0x1D7C2,
},
- [0x1D981]={
- category="so",
- direction="l",
+ [0x1D7C3]={
+ category="sm",
+ direction="on",
linebreak="al",
- unicodeslot=0x1D981,
+ specials={ "font", 0x2202 },
+ unicodeslot=0x1D7C3,
},
- [0x1D982]={
- category="so",
+ [0x1D7C4]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D982,
+ specials={ "font", 0x3F5 },
+ unicodeslot=0x1D7C4,
},
- [0x1D983]={
- category="so",
+ [0x1D7C5]={
+ category="ll",
direction="l",
linebreak="al",
- unicodeslot=0x1D983,
+ specials={ "font", 0x3D1 },
+ unicodeslot=0x1D7C5,
},
- [0x1D984]={
+ [0x1D7C6]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x3F0 },
+ unicodeslot=0x1D7C6,
+ },
+ [0x1D7C7]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x3D5 },
+ unicodeslot=0x1D7C7,
+ },
+ [0x1D7C8]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x3F1 },
+ unicodeslot=0x1D7C8,
+ },
+ [0x1D7C9]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x3D6 },
+ unicodeslot=0x1D7C9,
+ },
+ [0x1D7CA]={
+ category="lu",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x3DC },
+ unicodeslot=0x1D7CA,
+ },
+ [0x1D7CB]={
+ category="ll",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x3DD },
+ unicodeslot=0x1D7CB,
+ },
+ [0x1D7CE]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x30 },
+ unicodeslot=0x1D7CE,
+ },
+ [0x1D7CF]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x31 },
+ unicodeslot=0x1D7CF,
+ },
+ [0x1D7D0]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x32 },
+ unicodeslot=0x1D7D0,
+ },
+ [0x1D7D1]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x33 },
+ unicodeslot=0x1D7D1,
+ },
+ [0x1D7D2]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x34 },
+ unicodeslot=0x1D7D2,
+ },
+ [0x1D7D3]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x35 },
+ unicodeslot=0x1D7D3,
+ },
+ [0x1D7D4]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x36 },
+ unicodeslot=0x1D7D4,
+ },
+ [0x1D7D5]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x37 },
+ unicodeslot=0x1D7D5,
+ },
+ [0x1D7D6]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x38 },
+ unicodeslot=0x1D7D6,
+ },
+ [0x1D7D7]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x39 },
+ unicodeslot=0x1D7D7,
+ },
+ [0x1D7D8]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x30 },
+ unicodeslot=0x1D7D8,
+ },
+ [0x1D7D9]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x31 },
+ unicodeslot=0x1D7D9,
+ },
+ [0x1D7DA]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x32 },
+ unicodeslot=0x1D7DA,
+ },
+ [0x1D7DB]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x33 },
+ unicodeslot=0x1D7DB,
+ },
+ [0x1D7DC]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x34 },
+ unicodeslot=0x1D7DC,
+ },
+ [0x1D7DD]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x35 },
+ unicodeslot=0x1D7DD,
+ },
+ [0x1D7DE]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x36 },
+ unicodeslot=0x1D7DE,
+ },
+ [0x1D7DF]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x37 },
+ unicodeslot=0x1D7DF,
+ },
+ [0x1D7E0]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x38 },
+ unicodeslot=0x1D7E0,
+ },
+ [0x1D7E1]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x39 },
+ unicodeslot=0x1D7E1,
+ },
+ [0x1D7E2]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x30 },
+ unicodeslot=0x1D7E2,
+ },
+ [0x1D7E3]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x31 },
+ unicodeslot=0x1D7E3,
+ },
+ [0x1D7E4]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x32 },
+ unicodeslot=0x1D7E4,
+ },
+ [0x1D7E5]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x33 },
+ unicodeslot=0x1D7E5,
+ },
+ [0x1D7E6]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x34 },
+ unicodeslot=0x1D7E6,
+ },
+ [0x1D7E7]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x35 },
+ unicodeslot=0x1D7E7,
+ },
+ [0x1D7E8]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x36 },
+ unicodeslot=0x1D7E8,
+ },
+ [0x1D7E9]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x37 },
+ unicodeslot=0x1D7E9,
+ },
+ [0x1D7EA]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x38 },
+ unicodeslot=0x1D7EA,
+ },
+ [0x1D7EB]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x39 },
+ unicodeslot=0x1D7EB,
+ },
+ [0x1D7EC]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x30 },
+ unicodeslot=0x1D7EC,
+ },
+ [0x1D7ED]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x31 },
+ unicodeslot=0x1D7ED,
+ },
+ [0x1D7EE]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x32 },
+ unicodeslot=0x1D7EE,
+ },
+ [0x1D7EF]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x33 },
+ unicodeslot=0x1D7EF,
+ },
+ [0x1D7F0]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x34 },
+ unicodeslot=0x1D7F0,
+ },
+ [0x1D7F1]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x35 },
+ unicodeslot=0x1D7F1,
+ },
+ [0x1D7F2]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x36 },
+ unicodeslot=0x1D7F2,
+ },
+ [0x1D7F3]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x37 },
+ unicodeslot=0x1D7F3,
+ },
+ [0x1D7F4]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x38 },
+ unicodeslot=0x1D7F4,
+ },
+ [0x1D7F5]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x39 },
+ unicodeslot=0x1D7F5,
+ },
+ [0x1D7F6]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x30 },
+ unicodeslot=0x1D7F6,
+ },
+ [0x1D7F7]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x31 },
+ unicodeslot=0x1D7F7,
+ },
+ [0x1D7F8]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x32 },
+ unicodeslot=0x1D7F8,
+ },
+ [0x1D7F9]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x33 },
+ unicodeslot=0x1D7F9,
+ },
+ [0x1D7FA]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x34 },
+ unicodeslot=0x1D7FA,
+ },
+ [0x1D7FB]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x35 },
+ unicodeslot=0x1D7FB,
+ },
+ [0x1D7FC]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x36 },
+ unicodeslot=0x1D7FC,
+ },
+ [0x1D7FD]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x37 },
+ unicodeslot=0x1D7FD,
+ },
+ [0x1D7FE]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x38 },
+ unicodeslot=0x1D7FE,
+ },
+ [0x1D7FF]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x39 },
+ unicodeslot=0x1D7FF,
+ },
+ [0x1D800]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D984,
+ unicodeslot=0x1D800,
},
- [0x1D985]={
+ [0x1D801]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D985,
+ unicodeslot=0x1D801,
},
- [0x1D986]={
+ [0x1D802]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D986,
+ unicodeslot=0x1D802,
},
- [0x1D987]={
+ [0x1D803]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D987,
+ unicodeslot=0x1D803,
},
- [0x1D988]={
+ [0x1D804]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D988,
+ unicodeslot=0x1D804,
},
- [0x1D989]={
+ [0x1D805]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D989,
+ unicodeslot=0x1D805,
},
- [0x1D98A]={
+ [0x1D806]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D98A,
+ unicodeslot=0x1D806,
},
- [0x1D98B]={
+ [0x1D807]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D98B,
+ unicodeslot=0x1D807,
},
- [0x1D98C]={
+ [0x1D808]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D98C,
+ unicodeslot=0x1D808,
},
- [0x1D98D]={
+ [0x1D809]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D98D,
+ unicodeslot=0x1D809,
},
- [0x1D98E]={
+ [0x1D80A]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D98E,
+ unicodeslot=0x1D80A,
},
- [0x1D98F]={
+ [0x1D80B]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D98F,
+ unicodeslot=0x1D80B,
},
- [0x1D990]={
+ [0x1D80C]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D990,
+ unicodeslot=0x1D80C,
},
- [0x1D991]={
+ [0x1D80D]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D991,
+ unicodeslot=0x1D80D,
},
- [0x1D992]={
+ [0x1D80E]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D992,
+ unicodeslot=0x1D80E,
},
- [0x1D993]={
+ [0x1D80F]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D993,
+ unicodeslot=0x1D80F,
},
- [0x1D994]={
+ [0x1D810]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D994,
+ unicodeslot=0x1D810,
},
- [0x1D995]={
+ [0x1D811]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D995,
+ unicodeslot=0x1D811,
},
- [0x1D996]={
+ [0x1D812]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D996,
+ unicodeslot=0x1D812,
},
- [0x1D997]={
+ [0x1D813]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D997,
+ unicodeslot=0x1D813,
},
- [0x1D998]={
+ [0x1D814]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D998,
+ unicodeslot=0x1D814,
},
- [0x1D999]={
+ [0x1D815]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D999,
+ unicodeslot=0x1D815,
},
- [0x1D99A]={
+ [0x1D816]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D99A,
+ unicodeslot=0x1D816,
},
- [0x1D99B]={
+ [0x1D817]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D99B,
+ unicodeslot=0x1D817,
},
- [0x1D99C]={
+ [0x1D818]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D99C,
+ unicodeslot=0x1D818,
},
- [0x1D99D]={
+ [0x1D819]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D99D,
+ unicodeslot=0x1D819,
},
- [0x1D99E]={
+ [0x1D81A]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D99E,
+ unicodeslot=0x1D81A,
},
- [0x1D99F]={
+ [0x1D81B]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D99F,
+ unicodeslot=0x1D81B,
},
- [0x1D9A0]={
+ [0x1D81C]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9A0,
+ unicodeslot=0x1D81C,
},
- [0x1D9A1]={
+ [0x1D81D]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9A1,
+ unicodeslot=0x1D81D,
},
- [0x1D9A2]={
+ [0x1D81E]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9A2,
+ unicodeslot=0x1D81E,
},
- [0x1D9A3]={
+ [0x1D81F]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9A3,
+ unicodeslot=0x1D81F,
},
- [0x1D9A4]={
+ [0x1D820]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9A4,
+ unicodeslot=0x1D820,
},
- [0x1D9A5]={
+ [0x1D821]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9A5,
+ unicodeslot=0x1D821,
},
- [0x1D9A6]={
+ [0x1D822]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9A6,
+ unicodeslot=0x1D822,
},
- [0x1D9A7]={
+ [0x1D823]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9A7,
+ unicodeslot=0x1D823,
},
- [0x1D9A8]={
+ [0x1D824]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9A8,
+ unicodeslot=0x1D824,
},
- [0x1D9A9]={
+ [0x1D825]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9A9,
+ unicodeslot=0x1D825,
},
- [0x1D9AA]={
+ [0x1D826]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9AA,
+ unicodeslot=0x1D826,
},
- [0x1D9AB]={
+ [0x1D827]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9AB,
+ unicodeslot=0x1D827,
},
- [0x1D9AC]={
+ [0x1D828]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9AC,
+ unicodeslot=0x1D828,
},
- [0x1D9AD]={
+ [0x1D829]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9AD,
+ unicodeslot=0x1D829,
},
- [0x1D9AE]={
+ [0x1D82A]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9AE,
+ unicodeslot=0x1D82A,
},
- [0x1D9AF]={
+ [0x1D82B]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9AF,
+ unicodeslot=0x1D82B,
},
- [0x1D9B0]={
+ [0x1D82C]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9B0,
+ unicodeslot=0x1D82C,
},
- [0x1D9B1]={
+ [0x1D82D]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9B1,
+ unicodeslot=0x1D82D,
},
- [0x1D9B2]={
+ [0x1D82E]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9B2,
+ unicodeslot=0x1D82E,
},
- [0x1D9B3]={
+ [0x1D82F]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9B3,
+ unicodeslot=0x1D82F,
},
- [0x1D9B4]={
+ [0x1D830]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9B4,
+ unicodeslot=0x1D830,
},
- [0x1D9B5]={
+ [0x1D831]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9B5,
+ unicodeslot=0x1D831,
},
- [0x1D9B6]={
+ [0x1D832]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9B6,
+ unicodeslot=0x1D832,
},
- [0x1D9B7]={
+ [0x1D833]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9B7,
+ unicodeslot=0x1D833,
},
- [0x1D9B8]={
+ [0x1D834]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9B8,
+ unicodeslot=0x1D834,
},
- [0x1D9B9]={
+ [0x1D835]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9B9,
+ unicodeslot=0x1D835,
},
- [0x1D9BA]={
+ [0x1D836]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9BA,
+ unicodeslot=0x1D836,
},
- [0x1D9BB]={
+ [0x1D837]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9BB,
+ unicodeslot=0x1D837,
},
- [0x1D9BC]={
+ [0x1D838]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9BC,
+ unicodeslot=0x1D838,
},
- [0x1D9BD]={
+ [0x1D839]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9BD,
+ unicodeslot=0x1D839,
},
- [0x1D9BE]={
+ [0x1D83A]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9BE,
+ unicodeslot=0x1D83A,
},
- [0x1D9BF]={
+ [0x1D83B]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9BF,
+ unicodeslot=0x1D83B,
},
- [0x1D9C0]={
+ [0x1D83C]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9C0,
+ unicodeslot=0x1D83C,
},
- [0x1D9C1]={
+ [0x1D83D]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9C1,
+ unicodeslot=0x1D83D,
},
- [0x1D9C2]={
+ [0x1D83E]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9C2,
+ unicodeslot=0x1D83E,
},
- [0x1D9C3]={
+ [0x1D83F]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9C3,
+ unicodeslot=0x1D83F,
},
- [0x1D9C4]={
+ [0x1D840]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9C4,
+ unicodeslot=0x1D840,
},
- [0x1D9C5]={
+ [0x1D841]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9C5,
+ unicodeslot=0x1D841,
},
- [0x1D9C6]={
+ [0x1D842]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9C6,
+ unicodeslot=0x1D842,
},
- [0x1D9C7]={
+ [0x1D843]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9C7,
+ unicodeslot=0x1D843,
},
- [0x1D9C8]={
+ [0x1D844]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9C8,
+ unicodeslot=0x1D844,
},
- [0x1D9C9]={
+ [0x1D845]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9C9,
+ unicodeslot=0x1D845,
},
- [0x1D9CA]={
+ [0x1D846]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9CA,
+ unicodeslot=0x1D846,
},
- [0x1D9CB]={
+ [0x1D847]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9CB,
+ unicodeslot=0x1D847,
},
- [0x1D9CC]={
+ [0x1D848]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9CC,
+ unicodeslot=0x1D848,
},
- [0x1D9CD]={
+ [0x1D849]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9CD,
+ unicodeslot=0x1D849,
},
- [0x1D9CE]={
+ [0x1D84A]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9CE,
+ unicodeslot=0x1D84A,
},
- [0x1D9CF]={
+ [0x1D84B]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9CF,
+ unicodeslot=0x1D84B,
},
- [0x1D9D0]={
+ [0x1D84C]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9D0,
+ unicodeslot=0x1D84C,
},
- [0x1D9D1]={
+ [0x1D84D]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9D1,
+ unicodeslot=0x1D84D,
},
- [0x1D9D2]={
+ [0x1D84E]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9D2,
+ unicodeslot=0x1D84E,
},
- [0x1D9D3]={
+ [0x1D84F]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9D3,
+ unicodeslot=0x1D84F,
},
- [0x1D9D4]={
+ [0x1D850]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9D4,
+ unicodeslot=0x1D850,
},
- [0x1D9D5]={
+ [0x1D851]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9D5,
+ unicodeslot=0x1D851,
},
- [0x1D9D6]={
+ [0x1D852]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9D6,
+ unicodeslot=0x1D852,
},
- [0x1D9D7]={
+ [0x1D853]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9D7,
+ unicodeslot=0x1D853,
},
- [0x1D9D8]={
+ [0x1D854]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9D8,
+ unicodeslot=0x1D854,
},
- [0x1D9D9]={
+ [0x1D855]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9D9,
+ unicodeslot=0x1D855,
},
- [0x1D9DA]={
+ [0x1D856]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9DA,
+ unicodeslot=0x1D856,
},
- [0x1D9DB]={
+ [0x1D857]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9DB,
+ unicodeslot=0x1D857,
},
- [0x1D9DC]={
+ [0x1D858]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9DC,
+ unicodeslot=0x1D858,
},
- [0x1D9DD]={
+ [0x1D859]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9DD,
+ unicodeslot=0x1D859,
},
- [0x1D9DE]={
+ [0x1D85A]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9DE,
+ unicodeslot=0x1D85A,
},
- [0x1D9DF]={
+ [0x1D85B]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9DF,
+ unicodeslot=0x1D85B,
},
- [0x1D9E0]={
+ [0x1D85C]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9E0,
+ unicodeslot=0x1D85C,
},
- [0x1D9E1]={
+ [0x1D85D]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9E1,
+ unicodeslot=0x1D85D,
},
- [0x1D9E2]={
+ [0x1D85E]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9E2,
+ unicodeslot=0x1D85E,
},
- [0x1D9E3]={
+ [0x1D85F]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9E3,
+ unicodeslot=0x1D85F,
},
- [0x1D9E4]={
+ [0x1D860]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9E4,
+ unicodeslot=0x1D860,
},
- [0x1D9E5]={
+ [0x1D861]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9E5,
+ unicodeslot=0x1D861,
},
- [0x1D9E6]={
+ [0x1D862]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9E6,
+ unicodeslot=0x1D862,
},
- [0x1D9E7]={
+ [0x1D863]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9E7,
+ unicodeslot=0x1D863,
},
- [0x1D9E8]={
+ [0x1D864]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9E8,
+ unicodeslot=0x1D864,
},
- [0x1D9E9]={
+ [0x1D865]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9E9,
+ unicodeslot=0x1D865,
},
- [0x1D9EA]={
+ [0x1D866]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9EA,
+ unicodeslot=0x1D866,
},
- [0x1D9EB]={
+ [0x1D867]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9EB,
+ unicodeslot=0x1D867,
},
- [0x1D9EC]={
+ [0x1D868]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9EC,
+ unicodeslot=0x1D868,
},
- [0x1D9ED]={
+ [0x1D869]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9ED,
+ unicodeslot=0x1D869,
},
- [0x1D9EE]={
+ [0x1D86A]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9EE,
+ unicodeslot=0x1D86A,
},
- [0x1D9EF]={
+ [0x1D86B]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9EF,
+ unicodeslot=0x1D86B,
},
- [0x1D9F0]={
+ [0x1D86C]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9F0,
+ unicodeslot=0x1D86C,
},
- [0x1D9F1]={
+ [0x1D86D]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9F1,
+ unicodeslot=0x1D86D,
},
- [0x1D9F2]={
+ [0x1D86E]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9F2,
+ unicodeslot=0x1D86E,
},
- [0x1D9F3]={
+ [0x1D86F]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9F3,
+ unicodeslot=0x1D86F,
},
- [0x1D9F4]={
+ [0x1D870]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9F4,
+ unicodeslot=0x1D870,
},
- [0x1D9F5]={
+ [0x1D871]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9F5,
+ unicodeslot=0x1D871,
},
- [0x1D9F6]={
+ [0x1D872]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9F6,
+ unicodeslot=0x1D872,
},
- [0x1D9F7]={
+ [0x1D873]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9F7,
+ unicodeslot=0x1D873,
},
- [0x1D9F8]={
+ [0x1D874]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9F8,
+ unicodeslot=0x1D874,
},
- [0x1D9F9]={
+ [0x1D875]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9F9,
+ unicodeslot=0x1D875,
},
- [0x1D9FA]={
+ [0x1D876]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9FA,
+ unicodeslot=0x1D876,
},
- [0x1D9FB]={
+ [0x1D877]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9FB,
+ unicodeslot=0x1D877,
},
- [0x1D9FC]={
+ [0x1D878]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9FC,
+ unicodeslot=0x1D878,
},
- [0x1D9FD]={
+ [0x1D879]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9FD,
+ unicodeslot=0x1D879,
},
- [0x1D9FE]={
+ [0x1D87A]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9FE,
+ unicodeslot=0x1D87A,
},
- [0x1D9FF]={
+ [0x1D87B]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1D9FF,
+ unicodeslot=0x1D87B,
},
- [0x1DA00]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA00,
+ [0x1D87C]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D87C,
},
- [0x1DA01]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA01,
+ [0x1D87D]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D87D,
},
- [0x1DA02]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA02,
+ [0x1D87E]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D87E,
},
- [0x1DA03]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA03,
+ [0x1D87F]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D87F,
},
- [0x1DA04]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA04,
+ [0x1D880]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D880,
},
- [0x1DA05]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA05,
+ [0x1D881]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D881,
},
- [0x1DA06]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA06,
+ [0x1D882]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D882,
},
- [0x1DA07]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA07,
+ [0x1D883]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D883,
},
- [0x1DA08]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA08,
+ [0x1D884]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D884,
},
- [0x1DA09]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA09,
+ [0x1D885]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D885,
},
- [0x1DA0A]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA0A,
+ [0x1D886]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D886,
},
- [0x1DA0B]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA0B,
+ [0x1D887]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D887,
},
- [0x1DA0C]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA0C,
+ [0x1D888]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D888,
},
- [0x1DA0D]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA0D,
- },
- [0x1DA0E]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA0E,
- },
- [0x1DA0F]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA0F,
- },
- [0x1DA10]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA10,
- },
- [0x1DA11]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA11,
- },
- [0x1DA12]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA12,
- },
- [0x1DA13]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA13,
- },
- [0x1DA14]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA14,
- },
- [0x1DA15]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA15,
- },
- [0x1DA16]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA16,
- },
- [0x1DA17]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA17,
- },
- [0x1DA18]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA18,
- },
- [0x1DA19]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA19,
- },
- [0x1DA1A]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA1A,
- },
- [0x1DA1B]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA1B,
- },
- [0x1DA1C]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA1C,
- },
- [0x1DA1D]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA1D,
+ [0x1D889]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D889,
},
- [0x1DA1E]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA1E,
+ [0x1D88A]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D88A,
},
- [0x1DA1F]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA1F,
+ [0x1D88B]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D88B,
},
- [0x1DA20]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA20,
+ [0x1D88C]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D88C,
},
- [0x1DA21]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA21,
+ [0x1D88D]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D88D,
},
- [0x1DA22]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA22,
+ [0x1D88E]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D88E,
},
- [0x1DA23]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA23,
+ [0x1D88F]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D88F,
},
- [0x1DA24]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA24,
+ [0x1D890]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D890,
},
- [0x1DA25]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA25,
+ [0x1D891]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D891,
},
- [0x1DA26]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA26,
+ [0x1D892]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D892,
},
- [0x1DA27]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA27,
+ [0x1D893]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D893,
},
- [0x1DA28]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA28,
+ [0x1D894]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D894,
},
- [0x1DA29]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA29,
+ [0x1D895]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D895,
},
- [0x1DA2A]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA2A,
+ [0x1D896]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D896,
},
- [0x1DA2B]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA2B,
+ [0x1D897]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D897,
},
- [0x1DA2C]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA2C,
+ [0x1D898]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D898,
},
- [0x1DA2D]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA2D,
+ [0x1D899]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D899,
},
- [0x1DA2E]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA2E,
+ [0x1D89A]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D89A,
},
- [0x1DA2F]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA2F,
+ [0x1D89B]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D89B,
},
- [0x1DA30]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA30,
+ [0x1D89C]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D89C,
},
- [0x1DA31]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA31,
+ [0x1D89D]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D89D,
},
- [0x1DA32]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA32,
+ [0x1D89E]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D89E,
},
- [0x1DA33]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA33,
+ [0x1D89F]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D89F,
},
- [0x1DA34]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA34,
+ [0x1D8A0]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8A0,
},
- [0x1DA35]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA35,
+ [0x1D8A1]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8A1,
},
- [0x1DA36]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA36,
+ [0x1D8A2]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8A2,
},
- [0x1DA37]={
+ [0x1D8A3]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA37,
+ unicodeslot=0x1D8A3,
},
- [0x1DA38]={
+ [0x1D8A4]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA38,
+ unicodeslot=0x1D8A4,
},
- [0x1DA39]={
+ [0x1D8A5]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA39,
+ unicodeslot=0x1D8A5,
},
- [0x1DA3A]={
+ [0x1D8A6]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA3A,
+ unicodeslot=0x1D8A6,
},
- [0x1DA3B]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA3B,
+ [0x1D8A7]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8A7,
},
- [0x1DA3C]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA3C,
+ [0x1D8A8]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8A8,
},
- [0x1DA3D]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA3D,
+ [0x1D8A9]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8A9,
},
- [0x1DA3E]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA3E,
+ [0x1D8AA]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8AA,
},
- [0x1DA3F]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA3F,
+ [0x1D8AB]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8AB,
},
- [0x1DA40]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA40,
+ [0x1D8AC]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8AC,
},
- [0x1DA41]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA41,
+ [0x1D8AD]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8AD,
},
- [0x1DA42]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA42,
+ [0x1D8AE]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8AE,
},
- [0x1DA43]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA43,
+ [0x1D8AF]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8AF,
},
- [0x1DA44]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA44,
+ [0x1D8B0]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8B0,
},
- [0x1DA45]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA45,
+ [0x1D8B1]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8B1,
},
- [0x1DA46]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA46,
+ [0x1D8B2]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8B2,
},
- [0x1DA47]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA47,
+ [0x1D8B3]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8B3,
},
- [0x1DA48]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA48,
+ [0x1D8B4]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8B4,
},
- [0x1DA49]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA49,
+ [0x1D8B5]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8B5,
},
- [0x1DA4A]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA4A,
+ [0x1D8B6]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8B6,
},
- [0x1DA4B]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA4B,
+ [0x1D8B7]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8B7,
},
- [0x1DA4C]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA4C,
+ [0x1D8B8]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8B8,
},
- [0x1DA4D]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA4D,
+ [0x1D8B9]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8B9,
},
- [0x1DA4E]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA4E,
+ [0x1D8BA]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8BA,
},
- [0x1DA4F]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA4F,
+ [0x1D8BB]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8BB,
},
- [0x1DA50]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA50,
+ [0x1D8BC]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8BC,
},
- [0x1DA51]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA51,
+ [0x1D8BD]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8BD,
},
- [0x1DA52]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA52,
+ [0x1D8BE]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8BE,
},
- [0x1DA53]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA53,
+ [0x1D8BF]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8BF,
},
- [0x1DA54]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA54,
+ [0x1D8C0]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8C0,
},
- [0x1DA55]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA55,
+ [0x1D8C1]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8C1,
},
- [0x1DA56]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA56,
+ [0x1D8C2]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8C2,
},
- [0x1DA57]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA57,
+ [0x1D8C3]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8C3,
},
- [0x1DA58]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA58,
+ [0x1D8C4]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8C4,
},
- [0x1DA59]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA59,
+ [0x1D8C5]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8C5,
},
- [0x1DA5A]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA5A,
+ [0x1D8C6]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8C6,
},
- [0x1DA5B]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA5B,
+ [0x1D8C7]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8C7,
},
- [0x1DA5C]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA5C,
+ [0x1D8C8]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8C8,
},
- [0x1DA5D]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA5D,
+ [0x1D8C9]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8C9,
},
- [0x1DA5E]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA5E,
+ [0x1D8CA]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8CA,
},
- [0x1DA5F]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA5F,
+ [0x1D8CB]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8CB,
},
- [0x1DA60]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA60,
+ [0x1D8CC]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8CC,
},
- [0x1DA61]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA61,
+ [0x1D8CD]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8CD,
},
- [0x1DA62]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA62,
+ [0x1D8CE]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8CE,
},
- [0x1DA63]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA63,
+ [0x1D8CF]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8CF,
},
- [0x1DA64]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA64,
+ [0x1D8D0]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8D0,
},
- [0x1DA65]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA65,
+ [0x1D8D1]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8D1,
},
- [0x1DA66]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA66,
+ [0x1D8D2]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8D2,
},
- [0x1DA67]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA67,
+ [0x1D8D3]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8D3,
},
- [0x1DA68]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA68,
+ [0x1D8D4]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8D4,
},
- [0x1DA69]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA69,
+ [0x1D8D5]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8D5,
},
- [0x1DA6A]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA6A,
+ [0x1D8D6]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8D6,
},
- [0x1DA6B]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA6B,
+ [0x1D8D7]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8D7,
},
- [0x1DA6C]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA6C,
+ [0x1D8D8]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8D8,
},
- [0x1DA6D]={
+ [0x1D8D9]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA6D,
+ unicodeslot=0x1D8D9,
},
- [0x1DA6E]={
+ [0x1D8DA]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA6E,
+ unicodeslot=0x1D8DA,
},
- [0x1DA6F]={
+ [0x1D8DB]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA6F,
+ unicodeslot=0x1D8DB,
},
- [0x1DA70]={
+ [0x1D8DC]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA70,
+ unicodeslot=0x1D8DC,
},
- [0x1DA71]={
+ [0x1D8DD]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA71,
+ unicodeslot=0x1D8DD,
},
- [0x1DA72]={
+ [0x1D8DE]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA72,
+ unicodeslot=0x1D8DE,
},
- [0x1DA73]={
+ [0x1D8DF]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA73,
+ unicodeslot=0x1D8DF,
},
- [0x1DA74]={
+ [0x1D8E0]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA74,
+ unicodeslot=0x1D8E0,
},
- [0x1DA75]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA75,
+ [0x1D8E1]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8E1,
},
- [0x1DA76]={
+ [0x1D8E2]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA76,
+ unicodeslot=0x1D8E2,
},
- [0x1DA77]={
+ [0x1D8E3]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA77,
+ unicodeslot=0x1D8E3,
},
- [0x1DA78]={
+ [0x1D8E4]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA78,
+ unicodeslot=0x1D8E4,
},
- [0x1DA79]={
+ [0x1D8E5]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA79,
+ unicodeslot=0x1D8E5,
},
- [0x1DA7A]={
+ [0x1D8E6]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA7A,
+ unicodeslot=0x1D8E6,
},
- [0x1DA7B]={
+ [0x1D8E7]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA7B,
+ unicodeslot=0x1D8E7,
},
- [0x1DA7C]={
+ [0x1D8E8]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA7C,
+ unicodeslot=0x1D8E8,
},
- [0x1DA7D]={
+ [0x1D8E9]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA7D,
+ unicodeslot=0x1D8E9,
},
- [0x1DA7E]={
+ [0x1D8EA]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA7E,
+ unicodeslot=0x1D8EA,
},
- [0x1DA7F]={
+ [0x1D8EB]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA7F,
+ unicodeslot=0x1D8EB,
},
- [0x1DA80]={
+ [0x1D8EC]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA80,
+ unicodeslot=0x1D8EC,
},
- [0x1DA81]={
+ [0x1D8ED]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA81,
+ unicodeslot=0x1D8ED,
},
- [0x1DA82]={
+ [0x1D8EE]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA82,
+ unicodeslot=0x1D8EE,
},
- [0x1DA83]={
+ [0x1D8EF]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA83,
+ unicodeslot=0x1D8EF,
},
- [0x1DA84]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA84,
+ [0x1D8F0]={
+ category="so",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D8F0,
},
- [0x1DA85]={
+ [0x1D8F1]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA85,
+ unicodeslot=0x1D8F1,
},
- [0x1DA86]={
+ [0x1D8F2]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA86,
+ unicodeslot=0x1D8F2,
},
- [0x1DA87]={
- category="po",
+ [0x1D8F3]={
+ category="so",
direction="l",
- linebreak="ba",
- unicodeslot=0x1DA87,
+ linebreak="al",
+ unicodeslot=0x1D8F3,
},
- [0x1DA88]={
- category="po",
+ [0x1D8F4]={
+ category="so",
direction="l",
- linebreak="ba",
- unicodeslot=0x1DA88,
+ linebreak="al",
+ unicodeslot=0x1D8F4,
},
- [0x1DA89]={
- category="po",
+ [0x1D8F5]={
+ category="so",
direction="l",
- linebreak="ba",
- unicodeslot=0x1DA89,
+ linebreak="al",
+ unicodeslot=0x1D8F5,
},
- [0x1DA8A]={
- category="po",
+ [0x1D8F6]={
+ category="so",
direction="l",
- linebreak="ba",
- unicodeslot=0x1DA8A,
+ linebreak="al",
+ unicodeslot=0x1D8F6,
},
- [0x1DA8B]={
- category="po",
+ [0x1D8F7]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1DA8B,
+ unicodeslot=0x1D8F7,
},
- [0x1DA9B]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA9B,
- },
- [0x1DA9C]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA9C,
- },
- [0x1DA9D]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA9D,
- },
- [0x1DA9E]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA9E,
- },
- [0x1DA9F]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DA9F,
- },
- [0x1DAA1]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DAA1,
- },
- [0x1DAA2]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DAA2,
- },
- [0x1DAA3]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DAA3,
- },
- [0x1DAA4]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DAA4,
- },
- [0x1DAA5]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DAA5,
- },
- [0x1DAA6]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DAA6,
- },
- [0x1DAA7]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DAA7,
- },
- [0x1DAA8]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DAA8,
- },
- [0x1DAA9]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DAA9,
- },
- [0x1DAAA]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DAAA,
- },
- [0x1DAAB]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DAAB,
- },
- [0x1DAAC]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DAAC,
- },
- [0x1DAAD]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DAAD,
- },
- [0x1DAAE]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DAAE,
- },
- [0x1DAAF]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1DAAF,
- },
- [0x1E000]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E000,
- },
- [0x1E001]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E001,
- },
- [0x1E002]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E002,
- },
- [0x1E003]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E003,
- },
- [0x1E004]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E004,
- },
- [0x1E005]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E005,
- },
- [0x1E006]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E006,
- },
- [0x1E008]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E008,
- },
- [0x1E009]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E009,
- },
- [0x1E00A]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E00A,
- },
- [0x1E00B]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E00B,
- },
- [0x1E00C]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E00C,
- },
- [0x1E00D]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E00D,
- },
- [0x1E00E]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E00E,
- },
- [0x1E00F]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E00F,
- },
- [0x1E010]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E010,
- },
- [0x1E011]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E011,
- },
- [0x1E012]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E012,
- },
- [0x1E013]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E013,
- },
- [0x1E014]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E014,
- },
- [0x1E015]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E015,
- },
- [0x1E016]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E016,
- },
- [0x1E017]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E017,
- },
- [0x1E018]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E018,
- },
- [0x1E01B]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E01B,
- },
- [0x1E01C]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E01C,
- },
- [0x1E01D]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E01D,
- },
- [0x1E01E]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E01E,
- },
- [0x1E01F]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E01F,
- },
- [0x1E020]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E020,
- },
- [0x1E021]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E021,
- },
- [0x1E023]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E023,
- },
- [0x1E024]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E024,
- },
- [0x1E026]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E026,
- },
- [0x1E027]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E027,
- },
- [0x1E028]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E028,
- },
- [0x1E029]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E029,
- },
- [0x1E02A]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E02A,
- },
- [0x1E100]={
- category="lo",
+ [0x1D8F8]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E100,
+ unicodeslot=0x1D8F8,
},
- [0x1E101]={
- category="lo",
+ [0x1D8F9]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E101,
+ unicodeslot=0x1D8F9,
},
- [0x1E102]={
- category="lo",
+ [0x1D8FA]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E102,
+ unicodeslot=0x1D8FA,
},
- [0x1E103]={
- category="lo",
+ [0x1D8FB]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E103,
+ unicodeslot=0x1D8FB,
},
- [0x1E104]={
- category="lo",
+ [0x1D8FC]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E104,
+ unicodeslot=0x1D8FC,
},
- [0x1E105]={
- category="lo",
+ [0x1D8FD]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E105,
+ unicodeslot=0x1D8FD,
},
- [0x1E106]={
- category="lo",
+ [0x1D8FE]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E106,
+ unicodeslot=0x1D8FE,
},
- [0x1E107]={
- category="lo",
+ [0x1D8FF]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E107,
+ unicodeslot=0x1D8FF,
},
- [0x1E108]={
- category="lo",
+ [0x1D900]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E108,
+ unicodeslot=0x1D900,
},
- [0x1E109]={
- category="lo",
+ [0x1D901]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E109,
+ unicodeslot=0x1D901,
},
- [0x1E10A]={
- category="lo",
+ [0x1D902]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E10A,
+ unicodeslot=0x1D902,
},
- [0x1E10B]={
- category="lo",
+ [0x1D903]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E10B,
+ unicodeslot=0x1D903,
},
- [0x1E10C]={
- category="lo",
+ [0x1D904]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E10C,
+ unicodeslot=0x1D904,
},
- [0x1E10D]={
- category="lo",
+ [0x1D905]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E10D,
+ unicodeslot=0x1D905,
},
- [0x1E10E]={
- category="lo",
+ [0x1D906]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E10E,
+ unicodeslot=0x1D906,
},
- [0x1E10F]={
- category="lo",
+ [0x1D907]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E10F,
+ unicodeslot=0x1D907,
},
- [0x1E110]={
- category="lo",
+ [0x1D908]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E110,
+ unicodeslot=0x1D908,
},
- [0x1E111]={
- category="lo",
+ [0x1D909]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E111,
+ unicodeslot=0x1D909,
},
- [0x1E112]={
- category="lo",
+ [0x1D90A]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E112,
+ unicodeslot=0x1D90A,
},
- [0x1E113]={
- category="lo",
+ [0x1D90B]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E113,
+ unicodeslot=0x1D90B,
},
- [0x1E114]={
- category="lo",
+ [0x1D90C]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E114,
+ unicodeslot=0x1D90C,
},
- [0x1E115]={
- category="lo",
+ [0x1D90D]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E115,
+ unicodeslot=0x1D90D,
},
- [0x1E116]={
- category="lo",
+ [0x1D90E]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E116,
+ unicodeslot=0x1D90E,
},
- [0x1E117]={
- category="lo",
+ [0x1D90F]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E117,
+ unicodeslot=0x1D90F,
},
- [0x1E118]={
- category="lo",
+ [0x1D910]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E118,
+ unicodeslot=0x1D910,
},
- [0x1E119]={
- category="lo",
+ [0x1D911]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E119,
+ unicodeslot=0x1D911,
},
- [0x1E11A]={
- category="lo",
+ [0x1D912]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E11A,
+ unicodeslot=0x1D912,
},
- [0x1E11B]={
- category="lo",
+ [0x1D913]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E11B,
+ unicodeslot=0x1D913,
},
- [0x1E11C]={
- category="lo",
+ [0x1D914]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E11C,
+ unicodeslot=0x1D914,
},
- [0x1E11D]={
- category="lo",
+ [0x1D915]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E11D,
+ unicodeslot=0x1D915,
},
- [0x1E11E]={
- category="lo",
+ [0x1D916]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E11E,
+ unicodeslot=0x1D916,
},
- [0x1E11F]={
- category="lo",
+ [0x1D917]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E11F,
+ unicodeslot=0x1D917,
},
- [0x1E120]={
- category="lo",
+ [0x1D918]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E120,
+ unicodeslot=0x1D918,
},
- [0x1E121]={
- category="lo",
+ [0x1D919]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E121,
+ unicodeslot=0x1D919,
},
- [0x1E122]={
- category="lo",
+ [0x1D91A]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E122,
+ unicodeslot=0x1D91A,
},
- [0x1E123]={
- category="lo",
+ [0x1D91B]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E123,
+ unicodeslot=0x1D91B,
},
- [0x1E124]={
- category="lo",
+ [0x1D91C]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E124,
+ unicodeslot=0x1D91C,
},
- [0x1E125]={
- category="lo",
+ [0x1D91D]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E125,
+ unicodeslot=0x1D91D,
},
- [0x1E126]={
- category="lo",
+ [0x1D91E]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E126,
+ unicodeslot=0x1D91E,
},
- [0x1E127]={
- category="lo",
+ [0x1D91F]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E127,
+ unicodeslot=0x1D91F,
},
- [0x1E128]={
- category="lo",
+ [0x1D920]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E128,
+ unicodeslot=0x1D920,
},
- [0x1E129]={
- category="lo",
+ [0x1D921]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E129,
+ unicodeslot=0x1D921,
},
- [0x1E12A]={
- category="lo",
+ [0x1D922]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E12A,
+ unicodeslot=0x1D922,
},
- [0x1E12B]={
- category="lo",
+ [0x1D923]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E12B,
+ unicodeslot=0x1D923,
},
- [0x1E12C]={
- category="lo",
+ [0x1D924]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E12C,
- },
- [0x1E130]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E130,
- },
- [0x1E131]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E131,
- },
- [0x1E132]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E132,
- },
- [0x1E133]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E133,
- },
- [0x1E134]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E134,
- },
- [0x1E135]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E135,
- },
- [0x1E136]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E136,
+ unicodeslot=0x1D924,
},
- [0x1E137]={
- category="lm",
+ [0x1D925]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E137,
+ unicodeslot=0x1D925,
},
- [0x1E138]={
- category="lm",
+ [0x1D926]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E138,
+ unicodeslot=0x1D926,
},
- [0x1E139]={
- category="lm",
+ [0x1D927]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E139,
+ unicodeslot=0x1D927,
},
- [0x1E13A]={
- category="lm",
+ [0x1D928]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E13A,
+ unicodeslot=0x1D928,
},
- [0x1E13B]={
- category="lm",
+ [0x1D929]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E13B,
+ unicodeslot=0x1D929,
},
- [0x1E13C]={
- category="lm",
+ [0x1D92A]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E13C,
+ unicodeslot=0x1D92A,
},
- [0x1E13D]={
- category="lm",
+ [0x1D92B]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E13D,
+ unicodeslot=0x1D92B,
},
- [0x1E140]={
- category="nd",
+ [0x1D92C]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E140,
+ linebreak="al",
+ unicodeslot=0x1D92C,
},
- [0x1E141]={
- category="nd",
+ [0x1D92D]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E141,
+ linebreak="al",
+ unicodeslot=0x1D92D,
},
- [0x1E142]={
- category="nd",
+ [0x1D92E]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E142,
+ linebreak="al",
+ unicodeslot=0x1D92E,
},
- [0x1E143]={
- category="nd",
+ [0x1D92F]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E143,
+ linebreak="al",
+ unicodeslot=0x1D92F,
},
- [0x1E144]={
- category="nd",
+ [0x1D930]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E144,
+ linebreak="al",
+ unicodeslot=0x1D930,
},
- [0x1E145]={
- category="nd",
+ [0x1D931]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E145,
+ linebreak="al",
+ unicodeslot=0x1D931,
},
- [0x1E146]={
- category="nd",
+ [0x1D932]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E146,
+ linebreak="al",
+ unicodeslot=0x1D932,
},
- [0x1E147]={
- category="nd",
+ [0x1D933]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E147,
+ linebreak="al",
+ unicodeslot=0x1D933,
},
- [0x1E148]={
- category="nd",
+ [0x1D934]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E148,
+ linebreak="al",
+ unicodeslot=0x1D934,
},
- [0x1E149]={
- category="nd",
+ [0x1D935]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E149,
+ linebreak="al",
+ unicodeslot=0x1D935,
},
- [0x1E14E]={
- category="lo",
+ [0x1D936]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E14E,
+ unicodeslot=0x1D936,
},
- [0x1E14F]={
+ [0x1D937]={
category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E14F,
+ unicodeslot=0x1D937,
},
- [0x1E2C0]={
- category="lo",
+ [0x1D938]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2C0,
+ unicodeslot=0x1D938,
},
- [0x1E2C1]={
- category="lo",
+ [0x1D939]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2C1,
+ unicodeslot=0x1D939,
},
- [0x1E2C2]={
- category="lo",
+ [0x1D93A]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2C2,
+ unicodeslot=0x1D93A,
},
- [0x1E2C3]={
- category="lo",
+ [0x1D93B]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2C3,
+ unicodeslot=0x1D93B,
},
- [0x1E2C4]={
- category="lo",
+ [0x1D93C]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2C4,
+ unicodeslot=0x1D93C,
},
- [0x1E2C5]={
- category="lo",
+ [0x1D93D]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2C5,
+ unicodeslot=0x1D93D,
},
- [0x1E2C6]={
- category="lo",
+ [0x1D93E]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2C6,
+ unicodeslot=0x1D93E,
},
- [0x1E2C7]={
- category="lo",
+ [0x1D93F]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2C7,
+ unicodeslot=0x1D93F,
},
- [0x1E2C8]={
- category="lo",
+ [0x1D940]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2C8,
+ unicodeslot=0x1D940,
},
- [0x1E2C9]={
- category="lo",
+ [0x1D941]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2C9,
+ unicodeslot=0x1D941,
},
- [0x1E2CA]={
- category="lo",
+ [0x1D942]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2CA,
+ unicodeslot=0x1D942,
},
- [0x1E2CB]={
- category="lo",
+ [0x1D943]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2CB,
+ unicodeslot=0x1D943,
},
- [0x1E2CC]={
- category="lo",
+ [0x1D944]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2CC,
+ unicodeslot=0x1D944,
},
- [0x1E2CD]={
- category="lo",
+ [0x1D945]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2CD,
+ unicodeslot=0x1D945,
},
- [0x1E2CE]={
- category="lo",
+ [0x1D946]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2CE,
+ unicodeslot=0x1D946,
},
- [0x1E2CF]={
- category="lo",
+ [0x1D947]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2CF,
+ unicodeslot=0x1D947,
},
- [0x1E2D0]={
- category="lo",
+ [0x1D948]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2D0,
+ unicodeslot=0x1D948,
},
- [0x1E2D1]={
- category="lo",
+ [0x1D949]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2D1,
+ unicodeslot=0x1D949,
},
- [0x1E2D2]={
- category="lo",
+ [0x1D94A]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2D2,
+ unicodeslot=0x1D94A,
},
- [0x1E2D3]={
- category="lo",
+ [0x1D94B]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2D3,
+ unicodeslot=0x1D94B,
},
- [0x1E2D4]={
- category="lo",
+ [0x1D94C]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2D4,
+ unicodeslot=0x1D94C,
},
- [0x1E2D5]={
- category="lo",
+ [0x1D94D]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2D5,
+ unicodeslot=0x1D94D,
},
- [0x1E2D6]={
- category="lo",
+ [0x1D94E]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2D6,
+ unicodeslot=0x1D94E,
},
- [0x1E2D7]={
- category="lo",
+ [0x1D94F]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2D7,
+ unicodeslot=0x1D94F,
},
- [0x1E2D8]={
- category="lo",
+ [0x1D950]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2D8,
+ unicodeslot=0x1D950,
},
- [0x1E2D9]={
- category="lo",
+ [0x1D951]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2D9,
+ unicodeslot=0x1D951,
},
- [0x1E2DA]={
- category="lo",
+ [0x1D952]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2DA,
+ unicodeslot=0x1D952,
},
- [0x1E2DB]={
- category="lo",
+ [0x1D953]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2DB,
+ unicodeslot=0x1D953,
},
- [0x1E2DC]={
- category="lo",
+ [0x1D954]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2DC,
+ unicodeslot=0x1D954,
},
- [0x1E2DD]={
- category="lo",
+ [0x1D955]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2DD,
+ unicodeslot=0x1D955,
},
- [0x1E2DE]={
- category="lo",
+ [0x1D956]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2DE,
+ unicodeslot=0x1D956,
},
- [0x1E2DF]={
- category="lo",
+ [0x1D957]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2DF,
+ unicodeslot=0x1D957,
},
- [0x1E2E0]={
- category="lo",
+ [0x1D958]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2E0,
+ unicodeslot=0x1D958,
},
- [0x1E2E1]={
- category="lo",
+ [0x1D959]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2E1,
+ unicodeslot=0x1D959,
},
- [0x1E2E2]={
- category="lo",
+ [0x1D95A]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2E2,
+ unicodeslot=0x1D95A,
},
- [0x1E2E3]={
- category="lo",
+ [0x1D95B]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2E3,
+ unicodeslot=0x1D95B,
},
- [0x1E2E4]={
- category="lo",
+ [0x1D95C]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2E4,
+ unicodeslot=0x1D95C,
},
- [0x1E2E5]={
- category="lo",
+ [0x1D95D]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2E5,
+ unicodeslot=0x1D95D,
},
- [0x1E2E6]={
- category="lo",
+ [0x1D95E]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2E6,
+ unicodeslot=0x1D95E,
},
- [0x1E2E7]={
- category="lo",
+ [0x1D95F]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2E7,
+ unicodeslot=0x1D95F,
},
- [0x1E2E8]={
- category="lo",
+ [0x1D960]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2E8,
+ unicodeslot=0x1D960,
},
- [0x1E2E9]={
- category="lo",
+ [0x1D961]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2E9,
+ unicodeslot=0x1D961,
},
- [0x1E2EA]={
- category="lo",
+ [0x1D962]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2EA,
+ unicodeslot=0x1D962,
},
- [0x1E2EB]={
- category="lo",
+ [0x1D963]={
+ category="so",
direction="l",
linebreak="al",
- unicodeslot=0x1E2EB,
- },
- [0x1E2EC]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E2EC,
- },
- [0x1E2ED]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E2ED,
- },
- [0x1E2EE]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E2EE,
- },
- [0x1E2EF]={
- category="mn",
- direction="nsm",
- linebreak="cm",
- unicodeslot=0x1E2EF,
+ unicodeslot=0x1D963,
},
- [0x1E2F0]={
- category="nd",
+ [0x1D964]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E2F0,
+ linebreak="al",
+ unicodeslot=0x1D964,
},
- [0x1E2F1]={
- category="nd",
+ [0x1D965]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E2F1,
+ linebreak="al",
+ unicodeslot=0x1D965,
},
- [0x1E2F2]={
- category="nd",
+ [0x1D966]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E2F2,
+ linebreak="al",
+ unicodeslot=0x1D966,
},
- [0x1E2F3]={
- category="nd",
+ [0x1D967]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E2F3,
+ linebreak="al",
+ unicodeslot=0x1D967,
},
- [0x1E2F4]={
- category="nd",
+ [0x1D968]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E2F4,
+ linebreak="al",
+ unicodeslot=0x1D968,
},
- [0x1E2F5]={
- category="nd",
+ [0x1D969]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E2F5,
+ linebreak="al",
+ unicodeslot=0x1D969,
},
- [0x1E2F6]={
- category="nd",
+ [0x1D96A]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E2F6,
+ linebreak="al",
+ unicodeslot=0x1D96A,
},
- [0x1E2F7]={
- category="nd",
+ [0x1D96B]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E2F7,
+ linebreak="al",
+ unicodeslot=0x1D96B,
},
- [0x1E2F8]={
- category="nd",
+ [0x1D96C]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E2F8,
+ linebreak="al",
+ unicodeslot=0x1D96C,
},
- [0x1E2F9]={
- category="nd",
+ [0x1D96D]={
+ category="so",
direction="l",
- linebreak="nu",
- unicodeslot=0x1E2F9,
- },
- [0x1E2FF]={
- category="sc",
- direction="et",
- linebreak="pr",
- unicodeslot=0x1E2FF,
- },
- [0x1E800]={
- category="lo",
- direction="r",
linebreak="al",
- unicodeslot=0x1E800,
+ unicodeslot=0x1D96D,
},
- [0x1E801]={
- category="lo",
- direction="r",
+ [0x1D96E]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E801,
+ unicodeslot=0x1D96E,
},
- [0x1E802]={
- category="lo",
- direction="r",
+ [0x1D96F]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E802,
+ unicodeslot=0x1D96F,
},
- [0x1E803]={
- category="lo",
- direction="r",
+ [0x1D970]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E803,
+ unicodeslot=0x1D970,
},
- [0x1E804]={
- category="lo",
- direction="r",
+ [0x1D971]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E804,
+ unicodeslot=0x1D971,
},
- [0x1E805]={
- category="lo",
- direction="r",
+ [0x1D972]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E805,
+ unicodeslot=0x1D972,
},
- [0x1E806]={
- category="lo",
- direction="r",
+ [0x1D973]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E806,
+ unicodeslot=0x1D973,
},
- [0x1E807]={
- category="lo",
- direction="r",
+ [0x1D974]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E807,
+ unicodeslot=0x1D974,
},
- [0x1E808]={
- category="lo",
- direction="r",
+ [0x1D975]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E808,
+ unicodeslot=0x1D975,
},
- [0x1E809]={
- category="lo",
- direction="r",
+ [0x1D976]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E809,
+ unicodeslot=0x1D976,
},
- [0x1E80A]={
- category="lo",
- direction="r",
+ [0x1D977]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E80A,
+ unicodeslot=0x1D977,
},
- [0x1E80B]={
- category="lo",
- direction="r",
+ [0x1D978]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E80B,
+ unicodeslot=0x1D978,
},
- [0x1E80C]={
- category="lo",
- direction="r",
+ [0x1D979]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E80C,
+ unicodeslot=0x1D979,
},
- [0x1E80D]={
- category="lo",
- direction="r",
+ [0x1D97A]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E80D,
+ unicodeslot=0x1D97A,
},
- [0x1E80E]={
- category="lo",
- direction="r",
+ [0x1D97B]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E80E,
+ unicodeslot=0x1D97B,
},
- [0x1E80F]={
- category="lo",
- direction="r",
+ [0x1D97C]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E80F,
+ unicodeslot=0x1D97C,
},
- [0x1E810]={
- category="lo",
- direction="r",
+ [0x1D97D]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E810,
+ unicodeslot=0x1D97D,
},
- [0x1E811]={
- category="lo",
- direction="r",
+ [0x1D97E]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E811,
+ unicodeslot=0x1D97E,
},
- [0x1E812]={
- category="lo",
- direction="r",
+ [0x1D97F]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E812,
+ unicodeslot=0x1D97F,
},
- [0x1E813]={
- category="lo",
- direction="r",
+ [0x1D980]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E813,
+ unicodeslot=0x1D980,
},
- [0x1E814]={
- category="lo",
- direction="r",
+ [0x1D981]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E814,
+ unicodeslot=0x1D981,
},
- [0x1E815]={
- category="lo",
- direction="r",
+ [0x1D982]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E815,
+ unicodeslot=0x1D982,
},
- [0x1E816]={
- category="lo",
- direction="r",
+ [0x1D983]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E816,
+ unicodeslot=0x1D983,
},
- [0x1E817]={
- category="lo",
- direction="r",
+ [0x1D984]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E817,
+ unicodeslot=0x1D984,
},
- [0x1E818]={
- category="lo",
- direction="r",
+ [0x1D985]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E818,
+ unicodeslot=0x1D985,
},
- [0x1E819]={
- category="lo",
- direction="r",
+ [0x1D986]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E819,
+ unicodeslot=0x1D986,
},
- [0x1E81A]={
- category="lo",
- direction="r",
+ [0x1D987]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E81A,
+ unicodeslot=0x1D987,
},
- [0x1E81B]={
- category="lo",
- direction="r",
+ [0x1D988]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E81B,
+ unicodeslot=0x1D988,
},
- [0x1E81C]={
- category="lo",
- direction="r",
+ [0x1D989]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E81C,
+ unicodeslot=0x1D989,
},
- [0x1E81D]={
- category="lo",
- direction="r",
+ [0x1D98A]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E81D,
+ unicodeslot=0x1D98A,
},
- [0x1E81E]={
- category="lo",
- direction="r",
+ [0x1D98B]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E81E,
+ unicodeslot=0x1D98B,
},
- [0x1E81F]={
- category="lo",
- direction="r",
+ [0x1D98C]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E81F,
+ unicodeslot=0x1D98C,
},
- [0x1E820]={
- category="lo",
- direction="r",
+ [0x1D98D]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E820,
+ unicodeslot=0x1D98D,
},
- [0x1E821]={
- category="lo",
- direction="r",
+ [0x1D98E]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E821,
+ unicodeslot=0x1D98E,
},
- [0x1E822]={
- category="lo",
- direction="r",
+ [0x1D98F]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E822,
+ unicodeslot=0x1D98F,
},
- [0x1E823]={
- category="lo",
- direction="r",
+ [0x1D990]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E823,
+ unicodeslot=0x1D990,
},
- [0x1E824]={
- category="lo",
- direction="r",
+ [0x1D991]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E824,
+ unicodeslot=0x1D991,
},
- [0x1E825]={
- category="lo",
- direction="r",
+ [0x1D992]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E825,
+ unicodeslot=0x1D992,
},
- [0x1E826]={
- category="lo",
- direction="r",
+ [0x1D993]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E826,
+ unicodeslot=0x1D993,
},
- [0x1E827]={
- category="lo",
- direction="r",
+ [0x1D994]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E827,
+ unicodeslot=0x1D994,
},
- [0x1E828]={
- category="lo",
- direction="r",
+ [0x1D995]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E828,
+ unicodeslot=0x1D995,
},
- [0x1E829]={
- category="lo",
- direction="r",
+ [0x1D996]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E829,
+ unicodeslot=0x1D996,
},
- [0x1E82A]={
- category="lo",
- direction="r",
+ [0x1D997]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E82A,
+ unicodeslot=0x1D997,
},
- [0x1E82B]={
- category="lo",
- direction="r",
+ [0x1D998]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E82B,
+ unicodeslot=0x1D998,
},
- [0x1E82C]={
- category="lo",
- direction="r",
+ [0x1D999]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E82C,
+ unicodeslot=0x1D999,
},
- [0x1E82D]={
- category="lo",
- direction="r",
+ [0x1D99A]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E82D,
+ unicodeslot=0x1D99A,
},
- [0x1E82E]={
- category="lo",
- direction="r",
+ [0x1D99B]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E82E,
+ unicodeslot=0x1D99B,
},
- [0x1E82F]={
- category="lo",
- direction="r",
+ [0x1D99C]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E82F,
+ unicodeslot=0x1D99C,
},
- [0x1E830]={
- category="lo",
- direction="r",
+ [0x1D99D]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E830,
+ unicodeslot=0x1D99D,
},
- [0x1E831]={
- category="lo",
- direction="r",
+ [0x1D99E]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E831,
+ unicodeslot=0x1D99E,
},
- [0x1E832]={
- category="lo",
- direction="r",
+ [0x1D99F]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E832,
+ unicodeslot=0x1D99F,
},
- [0x1E833]={
- category="lo",
- direction="r",
+ [0x1D9A0]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E833,
+ unicodeslot=0x1D9A0,
},
- [0x1E834]={
- category="lo",
- direction="r",
+ [0x1D9A1]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E834,
+ unicodeslot=0x1D9A1,
},
- [0x1E835]={
- category="lo",
- direction="r",
+ [0x1D9A2]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E835,
+ unicodeslot=0x1D9A2,
},
- [0x1E836]={
- category="lo",
- direction="r",
+ [0x1D9A3]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E836,
+ unicodeslot=0x1D9A3,
},
- [0x1E837]={
- category="lo",
- direction="r",
+ [0x1D9A4]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E837,
+ unicodeslot=0x1D9A4,
},
- [0x1E838]={
- category="lo",
- direction="r",
+ [0x1D9A5]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E838,
+ unicodeslot=0x1D9A5,
},
- [0x1E839]={
- category="lo",
- direction="r",
+ [0x1D9A6]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E839,
+ unicodeslot=0x1D9A6,
},
- [0x1E83A]={
- category="lo",
- direction="r",
+ [0x1D9A7]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E83A,
+ unicodeslot=0x1D9A7,
},
- [0x1E83B]={
- category="lo",
- direction="r",
+ [0x1D9A8]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E83B,
+ unicodeslot=0x1D9A8,
},
- [0x1E83C]={
- category="lo",
- direction="r",
+ [0x1D9A9]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E83C,
+ unicodeslot=0x1D9A9,
},
- [0x1E83D]={
- category="lo",
- direction="r",
+ [0x1D9AA]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E83D,
+ unicodeslot=0x1D9AA,
},
- [0x1E83E]={
- category="lo",
- direction="r",
+ [0x1D9AB]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E83E,
+ unicodeslot=0x1D9AB,
},
- [0x1E83F]={
- category="lo",
- direction="r",
+ [0x1D9AC]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E83F,
+ unicodeslot=0x1D9AC,
},
- [0x1E840]={
- category="lo",
- direction="r",
+ [0x1D9AD]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E840,
+ unicodeslot=0x1D9AD,
},
- [0x1E841]={
- category="lo",
- direction="r",
+ [0x1D9AE]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E841,
+ unicodeslot=0x1D9AE,
},
- [0x1E842]={
- category="lo",
- direction="r",
+ [0x1D9AF]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E842,
+ unicodeslot=0x1D9AF,
},
- [0x1E843]={
- category="lo",
- direction="r",
+ [0x1D9B0]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E843,
+ unicodeslot=0x1D9B0,
},
- [0x1E844]={
- category="lo",
- direction="r",
+ [0x1D9B1]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E844,
+ unicodeslot=0x1D9B1,
},
- [0x1E845]={
- category="lo",
- direction="r",
+ [0x1D9B2]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E845,
+ unicodeslot=0x1D9B2,
},
- [0x1E846]={
- category="lo",
- direction="r",
+ [0x1D9B3]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E846,
+ unicodeslot=0x1D9B3,
},
- [0x1E847]={
- category="lo",
- direction="r",
+ [0x1D9B4]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E847,
+ unicodeslot=0x1D9B4,
},
- [0x1E848]={
- category="lo",
- direction="r",
+ [0x1D9B5]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E848,
+ unicodeslot=0x1D9B5,
},
- [0x1E849]={
- category="lo",
- direction="r",
+ [0x1D9B6]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E849,
+ unicodeslot=0x1D9B6,
},
- [0x1E84A]={
- category="lo",
- direction="r",
+ [0x1D9B7]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E84A,
+ unicodeslot=0x1D9B7,
},
- [0x1E84B]={
- category="lo",
- direction="r",
+ [0x1D9B8]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E84B,
+ unicodeslot=0x1D9B8,
},
- [0x1E84C]={
- category="lo",
- direction="r",
+ [0x1D9B9]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E84C,
+ unicodeslot=0x1D9B9,
},
- [0x1E84D]={
- category="lo",
- direction="r",
+ [0x1D9BA]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E84D,
+ unicodeslot=0x1D9BA,
},
- [0x1E84E]={
- category="lo",
- direction="r",
+ [0x1D9BB]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E84E,
+ unicodeslot=0x1D9BB,
},
- [0x1E84F]={
- category="lo",
- direction="r",
+ [0x1D9BC]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E84F,
+ unicodeslot=0x1D9BC,
},
- [0x1E850]={
- category="lo",
- direction="r",
+ [0x1D9BD]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E850,
+ unicodeslot=0x1D9BD,
},
- [0x1E851]={
- category="lo",
- direction="r",
+ [0x1D9BE]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E851,
+ unicodeslot=0x1D9BE,
},
- [0x1E852]={
- category="lo",
- direction="r",
+ [0x1D9BF]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E852,
+ unicodeslot=0x1D9BF,
},
- [0x1E853]={
- category="lo",
- direction="r",
+ [0x1D9C0]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E853,
+ unicodeslot=0x1D9C0,
},
- [0x1E854]={
- category="lo",
- direction="r",
+ [0x1D9C1]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E854,
+ unicodeslot=0x1D9C1,
},
- [0x1E855]={
- category="lo",
- direction="r",
+ [0x1D9C2]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E855,
+ unicodeslot=0x1D9C2,
},
- [0x1E856]={
- category="lo",
- direction="r",
+ [0x1D9C3]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E856,
+ unicodeslot=0x1D9C3,
},
- [0x1E857]={
- category="lo",
- direction="r",
+ [0x1D9C4]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E857,
+ unicodeslot=0x1D9C4,
},
- [0x1E858]={
- category="lo",
- direction="r",
+ [0x1D9C5]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E858,
+ unicodeslot=0x1D9C5,
},
- [0x1E859]={
- category="lo",
- direction="r",
+ [0x1D9C6]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E859,
+ unicodeslot=0x1D9C6,
},
- [0x1E85A]={
- category="lo",
- direction="r",
+ [0x1D9C7]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E85A,
+ unicodeslot=0x1D9C7,
},
- [0x1E85B]={
- category="lo",
- direction="r",
+ [0x1D9C8]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E85B,
+ unicodeslot=0x1D9C8,
},
- [0x1E85C]={
- category="lo",
- direction="r",
+ [0x1D9C9]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E85C,
+ unicodeslot=0x1D9C9,
},
- [0x1E85D]={
- category="lo",
- direction="r",
+ [0x1D9CA]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E85D,
+ unicodeslot=0x1D9CA,
},
- [0x1E85E]={
- category="lo",
- direction="r",
+ [0x1D9CB]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E85E,
+ unicodeslot=0x1D9CB,
},
- [0x1E85F]={
- category="lo",
- direction="r",
+ [0x1D9CC]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E85F,
+ unicodeslot=0x1D9CC,
},
- [0x1E860]={
- category="lo",
- direction="r",
+ [0x1D9CD]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E860,
+ unicodeslot=0x1D9CD,
},
- [0x1E861]={
- category="lo",
- direction="r",
+ [0x1D9CE]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E861,
+ unicodeslot=0x1D9CE,
},
- [0x1E862]={
- category="lo",
- direction="r",
+ [0x1D9CF]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E862,
+ unicodeslot=0x1D9CF,
},
- [0x1E863]={
- category="lo",
- direction="r",
+ [0x1D9D0]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E863,
+ unicodeslot=0x1D9D0,
},
- [0x1E864]={
- category="lo",
- direction="r",
+ [0x1D9D1]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E864,
+ unicodeslot=0x1D9D1,
},
- [0x1E865]={
- category="lo",
- direction="r",
+ [0x1D9D2]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E865,
+ unicodeslot=0x1D9D2,
},
- [0x1E866]={
- category="lo",
- direction="r",
+ [0x1D9D3]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E866,
+ unicodeslot=0x1D9D3,
},
- [0x1E867]={
- category="lo",
- direction="r",
+ [0x1D9D4]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E867,
+ unicodeslot=0x1D9D4,
},
- [0x1E868]={
- category="lo",
- direction="r",
+ [0x1D9D5]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E868,
+ unicodeslot=0x1D9D5,
},
- [0x1E869]={
- category="lo",
- direction="r",
+ [0x1D9D6]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E869,
+ unicodeslot=0x1D9D6,
},
- [0x1E86A]={
- category="lo",
- direction="r",
+ [0x1D9D7]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E86A,
+ unicodeslot=0x1D9D7,
},
- [0x1E86B]={
- category="lo",
- direction="r",
+ [0x1D9D8]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E86B,
+ unicodeslot=0x1D9D8,
},
- [0x1E86C]={
- category="lo",
- direction="r",
+ [0x1D9D9]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E86C,
+ unicodeslot=0x1D9D9,
},
- [0x1E86D]={
- category="lo",
- direction="r",
+ [0x1D9DA]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E86D,
+ unicodeslot=0x1D9DA,
},
- [0x1E86E]={
- category="lo",
- direction="r",
+ [0x1D9DB]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E86E,
+ unicodeslot=0x1D9DB,
},
- [0x1E86F]={
- category="lo",
- direction="r",
+ [0x1D9DC]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E86F,
+ unicodeslot=0x1D9DC,
},
- [0x1E870]={
- category="lo",
- direction="r",
+ [0x1D9DD]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E870,
+ unicodeslot=0x1D9DD,
},
- [0x1E871]={
- category="lo",
- direction="r",
+ [0x1D9DE]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E871,
+ unicodeslot=0x1D9DE,
},
- [0x1E872]={
- category="lo",
- direction="r",
+ [0x1D9DF]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E872,
+ unicodeslot=0x1D9DF,
},
- [0x1E873]={
- category="lo",
- direction="r",
+ [0x1D9E0]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E873,
+ unicodeslot=0x1D9E0,
},
- [0x1E874]={
- category="lo",
- direction="r",
+ [0x1D9E1]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E874,
+ unicodeslot=0x1D9E1,
},
- [0x1E875]={
- category="lo",
- direction="r",
+ [0x1D9E2]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E875,
+ unicodeslot=0x1D9E2,
},
- [0x1E876]={
- category="lo",
- direction="r",
+ [0x1D9E3]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E876,
+ unicodeslot=0x1D9E3,
},
- [0x1E877]={
- category="lo",
- direction="r",
+ [0x1D9E4]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E877,
+ unicodeslot=0x1D9E4,
},
- [0x1E878]={
- category="lo",
- direction="r",
+ [0x1D9E5]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E878,
+ unicodeslot=0x1D9E5,
},
- [0x1E879]={
- category="lo",
- direction="r",
+ [0x1D9E6]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E879,
+ unicodeslot=0x1D9E6,
},
- [0x1E87A]={
- category="lo",
- direction="r",
+ [0x1D9E7]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E87A,
+ unicodeslot=0x1D9E7,
},
- [0x1E87B]={
- category="lo",
- direction="r",
+ [0x1D9E8]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E87B,
+ unicodeslot=0x1D9E8,
},
- [0x1E87C]={
- category="lo",
- direction="r",
+ [0x1D9E9]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E87C,
+ unicodeslot=0x1D9E9,
},
- [0x1E87D]={
- category="lo",
- direction="r",
+ [0x1D9EA]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E87D,
+ unicodeslot=0x1D9EA,
},
- [0x1E87E]={
- category="lo",
- direction="r",
+ [0x1D9EB]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E87E,
+ unicodeslot=0x1D9EB,
},
- [0x1E87F]={
- category="lo",
- direction="r",
+ [0x1D9EC]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E87F,
+ unicodeslot=0x1D9EC,
},
- [0x1E880]={
- category="lo",
- direction="r",
+ [0x1D9ED]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E880,
+ unicodeslot=0x1D9ED,
},
- [0x1E881]={
- category="lo",
- direction="r",
+ [0x1D9EE]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E881,
+ unicodeslot=0x1D9EE,
},
- [0x1E882]={
- category="lo",
- direction="r",
+ [0x1D9EF]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E882,
+ unicodeslot=0x1D9EF,
},
- [0x1E883]={
- category="lo",
- direction="r",
+ [0x1D9F0]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E883,
+ unicodeslot=0x1D9F0,
},
- [0x1E884]={
- category="lo",
- direction="r",
+ [0x1D9F1]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E884,
+ unicodeslot=0x1D9F1,
},
- [0x1E885]={
- category="lo",
- direction="r",
+ [0x1D9F2]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E885,
+ unicodeslot=0x1D9F2,
},
- [0x1E886]={
- category="lo",
- direction="r",
+ [0x1D9F3]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E886,
+ unicodeslot=0x1D9F3,
},
- [0x1E887]={
- category="lo",
- direction="r",
+ [0x1D9F4]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E887,
+ unicodeslot=0x1D9F4,
},
- [0x1E888]={
- category="lo",
- direction="r",
+ [0x1D9F5]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E888,
+ unicodeslot=0x1D9F5,
},
- [0x1E889]={
- category="lo",
- direction="r",
+ [0x1D9F6]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E889,
+ unicodeslot=0x1D9F6,
},
- [0x1E88A]={
- category="lo",
- direction="r",
+ [0x1D9F7]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E88A,
+ unicodeslot=0x1D9F7,
},
- [0x1E88B]={
- category="lo",
- direction="r",
+ [0x1D9F8]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E88B,
+ unicodeslot=0x1D9F8,
},
- [0x1E88C]={
- category="lo",
- direction="r",
+ [0x1D9F9]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E88C,
+ unicodeslot=0x1D9F9,
},
- [0x1E88D]={
- category="lo",
- direction="r",
+ [0x1D9FA]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E88D,
+ unicodeslot=0x1D9FA,
},
- [0x1E88E]={
- category="lo",
- direction="r",
+ [0x1D9FB]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E88E,
+ unicodeslot=0x1D9FB,
},
- [0x1E88F]={
- category="lo",
- direction="r",
+ [0x1D9FC]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E88F,
+ unicodeslot=0x1D9FC,
},
- [0x1E890]={
- category="lo",
- direction="r",
+ [0x1D9FD]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E890,
+ unicodeslot=0x1D9FD,
},
- [0x1E891]={
- category="lo",
- direction="r",
+ [0x1D9FE]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E891,
+ unicodeslot=0x1D9FE,
},
- [0x1E892]={
- category="lo",
- direction="r",
+ [0x1D9FF]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E892,
+ unicodeslot=0x1D9FF,
},
- [0x1E893]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E893,
+ [0x1DA00]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA00,
},
- [0x1E894]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E894,
+ [0x1DA01]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA01,
},
- [0x1E895]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E895,
+ [0x1DA02]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA02,
},
- [0x1E896]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E896,
+ [0x1DA03]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA03,
},
- [0x1E897]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E897,
+ [0x1DA04]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA04,
},
- [0x1E898]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E898,
+ [0x1DA05]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA05,
},
- [0x1E899]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E899,
+ [0x1DA06]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA06,
},
- [0x1E89A]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E89A,
+ [0x1DA07]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA07,
},
- [0x1E89B]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E89B,
+ [0x1DA08]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA08,
},
- [0x1E89C]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E89C,
+ [0x1DA09]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA09,
},
- [0x1E89D]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E89D,
+ [0x1DA0A]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA0A,
},
- [0x1E89E]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E89E,
+ [0x1DA0B]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA0B,
},
- [0x1E89F]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E89F,
+ [0x1DA0C]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA0C,
},
- [0x1E8A0]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8A0,
+ [0x1DA0D]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA0D,
},
- [0x1E8A1]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8A1,
+ [0x1DA0E]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA0E,
},
- [0x1E8A2]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8A2,
+ [0x1DA0F]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA0F,
},
- [0x1E8A3]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8A3,
+ [0x1DA10]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA10,
},
- [0x1E8A4]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8A4,
+ [0x1DA11]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA11,
},
- [0x1E8A5]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8A5,
+ [0x1DA12]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA12,
},
- [0x1E8A6]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8A6,
+ [0x1DA13]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA13,
},
- [0x1E8A7]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8A7,
+ [0x1DA14]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA14,
},
- [0x1E8A8]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8A8,
+ [0x1DA15]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA15,
},
- [0x1E8A9]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8A9,
+ [0x1DA16]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA16,
},
- [0x1E8AA]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8AA,
+ [0x1DA17]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA17,
},
- [0x1E8AB]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8AB,
+ [0x1DA18]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA18,
},
- [0x1E8AC]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8AC,
+ [0x1DA19]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA19,
},
- [0x1E8AD]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8AD,
+ [0x1DA1A]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA1A,
},
- [0x1E8AE]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8AE,
+ [0x1DA1B]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA1B,
},
- [0x1E8AF]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8AF,
+ [0x1DA1C]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA1C,
},
- [0x1E8B0]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8B0,
+ [0x1DA1D]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA1D,
},
- [0x1E8B1]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8B1,
+ [0x1DA1E]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA1E,
},
- [0x1E8B2]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8B2,
+ [0x1DA1F]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA1F,
},
- [0x1E8B3]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8B3,
+ [0x1DA20]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA20,
},
- [0x1E8B4]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8B4,
+ [0x1DA21]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA21,
},
- [0x1E8B5]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8B5,
+ [0x1DA22]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA22,
},
- [0x1E8B6]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8B6,
+ [0x1DA23]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA23,
},
- [0x1E8B7]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8B7,
+ [0x1DA24]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA24,
},
- [0x1E8B8]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8B8,
+ [0x1DA25]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA25,
},
- [0x1E8B9]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8B9,
+ [0x1DA26]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA26,
},
- [0x1E8BA]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8BA,
+ [0x1DA27]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA27,
},
- [0x1E8BB]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8BB,
+ [0x1DA28]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA28,
},
- [0x1E8BC]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8BC,
+ [0x1DA29]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA29,
},
- [0x1E8BD]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8BD,
+ [0x1DA2A]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA2A,
},
- [0x1E8BE]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8BE,
+ [0x1DA2B]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA2B,
},
- [0x1E8BF]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8BF,
+ [0x1DA2C]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA2C,
},
- [0x1E8C0]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8C0,
+ [0x1DA2D]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA2D,
},
- [0x1E8C1]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8C1,
+ [0x1DA2E]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA2E,
},
- [0x1E8C2]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8C2,
+ [0x1DA2F]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA2F,
},
- [0x1E8C3]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8C3,
+ [0x1DA30]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA30,
},
- [0x1E8C4]={
- category="lo",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8C4,
+ [0x1DA31]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA31,
},
- [0x1E8C7]={
- category="no",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8C7,
+ [0x1DA32]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA32,
},
- [0x1E8C8]={
- category="no",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8C8,
+ [0x1DA33]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA33,
},
- [0x1E8C9]={
- category="no",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8C9,
+ [0x1DA34]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA34,
},
- [0x1E8CA]={
- category="no",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8CA,
+ [0x1DA35]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA35,
},
- [0x1E8CB]={
- category="no",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E8CB,
+ [0x1DA36]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA36,
},
- [0x1E8CC]={
- category="no",
- direction="r",
+ [0x1DA37]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E8CC,
+ unicodeslot=0x1DA37,
},
- [0x1E8CD]={
- category="no",
- direction="r",
+ [0x1DA38]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E8CD,
+ unicodeslot=0x1DA38,
},
- [0x1E8CE]={
- category="no",
- direction="r",
+ [0x1DA39]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E8CE,
+ unicodeslot=0x1DA39,
},
- [0x1E8CF]={
- category="no",
- direction="r",
+ [0x1DA3A]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E8CF,
+ unicodeslot=0x1DA3A,
},
- [0x1E8D0]={
+ [0x1DA3B]={
category="mn",
direction="nsm",
linebreak="cm",
- unicodeslot=0x1E8D0,
+ unicodeslot=0x1DA3B,
},
- [0x1E8D1]={
+ [0x1DA3C]={
category="mn",
direction="nsm",
linebreak="cm",
- unicodeslot=0x1E8D1,
+ unicodeslot=0x1DA3C,
},
- [0x1E8D2]={
+ [0x1DA3D]={
category="mn",
direction="nsm",
linebreak="cm",
- unicodeslot=0x1E8D2,
+ unicodeslot=0x1DA3D,
},
- [0x1E8D3]={
+ [0x1DA3E]={
category="mn",
direction="nsm",
linebreak="cm",
- unicodeslot=0x1E8D3,
+ unicodeslot=0x1DA3E,
},
- [0x1E8D4]={
+ [0x1DA3F]={
category="mn",
direction="nsm",
linebreak="cm",
- unicodeslot=0x1E8D4,
+ unicodeslot=0x1DA3F,
},
- [0x1E8D5]={
+ [0x1DA40]={
category="mn",
direction="nsm",
linebreak="cm",
- unicodeslot=0x1E8D5,
+ unicodeslot=0x1DA40,
},
- [0x1E8D6]={
+ [0x1DA41]={
category="mn",
direction="nsm",
linebreak="cm",
- unicodeslot=0x1E8D6,
- },
- [0x1E900]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E900,
+ unicodeslot=0x1DA41,
},
- [0x1E901]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E901,
+ [0x1DA42]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA42,
},
- [0x1E902]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E902,
+ [0x1DA43]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA43,
},
- [0x1E903]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E903,
+ [0x1DA44]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA44,
},
- [0x1E904]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E904,
+ [0x1DA45]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA45,
},
- [0x1E905]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E905,
+ [0x1DA46]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA46,
},
- [0x1E906]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E906,
+ [0x1DA47]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA47,
},
- [0x1E907]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E907,
+ [0x1DA48]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA48,
},
- [0x1E908]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E908,
+ [0x1DA49]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA49,
},
- [0x1E909]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E909,
+ [0x1DA4A]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA4A,
},
- [0x1E90A]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E90A,
+ [0x1DA4B]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA4B,
},
- [0x1E90B]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E90B,
+ [0x1DA4C]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA4C,
},
- [0x1E90C]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E90C,
+ [0x1DA4D]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA4D,
},
- [0x1E90D]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E90D,
+ [0x1DA4E]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA4E,
},
- [0x1E90E]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E90E,
+ [0x1DA4F]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA4F,
},
- [0x1E90F]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E90F,
+ [0x1DA50]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA50,
},
- [0x1E910]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E910,
+ [0x1DA51]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA51,
},
- [0x1E911]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E911,
+ [0x1DA52]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA52,
},
- [0x1E912]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E912,
+ [0x1DA53]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA53,
},
- [0x1E913]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E913,
+ [0x1DA54]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA54,
},
- [0x1E914]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E914,
+ [0x1DA55]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA55,
},
- [0x1E915]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E915,
+ [0x1DA56]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA56,
},
- [0x1E916]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E916,
+ [0x1DA57]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA57,
},
- [0x1E917]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E917,
+ [0x1DA58]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA58,
},
- [0x1E918]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E918,
+ [0x1DA59]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA59,
},
- [0x1E919]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E919,
+ [0x1DA5A]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA5A,
},
- [0x1E91A]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E91A,
+ [0x1DA5B]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA5B,
},
- [0x1E91B]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E91B,
+ [0x1DA5C]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA5C,
},
- [0x1E91C]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E91C,
+ [0x1DA5D]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA5D,
},
- [0x1E91D]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E91D,
+ [0x1DA5E]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA5E,
},
- [0x1E91E]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E91E,
+ [0x1DA5F]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA5F,
},
- [0x1E91F]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E91F,
+ [0x1DA60]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA60,
},
- [0x1E920]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E920,
+ [0x1DA61]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA61,
},
- [0x1E921]={
- category="lu",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E921,
+ [0x1DA62]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA62,
},
- [0x1E922]={
- category="ll",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E922,
+ [0x1DA63]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA63,
},
- [0x1E923]={
- category="ll",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E923,
+ [0x1DA64]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA64,
},
- [0x1E924]={
- category="ll",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E924,
+ [0x1DA65]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA65,
},
- [0x1E925]={
- category="ll",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E925,
+ [0x1DA66]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA66,
},
- [0x1E926]={
- category="ll",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E926,
+ [0x1DA67]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA67,
},
- [0x1E927]={
- category="ll",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E927,
+ [0x1DA68]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA68,
},
- [0x1E928]={
- category="ll",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E928,
+ [0x1DA69]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA69,
},
- [0x1E929]={
- category="ll",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E929,
+ [0x1DA6A]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA6A,
},
- [0x1E92A]={
- category="ll",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E92A,
+ [0x1DA6B]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA6B,
},
- [0x1E92B]={
- category="ll",
- direction="r",
+ [0x1DA6C]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA6C,
+ },
+ [0x1DA6D]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E92B,
+ unicodeslot=0x1DA6D,
},
- [0x1E92C]={
- category="ll",
- direction="r",
+ [0x1DA6E]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E92C,
+ unicodeslot=0x1DA6E,
},
- [0x1E92D]={
- category="ll",
- direction="r",
+ [0x1DA6F]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E92D,
+ unicodeslot=0x1DA6F,
},
- [0x1E92E]={
- category="ll",
- direction="r",
+ [0x1DA70]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E92E,
+ unicodeslot=0x1DA70,
},
- [0x1E92F]={
- category="ll",
- direction="r",
+ [0x1DA71]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E92F,
+ unicodeslot=0x1DA71,
},
- [0x1E930]={
- category="ll",
- direction="r",
+ [0x1DA72]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E930,
+ unicodeslot=0x1DA72,
},
- [0x1E931]={
- category="ll",
- direction="r",
+ [0x1DA73]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E931,
+ unicodeslot=0x1DA73,
},
- [0x1E932]={
- category="ll",
- direction="r",
+ [0x1DA74]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E932,
+ unicodeslot=0x1DA74,
},
- [0x1E933]={
- category="ll",
- direction="r",
+ [0x1DA75]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA75,
+ },
+ [0x1DA76]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E933,
+ unicodeslot=0x1DA76,
},
- [0x1E934]={
- category="ll",
- direction="r",
+ [0x1DA77]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E934,
+ unicodeslot=0x1DA77,
},
- [0x1E935]={
- category="ll",
- direction="r",
+ [0x1DA78]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E935,
+ unicodeslot=0x1DA78,
},
- [0x1E936]={
- category="ll",
- direction="r",
+ [0x1DA79]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E936,
+ unicodeslot=0x1DA79,
},
- [0x1E937]={
- category="ll",
- direction="r",
+ [0x1DA7A]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E937,
+ unicodeslot=0x1DA7A,
},
- [0x1E938]={
- category="ll",
- direction="r",
+ [0x1DA7B]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E938,
+ unicodeslot=0x1DA7B,
},
- [0x1E939]={
- category="ll",
- direction="r",
+ [0x1DA7C]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E939,
+ unicodeslot=0x1DA7C,
},
- [0x1E93A]={
- category="ll",
- direction="r",
+ [0x1DA7D]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E93A,
+ unicodeslot=0x1DA7D,
},
- [0x1E93B]={
- category="ll",
- direction="r",
+ [0x1DA7E]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E93B,
+ unicodeslot=0x1DA7E,
},
- [0x1E93C]={
- category="ll",
- direction="r",
+ [0x1DA7F]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E93C,
+ unicodeslot=0x1DA7F,
},
- [0x1E93D]={
- category="ll",
- direction="r",
+ [0x1DA80]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E93D,
+ unicodeslot=0x1DA80,
},
- [0x1E93E]={
- category="ll",
- direction="r",
+ [0x1DA81]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E93E,
+ unicodeslot=0x1DA81,
},
- [0x1E93F]={
- category="ll",
- direction="r",
+ [0x1DA82]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E93F,
+ unicodeslot=0x1DA82,
},
- [0x1E940]={
- category="ll",
- direction="r",
+ [0x1DA83]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E940,
+ unicodeslot=0x1DA83,
},
- [0x1E941]={
- category="ll",
- direction="r",
+ [0x1DA84]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DA84,
+ },
+ [0x1DA85]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E941,
+ unicodeslot=0x1DA85,
},
- [0x1E942]={
- category="ll",
- direction="r",
+ [0x1DA86]={
+ category="so",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E942,
+ unicodeslot=0x1DA86,
},
- [0x1E943]={
- category="ll",
- direction="r",
+ [0x1DA87]={
+ category="po",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1DA87,
+ },
+ [0x1DA88]={
+ category="po",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1DA88,
+ },
+ [0x1DA89]={
+ category="po",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1DA89,
+ },
+ [0x1DA8A]={
+ category="po",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1DA8A,
+ },
+ [0x1DA8B]={
+ category="po",
+ direction="l",
linebreak="al",
- unicodeslot=0x1E943,
+ unicodeslot=0x1DA8B,
},
- [0x1E944]={
+ [0x1DA9B]={
category="mn",
direction="nsm",
linebreak="cm",
- unicodeslot=0x1E944,
+ unicodeslot=0x1DA9B,
},
- [0x1E945]={
+ [0x1DA9C]={
category="mn",
direction="nsm",
linebreak="cm",
- unicodeslot=0x1E945,
+ unicodeslot=0x1DA9C,
},
- [0x1E946]={
+ [0x1DA9D]={
category="mn",
direction="nsm",
linebreak="cm",
- unicodeslot=0x1E946,
+ unicodeslot=0x1DA9D,
},
- [0x1E947]={
+ [0x1DA9E]={
category="mn",
direction="nsm",
linebreak="cm",
- unicodeslot=0x1E947,
+ unicodeslot=0x1DA9E,
},
- [0x1E948]={
+ [0x1DA9F]={
category="mn",
direction="nsm",
linebreak="cm",
- unicodeslot=0x1E948,
+ unicodeslot=0x1DA9F,
},
- [0x1E949]={
+ [0x1DAA1]={
category="mn",
direction="nsm",
linebreak="cm",
- unicodeslot=0x1E949,
+ unicodeslot=0x1DAA1,
},
- [0x1E94A]={
+ [0x1DAA2]={
category="mn",
direction="nsm",
linebreak="cm",
- unicodeslot=0x1E94A,
+ unicodeslot=0x1DAA2,
},
- [0x1E94B]={
- category="lm",
- direction="r",
- linebreak="al",
- unicodeslot=0x1E94B,
+ [0x1DAA3]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DAA3,
},
- [0x1E950]={
- category="nd",
- direction="r",
- linebreak="nu",
- unicodeslot=0x1E950,
+ [0x1DAA4]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DAA4,
},
- [0x1E951]={
- category="nd",
- direction="r",
- linebreak="nu",
- unicodeslot=0x1E951,
+ [0x1DAA5]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DAA5,
},
- [0x1E952]={
- category="nd",
- direction="r",
- linebreak="nu",
- unicodeslot=0x1E952,
+ [0x1DAA6]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DAA6,
},
- [0x1E953]={
- category="nd",
- direction="r",
- linebreak="nu",
- unicodeslot=0x1E953,
+ [0x1DAA7]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DAA7,
},
- [0x1E954]={
- category="nd",
- direction="r",
- linebreak="nu",
- unicodeslot=0x1E954,
+ [0x1DAA8]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DAA8,
},
- [0x1E955]={
- category="nd",
- direction="r",
- linebreak="nu",
- unicodeslot=0x1E955,
+ [0x1DAA9]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DAA9,
},
- [0x1E956]={
- category="nd",
- direction="r",
- linebreak="nu",
- unicodeslot=0x1E956,
+ [0x1DAAA]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DAAA,
},
- [0x1E957]={
- category="nd",
- direction="r",
- linebreak="nu",
- unicodeslot=0x1E957,
+ [0x1DAAB]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DAAB,
},
- [0x1E958]={
- category="nd",
- direction="r",
- linebreak="nu",
- unicodeslot=0x1E958,
+ [0x1DAAC]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DAAC,
},
- [0x1E959]={
- category="nd",
- direction="r",
- linebreak="nu",
- unicodeslot=0x1E959,
+ [0x1DAAD]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DAAD,
},
- [0x1E95E]={
- category="po",
- direction="r",
- linebreak="op",
- unicodeslot=0x1E95E,
+ [0x1DAAE]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DAAE,
},
- [0x1E95F]={
- category="po",
- direction="r",
- linebreak="op",
- unicodeslot=0x1E95F,
+ [0x1DAAF]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DAAF,
},
- [0x1EC71]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC71,
+ [0x1E000]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E000,
},
- [0x1EC72]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC72,
+ [0x1E001]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E001,
},
- [0x1EC73]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC73,
+ [0x1E002]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E002,
},
- [0x1EC74]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC74,
+ [0x1E003]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E003,
},
- [0x1EC75]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC75,
+ [0x1E004]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E004,
},
- [0x1EC76]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC76,
+ [0x1E005]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E005,
},
- [0x1EC77]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC77,
+ [0x1E006]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E006,
},
- [0x1EC78]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC78,
+ [0x1E008]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E008,
},
- [0x1EC79]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC79,
+ [0x1E009]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E009,
},
- [0x1EC7A]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC7A,
+ [0x1E00A]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E00A,
},
- [0x1EC7B]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC7B,
+ [0x1E00B]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E00B,
},
- [0x1EC7C]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC7C,
+ [0x1E00C]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E00C,
},
- [0x1EC7D]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC7D,
+ [0x1E00D]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E00D,
},
- [0x1EC7E]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC7E,
+ [0x1E00E]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E00E,
},
- [0x1EC7F]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC7F,
+ [0x1E00F]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E00F,
},
- [0x1EC80]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC80,
+ [0x1E010]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E010,
},
- [0x1EC81]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC81,
+ [0x1E011]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E011,
},
- [0x1EC82]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC82,
+ [0x1E012]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E012,
},
- [0x1EC83]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC83,
+ [0x1E013]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E013,
},
- [0x1EC84]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC84,
+ [0x1E014]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E014,
},
- [0x1EC85]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC85,
+ [0x1E015]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E015,
},
- [0x1EC86]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC86,
+ [0x1E016]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E016,
},
- [0x1EC87]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC87,
+ [0x1E017]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E017,
},
- [0x1EC88]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC88,
+ [0x1E018]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E018,
},
- [0x1EC89]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC89,
+ [0x1E01B]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E01B,
},
- [0x1EC8A]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC8A,
+ [0x1E01C]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E01C,
},
- [0x1EC8B]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC8B,
+ [0x1E01D]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E01D,
},
- [0x1EC8C]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC8C,
+ [0x1E01E]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E01E,
},
- [0x1EC8D]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC8D,
+ [0x1E01F]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E01F,
},
- [0x1EC8E]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC8E,
+ [0x1E020]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E020,
},
- [0x1EC8F]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC8F,
+ [0x1E021]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E021,
},
- [0x1EC90]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC90,
+ [0x1E023]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E023,
},
- [0x1EC91]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC91,
- },
- [0x1EC92]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC92,
- },
- [0x1EC93]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC93,
- },
- [0x1EC94]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC94,
+ [0x1E024]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E024,
},
- [0x1EC95]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC95,
+ [0x1E026]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E026,
},
- [0x1EC96]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC96,
+ [0x1E027]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E027,
},
- [0x1EC97]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC97,
+ [0x1E028]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E028,
},
- [0x1EC98]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC98,
+ [0x1E029]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E029,
},
- [0x1EC99]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1EC99,
+ [0x1E02A]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E02A,
},
- [0x1EC9A]={
- category="no",
- direction="al",
+ [0x1E100]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1EC9A,
+ unicodeslot=0x1E100,
},
- [0x1EC9B]={
- category="no",
- direction="al",
+ [0x1E101]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1EC9B,
+ unicodeslot=0x1E101,
},
- [0x1EC9C]={
- category="no",
- direction="al",
+ [0x1E102]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1EC9C,
+ unicodeslot=0x1E102,
},
- [0x1EC9D]={
- category="no",
- direction="al",
+ [0x1E103]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1EC9D,
+ unicodeslot=0x1E103,
},
- [0x1EC9E]={
- category="no",
- direction="al",
+ [0x1E104]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1EC9E,
+ unicodeslot=0x1E104,
},
- [0x1EC9F]={
- category="no",
- direction="al",
+ [0x1E105]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1EC9F,
+ unicodeslot=0x1E105,
},
- [0x1ECA0]={
- category="no",
- direction="al",
+ [0x1E106]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECA0,
+ unicodeslot=0x1E106,
},
- [0x1ECA1]={
- category="no",
- direction="al",
+ [0x1E107]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECA1,
+ unicodeslot=0x1E107,
},
- [0x1ECA2]={
- category="no",
- direction="al",
+ [0x1E108]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECA2,
+ unicodeslot=0x1E108,
},
- [0x1ECA3]={
- category="no",
- direction="al",
+ [0x1E109]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECA3,
+ unicodeslot=0x1E109,
},
- [0x1ECA4]={
- category="no",
- direction="al",
+ [0x1E10A]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECA4,
+ unicodeslot=0x1E10A,
},
- [0x1ECA5]={
- category="no",
- direction="al",
+ [0x1E10B]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECA5,
+ unicodeslot=0x1E10B,
},
- [0x1ECA6]={
- category="no",
- direction="al",
+ [0x1E10C]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECA6,
+ unicodeslot=0x1E10C,
},
- [0x1ECA7]={
- category="no",
- direction="al",
+ [0x1E10D]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECA7,
+ unicodeslot=0x1E10D,
},
- [0x1ECA8]={
- category="no",
- direction="al",
+ [0x1E10E]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECA8,
+ unicodeslot=0x1E10E,
},
- [0x1ECA9]={
- category="no",
- direction="al",
+ [0x1E10F]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECA9,
+ unicodeslot=0x1E10F,
},
- [0x1ECAA]={
- category="no",
- direction="al",
+ [0x1E110]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECAA,
+ unicodeslot=0x1E110,
},
- [0x1ECAB]={
- category="no",
- direction="al",
+ [0x1E111]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECAB,
- },
- [0x1ECAC]={
- category="so",
- direction="al",
- linebreak="po",
- unicodeslot=0x1ECAC,
+ unicodeslot=0x1E111,
},
- [0x1ECAD]={
- category="no",
- direction="al",
+ [0x1E112]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECAD,
+ unicodeslot=0x1E112,
},
- [0x1ECAE]={
- category="no",
- direction="al",
+ [0x1E113]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECAE,
+ unicodeslot=0x1E113,
},
- [0x1ECAF]={
- category="no",
- direction="al",
+ [0x1E114]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECAF,
- },
- [0x1ECB0]={
- category="sc",
- direction="al",
- linebreak="po",
- unicodeslot=0x1ECB0,
+ unicodeslot=0x1E114,
},
- [0x1ECB1]={
- category="no",
- direction="al",
+ [0x1E115]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECB1,
+ unicodeslot=0x1E115,
},
- [0x1ECB2]={
- category="no",
- direction="al",
+ [0x1E116]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECB2,
+ unicodeslot=0x1E116,
},
- [0x1ECB3]={
- category="no",
- direction="al",
+ [0x1E117]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECB3,
+ unicodeslot=0x1E117,
},
- [0x1ECB4]={
- category="no",
- direction="al",
+ [0x1E118]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ECB4,
+ unicodeslot=0x1E118,
},
- [0x1ED01]={
- category="no",
- direction="al",
+ [0x1E119]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED01,
+ unicodeslot=0x1E119,
},
- [0x1ED02]={
- category="no",
- direction="al",
+ [0x1E11A]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED02,
+ unicodeslot=0x1E11A,
},
- [0x1ED03]={
- category="no",
- direction="al",
+ [0x1E11B]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED03,
+ unicodeslot=0x1E11B,
},
- [0x1ED04]={
- category="no",
- direction="al",
+ [0x1E11C]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED04,
+ unicodeslot=0x1E11C,
},
- [0x1ED05]={
- category="no",
- direction="al",
+ [0x1E11D]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED05,
+ unicodeslot=0x1E11D,
},
- [0x1ED06]={
- category="no",
- direction="al",
+ [0x1E11E]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED06,
+ unicodeslot=0x1E11E,
},
- [0x1ED07]={
- category="no",
- direction="al",
+ [0x1E11F]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED07,
+ unicodeslot=0x1E11F,
},
- [0x1ED08]={
- category="no",
- direction="al",
+ [0x1E120]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED08,
+ unicodeslot=0x1E120,
},
- [0x1ED09]={
- category="no",
- direction="al",
+ [0x1E121]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED09,
+ unicodeslot=0x1E121,
},
- [0x1ED0A]={
- category="no",
- direction="al",
+ [0x1E122]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED0A,
+ unicodeslot=0x1E122,
},
- [0x1ED0B]={
- category="no",
- direction="al",
+ [0x1E123]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED0B,
+ unicodeslot=0x1E123,
},
- [0x1ED0C]={
- category="no",
- direction="al",
+ [0x1E124]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED0C,
+ unicodeslot=0x1E124,
},
- [0x1ED0D]={
- category="no",
- direction="al",
+ [0x1E125]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED0D,
+ unicodeslot=0x1E125,
},
- [0x1ED0E]={
- category="no",
- direction="al",
+ [0x1E126]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED0E,
+ unicodeslot=0x1E126,
},
- [0x1ED0F]={
- category="no",
- direction="al",
+ [0x1E127]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED0F,
+ unicodeslot=0x1E127,
},
- [0x1ED10]={
- category="no",
- direction="al",
+ [0x1E128]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED10,
+ unicodeslot=0x1E128,
},
- [0x1ED11]={
- category="no",
- direction="al",
+ [0x1E129]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED11,
+ unicodeslot=0x1E129,
},
- [0x1ED12]={
- category="no",
- direction="al",
+ [0x1E12A]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED12,
+ unicodeslot=0x1E12A,
},
- [0x1ED13]={
- category="no",
- direction="al",
+ [0x1E12B]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED13,
+ unicodeslot=0x1E12B,
},
- [0x1ED14]={
- category="no",
- direction="al",
+ [0x1E12C]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED14,
+ unicodeslot=0x1E12C,
},
- [0x1ED15]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED15,
+ [0x1E130]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E130,
},
- [0x1ED16]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED16,
+ [0x1E131]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E131,
},
- [0x1ED17]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED17,
+ [0x1E132]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E132,
},
- [0x1ED18]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED18,
+ [0x1E133]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E133,
},
- [0x1ED19]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED19,
+ [0x1E134]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E134,
},
- [0x1ED1A]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED1A,
+ [0x1E135]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E135,
},
- [0x1ED1B]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED1B,
+ [0x1E136]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E136,
},
- [0x1ED1C]={
- category="no",
- direction="al",
+ [0x1E137]={
+ category="lm",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED1C,
+ unicodeslot=0x1E137,
},
- [0x1ED1D]={
- category="no",
- direction="al",
+ [0x1E138]={
+ category="lm",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED1D,
+ unicodeslot=0x1E138,
},
- [0x1ED1E]={
- category="no",
- direction="al",
+ [0x1E139]={
+ category="lm",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED1E,
+ unicodeslot=0x1E139,
},
- [0x1ED1F]={
- category="no",
- direction="al",
+ [0x1E13A]={
+ category="lm",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED1F,
+ unicodeslot=0x1E13A,
},
- [0x1ED20]={
- category="no",
- direction="al",
+ [0x1E13B]={
+ category="lm",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED20,
+ unicodeslot=0x1E13B,
},
- [0x1ED21]={
- category="no",
- direction="al",
+ [0x1E13C]={
+ category="lm",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED21,
+ unicodeslot=0x1E13C,
},
- [0x1ED22]={
- category="no",
- direction="al",
+ [0x1E13D]={
+ category="lm",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED22,
+ unicodeslot=0x1E13D,
},
- [0x1ED23]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED23,
+ [0x1E140]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E140,
},
- [0x1ED24]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED24,
+ [0x1E141]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E141,
},
- [0x1ED25]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED25,
+ [0x1E142]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E142,
},
- [0x1ED26]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED26,
+ [0x1E143]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E143,
},
- [0x1ED27]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED27,
+ [0x1E144]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E144,
},
- [0x1ED28]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED28,
+ [0x1E145]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E145,
},
- [0x1ED29]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED29,
+ [0x1E146]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E146,
},
- [0x1ED2A]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED2A,
+ [0x1E147]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E147,
},
- [0x1ED2B]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED2B,
+ [0x1E148]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E148,
},
- [0x1ED2C]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED2C,
+ [0x1E149]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E149,
},
- [0x1ED2D]={
- category="no",
- direction="al",
+ [0x1E14E]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED2D,
+ unicodeslot=0x1E14E,
},
- [0x1ED2E]={
+ [0x1E14F]={
category="so",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED2E,
- },
- [0x1ED2F]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED2F,
- },
- [0x1ED30]={
- category="no",
- direction="al",
- linebreak="al",
- unicodeslot=0x1ED30,
- },
- [0x1ED31]={
- category="no",
- direction="al",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED31,
+ unicodeslot=0x1E14F,
},
- [0x1ED32]={
- category="no",
- direction="al",
+ [0x1E2C0]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED32,
+ unicodeslot=0x1E2C0,
},
- [0x1ED33]={
- category="no",
- direction="al",
+ [0x1E2C1]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED33,
+ unicodeslot=0x1E2C1,
},
- [0x1ED34]={
- category="no",
- direction="al",
+ [0x1E2C2]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED34,
+ unicodeslot=0x1E2C2,
},
- [0x1ED35]={
- category="no",
- direction="al",
+ [0x1E2C3]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED35,
+ unicodeslot=0x1E2C3,
},
- [0x1ED36]={
- category="no",
- direction="al",
+ [0x1E2C4]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED36,
+ unicodeslot=0x1E2C4,
},
- [0x1ED37]={
- category="no",
- direction="al",
+ [0x1E2C5]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED37,
+ unicodeslot=0x1E2C5,
},
- [0x1ED38]={
- category="no",
- direction="al",
+ [0x1E2C6]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED38,
+ unicodeslot=0x1E2C6,
},
- [0x1ED39]={
- category="no",
- direction="al",
+ [0x1E2C7]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED39,
+ unicodeslot=0x1E2C7,
},
- [0x1ED3A]={
- category="no",
- direction="al",
+ [0x1E2C8]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED3A,
+ unicodeslot=0x1E2C8,
},
- [0x1ED3B]={
- category="no",
- direction="al",
+ [0x1E2C9]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED3B,
+ unicodeslot=0x1E2C9,
},
- [0x1ED3C]={
- category="no",
- direction="al",
+ [0x1E2CA]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED3C,
+ unicodeslot=0x1E2CA,
},
- [0x1ED3D]={
- category="no",
- direction="al",
+ [0x1E2CB]={
+ category="lo",
+ direction="l",
linebreak="al",
- unicodeslot=0x1ED3D,
+ unicodeslot=0x1E2CB,
},
- [0x1EE00]={
+ [0x1E2CC]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x627 },
- unicodeslot=0x1EE00,
+ unicodeslot=0x1E2CC,
},
- [0x1EE01]={
+ [0x1E2CD]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x628 },
- unicodeslot=0x1EE01,
+ unicodeslot=0x1E2CD,
},
- [0x1EE02]={
+ [0x1E2CE]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x62C },
- unicodeslot=0x1EE02,
+ unicodeslot=0x1E2CE,
},
- [0x1EE03]={
+ [0x1E2CF]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x62F },
- unicodeslot=0x1EE03,
+ unicodeslot=0x1E2CF,
},
- [0x1EE05]={
+ [0x1E2D0]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x648 },
- unicodeslot=0x1EE05,
+ unicodeslot=0x1E2D0,
},
- [0x1EE06]={
+ [0x1E2D1]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x632 },
- unicodeslot=0x1EE06,
+ unicodeslot=0x1E2D1,
},
- [0x1EE07]={
+ [0x1E2D2]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x62D },
- unicodeslot=0x1EE07,
+ unicodeslot=0x1E2D2,
},
- [0x1EE08]={
+ [0x1E2D3]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x637 },
- unicodeslot=0x1EE08,
+ unicodeslot=0x1E2D3,
},
- [0x1EE09]={
+ [0x1E2D4]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x64A },
- unicodeslot=0x1EE09,
+ unicodeslot=0x1E2D4,
},
- [0x1EE0A]={
+ [0x1E2D5]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x643 },
- unicodeslot=0x1EE0A,
+ unicodeslot=0x1E2D5,
},
- [0x1EE0B]={
+ [0x1E2D6]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x644 },
- unicodeslot=0x1EE0B,
+ unicodeslot=0x1E2D6,
},
- [0x1EE0C]={
+ [0x1E2D7]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x645 },
- unicodeslot=0x1EE0C,
+ unicodeslot=0x1E2D7,
},
- [0x1EE0D]={
+ [0x1E2D8]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x646 },
- unicodeslot=0x1EE0D,
+ unicodeslot=0x1E2D8,
},
- [0x1EE0E]={
+ [0x1E2D9]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x633 },
- unicodeslot=0x1EE0E,
+ unicodeslot=0x1E2D9,
},
- [0x1EE0F]={
+ [0x1E2DA]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x639 },
- unicodeslot=0x1EE0F,
+ unicodeslot=0x1E2DA,
},
- [0x1EE10]={
+ [0x1E2DB]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x641 },
- unicodeslot=0x1EE10,
+ unicodeslot=0x1E2DB,
},
- [0x1EE11]={
+ [0x1E2DC]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x635 },
- unicodeslot=0x1EE11,
+ unicodeslot=0x1E2DC,
},
- [0x1EE12]={
+ [0x1E2DD]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x642 },
- unicodeslot=0x1EE12,
+ unicodeslot=0x1E2DD,
},
- [0x1EE13]={
+ [0x1E2DE]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x631 },
- unicodeslot=0x1EE13,
+ unicodeslot=0x1E2DE,
},
- [0x1EE14]={
+ [0x1E2DF]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x634 },
- unicodeslot=0x1EE14,
+ unicodeslot=0x1E2DF,
},
- [0x1EE15]={
+ [0x1E2E0]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x62A },
- unicodeslot=0x1EE15,
+ unicodeslot=0x1E2E0,
},
- [0x1EE16]={
+ [0x1E2E1]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x62B },
- unicodeslot=0x1EE16,
+ unicodeslot=0x1E2E1,
},
- [0x1EE17]={
+ [0x1E2E2]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x62E },
- unicodeslot=0x1EE17,
+ unicodeslot=0x1E2E2,
},
- [0x1EE18]={
+ [0x1E2E3]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x630 },
- unicodeslot=0x1EE18,
+ unicodeslot=0x1E2E3,
},
- [0x1EE19]={
+ [0x1E2E4]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x636 },
- unicodeslot=0x1EE19,
+ unicodeslot=0x1E2E4,
},
- [0x1EE1A]={
+ [0x1E2E5]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x638 },
- unicodeslot=0x1EE1A,
+ unicodeslot=0x1E2E5,
},
- [0x1EE1B]={
+ [0x1E2E6]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x63A },
- unicodeslot=0x1EE1B,
+ unicodeslot=0x1E2E6,
},
- [0x1EE1C]={
+ [0x1E2E7]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x66E },
- unicodeslot=0x1EE1C,
+ unicodeslot=0x1E2E7,
},
- [0x1EE1D]={
+ [0x1E2E8]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x6BA },
- unicodeslot=0x1EE1D,
+ unicodeslot=0x1E2E8,
},
- [0x1EE1E]={
+ [0x1E2E9]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x6A1 },
- unicodeslot=0x1EE1E,
+ unicodeslot=0x1E2E9,
},
- [0x1EE1F]={
+ [0x1E2EA]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x66F },
- unicodeslot=0x1EE1F,
+ unicodeslot=0x1E2EA,
},
- [0x1EE21]={
+ [0x1E2EB]={
category="lo",
- direction="al",
+ direction="l",
linebreak="al",
- specials={ "font", 0x628 },
- unicodeslot=0x1EE21,
+ unicodeslot=0x1E2EB,
},
- [0x1EE22]={
+ [0x1E2EC]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E2EC,
+ },
+ [0x1E2ED]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E2ED,
+ },
+ [0x1E2EE]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E2EE,
+ },
+ [0x1E2EF]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E2EF,
+ },
+ [0x1E2F0]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F0,
+ },
+ [0x1E2F1]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F1,
+ },
+ [0x1E2F2]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F2,
+ },
+ [0x1E2F3]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F3,
+ },
+ [0x1E2F4]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F4,
+ },
+ [0x1E2F5]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F5,
+ },
+ [0x1E2F6]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F6,
+ },
+ [0x1E2F7]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F7,
+ },
+ [0x1E2F8]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F8,
+ },
+ [0x1E2F9]={
+ category="nd",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F9,
+ },
+ [0x1E2FF]={
+ category="sc",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x1E2FF,
+ },
+ [0x1E800]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62C },
- unicodeslot=0x1EE22,
+ unicodeslot=0x1E800,
},
- [0x1EE24]={
+ [0x1E801]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x647 },
- unicodeslot=0x1EE24,
+ unicodeslot=0x1E801,
},
- [0x1EE27]={
+ [0x1E802]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62D },
- unicodeslot=0x1EE27,
+ unicodeslot=0x1E802,
},
- [0x1EE29]={
+ [0x1E803]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x64A },
- unicodeslot=0x1EE29,
+ unicodeslot=0x1E803,
},
- [0x1EE2A]={
+ [0x1E804]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x643 },
- unicodeslot=0x1EE2A,
+ unicodeslot=0x1E804,
},
- [0x1EE2B]={
+ [0x1E805]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x644 },
- unicodeslot=0x1EE2B,
+ unicodeslot=0x1E805,
},
- [0x1EE2C]={
+ [0x1E806]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x645 },
- unicodeslot=0x1EE2C,
+ unicodeslot=0x1E806,
},
- [0x1EE2D]={
+ [0x1E807]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x646 },
- unicodeslot=0x1EE2D,
+ unicodeslot=0x1E807,
},
- [0x1EE2E]={
+ [0x1E808]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x633 },
- unicodeslot=0x1EE2E,
+ unicodeslot=0x1E808,
},
- [0x1EE2F]={
+ [0x1E809]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x639 },
- unicodeslot=0x1EE2F,
+ unicodeslot=0x1E809,
},
- [0x1EE30]={
+ [0x1E80A]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x641 },
- unicodeslot=0x1EE30,
+ unicodeslot=0x1E80A,
},
- [0x1EE31]={
+ [0x1E80B]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x635 },
- unicodeslot=0x1EE31,
+ unicodeslot=0x1E80B,
},
- [0x1EE32]={
+ [0x1E80C]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x642 },
- unicodeslot=0x1EE32,
+ unicodeslot=0x1E80C,
},
- [0x1EE34]={
+ [0x1E80D]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x634 },
- unicodeslot=0x1EE34,
+ unicodeslot=0x1E80D,
},
- [0x1EE35]={
+ [0x1E80E]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62A },
- unicodeslot=0x1EE35,
+ unicodeslot=0x1E80E,
},
- [0x1EE36]={
+ [0x1E80F]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62B },
- unicodeslot=0x1EE36,
+ unicodeslot=0x1E80F,
},
- [0x1EE37]={
+ [0x1E810]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62E },
- unicodeslot=0x1EE37,
+ unicodeslot=0x1E810,
},
- [0x1EE39]={
+ [0x1E811]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x636 },
- unicodeslot=0x1EE39,
+ unicodeslot=0x1E811,
},
- [0x1EE3B]={
+ [0x1E812]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x63A },
- unicodeslot=0x1EE3B,
+ unicodeslot=0x1E812,
},
- [0x1EE42]={
+ [0x1E813]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62C },
- unicodeslot=0x1EE42,
+ unicodeslot=0x1E813,
},
- [0x1EE47]={
+ [0x1E814]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62D },
- unicodeslot=0x1EE47,
+ unicodeslot=0x1E814,
},
- [0x1EE49]={
+ [0x1E815]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x64A },
- unicodeslot=0x1EE49,
+ unicodeslot=0x1E815,
},
- [0x1EE4B]={
+ [0x1E816]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x644 },
- unicodeslot=0x1EE4B,
+ unicodeslot=0x1E816,
},
- [0x1EE4D]={
+ [0x1E817]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x646 },
- unicodeslot=0x1EE4D,
+ unicodeslot=0x1E817,
},
- [0x1EE4E]={
+ [0x1E818]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x633 },
- unicodeslot=0x1EE4E,
+ unicodeslot=0x1E818,
},
- [0x1EE4F]={
+ [0x1E819]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x639 },
- unicodeslot=0x1EE4F,
+ unicodeslot=0x1E819,
},
- [0x1EE51]={
+ [0x1E81A]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x635 },
- unicodeslot=0x1EE51,
+ unicodeslot=0x1E81A,
},
- [0x1EE52]={
+ [0x1E81B]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x642 },
- unicodeslot=0x1EE52,
+ unicodeslot=0x1E81B,
},
- [0x1EE54]={
+ [0x1E81C]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x634 },
- unicodeslot=0x1EE54,
+ unicodeslot=0x1E81C,
},
- [0x1EE57]={
+ [0x1E81D]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62E },
- unicodeslot=0x1EE57,
+ unicodeslot=0x1E81D,
},
- [0x1EE59]={
+ [0x1E81E]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x636 },
- unicodeslot=0x1EE59,
+ unicodeslot=0x1E81E,
},
- [0x1EE5B]={
+ [0x1E81F]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x63A },
- unicodeslot=0x1EE5B,
+ unicodeslot=0x1E81F,
},
- [0x1EE5D]={
+ [0x1E820]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x6BA },
- unicodeslot=0x1EE5D,
+ unicodeslot=0x1E820,
},
- [0x1EE5F]={
+ [0x1E821]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x66F },
- unicodeslot=0x1EE5F,
+ unicodeslot=0x1E821,
},
- [0x1EE61]={
+ [0x1E822]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x628 },
- unicodeslot=0x1EE61,
+ unicodeslot=0x1E822,
},
- [0x1EE62]={
+ [0x1E823]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62C },
- unicodeslot=0x1EE62,
+ unicodeslot=0x1E823,
},
- [0x1EE64]={
+ [0x1E824]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x647 },
- unicodeslot=0x1EE64,
+ unicodeslot=0x1E824,
},
- [0x1EE67]={
+ [0x1E825]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62D },
- unicodeslot=0x1EE67,
+ unicodeslot=0x1E825,
},
- [0x1EE68]={
+ [0x1E826]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x637 },
- unicodeslot=0x1EE68,
+ unicodeslot=0x1E826,
},
- [0x1EE69]={
+ [0x1E827]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x64A },
- unicodeslot=0x1EE69,
+ unicodeslot=0x1E827,
},
- [0x1EE6A]={
+ [0x1E828]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x643 },
- unicodeslot=0x1EE6A,
+ unicodeslot=0x1E828,
},
- [0x1EE6C]={
+ [0x1E829]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x645 },
- unicodeslot=0x1EE6C,
+ unicodeslot=0x1E829,
},
- [0x1EE6D]={
+ [0x1E82A]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x646 },
- unicodeslot=0x1EE6D,
+ unicodeslot=0x1E82A,
},
- [0x1EE6E]={
+ [0x1E82B]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x633 },
- unicodeslot=0x1EE6E,
+ unicodeslot=0x1E82B,
},
- [0x1EE6F]={
+ [0x1E82C]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x639 },
- unicodeslot=0x1EE6F,
+ unicodeslot=0x1E82C,
},
- [0x1EE70]={
+ [0x1E82D]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x641 },
- unicodeslot=0x1EE70,
+ unicodeslot=0x1E82D,
},
- [0x1EE71]={
+ [0x1E82E]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x635 },
- unicodeslot=0x1EE71,
+ unicodeslot=0x1E82E,
},
- [0x1EE72]={
+ [0x1E82F]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x642 },
- unicodeslot=0x1EE72,
+ unicodeslot=0x1E82F,
},
- [0x1EE74]={
+ [0x1E830]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x634 },
- unicodeslot=0x1EE74,
+ unicodeslot=0x1E830,
},
- [0x1EE75]={
+ [0x1E831]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62A },
- unicodeslot=0x1EE75,
+ unicodeslot=0x1E831,
},
- [0x1EE76]={
+ [0x1E832]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62B },
- unicodeslot=0x1EE76,
+ unicodeslot=0x1E832,
},
- [0x1EE77]={
+ [0x1E833]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62E },
- unicodeslot=0x1EE77,
+ unicodeslot=0x1E833,
},
- [0x1EE79]={
+ [0x1E834]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x636 },
- unicodeslot=0x1EE79,
+ unicodeslot=0x1E834,
},
- [0x1EE7A]={
+ [0x1E835]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x638 },
- unicodeslot=0x1EE7A,
+ unicodeslot=0x1E835,
},
- [0x1EE7B]={
+ [0x1E836]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x63A },
- unicodeslot=0x1EE7B,
+ unicodeslot=0x1E836,
},
- [0x1EE7C]={
+ [0x1E837]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x66E },
- unicodeslot=0x1EE7C,
+ unicodeslot=0x1E837,
},
- [0x1EE7E]={
+ [0x1E838]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x6A1 },
- unicodeslot=0x1EE7E,
+ unicodeslot=0x1E838,
},
- [0x1EE80]={
+ [0x1E839]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x627 },
- unicodeslot=0x1EE80,
+ unicodeslot=0x1E839,
},
- [0x1EE81]={
+ [0x1E83A]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x628 },
- unicodeslot=0x1EE81,
+ unicodeslot=0x1E83A,
},
- [0x1EE82]={
+ [0x1E83B]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62C },
- unicodeslot=0x1EE82,
+ unicodeslot=0x1E83B,
},
- [0x1EE83]={
+ [0x1E83C]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62F },
- unicodeslot=0x1EE83,
+ unicodeslot=0x1E83C,
},
- [0x1EE84]={
+ [0x1E83D]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x647 },
- unicodeslot=0x1EE84,
+ unicodeslot=0x1E83D,
},
- [0x1EE85]={
+ [0x1E83E]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x648 },
- unicodeslot=0x1EE85,
+ unicodeslot=0x1E83E,
},
- [0x1EE86]={
+ [0x1E83F]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x632 },
- unicodeslot=0x1EE86,
+ unicodeslot=0x1E83F,
},
- [0x1EE87]={
+ [0x1E840]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62D },
- unicodeslot=0x1EE87,
+ unicodeslot=0x1E840,
},
- [0x1EE88]={
+ [0x1E841]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x637 },
- unicodeslot=0x1EE88,
+ unicodeslot=0x1E841,
},
- [0x1EE89]={
+ [0x1E842]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x64A },
- unicodeslot=0x1EE89,
+ unicodeslot=0x1E842,
},
- [0x1EE8B]={
+ [0x1E843]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x644 },
- unicodeslot=0x1EE8B,
+ unicodeslot=0x1E843,
},
- [0x1EE8C]={
+ [0x1E844]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x645 },
- unicodeslot=0x1EE8C,
+ unicodeslot=0x1E844,
},
- [0x1EE8D]={
+ [0x1E845]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x646 },
- unicodeslot=0x1EE8D,
+ unicodeslot=0x1E845,
},
- [0x1EE8E]={
+ [0x1E846]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x633 },
- unicodeslot=0x1EE8E,
+ unicodeslot=0x1E846,
},
- [0x1EE8F]={
+ [0x1E847]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x639 },
- unicodeslot=0x1EE8F,
+ unicodeslot=0x1E847,
},
- [0x1EE90]={
+ [0x1E848]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x641 },
- unicodeslot=0x1EE90,
+ unicodeslot=0x1E848,
},
- [0x1EE91]={
+ [0x1E849]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x635 },
- unicodeslot=0x1EE91,
+ unicodeslot=0x1E849,
},
- [0x1EE92]={
+ [0x1E84A]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x642 },
- unicodeslot=0x1EE92,
+ unicodeslot=0x1E84A,
},
- [0x1EE93]={
+ [0x1E84B]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x631 },
- unicodeslot=0x1EE93,
+ unicodeslot=0x1E84B,
},
- [0x1EE94]={
+ [0x1E84C]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x634 },
- unicodeslot=0x1EE94,
+ unicodeslot=0x1E84C,
},
- [0x1EE95]={
+ [0x1E84D]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62A },
- unicodeslot=0x1EE95,
+ unicodeslot=0x1E84D,
},
- [0x1EE96]={
+ [0x1E84E]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62B },
- unicodeslot=0x1EE96,
+ unicodeslot=0x1E84E,
},
- [0x1EE97]={
+ [0x1E84F]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62E },
- unicodeslot=0x1EE97,
+ unicodeslot=0x1E84F,
},
- [0x1EE98]={
+ [0x1E850]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x630 },
- unicodeslot=0x1EE98,
+ unicodeslot=0x1E850,
},
- [0x1EE99]={
+ [0x1E851]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x636 },
- unicodeslot=0x1EE99,
+ unicodeslot=0x1E851,
},
- [0x1EE9A]={
+ [0x1E852]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x638 },
- unicodeslot=0x1EE9A,
+ unicodeslot=0x1E852,
},
- [0x1EE9B]={
+ [0x1E853]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x63A },
- unicodeslot=0x1EE9B,
+ unicodeslot=0x1E853,
},
- [0x1EEA1]={
+ [0x1E854]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x628 },
- unicodeslot=0x1EEA1,
+ unicodeslot=0x1E854,
},
- [0x1EEA2]={
+ [0x1E855]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62C },
- unicodeslot=0x1EEA2,
+ unicodeslot=0x1E855,
},
- [0x1EEA3]={
+ [0x1E856]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62F },
- unicodeslot=0x1EEA3,
+ unicodeslot=0x1E856,
},
- [0x1EEA5]={
+ [0x1E857]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x648 },
- unicodeslot=0x1EEA5,
+ unicodeslot=0x1E857,
},
- [0x1EEA6]={
+ [0x1E858]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x632 },
- unicodeslot=0x1EEA6,
+ unicodeslot=0x1E858,
},
- [0x1EEA7]={
+ [0x1E859]={
category="lo",
- direction="al",
+ direction="r",
linebreak="al",
- specials={ "font", 0x62D },
- unicodeslot=0x1EEA7,
+ unicodeslot=0x1E859,
+ },
+ [0x1E85A]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E85A,
+ },
+ [0x1E85B]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E85B,
+ },
+ [0x1E85C]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E85C,
+ },
+ [0x1E85D]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E85D,
+ },
+ [0x1E85E]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E85E,
+ },
+ [0x1E85F]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E85F,
+ },
+ [0x1E860]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E860,
+ },
+ [0x1E861]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E861,
+ },
+ [0x1E862]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E862,
+ },
+ [0x1E863]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E863,
+ },
+ [0x1E864]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E864,
+ },
+ [0x1E865]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E865,
+ },
+ [0x1E866]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E866,
+ },
+ [0x1E867]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E867,
+ },
+ [0x1E868]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E868,
+ },
+ [0x1E869]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E869,
+ },
+ [0x1E86A]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E86A,
+ },
+ [0x1E86B]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E86B,
+ },
+ [0x1E86C]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E86C,
+ },
+ [0x1E86D]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E86D,
+ },
+ [0x1E86E]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E86E,
+ },
+ [0x1E86F]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E86F,
+ },
+ [0x1E870]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E870,
+ },
+ [0x1E871]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E871,
+ },
+ [0x1E872]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E872,
+ },
+ [0x1E873]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E873,
+ },
+ [0x1E874]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E874,
+ },
+ [0x1E875]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E875,
+ },
+ [0x1E876]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E876,
+ },
+ [0x1E877]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E877,
+ },
+ [0x1E878]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E878,
+ },
+ [0x1E879]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E879,
+ },
+ [0x1E87A]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E87A,
+ },
+ [0x1E87B]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E87B,
+ },
+ [0x1E87C]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E87C,
+ },
+ [0x1E87D]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E87D,
+ },
+ [0x1E87E]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E87E,
+ },
+ [0x1E87F]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E87F,
+ },
+ [0x1E880]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E880,
+ },
+ [0x1E881]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E881,
+ },
+ [0x1E882]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E882,
+ },
+ [0x1E883]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E883,
+ },
+ [0x1E884]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E884,
+ },
+ [0x1E885]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E885,
+ },
+ [0x1E886]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E886,
+ },
+ [0x1E887]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E887,
+ },
+ [0x1E888]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E888,
+ },
+ [0x1E889]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E889,
+ },
+ [0x1E88A]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E88A,
+ },
+ [0x1E88B]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E88B,
+ },
+ [0x1E88C]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E88C,
+ },
+ [0x1E88D]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E88D,
+ },
+ [0x1E88E]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E88E,
+ },
+ [0x1E88F]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E88F,
+ },
+ [0x1E890]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E890,
+ },
+ [0x1E891]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E891,
+ },
+ [0x1E892]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E892,
+ },
+ [0x1E893]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E893,
+ },
+ [0x1E894]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E894,
+ },
+ [0x1E895]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E895,
+ },
+ [0x1E896]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E896,
+ },
+ [0x1E897]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E897,
+ },
+ [0x1E898]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E898,
+ },
+ [0x1E899]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E899,
+ },
+ [0x1E89A]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E89A,
+ },
+ [0x1E89B]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E89B,
+ },
+ [0x1E89C]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E89C,
+ },
+ [0x1E89D]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E89D,
+ },
+ [0x1E89E]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E89E,
+ },
+ [0x1E89F]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E89F,
+ },
+ [0x1E8A0]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A0,
+ },
+ [0x1E8A1]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A1,
+ },
+ [0x1E8A2]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A2,
+ },
+ [0x1E8A3]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A3,
+ },
+ [0x1E8A4]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A4,
+ },
+ [0x1E8A5]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A5,
+ },
+ [0x1E8A6]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A6,
+ },
+ [0x1E8A7]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A7,
+ },
+ [0x1E8A8]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A8,
+ },
+ [0x1E8A9]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8A9,
+ },
+ [0x1E8AA]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8AA,
+ },
+ [0x1E8AB]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8AB,
+ },
+ [0x1E8AC]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8AC,
+ },
+ [0x1E8AD]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8AD,
+ },
+ [0x1E8AE]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8AE,
+ },
+ [0x1E8AF]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8AF,
+ },
+ [0x1E8B0]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B0,
+ },
+ [0x1E8B1]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B1,
+ },
+ [0x1E8B2]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B2,
+ },
+ [0x1E8B3]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B3,
+ },
+ [0x1E8B4]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B4,
+ },
+ [0x1E8B5]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B5,
+ },
+ [0x1E8B6]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B6,
+ },
+ [0x1E8B7]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B7,
+ },
+ [0x1E8B8]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B8,
+ },
+ [0x1E8B9]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8B9,
+ },
+ [0x1E8BA]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8BA,
+ },
+ [0x1E8BB]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8BB,
+ },
+ [0x1E8BC]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8BC,
+ },
+ [0x1E8BD]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8BD,
+ },
+ [0x1E8BE]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8BE,
+ },
+ [0x1E8BF]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8BF,
+ },
+ [0x1E8C0]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C0,
+ },
+ [0x1E8C1]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C1,
+ },
+ [0x1E8C2]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C2,
+ },
+ [0x1E8C3]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C3,
+ },
+ [0x1E8C4]={
+ category="lo",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C4,
+ },
+ [0x1E8C7]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C7,
+ },
+ [0x1E8C8]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C8,
+ },
+ [0x1E8C9]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8C9,
+ },
+ [0x1E8CA]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8CA,
+ },
+ [0x1E8CB]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8CB,
+ },
+ [0x1E8CC]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8CC,
+ },
+ [0x1E8CD]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8CD,
+ },
+ [0x1E8CE]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8CE,
+ },
+ [0x1E8CF]={
+ category="no",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E8CF,
+ },
+ [0x1E8D0]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E8D0,
+ },
+ [0x1E8D1]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E8D1,
+ },
+ [0x1E8D2]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E8D2,
+ },
+ [0x1E8D3]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E8D3,
+ },
+ [0x1E8D4]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E8D4,
+ },
+ [0x1E8D5]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E8D5,
+ },
+ [0x1E8D6]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E8D6,
+ },
+ [0x1E900]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E900,
+ },
+ [0x1E901]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E901,
+ },
+ [0x1E902]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E902,
+ },
+ [0x1E903]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E903,
+ },
+ [0x1E904]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E904,
+ },
+ [0x1E905]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E905,
+ },
+ [0x1E906]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E906,
+ },
+ [0x1E907]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E907,
+ },
+ [0x1E908]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E908,
+ },
+ [0x1E909]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E909,
+ },
+ [0x1E90A]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E90A,
+ },
+ [0x1E90B]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E90B,
+ },
+ [0x1E90C]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E90C,
+ },
+ [0x1E90D]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E90D,
+ },
+ [0x1E90E]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E90E,
+ },
+ [0x1E90F]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E90F,
+ },
+ [0x1E910]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E910,
+ },
+ [0x1E911]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E911,
+ },
+ [0x1E912]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E912,
+ },
+ [0x1E913]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E913,
+ },
+ [0x1E914]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E914,
+ },
+ [0x1E915]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E915,
+ },
+ [0x1E916]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E916,
+ },
+ [0x1E917]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E917,
+ },
+ [0x1E918]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E918,
+ },
+ [0x1E919]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E919,
+ },
+ [0x1E91A]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E91A,
+ },
+ [0x1E91B]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E91B,
+ },
+ [0x1E91C]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E91C,
+ },
+ [0x1E91D]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E91D,
+ },
+ [0x1E91E]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E91E,
+ },
+ [0x1E91F]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E91F,
+ },
+ [0x1E920]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E920,
+ },
+ [0x1E921]={
+ category="lu",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E921,
+ },
+ [0x1E922]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E922,
+ },
+ [0x1E923]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E923,
+ },
+ [0x1E924]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E924,
+ },
+ [0x1E925]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E925,
+ },
+ [0x1E926]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E926,
+ },
+ [0x1E927]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E927,
+ },
+ [0x1E928]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E928,
+ },
+ [0x1E929]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E929,
+ },
+ [0x1E92A]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E92A,
+ },
+ [0x1E92B]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E92B,
+ },
+ [0x1E92C]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E92C,
+ },
+ [0x1E92D]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E92D,
+ },
+ [0x1E92E]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E92E,
+ },
+ [0x1E92F]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E92F,
+ },
+ [0x1E930]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E930,
+ },
+ [0x1E931]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E931,
+ },
+ [0x1E932]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E932,
+ },
+ [0x1E933]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E933,
+ },
+ [0x1E934]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E934,
+ },
+ [0x1E935]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E935,
+ },
+ [0x1E936]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E936,
+ },
+ [0x1E937]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E937,
+ },
+ [0x1E938]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E938,
+ },
+ [0x1E939]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E939,
+ },
+ [0x1E93A]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E93A,
+ },
+ [0x1E93B]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E93B,
+ },
+ [0x1E93C]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E93C,
+ },
+ [0x1E93D]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E93D,
+ },
+ [0x1E93E]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E93E,
+ },
+ [0x1E93F]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E93F,
+ },
+ [0x1E940]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E940,
+ },
+ [0x1E941]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E941,
+ },
+ [0x1E942]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E942,
+ },
+ [0x1E943]={
+ category="ll",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E943,
+ },
+ [0x1E944]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E944,
+ },
+ [0x1E945]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E945,
+ },
+ [0x1E946]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E946,
+ },
+ [0x1E947]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E947,
+ },
+ [0x1E948]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E948,
+ },
+ [0x1E949]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E949,
+ },
+ [0x1E94A]={
+ category="mn",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E94A,
+ },
+ [0x1E94B]={
+ category="lm",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E94B,
+ },
+ [0x1E950]={
+ category="nd",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x1E950,
+ },
+ [0x1E951]={
+ category="nd",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x1E951,
+ },
+ [0x1E952]={
+ category="nd",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x1E952,
+ },
+ [0x1E953]={
+ category="nd",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x1E953,
+ },
+ [0x1E954]={
+ category="nd",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x1E954,
+ },
+ [0x1E955]={
+ category="nd",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x1E955,
+ },
+ [0x1E956]={
+ category="nd",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x1E956,
+ },
+ [0x1E957]={
+ category="nd",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x1E957,
+ },
+ [0x1E958]={
+ category="nd",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x1E958,
+ },
+ [0x1E959]={
+ category="nd",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x1E959,
+ },
+ [0x1E95E]={
+ category="po",
+ direction="r",
+ linebreak="op",
+ unicodeslot=0x1E95E,
+ },
+ [0x1E95F]={
+ category="po",
+ direction="r",
+ linebreak="op",
+ unicodeslot=0x1E95F,
+ },
+ [0x1EC71]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC71,
+ },
+ [0x1EC72]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC72,
+ },
+ [0x1EC73]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC73,
+ },
+ [0x1EC74]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC74,
+ },
+ [0x1EC75]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC75,
+ },
+ [0x1EC76]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC76,
+ },
+ [0x1EC77]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC77,
+ },
+ [0x1EC78]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC78,
+ },
+ [0x1EC79]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC79,
+ },
+ [0x1EC7A]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC7A,
+ },
+ [0x1EC7B]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC7B,
+ },
+ [0x1EC7C]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC7C,
+ },
+ [0x1EC7D]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC7D,
+ },
+ [0x1EC7E]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC7E,
+ },
+ [0x1EC7F]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC7F,
+ },
+ [0x1EC80]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC80,
+ },
+ [0x1EC81]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC81,
+ },
+ [0x1EC82]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC82,
+ },
+ [0x1EC83]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC83,
+ },
+ [0x1EC84]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC84,
+ },
+ [0x1EC85]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC85,
+ },
+ [0x1EC86]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC86,
+ },
+ [0x1EC87]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC87,
+ },
+ [0x1EC88]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC88,
+ },
+ [0x1EC89]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC89,
+ },
+ [0x1EC8A]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC8A,
+ },
+ [0x1EC8B]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC8B,
+ },
+ [0x1EC8C]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC8C,
+ },
+ [0x1EC8D]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC8D,
+ },
+ [0x1EC8E]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC8E,
+ },
+ [0x1EC8F]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC8F,
+ },
+ [0x1EC90]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC90,
+ },
+ [0x1EC91]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC91,
+ },
+ [0x1EC92]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC92,
+ },
+ [0x1EC93]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC93,
+ },
+ [0x1EC94]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC94,
+ },
+ [0x1EC95]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC95,
+ },
+ [0x1EC96]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC96,
+ },
+ [0x1EC97]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC97,
+ },
+ [0x1EC98]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC98,
+ },
+ [0x1EC99]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC99,
+ },
+ [0x1EC9A]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC9A,
+ },
+ [0x1EC9B]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC9B,
+ },
+ [0x1EC9C]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC9C,
+ },
+ [0x1EC9D]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC9D,
+ },
+ [0x1EC9E]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC9E,
+ },
+ [0x1EC9F]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1EC9F,
+ },
+ [0x1ECA0]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECA0,
+ },
+ [0x1ECA1]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECA1,
+ },
+ [0x1ECA2]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECA2,
+ },
+ [0x1ECA3]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECA3,
+ },
+ [0x1ECA4]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECA4,
+ },
+ [0x1ECA5]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECA5,
+ },
+ [0x1ECA6]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECA6,
+ },
+ [0x1ECA7]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECA7,
+ },
+ [0x1ECA8]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECA8,
+ },
+ [0x1ECA9]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECA9,
+ },
+ [0x1ECAA]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECAA,
+ },
+ [0x1ECAB]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECAB,
+ },
+ [0x1ECAC]={
+ category="so",
+ direction="al",
+ linebreak="po",
+ unicodeslot=0x1ECAC,
+ },
+ [0x1ECAD]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECAD,
+ },
+ [0x1ECAE]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECAE,
+ },
+ [0x1ECAF]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECAF,
+ },
+ [0x1ECB0]={
+ category="sc",
+ direction="al",
+ linebreak="po",
+ unicodeslot=0x1ECB0,
+ },
+ [0x1ECB1]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECB1,
+ },
+ [0x1ECB2]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECB2,
+ },
+ [0x1ECB3]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECB3,
+ },
+ [0x1ECB4]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ECB4,
+ },
+ [0x1ED01]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED01,
+ },
+ [0x1ED02]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED02,
+ },
+ [0x1ED03]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED03,
+ },
+ [0x1ED04]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED04,
+ },
+ [0x1ED05]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED05,
+ },
+ [0x1ED06]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED06,
+ },
+ [0x1ED07]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED07,
+ },
+ [0x1ED08]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED08,
+ },
+ [0x1ED09]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED09,
+ },
+ [0x1ED0A]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED0A,
+ },
+ [0x1ED0B]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED0B,
+ },
+ [0x1ED0C]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED0C,
+ },
+ [0x1ED0D]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED0D,
+ },
+ [0x1ED0E]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED0E,
+ },
+ [0x1ED0F]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED0F,
+ },
+ [0x1ED10]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED10,
+ },
+ [0x1ED11]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED11,
+ },
+ [0x1ED12]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED12,
+ },
+ [0x1ED13]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED13,
+ },
+ [0x1ED14]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED14,
+ },
+ [0x1ED15]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED15,
+ },
+ [0x1ED16]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED16,
+ },
+ [0x1ED17]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED17,
+ },
+ [0x1ED18]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED18,
+ },
+ [0x1ED19]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED19,
+ },
+ [0x1ED1A]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED1A,
+ },
+ [0x1ED1B]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED1B,
+ },
+ [0x1ED1C]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED1C,
+ },
+ [0x1ED1D]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED1D,
+ },
+ [0x1ED1E]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED1E,
+ },
+ [0x1ED1F]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED1F,
+ },
+ [0x1ED20]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED20,
+ },
+ [0x1ED21]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED21,
+ },
+ [0x1ED22]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED22,
+ },
+ [0x1ED23]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED23,
+ },
+ [0x1ED24]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED24,
+ },
+ [0x1ED25]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED25,
+ },
+ [0x1ED26]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED26,
+ },
+ [0x1ED27]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED27,
+ },
+ [0x1ED28]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED28,
+ },
+ [0x1ED29]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED29,
+ },
+ [0x1ED2A]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED2A,
+ },
+ [0x1ED2B]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED2B,
+ },
+ [0x1ED2C]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED2C,
+ },
+ [0x1ED2D]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED2D,
+ },
+ [0x1ED2E]={
+ category="so",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED2E,
+ },
+ [0x1ED2F]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED2F,
+ },
+ [0x1ED30]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED30,
+ },
+ [0x1ED31]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED31,
+ },
+ [0x1ED32]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED32,
+ },
+ [0x1ED33]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED33,
+ },
+ [0x1ED34]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED34,
+ },
+ [0x1ED35]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED35,
+ },
+ [0x1ED36]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED36,
+ },
+ [0x1ED37]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED37,
+ },
+ [0x1ED38]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED38,
+ },
+ [0x1ED39]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED39,
+ },
+ [0x1ED3A]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED3A,
+ },
+ [0x1ED3B]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED3B,
+ },
+ [0x1ED3C]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED3C,
+ },
+ [0x1ED3D]={
+ category="no",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED3D,
+ },
+ [0x1EE00]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x627 },
+ unicodeslot=0x1EE00,
+ },
+ [0x1EE01]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x628 },
+ unicodeslot=0x1EE01,
+ },
+ [0x1EE02]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62C },
+ unicodeslot=0x1EE02,
+ },
+ [0x1EE03]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62F },
+ unicodeslot=0x1EE03,
+ },
+ [0x1EE05]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x648 },
+ unicodeslot=0x1EE05,
+ },
+ [0x1EE06]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x632 },
+ unicodeslot=0x1EE06,
+ },
+ [0x1EE07]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62D },
+ unicodeslot=0x1EE07,
+ },
+ [0x1EE08]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x637 },
+ unicodeslot=0x1EE08,
+ },
+ [0x1EE09]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x64A },
+ unicodeslot=0x1EE09,
+ },
+ [0x1EE0A]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x643 },
+ unicodeslot=0x1EE0A,
+ },
+ [0x1EE0B]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x644 },
+ unicodeslot=0x1EE0B,
+ },
+ [0x1EE0C]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x645 },
+ unicodeslot=0x1EE0C,
+ },
+ [0x1EE0D]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x646 },
+ unicodeslot=0x1EE0D,
+ },
+ [0x1EE0E]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x633 },
+ unicodeslot=0x1EE0E,
+ },
+ [0x1EE0F]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x639 },
+ unicodeslot=0x1EE0F,
+ },
+ [0x1EE10]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x641 },
+ unicodeslot=0x1EE10,
+ },
+ [0x1EE11]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x635 },
+ unicodeslot=0x1EE11,
+ },
+ [0x1EE12]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x642 },
+ unicodeslot=0x1EE12,
+ },
+ [0x1EE13]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x631 },
+ unicodeslot=0x1EE13,
+ },
+ [0x1EE14]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x634 },
+ unicodeslot=0x1EE14,
+ },
+ [0x1EE15]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62A },
+ unicodeslot=0x1EE15,
+ },
+ [0x1EE16]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62B },
+ unicodeslot=0x1EE16,
+ },
+ [0x1EE17]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62E },
+ unicodeslot=0x1EE17,
+ },
+ [0x1EE18]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x630 },
+ unicodeslot=0x1EE18,
+ },
+ [0x1EE19]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x636 },
+ unicodeslot=0x1EE19,
+ },
+ [0x1EE1A]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x638 },
+ unicodeslot=0x1EE1A,
+ },
+ [0x1EE1B]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x63A },
+ unicodeslot=0x1EE1B,
+ },
+ [0x1EE1C]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x66E },
+ unicodeslot=0x1EE1C,
+ },
+ [0x1EE1D]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x6BA },
+ unicodeslot=0x1EE1D,
+ },
+ [0x1EE1E]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x6A1 },
+ unicodeslot=0x1EE1E,
+ },
+ [0x1EE1F]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x66F },
+ unicodeslot=0x1EE1F,
+ },
+ [0x1EE21]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x628 },
+ unicodeslot=0x1EE21,
+ },
+ [0x1EE22]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62C },
+ unicodeslot=0x1EE22,
+ },
+ [0x1EE24]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x647 },
+ unicodeslot=0x1EE24,
+ },
+ [0x1EE27]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62D },
+ unicodeslot=0x1EE27,
+ },
+ [0x1EE29]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x64A },
+ unicodeslot=0x1EE29,
+ },
+ [0x1EE2A]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x643 },
+ unicodeslot=0x1EE2A,
+ },
+ [0x1EE2B]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x644 },
+ unicodeslot=0x1EE2B,
+ },
+ [0x1EE2C]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x645 },
+ unicodeslot=0x1EE2C,
+ },
+ [0x1EE2D]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x646 },
+ unicodeslot=0x1EE2D,
+ },
+ [0x1EE2E]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x633 },
+ unicodeslot=0x1EE2E,
+ },
+ [0x1EE2F]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x639 },
+ unicodeslot=0x1EE2F,
+ },
+ [0x1EE30]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x641 },
+ unicodeslot=0x1EE30,
+ },
+ [0x1EE31]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x635 },
+ unicodeslot=0x1EE31,
+ },
+ [0x1EE32]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x642 },
+ unicodeslot=0x1EE32,
+ },
+ [0x1EE34]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x634 },
+ unicodeslot=0x1EE34,
+ },
+ [0x1EE35]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62A },
+ unicodeslot=0x1EE35,
+ },
+ [0x1EE36]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62B },
+ unicodeslot=0x1EE36,
+ },
+ [0x1EE37]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62E },
+ unicodeslot=0x1EE37,
+ },
+ [0x1EE39]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x636 },
+ unicodeslot=0x1EE39,
+ },
+ [0x1EE3B]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x63A },
+ unicodeslot=0x1EE3B,
+ },
+ [0x1EE42]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62C },
+ unicodeslot=0x1EE42,
+ },
+ [0x1EE47]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62D },
+ unicodeslot=0x1EE47,
+ },
+ [0x1EE49]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x64A },
+ unicodeslot=0x1EE49,
+ },
+ [0x1EE4B]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x644 },
+ unicodeslot=0x1EE4B,
+ },
+ [0x1EE4D]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x646 },
+ unicodeslot=0x1EE4D,
+ },
+ [0x1EE4E]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x633 },
+ unicodeslot=0x1EE4E,
+ },
+ [0x1EE4F]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x639 },
+ unicodeslot=0x1EE4F,
+ },
+ [0x1EE51]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x635 },
+ unicodeslot=0x1EE51,
+ },
+ [0x1EE52]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x642 },
+ unicodeslot=0x1EE52,
+ },
+ [0x1EE54]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x634 },
+ unicodeslot=0x1EE54,
+ },
+ [0x1EE57]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62E },
+ unicodeslot=0x1EE57,
+ },
+ [0x1EE59]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x636 },
+ unicodeslot=0x1EE59,
+ },
+ [0x1EE5B]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x63A },
+ unicodeslot=0x1EE5B,
+ },
+ [0x1EE5D]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x6BA },
+ unicodeslot=0x1EE5D,
+ },
+ [0x1EE5F]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x66F },
+ unicodeslot=0x1EE5F,
+ },
+ [0x1EE61]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x628 },
+ unicodeslot=0x1EE61,
+ },
+ [0x1EE62]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62C },
+ unicodeslot=0x1EE62,
+ },
+ [0x1EE64]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x647 },
+ unicodeslot=0x1EE64,
+ },
+ [0x1EE67]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62D },
+ unicodeslot=0x1EE67,
+ },
+ [0x1EE68]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x637 },
+ unicodeslot=0x1EE68,
+ },
+ [0x1EE69]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x64A },
+ unicodeslot=0x1EE69,
+ },
+ [0x1EE6A]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x643 },
+ unicodeslot=0x1EE6A,
+ },
+ [0x1EE6C]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x645 },
+ unicodeslot=0x1EE6C,
+ },
+ [0x1EE6D]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x646 },
+ unicodeslot=0x1EE6D,
+ },
+ [0x1EE6E]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x633 },
+ unicodeslot=0x1EE6E,
+ },
+ [0x1EE6F]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x639 },
+ unicodeslot=0x1EE6F,
+ },
+ [0x1EE70]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x641 },
+ unicodeslot=0x1EE70,
+ },
+ [0x1EE71]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x635 },
+ unicodeslot=0x1EE71,
+ },
+ [0x1EE72]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x642 },
+ unicodeslot=0x1EE72,
+ },
+ [0x1EE74]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x634 },
+ unicodeslot=0x1EE74,
+ },
+ [0x1EE75]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62A },
+ unicodeslot=0x1EE75,
+ },
+ [0x1EE76]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62B },
+ unicodeslot=0x1EE76,
+ },
+ [0x1EE77]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62E },
+ unicodeslot=0x1EE77,
+ },
+ [0x1EE79]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x636 },
+ unicodeslot=0x1EE79,
+ },
+ [0x1EE7A]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x638 },
+ unicodeslot=0x1EE7A,
+ },
+ [0x1EE7B]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x63A },
+ unicodeslot=0x1EE7B,
+ },
+ [0x1EE7C]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x66E },
+ unicodeslot=0x1EE7C,
+ },
+ [0x1EE7E]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x6A1 },
+ unicodeslot=0x1EE7E,
+ },
+ [0x1EE80]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x627 },
+ unicodeslot=0x1EE80,
+ },
+ [0x1EE81]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x628 },
+ unicodeslot=0x1EE81,
+ },
+ [0x1EE82]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62C },
+ unicodeslot=0x1EE82,
+ },
+ [0x1EE83]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62F },
+ unicodeslot=0x1EE83,
+ },
+ [0x1EE84]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x647 },
+ unicodeslot=0x1EE84,
+ },
+ [0x1EE85]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x648 },
+ unicodeslot=0x1EE85,
+ },
+ [0x1EE86]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x632 },
+ unicodeslot=0x1EE86,
+ },
+ [0x1EE87]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62D },
+ unicodeslot=0x1EE87,
+ },
+ [0x1EE88]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x637 },
+ unicodeslot=0x1EE88,
+ },
+ [0x1EE89]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x64A },
+ unicodeslot=0x1EE89,
+ },
+ [0x1EE8B]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x644 },
+ unicodeslot=0x1EE8B,
+ },
+ [0x1EE8C]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x645 },
+ unicodeslot=0x1EE8C,
+ },
+ [0x1EE8D]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x646 },
+ unicodeslot=0x1EE8D,
+ },
+ [0x1EE8E]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x633 },
+ unicodeslot=0x1EE8E,
+ },
+ [0x1EE8F]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x639 },
+ unicodeslot=0x1EE8F,
+ },
+ [0x1EE90]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x641 },
+ unicodeslot=0x1EE90,
+ },
+ [0x1EE91]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x635 },
+ unicodeslot=0x1EE91,
+ },
+ [0x1EE92]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x642 },
+ unicodeslot=0x1EE92,
+ },
+ [0x1EE93]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x631 },
+ unicodeslot=0x1EE93,
+ },
+ [0x1EE94]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x634 },
+ unicodeslot=0x1EE94,
+ },
+ [0x1EE95]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62A },
+ unicodeslot=0x1EE95,
+ },
+ [0x1EE96]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62B },
+ unicodeslot=0x1EE96,
+ },
+ [0x1EE97]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62E },
+ unicodeslot=0x1EE97,
+ },
+ [0x1EE98]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x630 },
+ unicodeslot=0x1EE98,
+ },
+ [0x1EE99]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x636 },
+ unicodeslot=0x1EE99,
+ },
+ [0x1EE9A]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x638 },
+ unicodeslot=0x1EE9A,
+ },
+ [0x1EE9B]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x63A },
+ unicodeslot=0x1EE9B,
+ },
+ [0x1EEA1]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x628 },
+ unicodeslot=0x1EEA1,
+ },
+ [0x1EEA2]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62C },
+ unicodeslot=0x1EEA2,
+ },
+ [0x1EEA3]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62F },
+ unicodeslot=0x1EEA3,
+ },
+ [0x1EEA5]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x648 },
+ unicodeslot=0x1EEA5,
+ },
+ [0x1EEA6]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x632 },
+ unicodeslot=0x1EEA6,
+ },
+ [0x1EEA7]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62D },
+ unicodeslot=0x1EEA7,
+ },
+ [0x1EEA8]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x637 },
+ unicodeslot=0x1EEA8,
+ },
+ [0x1EEA9]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x64A },
+ unicodeslot=0x1EEA9,
+ },
+ [0x1EEAB]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x644 },
+ unicodeslot=0x1EEAB,
+ },
+ [0x1EEAC]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x645 },
+ unicodeslot=0x1EEAC,
+ },
+ [0x1EEAD]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x646 },
+ unicodeslot=0x1EEAD,
+ },
+ [0x1EEAE]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x633 },
+ unicodeslot=0x1EEAE,
+ },
+ [0x1EEAF]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x639 },
+ unicodeslot=0x1EEAF,
+ },
+ [0x1EEB0]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x641 },
+ unicodeslot=0x1EEB0,
+ },
+ [0x1EEB1]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x635 },
+ unicodeslot=0x1EEB1,
+ },
+ [0x1EEB2]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x642 },
+ unicodeslot=0x1EEB2,
+ },
+ [0x1EEB3]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x631 },
+ unicodeslot=0x1EEB3,
+ },
+ [0x1EEB4]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x634 },
+ unicodeslot=0x1EEB4,
+ },
+ [0x1EEB5]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62A },
+ unicodeslot=0x1EEB5,
+ },
+ [0x1EEB6]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62B },
+ unicodeslot=0x1EEB6,
+ },
+ [0x1EEB7]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x62E },
+ unicodeslot=0x1EEB7,
+ },
+ [0x1EEB8]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x630 },
+ unicodeslot=0x1EEB8,
+ },
+ [0x1EEB9]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x636 },
+ unicodeslot=0x1EEB9,
+ },
+ [0x1EEBA]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x638 },
+ unicodeslot=0x1EEBA,
+ },
+ [0x1EEBB]={
+ category="lo",
+ direction="al",
+ linebreak="al",
+ specials={ "font", 0x63A },
+ unicodeslot=0x1EEBB,
+ },
+ [0x1EEF0]={
+ category="sm",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1EEF0,
+ },
+ [0x1EEF1]={
+ category="sm",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1EEF1,
+ },
+ [0x1F000]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F000,
+ },
+ [0x1F001]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F001,
+ },
+ [0x1F002]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F002,
+ },
+ [0x1F003]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F003,
+ },
+ [0x1F004]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F004,
+ },
+ [0x1F005]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F005,
+ },
+ [0x1F006]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F006,
+ },
+ [0x1F007]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F007,
+ },
+ [0x1F008]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F008,
+ },
+ [0x1F009]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F009,
+ },
+ [0x1F00A]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F00A,
+ },
+ [0x1F00B]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F00B,
+ },
+ [0x1F00C]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F00C,
+ },
+ [0x1F00D]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F00D,
+ },
+ [0x1F00E]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F00E,
+ },
+ [0x1F00F]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F00F,
+ },
+ [0x1F010]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F010,
+ },
+ [0x1F011]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F011,
+ },
+ [0x1F012]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F012,
+ },
+ [0x1F013]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F013,
+ },
+ [0x1F014]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F014,
+ },
+ [0x1F015]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F015,
+ },
+ [0x1F016]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F016,
+ },
+ [0x1F017]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F017,
+ },
+ [0x1F018]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F018,
+ },
+ [0x1F019]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F019,
+ },
+ [0x1F01A]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F01A,
+ },
+ [0x1F01B]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F01B,
+ },
+ [0x1F01C]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F01C,
+ },
+ [0x1F01D]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F01D,
+ },
+ [0x1F01E]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F01E,
+ },
+ [0x1F01F]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F01F,
+ },
+ [0x1F020]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F020,
+ },
+ [0x1F021]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F021,
+ },
+ [0x1F022]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F022,
+ },
+ [0x1F023]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F023,
+ },
+ [0x1F024]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F024,
+ },
+ [0x1F025]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F025,
+ },
+ [0x1F026]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F026,
+ },
+ [0x1F027]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F027,
+ },
+ [0x1F028]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F028,
+ },
+ [0x1F029]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F029,
+ },
+ [0x1F02A]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F02A,
+ },
+ [0x1F02B]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F02B,
+ },
+ [0x1F030]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F030,
+ },
+ [0x1F031]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F031,
+ },
+ [0x1F032]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F032,
+ },
+ [0x1F033]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F033,
+ },
+ [0x1F034]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F034,
+ },
+ [0x1F035]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F035,
+ },
+ [0x1F036]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F036,
+ },
+ [0x1F037]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F037,
+ },
+ [0x1F038]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F038,
+ },
+ [0x1F039]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F039,
+ },
+ [0x1F03A]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F03A,
+ },
+ [0x1F03B]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F03B,
+ },
+ [0x1F03C]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F03C,
+ },
+ [0x1F03D]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F03D,
+ },
+ [0x1F03E]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F03E,
+ },
+ [0x1F03F]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F03F,
+ },
+ [0x1F040]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F040,
+ },
+ [0x1F041]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F041,
+ },
+ [0x1F042]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F042,
+ },
+ [0x1F043]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F043,
+ },
+ [0x1F044]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F044,
+ },
+ [0x1F045]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F045,
+ },
+ [0x1F046]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F046,
+ },
+ [0x1F047]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F047,
+ },
+ [0x1F048]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F048,
+ },
+ [0x1F049]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F049,
+ },
+ [0x1F04A]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F04A,
+ },
+ [0x1F04B]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F04B,
+ },
+ [0x1F04C]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F04C,
+ },
+ [0x1F04D]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F04D,
+ },
+ [0x1F04E]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F04E,
+ },
+ [0x1F04F]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F04F,
+ },
+ [0x1F050]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F050,
+ },
+ [0x1F051]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F051,
+ },
+ [0x1F052]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F052,
+ },
+ [0x1F053]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F053,
+ },
+ [0x1F054]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F054,
+ },
+ [0x1F055]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F055,
+ },
+ [0x1F056]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F056,
+ },
+ [0x1F057]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F057,
+ },
+ [0x1F058]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F058,
+ },
+ [0x1F059]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F059,
+ },
+ [0x1F05A]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F05A,
+ },
+ [0x1F05B]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F05B,
+ },
+ [0x1F05C]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F05C,
+ },
+ [0x1F05D]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F05D,
+ },
+ [0x1F05E]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F05E,
+ },
+ [0x1F05F]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F05F,
+ },
+ [0x1F060]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F060,
+ },
+ [0x1F061]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F061,
+ },
+ [0x1F062]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F062,
+ },
+ [0x1F063]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F063,
+ },
+ [0x1F064]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F064,
+ },
+ [0x1F065]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F065,
+ },
+ [0x1F066]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F066,
+ },
+ [0x1F067]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F067,
+ },
+ [0x1F068]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F068,
+ },
+ [0x1F069]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F069,
+ },
+ [0x1F06A]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F06A,
+ },
+ [0x1F06B]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F06B,
+ },
+ [0x1F06C]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F06C,
+ },
+ [0x1F06D]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F06D,
+ },
+ [0x1F06E]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F06E,
+ },
+ [0x1F06F]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F06F,
+ },
+ [0x1F070]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F070,
+ },
+ [0x1F071]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F071,
+ },
+ [0x1F072]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F072,
+ },
+ [0x1F073]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F073,
+ },
+ [0x1F074]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F074,
+ },
+ [0x1F075]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F075,
+ },
+ [0x1F076]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F076,
+ },
+ [0x1F077]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F077,
+ },
+ [0x1F078]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F078,
+ },
+ [0x1F079]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F079,
+ },
+ [0x1F07A]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F07A,
+ },
+ [0x1F07B]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F07B,
+ },
+ [0x1F07C]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F07C,
+ },
+ [0x1F07D]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F07D,
+ },
+ [0x1F07E]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F07E,
+ },
+ [0x1F07F]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F07F,
+ },
+ [0x1F080]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F080,
+ },
+ [0x1F081]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F081,
+ },
+ [0x1F082]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F082,
+ },
+ [0x1F083]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F083,
+ },
+ [0x1F084]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F084,
+ },
+ [0x1F085]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F085,
+ },
+ [0x1F086]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F086,
+ },
+ [0x1F087]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F087,
+ },
+ [0x1F088]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F088,
+ },
+ [0x1F089]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F089,
+ },
+ [0x1F08A]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F08A,
+ },
+ [0x1F08B]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F08B,
+ },
+ [0x1F08C]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F08C,
+ },
+ [0x1F08D]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F08D,
+ },
+ [0x1F08E]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F08E,
+ },
+ [0x1F08F]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F08F,
+ },
+ [0x1F090]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F090,
+ },
+ [0x1F091]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F091,
+ },
+ [0x1F092]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F092,
+ },
+ [0x1F093]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F093,
+ },
+ [0x1F0A0]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0A0,
+ },
+ [0x1F0A1]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0A1,
+ },
+ [0x1F0A2]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0A2,
+ },
+ [0x1F0A3]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0A3,
+ },
+ [0x1F0A4]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0A4,
+ },
+ [0x1F0A5]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0A5,
+ },
+ [0x1F0A6]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0A6,
+ },
+ [0x1F0A7]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0A7,
+ },
+ [0x1F0A8]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0A8,
+ },
+ [0x1F0A9]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0A9,
+ },
+ [0x1F0AA]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0AA,
+ },
+ [0x1F0AB]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0AB,
+ },
+ [0x1F0AC]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0AC,
+ },
+ [0x1F0AD]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0AD,
+ },
+ [0x1F0AE]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0AE,
+ },
+ [0x1F0B1]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0B1,
+ },
+ [0x1F0B2]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0B2,
+ },
+ [0x1F0B3]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0B3,
+ },
+ [0x1F0B4]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0B4,
+ },
+ [0x1F0B5]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0B5,
+ },
+ [0x1F0B6]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0B6,
+ },
+ [0x1F0B7]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0B7,
+ },
+ [0x1F0B8]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0B8,
+ },
+ [0x1F0B9]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0B9,
+ },
+ [0x1F0BA]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0BA,
+ },
+ [0x1F0BB]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0BB,
+ },
+ [0x1F0BC]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0BC,
+ },
+ [0x1F0BD]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0BD,
+ },
+ [0x1F0BE]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0BE,
+ },
+ [0x1F0BF]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0BF,
+ },
+ [0x1F0C1]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0C1,
+ },
+ [0x1F0C2]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0C2,
+ },
+ [0x1F0C3]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0C3,
+ },
+ [0x1F0C4]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0C4,
+ },
+ [0x1F0C5]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0C5,
+ },
+ [0x1F0C6]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0C6,
+ },
+ [0x1F0C7]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0C7,
+ },
+ [0x1F0C8]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0C8,
+ },
+ [0x1F0C9]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0C9,
+ },
+ [0x1F0CA]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0CA,
+ },
+ [0x1F0CB]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0CB,
+ },
+ [0x1F0CC]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0CC,
+ },
+ [0x1F0CD]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0CD,
+ },
+ [0x1F0CE]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0CE,
+ },
+ [0x1F0CF]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0CF,
+ },
+ [0x1F0D1]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0D1,
+ },
+ [0x1F0D2]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0D2,
+ },
+ [0x1F0D3]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0D3,
+ },
+ [0x1F0D4]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0D4,
+ },
+ [0x1F0D5]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0D5,
+ },
+ [0x1F0D6]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0D6,
+ },
+ [0x1F0D7]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0D7,
+ },
+ [0x1F0D8]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0D8,
+ },
+ [0x1F0D9]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0D9,
+ },
+ [0x1F0DA]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0DA,
+ },
+ [0x1F0DB]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0DB,
+ },
+ [0x1F0DC]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0DC,
+ },
+ [0x1F0DD]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0DD,
+ },
+ [0x1F0DE]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0DE,
+ },
+ [0x1F0DF]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0DF,
+ },
+ [0x1F0E0]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E0,
+ },
+ [0x1F0E1]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E1,
+ },
+ [0x1F0E2]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E2,
+ },
+ [0x1F0E3]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E3,
+ },
+ [0x1F0E4]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E4,
+ },
+ [0x1F0E5]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E5,
+ },
+ [0x1F0E6]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E6,
+ },
+ [0x1F0E7]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E7,
+ },
+ [0x1F0E8]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E8,
+ },
+ [0x1F0E9]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0E9,
+ },
+ [0x1F0EA]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0EA,
+ },
+ [0x1F0EB]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0EB,
+ },
+ [0x1F0EC]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0EC,
+ },
+ [0x1F0ED]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0ED,
+ },
+ [0x1F0EE]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0EE,
+ },
+ [0x1F0EF]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0EF,
+ },
+ [0x1F0F0]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0F0,
+ },
+ [0x1F0F1]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0F1,
+ },
+ [0x1F0F2]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0F2,
+ },
+ [0x1F0F3]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0F3,
+ },
+ [0x1F0F4]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0F4,
+ },
+ [0x1F0F5]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F0F5,
+ },
+ [0x1F100]={
+ category="no",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x30, 0x2E },
+ unicodeslot=0x1F100,
+ },
+ [0x1F101]={
+ category="no",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x30, 0x2C },
+ unicodeslot=0x1F101,
+ },
+ [0x1F102]={
+ category="no",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x31, 0x2C },
+ unicodeslot=0x1F102,
+ },
+ [0x1F103]={
+ category="no",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x32, 0x2C },
+ unicodeslot=0x1F103,
+ },
+ [0x1F104]={
+ category="no",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x33, 0x2C },
+ unicodeslot=0x1F104,
+ },
+ [0x1F105]={
+ category="no",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x34, 0x2C },
+ unicodeslot=0x1F105,
+ },
+ [0x1F106]={
+ category="no",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x35, 0x2C },
+ unicodeslot=0x1F106,
+ },
+ [0x1F107]={
+ category="no",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x36, 0x2C },
+ unicodeslot=0x1F107,
+ },
+ [0x1F108]={
+ category="no",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x37, 0x2C },
+ unicodeslot=0x1F108,
+ },
+ [0x1F109]={
+ category="no",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x38, 0x2C },
+ unicodeslot=0x1F109,
+ },
+ [0x1F10A]={
+ category="no",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x39, 0x2C },
+ unicodeslot=0x1F10A,
+ },
+ [0x1F10B]={
+ category="no",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x1F10B,
+ },
+ [0x1F10C]={
+ category="no",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x1F10C,
+ },
+ [0x1F10D]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F10D,
+ },
+ [0x1F10E]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F10E,
+ },
+ [0x1F10F]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F10F,
+ },
+ [0x1F110]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x41, 0x29 },
+ unicodeslot=0x1F110,
+ },
+ [0x1F111]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x42, 0x29 },
+ unicodeslot=0x1F111,
+ },
+ [0x1F112]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x43, 0x29 },
+ unicodeslot=0x1F112,
+ },
+ [0x1F113]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x44, 0x29 },
+ unicodeslot=0x1F113,
},
- [0x1EEA8]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x637 },
- unicodeslot=0x1EEA8,
+ [0x1F114]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x45, 0x29 },
+ unicodeslot=0x1F114,
},
- [0x1EEA9]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x64A },
- unicodeslot=0x1EEA9,
+ [0x1F115]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x46, 0x29 },
+ unicodeslot=0x1F115,
},
- [0x1EEAB]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x644 },
- unicodeslot=0x1EEAB,
+ [0x1F116]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x47, 0x29 },
+ unicodeslot=0x1F116,
},
- [0x1EEAC]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x645 },
- unicodeslot=0x1EEAC,
+ [0x1F117]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x48, 0x29 },
+ unicodeslot=0x1F117,
},
- [0x1EEAD]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x646 },
- unicodeslot=0x1EEAD,
+ [0x1F118]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x49, 0x29 },
+ unicodeslot=0x1F118,
},
- [0x1EEAE]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x633 },
- unicodeslot=0x1EEAE,
+ [0x1F119]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x4A, 0x29 },
+ unicodeslot=0x1F119,
},
- [0x1EEAF]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x639 },
- unicodeslot=0x1EEAF,
+ [0x1F11A]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x4B, 0x29 },
+ unicodeslot=0x1F11A,
},
- [0x1EEB0]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x641 },
- unicodeslot=0x1EEB0,
+ [0x1F11B]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x4C, 0x29 },
+ unicodeslot=0x1F11B,
},
- [0x1EEB1]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x635 },
- unicodeslot=0x1EEB1,
+ [0x1F11C]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x4D, 0x29 },
+ unicodeslot=0x1F11C,
},
- [0x1EEB2]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x642 },
- unicodeslot=0x1EEB2,
+ [0x1F11D]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x4E, 0x29 },
+ unicodeslot=0x1F11D,
},
- [0x1EEB3]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x631 },
- unicodeslot=0x1EEB3,
+ [0x1F11E]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x4F, 0x29 },
+ unicodeslot=0x1F11E,
},
- [0x1EEB4]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x634 },
- unicodeslot=0x1EEB4,
+ [0x1F11F]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x50, 0x29 },
+ unicodeslot=0x1F11F,
},
- [0x1EEB5]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x62A },
- unicodeslot=0x1EEB5,
+ [0x1F120]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x51, 0x29 },
+ unicodeslot=0x1F120,
},
- [0x1EEB6]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x62B },
- unicodeslot=0x1EEB6,
+ [0x1F121]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x52, 0x29 },
+ unicodeslot=0x1F121,
},
- [0x1EEB7]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x62E },
- unicodeslot=0x1EEB7,
+ [0x1F122]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x53, 0x29 },
+ unicodeslot=0x1F122,
},
- [0x1EEB8]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x630 },
- unicodeslot=0x1EEB8,
+ [0x1F123]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x54, 0x29 },
+ unicodeslot=0x1F123,
},
- [0x1EEB9]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x636 },
- unicodeslot=0x1EEB9,
+ [0x1F124]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x55, 0x29 },
+ unicodeslot=0x1F124,
},
- [0x1EEBA]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x638 },
- unicodeslot=0x1EEBA,
+ [0x1F125]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x56, 0x29 },
+ unicodeslot=0x1F125,
},
- [0x1EEBB]={
- category="lo",
- direction="al",
- linebreak="al",
- specials={ "font", 0x63A },
- unicodeslot=0x1EEBB,
+ [0x1F126]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x57, 0x29 },
+ unicodeslot=0x1F126,
},
- [0x1EEF0]={
- category="sm",
- direction="on",
- linebreak="al",
- unicodeslot=0x1EEF0,
+ [0x1F127]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x58, 0x29 },
+ unicodeslot=0x1F127,
},
- [0x1EEF1]={
- category="sm",
- direction="on",
- linebreak="al",
- unicodeslot=0x1EEF1,
+ [0x1F128]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x59, 0x29 },
+ unicodeslot=0x1F128,
},
- [0x1F000]={
+ [0x1F129]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F000,
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x28, 0x5A, 0x29 },
+ unicodeslot=0x1F129,
},
- [0x1F001]={
+ [0x1F12A]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F001,
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x3014, 0x53, 0x3015 },
+ unicodeslot=0x1F12A,
},
- [0x1F002]={
+ [0x1F12B]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F002,
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x43 },
+ unicodeslot=0x1F12B,
},
- [0x1F003]={
+ [0x1F12C]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F003,
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x52 },
+ unicodeslot=0x1F12C,
},
- [0x1F004]={
+ [0x1F12D]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F004,
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x43, 0x44 },
+ unicodeslot=0x1F12D,
},
- [0x1F005]={
+ [0x1F12E]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F005,
+ direction="l",
+ linebreak="al",
+ specials={ "circle", 0x57, 0x5A },
+ unicodeslot=0x1F12E,
},
- [0x1F006]={
+ [0x1F12F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F006,
+ linebreak="al",
+ unicodeslot=0x1F12F,
},
- [0x1F007]={
+ [0x1F130]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F007,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x41 },
+ unicodeslot=0x1F130,
},
- [0x1F008]={
+ [0x1F131]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F008,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x42 },
+ unicodeslot=0x1F131,
},
- [0x1F009]={
+ [0x1F132]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F009,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x43 },
+ unicodeslot=0x1F132,
},
- [0x1F00A]={
+ [0x1F133]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F00A,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x44 },
+ unicodeslot=0x1F133,
},
- [0x1F00B]={
+ [0x1F134]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F00B,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x45 },
+ unicodeslot=0x1F134,
},
- [0x1F00C]={
+ [0x1F135]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F00C,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x46 },
+ unicodeslot=0x1F135,
},
- [0x1F00D]={
+ [0x1F136]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F00D,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x47 },
+ unicodeslot=0x1F136,
},
- [0x1F00E]={
+ [0x1F137]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F00E,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x48 },
+ unicodeslot=0x1F137,
},
- [0x1F00F]={
+ [0x1F138]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F00F,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x49 },
+ unicodeslot=0x1F138,
},
- [0x1F010]={
+ [0x1F139]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F010,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x4A },
+ unicodeslot=0x1F139,
},
- [0x1F011]={
+ [0x1F13A]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F011,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x4B },
+ unicodeslot=0x1F13A,
},
- [0x1F012]={
+ [0x1F13B]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F012,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x4C },
+ unicodeslot=0x1F13B,
},
- [0x1F013]={
+ [0x1F13C]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F013,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x4D },
+ unicodeslot=0x1F13C,
},
- [0x1F014]={
+ [0x1F13D]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F014,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x4E },
+ unicodeslot=0x1F13D,
},
- [0x1F015]={
+ [0x1F13E]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F015,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x4F },
+ unicodeslot=0x1F13E,
},
- [0x1F016]={
+ [0x1F13F]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F016,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x50 },
+ unicodeslot=0x1F13F,
},
- [0x1F017]={
+ [0x1F140]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F017,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x51 },
+ unicodeslot=0x1F140,
},
- [0x1F018]={
+ [0x1F141]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F018,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x52 },
+ unicodeslot=0x1F141,
},
- [0x1F019]={
+ [0x1F142]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F019,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x53 },
+ unicodeslot=0x1F142,
},
- [0x1F01A]={
+ [0x1F143]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F01A,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x54 },
+ unicodeslot=0x1F143,
},
- [0x1F01B]={
+ [0x1F144]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F01B,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x55 },
+ unicodeslot=0x1F144,
},
- [0x1F01C]={
+ [0x1F145]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F01C,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x56 },
+ unicodeslot=0x1F145,
},
- [0x1F01D]={
+ [0x1F146]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F01D,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x57 },
+ unicodeslot=0x1F146,
},
- [0x1F01E]={
+ [0x1F147]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F01E,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x58 },
+ unicodeslot=0x1F147,
},
- [0x1F01F]={
+ [0x1F148]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F01F,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x59 },
+ unicodeslot=0x1F148,
},
- [0x1F020]={
+ [0x1F149]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F020,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x5A },
+ unicodeslot=0x1F149,
},
- [0x1F021]={
+ [0x1F14A]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F021,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x48, 0x56 },
+ unicodeslot=0x1F14A,
},
- [0x1F022]={
+ [0x1F14B]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F022,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x4D, 0x56 },
+ unicodeslot=0x1F14B,
},
- [0x1F023]={
+ [0x1F14C]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F023,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x53, 0x44 },
+ unicodeslot=0x1F14C,
},
- [0x1F024]={
+ [0x1F14D]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F024,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x53, 0x53 },
+ unicodeslot=0x1F14D,
},
- [0x1F025]={
+ [0x1F14E]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F025,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x50, 0x50, 0x56 },
+ unicodeslot=0x1F14E,
},
- [0x1F026]={
+ [0x1F14F]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F026,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x57, 0x43 },
+ unicodeslot=0x1F14F,
},
- [0x1F027]={
+ [0x1F150]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F027,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F150,
},
- [0x1F028]={
+ [0x1F151]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F028,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F151,
},
- [0x1F029]={
+ [0x1F152]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F029,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F152,
},
- [0x1F02A]={
+ [0x1F153]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F02A,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F153,
},
- [0x1F02B]={
+ [0x1F154]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F02B,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F154,
},
- [0x1F030]={
+ [0x1F155]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F030,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F155,
},
- [0x1F031]={
+ [0x1F156]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F031,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F156,
},
- [0x1F032]={
+ [0x1F157]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F032,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F157,
},
- [0x1F033]={
+ [0x1F158]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F033,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F158,
},
- [0x1F034]={
+ [0x1F159]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F034,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F159,
},
- [0x1F035]={
+ [0x1F15A]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F035,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F15A,
},
- [0x1F036]={
+ [0x1F15B]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F036,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F15B,
},
- [0x1F037]={
+ [0x1F15C]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F037,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F15C,
},
- [0x1F038]={
+ [0x1F15D]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F038,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F15D,
},
- [0x1F039]={
+ [0x1F15E]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F039,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F15E,
},
- [0x1F03A]={
+ [0x1F15F]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F03A,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F15F,
},
- [0x1F03B]={
+ [0x1F160]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F03B,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F160,
},
- [0x1F03C]={
+ [0x1F161]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F03C,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F161,
},
- [0x1F03D]={
+ [0x1F162]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F03D,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F162,
},
- [0x1F03E]={
+ [0x1F163]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F03E,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F163,
},
- [0x1F03F]={
+ [0x1F164]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F03F,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F164,
},
- [0x1F040]={
+ [0x1F165]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F040,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F165,
},
- [0x1F041]={
+ [0x1F166]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F041,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F166,
},
- [0x1F042]={
+ [0x1F167]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F042,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F167,
},
- [0x1F043]={
+ [0x1F168]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F043,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F168,
},
- [0x1F044]={
+ [0x1F169]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F044,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F169,
},
- [0x1F045]={
+ [0x1F16A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F045,
+ linebreak="al",
+ specials={ "super", 0x4D, 0x43 },
+ unicodeslot=0x1F16A,
},
- [0x1F046]={
+ [0x1F16B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F046,
+ linebreak="al",
+ specials={ "super", 0x4D, 0x44 },
+ unicodeslot=0x1F16B,
},
- [0x1F047]={
+ [0x1F16C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F047,
+ linebreak="al",
+ specials={ "super", 0x4D, 0x52 },
+ unicodeslot=0x1F16C,
},
- [0x1F048]={
+ [0x1F16D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F048,
+ unicodeslot=0x1F16D,
},
- [0x1F049]={
+ [0x1F16E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F049,
+ unicodeslot=0x1F16E,
},
- [0x1F04A]={
+ [0x1F16F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F04A,
+ unicodeslot=0x1F16F,
},
- [0x1F04B]={
+ [0x1F170]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F04B,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F170,
},
- [0x1F04C]={
+ [0x1F171]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F04C,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F171,
},
- [0x1F04D]={
+ [0x1F172]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F04D,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F172,
},
- [0x1F04E]={
+ [0x1F173]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F04E,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F173,
},
- [0x1F04F]={
+ [0x1F174]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F04F,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F174,
},
- [0x1F050]={
+ [0x1F175]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F050,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F175,
},
- [0x1F051]={
+ [0x1F176]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F051,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F176,
},
- [0x1F052]={
+ [0x1F177]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F052,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F177,
},
- [0x1F053]={
+ [0x1F178]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F053,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F178,
},
- [0x1F054]={
+ [0x1F179]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F054,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F179,
},
- [0x1F055]={
+ [0x1F17A]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F055,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F17A,
},
- [0x1F056]={
+ [0x1F17B]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F056,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F17B,
},
- [0x1F057]={
+ [0x1F17C]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F057,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F17C,
},
- [0x1F058]={
+ [0x1F17D]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F058,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F17D,
},
- [0x1F059]={
+ [0x1F17E]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F059,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F17E,
},
- [0x1F05A]={
+ [0x1F17F]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F05A,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F17F,
},
- [0x1F05B]={
+ [0x1F180]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F05B,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F180,
},
- [0x1F05C]={
+ [0x1F181]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F05C,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F181,
},
- [0x1F05D]={
+ [0x1F182]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F05D,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F182,
},
- [0x1F05E]={
+ [0x1F183]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F05E,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F183,
},
- [0x1F05F]={
+ [0x1F184]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F05F,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F184,
},
- [0x1F060]={
+ [0x1F185]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F060,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F185,
},
- [0x1F061]={
+ [0x1F186]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F061,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F186,
+ },
+ [0x1F187]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F187,
+ },
+ [0x1F188]={
+ category="so",
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F188,
},
- [0x1F062]={
+ [0x1F189]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F062,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F189,
},
- [0x1F063]={
+ [0x1F18A]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F063,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F18A,
},
- [0x1F064]={
+ [0x1F18B]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F064,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F18B,
},
- [0x1F065]={
+ [0x1F18C]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F065,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F18C,
},
- [0x1F066]={
+ [0x1F18D]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F066,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F18D,
},
- [0x1F067]={
+ [0x1F18E]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F067,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F18E,
},
- [0x1F068]={
+ [0x1F18F]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F068,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F18F,
},
- [0x1F069]={
+ [0x1F190]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F069,
+ direction="l",
+ linebreak="ai",
+ specials={ "square", 0x44, 0x4A },
+ unicodeslot=0x1F190,
},
- [0x1F06A]={
+ [0x1F191]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F06A,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F191,
},
- [0x1F06B]={
+ [0x1F192]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F06B,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F192,
},
- [0x1F06C]={
+ [0x1F193]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F06C,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F193,
},
- [0x1F06D]={
+ [0x1F194]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F06D,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F194,
},
- [0x1F06E]={
+ [0x1F195]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F06E,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F195,
},
- [0x1F06F]={
+ [0x1F196]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F06F,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F196,
},
- [0x1F070]={
+ [0x1F197]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F070,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F197,
},
- [0x1F071]={
+ [0x1F198]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F071,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F198,
},
- [0x1F072]={
+ [0x1F199]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F072,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F199,
},
- [0x1F073]={
+ [0x1F19A]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F073,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F19A,
},
- [0x1F074]={
+ [0x1F19B]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F074,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F19B,
},
- [0x1F075]={
+ [0x1F19C]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F075,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F19C,
},
- [0x1F076]={
+ [0x1F19D]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F076,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F19D,
},
- [0x1F077]={
+ [0x1F19E]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F077,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F19E,
},
- [0x1F078]={
+ [0x1F19F]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F078,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F19F,
},
- [0x1F079]={
+ [0x1F1A0]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F079,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F1A0,
},
- [0x1F07A]={
+ [0x1F1A1]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F07A,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F1A1,
},
- [0x1F07B]={
+ [0x1F1A2]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F07B,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F1A2,
},
- [0x1F07C]={
+ [0x1F1A3]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F07C,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F1A3,
},
- [0x1F07D]={
+ [0x1F1A4]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F07D,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F1A4,
},
- [0x1F07E]={
+ [0x1F1A5]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F07E,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F1A5,
},
- [0x1F07F]={
+ [0x1F1A6]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F07F,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F1A6,
},
- [0x1F080]={
+ [0x1F1A7]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F080,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F1A7,
},
- [0x1F081]={
+ [0x1F1A8]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F081,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F1A8,
},
- [0x1F082]={
+ [0x1F1A9]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F082,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F1A9,
},
- [0x1F083]={
+ [0x1F1AA]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F083,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F1AA,
},
- [0x1F084]={
+ [0x1F1AB]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F084,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F1AB,
},
- [0x1F085]={
+ [0x1F1AC]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F085,
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x1F1AC,
},
- [0x1F086]={
+ [0x1F1AD]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F086,
+ unicodeslot=0x1F1AD,
},
- [0x1F087]={
+ [0x1F1E6]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F087,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1E6,
},
- [0x1F088]={
+ [0x1F1E7]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F088,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1E7,
},
- [0x1F089]={
+ [0x1F1E8]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F089,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1E8,
},
- [0x1F08A]={
+ [0x1F1E9]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F08A,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1E9,
},
- [0x1F08B]={
+ [0x1F1EA]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F08B,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1EA,
},
- [0x1F08C]={
+ [0x1F1EB]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F08C,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1EB,
},
- [0x1F08D]={
+ [0x1F1EC]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F08D,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1EC,
},
- [0x1F08E]={
+ [0x1F1ED]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F08E,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1ED,
},
- [0x1F08F]={
+ [0x1F1EE]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F08F,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1EE,
},
- [0x1F090]={
+ [0x1F1EF]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F090,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1EF,
},
- [0x1F091]={
+ [0x1F1F0]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F091,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1F0,
},
- [0x1F092]={
+ [0x1F1F1]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F092,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1F1,
},
- [0x1F093]={
+ [0x1F1F2]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F093,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1F2,
},
- [0x1F0A0]={
+ [0x1F1F3]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F0A0,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1F3,
},
- [0x1F0A1]={
+ [0x1F1F4]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F0A1,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1F4,
},
- [0x1F0A2]={
+ [0x1F1F5]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F0A2,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1F5,
},
- [0x1F0A3]={
+ [0x1F1F6]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F0A3,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1F6,
},
- [0x1F0A4]={
+ [0x1F1F7]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F0A4,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1F7,
},
- [0x1F0A5]={
+ [0x1F1F8]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F0A5,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1F8,
},
- [0x1F0A6]={
+ [0x1F1F9]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F0A6,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1F9,
},
- [0x1F0A7]={
+ [0x1F1FA]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F0A7,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1FA,
},
- [0x1F0A8]={
+ [0x1F1FB]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F0A8,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1FB,
},
- [0x1F0A9]={
+ [0x1F1FC]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F0A9,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1FC,
},
- [0x1F0AA]={
+ [0x1F1FD]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F0AA,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1FD,
},
- [0x1F0AB]={
+ [0x1F1FE]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F0AB,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1FE,
},
- [0x1F0AC]={
+ [0x1F1FF]={
category="so",
- direction="on",
- linebreak="id",
- unicodeslot=0x1F0AC,
+ direction="l",
+ linebreak="ri",
+ unicodeslot=0x1F1FF,
},
- [0x1F0AD]={
+ [0x1F200]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0AD,
+ specials={ "square", 0x307B, 0x304B },
+ unicodeslot=0x1F200,
},
- [0x1F0AE]={
+ [0x1F201]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0AE,
+ specials={ "square", 0x30B3, 0x30B3 },
+ unicodeslot=0x1F201,
},
- [0x1F0B1]={
+ [0x1F202]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0B1,
+ specials={ "square", 0x30B5 },
+ unicodeslot=0x1F202,
},
- [0x1F0B2]={
+ [0x1F210]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0B2,
+ specials={ "square", 0x624B },
+ unicodeslot=0x1F210,
},
- [0x1F0B3]={
+ [0x1F211]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0B3,
+ specials={ "square", 0x5B57 },
+ unicodeslot=0x1F211,
},
- [0x1F0B4]={
+ [0x1F212]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0B4,
+ specials={ "square", 0x53CC },
+ unicodeslot=0x1F212,
},
- [0x1F0B5]={
+ [0x1F213]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0B5,
+ specials={ "square", 0x30C7 },
+ unicodeslot=0x1F213,
},
- [0x1F0B6]={
+ [0x1F214]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0B6,
+ specials={ "square", 0x4E8C },
+ unicodeslot=0x1F214,
},
- [0x1F0B7]={
+ [0x1F215]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0B7,
+ specials={ "square", 0x591A },
+ unicodeslot=0x1F215,
},
- [0x1F0B8]={
+ [0x1F216]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0B8,
+ specials={ "square", 0x89E3 },
+ unicodeslot=0x1F216,
},
- [0x1F0B9]={
+ [0x1F217]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0B9,
+ specials={ "square", 0x5929 },
+ unicodeslot=0x1F217,
},
- [0x1F0BA]={
+ [0x1F218]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0BA,
+ specials={ "square", 0x4EA4 },
+ unicodeslot=0x1F218,
},
- [0x1F0BB]={
+ [0x1F219]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0BB,
+ specials={ "square", 0x6620 },
+ unicodeslot=0x1F219,
},
- [0x1F0BC]={
+ [0x1F21A]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0BC,
+ specials={ "square", 0x7121 },
+ unicodeslot=0x1F21A,
},
- [0x1F0BD]={
+ [0x1F21B]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0BD,
+ specials={ "square", 0x6599 },
+ unicodeslot=0x1F21B,
},
- [0x1F0BE]={
+ [0x1F21C]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0BE,
+ specials={ "square", 0x524D },
+ unicodeslot=0x1F21C,
},
- [0x1F0BF]={
+ [0x1F21D]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0BF,
+ specials={ "square", 0x5F8C },
+ unicodeslot=0x1F21D,
},
- [0x1F0C1]={
+ [0x1F21E]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0C1,
+ specials={ "square", 0x518D },
+ unicodeslot=0x1F21E,
},
- [0x1F0C2]={
+ [0x1F21F]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0C2,
+ specials={ "square", 0x65B0 },
+ unicodeslot=0x1F21F,
},
- [0x1F0C3]={
+ [0x1F220]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0C3,
+ specials={ "square", 0x521D },
+ unicodeslot=0x1F220,
},
- [0x1F0C4]={
+ [0x1F221]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0C4,
+ specials={ "square", 0x7D42 },
+ unicodeslot=0x1F221,
},
- [0x1F0C5]={
+ [0x1F222]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0C5,
+ specials={ "square", 0x751F },
+ unicodeslot=0x1F222,
},
- [0x1F0C6]={
+ [0x1F223]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0C6,
+ specials={ "square", 0x8CA9 },
+ unicodeslot=0x1F223,
},
- [0x1F0C7]={
+ [0x1F224]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0C7,
+ specials={ "square", 0x58F0 },
+ unicodeslot=0x1F224,
},
- [0x1F0C8]={
+ [0x1F225]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0C8,
+ specials={ "square", 0x5439 },
+ unicodeslot=0x1F225,
},
- [0x1F0C9]={
+ [0x1F226]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0C9,
+ specials={ "square", 0x6F14 },
+ unicodeslot=0x1F226,
},
- [0x1F0CA]={
+ [0x1F227]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0CA,
+ specials={ "square", 0x6295 },
+ unicodeslot=0x1F227,
},
- [0x1F0CB]={
+ [0x1F228]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0CB,
+ specials={ "square", 0x6355 },
+ unicodeslot=0x1F228,
},
- [0x1F0CC]={
+ [0x1F229]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0CC,
+ specials={ "square", 0x4E00 },
+ unicodeslot=0x1F229,
},
- [0x1F0CD]={
+ [0x1F22A]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0CD,
+ specials={ "square", 0x4E09 },
+ unicodeslot=0x1F22A,
},
- [0x1F0CE]={
+ [0x1F22B]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0CE,
+ specials={ "square", 0x904A },
+ unicodeslot=0x1F22B,
},
- [0x1F0CF]={
+ [0x1F22C]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0CF,
+ specials={ "square", 0x5DE6 },
+ unicodeslot=0x1F22C,
},
- [0x1F0D1]={
+ [0x1F22D]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0D1,
+ specials={ "square", 0x4E2D },
+ unicodeslot=0x1F22D,
},
- [0x1F0D2]={
+ [0x1F22E]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0D2,
+ specials={ "square", 0x53F3 },
+ unicodeslot=0x1F22E,
},
- [0x1F0D3]={
+ [0x1F22F]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0D3,
+ specials={ "square", 0x6307 },
+ unicodeslot=0x1F22F,
},
- [0x1F0D4]={
+ [0x1F230]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0D4,
+ specials={ "square", 0x8D70 },
+ unicodeslot=0x1F230,
},
- [0x1F0D5]={
+ [0x1F231]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0D5,
+ specials={ "square", 0x6253 },
+ unicodeslot=0x1F231,
},
- [0x1F0D6]={
+ [0x1F232]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0D6,
+ specials={ "square", 0x7981 },
+ unicodeslot=0x1F232,
},
- [0x1F0D7]={
+ [0x1F233]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0D7,
+ specials={ "square", 0x7A7A },
+ unicodeslot=0x1F233,
},
- [0x1F0D8]={
+ [0x1F234]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0D8,
+ specials={ "square", 0x5408 },
+ unicodeslot=0x1F234,
},
- [0x1F0D9]={
+ [0x1F235]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0D9,
+ specials={ "square", 0x6E80 },
+ unicodeslot=0x1F235,
},
- [0x1F0DA]={
+ [0x1F236]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0DA,
+ specials={ "square", 0x6709 },
+ unicodeslot=0x1F236,
},
- [0x1F0DB]={
+ [0x1F237]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0DB,
+ specials={ "square", 0x6708 },
+ unicodeslot=0x1F237,
},
- [0x1F0DC]={
+ [0x1F238]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0DC,
+ specials={ "square", 0x7533 },
+ unicodeslot=0x1F238,
},
- [0x1F0DD]={
+ [0x1F239]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0DD,
+ specials={ "square", 0x5272 },
+ unicodeslot=0x1F239,
},
- [0x1F0DE]={
+ [0x1F23A]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0DE,
+ specials={ "square", 0x55B6 },
+ unicodeslot=0x1F23A,
},
- [0x1F0DF]={
+ [0x1F23B]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0DF,
+ specials={ "square", 0x914D },
+ unicodeslot=0x1F23B,
},
- [0x1F0E0]={
+ [0x1F240]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0E0,
+ specials={ "compat", 0x3014, 0x672C, 0x3015 },
+ unicodeslot=0x1F240,
},
- [0x1F0E1]={
+ [0x1F241]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0E1,
+ specials={ "compat", 0x3014, 0x4E09, 0x3015 },
+ unicodeslot=0x1F241,
},
- [0x1F0E2]={
+ [0x1F242]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0E2,
+ specials={ "compat", 0x3014, 0x4E8C, 0x3015 },
+ unicodeslot=0x1F242,
},
- [0x1F0E3]={
+ [0x1F243]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0E3,
+ specials={ "compat", 0x3014, 0x5B89, 0x3015 },
+ unicodeslot=0x1F243,
},
- [0x1F0E4]={
+ [0x1F244]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0E4,
+ specials={ "compat", 0x3014, 0x70B9, 0x3015 },
+ unicodeslot=0x1F244,
},
- [0x1F0E5]={
+ [0x1F245]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0E5,
+ specials={ "compat", 0x3014, 0x6253, 0x3015 },
+ unicodeslot=0x1F245,
},
- [0x1F0E6]={
+ [0x1F246]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0E6,
+ specials={ "compat", 0x3014, 0x76D7, 0x3015 },
+ unicodeslot=0x1F246,
},
- [0x1F0E7]={
+ [0x1F247]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0E7,
+ specials={ "compat", 0x3014, 0x52DD, 0x3015 },
+ unicodeslot=0x1F247,
},
- [0x1F0E8]={
+ [0x1F248]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0E8,
+ specials={ "compat", 0x3014, 0x6557, 0x3015 },
+ unicodeslot=0x1F248,
},
- [0x1F0E9]={
+ [0x1F250]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0E9,
+ specials={ "circle", 0x5F97 },
+ unicodeslot=0x1F250,
},
- [0x1F0EA]={
+ [0x1F251]={
category="so",
- direction="on",
+ direction="l",
linebreak="id",
- unicodeslot=0x1F0EA,
+ specials={ "circle", 0x53EF },
+ unicodeslot=0x1F251,
},
- [0x1F0EB]={
+ [0x1F260]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F0EB,
+ unicodeslot=0x1F260,
},
- [0x1F0EC]={
+ [0x1F261]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F0EC,
+ unicodeslot=0x1F261,
},
- [0x1F0ED]={
+ [0x1F262]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F0ED,
+ unicodeslot=0x1F262,
},
- [0x1F0EE]={
+ [0x1F263]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F0EE,
+ unicodeslot=0x1F263,
},
- [0x1F0EF]={
+ [0x1F264]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F0EF,
+ unicodeslot=0x1F264,
},
- [0x1F0F0]={
+ [0x1F265]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F0F0,
+ unicodeslot=0x1F265,
},
- [0x1F0F1]={
+ [0x1F300]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F0F1,
+ unicodeslot=0x1F300,
},
- [0x1F0F2]={
+ [0x1F301]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F0F2,
+ unicodeslot=0x1F301,
},
- [0x1F0F3]={
+ [0x1F302]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F0F3,
+ unicodeslot=0x1F302,
},
- [0x1F0F4]={
+ [0x1F303]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F0F4,
+ unicodeslot=0x1F303,
},
- [0x1F0F5]={
+ [0x1F304]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F0F5,
- },
- [0x1F100]={
- category="no",
- direction="en",
- linebreak="ai",
- specials={ "compat", 0x30, 0x2E },
- unicodeslot=0x1F100,
- },
- [0x1F101]={
- category="no",
- direction="en",
- linebreak="ai",
- specials={ "compat", 0x30, 0x2C },
- unicodeslot=0x1F101,
- },
- [0x1F102]={
- category="no",
- direction="en",
- linebreak="ai",
- specials={ "compat", 0x31, 0x2C },
- unicodeslot=0x1F102,
- },
- [0x1F103]={
- category="no",
- direction="en",
- linebreak="ai",
- specials={ "compat", 0x32, 0x2C },
- unicodeslot=0x1F103,
- },
- [0x1F104]={
- category="no",
- direction="en",
- linebreak="ai",
- specials={ "compat", 0x33, 0x2C },
- unicodeslot=0x1F104,
- },
- [0x1F105]={
- category="no",
- direction="en",
- linebreak="ai",
- specials={ "compat", 0x34, 0x2C },
- unicodeslot=0x1F105,
- },
- [0x1F106]={
- category="no",
- direction="en",
- linebreak="ai",
- specials={ "compat", 0x35, 0x2C },
- unicodeslot=0x1F106,
- },
- [0x1F107]={
- category="no",
- direction="en",
- linebreak="ai",
- specials={ "compat", 0x36, 0x2C },
- unicodeslot=0x1F107,
- },
- [0x1F108]={
- category="no",
- direction="en",
- linebreak="ai",
- specials={ "compat", 0x37, 0x2C },
- unicodeslot=0x1F108,
- },
- [0x1F109]={
- category="no",
- direction="en",
- linebreak="ai",
- specials={ "compat", 0x38, 0x2C },
- unicodeslot=0x1F109,
+ unicodeslot=0x1F304,
},
- [0x1F10A]={
- category="no",
- direction="en",
- linebreak="ai",
- specials={ "compat", 0x39, 0x2C },
- unicodeslot=0x1F10A,
+ [0x1F305]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F305,
},
- [0x1F10B]={
- category="no",
+ [0x1F306]={
+ category="so",
direction="on",
- linebreak="ai",
- unicodeslot=0x1F10B,
+ linebreak="id",
+ unicodeslot=0x1F306,
},
- [0x1F10C]={
- category="no",
+ [0x1F307]={
+ category="so",
direction="on",
- linebreak="ai",
- unicodeslot=0x1F10C,
+ linebreak="id",
+ unicodeslot=0x1F307,
},
- [0x1F110]={
+ [0x1F308]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x41, 0x29 },
- unicodeslot=0x1F110,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F308,
},
- [0x1F111]={
+ [0x1F309]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x42, 0x29 },
- unicodeslot=0x1F111,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F309,
},
- [0x1F112]={
+ [0x1F30A]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x43, 0x29 },
- unicodeslot=0x1F112,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F30A,
},
- [0x1F113]={
+ [0x1F30B]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x44, 0x29 },
- unicodeslot=0x1F113,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F30B,
},
- [0x1F114]={
+ [0x1F30C]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x45, 0x29 },
- unicodeslot=0x1F114,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F30C,
},
- [0x1F115]={
+ [0x1F30D]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x46, 0x29 },
- unicodeslot=0x1F115,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F30D,
},
- [0x1F116]={
+ [0x1F30E]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x47, 0x29 },
- unicodeslot=0x1F116,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F30E,
},
- [0x1F117]={
+ [0x1F30F]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x48, 0x29 },
- unicodeslot=0x1F117,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F30F,
},
- [0x1F118]={
+ [0x1F310]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x49, 0x29 },
- unicodeslot=0x1F118,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F310,
},
- [0x1F119]={
+ [0x1F311]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x4A, 0x29 },
- unicodeslot=0x1F119,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F311,
},
- [0x1F11A]={
+ [0x1F312]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x4B, 0x29 },
- unicodeslot=0x1F11A,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F312,
},
- [0x1F11B]={
+ [0x1F313]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x4C, 0x29 },
- unicodeslot=0x1F11B,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F313,
},
- [0x1F11C]={
+ [0x1F314]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x4D, 0x29 },
- unicodeslot=0x1F11C,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F314,
},
- [0x1F11D]={
+ [0x1F315]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x4E, 0x29 },
- unicodeslot=0x1F11D,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F315,
},
- [0x1F11E]={
+ [0x1F316]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x4F, 0x29 },
- unicodeslot=0x1F11E,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F316,
},
- [0x1F11F]={
+ [0x1F317]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x50, 0x29 },
- unicodeslot=0x1F11F,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F317,
},
- [0x1F120]={
+ [0x1F318]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x51, 0x29 },
- unicodeslot=0x1F120,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F318,
},
- [0x1F121]={
+ [0x1F319]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x52, 0x29 },
- unicodeslot=0x1F121,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F319,
},
- [0x1F122]={
+ [0x1F31A]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x53, 0x29 },
- unicodeslot=0x1F122,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F31A,
},
- [0x1F123]={
+ [0x1F31B]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x54, 0x29 },
- unicodeslot=0x1F123,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F31B,
},
- [0x1F124]={
+ [0x1F31C]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x55, 0x29 },
- unicodeslot=0x1F124,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F31C,
},
- [0x1F125]={
+ [0x1F31D]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x56, 0x29 },
- unicodeslot=0x1F125,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F31D,
},
- [0x1F126]={
+ [0x1F31E]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x57, 0x29 },
- unicodeslot=0x1F126,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F31E,
},
- [0x1F127]={
+ [0x1F31F]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x58, 0x29 },
- unicodeslot=0x1F127,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F31F,
},
- [0x1F128]={
+ [0x1F320]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x59, 0x29 },
- unicodeslot=0x1F128,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F320,
},
- [0x1F129]={
+ [0x1F321]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x28, 0x5A, 0x29 },
- unicodeslot=0x1F129,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F321,
},
- [0x1F12A]={
+ [0x1F322]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "compat", 0x3014, 0x53, 0x3015 },
- unicodeslot=0x1F12A,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F322,
},
- [0x1F12B]={
+ [0x1F323]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "circle", 0x43 },
- unicodeslot=0x1F12B,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F323,
},
- [0x1F12C]={
+ [0x1F324]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "circle", 0x52 },
- unicodeslot=0x1F12C,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F324,
},
- [0x1F12D]={
+ [0x1F325]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "circle", 0x43, 0x44 },
- unicodeslot=0x1F12D,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F325,
},
- [0x1F12E]={
+ [0x1F326]={
category="so",
- direction="l",
- linebreak="al",
- specials={ "circle", 0x57, 0x5A },
- unicodeslot=0x1F12E,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F326,
},
- [0x1F12F]={
+ [0x1F327]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F12F,
+ linebreak="id",
+ unicodeslot=0x1F327,
},
- [0x1F130]={
+ [0x1F328]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x41 },
- unicodeslot=0x1F130,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F328,
},
- [0x1F131]={
+ [0x1F329]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x42 },
- unicodeslot=0x1F131,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F329,
},
- [0x1F132]={
+ [0x1F32A]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x43 },
- unicodeslot=0x1F132,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F32A,
},
- [0x1F133]={
+ [0x1F32B]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x44 },
- unicodeslot=0x1F133,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F32B,
},
- [0x1F134]={
+ [0x1F32C]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x45 },
- unicodeslot=0x1F134,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F32C,
},
- [0x1F135]={
+ [0x1F32D]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x46 },
- unicodeslot=0x1F135,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F32D,
},
- [0x1F136]={
+ [0x1F32E]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x47 },
- unicodeslot=0x1F136,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F32E,
},
- [0x1F137]={
+ [0x1F32F]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x48 },
- unicodeslot=0x1F137,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F32F,
},
- [0x1F138]={
+ [0x1F330]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x49 },
- unicodeslot=0x1F138,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F330,
},
- [0x1F139]={
+ [0x1F331]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x4A },
- unicodeslot=0x1F139,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F331,
},
- [0x1F13A]={
+ [0x1F332]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x4B },
- unicodeslot=0x1F13A,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F332,
},
- [0x1F13B]={
+ [0x1F333]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x4C },
- unicodeslot=0x1F13B,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F333,
},
- [0x1F13C]={
+ [0x1F334]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x4D },
- unicodeslot=0x1F13C,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F334,
},
- [0x1F13D]={
+ [0x1F335]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x4E },
- unicodeslot=0x1F13D,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F335,
},
- [0x1F13E]={
+ [0x1F336]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x4F },
- unicodeslot=0x1F13E,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F336,
},
- [0x1F13F]={
+ [0x1F337]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x50 },
- unicodeslot=0x1F13F,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F337,
},
- [0x1F140]={
+ [0x1F338]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x51 },
- unicodeslot=0x1F140,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F338,
},
- [0x1F141]={
+ [0x1F339]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x52 },
- unicodeslot=0x1F141,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F339,
},
- [0x1F142]={
+ [0x1F33A]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x53 },
- unicodeslot=0x1F142,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F33A,
},
- [0x1F143]={
+ [0x1F33B]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x54 },
- unicodeslot=0x1F143,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F33B,
},
- [0x1F144]={
+ [0x1F33C]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x55 },
- unicodeslot=0x1F144,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F33C,
},
- [0x1F145]={
+ [0x1F33D]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x56 },
- unicodeslot=0x1F145,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F33D,
},
- [0x1F146]={
+ [0x1F33E]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x57 },
- unicodeslot=0x1F146,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F33E,
},
- [0x1F147]={
+ [0x1F33F]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x58 },
- unicodeslot=0x1F147,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F33F,
},
- [0x1F148]={
+ [0x1F340]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x59 },
- unicodeslot=0x1F148,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F340,
},
- [0x1F149]={
+ [0x1F341]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x5A },
- unicodeslot=0x1F149,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F341,
},
- [0x1F14A]={
+ [0x1F342]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x48, 0x56 },
- unicodeslot=0x1F14A,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F342,
},
- [0x1F14B]={
+ [0x1F343]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x4D, 0x56 },
- unicodeslot=0x1F14B,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F343,
},
- [0x1F14C]={
+ [0x1F344]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x53, 0x44 },
- unicodeslot=0x1F14C,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F344,
},
- [0x1F14D]={
+ [0x1F345]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x53, 0x53 },
- unicodeslot=0x1F14D,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F345,
},
- [0x1F14E]={
+ [0x1F346]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x50, 0x50, 0x56 },
- unicodeslot=0x1F14E,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F346,
},
- [0x1F14F]={
+ [0x1F347]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x57, 0x43 },
- unicodeslot=0x1F14F,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F347,
},
- [0x1F150]={
+ [0x1F348]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F150,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F348,
},
- [0x1F151]={
+ [0x1F349]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F151,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F349,
},
- [0x1F152]={
+ [0x1F34A]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F152,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F34A,
},
- [0x1F153]={
+ [0x1F34B]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F153,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F34B,
},
- [0x1F154]={
+ [0x1F34C]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F154,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F34C,
},
- [0x1F155]={
+ [0x1F34D]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F155,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F34D,
},
- [0x1F156]={
+ [0x1F34E]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F156,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F34E,
},
- [0x1F157]={
+ [0x1F34F]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F157,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F34F,
},
- [0x1F158]={
+ [0x1F350]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F158,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F350,
},
- [0x1F159]={
+ [0x1F351]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F159,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F351,
},
- [0x1F15A]={
+ [0x1F352]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F15A,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F352,
},
- [0x1F15B]={
+ [0x1F353]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F15B,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F353,
},
- [0x1F15C]={
+ [0x1F354]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F15C,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F354,
},
- [0x1F15D]={
+ [0x1F355]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F15D,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F355,
},
- [0x1F15E]={
+ [0x1F356]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F15E,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F356,
},
- [0x1F15F]={
+ [0x1F357]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F15F,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F357,
},
- [0x1F160]={
+ [0x1F358]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F160,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F358,
},
- [0x1F161]={
+ [0x1F359]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F161,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F359,
},
- [0x1F162]={
+ [0x1F35A]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F162,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F35A,
},
- [0x1F163]={
+ [0x1F35B]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F163,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F35B,
},
- [0x1F164]={
+ [0x1F35C]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F164,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F35C,
},
- [0x1F165]={
+ [0x1F35D]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F165,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F35D,
},
- [0x1F166]={
+ [0x1F35E]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F166,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F35E,
},
- [0x1F167]={
+ [0x1F35F]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F167,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F35F,
},
- [0x1F168]={
+ [0x1F360]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F168,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F360,
},
- [0x1F169]={
+ [0x1F361]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F169,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F361,
},
- [0x1F16A]={
+ [0x1F362]={
category="so",
direction="on",
- linebreak="al",
- specials={ "super", 0x4D, 0x43 },
- unicodeslot=0x1F16A,
+ linebreak="id",
+ unicodeslot=0x1F362,
},
- [0x1F16B]={
+ [0x1F363]={
category="so",
direction="on",
- linebreak="al",
- specials={ "super", 0x4D, 0x44 },
- unicodeslot=0x1F16B,
+ linebreak="id",
+ unicodeslot=0x1F363,
},
- [0x1F16C]={
+ [0x1F364]={
category="so",
direction="on",
- linebreak="al",
- specials={ "super", 0x4D, 0x52 },
- unicodeslot=0x1F16C,
+ linebreak="id",
+ unicodeslot=0x1F364,
},
- [0x1F170]={
+ [0x1F365]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F170,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F365,
},
- [0x1F171]={
+ [0x1F366]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F171,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F366,
},
- [0x1F172]={
+ [0x1F367]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F172,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F367,
},
- [0x1F173]={
+ [0x1F368]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F173,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F368,
},
- [0x1F174]={
+ [0x1F369]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F174,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F369,
},
- [0x1F175]={
+ [0x1F36A]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F175,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F36A,
},
- [0x1F176]={
+ [0x1F36B]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F176,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F36B,
},
- [0x1F177]={
+ [0x1F36C]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F177,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F36C,
},
- [0x1F178]={
+ [0x1F36D]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F178,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F36D,
},
- [0x1F179]={
+ [0x1F36E]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F179,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F36E,
},
- [0x1F17A]={
+ [0x1F36F]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F17A,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F36F,
},
- [0x1F17B]={
+ [0x1F370]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F17B,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F370,
},
- [0x1F17C]={
+ [0x1F371]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F17C,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F371,
},
- [0x1F17D]={
+ [0x1F372]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F17D,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F372,
},
- [0x1F17E]={
+ [0x1F373]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F17E,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F373,
},
- [0x1F17F]={
+ [0x1F374]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F17F,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F374,
},
- [0x1F180]={
+ [0x1F375]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F180,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F375,
},
- [0x1F181]={
+ [0x1F376]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F181,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F376,
},
- [0x1F182]={
+ [0x1F377]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F182,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F377,
},
- [0x1F183]={
+ [0x1F378]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F183,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F378,
},
- [0x1F184]={
+ [0x1F379]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F184,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F379,
},
- [0x1F185]={
+ [0x1F37A]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F185,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F37A,
},
- [0x1F186]={
+ [0x1F37B]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F186,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F37B,
},
- [0x1F187]={
+ [0x1F37C]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F187,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F37C,
+ },
+ [0x1F37D]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F37D,
},
- [0x1F188]={
+ [0x1F37E]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F188,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F37E,
},
- [0x1F189]={
+ [0x1F37F]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F189,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F37F,
},
- [0x1F18A]={
+ [0x1F380]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F18A,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F380,
},
- [0x1F18B]={
+ [0x1F381]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F18B,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F381,
},
- [0x1F18C]={
+ [0x1F382]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F18C,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F382,
},
- [0x1F18D]={
+ [0x1F383]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F18D,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F383,
},
- [0x1F18E]={
+ [0x1F384]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F18E,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F384,
},
- [0x1F18F]={
+ [0x1F385]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F18F,
+ direction="on",
+ linebreak="eb",
+ unicodeslot=0x1F385,
},
- [0x1F190]={
+ [0x1F386]={
category="so",
- direction="l",
- linebreak="ai",
- specials={ "square", 0x44, 0x4A },
- unicodeslot=0x1F190,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F386,
},
- [0x1F191]={
+ [0x1F387]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F191,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F387,
},
- [0x1F192]={
+ [0x1F388]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F192,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F388,
},
- [0x1F193]={
+ [0x1F389]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F193,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F389,
},
- [0x1F194]={
+ [0x1F38A]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F194,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F38A,
},
- [0x1F195]={
+ [0x1F38B]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F195,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F38B,
},
- [0x1F196]={
+ [0x1F38C]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F196,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F38C,
},
- [0x1F197]={
+ [0x1F38D]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F197,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F38D,
},
- [0x1F198]={
+ [0x1F38E]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F198,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F38E,
},
- [0x1F199]={
+ [0x1F38F]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F199,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F38F,
},
- [0x1F19A]={
+ [0x1F390]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F19A,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F390,
},
- [0x1F19B]={
+ [0x1F391]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F19B,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F391,
},
- [0x1F19C]={
+ [0x1F392]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F19C,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F392,
},
- [0x1F19D]={
+ [0x1F393]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F19D,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F393,
},
- [0x1F19E]={
+ [0x1F394]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F19E,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F394,
},
- [0x1F19F]={
+ [0x1F395]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F19F,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F395,
},
- [0x1F1A0]={
+ [0x1F396]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F1A0,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F396,
},
- [0x1F1A1]={
+ [0x1F397]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F1A1,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F397,
},
- [0x1F1A2]={
+ [0x1F398]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F1A2,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F398,
},
- [0x1F1A3]={
+ [0x1F399]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F1A3,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F399,
},
- [0x1F1A4]={
+ [0x1F39A]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F1A4,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F39A,
},
- [0x1F1A5]={
+ [0x1F39B]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F1A5,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F39B,
},
- [0x1F1A6]={
+ [0x1F39C]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F1A6,
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F39C,
},
- [0x1F1A7]={
+ [0x1F39D]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F1A7,
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F39D,
},
- [0x1F1A8]={
+ [0x1F39E]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F1A8,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F39E,
},
- [0x1F1A9]={
+ [0x1F39F]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F1A9,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F39F,
},
- [0x1F1AA]={
+ [0x1F3A0]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F1AA,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3A0,
},
- [0x1F1AB]={
+ [0x1F3A1]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F1AB,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3A1,
},
- [0x1F1AC]={
+ [0x1F3A2]={
category="so",
- direction="l",
- linebreak="ai",
- unicodeslot=0x1F1AC,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3A2,
},
- [0x1F1E6]={
+ [0x1F3A3]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1E6,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3A3,
},
- [0x1F1E7]={
+ [0x1F3A4]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1E7,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3A4,
},
- [0x1F1E8]={
+ [0x1F3A5]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1E8,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3A5,
},
- [0x1F1E9]={
+ [0x1F3A6]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1E9,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3A6,
},
- [0x1F1EA]={
+ [0x1F3A7]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1EA,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3A7,
},
- [0x1F1EB]={
+ [0x1F3A8]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1EB,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3A8,
},
- [0x1F1EC]={
+ [0x1F3A9]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1EC,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3A9,
},
- [0x1F1ED]={
+ [0x1F3AA]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1ED,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3AA,
},
- [0x1F1EE]={
+ [0x1F3AB]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1EE,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3AB,
},
- [0x1F1EF]={
+ [0x1F3AC]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1EF,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3AC,
},
- [0x1F1F0]={
+ [0x1F3AD]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1F0,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3AD,
},
- [0x1F1F1]={
+ [0x1F3AE]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1F1,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3AE,
},
- [0x1F1F2]={
+ [0x1F3AF]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1F2,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3AF,
},
- [0x1F1F3]={
+ [0x1F3B0]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1F3,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3B0,
},
- [0x1F1F4]={
+ [0x1F3B1]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1F4,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3B1,
},
- [0x1F1F5]={
+ [0x1F3B2]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1F5,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3B2,
},
- [0x1F1F6]={
+ [0x1F3B3]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1F6,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3B3,
},
- [0x1F1F7]={
+ [0x1F3B4]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1F7,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3B4,
},
- [0x1F1F8]={
+ [0x1F3B5]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1F8,
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F3B5,
},
- [0x1F1F9]={
+ [0x1F3B6]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1F9,
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F3B6,
},
- [0x1F1FA]={
+ [0x1F3B7]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1FA,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3B7,
},
- [0x1F1FB]={
+ [0x1F3B8]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1FB,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3B8,
},
- [0x1F1FC]={
+ [0x1F3B9]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1FC,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3B9,
},
- [0x1F1FD]={
+ [0x1F3BA]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1FD,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3BA,
},
- [0x1F1FE]={
+ [0x1F3BB]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1FE,
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F3BB,
},
- [0x1F1FF]={
+ [0x1F3BC]={
category="so",
- direction="l",
- linebreak="ri",
- unicodeslot=0x1F1FF,
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1F3BC,
},
- [0x1F200]={
+ [0x1F3BD]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x307B, 0x304B },
- unicodeslot=0x1F200,
+ unicodeslot=0x1F3BD,
},
- [0x1F201]={
+ [0x1F3BE]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x30B3, 0x30B3 },
- unicodeslot=0x1F201,
+ unicodeslot=0x1F3BE,
},
- [0x1F202]={
+ [0x1F3BF]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x30B5 },
- unicodeslot=0x1F202,
+ unicodeslot=0x1F3BF,
},
- [0x1F210]={
+ [0x1F3C0]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x624B },
- unicodeslot=0x1F210,
+ unicodeslot=0x1F3C0,
},
- [0x1F211]={
+ [0x1F3C1]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x5B57 },
- unicodeslot=0x1F211,
+ unicodeslot=0x1F3C1,
},
- [0x1F212]={
+ [0x1F3C2]={
category="so",
- direction="l",
- linebreak="id",
- specials={ "square", 0x53CC },
- unicodeslot=0x1F212,
+ direction="on",
+ linebreak="eb",
+ unicodeslot=0x1F3C2,
},
- [0x1F213]={
+ [0x1F3C3]={
category="so",
- direction="l",
- linebreak="id",
- specials={ "square", 0x30C7 },
- unicodeslot=0x1F213,
+ direction="on",
+ linebreak="eb",
+ unicodeslot=0x1F3C3,
},
- [0x1F214]={
+ [0x1F3C4]={
category="so",
- direction="l",
- linebreak="id",
- specials={ "square", 0x4E8C },
- unicodeslot=0x1F214,
+ direction="on",
+ linebreak="eb",
+ unicodeslot=0x1F3C4,
},
- [0x1F215]={
+ [0x1F3C5]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x591A },
- unicodeslot=0x1F215,
+ unicodeslot=0x1F3C5,
},
- [0x1F216]={
+ [0x1F3C6]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x89E3 },
- unicodeslot=0x1F216,
+ unicodeslot=0x1F3C6,
},
- [0x1F217]={
+ [0x1F3C7]={
category="so",
- direction="l",
- linebreak="id",
- specials={ "square", 0x5929 },
- unicodeslot=0x1F217,
+ direction="on",
+ linebreak="eb",
+ unicodeslot=0x1F3C7,
},
- [0x1F218]={
+ [0x1F3C8]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x4EA4 },
- unicodeslot=0x1F218,
+ unicodeslot=0x1F3C8,
},
- [0x1F219]={
+ [0x1F3C9]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x6620 },
- unicodeslot=0x1F219,
+ unicodeslot=0x1F3C9,
},
- [0x1F21A]={
+ [0x1F3CA]={
category="so",
- direction="l",
- linebreak="id",
- specials={ "square", 0x7121 },
- unicodeslot=0x1F21A,
+ direction="on",
+ linebreak="eb",
+ unicodeslot=0x1F3CA,
},
- [0x1F21B]={
+ [0x1F3CB]={
category="so",
- direction="l",
- linebreak="id",
- specials={ "square", 0x6599 },
- unicodeslot=0x1F21B,
+ direction="on",
+ linebreak="eb",
+ unicodeslot=0x1F3CB,
},
- [0x1F21C]={
+ [0x1F3CC]={
category="so",
- direction="l",
- linebreak="id",
- specials={ "square", 0x524D },
- unicodeslot=0x1F21C,
+ direction="on",
+ linebreak="eb",
+ unicodeslot=0x1F3CC,
},
- [0x1F21D]={
+ [0x1F3CD]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x5F8C },
- unicodeslot=0x1F21D,
+ unicodeslot=0x1F3CD,
},
- [0x1F21E]={
+ [0x1F3CE]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x518D },
- unicodeslot=0x1F21E,
+ unicodeslot=0x1F3CE,
},
- [0x1F21F]={
+ [0x1F3CF]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x65B0 },
- unicodeslot=0x1F21F,
+ unicodeslot=0x1F3CF,
},
- [0x1F220]={
+ [0x1F3D0]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x521D },
- unicodeslot=0x1F220,
+ unicodeslot=0x1F3D0,
},
- [0x1F221]={
+ [0x1F3D1]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x7D42 },
- unicodeslot=0x1F221,
+ unicodeslot=0x1F3D1,
},
- [0x1F222]={
+ [0x1F3D2]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x751F },
- unicodeslot=0x1F222,
+ unicodeslot=0x1F3D2,
},
- [0x1F223]={
+ [0x1F3D3]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x8CA9 },
- unicodeslot=0x1F223,
+ unicodeslot=0x1F3D3,
},
- [0x1F224]={
+ [0x1F3D4]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x58F0 },
- unicodeslot=0x1F224,
+ unicodeslot=0x1F3D4,
},
- [0x1F225]={
+ [0x1F3D5]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x5439 },
- unicodeslot=0x1F225,
+ unicodeslot=0x1F3D5,
},
- [0x1F226]={
+ [0x1F3D6]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x6F14 },
- unicodeslot=0x1F226,
+ unicodeslot=0x1F3D6,
},
- [0x1F227]={
+ [0x1F3D7]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x6295 },
- unicodeslot=0x1F227,
+ unicodeslot=0x1F3D7,
},
- [0x1F228]={
+ [0x1F3D8]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x6355 },
- unicodeslot=0x1F228,
+ unicodeslot=0x1F3D8,
},
- [0x1F229]={
+ [0x1F3D9]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x4E00 },
- unicodeslot=0x1F229,
+ unicodeslot=0x1F3D9,
},
- [0x1F22A]={
+ [0x1F3DA]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x4E09 },
- unicodeslot=0x1F22A,
+ unicodeslot=0x1F3DA,
},
- [0x1F22B]={
+ [0x1F3DB]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x904A },
- unicodeslot=0x1F22B,
+ unicodeslot=0x1F3DB,
},
- [0x1F22C]={
+ [0x1F3DC]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x5DE6 },
- unicodeslot=0x1F22C,
+ unicodeslot=0x1F3DC,
},
- [0x1F22D]={
+ [0x1F3DD]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x4E2D },
- unicodeslot=0x1F22D,
+ unicodeslot=0x1F3DD,
},
- [0x1F22E]={
+ [0x1F3DE]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x53F3 },
- unicodeslot=0x1F22E,
+ unicodeslot=0x1F3DE,
},
- [0x1F22F]={
+ [0x1F3DF]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x6307 },
- unicodeslot=0x1F22F,
+ unicodeslot=0x1F3DF,
},
- [0x1F230]={
+ [0x1F3E0]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x8D70 },
- unicodeslot=0x1F230,
+ unicodeslot=0x1F3E0,
},
- [0x1F231]={
+ [0x1F3E1]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x6253 },
- unicodeslot=0x1F231,
+ unicodeslot=0x1F3E1,
},
- [0x1F232]={
+ [0x1F3E2]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x7981 },
- unicodeslot=0x1F232,
+ unicodeslot=0x1F3E2,
},
- [0x1F233]={
+ [0x1F3E3]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x7A7A },
- unicodeslot=0x1F233,
+ unicodeslot=0x1F3E3,
},
- [0x1F234]={
+ [0x1F3E4]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x5408 },
- unicodeslot=0x1F234,
+ unicodeslot=0x1F3E4,
},
- [0x1F235]={
+ [0x1F3E5]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x6E80 },
- unicodeslot=0x1F235,
+ unicodeslot=0x1F3E5,
},
- [0x1F236]={
+ [0x1F3E6]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x6709 },
- unicodeslot=0x1F236,
+ unicodeslot=0x1F3E6,
},
- [0x1F237]={
+ [0x1F3E7]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x6708 },
- unicodeslot=0x1F237,
+ unicodeslot=0x1F3E7,
},
- [0x1F238]={
+ [0x1F3E8]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x7533 },
- unicodeslot=0x1F238,
+ unicodeslot=0x1F3E8,
},
- [0x1F239]={
+ [0x1F3E9]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x5272 },
- unicodeslot=0x1F239,
+ unicodeslot=0x1F3E9,
},
- [0x1F23A]={
+ [0x1F3EA]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x55B6 },
- unicodeslot=0x1F23A,
+ unicodeslot=0x1F3EA,
},
- [0x1F23B]={
+ [0x1F3EB]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "square", 0x914D },
- unicodeslot=0x1F23B,
+ unicodeslot=0x1F3EB,
},
- [0x1F240]={
+ [0x1F3EC]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "compat", 0x3014, 0x672C, 0x3015 },
- unicodeslot=0x1F240,
+ unicodeslot=0x1F3EC,
},
- [0x1F241]={
+ [0x1F3ED]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "compat", 0x3014, 0x4E09, 0x3015 },
- unicodeslot=0x1F241,
+ unicodeslot=0x1F3ED,
},
- [0x1F242]={
+ [0x1F3EE]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "compat", 0x3014, 0x4E8C, 0x3015 },
- unicodeslot=0x1F242,
+ unicodeslot=0x1F3EE,
},
- [0x1F243]={
+ [0x1F3EF]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "compat", 0x3014, 0x5B89, 0x3015 },
- unicodeslot=0x1F243,
+ unicodeslot=0x1F3EF,
},
- [0x1F244]={
+ [0x1F3F0]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "compat", 0x3014, 0x70B9, 0x3015 },
- unicodeslot=0x1F244,
+ unicodeslot=0x1F3F0,
},
- [0x1F245]={
+ [0x1F3F1]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "compat", 0x3014, 0x6253, 0x3015 },
- unicodeslot=0x1F245,
+ unicodeslot=0x1F3F1,
},
- [0x1F246]={
+ [0x1F3F2]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "compat", 0x3014, 0x76D7, 0x3015 },
- unicodeslot=0x1F246,
+ unicodeslot=0x1F3F2,
},
- [0x1F247]={
+ [0x1F3F3]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "compat", 0x3014, 0x52DD, 0x3015 },
- unicodeslot=0x1F247,
+ unicodeslot=0x1F3F3,
},
- [0x1F248]={
+ [0x1F3F4]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "compat", 0x3014, 0x6557, 0x3015 },
- unicodeslot=0x1F248,
+ unicodeslot=0x1F3F4,
},
- [0x1F250]={
+ [0x1F3F5]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "circle", 0x5F97 },
- unicodeslot=0x1F250,
+ unicodeslot=0x1F3F5,
},
- [0x1F251]={
+ [0x1F3F6]={
category="so",
- direction="l",
+ direction="on",
linebreak="id",
- specials={ "circle", 0x53EF },
- unicodeslot=0x1F251,
+ unicodeslot=0x1F3F6,
},
- [0x1F260]={
+ [0x1F3F7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F260,
+ unicodeslot=0x1F3F7,
},
- [0x1F261]={
+ [0x1F3F8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F261,
+ unicodeslot=0x1F3F8,
},
- [0x1F262]={
+ [0x1F3F9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F262,
+ unicodeslot=0x1F3F9,
},
- [0x1F263]={
+ [0x1F3FA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F263,
+ unicodeslot=0x1F3FA,
},
- [0x1F264]={
+ [0x1F3FB]={
+ category="sk",
+ direction="on",
+ linebreak="em",
+ unicodeslot=0x1F3FB,
+ },
+ [0x1F3FC]={
+ category="sk",
+ direction="on",
+ linebreak="em",
+ unicodeslot=0x1F3FC,
+ },
+ [0x1F3FD]={
+ category="sk",
+ direction="on",
+ linebreak="em",
+ unicodeslot=0x1F3FD,
+ },
+ [0x1F3FE]={
+ category="sk",
+ direction="on",
+ linebreak="em",
+ unicodeslot=0x1F3FE,
+ },
+ [0x1F3FF]={
+ category="sk",
+ direction="on",
+ linebreak="em",
+ unicodeslot=0x1F3FF,
+ },
+ [0x1F400]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F264,
+ unicodeslot=0x1F400,
},
- [0x1F265]={
+ [0x1F401]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F265,
+ unicodeslot=0x1F401,
},
- [0x1F300]={
+ [0x1F402]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F300,
+ unicodeslot=0x1F402,
},
- [0x1F301]={
+ [0x1F403]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F301,
+ unicodeslot=0x1F403,
},
- [0x1F302]={
+ [0x1F404]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F302,
+ unicodeslot=0x1F404,
},
- [0x1F303]={
+ [0x1F405]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F303,
+ unicodeslot=0x1F405,
},
- [0x1F304]={
+ [0x1F406]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F304,
+ unicodeslot=0x1F406,
},
- [0x1F305]={
+ [0x1F407]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F305,
+ unicodeslot=0x1F407,
},
- [0x1F306]={
+ [0x1F408]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F306,
+ unicodeslot=0x1F408,
},
- [0x1F307]={
+ [0x1F409]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F307,
+ unicodeslot=0x1F409,
},
- [0x1F308]={
+ [0x1F40A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F308,
+ unicodeslot=0x1F40A,
},
- [0x1F309]={
+ [0x1F40B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F309,
+ unicodeslot=0x1F40B,
},
- [0x1F30A]={
+ [0x1F40C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F30A,
+ unicodeslot=0x1F40C,
},
- [0x1F30B]={
+ [0x1F40D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F30B,
+ unicodeslot=0x1F40D,
},
- [0x1F30C]={
+ [0x1F40E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F30C,
+ unicodeslot=0x1F40E,
},
- [0x1F30D]={
+ [0x1F40F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F30D,
+ unicodeslot=0x1F40F,
},
- [0x1F30E]={
+ [0x1F410]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F30E,
+ unicodeslot=0x1F410,
},
- [0x1F30F]={
+ [0x1F411]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F30F,
+ unicodeslot=0x1F411,
},
- [0x1F310]={
+ [0x1F412]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F310,
+ unicodeslot=0x1F412,
},
- [0x1F311]={
+ [0x1F413]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F311,
+ unicodeslot=0x1F413,
},
- [0x1F312]={
+ [0x1F414]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F312,
+ unicodeslot=0x1F414,
},
- [0x1F313]={
+ [0x1F415]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F313,
+ unicodeslot=0x1F415,
},
- [0x1F314]={
+ [0x1F416]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F314,
+ unicodeslot=0x1F416,
},
- [0x1F315]={
+ [0x1F417]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F315,
+ unicodeslot=0x1F417,
},
- [0x1F316]={
+ [0x1F418]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F316,
+ unicodeslot=0x1F418,
},
- [0x1F317]={
+ [0x1F419]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F317,
+ unicodeslot=0x1F419,
},
- [0x1F318]={
+ [0x1F41A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F318,
+ unicodeslot=0x1F41A,
},
- [0x1F319]={
+ [0x1F41B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F319,
+ unicodeslot=0x1F41B,
},
- [0x1F31A]={
+ [0x1F41C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F31A,
+ unicodeslot=0x1F41C,
},
- [0x1F31B]={
+ [0x1F41D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F31B,
+ unicodeslot=0x1F41D,
},
- [0x1F31C]={
+ [0x1F41E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F31C,
+ unicodeslot=0x1F41E,
},
- [0x1F31D]={
+ [0x1F41F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F31D,
+ unicodeslot=0x1F41F,
},
- [0x1F31E]={
+ [0x1F420]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F31E,
+ unicodeslot=0x1F420,
},
- [0x1F31F]={
+ [0x1F421]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F31F,
+ unicodeslot=0x1F421,
},
- [0x1F320]={
+ [0x1F422]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F320,
+ unicodeslot=0x1F422,
},
- [0x1F321]={
+ [0x1F423]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F321,
+ unicodeslot=0x1F423,
},
- [0x1F322]={
+ [0x1F424]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F322,
+ unicodeslot=0x1F424,
},
- [0x1F323]={
+ [0x1F425]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F323,
+ unicodeslot=0x1F425,
},
- [0x1F324]={
+ [0x1F426]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F324,
+ unicodeslot=0x1F426,
},
- [0x1F325]={
+ [0x1F427]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F325,
+ unicodeslot=0x1F427,
},
- [0x1F326]={
+ [0x1F428]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F326,
+ unicodeslot=0x1F428,
},
- [0x1F327]={
+ [0x1F429]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F327,
+ unicodeslot=0x1F429,
},
- [0x1F328]={
+ [0x1F42A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F328,
+ unicodeslot=0x1F42A,
},
- [0x1F329]={
+ [0x1F42B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F329,
+ unicodeslot=0x1F42B,
},
- [0x1F32A]={
+ [0x1F42C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F32A,
+ unicodeslot=0x1F42C,
},
- [0x1F32B]={
+ [0x1F42D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F32B,
+ unicodeslot=0x1F42D,
},
- [0x1F32C]={
+ [0x1F42E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F32C,
+ unicodeslot=0x1F42E,
},
- [0x1F32D]={
+ [0x1F42F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F32D,
+ unicodeslot=0x1F42F,
},
- [0x1F32E]={
+ [0x1F430]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F32E,
+ unicodeslot=0x1F430,
},
- [0x1F32F]={
+ [0x1F431]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F32F,
+ unicodeslot=0x1F431,
},
- [0x1F330]={
+ [0x1F432]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F330,
+ unicodeslot=0x1F432,
},
- [0x1F331]={
+ [0x1F433]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F331,
+ unicodeslot=0x1F433,
},
- [0x1F332]={
+ [0x1F434]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F332,
+ unicodeslot=0x1F434,
},
- [0x1F333]={
+ [0x1F435]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F333,
+ unicodeslot=0x1F435,
},
- [0x1F334]={
+ [0x1F436]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F334,
+ unicodeslot=0x1F436,
},
- [0x1F335]={
+ [0x1F437]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F335,
+ unicodeslot=0x1F437,
},
- [0x1F336]={
+ [0x1F438]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F336,
+ unicodeslot=0x1F438,
},
- [0x1F337]={
+ [0x1F439]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F337,
+ unicodeslot=0x1F439,
},
- [0x1F338]={
+ [0x1F43A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F338,
+ unicodeslot=0x1F43A,
},
- [0x1F339]={
+ [0x1F43B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F339,
+ unicodeslot=0x1F43B,
},
- [0x1F33A]={
+ [0x1F43C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F33A,
+ unicodeslot=0x1F43C,
},
- [0x1F33B]={
+ [0x1F43D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F33B,
+ unicodeslot=0x1F43D,
},
- [0x1F33C]={
+ [0x1F43E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F33C,
+ unicodeslot=0x1F43E,
},
- [0x1F33D]={
+ [0x1F43F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F33D,
+ unicodeslot=0x1F43F,
},
- [0x1F33E]={
+ [0x1F440]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F33E,
+ unicodeslot=0x1F440,
},
- [0x1F33F]={
+ [0x1F441]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F33F,
+ unicodeslot=0x1F441,
},
- [0x1F340]={
+ [0x1F442]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F340,
+ linebreak="eb",
+ unicodeslot=0x1F442,
},
- [0x1F341]={
+ [0x1F443]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F341,
+ linebreak="eb",
+ unicodeslot=0x1F443,
},
- [0x1F342]={
+ [0x1F444]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F342,
+ unicodeslot=0x1F444,
},
- [0x1F343]={
+ [0x1F445]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F343,
+ unicodeslot=0x1F445,
},
- [0x1F344]={
+ [0x1F446]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F344,
+ linebreak="eb",
+ unicodeslot=0x1F446,
},
- [0x1F345]={
+ [0x1F447]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F345,
+ linebreak="eb",
+ unicodeslot=0x1F447,
},
- [0x1F346]={
+ [0x1F448]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F346,
+ linebreak="eb",
+ unicodeslot=0x1F448,
},
- [0x1F347]={
+ [0x1F449]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F347,
+ linebreak="eb",
+ unicodeslot=0x1F449,
},
- [0x1F348]={
+ [0x1F44A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F348,
+ linebreak="eb",
+ unicodeslot=0x1F44A,
},
- [0x1F349]={
+ [0x1F44B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F349,
+ linebreak="eb",
+ unicodeslot=0x1F44B,
},
- [0x1F34A]={
+ [0x1F44C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F34A,
+ linebreak="eb",
+ unicodeslot=0x1F44C,
},
- [0x1F34B]={
+ [0x1F44D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F34B,
+ linebreak="eb",
+ unicodeslot=0x1F44D,
},
- [0x1F34C]={
+ [0x1F44E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F34C,
+ linebreak="eb",
+ unicodeslot=0x1F44E,
},
- [0x1F34D]={
+ [0x1F44F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F34D,
+ linebreak="eb",
+ unicodeslot=0x1F44F,
},
- [0x1F34E]={
+ [0x1F450]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F34E,
+ linebreak="eb",
+ unicodeslot=0x1F450,
},
- [0x1F34F]={
+ [0x1F451]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F34F,
+ unicodeslot=0x1F451,
},
- [0x1F350]={
+ [0x1F452]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F350,
+ unicodeslot=0x1F452,
},
- [0x1F351]={
+ [0x1F453]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F351,
+ unicodeslot=0x1F453,
},
- [0x1F352]={
+ [0x1F454]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F352,
+ unicodeslot=0x1F454,
},
- [0x1F353]={
+ [0x1F455]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F353,
+ unicodeslot=0x1F455,
},
- [0x1F354]={
+ [0x1F456]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F354,
+ unicodeslot=0x1F456,
},
- [0x1F355]={
+ [0x1F457]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F355,
+ unicodeslot=0x1F457,
},
- [0x1F356]={
+ [0x1F458]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F356,
+ unicodeslot=0x1F458,
},
- [0x1F357]={
+ [0x1F459]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F357,
+ unicodeslot=0x1F459,
},
- [0x1F358]={
+ [0x1F45A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F358,
+ unicodeslot=0x1F45A,
},
- [0x1F359]={
+ [0x1F45B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F359,
+ unicodeslot=0x1F45B,
},
- [0x1F35A]={
+ [0x1F45C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F35A,
+ unicodeslot=0x1F45C,
},
- [0x1F35B]={
+ [0x1F45D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F35B,
+ unicodeslot=0x1F45D,
},
- [0x1F35C]={
+ [0x1F45E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F35C,
+ unicodeslot=0x1F45E,
},
- [0x1F35D]={
+ [0x1F45F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F35D,
+ unicodeslot=0x1F45F,
},
- [0x1F35E]={
+ [0x1F460]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F35E,
+ unicodeslot=0x1F460,
},
- [0x1F35F]={
+ [0x1F461]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F35F,
+ unicodeslot=0x1F461,
},
- [0x1F360]={
+ [0x1F462]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F360,
+ unicodeslot=0x1F462,
},
- [0x1F361]={
+ [0x1F463]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F361,
+ unicodeslot=0x1F463,
},
- [0x1F362]={
+ [0x1F464]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F362,
+ unicodeslot=0x1F464,
},
- [0x1F363]={
+ [0x1F465]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F363,
+ unicodeslot=0x1F465,
},
- [0x1F364]={
+ [0x1F466]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F364,
+ linebreak="eb",
+ unicodeslot=0x1F466,
},
- [0x1F365]={
+ [0x1F467]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F365,
+ linebreak="eb",
+ unicodeslot=0x1F467,
},
- [0x1F366]={
+ [0x1F468]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F366,
+ linebreak="eb",
+ unicodeslot=0x1F468,
},
- [0x1F367]={
+ [0x1F469]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F367,
+ linebreak="eb",
+ unicodeslot=0x1F469,
},
- [0x1F368]={
+ [0x1F46A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F368,
+ linebreak="eb",
+ unicodeslot=0x1F46A,
},
- [0x1F369]={
+ [0x1F46B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F369,
+ linebreak="eb",
+ unicodeslot=0x1F46B,
},
- [0x1F36A]={
+ [0x1F46C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F36A,
+ linebreak="eb",
+ unicodeslot=0x1F46C,
},
- [0x1F36B]={
+ [0x1F46D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F36B,
+ linebreak="eb",
+ unicodeslot=0x1F46D,
},
- [0x1F36C]={
+ [0x1F46E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F36C,
+ linebreak="eb",
+ unicodeslot=0x1F46E,
},
- [0x1F36D]={
+ [0x1F46F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F36D,
+ linebreak="eb",
+ unicodeslot=0x1F46F,
},
- [0x1F36E]={
+ [0x1F470]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F36E,
+ linebreak="eb",
+ unicodeslot=0x1F470,
},
- [0x1F36F]={
+ [0x1F471]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F36F,
+ linebreak="eb",
+ unicodeslot=0x1F471,
},
- [0x1F370]={
+ [0x1F472]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F370,
+ linebreak="eb",
+ unicodeslot=0x1F472,
},
- [0x1F371]={
+ [0x1F473]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F371,
+ linebreak="eb",
+ unicodeslot=0x1F473,
},
- [0x1F372]={
+ [0x1F474]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F372,
+ linebreak="eb",
+ unicodeslot=0x1F474,
},
- [0x1F373]={
+ [0x1F475]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F373,
+ linebreak="eb",
+ unicodeslot=0x1F475,
},
- [0x1F374]={
+ [0x1F476]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F374,
+ linebreak="eb",
+ unicodeslot=0x1F476,
},
- [0x1F375]={
+ [0x1F477]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F375,
+ linebreak="eb",
+ unicodeslot=0x1F477,
},
- [0x1F376]={
+ [0x1F478]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F376,
+ linebreak="eb",
+ unicodeslot=0x1F478,
},
- [0x1F377]={
+ [0x1F479]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F377,
+ unicodeslot=0x1F479,
},
- [0x1F378]={
+ [0x1F47A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F378,
+ unicodeslot=0x1F47A,
},
- [0x1F379]={
+ [0x1F47B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F379,
+ unicodeslot=0x1F47B,
},
- [0x1F37A]={
+ [0x1F47C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F37A,
+ linebreak="eb",
+ unicodeslot=0x1F47C,
},
- [0x1F37B]={
+ [0x1F47D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F37B,
+ unicodeslot=0x1F47D,
},
- [0x1F37C]={
+ [0x1F47E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F37C,
+ unicodeslot=0x1F47E,
},
- [0x1F37D]={
+ [0x1F47F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F37D,
+ unicodeslot=0x1F47F,
},
- [0x1F37E]={
+ [0x1F480]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F37E,
+ unicodeslot=0x1F480,
},
- [0x1F37F]={
+ [0x1F481]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F37F,
+ linebreak="eb",
+ unicodeslot=0x1F481,
},
- [0x1F380]={
+ [0x1F482]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F380,
+ linebreak="eb",
+ unicodeslot=0x1F482,
},
- [0x1F381]={
+ [0x1F483]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F381,
+ linebreak="eb",
+ unicodeslot=0x1F483,
},
- [0x1F382]={
+ [0x1F484]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F382,
+ unicodeslot=0x1F484,
},
- [0x1F383]={
+ [0x1F485]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F383,
+ linebreak="eb",
+ unicodeslot=0x1F485,
},
- [0x1F384]={
+ [0x1F486]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F384,
+ linebreak="eb",
+ unicodeslot=0x1F486,
},
- [0x1F385]={
+ [0x1F487]={
category="so",
direction="on",
linebreak="eb",
- unicodeslot=0x1F385,
+ unicodeslot=0x1F487,
},
- [0x1F386]={
+ [0x1F488]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F386,
+ unicodeslot=0x1F488,
},
- [0x1F387]={
+ [0x1F489]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F387,
+ unicodeslot=0x1F489,
},
- [0x1F388]={
+ [0x1F48A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F388,
+ unicodeslot=0x1F48A,
},
- [0x1F389]={
+ [0x1F48B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F389,
+ unicodeslot=0x1F48B,
},
- [0x1F38A]={
+ [0x1F48C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F38A,
+ unicodeslot=0x1F48C,
},
- [0x1F38B]={
+ [0x1F48D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F38B,
+ unicodeslot=0x1F48D,
},
- [0x1F38C]={
+ [0x1F48E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F38C,
+ unicodeslot=0x1F48E,
},
- [0x1F38D]={
+ [0x1F48F]={
+ category="so",
+ direction="on",
+ linebreak="eb",
+ unicodeslot=0x1F48F,
+ },
+ [0x1F490]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F38D,
+ unicodeslot=0x1F490,
},
- [0x1F38E]={
+ [0x1F491]={
+ category="so",
+ direction="on",
+ linebreak="eb",
+ unicodeslot=0x1F491,
+ },
+ [0x1F492]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F38E,
+ unicodeslot=0x1F492,
},
- [0x1F38F]={
+ [0x1F493]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F38F,
+ unicodeslot=0x1F493,
},
- [0x1F390]={
+ [0x1F494]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F390,
+ unicodeslot=0x1F494,
},
- [0x1F391]={
+ [0x1F495]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F391,
+ unicodeslot=0x1F495,
},
- [0x1F392]={
+ [0x1F496]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F392,
+ unicodeslot=0x1F496,
},
- [0x1F393]={
+ [0x1F497]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F393,
+ unicodeslot=0x1F497,
},
- [0x1F394]={
+ [0x1F498]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F394,
+ unicodeslot=0x1F498,
},
- [0x1F395]={
+ [0x1F499]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F395,
+ unicodeslot=0x1F499,
},
- [0x1F396]={
+ [0x1F49A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F396,
+ unicodeslot=0x1F49A,
},
- [0x1F397]={
+ [0x1F49B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F397,
+ unicodeslot=0x1F49B,
},
- [0x1F398]={
+ [0x1F49C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F398,
+ unicodeslot=0x1F49C,
},
- [0x1F399]={
+ [0x1F49D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F399,
+ unicodeslot=0x1F49D,
},
- [0x1F39A]={
+ [0x1F49E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F39A,
+ unicodeslot=0x1F49E,
},
- [0x1F39B]={
+ [0x1F49F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F39B,
+ unicodeslot=0x1F49F,
},
- [0x1F39C]={
+ [0x1F4A0]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F39C,
+ unicodeslot=0x1F4A0,
},
- [0x1F39D]={
+ [0x1F4A1]={
+ category="so",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F4A1,
+ },
+ [0x1F4A2]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F39D,
+ unicodeslot=0x1F4A2,
},
- [0x1F39E]={
+ [0x1F4A3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F39E,
+ unicodeslot=0x1F4A3,
},
- [0x1F39F]={
+ [0x1F4A4]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F39F,
+ linebreak="al",
+ unicodeslot=0x1F4A4,
},
- [0x1F3A0]={
+ [0x1F4A5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3A0,
+ unicodeslot=0x1F4A5,
},
- [0x1F3A1]={
+ [0x1F4A6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3A1,
+ unicodeslot=0x1F4A6,
},
- [0x1F3A2]={
+ [0x1F4A7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3A2,
+ unicodeslot=0x1F4A7,
},
- [0x1F3A3]={
+ [0x1F4A8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3A3,
+ unicodeslot=0x1F4A8,
},
- [0x1F3A4]={
+ [0x1F4A9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3A4,
+ unicodeslot=0x1F4A9,
},
- [0x1F3A5]={
+ [0x1F4AA]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F3A5,
+ linebreak="eb",
+ unicodeslot=0x1F4AA,
},
- [0x1F3A6]={
+ [0x1F4AB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3A6,
+ unicodeslot=0x1F4AB,
},
- [0x1F3A7]={
+ [0x1F4AC]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3A7,
+ unicodeslot=0x1F4AC,
},
- [0x1F3A8]={
+ [0x1F4AD]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3A8,
+ unicodeslot=0x1F4AD,
},
- [0x1F3A9]={
+ [0x1F4AE]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3A9,
+ unicodeslot=0x1F4AE,
},
- [0x1F3AA]={
+ [0x1F4AF]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F3AA,
+ linebreak="al",
+ unicodeslot=0x1F4AF,
},
- [0x1F3AB]={
+ [0x1F4B0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3AB,
+ unicodeslot=0x1F4B0,
},
- [0x1F3AC]={
+ [0x1F4B1]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F3AC,
+ linebreak="al",
+ unicodeslot=0x1F4B1,
},
- [0x1F3AD]={
+ [0x1F4B2]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F3AD,
+ linebreak="al",
+ unicodeslot=0x1F4B2,
},
- [0x1F3AE]={
+ [0x1F4B3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3AE,
+ unicodeslot=0x1F4B3,
},
- [0x1F3AF]={
+ [0x1F4B4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3AF,
+ unicodeslot=0x1F4B4,
},
- [0x1F3B0]={
+ [0x1F4B5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3B0,
+ unicodeslot=0x1F4B5,
},
- [0x1F3B1]={
+ [0x1F4B6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3B1,
+ unicodeslot=0x1F4B6,
},
- [0x1F3B2]={
+ [0x1F4B7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3B2,
+ unicodeslot=0x1F4B7,
},
- [0x1F3B3]={
+ [0x1F4B8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3B3,
+ unicodeslot=0x1F4B8,
},
- [0x1F3B4]={
+ [0x1F4B9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3B4,
+ unicodeslot=0x1F4B9,
},
- [0x1F3B5]={
+ [0x1F4BA]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F3B5,
+ linebreak="id",
+ unicodeslot=0x1F4BA,
},
- [0x1F3B6]={
+ [0x1F4BB]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F3B6,
+ linebreak="id",
+ unicodeslot=0x1F4BB,
},
- [0x1F3B7]={
+ [0x1F4BC]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3B7,
+ unicodeslot=0x1F4BC,
},
- [0x1F3B8]={
+ [0x1F4BD]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3B8,
+ unicodeslot=0x1F4BD,
},
- [0x1F3B9]={
+ [0x1F4BE]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3B9,
+ unicodeslot=0x1F4BE,
},
- [0x1F3BA]={
+ [0x1F4BF]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3BA,
+ unicodeslot=0x1F4BF,
},
- [0x1F3BB]={
+ [0x1F4C0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3BB,
+ unicodeslot=0x1F4C0,
},
- [0x1F3BC]={
+ [0x1F4C1]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F3BC,
+ linebreak="id",
+ unicodeslot=0x1F4C1,
},
- [0x1F3BD]={
+ [0x1F4C2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3BD,
+ unicodeslot=0x1F4C2,
},
- [0x1F3BE]={
+ [0x1F4C3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3BE,
+ unicodeslot=0x1F4C3,
},
- [0x1F3BF]={
+ [0x1F4C4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3BF,
+ unicodeslot=0x1F4C4,
},
- [0x1F3C0]={
+ [0x1F4C5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3C0,
+ unicodeslot=0x1F4C5,
},
- [0x1F3C1]={
+ [0x1F4C6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3C1,
+ unicodeslot=0x1F4C6,
},
- [0x1F3C2]={
+ [0x1F4C7]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F3C2,
+ linebreak="id",
+ unicodeslot=0x1F4C7,
},
- [0x1F3C3]={
+ [0x1F4C8]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F3C3,
+ linebreak="id",
+ unicodeslot=0x1F4C8,
},
- [0x1F3C4]={
+ [0x1F4C9]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F3C4,
+ linebreak="id",
+ unicodeslot=0x1F4C9,
},
- [0x1F3C5]={
+ [0x1F4CA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3C5,
+ unicodeslot=0x1F4CA,
},
- [0x1F3C6]={
+ [0x1F4CB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3C6,
+ unicodeslot=0x1F4CB,
},
- [0x1F3C7]={
+ [0x1F4CC]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F3C7,
+ linebreak="id",
+ unicodeslot=0x1F4CC,
},
- [0x1F3C8]={
+ [0x1F4CD]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3C8,
+ unicodeslot=0x1F4CD,
},
- [0x1F3C9]={
+ [0x1F4CE]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3C9,
+ unicodeslot=0x1F4CE,
},
- [0x1F3CA]={
+ [0x1F4CF]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F3CA,
+ linebreak="id",
+ unicodeslot=0x1F4CF,
},
- [0x1F3CB]={
+ [0x1F4D0]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F3CB,
+ linebreak="id",
+ unicodeslot=0x1F4D0,
},
- [0x1F3CC]={
+ [0x1F4D1]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F3CC,
+ linebreak="id",
+ unicodeslot=0x1F4D1,
},
- [0x1F3CD]={
+ [0x1F4D2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3CD,
+ unicodeslot=0x1F4D2,
},
- [0x1F3CE]={
+ [0x1F4D3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3CE,
+ unicodeslot=0x1F4D3,
},
- [0x1F3CF]={
+ [0x1F4D4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3CF,
+ unicodeslot=0x1F4D4,
},
- [0x1F3D0]={
+ [0x1F4D5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3D0,
+ unicodeslot=0x1F4D5,
},
- [0x1F3D1]={
+ [0x1F4D6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3D1,
+ unicodeslot=0x1F4D6,
},
- [0x1F3D2]={
+ [0x1F4D7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3D2,
+ unicodeslot=0x1F4D7,
},
- [0x1F3D3]={
+ [0x1F4D8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3D3,
+ unicodeslot=0x1F4D8,
},
- [0x1F3D4]={
+ [0x1F4D9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3D4,
+ unicodeslot=0x1F4D9,
},
- [0x1F3D5]={
+ [0x1F4DA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3D5,
+ unicodeslot=0x1F4DA,
},
- [0x1F3D6]={
+ [0x1F4DB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3D6,
+ unicodeslot=0x1F4DB,
},
- [0x1F3D7]={
+ [0x1F4DC]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3D7,
+ unicodeslot=0x1F4DC,
},
- [0x1F3D8]={
+ [0x1F4DD]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3D8,
+ unicodeslot=0x1F4DD,
},
- [0x1F3D9]={
+ [0x1F4DE]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3D9,
+ unicodeslot=0x1F4DE,
},
- [0x1F3DA]={
+ [0x1F4DF]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3DA,
+ unicodeslot=0x1F4DF,
},
- [0x1F3DB]={
+ [0x1F4E0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3DB,
+ unicodeslot=0x1F4E0,
},
- [0x1F3DC]={
+ [0x1F4E1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3DC,
+ unicodeslot=0x1F4E1,
},
- [0x1F3DD]={
+ [0x1F4E2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3DD,
+ unicodeslot=0x1F4E2,
},
- [0x1F3DE]={
+ [0x1F4E3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3DE,
+ unicodeslot=0x1F4E3,
},
- [0x1F3DF]={
+ [0x1F4E4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3DF,
+ unicodeslot=0x1F4E4,
},
- [0x1F3E0]={
+ [0x1F4E5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3E0,
+ unicodeslot=0x1F4E5,
},
- [0x1F3E1]={
+ [0x1F4E6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3E1,
+ unicodeslot=0x1F4E6,
},
- [0x1F3E2]={
+ [0x1F4E7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3E2,
+ unicodeslot=0x1F4E7,
},
- [0x1F3E3]={
+ [0x1F4E8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3E3,
+ unicodeslot=0x1F4E8,
},
- [0x1F3E4]={
+ [0x1F4E9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3E4,
+ unicodeslot=0x1F4E9,
},
- [0x1F3E5]={
+ [0x1F4EA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3E5,
+ unicodeslot=0x1F4EA,
},
- [0x1F3E6]={
+ [0x1F4EB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3E6,
+ unicodeslot=0x1F4EB,
},
- [0x1F3E7]={
+ [0x1F4EC]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3E7,
+ unicodeslot=0x1F4EC,
},
- [0x1F3E8]={
+ [0x1F4ED]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3E8,
+ unicodeslot=0x1F4ED,
},
- [0x1F3E9]={
+ [0x1F4EE]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3E9,
+ unicodeslot=0x1F4EE,
},
- [0x1F3EA]={
+ [0x1F4EF]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3EA,
+ unicodeslot=0x1F4EF,
},
- [0x1F3EB]={
+ [0x1F4F0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3EB,
+ unicodeslot=0x1F4F0,
},
- [0x1F3EC]={
+ [0x1F4F1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3EC,
+ unicodeslot=0x1F4F1,
},
- [0x1F3ED]={
+ [0x1F4F2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3ED,
+ unicodeslot=0x1F4F2,
},
- [0x1F3EE]={
+ [0x1F4F3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3EE,
+ unicodeslot=0x1F4F3,
},
- [0x1F3EF]={
+ [0x1F4F4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3EF,
+ unicodeslot=0x1F4F4,
},
- [0x1F3F0]={
+ [0x1F4F5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3F0,
+ unicodeslot=0x1F4F5,
},
- [0x1F3F1]={
+ [0x1F4F6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3F1,
+ unicodeslot=0x1F4F6,
},
- [0x1F3F2]={
+ [0x1F4F7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3F2,
+ unicodeslot=0x1F4F7,
},
- [0x1F3F3]={
+ [0x1F4F8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3F3,
+ unicodeslot=0x1F4F8,
},
- [0x1F3F4]={
+ [0x1F4F9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3F4,
+ unicodeslot=0x1F4F9,
},
- [0x1F3F5]={
+ [0x1F4FA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3F5,
+ unicodeslot=0x1F4FA,
},
- [0x1F3F6]={
+ [0x1F4FB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3F6,
+ unicodeslot=0x1F4FB,
},
- [0x1F3F7]={
+ [0x1F4FC]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3F7,
+ unicodeslot=0x1F4FC,
},
- [0x1F3F8]={
+ [0x1F4FD]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3F8,
+ unicodeslot=0x1F4FD,
},
- [0x1F3F9]={
+ [0x1F4FE]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3F9,
+ unicodeslot=0x1F4FE,
},
- [0x1F3FA]={
+ [0x1F4FF]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F3FA,
- },
- [0x1F3FB]={
- category="sk",
- direction="on",
- linebreak="em",
- unicodeslot=0x1F3FB,
+ unicodeslot=0x1F4FF,
},
- [0x1F3FC]={
- category="sk",
+ [0x1F500]={
+ category="so",
direction="on",
- linebreak="em",
- unicodeslot=0x1F3FC,
+ linebreak="al",
+ unicodeslot=0x1F500,
},
- [0x1F3FD]={
- category="sk",
+ [0x1F501]={
+ category="so",
direction="on",
- linebreak="em",
- unicodeslot=0x1F3FD,
+ linebreak="al",
+ unicodeslot=0x1F501,
},
- [0x1F3FE]={
- category="sk",
+ [0x1F502]={
+ category="so",
direction="on",
- linebreak="em",
- unicodeslot=0x1F3FE,
+ linebreak="al",
+ unicodeslot=0x1F502,
},
- [0x1F3FF]={
- category="sk",
+ [0x1F503]={
+ category="so",
direction="on",
- linebreak="em",
- unicodeslot=0x1F3FF,
+ linebreak="al",
+ unicodeslot=0x1F503,
},
- [0x1F400]={
+ [0x1F504]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F400,
+ linebreak="al",
+ unicodeslot=0x1F504,
},
- [0x1F401]={
+ [0x1F505]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F401,
+ linebreak="al",
+ unicodeslot=0x1F505,
},
- [0x1F402]={
+ [0x1F506]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F402,
+ linebreak="al",
+ unicodeslot=0x1F506,
},
- [0x1F403]={
+ [0x1F507]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F403,
+ unicodeslot=0x1F507,
},
- [0x1F404]={
+ [0x1F508]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F404,
+ unicodeslot=0x1F508,
},
- [0x1F405]={
+ [0x1F509]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F405,
+ unicodeslot=0x1F509,
},
- [0x1F406]={
+ [0x1F50A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F406,
+ unicodeslot=0x1F50A,
},
- [0x1F407]={
+ [0x1F50B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F407,
+ unicodeslot=0x1F50B,
},
- [0x1F408]={
+ [0x1F50C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F408,
+ unicodeslot=0x1F50C,
},
- [0x1F409]={
+ [0x1F50D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F409,
+ unicodeslot=0x1F50D,
},
- [0x1F40A]={
+ [0x1F50E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F40A,
+ unicodeslot=0x1F50E,
},
- [0x1F40B]={
+ [0x1F50F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F40B,
+ unicodeslot=0x1F50F,
},
- [0x1F40C]={
+ [0x1F510]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F40C,
+ unicodeslot=0x1F510,
},
- [0x1F40D]={
+ [0x1F511]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F40D,
+ unicodeslot=0x1F511,
},
- [0x1F40E]={
+ [0x1F512]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F40E,
+ unicodeslot=0x1F512,
},
- [0x1F40F]={
+ [0x1F513]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F40F,
+ unicodeslot=0x1F513,
},
- [0x1F410]={
+ [0x1F514]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F410,
+ unicodeslot=0x1F514,
},
- [0x1F411]={
+ [0x1F515]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F411,
+ unicodeslot=0x1F515,
},
- [0x1F412]={
+ [0x1F516]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F412,
+ unicodeslot=0x1F516,
},
- [0x1F413]={
+ [0x1F517]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F413,
+ linebreak="al",
+ unicodeslot=0x1F517,
},
- [0x1F414]={
+ [0x1F518]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F414,
+ linebreak="al",
+ unicodeslot=0x1F518,
},
- [0x1F415]={
+ [0x1F519]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F415,
+ linebreak="al",
+ unicodeslot=0x1F519,
},
- [0x1F416]={
+ [0x1F51A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F416,
+ linebreak="al",
+ unicodeslot=0x1F51A,
},
- [0x1F417]={
+ [0x1F51B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F417,
+ linebreak="al",
+ unicodeslot=0x1F51B,
},
- [0x1F418]={
+ [0x1F51C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F418,
+ linebreak="al",
+ unicodeslot=0x1F51C,
},
- [0x1F419]={
+ [0x1F51D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F419,
+ linebreak="al",
+ unicodeslot=0x1F51D,
},
- [0x1F41A]={
+ [0x1F51E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F41A,
+ linebreak="al",
+ unicodeslot=0x1F51E,
},
- [0x1F41B]={
+ [0x1F51F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F41B,
+ linebreak="al",
+ unicodeslot=0x1F51F,
},
- [0x1F41C]={
+ [0x1F520]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F41C,
+ linebreak="al",
+ unicodeslot=0x1F520,
},
- [0x1F41D]={
+ [0x1F521]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F41D,
+ linebreak="al",
+ unicodeslot=0x1F521,
},
- [0x1F41E]={
+ [0x1F522]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F41E,
+ linebreak="al",
+ unicodeslot=0x1F522,
},
- [0x1F41F]={
+ [0x1F523]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F41F,
+ linebreak="al",
+ unicodeslot=0x1F523,
},
- [0x1F420]={
+ [0x1F524]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F420,
+ linebreak="al",
+ unicodeslot=0x1F524,
},
- [0x1F421]={
+ [0x1F525]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F421,
+ unicodeslot=0x1F525,
},
- [0x1F422]={
+ [0x1F526]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F422,
+ unicodeslot=0x1F526,
},
- [0x1F423]={
+ [0x1F527]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F423,
+ unicodeslot=0x1F527,
},
- [0x1F424]={
+ [0x1F528]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F424,
+ unicodeslot=0x1F528,
},
- [0x1F425]={
+ [0x1F529]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F425,
+ unicodeslot=0x1F529,
},
- [0x1F426]={
+ [0x1F52A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F426,
+ unicodeslot=0x1F52A,
},
- [0x1F427]={
+ [0x1F52B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F427,
+ unicodeslot=0x1F52B,
},
- [0x1F428]={
+ [0x1F52C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F428,
+ unicodeslot=0x1F52C,
},
- [0x1F429]={
+ [0x1F52D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F429,
+ unicodeslot=0x1F52D,
},
- [0x1F42A]={
+ [0x1F52E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F42A,
+ unicodeslot=0x1F52E,
},
- [0x1F42B]={
+ [0x1F52F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F42B,
+ unicodeslot=0x1F52F,
},
- [0x1F42C]={
+ [0x1F530]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F42C,
+ unicodeslot=0x1F530,
},
- [0x1F42D]={
+ [0x1F531]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F42D,
+ unicodeslot=0x1F531,
},
- [0x1F42E]={
+ [0x1F532]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F42E,
+ linebreak="al",
+ unicodeslot=0x1F532,
},
- [0x1F42F]={
+ [0x1F533]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F42F,
+ linebreak="al",
+ unicodeslot=0x1F533,
},
- [0x1F430]={
+ [0x1F534]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F430,
+ linebreak="al",
+ unicodeslot=0x1F534,
},
- [0x1F431]={
+ [0x1F535]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F431,
+ linebreak="al",
+ unicodeslot=0x1F535,
},
- [0x1F432]={
+ [0x1F536]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F432,
+ linebreak="al",
+ unicodeslot=0x1F536,
},
- [0x1F433]={
+ [0x1F537]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F433,
+ linebreak="al",
+ unicodeslot=0x1F537,
},
- [0x1F434]={
+ [0x1F538]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F434,
+ linebreak="al",
+ unicodeslot=0x1F538,
},
- [0x1F435]={
+ [0x1F539]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F435,
+ linebreak="al",
+ unicodeslot=0x1F539,
},
- [0x1F436]={
+ [0x1F53A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F436,
+ linebreak="al",
+ unicodeslot=0x1F53A,
},
- [0x1F437]={
+ [0x1F53B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F437,
+ linebreak="al",
+ unicodeslot=0x1F53B,
},
- [0x1F438]={
+ [0x1F53C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F438,
+ linebreak="al",
+ unicodeslot=0x1F53C,
},
- [0x1F439]={
+ [0x1F53D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F439,
+ linebreak="al",
+ unicodeslot=0x1F53D,
},
- [0x1F43A]={
+ [0x1F53E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F43A,
+ linebreak="al",
+ unicodeslot=0x1F53E,
},
- [0x1F43B]={
+ [0x1F53F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F43B,
+ linebreak="al",
+ unicodeslot=0x1F53F,
},
- [0x1F43C]={
+ [0x1F540]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F43C,
+ linebreak="al",
+ unicodeslot=0x1F540,
},
- [0x1F43D]={
+ [0x1F541]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F43D,
+ linebreak="al",
+ unicodeslot=0x1F541,
},
- [0x1F43E]={
+ [0x1F542]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F43E,
+ linebreak="al",
+ unicodeslot=0x1F542,
},
- [0x1F43F]={
+ [0x1F543]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F43F,
+ linebreak="al",
+ unicodeslot=0x1F543,
},
- [0x1F440]={
+ [0x1F544]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F440,
+ linebreak="al",
+ unicodeslot=0x1F544,
},
- [0x1F441]={
+ [0x1F545]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F441,
+ linebreak="al",
+ unicodeslot=0x1F545,
},
- [0x1F442]={
+ [0x1F546]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F442,
+ linebreak="al",
+ unicodeslot=0x1F546,
},
- [0x1F443]={
+ [0x1F547]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F443,
+ linebreak="al",
+ unicodeslot=0x1F547,
},
- [0x1F444]={
+ [0x1F548]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F444,
+ linebreak="al",
+ unicodeslot=0x1F548,
},
- [0x1F445]={
+ [0x1F549]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F445,
+ linebreak="al",
+ unicodeslot=0x1F549,
},
- [0x1F446]={
+ [0x1F54A]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F446,
+ linebreak="id",
+ unicodeslot=0x1F54A,
},
- [0x1F447]={
+ [0x1F54B]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F447,
+ linebreak="id",
+ unicodeslot=0x1F54B,
},
- [0x1F448]={
+ [0x1F54C]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F448,
+ linebreak="id",
+ unicodeslot=0x1F54C,
},
- [0x1F449]={
+ [0x1F54D]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F449,
+ linebreak="id",
+ unicodeslot=0x1F54D,
},
- [0x1F44A]={
+ [0x1F54E]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F44A,
+ linebreak="id",
+ unicodeslot=0x1F54E,
},
- [0x1F44B]={
+ [0x1F54F]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F44B,
+ linebreak="id",
+ unicodeslot=0x1F54F,
},
- [0x1F44C]={
+ [0x1F550]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F44C,
+ linebreak="id",
+ unicodeslot=0x1F550,
},
- [0x1F44D]={
+ [0x1F551]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F44D,
+ linebreak="id",
+ unicodeslot=0x1F551,
},
- [0x1F44E]={
+ [0x1F552]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F44E,
+ linebreak="id",
+ unicodeslot=0x1F552,
},
- [0x1F44F]={
+ [0x1F553]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F44F,
+ linebreak="id",
+ unicodeslot=0x1F553,
},
- [0x1F450]={
+ [0x1F554]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F450,
+ linebreak="id",
+ unicodeslot=0x1F554,
},
- [0x1F451]={
+ [0x1F555]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F451,
+ unicodeslot=0x1F555,
},
- [0x1F452]={
+ [0x1F556]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F452,
+ unicodeslot=0x1F556,
},
- [0x1F453]={
+ [0x1F557]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F453,
+ unicodeslot=0x1F557,
},
- [0x1F454]={
+ [0x1F558]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F454,
+ unicodeslot=0x1F558,
},
- [0x1F455]={
+ [0x1F559]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F455,
+ unicodeslot=0x1F559,
},
- [0x1F456]={
+ [0x1F55A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F456,
+ unicodeslot=0x1F55A,
},
- [0x1F457]={
+ [0x1F55B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F457,
+ unicodeslot=0x1F55B,
},
- [0x1F458]={
+ [0x1F55C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F458,
+ unicodeslot=0x1F55C,
},
- [0x1F459]={
+ [0x1F55D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F459,
+ unicodeslot=0x1F55D,
},
- [0x1F45A]={
+ [0x1F55E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F45A,
+ unicodeslot=0x1F55E,
},
- [0x1F45B]={
+ [0x1F55F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F45B,
+ unicodeslot=0x1F55F,
},
- [0x1F45C]={
+ [0x1F560]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F45C,
+ unicodeslot=0x1F560,
},
- [0x1F45D]={
+ [0x1F561]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F45D,
+ unicodeslot=0x1F561,
},
- [0x1F45E]={
+ [0x1F562]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F45E,
+ unicodeslot=0x1F562,
},
- [0x1F45F]={
+ [0x1F563]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F45F,
+ unicodeslot=0x1F563,
},
- [0x1F460]={
+ [0x1F564]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F460,
+ unicodeslot=0x1F564,
},
- [0x1F461]={
+ [0x1F565]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F461,
+ unicodeslot=0x1F565,
},
- [0x1F462]={
+ [0x1F566]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F462,
+ unicodeslot=0x1F566,
},
- [0x1F463]={
+ [0x1F567]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F463,
+ unicodeslot=0x1F567,
},
- [0x1F464]={
+ [0x1F568]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F464,
+ unicodeslot=0x1F568,
},
- [0x1F465]={
+ [0x1F569]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F465,
+ unicodeslot=0x1F569,
},
- [0x1F466]={
+ [0x1F56A]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F466,
+ linebreak="id",
+ unicodeslot=0x1F56A,
},
- [0x1F467]={
+ [0x1F56B]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F467,
+ linebreak="id",
+ unicodeslot=0x1F56B,
},
- [0x1F468]={
+ [0x1F56C]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F468,
+ linebreak="id",
+ unicodeslot=0x1F56C,
},
- [0x1F469]={
+ [0x1F56D]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F469,
+ linebreak="id",
+ unicodeslot=0x1F56D,
},
- [0x1F46A]={
+ [0x1F56E]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F46A,
+ linebreak="id",
+ unicodeslot=0x1F56E,
},
- [0x1F46B]={
+ [0x1F56F]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F46B,
+ linebreak="id",
+ unicodeslot=0x1F56F,
},
- [0x1F46C]={
+ [0x1F570]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F46C,
+ linebreak="id",
+ unicodeslot=0x1F570,
},
- [0x1F46D]={
+ [0x1F571]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F46D,
+ linebreak="id",
+ unicodeslot=0x1F571,
},
- [0x1F46E]={
+ [0x1F572]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F46E,
+ linebreak="id",
+ unicodeslot=0x1F572,
},
- [0x1F46F]={
+ [0x1F573]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F46F,
+ linebreak="id",
+ unicodeslot=0x1F573,
},
- [0x1F470]={
+ [0x1F574]={
category="so",
direction="on",
linebreak="eb",
- unicodeslot=0x1F470,
+ unicodeslot=0x1F574,
},
- [0x1F471]={
+ [0x1F575]={
category="so",
direction="on",
linebreak="eb",
- unicodeslot=0x1F471,
+ unicodeslot=0x1F575,
},
- [0x1F472]={
+ [0x1F576]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F472,
+ linebreak="id",
+ unicodeslot=0x1F576,
},
- [0x1F473]={
+ [0x1F577]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F473,
+ linebreak="id",
+ unicodeslot=0x1F577,
},
- [0x1F474]={
+ [0x1F578]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F474,
+ linebreak="id",
+ unicodeslot=0x1F578,
},
- [0x1F475]={
+ [0x1F579]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F475,
+ linebreak="id",
+ unicodeslot=0x1F579,
},
- [0x1F476]={
+ [0x1F57A]={
category="so",
direction="on",
linebreak="eb",
- unicodeslot=0x1F476,
+ unicodeslot=0x1F57A,
},
- [0x1F477]={
+ [0x1F57B]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F477,
+ linebreak="id",
+ unicodeslot=0x1F57B,
},
- [0x1F478]={
+ [0x1F57C]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F478,
+ linebreak="id",
+ unicodeslot=0x1F57C,
},
- [0x1F479]={
+ [0x1F57D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F479,
+ unicodeslot=0x1F57D,
},
- [0x1F47A]={
+ [0x1F57E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F47A,
+ unicodeslot=0x1F57E,
},
- [0x1F47B]={
+ [0x1F57F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F47B,
+ unicodeslot=0x1F57F,
},
- [0x1F47C]={
+ [0x1F580]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F47C,
+ linebreak="id",
+ unicodeslot=0x1F580,
},
- [0x1F47D]={
+ [0x1F581]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F47D,
+ unicodeslot=0x1F581,
},
- [0x1F47E]={
+ [0x1F582]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F47E,
+ unicodeslot=0x1F582,
},
- [0x1F47F]={
+ [0x1F583]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F47F,
+ unicodeslot=0x1F583,
},
- [0x1F480]={
+ [0x1F584]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F480,
+ unicodeslot=0x1F584,
},
- [0x1F481]={
+ [0x1F585]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F481,
+ linebreak="id",
+ unicodeslot=0x1F585,
},
- [0x1F482]={
+ [0x1F586]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F482,
+ linebreak="id",
+ unicodeslot=0x1F586,
},
- [0x1F483]={
+ [0x1F587]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F483,
+ linebreak="id",
+ unicodeslot=0x1F587,
},
- [0x1F484]={
+ [0x1F588]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F484,
+ unicodeslot=0x1F588,
},
- [0x1F485]={
+ [0x1F589]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F485,
+ linebreak="id",
+ unicodeslot=0x1F589,
},
- [0x1F486]={
+ [0x1F58A]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F486,
+ linebreak="id",
+ unicodeslot=0x1F58A,
},
- [0x1F487]={
+ [0x1F58B]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F487,
+ linebreak="id",
+ unicodeslot=0x1F58B,
},
- [0x1F488]={
+ [0x1F58C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F488,
+ unicodeslot=0x1F58C,
},
- [0x1F489]={
+ [0x1F58D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F489,
+ unicodeslot=0x1F58D,
},
- [0x1F48A]={
+ [0x1F58E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F48A,
+ unicodeslot=0x1F58E,
},
- [0x1F48B]={
+ [0x1F58F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F48B,
+ unicodeslot=0x1F58F,
},
- [0x1F48C]={
+ [0x1F590]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F48C,
+ linebreak="eb",
+ unicodeslot=0x1F590,
},
- [0x1F48D]={
+ [0x1F591]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F48D,
+ unicodeslot=0x1F591,
},
- [0x1F48E]={
+ [0x1F592]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F48E,
+ unicodeslot=0x1F592,
},
- [0x1F48F]={
+ [0x1F593]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F48F,
+ linebreak="id",
+ unicodeslot=0x1F593,
},
- [0x1F490]={
+ [0x1F594]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F490,
+ unicodeslot=0x1F594,
},
- [0x1F491]={
+ [0x1F595]={
category="so",
direction="on",
linebreak="eb",
- unicodeslot=0x1F491,
+ unicodeslot=0x1F595,
},
- [0x1F492]={
+ [0x1F596]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F492,
+ linebreak="eb",
+ unicodeslot=0x1F596,
},
- [0x1F493]={
+ [0x1F597]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F493,
+ unicodeslot=0x1F597,
},
- [0x1F494]={
+ [0x1F598]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F494,
+ unicodeslot=0x1F598,
},
- [0x1F495]={
+ [0x1F599]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F495,
+ unicodeslot=0x1F599,
},
- [0x1F496]={
+ [0x1F59A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F496,
+ unicodeslot=0x1F59A,
},
- [0x1F497]={
+ [0x1F59B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F497,
+ unicodeslot=0x1F59B,
},
- [0x1F498]={
+ [0x1F59C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F498,
+ unicodeslot=0x1F59C,
},
- [0x1F499]={
+ [0x1F59D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F499,
+ unicodeslot=0x1F59D,
},
- [0x1F49A]={
+ [0x1F59E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F49A,
+ unicodeslot=0x1F59E,
},
- [0x1F49B]={
+ [0x1F59F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F49B,
+ unicodeslot=0x1F59F,
},
- [0x1F49C]={
+ [0x1F5A0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F49C,
+ unicodeslot=0x1F5A0,
},
- [0x1F49D]={
+ [0x1F5A1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F49D,
+ unicodeslot=0x1F5A1,
},
- [0x1F49E]={
+ [0x1F5A2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F49E,
+ unicodeslot=0x1F5A2,
},
- [0x1F49F]={
+ [0x1F5A3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F49F,
+ unicodeslot=0x1F5A3,
},
- [0x1F4A0]={
+ [0x1F5A4]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F4A0,
+ linebreak="id",
+ unicodeslot=0x1F5A4,
},
- [0x1F4A1]={
+ [0x1F5A5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4A1,
+ unicodeslot=0x1F5A5,
},
- [0x1F4A2]={
+ [0x1F5A6]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F4A2,
+ linebreak="id",
+ unicodeslot=0x1F5A6,
},
- [0x1F4A3]={
+ [0x1F5A7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4A3,
+ unicodeslot=0x1F5A7,
},
- [0x1F4A4]={
+ [0x1F5A8]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F4A4,
+ linebreak="id",
+ unicodeslot=0x1F5A8,
},
- [0x1F4A5]={
+ [0x1F5A9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4A5,
+ unicodeslot=0x1F5A9,
},
- [0x1F4A6]={
+ [0x1F5AA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4A6,
+ unicodeslot=0x1F5AA,
},
- [0x1F4A7]={
+ [0x1F5AB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4A7,
+ unicodeslot=0x1F5AB,
},
- [0x1F4A8]={
+ [0x1F5AC]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4A8,
+ unicodeslot=0x1F5AC,
},
- [0x1F4A9]={
+ [0x1F5AD]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4A9,
+ unicodeslot=0x1F5AD,
},
- [0x1F4AA]={
+ [0x1F5AE]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F4AA,
+ linebreak="id",
+ unicodeslot=0x1F5AE,
},
- [0x1F4AB]={
+ [0x1F5AF]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4AB,
+ unicodeslot=0x1F5AF,
},
- [0x1F4AC]={
+ [0x1F5B0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4AC,
+ unicodeslot=0x1F5B0,
},
- [0x1F4AD]={
+ [0x1F5B1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4AD,
+ unicodeslot=0x1F5B1,
},
- [0x1F4AE]={
+ [0x1F5B2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4AE,
+ unicodeslot=0x1F5B2,
},
- [0x1F4AF]={
+ [0x1F5B3]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F4AF,
+ linebreak="id",
+ unicodeslot=0x1F5B3,
},
- [0x1F4B0]={
+ [0x1F5B4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4B0,
+ unicodeslot=0x1F5B4,
},
- [0x1F4B1]={
+ [0x1F5B5]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F4B1,
+ linebreak="id",
+ unicodeslot=0x1F5B5,
},
- [0x1F4B2]={
+ [0x1F5B6]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F4B2,
+ linebreak="id",
+ unicodeslot=0x1F5B6,
},
- [0x1F4B3]={
+ [0x1F5B7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4B3,
+ unicodeslot=0x1F5B7,
},
- [0x1F4B4]={
+ [0x1F5B8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4B4,
+ unicodeslot=0x1F5B8,
},
- [0x1F4B5]={
+ [0x1F5B9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4B5,
+ unicodeslot=0x1F5B9,
},
- [0x1F4B6]={
+ [0x1F5BA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4B6,
+ unicodeslot=0x1F5BA,
},
- [0x1F4B7]={
+ [0x1F5BB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4B7,
+ unicodeslot=0x1F5BB,
},
- [0x1F4B8]={
+ [0x1F5BC]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4B8,
+ unicodeslot=0x1F5BC,
},
- [0x1F4B9]={
+ [0x1F5BD]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4B9,
+ unicodeslot=0x1F5BD,
},
- [0x1F4BA]={
+ [0x1F5BE]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4BA,
+ unicodeslot=0x1F5BE,
},
- [0x1F4BB]={
+ [0x1F5BF]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4BB,
+ unicodeslot=0x1F5BF,
},
- [0x1F4BC]={
+ [0x1F5C0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4BC,
+ unicodeslot=0x1F5C0,
},
- [0x1F4BD]={
+ [0x1F5C1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4BD,
+ unicodeslot=0x1F5C1,
},
- [0x1F4BE]={
+ [0x1F5C2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4BE,
+ unicodeslot=0x1F5C2,
},
- [0x1F4BF]={
+ [0x1F5C3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4BF,
+ unicodeslot=0x1F5C3,
},
- [0x1F4C0]={
+ [0x1F5C4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4C0,
+ unicodeslot=0x1F5C4,
},
- [0x1F4C1]={
+ [0x1F5C5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4C1,
+ unicodeslot=0x1F5C5,
},
- [0x1F4C2]={
+ [0x1F5C6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4C2,
+ unicodeslot=0x1F5C6,
},
- [0x1F4C3]={
+ [0x1F5C7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4C3,
+ unicodeslot=0x1F5C7,
},
- [0x1F4C4]={
+ [0x1F5C8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4C4,
+ unicodeslot=0x1F5C8,
},
- [0x1F4C5]={
+ [0x1F5C9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4C5,
+ unicodeslot=0x1F5C9,
},
- [0x1F4C6]={
+ [0x1F5CA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4C6,
+ unicodeslot=0x1F5CA,
},
- [0x1F4C7]={
+ [0x1F5CB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4C7,
+ unicodeslot=0x1F5CB,
},
- [0x1F4C8]={
+ [0x1F5CC]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4C8,
+ unicodeslot=0x1F5CC,
},
- [0x1F4C9]={
+ [0x1F5CD]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4C9,
+ unicodeslot=0x1F5CD,
},
- [0x1F4CA]={
+ [0x1F5CE]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4CA,
+ unicodeslot=0x1F5CE,
},
- [0x1F4CB]={
+ [0x1F5CF]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4CB,
+ unicodeslot=0x1F5CF,
},
- [0x1F4CC]={
+ [0x1F5D0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4CC,
+ unicodeslot=0x1F5D0,
},
- [0x1F4CD]={
+ [0x1F5D1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4CD,
+ unicodeslot=0x1F5D1,
},
- [0x1F4CE]={
+ [0x1F5D2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4CE,
+ unicodeslot=0x1F5D2,
},
- [0x1F4CF]={
+ [0x1F5D3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4CF,
+ unicodeslot=0x1F5D3,
},
- [0x1F4D0]={
+ [0x1F5D4]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F4D0,
+ linebreak="al",
+ unicodeslot=0x1F5D4,
},
- [0x1F4D1]={
+ [0x1F5D5]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F4D1,
+ linebreak="al",
+ unicodeslot=0x1F5D5,
},
- [0x1F4D2]={
+ [0x1F5D6]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F4D2,
+ linebreak="al",
+ unicodeslot=0x1F5D6,
},
- [0x1F4D3]={
+ [0x1F5D7]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F4D3,
+ linebreak="al",
+ unicodeslot=0x1F5D7,
},
- [0x1F4D4]={
+ [0x1F5D8]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F4D4,
+ linebreak="al",
+ unicodeslot=0x1F5D8,
},
- [0x1F4D5]={
+ [0x1F5D9]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F4D5,
+ linebreak="al",
+ unicodeslot=0x1F5D9,
},
- [0x1F4D6]={
+ [0x1F5DA]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F4D6,
+ linebreak="al",
+ unicodeslot=0x1F5DA,
},
- [0x1F4D7]={
+ [0x1F5DB]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F4D7,
+ linebreak="al",
+ unicodeslot=0x1F5DB,
},
- [0x1F4D8]={
+ [0x1F5DC]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4D8,
+ unicodeslot=0x1F5DC,
},
- [0x1F4D9]={
+ [0x1F5DD]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4D9,
+ unicodeslot=0x1F5DD,
},
- [0x1F4DA]={
+ [0x1F5DE]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4DA,
+ unicodeslot=0x1F5DE,
},
- [0x1F4DB]={
+ [0x1F5DF]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4DB,
+ unicodeslot=0x1F5DF,
},
- [0x1F4DC]={
+ [0x1F5E0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4DC,
+ unicodeslot=0x1F5E0,
},
- [0x1F4DD]={
+ [0x1F5E1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4DD,
+ unicodeslot=0x1F5E1,
},
- [0x1F4DE]={
+ [0x1F5E2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4DE,
+ unicodeslot=0x1F5E2,
},
- [0x1F4DF]={
+ [0x1F5E3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4DF,
+ unicodeslot=0x1F5E3,
},
- [0x1F4E0]={
+ [0x1F5E4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4E0,
+ unicodeslot=0x1F5E4,
},
- [0x1F4E1]={
+ [0x1F5E5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4E1,
+ unicodeslot=0x1F5E5,
},
- [0x1F4E2]={
+ [0x1F5E6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4E2,
+ unicodeslot=0x1F5E6,
},
- [0x1F4E3]={
+ [0x1F5E7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4E3,
+ unicodeslot=0x1F5E7,
},
- [0x1F4E4]={
+ [0x1F5E8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4E4,
+ unicodeslot=0x1F5E8,
},
- [0x1F4E5]={
+ [0x1F5E9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4E5,
+ unicodeslot=0x1F5E9,
},
- [0x1F4E6]={
+ [0x1F5EA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4E6,
+ unicodeslot=0x1F5EA,
},
- [0x1F4E7]={
+ [0x1F5EB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4E7,
+ unicodeslot=0x1F5EB,
},
- [0x1F4E8]={
+ [0x1F5EC]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4E8,
+ unicodeslot=0x1F5EC,
},
- [0x1F4E9]={
+ [0x1F5ED]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4E9,
+ unicodeslot=0x1F5ED,
},
- [0x1F4EA]={
+ [0x1F5EE]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4EA,
+ unicodeslot=0x1F5EE,
},
- [0x1F4EB]={
+ [0x1F5EF]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4EB,
+ unicodeslot=0x1F5EF,
},
- [0x1F4EC]={
+ [0x1F5F0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4EC,
+ unicodeslot=0x1F5F0,
},
- [0x1F4ED]={
+ [0x1F5F1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4ED,
+ unicodeslot=0x1F5F1,
},
- [0x1F4EE]={
+ [0x1F5F2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4EE,
+ unicodeslot=0x1F5F2,
},
- [0x1F4EF]={
+ [0x1F5F3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4EF,
+ unicodeslot=0x1F5F3,
},
- [0x1F4F0]={
+ [0x1F5F4]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F4F0,
+ linebreak="al",
+ unicodeslot=0x1F5F4,
},
- [0x1F4F1]={
+ [0x1F5F5]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F4F1,
+ linebreak="al",
+ unicodeslot=0x1F5F5,
},
- [0x1F4F2]={
+ [0x1F5F6]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F4F2,
+ linebreak="al",
+ unicodeslot=0x1F5F6,
},
- [0x1F4F3]={
+ [0x1F5F7]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F4F3,
+ linebreak="al",
+ unicodeslot=0x1F5F7,
},
- [0x1F4F4]={
+ [0x1F5F8]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F4F4,
+ linebreak="al",
+ unicodeslot=0x1F5F8,
},
- [0x1F4F5]={
+ [0x1F5F9]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F4F5,
+ linebreak="al",
+ unicodeslot=0x1F5F9,
},
- [0x1F4F6]={
+ [0x1F5FA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4F6,
+ unicodeslot=0x1F5FA,
},
- [0x1F4F7]={
+ [0x1F5FB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4F7,
+ unicodeslot=0x1F5FB,
},
- [0x1F4F8]={
+ [0x1F5FC]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4F8,
+ unicodeslot=0x1F5FC,
},
- [0x1F4F9]={
+ [0x1F5FD]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4F9,
+ unicodeslot=0x1F5FD,
},
- [0x1F4FA]={
+ [0x1F5FE]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4FA,
+ unicodeslot=0x1F5FE,
},
- [0x1F4FB]={
+ [0x1F5FF]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4FB,
+ unicodeslot=0x1F5FF,
},
- [0x1F4FC]={
+ [0x1F600]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4FC,
+ unicodeslot=0x1F600,
},
- [0x1F4FD]={
+ [0x1F601]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4FD,
+ unicodeslot=0x1F601,
},
- [0x1F4FE]={
+ [0x1F602]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4FE,
+ unicodeslot=0x1F602,
},
- [0x1F4FF]={
+ [0x1F603]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F4FF,
+ unicodeslot=0x1F603,
},
- [0x1F500]={
+ [0x1F604]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F500,
+ linebreak="id",
+ unicodeslot=0x1F604,
},
- [0x1F501]={
+ [0x1F605]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F501,
+ linebreak="id",
+ unicodeslot=0x1F605,
},
- [0x1F502]={
+ [0x1F606]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F502,
+ linebreak="id",
+ unicodeslot=0x1F606,
},
- [0x1F503]={
+ [0x1F607]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F503,
+ linebreak="id",
+ unicodeslot=0x1F607,
},
- [0x1F504]={
+ [0x1F608]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F504,
+ linebreak="id",
+ unicodeslot=0x1F608,
},
- [0x1F505]={
+ [0x1F609]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F505,
+ linebreak="id",
+ unicodeslot=0x1F609,
},
- [0x1F506]={
+ [0x1F60A]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F506,
+ linebreak="id",
+ unicodeslot=0x1F60A,
},
- [0x1F507]={
+ [0x1F60B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F507,
+ unicodeslot=0x1F60B,
},
- [0x1F508]={
+ [0x1F60C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F508,
+ unicodeslot=0x1F60C,
},
- [0x1F509]={
+ [0x1F60D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F509,
+ unicodeslot=0x1F60D,
},
- [0x1F50A]={
+ [0x1F60E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F50A,
+ unicodeslot=0x1F60E,
},
- [0x1F50B]={
+ [0x1F60F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F50B,
+ unicodeslot=0x1F60F,
},
- [0x1F50C]={
+ [0x1F610]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F50C,
+ unicodeslot=0x1F610,
},
- [0x1F50D]={
+ [0x1F611]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F50D,
+ unicodeslot=0x1F611,
},
- [0x1F50E]={
+ [0x1F612]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F50E,
+ unicodeslot=0x1F612,
},
- [0x1F50F]={
+ [0x1F613]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F50F,
+ unicodeslot=0x1F613,
},
- [0x1F510]={
+ [0x1F614]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F510,
+ unicodeslot=0x1F614,
},
- [0x1F511]={
+ [0x1F615]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F511,
+ unicodeslot=0x1F615,
},
- [0x1F512]={
+ [0x1F616]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F512,
+ unicodeslot=0x1F616,
},
- [0x1F513]={
+ [0x1F617]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F513,
+ unicodeslot=0x1F617,
},
- [0x1F514]={
+ [0x1F618]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F514,
+ unicodeslot=0x1F618,
},
- [0x1F515]={
+ [0x1F619]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F515,
+ unicodeslot=0x1F619,
},
- [0x1F516]={
+ [0x1F61A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F516,
+ unicodeslot=0x1F61A,
},
- [0x1F517]={
+ [0x1F61B]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F517,
+ linebreak="id",
+ unicodeslot=0x1F61B,
},
- [0x1F518]={
+ [0x1F61C]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F518,
+ linebreak="id",
+ unicodeslot=0x1F61C,
},
- [0x1F519]={
+ [0x1F61D]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F519,
+ linebreak="id",
+ unicodeslot=0x1F61D,
},
- [0x1F51A]={
+ [0x1F61E]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F51A,
+ linebreak="id",
+ unicodeslot=0x1F61E,
},
- [0x1F51B]={
+ [0x1F61F]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F51B,
+ linebreak="id",
+ unicodeslot=0x1F61F,
},
- [0x1F51C]={
+ [0x1F620]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F51C,
+ linebreak="id",
+ unicodeslot=0x1F620,
},
- [0x1F51D]={
+ [0x1F621]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F51D,
+ linebreak="id",
+ unicodeslot=0x1F621,
},
- [0x1F51E]={
+ [0x1F622]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F51E,
+ linebreak="id",
+ unicodeslot=0x1F622,
},
- [0x1F51F]={
+ [0x1F623]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F51F,
+ linebreak="id",
+ unicodeslot=0x1F623,
},
- [0x1F520]={
+ [0x1F624]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F520,
+ linebreak="id",
+ unicodeslot=0x1F624,
},
- [0x1F521]={
+ [0x1F625]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F521,
+ linebreak="id",
+ unicodeslot=0x1F625,
},
- [0x1F522]={
+ [0x1F626]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F522,
+ linebreak="id",
+ unicodeslot=0x1F626,
},
- [0x1F523]={
+ [0x1F627]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F523,
+ linebreak="id",
+ unicodeslot=0x1F627,
},
- [0x1F524]={
+ [0x1F628]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F524,
+ linebreak="id",
+ unicodeslot=0x1F628,
},
- [0x1F525]={
+ [0x1F629]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F525,
+ unicodeslot=0x1F629,
},
- [0x1F526]={
+ [0x1F62A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F526,
+ unicodeslot=0x1F62A,
},
- [0x1F527]={
+ [0x1F62B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F527,
+ unicodeslot=0x1F62B,
},
- [0x1F528]={
+ [0x1F62C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F528,
+ unicodeslot=0x1F62C,
},
- [0x1F529]={
+ [0x1F62D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F529,
+ unicodeslot=0x1F62D,
},
- [0x1F52A]={
+ [0x1F62E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F52A,
+ unicodeslot=0x1F62E,
},
- [0x1F52B]={
+ [0x1F62F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F52B,
+ unicodeslot=0x1F62F,
},
- [0x1F52C]={
+ [0x1F630]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F52C,
+ unicodeslot=0x1F630,
},
- [0x1F52D]={
+ [0x1F631]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F52D,
+ unicodeslot=0x1F631,
},
- [0x1F52E]={
+ [0x1F632]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F52E,
+ unicodeslot=0x1F632,
},
- [0x1F52F]={
+ [0x1F633]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F52F,
+ unicodeslot=0x1F633,
},
- [0x1F530]={
+ [0x1F634]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F530,
+ unicodeslot=0x1F634,
},
- [0x1F531]={
+ [0x1F635]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F531,
+ unicodeslot=0x1F635,
},
- [0x1F532]={
+ [0x1F636]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F532,
+ linebreak="id",
+ unicodeslot=0x1F636,
},
- [0x1F533]={
+ [0x1F637]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F533,
+ linebreak="id",
+ unicodeslot=0x1F637,
},
- [0x1F534]={
+ [0x1F638]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F534,
+ linebreak="id",
+ unicodeslot=0x1F638,
},
- [0x1F535]={
+ [0x1F639]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F535,
+ linebreak="id",
+ unicodeslot=0x1F639,
},
- [0x1F536]={
+ [0x1F63A]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F536,
+ linebreak="id",
+ unicodeslot=0x1F63A,
},
- [0x1F537]={
+ [0x1F63B]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F537,
+ linebreak="id",
+ unicodeslot=0x1F63B,
},
- [0x1F538]={
+ [0x1F63C]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F538,
+ linebreak="id",
+ unicodeslot=0x1F63C,
},
- [0x1F539]={
+ [0x1F63D]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F539,
+ linebreak="id",
+ unicodeslot=0x1F63D,
},
- [0x1F53A]={
+ [0x1F63E]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F53A,
+ linebreak="id",
+ unicodeslot=0x1F63E,
},
- [0x1F53B]={
+ [0x1F63F]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F53B,
+ linebreak="id",
+ unicodeslot=0x1F63F,
},
- [0x1F53C]={
+ [0x1F640]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F53C,
+ linebreak="id",
+ unicodeslot=0x1F640,
},
- [0x1F53D]={
+ [0x1F641]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F53D,
+ linebreak="id",
+ unicodeslot=0x1F641,
},
- [0x1F53E]={
+ [0x1F642]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F53E,
+ linebreak="id",
+ unicodeslot=0x1F642,
},
- [0x1F53F]={
+ [0x1F643]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F53F,
+ linebreak="id",
+ unicodeslot=0x1F643,
},
- [0x1F540]={
+ [0x1F644]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F540,
+ linebreak="id",
+ unicodeslot=0x1F644,
},
- [0x1F541]={
+ [0x1F645]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F541,
+ linebreak="eb",
+ unicodeslot=0x1F645,
},
- [0x1F542]={
+ [0x1F646]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F542,
+ linebreak="eb",
+ unicodeslot=0x1F646,
},
- [0x1F543]={
+ [0x1F647]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F543,
+ linebreak="eb",
+ unicodeslot=0x1F647,
},
- [0x1F544]={
+ [0x1F648]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F544,
+ linebreak="id",
+ unicodeslot=0x1F648,
},
- [0x1F545]={
+ [0x1F649]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F545,
+ linebreak="id",
+ unicodeslot=0x1F649,
},
- [0x1F546]={
+ [0x1F64A]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F546,
+ linebreak="id",
+ unicodeslot=0x1F64A,
},
- [0x1F547]={
+ [0x1F64B]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F547,
+ linebreak="eb",
+ unicodeslot=0x1F64B,
},
- [0x1F548]={
+ [0x1F64C]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F548,
+ linebreak="eb",
+ unicodeslot=0x1F64C,
},
- [0x1F549]={
+ [0x1F64D]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F549,
+ linebreak="eb",
+ unicodeslot=0x1F64D,
},
- [0x1F54A]={
+ [0x1F64E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F54A,
+ linebreak="eb",
+ unicodeslot=0x1F64E,
},
- [0x1F54B]={
+ [0x1F64F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F54B,
+ linebreak="eb",
+ unicodeslot=0x1F64F,
},
- [0x1F54C]={
+ [0x1F650]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F54C,
+ linebreak="al",
+ unicodeslot=0x1F650,
},
- [0x1F54D]={
+ [0x1F651]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F54D,
+ linebreak="al",
+ unicodeslot=0x1F651,
},
- [0x1F54E]={
+ [0x1F652]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F54E,
+ linebreak="al",
+ unicodeslot=0x1F652,
},
- [0x1F54F]={
+ [0x1F653]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F54F,
+ linebreak="al",
+ unicodeslot=0x1F653,
},
- [0x1F550]={
+ [0x1F654]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F550,
+ linebreak="al",
+ unicodeslot=0x1F654,
},
- [0x1F551]={
+ [0x1F655]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F551,
+ linebreak="al",
+ unicodeslot=0x1F655,
},
- [0x1F552]={
+ [0x1F656]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F552,
+ linebreak="al",
+ unicodeslot=0x1F656,
},
- [0x1F553]={
+ [0x1F657]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F553,
+ linebreak="al",
+ unicodeslot=0x1F657,
},
- [0x1F554]={
+ [0x1F658]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F554,
+ linebreak="al",
+ unicodeslot=0x1F658,
},
- [0x1F555]={
+ [0x1F659]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F555,
+ linebreak="al",
+ unicodeslot=0x1F659,
},
- [0x1F556]={
+ [0x1F65A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F556,
+ linebreak="al",
+ unicodeslot=0x1F65A,
},
- [0x1F557]={
+ [0x1F65B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F557,
+ linebreak="al",
+ unicodeslot=0x1F65B,
},
- [0x1F558]={
+ [0x1F65C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F558,
+ linebreak="al",
+ unicodeslot=0x1F65C,
},
- [0x1F559]={
+ [0x1F65D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F559,
+ linebreak="al",
+ unicodeslot=0x1F65D,
},
- [0x1F55A]={
+ [0x1F65E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F55A,
+ linebreak="al",
+ unicodeslot=0x1F65E,
},
- [0x1F55B]={
+ [0x1F65F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F55B,
+ linebreak="al",
+ unicodeslot=0x1F65F,
},
- [0x1F55C]={
+ [0x1F660]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F55C,
+ linebreak="al",
+ unicodeslot=0x1F660,
},
- [0x1F55D]={
+ [0x1F661]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F55D,
+ linebreak="al",
+ unicodeslot=0x1F661,
},
- [0x1F55E]={
+ [0x1F662]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F55E,
+ linebreak="al",
+ unicodeslot=0x1F662,
},
- [0x1F55F]={
+ [0x1F663]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F55F,
+ linebreak="al",
+ unicodeslot=0x1F663,
},
- [0x1F560]={
+ [0x1F664]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F560,
+ linebreak="al",
+ unicodeslot=0x1F664,
},
- [0x1F561]={
+ [0x1F665]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F561,
+ linebreak="al",
+ unicodeslot=0x1F665,
},
- [0x1F562]={
+ [0x1F666]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F562,
+ linebreak="al",
+ unicodeslot=0x1F666,
},
- [0x1F563]={
+ [0x1F667]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F563,
+ linebreak="al",
+ unicodeslot=0x1F667,
},
- [0x1F564]={
+ [0x1F668]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F564,
+ linebreak="al",
+ unicodeslot=0x1F668,
},
- [0x1F565]={
+ [0x1F669]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F565,
+ linebreak="al",
+ unicodeslot=0x1F669,
},
- [0x1F566]={
+ [0x1F66A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F566,
+ linebreak="al",
+ unicodeslot=0x1F66A,
},
- [0x1F567]={
+ [0x1F66B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F567,
+ linebreak="al",
+ unicodeslot=0x1F66B,
},
- [0x1F568]={
+ [0x1F66C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F568,
+ linebreak="al",
+ unicodeslot=0x1F66C,
},
- [0x1F569]={
+ [0x1F66D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F569,
+ linebreak="al",
+ unicodeslot=0x1F66D,
},
- [0x1F56A]={
+ [0x1F66E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F56A,
+ linebreak="al",
+ unicodeslot=0x1F66E,
},
- [0x1F56B]={
+ [0x1F66F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F56B,
+ linebreak="al",
+ unicodeslot=0x1F66F,
},
- [0x1F56C]={
+ [0x1F670]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F56C,
+ linebreak="al",
+ unicodeslot=0x1F670,
},
- [0x1F56D]={
+ [0x1F671]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F56D,
+ linebreak="al",
+ unicodeslot=0x1F671,
},
- [0x1F56E]={
+ [0x1F672]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F56E,
+ linebreak="al",
+ unicodeslot=0x1F672,
},
- [0x1F56F]={
+ [0x1F673]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F56F,
+ linebreak="al",
+ unicodeslot=0x1F673,
},
- [0x1F570]={
+ [0x1F674]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F570,
+ linebreak="al",
+ unicodeslot=0x1F674,
},
- [0x1F571]={
+ [0x1F675]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F571,
+ linebreak="al",
+ unicodeslot=0x1F675,
},
- [0x1F572]={
+ [0x1F676]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F572,
+ linebreak="qu",
+ unicodeslot=0x1F676,
},
- [0x1F573]={
+ [0x1F677]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F573,
+ linebreak="qu",
+ unicodeslot=0x1F677,
},
- [0x1F574]={
+ [0x1F678]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F574,
+ linebreak="qu",
+ unicodeslot=0x1F678,
},
- [0x1F575]={
+ [0x1F679]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F575,
+ linebreak="ns",
+ unicodeslot=0x1F679,
},
- [0x1F576]={
+ [0x1F67A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F576,
+ linebreak="ns",
+ unicodeslot=0x1F67A,
},
- [0x1F577]={
+ [0x1F67B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F577,
+ linebreak="ns",
+ unicodeslot=0x1F67B,
},
- [0x1F578]={
+ [0x1F67C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F578,
+ linebreak="al",
+ unicodeslot=0x1F67C,
},
- [0x1F579]={
+ [0x1F67D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F579,
+ linebreak="al",
+ unicodeslot=0x1F67D,
},
- [0x1F57A]={
+ [0x1F67E]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F57A,
+ linebreak="al",
+ unicodeslot=0x1F67E,
},
- [0x1F57B]={
+ [0x1F67F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F57B,
+ linebreak="al",
+ unicodeslot=0x1F67F,
},
- [0x1F57C]={
+ [0x1F680]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F57C,
+ unicodeslot=0x1F680,
},
- [0x1F57D]={
+ [0x1F681]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F57D,
+ unicodeslot=0x1F681,
},
- [0x1F57E]={
+ [0x1F682]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F57E,
+ unicodeslot=0x1F682,
},
- [0x1F57F]={
+ [0x1F683]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F57F,
+ unicodeslot=0x1F683,
},
- [0x1F580]={
+ [0x1F684]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F580,
+ unicodeslot=0x1F684,
},
- [0x1F581]={
+ [0x1F685]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F581,
+ unicodeslot=0x1F685,
},
- [0x1F582]={
+ [0x1F686]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F582,
+ unicodeslot=0x1F686,
},
- [0x1F583]={
+ [0x1F687]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F583,
+ unicodeslot=0x1F687,
},
- [0x1F584]={
+ [0x1F688]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F584,
+ unicodeslot=0x1F688,
},
- [0x1F585]={
+ [0x1F689]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F585,
+ unicodeslot=0x1F689,
},
- [0x1F586]={
+ [0x1F68A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F586,
+ unicodeslot=0x1F68A,
},
- [0x1F587]={
+ [0x1F68B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F587,
+ unicodeslot=0x1F68B,
},
- [0x1F588]={
+ [0x1F68C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F588,
+ unicodeslot=0x1F68C,
},
- [0x1F589]={
+ [0x1F68D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F589,
+ unicodeslot=0x1F68D,
},
- [0x1F58A]={
+ [0x1F68E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F58A,
+ unicodeslot=0x1F68E,
},
- [0x1F58B]={
+ [0x1F68F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F58B,
+ unicodeslot=0x1F68F,
},
- [0x1F58C]={
+ [0x1F690]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F58C,
+ unicodeslot=0x1F690,
},
- [0x1F58D]={
+ [0x1F691]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F58D,
+ unicodeslot=0x1F691,
},
- [0x1F58E]={
+ [0x1F692]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F58E,
+ unicodeslot=0x1F692,
},
- [0x1F58F]={
+ [0x1F693]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F58F,
+ unicodeslot=0x1F693,
},
- [0x1F590]={
+ [0x1F694]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F590,
+ linebreak="id",
+ unicodeslot=0x1F694,
},
- [0x1F591]={
+ [0x1F695]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F591,
+ unicodeslot=0x1F695,
},
- [0x1F592]={
+ [0x1F696]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F592,
+ unicodeslot=0x1F696,
},
- [0x1F593]={
+ [0x1F697]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F593,
+ unicodeslot=0x1F697,
},
- [0x1F594]={
+ [0x1F698]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F594,
+ unicodeslot=0x1F698,
},
- [0x1F595]={
+ [0x1F699]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F595,
+ linebreak="id",
+ unicodeslot=0x1F699,
},
- [0x1F596]={
+ [0x1F69A]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F596,
+ linebreak="id",
+ unicodeslot=0x1F69A,
},
- [0x1F597]={
+ [0x1F69B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F597,
+ unicodeslot=0x1F69B,
},
- [0x1F598]={
+ [0x1F69C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F598,
+ unicodeslot=0x1F69C,
},
- [0x1F599]={
+ [0x1F69D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F599,
+ unicodeslot=0x1F69D,
},
- [0x1F59A]={
+ [0x1F69E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F59A,
+ unicodeslot=0x1F69E,
},
- [0x1F59B]={
+ [0x1F69F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F59B,
+ unicodeslot=0x1F69F,
},
- [0x1F59C]={
+ [0x1F6A0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F59C,
+ unicodeslot=0x1F6A0,
},
- [0x1F59D]={
+ [0x1F6A1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F59D,
+ unicodeslot=0x1F6A1,
},
- [0x1F59E]={
+ [0x1F6A2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F59E,
+ unicodeslot=0x1F6A2,
},
- [0x1F59F]={
+ [0x1F6A3]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F59F,
+ linebreak="eb",
+ unicodeslot=0x1F6A3,
},
- [0x1F5A0]={
+ [0x1F6A4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5A0,
+ unicodeslot=0x1F6A4,
},
- [0x1F5A1]={
+ [0x1F6A5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5A1,
+ unicodeslot=0x1F6A5,
},
- [0x1F5A2]={
+ [0x1F6A6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5A2,
+ unicodeslot=0x1F6A6,
},
- [0x1F5A3]={
+ [0x1F6A7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5A3,
+ unicodeslot=0x1F6A7,
},
- [0x1F5A4]={
+ [0x1F6A8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5A4,
+ unicodeslot=0x1F6A8,
},
- [0x1F5A5]={
+ [0x1F6A9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5A5,
+ unicodeslot=0x1F6A9,
},
- [0x1F5A6]={
+ [0x1F6AA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5A6,
+ unicodeslot=0x1F6AA,
},
- [0x1F5A7]={
+ [0x1F6AB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5A7,
+ unicodeslot=0x1F6AB,
},
- [0x1F5A8]={
+ [0x1F6AC]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5A8,
+ unicodeslot=0x1F6AC,
},
- [0x1F5A9]={
+ [0x1F6AD]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5A9,
+ unicodeslot=0x1F6AD,
},
- [0x1F5AA]={
+ [0x1F6AE]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5AA,
+ unicodeslot=0x1F6AE,
},
- [0x1F5AB]={
+ [0x1F6AF]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5AB,
+ unicodeslot=0x1F6AF,
},
- [0x1F5AC]={
+ [0x1F6B0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5AC,
+ unicodeslot=0x1F6B0,
},
- [0x1F5AD]={
+ [0x1F6B1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5AD,
+ unicodeslot=0x1F6B1,
},
- [0x1F5AE]={
+ [0x1F6B2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5AE,
+ unicodeslot=0x1F6B2,
},
- [0x1F5AF]={
+ [0x1F6B3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5AF,
+ unicodeslot=0x1F6B3,
},
- [0x1F5B0]={
+ [0x1F6B4]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5B0,
+ linebreak="eb",
+ unicodeslot=0x1F6B4,
},
- [0x1F5B1]={
+ [0x1F6B5]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5B1,
+ linebreak="eb",
+ unicodeslot=0x1F6B5,
},
- [0x1F5B2]={
+ [0x1F6B6]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5B2,
+ linebreak="eb",
+ unicodeslot=0x1F6B6,
},
- [0x1F5B3]={
+ [0x1F6B7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5B3,
+ unicodeslot=0x1F6B7,
},
- [0x1F5B4]={
+ [0x1F6B8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5B4,
+ unicodeslot=0x1F6B8,
},
- [0x1F5B5]={
+ [0x1F6B9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5B5,
+ unicodeslot=0x1F6B9,
},
- [0x1F5B6]={
+ [0x1F6BA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5B6,
+ unicodeslot=0x1F6BA,
},
- [0x1F5B7]={
+ [0x1F6BB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5B7,
+ unicodeslot=0x1F6BB,
},
- [0x1F5B8]={
+ [0x1F6BC]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5B8,
+ unicodeslot=0x1F6BC,
},
- [0x1F5B9]={
+ [0x1F6BD]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5B9,
+ unicodeslot=0x1F6BD,
},
- [0x1F5BA]={
+ [0x1F6BE]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5BA,
+ unicodeslot=0x1F6BE,
},
- [0x1F5BB]={
+ [0x1F6BF]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5BB,
+ unicodeslot=0x1F6BF,
},
- [0x1F5BC]={
+ [0x1F6C0]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5BC,
+ linebreak="eb",
+ unicodeslot=0x1F6C0,
},
- [0x1F5BD]={
+ [0x1F6C1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5BD,
+ unicodeslot=0x1F6C1,
},
- [0x1F5BE]={
+ [0x1F6C2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5BE,
+ unicodeslot=0x1F6C2,
},
- [0x1F5BF]={
+ [0x1F6C3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5BF,
+ unicodeslot=0x1F6C3,
},
- [0x1F5C0]={
+ [0x1F6C4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5C0,
+ unicodeslot=0x1F6C4,
},
- [0x1F5C1]={
+ [0x1F6C5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5C1,
+ unicodeslot=0x1F6C5,
},
- [0x1F5C2]={
+ [0x1F6C6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5C2,
+ unicodeslot=0x1F6C6,
},
- [0x1F5C3]={
+ [0x1F6C7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5C3,
+ unicodeslot=0x1F6C7,
},
- [0x1F5C4]={
+ [0x1F6C8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5C4,
+ unicodeslot=0x1F6C8,
},
- [0x1F5C5]={
+ [0x1F6C9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5C5,
+ unicodeslot=0x1F6C9,
},
- [0x1F5C6]={
+ [0x1F6CA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5C6,
+ unicodeslot=0x1F6CA,
},
- [0x1F5C7]={
+ [0x1F6CB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5C7,
+ unicodeslot=0x1F6CB,
},
- [0x1F5C8]={
+ [0x1F6CC]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5C8,
+ linebreak="eb",
+ unicodeslot=0x1F6CC,
},
- [0x1F5C9]={
+ [0x1F6CD]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5C9,
+ unicodeslot=0x1F6CD,
},
- [0x1F5CA]={
+ [0x1F6CE]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5CA,
+ unicodeslot=0x1F6CE,
},
- [0x1F5CB]={
+ [0x1F6CF]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5CB,
+ unicodeslot=0x1F6CF,
},
- [0x1F5CC]={
+ [0x1F6D0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5CC,
+ unicodeslot=0x1F6D0,
},
- [0x1F5CD]={
+ [0x1F6D1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5CD,
+ unicodeslot=0x1F6D1,
},
- [0x1F5CE]={
+ [0x1F6D2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5CE,
+ unicodeslot=0x1F6D2,
},
- [0x1F5CF]={
+ [0x1F6D3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5CF,
+ unicodeslot=0x1F6D3,
},
- [0x1F5D0]={
+ [0x1F6D4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5D0,
+ unicodeslot=0x1F6D4,
},
- [0x1F5D1]={
+ [0x1F6D5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5D1,
+ unicodeslot=0x1F6D5,
},
- [0x1F5D2]={
+ [0x1F6D6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5D2,
+ unicodeslot=0x1F6D6,
},
- [0x1F5D3]={
+ [0x1F6D7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5D3,
+ unicodeslot=0x1F6D7,
},
- [0x1F5D4]={
+ [0x1F6E0]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F5D4,
+ linebreak="id",
+ unicodeslot=0x1F6E0,
},
- [0x1F5D5]={
+ [0x1F6E1]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F5D5,
+ linebreak="id",
+ unicodeslot=0x1F6E1,
},
- [0x1F5D6]={
+ [0x1F6E2]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F5D6,
+ linebreak="id",
+ unicodeslot=0x1F6E2,
},
- [0x1F5D7]={
+ [0x1F6E3]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F5D7,
+ linebreak="id",
+ unicodeslot=0x1F6E3,
},
- [0x1F5D8]={
+ [0x1F6E4]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F5D8,
+ linebreak="id",
+ unicodeslot=0x1F6E4,
},
- [0x1F5D9]={
+ [0x1F6E5]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F5D9,
+ linebreak="id",
+ unicodeslot=0x1F6E5,
},
- [0x1F5DA]={
+ [0x1F6E6]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F5DA,
+ linebreak="id",
+ unicodeslot=0x1F6E6,
},
- [0x1F5DB]={
+ [0x1F6E7]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F5DB,
+ linebreak="id",
+ unicodeslot=0x1F6E7,
},
- [0x1F5DC]={
+ [0x1F6E8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5DC,
+ unicodeslot=0x1F6E8,
},
- [0x1F5DD]={
+ [0x1F6E9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5DD,
+ unicodeslot=0x1F6E9,
},
- [0x1F5DE]={
+ [0x1F6EA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5DE,
+ unicodeslot=0x1F6EA,
},
- [0x1F5DF]={
+ [0x1F6EB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5DF,
+ unicodeslot=0x1F6EB,
},
- [0x1F5E0]={
+ [0x1F6EC]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5E0,
+ unicodeslot=0x1F6EC,
},
- [0x1F5E1]={
+ [0x1F6F0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5E1,
+ unicodeslot=0x1F6F0,
},
- [0x1F5E2]={
+ [0x1F6F1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5E2,
+ unicodeslot=0x1F6F1,
},
- [0x1F5E3]={
+ [0x1F6F2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5E3,
+ unicodeslot=0x1F6F2,
},
- [0x1F5E4]={
+ [0x1F6F3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5E4,
+ unicodeslot=0x1F6F3,
},
- [0x1F5E5]={
+ [0x1F6F4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5E5,
+ unicodeslot=0x1F6F4,
},
- [0x1F5E6]={
+ [0x1F6F5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5E6,
+ unicodeslot=0x1F6F5,
},
- [0x1F5E7]={
+ [0x1F6F6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5E7,
+ unicodeslot=0x1F6F6,
},
- [0x1F5E8]={
+ [0x1F6F7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5E8,
+ unicodeslot=0x1F6F7,
},
- [0x1F5E9]={
+ [0x1F6F8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5E9,
+ unicodeslot=0x1F6F8,
},
- [0x1F5EA]={
+ [0x1F6F9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5EA,
+ unicodeslot=0x1F6F9,
},
- [0x1F5EB]={
+ [0x1F6FA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5EB,
+ unicodeslot=0x1F6FA,
},
- [0x1F5EC]={
+ [0x1F6FB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5EC,
+ unicodeslot=0x1F6FB,
},
- [0x1F5ED]={
+ [0x1F6FC]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F5ED,
+ unicodeslot=0x1F6FC,
},
- [0x1F5EE]={
+ [0x1F700]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5EE,
+ linebreak="al",
+ unicodeslot=0x1F700,
},
- [0x1F5EF]={
+ [0x1F701]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5EF,
+ linebreak="al",
+ unicodeslot=0x1F701,
},
- [0x1F5F0]={
+ [0x1F702]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5F0,
+ linebreak="al",
+ unicodeslot=0x1F702,
},
- [0x1F5F1]={
+ [0x1F703]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5F1,
+ linebreak="al",
+ unicodeslot=0x1F703,
},
- [0x1F5F2]={
+ [0x1F704]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5F2,
+ linebreak="al",
+ unicodeslot=0x1F704,
},
- [0x1F5F3]={
+ [0x1F705]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5F3,
+ linebreak="al",
+ unicodeslot=0x1F705,
},
- [0x1F5F4]={
+ [0x1F706]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F5F4,
+ unicodeslot=0x1F706,
},
- [0x1F5F5]={
+ [0x1F707]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F5F5,
+ unicodeslot=0x1F707,
},
- [0x1F5F6]={
+ [0x1F708]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F5F6,
+ unicodeslot=0x1F708,
},
- [0x1F5F7]={
+ [0x1F709]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F5F7,
+ unicodeslot=0x1F709,
},
- [0x1F5F8]={
+ [0x1F70A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F5F8,
+ unicodeslot=0x1F70A,
},
- [0x1F5F9]={
+ [0x1F70B]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F5F9,
+ unicodeslot=0x1F70B,
},
- [0x1F5FA]={
+ [0x1F70C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5FA,
+ linebreak="al",
+ unicodeslot=0x1F70C,
},
- [0x1F5FB]={
+ [0x1F70D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5FB,
+ linebreak="al",
+ unicodeslot=0x1F70D,
},
- [0x1F5FC]={
+ [0x1F70E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5FC,
+ linebreak="al",
+ unicodeslot=0x1F70E,
},
- [0x1F5FD]={
+ [0x1F70F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5FD,
+ linebreak="al",
+ unicodeslot=0x1F70F,
},
- [0x1F5FE]={
+ [0x1F710]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5FE,
+ linebreak="al",
+ unicodeslot=0x1F710,
},
- [0x1F5FF]={
+ [0x1F711]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F5FF,
+ linebreak="al",
+ unicodeslot=0x1F711,
},
- [0x1F600]={
+ [0x1F712]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F600,
+ linebreak="al",
+ unicodeslot=0x1F712,
},
- [0x1F601]={
+ [0x1F713]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F601,
+ linebreak="al",
+ unicodeslot=0x1F713,
},
- [0x1F602]={
+ [0x1F714]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F602,
+ linebreak="al",
+ unicodeslot=0x1F714,
},
- [0x1F603]={
+ [0x1F715]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F603,
+ linebreak="al",
+ unicodeslot=0x1F715,
},
- [0x1F604]={
+ [0x1F716]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F604,
+ linebreak="al",
+ unicodeslot=0x1F716,
},
- [0x1F605]={
+ [0x1F717]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F605,
+ linebreak="al",
+ unicodeslot=0x1F717,
},
- [0x1F606]={
+ [0x1F718]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F606,
+ linebreak="al",
+ unicodeslot=0x1F718,
},
- [0x1F607]={
+ [0x1F719]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F607,
+ linebreak="al",
+ unicodeslot=0x1F719,
},
- [0x1F608]={
+ [0x1F71A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F608,
+ linebreak="al",
+ unicodeslot=0x1F71A,
},
- [0x1F609]={
+ [0x1F71B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F609,
+ linebreak="al",
+ unicodeslot=0x1F71B,
},
- [0x1F60A]={
+ [0x1F71C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F60A,
+ linebreak="al",
+ unicodeslot=0x1F71C,
},
- [0x1F60B]={
+ [0x1F71D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F60B,
+ linebreak="al",
+ unicodeslot=0x1F71D,
},
- [0x1F60C]={
+ [0x1F71E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F60C,
+ linebreak="al",
+ unicodeslot=0x1F71E,
},
- [0x1F60D]={
+ [0x1F71F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F60D,
+ linebreak="al",
+ unicodeslot=0x1F71F,
},
- [0x1F60E]={
+ [0x1F720]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F60E,
+ linebreak="al",
+ unicodeslot=0x1F720,
},
- [0x1F60F]={
+ [0x1F721]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F60F,
+ linebreak="al",
+ unicodeslot=0x1F721,
},
- [0x1F610]={
+ [0x1F722]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F610,
+ linebreak="al",
+ unicodeslot=0x1F722,
},
- [0x1F611]={
+ [0x1F723]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F611,
+ linebreak="al",
+ unicodeslot=0x1F723,
},
- [0x1F612]={
+ [0x1F724]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F612,
+ linebreak="al",
+ unicodeslot=0x1F724,
},
- [0x1F613]={
+ [0x1F725]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F613,
+ linebreak="al",
+ unicodeslot=0x1F725,
},
- [0x1F614]={
+ [0x1F726]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F614,
+ linebreak="al",
+ unicodeslot=0x1F726,
},
- [0x1F615]={
+ [0x1F727]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F615,
+ linebreak="al",
+ unicodeslot=0x1F727,
},
- [0x1F616]={
+ [0x1F728]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F616,
+ linebreak="al",
+ unicodeslot=0x1F728,
},
- [0x1F617]={
+ [0x1F729]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F617,
+ linebreak="al",
+ unicodeslot=0x1F729,
},
- [0x1F618]={
+ [0x1F72A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F618,
+ linebreak="al",
+ unicodeslot=0x1F72A,
},
- [0x1F619]={
+ [0x1F72B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F619,
+ linebreak="al",
+ unicodeslot=0x1F72B,
},
- [0x1F61A]={
+ [0x1F72C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F61A,
+ linebreak="al",
+ unicodeslot=0x1F72C,
},
- [0x1F61B]={
+ [0x1F72D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F61B,
+ linebreak="al",
+ unicodeslot=0x1F72D,
},
- [0x1F61C]={
+ [0x1F72E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F61C,
+ linebreak="al",
+ unicodeslot=0x1F72E,
},
- [0x1F61D]={
+ [0x1F72F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F61D,
+ linebreak="al",
+ unicodeslot=0x1F72F,
},
- [0x1F61E]={
+ [0x1F730]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F61E,
+ linebreak="al",
+ unicodeslot=0x1F730,
},
- [0x1F61F]={
+ [0x1F731]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F61F,
+ linebreak="al",
+ unicodeslot=0x1F731,
},
- [0x1F620]={
+ [0x1F732]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F620,
+ linebreak="al",
+ unicodeslot=0x1F732,
},
- [0x1F621]={
+ [0x1F733]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F621,
+ linebreak="al",
+ unicodeslot=0x1F733,
},
- [0x1F622]={
+ [0x1F734]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F622,
+ linebreak="al",
+ unicodeslot=0x1F734,
},
- [0x1F623]={
+ [0x1F735]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F623,
+ linebreak="al",
+ unicodeslot=0x1F735,
},
- [0x1F624]={
+ [0x1F736]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F624,
+ linebreak="al",
+ unicodeslot=0x1F736,
},
- [0x1F625]={
+ [0x1F737]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F625,
+ linebreak="al",
+ unicodeslot=0x1F737,
},
- [0x1F626]={
+ [0x1F738]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F626,
+ linebreak="al",
+ unicodeslot=0x1F738,
},
- [0x1F627]={
+ [0x1F739]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F627,
+ linebreak="al",
+ unicodeslot=0x1F739,
},
- [0x1F628]={
+ [0x1F73A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F628,
+ linebreak="al",
+ unicodeslot=0x1F73A,
},
- [0x1F629]={
+ [0x1F73B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F629,
+ linebreak="al",
+ unicodeslot=0x1F73B,
},
- [0x1F62A]={
+ [0x1F73C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F62A,
+ linebreak="al",
+ unicodeslot=0x1F73C,
},
- [0x1F62B]={
+ [0x1F73D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F62B,
+ linebreak="al",
+ unicodeslot=0x1F73D,
},
- [0x1F62C]={
+ [0x1F73E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F62C,
+ linebreak="al",
+ unicodeslot=0x1F73E,
},
- [0x1F62D]={
+ [0x1F73F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F62D,
+ linebreak="al",
+ unicodeslot=0x1F73F,
},
- [0x1F62E]={
+ [0x1F740]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F62E,
+ linebreak="al",
+ unicodeslot=0x1F740,
},
- [0x1F62F]={
+ [0x1F741]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F62F,
+ linebreak="al",
+ unicodeslot=0x1F741,
},
- [0x1F630]={
+ [0x1F742]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F630,
+ linebreak="al",
+ unicodeslot=0x1F742,
},
- [0x1F631]={
+ [0x1F743]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F631,
+ linebreak="al",
+ unicodeslot=0x1F743,
},
- [0x1F632]={
+ [0x1F744]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F632,
+ linebreak="al",
+ unicodeslot=0x1F744,
},
- [0x1F633]={
+ [0x1F745]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F633,
+ linebreak="al",
+ unicodeslot=0x1F745,
},
- [0x1F634]={
+ [0x1F746]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F634,
+ linebreak="al",
+ unicodeslot=0x1F746,
},
- [0x1F635]={
+ [0x1F747]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F635,
+ linebreak="al",
+ unicodeslot=0x1F747,
},
- [0x1F636]={
+ [0x1F748]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F636,
+ linebreak="al",
+ unicodeslot=0x1F748,
},
- [0x1F637]={
+ [0x1F749]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F637,
+ linebreak="al",
+ unicodeslot=0x1F749,
},
- [0x1F638]={
+ [0x1F74A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F638,
+ linebreak="al",
+ unicodeslot=0x1F74A,
},
- [0x1F639]={
+ [0x1F74B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F639,
+ linebreak="al",
+ unicodeslot=0x1F74B,
},
- [0x1F63A]={
+ [0x1F74C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F63A,
+ linebreak="al",
+ unicodeslot=0x1F74C,
},
- [0x1F63B]={
+ [0x1F74D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F63B,
+ linebreak="al",
+ unicodeslot=0x1F74D,
},
- [0x1F63C]={
+ [0x1F74E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F63C,
+ linebreak="al",
+ unicodeslot=0x1F74E,
},
- [0x1F63D]={
+ [0x1F74F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F63D,
+ linebreak="al",
+ unicodeslot=0x1F74F,
},
- [0x1F63E]={
+ [0x1F750]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F63E,
+ linebreak="al",
+ unicodeslot=0x1F750,
},
- [0x1F63F]={
+ [0x1F751]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F63F,
+ linebreak="al",
+ unicodeslot=0x1F751,
},
- [0x1F640]={
+ [0x1F752]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F640,
+ linebreak="al",
+ unicodeslot=0x1F752,
},
- [0x1F641]={
+ [0x1F753]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F641,
+ linebreak="al",
+ unicodeslot=0x1F753,
},
- [0x1F642]={
+ [0x1F754]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F642,
+ linebreak="al",
+ unicodeslot=0x1F754,
},
- [0x1F643]={
+ [0x1F755]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F643,
+ linebreak="al",
+ unicodeslot=0x1F755,
},
- [0x1F644]={
+ [0x1F756]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F644,
+ linebreak="al",
+ unicodeslot=0x1F756,
},
- [0x1F645]={
+ [0x1F757]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F645,
+ linebreak="al",
+ unicodeslot=0x1F757,
},
- [0x1F646]={
+ [0x1F758]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F646,
+ linebreak="al",
+ unicodeslot=0x1F758,
},
- [0x1F647]={
+ [0x1F759]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F647,
+ linebreak="al",
+ unicodeslot=0x1F759,
},
- [0x1F648]={
+ [0x1F75A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F648,
+ linebreak="al",
+ unicodeslot=0x1F75A,
},
- [0x1F649]={
+ [0x1F75B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F649,
+ linebreak="al",
+ unicodeslot=0x1F75B,
},
- [0x1F64A]={
+ [0x1F75C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F64A,
+ linebreak="al",
+ unicodeslot=0x1F75C,
},
- [0x1F64B]={
+ [0x1F75D]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F64B,
+ linebreak="al",
+ unicodeslot=0x1F75D,
},
- [0x1F64C]={
+ [0x1F75E]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F64C,
+ linebreak="al",
+ unicodeslot=0x1F75E,
},
- [0x1F64D]={
+ [0x1F75F]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F64D,
+ linebreak="al",
+ unicodeslot=0x1F75F,
},
- [0x1F64E]={
+ [0x1F760]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F64E,
+ linebreak="al",
+ unicodeslot=0x1F760,
},
- [0x1F64F]={
+ [0x1F761]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F64F,
+ linebreak="al",
+ unicodeslot=0x1F761,
},
- [0x1F650]={
+ [0x1F762]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F650,
+ unicodeslot=0x1F762,
},
- [0x1F651]={
+ [0x1F763]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F651,
+ unicodeslot=0x1F763,
},
- [0x1F652]={
+ [0x1F764]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F652,
+ unicodeslot=0x1F764,
},
- [0x1F653]={
+ [0x1F765]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F653,
+ unicodeslot=0x1F765,
},
- [0x1F654]={
+ [0x1F766]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F654,
+ unicodeslot=0x1F766,
},
- [0x1F655]={
+ [0x1F767]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F655,
+ unicodeslot=0x1F767,
},
- [0x1F656]={
+ [0x1F768]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F656,
+ unicodeslot=0x1F768,
},
- [0x1F657]={
+ [0x1F769]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F657,
+ unicodeslot=0x1F769,
},
- [0x1F658]={
+ [0x1F76A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F658,
+ unicodeslot=0x1F76A,
},
- [0x1F659]={
+ [0x1F76B]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F659,
+ unicodeslot=0x1F76B,
},
- [0x1F65A]={
+ [0x1F76C]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F65A,
+ unicodeslot=0x1F76C,
},
- [0x1F65B]={
+ [0x1F76D]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F65B,
+ unicodeslot=0x1F76D,
},
- [0x1F65C]={
+ [0x1F76E]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F65C,
+ unicodeslot=0x1F76E,
},
- [0x1F65D]={
+ [0x1F76F]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F65D,
+ unicodeslot=0x1F76F,
},
- [0x1F65E]={
+ [0x1F770]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F65E,
+ unicodeslot=0x1F770,
},
- [0x1F65F]={
+ [0x1F771]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F65F,
+ unicodeslot=0x1F771,
},
- [0x1F660]={
+ [0x1F772]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F660,
+ unicodeslot=0x1F772,
},
- [0x1F661]={
+ [0x1F773]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F661,
+ unicodeslot=0x1F773,
},
- [0x1F662]={
+ [0x1F780]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F662,
+ unicodeslot=0x1F780,
},
- [0x1F663]={
+ [0x1F781]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F663,
+ unicodeslot=0x1F781,
},
- [0x1F664]={
+ [0x1F782]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F664,
+ unicodeslot=0x1F782,
},
- [0x1F665]={
+ [0x1F783]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F665,
+ unicodeslot=0x1F783,
},
- [0x1F666]={
+ [0x1F784]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F666,
+ unicodeslot=0x1F784,
},
- [0x1F667]={
+ [0x1F785]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F667,
+ unicodeslot=0x1F785,
},
- [0x1F668]={
+ [0x1F786]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F668,
+ unicodeslot=0x1F786,
},
- [0x1F669]={
+ [0x1F787]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F669,
+ unicodeslot=0x1F787,
},
- [0x1F66A]={
+ [0x1F788]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F66A,
+ unicodeslot=0x1F788,
},
- [0x1F66B]={
+ [0x1F789]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F66B,
+ unicodeslot=0x1F789,
},
- [0x1F66C]={
+ [0x1F78A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F66C,
+ unicodeslot=0x1F78A,
},
- [0x1F66D]={
+ [0x1F78B]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F66D,
+ unicodeslot=0x1F78B,
},
- [0x1F66E]={
+ [0x1F78C]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F66E,
+ unicodeslot=0x1F78C,
},
- [0x1F66F]={
+ [0x1F78D]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F66F,
+ unicodeslot=0x1F78D,
},
- [0x1F670]={
+ [0x1F78E]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F670,
+ unicodeslot=0x1F78E,
},
- [0x1F671]={
+ [0x1F78F]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F671,
+ unicodeslot=0x1F78F,
},
- [0x1F672]={
+ [0x1F790]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F672,
+ unicodeslot=0x1F790,
},
- [0x1F673]={
+ [0x1F791]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F673,
+ unicodeslot=0x1F791,
},
- [0x1F674]={
+ [0x1F792]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F674,
+ unicodeslot=0x1F792,
},
- [0x1F675]={
+ [0x1F793]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F675,
+ unicodeslot=0x1F793,
},
- [0x1F676]={
+ [0x1F794]={
category="so",
direction="on",
- linebreak="qu",
- unicodeslot=0x1F676,
+ linebreak="al",
+ unicodeslot=0x1F794,
},
- [0x1F677]={
+ [0x1F795]={
category="so",
direction="on",
- linebreak="qu",
- unicodeslot=0x1F677,
+ linebreak="al",
+ unicodeslot=0x1F795,
},
- [0x1F678]={
+ [0x1F796]={
category="so",
direction="on",
- linebreak="qu",
- unicodeslot=0x1F678,
+ linebreak="al",
+ unicodeslot=0x1F796,
},
- [0x1F679]={
+ [0x1F797]={
category="so",
direction="on",
- linebreak="ns",
- unicodeslot=0x1F679,
+ linebreak="al",
+ unicodeslot=0x1F797,
},
- [0x1F67A]={
+ [0x1F798]={
category="so",
direction="on",
- linebreak="ns",
- unicodeslot=0x1F67A,
+ linebreak="al",
+ unicodeslot=0x1F798,
},
- [0x1F67B]={
+ [0x1F799]={
category="so",
direction="on",
- linebreak="ns",
- unicodeslot=0x1F67B,
+ linebreak="al",
+ unicodeslot=0x1F799,
},
- [0x1F67C]={
+ [0x1F79A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F67C,
+ unicodeslot=0x1F79A,
},
- [0x1F67D]={
+ [0x1F79B]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F67D,
+ unicodeslot=0x1F79B,
},
- [0x1F67E]={
+ [0x1F79C]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F67E,
+ unicodeslot=0x1F79C,
},
- [0x1F67F]={
+ [0x1F79D]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F67F,
+ unicodeslot=0x1F79D,
},
- [0x1F680]={
+ [0x1F79E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F680,
+ linebreak="al",
+ unicodeslot=0x1F79E,
},
- [0x1F681]={
+ [0x1F79F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F681,
+ linebreak="al",
+ unicodeslot=0x1F79F,
},
- [0x1F682]={
+ [0x1F7A0]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F682,
+ linebreak="al",
+ unicodeslot=0x1F7A0,
},
- [0x1F683]={
+ [0x1F7A1]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F683,
+ linebreak="al",
+ unicodeslot=0x1F7A1,
},
- [0x1F684]={
+ [0x1F7A2]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F684,
+ linebreak="al",
+ unicodeslot=0x1F7A2,
},
- [0x1F685]={
+ [0x1F7A3]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F685,
+ linebreak="al",
+ unicodeslot=0x1F7A3,
},
- [0x1F686]={
+ [0x1F7A4]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F686,
+ linebreak="al",
+ unicodeslot=0x1F7A4,
},
- [0x1F687]={
+ [0x1F7A5]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F687,
+ linebreak="al",
+ unicodeslot=0x1F7A5,
},
- [0x1F688]={
+ [0x1F7A6]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F688,
+ linebreak="al",
+ unicodeslot=0x1F7A6,
},
- [0x1F689]={
+ [0x1F7A7]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F689,
+ linebreak="al",
+ unicodeslot=0x1F7A7,
},
- [0x1F68A]={
+ [0x1F7A8]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F68A,
+ linebreak="al",
+ unicodeslot=0x1F7A8,
},
- [0x1F68B]={
+ [0x1F7A9]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F68B,
+ linebreak="al",
+ unicodeslot=0x1F7A9,
},
- [0x1F68C]={
+ [0x1F7AA]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F68C,
+ linebreak="al",
+ unicodeslot=0x1F7AA,
},
- [0x1F68D]={
+ [0x1F7AB]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F68D,
+ linebreak="al",
+ unicodeslot=0x1F7AB,
},
- [0x1F68E]={
+ [0x1F7AC]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F68E,
+ linebreak="al",
+ unicodeslot=0x1F7AC,
},
- [0x1F68F]={
+ [0x1F7AD]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F68F,
+ linebreak="al",
+ unicodeslot=0x1F7AD,
},
- [0x1F690]={
+ [0x1F7AE]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F690,
+ linebreak="al",
+ unicodeslot=0x1F7AE,
},
- [0x1F691]={
+ [0x1F7AF]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F691,
+ linebreak="al",
+ unicodeslot=0x1F7AF,
},
- [0x1F692]={
+ [0x1F7B0]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F692,
+ linebreak="al",
+ unicodeslot=0x1F7B0,
},
- [0x1F693]={
+ [0x1F7B1]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F693,
+ linebreak="al",
+ unicodeslot=0x1F7B1,
},
- [0x1F694]={
+ [0x1F7B2]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F694,
+ linebreak="al",
+ unicodeslot=0x1F7B2,
},
- [0x1F695]={
+ [0x1F7B3]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F695,
+ linebreak="al",
+ unicodeslot=0x1F7B3,
},
- [0x1F696]={
+ [0x1F7B4]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F696,
+ linebreak="al",
+ unicodeslot=0x1F7B4,
},
- [0x1F697]={
+ [0x1F7B5]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F697,
+ linebreak="al",
+ unicodeslot=0x1F7B5,
},
- [0x1F698]={
+ [0x1F7B6]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F698,
+ linebreak="al",
+ unicodeslot=0x1F7B6,
},
- [0x1F699]={
+ [0x1F7B7]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F699,
+ linebreak="al",
+ unicodeslot=0x1F7B7,
},
- [0x1F69A]={
+ [0x1F7B8]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F69A,
+ linebreak="al",
+ unicodeslot=0x1F7B8,
},
- [0x1F69B]={
+ [0x1F7B9]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F69B,
+ linebreak="al",
+ unicodeslot=0x1F7B9,
},
- [0x1F69C]={
+ [0x1F7BA]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F69C,
+ linebreak="al",
+ unicodeslot=0x1F7BA,
},
- [0x1F69D]={
+ [0x1F7BB]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F69D,
+ linebreak="al",
+ unicodeslot=0x1F7BB,
},
- [0x1F69E]={
+ [0x1F7BC]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F69E,
+ linebreak="al",
+ unicodeslot=0x1F7BC,
},
- [0x1F69F]={
+ [0x1F7BD]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F69F,
+ linebreak="al",
+ unicodeslot=0x1F7BD,
},
- [0x1F6A0]={
+ [0x1F7BE]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6A0,
+ linebreak="al",
+ unicodeslot=0x1F7BE,
},
- [0x1F6A1]={
+ [0x1F7BF]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6A1,
+ linebreak="al",
+ unicodeslot=0x1F7BF,
},
- [0x1F6A2]={
+ [0x1F7C0]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6A2,
+ linebreak="al",
+ unicodeslot=0x1F7C0,
},
- [0x1F6A3]={
+ [0x1F7C1]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F6A3,
+ linebreak="al",
+ unicodeslot=0x1F7C1,
},
- [0x1F6A4]={
+ [0x1F7C2]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6A4,
+ linebreak="al",
+ unicodeslot=0x1F7C2,
},
- [0x1F6A5]={
+ [0x1F7C3]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6A5,
+ linebreak="al",
+ unicodeslot=0x1F7C3,
},
- [0x1F6A6]={
+ [0x1F7C4]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6A6,
+ linebreak="al",
+ unicodeslot=0x1F7C4,
},
- [0x1F6A7]={
+ [0x1F7C5]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6A7,
+ linebreak="al",
+ unicodeslot=0x1F7C5,
},
- [0x1F6A8]={
+ [0x1F7C6]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6A8,
+ linebreak="al",
+ unicodeslot=0x1F7C6,
},
- [0x1F6A9]={
+ [0x1F7C7]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6A9,
+ linebreak="al",
+ unicodeslot=0x1F7C7,
},
- [0x1F6AA]={
+ [0x1F7C8]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6AA,
+ linebreak="al",
+ unicodeslot=0x1F7C8,
},
- [0x1F6AB]={
+ [0x1F7C9]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6AB,
+ linebreak="al",
+ unicodeslot=0x1F7C9,
},
- [0x1F6AC]={
+ [0x1F7CA]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6AC,
+ linebreak="al",
+ unicodeslot=0x1F7CA,
},
- [0x1F6AD]={
+ [0x1F7CB]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6AD,
+ linebreak="al",
+ unicodeslot=0x1F7CB,
},
- [0x1F6AE]={
+ [0x1F7CC]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6AE,
+ linebreak="al",
+ unicodeslot=0x1F7CC,
},
- [0x1F6AF]={
+ [0x1F7CD]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6AF,
+ linebreak="al",
+ unicodeslot=0x1F7CD,
},
- [0x1F6B0]={
+ [0x1F7CE]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6B0,
+ linebreak="al",
+ unicodeslot=0x1F7CE,
},
- [0x1F6B1]={
+ [0x1F7CF]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6B1,
+ linebreak="al",
+ unicodeslot=0x1F7CF,
},
- [0x1F6B2]={
+ [0x1F7D0]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6B2,
+ linebreak="al",
+ unicodeslot=0x1F7D0,
},
- [0x1F6B3]={
+ [0x1F7D1]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6B3,
+ linebreak="al",
+ unicodeslot=0x1F7D1,
},
- [0x1F6B4]={
+ [0x1F7D2]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F6B4,
+ linebreak="al",
+ unicodeslot=0x1F7D2,
},
- [0x1F6B5]={
+ [0x1F7D3]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F6B5,
+ linebreak="al",
+ unicodeslot=0x1F7D3,
},
- [0x1F6B6]={
+ [0x1F7D4]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F6B6,
+ linebreak="al",
+ unicodeslot=0x1F7D4,
},
- [0x1F6B7]={
+ [0x1F7D5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6B7,
+ unicodeslot=0x1F7D5,
},
- [0x1F6B8]={
+ [0x1F7D6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6B8,
+ unicodeslot=0x1F7D6,
},
- [0x1F6B9]={
+ [0x1F7D7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6B9,
+ unicodeslot=0x1F7D7,
},
- [0x1F6BA]={
+ [0x1F7D8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6BA,
+ unicodeslot=0x1F7D8,
},
- [0x1F6BB]={
+ [0x1F7E0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6BB,
+ unicodeslot=0x1F7E0,
},
- [0x1F6BC]={
+ [0x1F7E1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6BC,
+ unicodeslot=0x1F7E1,
},
- [0x1F6BD]={
+ [0x1F7E2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6BD,
+ unicodeslot=0x1F7E2,
},
- [0x1F6BE]={
+ [0x1F7E3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6BE,
+ unicodeslot=0x1F7E3,
},
- [0x1F6BF]={
+ [0x1F7E4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6BF,
- },
- [0x1F6C0]={
- category="so",
- direction="on",
- linebreak="eb",
- unicodeslot=0x1F6C0,
+ unicodeslot=0x1F7E4,
},
- [0x1F6C1]={
+ [0x1F7E5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6C1,
+ unicodeslot=0x1F7E5,
},
- [0x1F6C2]={
+ [0x1F7E6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6C2,
+ unicodeslot=0x1F7E6,
},
- [0x1F6C3]={
+ [0x1F7E7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6C3,
+ unicodeslot=0x1F7E7,
},
- [0x1F6C4]={
+ [0x1F7E8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6C4,
+ unicodeslot=0x1F7E8,
},
- [0x1F6C5]={
+ [0x1F7E9]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6C5,
+ unicodeslot=0x1F7E9,
},
- [0x1F6C6]={
+ [0x1F7EA]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6C6,
+ unicodeslot=0x1F7EA,
},
- [0x1F6C7]={
+ [0x1F7EB]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F6C7,
+ unicodeslot=0x1F7EB,
},
- [0x1F6C8]={
+ [0x1F800]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6C8,
+ linebreak="al",
+ unicodeslot=0x1F800,
},
- [0x1F6C9]={
+ [0x1F801]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6C9,
+ linebreak="al",
+ unicodeslot=0x1F801,
},
- [0x1F6CA]={
+ [0x1F802]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6CA,
+ linebreak="al",
+ unicodeslot=0x1F802,
},
- [0x1F6CB]={
+ [0x1F803]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6CB,
+ linebreak="al",
+ unicodeslot=0x1F803,
},
- [0x1F6CC]={
+ [0x1F804]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F6CC,
+ linebreak="al",
+ unicodeslot=0x1F804,
},
- [0x1F6CD]={
+ [0x1F805]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6CD,
+ linebreak="al",
+ unicodeslot=0x1F805,
},
- [0x1F6CE]={
+ [0x1F806]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6CE,
+ linebreak="al",
+ unicodeslot=0x1F806,
},
- [0x1F6CF]={
+ [0x1F807]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6CF,
+ linebreak="al",
+ unicodeslot=0x1F807,
},
- [0x1F6D0]={
+ [0x1F808]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6D0,
+ linebreak="al",
+ unicodeslot=0x1F808,
},
- [0x1F6D1]={
+ [0x1F809]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6D1,
+ linebreak="al",
+ unicodeslot=0x1F809,
},
- [0x1F6D2]={
+ [0x1F80A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6D2,
+ linebreak="al",
+ unicodeslot=0x1F80A,
},
- [0x1F6D3]={
+ [0x1F80B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6D3,
+ linebreak="al",
+ unicodeslot=0x1F80B,
},
- [0x1F6D4]={
+ [0x1F810]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6D4,
+ linebreak="al",
+ unicodeslot=0x1F810,
},
- [0x1F6D5]={
+ [0x1F811]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6D5,
+ linebreak="al",
+ unicodeslot=0x1F811,
},
- [0x1F6E0]={
+ [0x1F812]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6E0,
+ linebreak="al",
+ unicodeslot=0x1F812,
},
- [0x1F6E1]={
+ [0x1F813]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6E1,
+ linebreak="al",
+ unicodeslot=0x1F813,
},
- [0x1F6E2]={
+ [0x1F814]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6E2,
+ linebreak="al",
+ unicodeslot=0x1F814,
},
- [0x1F6E3]={
+ [0x1F815]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6E3,
+ linebreak="al",
+ unicodeslot=0x1F815,
},
- [0x1F6E4]={
+ [0x1F816]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6E4,
+ linebreak="al",
+ unicodeslot=0x1F816,
},
- [0x1F6E5]={
+ [0x1F817]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6E5,
+ linebreak="al",
+ unicodeslot=0x1F817,
},
- [0x1F6E6]={
+ [0x1F818]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6E6,
+ linebreak="al",
+ unicodeslot=0x1F818,
},
- [0x1F6E7]={
+ [0x1F819]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6E7,
+ linebreak="al",
+ unicodeslot=0x1F819,
},
- [0x1F6E8]={
+ [0x1F81A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6E8,
+ linebreak="al",
+ unicodeslot=0x1F81A,
},
- [0x1F6E9]={
+ [0x1F81B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6E9,
+ linebreak="al",
+ unicodeslot=0x1F81B,
},
- [0x1F6EA]={
+ [0x1F81C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6EA,
+ linebreak="al",
+ unicodeslot=0x1F81C,
},
- [0x1F6EB]={
+ [0x1F81D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6EB,
+ linebreak="al",
+ unicodeslot=0x1F81D,
},
- [0x1F6EC]={
+ [0x1F81E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6EC,
+ linebreak="al",
+ unicodeslot=0x1F81E,
},
- [0x1F6F0]={
+ [0x1F81F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6F0,
+ linebreak="al",
+ unicodeslot=0x1F81F,
},
- [0x1F6F1]={
+ [0x1F820]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6F1,
+ linebreak="al",
+ unicodeslot=0x1F820,
},
- [0x1F6F2]={
+ [0x1F821]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6F2,
+ linebreak="al",
+ unicodeslot=0x1F821,
},
- [0x1F6F3]={
+ [0x1F822]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6F3,
+ linebreak="al",
+ unicodeslot=0x1F822,
},
- [0x1F6F4]={
+ [0x1F823]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6F4,
+ linebreak="al",
+ unicodeslot=0x1F823,
},
- [0x1F6F5]={
+ [0x1F824]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6F5,
+ linebreak="al",
+ unicodeslot=0x1F824,
},
- [0x1F6F6]={
+ [0x1F825]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6F6,
+ linebreak="al",
+ unicodeslot=0x1F825,
},
- [0x1F6F7]={
+ [0x1F826]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6F7,
+ linebreak="al",
+ unicodeslot=0x1F826,
},
- [0x1F6F8]={
+ [0x1F827]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6F8,
+ linebreak="al",
+ unicodeslot=0x1F827,
},
- [0x1F6F9]={
+ [0x1F828]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6F9,
+ linebreak="al",
+ unicodeslot=0x1F828,
},
- [0x1F6FA]={
+ [0x1F829]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F6FA,
+ linebreak="al",
+ unicodeslot=0x1F829,
},
- [0x1F700]={
+ [0x1F82A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F700,
+ unicodeslot=0x1F82A,
},
- [0x1F701]={
+ [0x1F82B]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F701,
+ unicodeslot=0x1F82B,
},
- [0x1F702]={
+ [0x1F82C]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F702,
+ unicodeslot=0x1F82C,
},
- [0x1F703]={
+ [0x1F82D]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F703,
+ unicodeslot=0x1F82D,
},
- [0x1F704]={
+ [0x1F82E]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F704,
+ unicodeslot=0x1F82E,
},
- [0x1F705]={
+ [0x1F82F]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F705,
+ unicodeslot=0x1F82F,
},
- [0x1F706]={
+ [0x1F830]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F706,
+ unicodeslot=0x1F830,
},
- [0x1F707]={
+ [0x1F831]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F707,
+ unicodeslot=0x1F831,
},
- [0x1F708]={
+ [0x1F832]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F708,
+ unicodeslot=0x1F832,
},
- [0x1F709]={
+ [0x1F833]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F709,
+ unicodeslot=0x1F833,
},
- [0x1F70A]={
+ [0x1F834]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F70A,
+ unicodeslot=0x1F834,
},
- [0x1F70B]={
+ [0x1F835]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F70B,
+ unicodeslot=0x1F835,
},
- [0x1F70C]={
+ [0x1F836]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F70C,
+ unicodeslot=0x1F836,
},
- [0x1F70D]={
+ [0x1F837]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F70D,
+ unicodeslot=0x1F837,
},
- [0x1F70E]={
+ [0x1F838]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F70E,
+ unicodeslot=0x1F838,
},
- [0x1F70F]={
+ [0x1F839]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F70F,
+ unicodeslot=0x1F839,
},
- [0x1F710]={
+ [0x1F83A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F710,
+ unicodeslot=0x1F83A,
},
- [0x1F711]={
+ [0x1F83B]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F711,
+ unicodeslot=0x1F83B,
},
- [0x1F712]={
+ [0x1F83C]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F712,
+ unicodeslot=0x1F83C,
},
- [0x1F713]={
+ [0x1F83D]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F713,
+ unicodeslot=0x1F83D,
},
- [0x1F714]={
+ [0x1F83E]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F714,
+ unicodeslot=0x1F83E,
},
- [0x1F715]={
+ [0x1F83F]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F715,
+ unicodeslot=0x1F83F,
},
- [0x1F716]={
+ [0x1F840]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F716,
+ unicodeslot=0x1F840,
},
- [0x1F717]={
+ [0x1F841]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F717,
+ unicodeslot=0x1F841,
},
- [0x1F718]={
+ [0x1F842]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F718,
+ unicodeslot=0x1F842,
},
- [0x1F719]={
+ [0x1F843]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F719,
+ unicodeslot=0x1F843,
},
- [0x1F71A]={
+ [0x1F844]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F71A,
+ unicodeslot=0x1F844,
},
- [0x1F71B]={
+ [0x1F845]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F71B,
+ unicodeslot=0x1F845,
},
- [0x1F71C]={
+ [0x1F846]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F71C,
+ unicodeslot=0x1F846,
},
- [0x1F71D]={
+ [0x1F847]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F71D,
+ unicodeslot=0x1F847,
},
- [0x1F71E]={
+ [0x1F850]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F71E,
+ unicodeslot=0x1F850,
},
- [0x1F71F]={
+ [0x1F851]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F71F,
+ unicodeslot=0x1F851,
},
- [0x1F720]={
+ [0x1F852]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F720,
+ unicodeslot=0x1F852,
},
- [0x1F721]={
+ [0x1F853]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F721,
+ unicodeslot=0x1F853,
},
- [0x1F722]={
+ [0x1F854]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F722,
+ unicodeslot=0x1F854,
},
- [0x1F723]={
+ [0x1F855]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F723,
+ unicodeslot=0x1F855,
},
- [0x1F724]={
+ [0x1F856]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F724,
+ unicodeslot=0x1F856,
},
- [0x1F725]={
+ [0x1F857]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F725,
+ unicodeslot=0x1F857,
},
- [0x1F726]={
+ [0x1F858]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F726,
+ unicodeslot=0x1F858,
},
- [0x1F727]={
+ [0x1F859]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F727,
+ unicodeslot=0x1F859,
},
- [0x1F728]={
+ [0x1F860]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F728,
+ unicodeslot=0x1F860,
},
- [0x1F729]={
+ [0x1F861]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F729,
+ unicodeslot=0x1F861,
},
- [0x1F72A]={
+ [0x1F862]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F72A,
+ unicodeslot=0x1F862,
},
- [0x1F72B]={
+ [0x1F863]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F72B,
+ unicodeslot=0x1F863,
},
- [0x1F72C]={
+ [0x1F864]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F72C,
+ unicodeslot=0x1F864,
},
- [0x1F72D]={
+ [0x1F865]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F72D,
+ unicodeslot=0x1F865,
},
- [0x1F72E]={
+ [0x1F866]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F72E,
+ unicodeslot=0x1F866,
},
- [0x1F72F]={
+ [0x1F867]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F72F,
+ unicodeslot=0x1F867,
},
- [0x1F730]={
+ [0x1F868]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F730,
+ unicodeslot=0x1F868,
},
- [0x1F731]={
+ [0x1F869]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F731,
+ unicodeslot=0x1F869,
},
- [0x1F732]={
+ [0x1F86A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F732,
+ unicodeslot=0x1F86A,
},
- [0x1F733]={
+ [0x1F86B]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F733,
+ unicodeslot=0x1F86B,
},
- [0x1F734]={
+ [0x1F86C]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F734,
+ unicodeslot=0x1F86C,
},
- [0x1F735]={
+ [0x1F86D]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F735,
+ unicodeslot=0x1F86D,
},
- [0x1F736]={
+ [0x1F86E]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F736,
+ unicodeslot=0x1F86E,
},
- [0x1F737]={
+ [0x1F86F]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F737,
+ unicodeslot=0x1F86F,
},
- [0x1F738]={
+ [0x1F870]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F738,
+ unicodeslot=0x1F870,
},
- [0x1F739]={
+ [0x1F871]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F739,
+ unicodeslot=0x1F871,
},
- [0x1F73A]={
+ [0x1F872]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F73A,
+ unicodeslot=0x1F872,
},
- [0x1F73B]={
+ [0x1F873]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F73B,
+ unicodeslot=0x1F873,
},
- [0x1F73C]={
+ [0x1F874]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F73C,
+ unicodeslot=0x1F874,
},
- [0x1F73D]={
+ [0x1F875]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F73D,
+ unicodeslot=0x1F875,
},
- [0x1F73E]={
+ [0x1F876]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F73E,
+ unicodeslot=0x1F876,
},
- [0x1F73F]={
+ [0x1F877]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F73F,
+ unicodeslot=0x1F877,
},
- [0x1F740]={
+ [0x1F878]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F740,
+ unicodeslot=0x1F878,
},
- [0x1F741]={
+ [0x1F879]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F741,
+ unicodeslot=0x1F879,
},
- [0x1F742]={
+ [0x1F87A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F742,
+ unicodeslot=0x1F87A,
},
- [0x1F743]={
+ [0x1F87B]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F743,
+ unicodeslot=0x1F87B,
},
- [0x1F744]={
+ [0x1F87C]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F744,
+ unicodeslot=0x1F87C,
},
- [0x1F745]={
+ [0x1F87D]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F745,
+ unicodeslot=0x1F87D,
},
- [0x1F746]={
+ [0x1F87E]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F746,
+ unicodeslot=0x1F87E,
},
- [0x1F747]={
+ [0x1F87F]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F747,
+ unicodeslot=0x1F87F,
},
- [0x1F748]={
+ [0x1F880]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F748,
+ unicodeslot=0x1F880,
},
- [0x1F749]={
+ [0x1F881]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F749,
+ unicodeslot=0x1F881,
},
- [0x1F74A]={
+ [0x1F882]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F74A,
+ unicodeslot=0x1F882,
},
- [0x1F74B]={
+ [0x1F883]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F74B,
+ unicodeslot=0x1F883,
},
- [0x1F74C]={
+ [0x1F884]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F74C,
+ unicodeslot=0x1F884,
},
- [0x1F74D]={
+ [0x1F885]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F74D,
+ unicodeslot=0x1F885,
},
- [0x1F74E]={
+ [0x1F886]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F74E,
+ unicodeslot=0x1F886,
},
- [0x1F74F]={
+ [0x1F887]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F74F,
+ unicodeslot=0x1F887,
},
- [0x1F750]={
+ [0x1F890]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F750,
+ unicodeslot=0x1F890,
},
- [0x1F751]={
+ [0x1F891]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F751,
+ unicodeslot=0x1F891,
},
- [0x1F752]={
+ [0x1F892]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F752,
+ unicodeslot=0x1F892,
},
- [0x1F753]={
+ [0x1F893]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F753,
+ unicodeslot=0x1F893,
},
- [0x1F754]={
+ [0x1F894]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F754,
+ unicodeslot=0x1F894,
},
- [0x1F755]={
+ [0x1F895]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F755,
+ unicodeslot=0x1F895,
},
- [0x1F756]={
+ [0x1F896]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F756,
+ unicodeslot=0x1F896,
},
- [0x1F757]={
+ [0x1F897]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F757,
+ unicodeslot=0x1F897,
},
- [0x1F758]={
+ [0x1F898]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F758,
+ unicodeslot=0x1F898,
},
- [0x1F759]={
+ [0x1F899]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F759,
+ unicodeslot=0x1F899,
},
- [0x1F75A]={
+ [0x1F89A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F75A,
+ unicodeslot=0x1F89A,
},
- [0x1F75B]={
+ [0x1F89B]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F75B,
+ unicodeslot=0x1F89B,
},
- [0x1F75C]={
+ [0x1F89C]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F75C,
+ unicodeslot=0x1F89C,
},
- [0x1F75D]={
+ [0x1F89D]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F75D,
+ unicodeslot=0x1F89D,
},
- [0x1F75E]={
+ [0x1F89E]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F75E,
+ unicodeslot=0x1F89E,
},
- [0x1F75F]={
+ [0x1F89F]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F75F,
+ unicodeslot=0x1F89F,
},
- [0x1F760]={
+ [0x1F8A0]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F760,
+ unicodeslot=0x1F8A0,
},
- [0x1F761]={
+ [0x1F8A1]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F761,
+ unicodeslot=0x1F8A1,
},
- [0x1F762]={
+ [0x1F8A2]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F762,
+ unicodeslot=0x1F8A2,
},
- [0x1F763]={
+ [0x1F8A3]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F763,
+ unicodeslot=0x1F8A3,
},
- [0x1F764]={
+ [0x1F8A4]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F764,
+ unicodeslot=0x1F8A4,
},
- [0x1F765]={
+ [0x1F8A5]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F765,
+ unicodeslot=0x1F8A5,
},
- [0x1F766]={
+ [0x1F8A6]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F766,
+ unicodeslot=0x1F8A6,
},
- [0x1F767]={
+ [0x1F8A7]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F767,
+ unicodeslot=0x1F8A7,
},
- [0x1F768]={
+ [0x1F8A8]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F768,
+ unicodeslot=0x1F8A8,
},
- [0x1F769]={
+ [0x1F8A9]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F769,
+ unicodeslot=0x1F8A9,
},
- [0x1F76A]={
+ [0x1F8AA]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F76A,
+ unicodeslot=0x1F8AA,
},
- [0x1F76B]={
+ [0x1F8AB]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F76B,
+ unicodeslot=0x1F8AB,
},
- [0x1F76C]={
+ [0x1F8AC]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F76C,
+ unicodeslot=0x1F8AC,
},
- [0x1F76D]={
+ [0x1F8AD]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F76D,
+ unicodeslot=0x1F8AD,
},
- [0x1F76E]={
+ [0x1F8B0]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F76E,
+ linebreak="id",
+ unicodeslot=0x1F8B0,
},
- [0x1F76F]={
+ [0x1F8B1]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F76F,
+ linebreak="id",
+ unicodeslot=0x1F8B1,
},
- [0x1F770]={
+ [0x1F900]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F770,
+ unicodeslot=0x1F900,
},
- [0x1F771]={
+ [0x1F901]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F771,
+ unicodeslot=0x1F901,
},
- [0x1F772]={
+ [0x1F902]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F772,
+ unicodeslot=0x1F902,
},
- [0x1F773]={
+ [0x1F903]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F773,
+ unicodeslot=0x1F903,
},
- [0x1F780]={
+ [0x1F904]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F780,
+ unicodeslot=0x1F904,
},
- [0x1F781]={
+ [0x1F905]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F781,
+ unicodeslot=0x1F905,
},
- [0x1F782]={
+ [0x1F906]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F782,
+ unicodeslot=0x1F906,
},
- [0x1F783]={
+ [0x1F907]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F783,
+ unicodeslot=0x1F907,
},
- [0x1F784]={
+ [0x1F908]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F784,
+ unicodeslot=0x1F908,
},
- [0x1F785]={
+ [0x1F909]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F785,
+ unicodeslot=0x1F909,
},
- [0x1F786]={
+ [0x1F90A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F786,
+ unicodeslot=0x1F90A,
},
- [0x1F787]={
+ [0x1F90B]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F787,
+ unicodeslot=0x1F90B,
},
- [0x1F788]={
+ [0x1F90C]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F788,
+ linebreak="eb",
+ unicodeslot=0x1F90C,
},
- [0x1F789]={
+ [0x1F90D]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F789,
+ linebreak="id",
+ unicodeslot=0x1F90D,
},
- [0x1F78A]={
+ [0x1F90E]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F78A,
+ linebreak="id",
+ unicodeslot=0x1F90E,
},
- [0x1F78B]={
+ [0x1F90F]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F78B,
+ linebreak="eb",
+ unicodeslot=0x1F90F,
},
- [0x1F78C]={
+ [0x1F910]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F78C,
+ linebreak="id",
+ unicodeslot=0x1F910,
},
- [0x1F78D]={
+ [0x1F911]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F78D,
+ linebreak="id",
+ unicodeslot=0x1F911,
},
- [0x1F78E]={
+ [0x1F912]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F78E,
+ linebreak="id",
+ unicodeslot=0x1F912,
},
- [0x1F78F]={
+ [0x1F913]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F78F,
+ linebreak="id",
+ unicodeslot=0x1F913,
},
- [0x1F790]={
+ [0x1F914]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F790,
+ linebreak="id",
+ unicodeslot=0x1F914,
},
- [0x1F791]={
+ [0x1F915]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F791,
+ linebreak="id",
+ unicodeslot=0x1F915,
},
- [0x1F792]={
+ [0x1F916]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F792,
+ linebreak="id",
+ unicodeslot=0x1F916,
},
- [0x1F793]={
+ [0x1F917]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F793,
+ linebreak="id",
+ unicodeslot=0x1F917,
},
- [0x1F794]={
+ [0x1F918]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F794,
+ linebreak="eb",
+ unicodeslot=0x1F918,
},
- [0x1F795]={
+ [0x1F919]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F795,
+ linebreak="eb",
+ unicodeslot=0x1F919,
},
- [0x1F796]={
+ [0x1F91A]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F796,
+ linebreak="eb",
+ unicodeslot=0x1F91A,
},
- [0x1F797]={
+ [0x1F91B]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F797,
+ linebreak="eb",
+ unicodeslot=0x1F91B,
},
- [0x1F798]={
+ [0x1F91C]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F798,
+ linebreak="eb",
+ unicodeslot=0x1F91C,
},
- [0x1F799]={
+ [0x1F91D]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F799,
+ linebreak="eb",
+ unicodeslot=0x1F91D,
},
- [0x1F79A]={
+ [0x1F91E]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F79A,
+ linebreak="eb",
+ unicodeslot=0x1F91E,
},
- [0x1F79B]={
+ [0x1F91F]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F79B,
+ linebreak="eb",
+ unicodeslot=0x1F91F,
},
- [0x1F79C]={
+ [0x1F920]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F79C,
+ linebreak="id",
+ unicodeslot=0x1F920,
},
- [0x1F79D]={
+ [0x1F921]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F79D,
+ linebreak="id",
+ unicodeslot=0x1F921,
},
- [0x1F79E]={
+ [0x1F922]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F79E,
+ linebreak="id",
+ unicodeslot=0x1F922,
},
- [0x1F79F]={
+ [0x1F923]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F79F,
+ linebreak="id",
+ unicodeslot=0x1F923,
},
- [0x1F7A0]={
+ [0x1F924]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7A0,
+ linebreak="id",
+ unicodeslot=0x1F924,
},
- [0x1F7A1]={
+ [0x1F925]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7A1,
+ linebreak="id",
+ unicodeslot=0x1F925,
},
- [0x1F7A2]={
+ [0x1F926]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7A2,
+ linebreak="eb",
+ unicodeslot=0x1F926,
},
- [0x1F7A3]={
+ [0x1F927]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7A3,
+ linebreak="id",
+ unicodeslot=0x1F927,
},
- [0x1F7A4]={
+ [0x1F928]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7A4,
+ linebreak="id",
+ unicodeslot=0x1F928,
},
- [0x1F7A5]={
+ [0x1F929]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7A5,
+ linebreak="id",
+ unicodeslot=0x1F929,
},
- [0x1F7A6]={
+ [0x1F92A]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7A6,
+ linebreak="id",
+ unicodeslot=0x1F92A,
},
- [0x1F7A7]={
+ [0x1F92B]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7A7,
+ linebreak="id",
+ unicodeslot=0x1F92B,
},
- [0x1F7A8]={
+ [0x1F92C]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7A8,
+ linebreak="id",
+ unicodeslot=0x1F92C,
},
- [0x1F7A9]={
+ [0x1F92D]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7A9,
+ linebreak="id",
+ unicodeslot=0x1F92D,
},
- [0x1F7AA]={
+ [0x1F92E]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7AA,
+ linebreak="id",
+ unicodeslot=0x1F92E,
},
- [0x1F7AB]={
+ [0x1F92F]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7AB,
+ linebreak="id",
+ unicodeslot=0x1F92F,
},
- [0x1F7AC]={
+ [0x1F930]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7AC,
+ linebreak="eb",
+ unicodeslot=0x1F930,
},
- [0x1F7AD]={
+ [0x1F931]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7AD,
+ linebreak="eb",
+ unicodeslot=0x1F931,
},
- [0x1F7AE]={
+ [0x1F932]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7AE,
+ linebreak="eb",
+ unicodeslot=0x1F932,
},
- [0x1F7AF]={
+ [0x1F933]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7AF,
+ linebreak="eb",
+ unicodeslot=0x1F933,
},
- [0x1F7B0]={
+ [0x1F934]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7B0,
+ linebreak="eb",
+ unicodeslot=0x1F934,
},
- [0x1F7B1]={
+ [0x1F935]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7B1,
+ linebreak="eb",
+ unicodeslot=0x1F935,
},
- [0x1F7B2]={
+ [0x1F936]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7B2,
+ linebreak="eb",
+ unicodeslot=0x1F936,
},
- [0x1F7B3]={
+ [0x1F937]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7B3,
+ linebreak="eb",
+ unicodeslot=0x1F937,
},
- [0x1F7B4]={
+ [0x1F938]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7B4,
+ linebreak="eb",
+ unicodeslot=0x1F938,
},
- [0x1F7B5]={
+ [0x1F939]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7B5,
+ linebreak="eb",
+ unicodeslot=0x1F939,
},
- [0x1F7B6]={
+ [0x1F93A]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7B6,
+ linebreak="id",
+ unicodeslot=0x1F93A,
},
- [0x1F7B7]={
+ [0x1F93B]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7B7,
+ linebreak="id",
+ unicodeslot=0x1F93B,
},
- [0x1F7B8]={
+ [0x1F93C]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7B8,
+ linebreak="eb",
+ unicodeslot=0x1F93C,
},
- [0x1F7B9]={
+ [0x1F93D]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7B9,
+ linebreak="eb",
+ unicodeslot=0x1F93D,
},
- [0x1F7BA]={
+ [0x1F93E]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7BA,
+ linebreak="eb",
+ unicodeslot=0x1F93E,
},
- [0x1F7BB]={
+ [0x1F93F]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7BB,
+ linebreak="id",
+ unicodeslot=0x1F93F,
},
- [0x1F7BC]={
+ [0x1F940]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7BC,
+ linebreak="id",
+ unicodeslot=0x1F940,
},
- [0x1F7BD]={
+ [0x1F941]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7BD,
+ linebreak="id",
+ unicodeslot=0x1F941,
},
- [0x1F7BE]={
+ [0x1F942]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7BE,
+ linebreak="id",
+ unicodeslot=0x1F942,
},
- [0x1F7BF]={
+ [0x1F943]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7BF,
+ linebreak="id",
+ unicodeslot=0x1F943,
},
- [0x1F7C0]={
+ [0x1F944]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7C0,
+ linebreak="id",
+ unicodeslot=0x1F944,
},
- [0x1F7C1]={
+ [0x1F945]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7C1,
+ linebreak="id",
+ unicodeslot=0x1F945,
},
- [0x1F7C2]={
+ [0x1F946]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7C2,
+ linebreak="id",
+ unicodeslot=0x1F946,
},
- [0x1F7C3]={
+ [0x1F947]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7C3,
+ linebreak="id",
+ unicodeslot=0x1F947,
},
- [0x1F7C4]={
+ [0x1F948]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7C4,
+ linebreak="id",
+ unicodeslot=0x1F948,
},
- [0x1F7C5]={
+ [0x1F949]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7C5,
+ linebreak="id",
+ unicodeslot=0x1F949,
},
- [0x1F7C6]={
+ [0x1F94A]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7C6,
+ linebreak="id",
+ unicodeslot=0x1F94A,
},
- [0x1F7C7]={
+ [0x1F94B]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7C7,
+ linebreak="id",
+ unicodeslot=0x1F94B,
},
- [0x1F7C8]={
+ [0x1F94C]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7C8,
+ linebreak="id",
+ unicodeslot=0x1F94C,
},
- [0x1F7C9]={
+ [0x1F94D]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7C9,
+ linebreak="id",
+ unicodeslot=0x1F94D,
},
- [0x1F7CA]={
+ [0x1F94E]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7CA,
+ linebreak="id",
+ unicodeslot=0x1F94E,
},
- [0x1F7CB]={
+ [0x1F94F]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7CB,
+ linebreak="id",
+ unicodeslot=0x1F94F,
},
- [0x1F7CC]={
+ [0x1F950]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7CC,
+ linebreak="id",
+ unicodeslot=0x1F950,
},
- [0x1F7CD]={
+ [0x1F951]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7CD,
+ linebreak="id",
+ unicodeslot=0x1F951,
},
- [0x1F7CE]={
+ [0x1F952]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7CE,
+ linebreak="id",
+ unicodeslot=0x1F952,
},
- [0x1F7CF]={
+ [0x1F953]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7CF,
+ linebreak="id",
+ unicodeslot=0x1F953,
},
- [0x1F7D0]={
+ [0x1F954]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7D0,
+ linebreak="id",
+ unicodeslot=0x1F954,
},
- [0x1F7D1]={
+ [0x1F955]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7D1,
+ linebreak="id",
+ unicodeslot=0x1F955,
},
- [0x1F7D2]={
+ [0x1F956]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7D2,
+ linebreak="id",
+ unicodeslot=0x1F956,
},
- [0x1F7D3]={
+ [0x1F957]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7D3,
+ linebreak="id",
+ unicodeslot=0x1F957,
},
- [0x1F7D4]={
+ [0x1F958]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F7D4,
+ linebreak="id",
+ unicodeslot=0x1F958,
},
- [0x1F7D5]={
+ [0x1F959]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7D5,
+ unicodeslot=0x1F959,
},
- [0x1F7D6]={
+ [0x1F95A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7D6,
+ unicodeslot=0x1F95A,
},
- [0x1F7D7]={
+ [0x1F95B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7D7,
+ unicodeslot=0x1F95B,
},
- [0x1F7D8]={
+ [0x1F95C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7D8,
+ unicodeslot=0x1F95C,
},
- [0x1F7E0]={
+ [0x1F95D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7E0,
+ unicodeslot=0x1F95D,
},
- [0x1F7E1]={
+ [0x1F95E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7E1,
+ unicodeslot=0x1F95E,
},
- [0x1F7E2]={
+ [0x1F95F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7E2,
+ unicodeslot=0x1F95F,
},
- [0x1F7E3]={
+ [0x1F960]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7E3,
+ unicodeslot=0x1F960,
},
- [0x1F7E4]={
+ [0x1F961]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7E4,
+ unicodeslot=0x1F961,
},
- [0x1F7E5]={
+ [0x1F962]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7E5,
+ unicodeslot=0x1F962,
},
- [0x1F7E6]={
+ [0x1F963]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7E6,
+ unicodeslot=0x1F963,
},
- [0x1F7E7]={
+ [0x1F964]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7E7,
+ unicodeslot=0x1F964,
},
- [0x1F7E8]={
+ [0x1F965]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7E8,
+ unicodeslot=0x1F965,
},
- [0x1F7E9]={
+ [0x1F966]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7E9,
+ unicodeslot=0x1F966,
},
- [0x1F7EA]={
+ [0x1F967]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7EA,
+ unicodeslot=0x1F967,
},
- [0x1F7EB]={
+ [0x1F968]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F7EB,
+ unicodeslot=0x1F968,
},
- [0x1F800]={
+ [0x1F969]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F800,
+ linebreak="id",
+ unicodeslot=0x1F969,
},
- [0x1F801]={
+ [0x1F96A]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F801,
+ linebreak="id",
+ unicodeslot=0x1F96A,
},
- [0x1F802]={
+ [0x1F96B]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F802,
+ linebreak="id",
+ unicodeslot=0x1F96B,
},
- [0x1F803]={
+ [0x1F96C]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F803,
+ linebreak="id",
+ unicodeslot=0x1F96C,
},
- [0x1F804]={
+ [0x1F96D]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F804,
+ linebreak="id",
+ unicodeslot=0x1F96D,
},
- [0x1F805]={
+ [0x1F96E]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F805,
+ linebreak="id",
+ unicodeslot=0x1F96E,
},
- [0x1F806]={
+ [0x1F96F]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F806,
+ linebreak="id",
+ unicodeslot=0x1F96F,
},
- [0x1F807]={
+ [0x1F970]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F807,
+ linebreak="id",
+ unicodeslot=0x1F970,
},
- [0x1F808]={
+ [0x1F971]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F808,
+ linebreak="id",
+ unicodeslot=0x1F971,
},
- [0x1F809]={
+ [0x1F972]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F809,
+ linebreak="id",
+ unicodeslot=0x1F972,
},
- [0x1F80A]={
+ [0x1F973]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F80A,
+ linebreak="id",
+ unicodeslot=0x1F973,
},
- [0x1F80B]={
+ [0x1F974]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F80B,
+ linebreak="id",
+ unicodeslot=0x1F974,
},
- [0x1F810]={
+ [0x1F975]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F810,
+ linebreak="id",
+ unicodeslot=0x1F975,
},
- [0x1F811]={
+ [0x1F976]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F811,
+ linebreak="id",
+ unicodeslot=0x1F976,
},
- [0x1F812]={
+ [0x1F977]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F812,
+ linebreak="eb",
+ unicodeslot=0x1F977,
},
- [0x1F813]={
+ [0x1F978]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F813,
+ linebreak="id",
+ unicodeslot=0x1F978,
},
- [0x1F814]={
+ [0x1F97A]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F814,
+ linebreak="id",
+ unicodeslot=0x1F97A,
},
- [0x1F815]={
+ [0x1F97B]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F815,
+ linebreak="id",
+ unicodeslot=0x1F97B,
},
- [0x1F816]={
+ [0x1F97C]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F816,
+ linebreak="id",
+ unicodeslot=0x1F97C,
},
- [0x1F817]={
+ [0x1F97D]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F817,
+ linebreak="id",
+ unicodeslot=0x1F97D,
},
- [0x1F818]={
+ [0x1F97E]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F818,
+ linebreak="id",
+ unicodeslot=0x1F97E,
},
- [0x1F819]={
+ [0x1F97F]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F819,
+ linebreak="id",
+ unicodeslot=0x1F97F,
},
- [0x1F81A]={
+ [0x1F980]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F81A,
+ linebreak="id",
+ unicodeslot=0x1F980,
},
- [0x1F81B]={
+ [0x1F981]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F81B,
+ linebreak="id",
+ unicodeslot=0x1F981,
},
- [0x1F81C]={
+ [0x1F982]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F81C,
+ linebreak="id",
+ unicodeslot=0x1F982,
},
- [0x1F81D]={
+ [0x1F983]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F81D,
+ linebreak="id",
+ unicodeslot=0x1F983,
},
- [0x1F81E]={
+ [0x1F984]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F81E,
+ linebreak="id",
+ unicodeslot=0x1F984,
},
- [0x1F81F]={
+ [0x1F985]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F81F,
+ linebreak="id",
+ unicodeslot=0x1F985,
},
- [0x1F820]={
+ [0x1F986]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F820,
+ linebreak="id",
+ unicodeslot=0x1F986,
},
- [0x1F821]={
+ [0x1F987]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F821,
+ linebreak="id",
+ unicodeslot=0x1F987,
},
- [0x1F822]={
+ [0x1F988]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F822,
+ linebreak="id",
+ unicodeslot=0x1F988,
},
- [0x1F823]={
+ [0x1F989]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F823,
+ linebreak="id",
+ unicodeslot=0x1F989,
},
- [0x1F824]={
+ [0x1F98A]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F824,
+ linebreak="id",
+ unicodeslot=0x1F98A,
},
- [0x1F825]={
+ [0x1F98B]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F825,
+ linebreak="id",
+ unicodeslot=0x1F98B,
},
- [0x1F826]={
+ [0x1F98C]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F826,
+ linebreak="id",
+ unicodeslot=0x1F98C,
},
- [0x1F827]={
+ [0x1F98D]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F827,
+ linebreak="id",
+ unicodeslot=0x1F98D,
},
- [0x1F828]={
+ [0x1F98E]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F828,
+ linebreak="id",
+ unicodeslot=0x1F98E,
},
- [0x1F829]={
+ [0x1F98F]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F829,
+ linebreak="id",
+ unicodeslot=0x1F98F,
},
- [0x1F82A]={
+ [0x1F990]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F82A,
+ linebreak="id",
+ unicodeslot=0x1F990,
},
- [0x1F82B]={
+ [0x1F991]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F82B,
+ linebreak="id",
+ unicodeslot=0x1F991,
},
- [0x1F82C]={
+ [0x1F992]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F82C,
+ linebreak="id",
+ unicodeslot=0x1F992,
},
- [0x1F82D]={
+ [0x1F993]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F82D,
+ linebreak="id",
+ unicodeslot=0x1F993,
},
- [0x1F82E]={
+ [0x1F994]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F82E,
+ linebreak="id",
+ unicodeslot=0x1F994,
},
- [0x1F82F]={
+ [0x1F995]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F82F,
+ linebreak="id",
+ unicodeslot=0x1F995,
},
- [0x1F830]={
+ [0x1F996]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F830,
+ linebreak="id",
+ unicodeslot=0x1F996,
},
- [0x1F831]={
+ [0x1F997]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F831,
+ linebreak="id",
+ unicodeslot=0x1F997,
},
- [0x1F832]={
+ [0x1F998]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F832,
+ linebreak="id",
+ unicodeslot=0x1F998,
},
- [0x1F833]={
+ [0x1F999]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F833,
+ linebreak="id",
+ unicodeslot=0x1F999,
},
- [0x1F834]={
+ [0x1F99A]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F834,
+ linebreak="id",
+ unicodeslot=0x1F99A,
},
- [0x1F835]={
+ [0x1F99B]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F835,
+ linebreak="id",
+ unicodeslot=0x1F99B,
},
- [0x1F836]={
+ [0x1F99C]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F836,
+ linebreak="id",
+ unicodeslot=0x1F99C,
},
- [0x1F837]={
+ [0x1F99D]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F837,
+ linebreak="id",
+ unicodeslot=0x1F99D,
},
- [0x1F838]={
+ [0x1F99E]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F838,
+ linebreak="id",
+ unicodeslot=0x1F99E,
},
- [0x1F839]={
+ [0x1F99F]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F839,
+ linebreak="id",
+ unicodeslot=0x1F99F,
},
- [0x1F83A]={
+ [0x1F9A0]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F83A,
+ linebreak="id",
+ unicodeslot=0x1F9A0,
},
- [0x1F83B]={
+ [0x1F9A1]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F83B,
+ linebreak="id",
+ unicodeslot=0x1F9A1,
},
- [0x1F83C]={
+ [0x1F9A2]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F83C,
+ linebreak="id",
+ unicodeslot=0x1F9A2,
},
- [0x1F83D]={
+ [0x1F9A3]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F83D,
+ linebreak="id",
+ unicodeslot=0x1F9A3,
},
- [0x1F83E]={
+ [0x1F9A4]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F83E,
+ linebreak="id",
+ unicodeslot=0x1F9A4,
},
- [0x1F83F]={
+ [0x1F9A5]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F83F,
+ linebreak="id",
+ unicodeslot=0x1F9A5,
},
- [0x1F840]={
+ [0x1F9A6]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F840,
+ linebreak="id",
+ unicodeslot=0x1F9A6,
},
- [0x1F841]={
+ [0x1F9A7]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F841,
+ linebreak="id",
+ unicodeslot=0x1F9A7,
},
- [0x1F842]={
+ [0x1F9A8]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F842,
+ linebreak="id",
+ unicodeslot=0x1F9A8,
},
- [0x1F843]={
+ [0x1F9A9]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F843,
+ linebreak="id",
+ unicodeslot=0x1F9A9,
},
- [0x1F844]={
+ [0x1F9AA]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F844,
+ linebreak="id",
+ unicodeslot=0x1F9AA,
},
- [0x1F845]={
+ [0x1F9AB]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F845,
+ linebreak="id",
+ unicodeslot=0x1F9AB,
},
- [0x1F846]={
+ [0x1F9AC]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F846,
+ linebreak="id",
+ unicodeslot=0x1F9AC,
},
- [0x1F847]={
+ [0x1F9AD]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F847,
+ linebreak="id",
+ unicodeslot=0x1F9AD,
},
- [0x1F850]={
+ [0x1F9AE]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F850,
+ linebreak="id",
+ unicodeslot=0x1F9AE,
},
- [0x1F851]={
+ [0x1F9AF]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F851,
+ linebreak="id",
+ unicodeslot=0x1F9AF,
},
- [0x1F852]={
+ [0x1F9B0]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F852,
+ linebreak="id",
+ unicodeslot=0x1F9B0,
},
- [0x1F853]={
+ [0x1F9B1]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F853,
+ linebreak="id",
+ unicodeslot=0x1F9B1,
},
- [0x1F854]={
+ [0x1F9B2]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F854,
+ linebreak="id",
+ unicodeslot=0x1F9B2,
},
- [0x1F855]={
+ [0x1F9B3]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F855,
+ linebreak="id",
+ unicodeslot=0x1F9B3,
},
- [0x1F856]={
+ [0x1F9B4]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F856,
+ linebreak="id",
+ unicodeslot=0x1F9B4,
},
- [0x1F857]={
+ [0x1F9B5]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F857,
+ linebreak="eb",
+ unicodeslot=0x1F9B5,
},
- [0x1F858]={
+ [0x1F9B6]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F858,
+ linebreak="eb",
+ unicodeslot=0x1F9B6,
},
- [0x1F859]={
+ [0x1F9B7]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F859,
+ linebreak="id",
+ unicodeslot=0x1F9B7,
},
- [0x1F860]={
+ [0x1F9B8]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F860,
+ linebreak="eb",
+ unicodeslot=0x1F9B8,
},
- [0x1F861]={
+ [0x1F9B9]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F861,
+ linebreak="eb",
+ unicodeslot=0x1F9B9,
},
- [0x1F862]={
+ [0x1F9BA]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F862,
+ linebreak="id",
+ unicodeslot=0x1F9BA,
},
- [0x1F863]={
+ [0x1F9BB]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F863,
+ linebreak="eb",
+ unicodeslot=0x1F9BB,
},
- [0x1F864]={
+ [0x1F9BC]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F864,
+ linebreak="id",
+ unicodeslot=0x1F9BC,
},
- [0x1F865]={
+ [0x1F9BD]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F865,
+ linebreak="id",
+ unicodeslot=0x1F9BD,
},
- [0x1F866]={
+ [0x1F9BE]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F866,
+ linebreak="id",
+ unicodeslot=0x1F9BE,
},
- [0x1F867]={
+ [0x1F9BF]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F867,
+ linebreak="id",
+ unicodeslot=0x1F9BF,
},
- [0x1F868]={
+ [0x1F9C0]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F868,
+ linebreak="id",
+ unicodeslot=0x1F9C0,
},
- [0x1F869]={
+ [0x1F9C1]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F869,
+ linebreak="id",
+ unicodeslot=0x1F9C1,
},
- [0x1F86A]={
+ [0x1F9C2]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F86A,
+ linebreak="id",
+ unicodeslot=0x1F9C2,
},
- [0x1F86B]={
+ [0x1F9C3]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F86B,
+ linebreak="id",
+ unicodeslot=0x1F9C3,
},
- [0x1F86C]={
+ [0x1F9C4]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F86C,
+ linebreak="id",
+ unicodeslot=0x1F9C4,
},
- [0x1F86D]={
+ [0x1F9C5]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F86D,
+ linebreak="id",
+ unicodeslot=0x1F9C5,
},
- [0x1F86E]={
+ [0x1F9C6]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F86E,
+ linebreak="id",
+ unicodeslot=0x1F9C6,
},
- [0x1F86F]={
+ [0x1F9C7]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F86F,
+ linebreak="id",
+ unicodeslot=0x1F9C7,
},
- [0x1F870]={
+ [0x1F9C8]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F870,
+ linebreak="id",
+ unicodeslot=0x1F9C8,
},
- [0x1F871]={
+ [0x1F9C9]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F871,
+ linebreak="id",
+ unicodeslot=0x1F9C9,
},
- [0x1F872]={
+ [0x1F9CA]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F872,
+ linebreak="id",
+ unicodeslot=0x1F9CA,
},
- [0x1F873]={
+ [0x1F9CB]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F873,
+ linebreak="id",
+ unicodeslot=0x1F9CB,
},
- [0x1F874]={
+ [0x1F9CD]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F874,
+ linebreak="eb",
+ unicodeslot=0x1F9CD,
},
- [0x1F875]={
+ [0x1F9CE]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F875,
+ linebreak="eb",
+ unicodeslot=0x1F9CE,
},
- [0x1F876]={
+ [0x1F9CF]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F876,
+ linebreak="eb",
+ unicodeslot=0x1F9CF,
},
- [0x1F877]={
+ [0x1F9D0]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F877,
+ linebreak="id",
+ unicodeslot=0x1F9D0,
},
- [0x1F878]={
+ [0x1F9D1]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F878,
+ linebreak="eb",
+ unicodeslot=0x1F9D1,
},
- [0x1F879]={
+ [0x1F9D2]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F879,
+ linebreak="eb",
+ unicodeslot=0x1F9D2,
},
- [0x1F87A]={
+ [0x1F9D3]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F87A,
+ linebreak="eb",
+ unicodeslot=0x1F9D3,
},
- [0x1F87B]={
+ [0x1F9D4]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F87B,
+ linebreak="eb",
+ unicodeslot=0x1F9D4,
},
- [0x1F87C]={
+ [0x1F9D5]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F87C,
+ linebreak="eb",
+ unicodeslot=0x1F9D5,
},
- [0x1F87D]={
+ [0x1F9D6]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F87D,
+ linebreak="eb",
+ unicodeslot=0x1F9D6,
},
- [0x1F87E]={
+ [0x1F9D7]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F87E,
+ linebreak="eb",
+ unicodeslot=0x1F9D7,
},
- [0x1F87F]={
+ [0x1F9D8]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F87F,
+ linebreak="eb",
+ unicodeslot=0x1F9D8,
},
- [0x1F880]={
+ [0x1F9D9]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F880,
+ linebreak="eb",
+ unicodeslot=0x1F9D9,
},
- [0x1F881]={
+ [0x1F9DA]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F881,
+ linebreak="eb",
+ unicodeslot=0x1F9DA,
},
- [0x1F882]={
+ [0x1F9DB]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F882,
+ linebreak="eb",
+ unicodeslot=0x1F9DB,
},
- [0x1F883]={
+ [0x1F9DC]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F883,
+ linebreak="eb",
+ unicodeslot=0x1F9DC,
},
- [0x1F884]={
+ [0x1F9DD]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F884,
+ linebreak="eb",
+ unicodeslot=0x1F9DD,
},
- [0x1F885]={
+ [0x1F9DE]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F885,
+ linebreak="id",
+ unicodeslot=0x1F9DE,
},
- [0x1F886]={
+ [0x1F9DF]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F886,
+ linebreak="id",
+ unicodeslot=0x1F9DF,
},
- [0x1F887]={
+ [0x1F9E0]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F887,
+ linebreak="id",
+ unicodeslot=0x1F9E0,
},
- [0x1F890]={
+ [0x1F9E1]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F890,
+ linebreak="id",
+ unicodeslot=0x1F9E1,
},
- [0x1F891]={
+ [0x1F9E2]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F891,
+ linebreak="id",
+ unicodeslot=0x1F9E2,
},
- [0x1F892]={
+ [0x1F9E3]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F892,
+ linebreak="id",
+ unicodeslot=0x1F9E3,
},
- [0x1F893]={
+ [0x1F9E4]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F893,
+ linebreak="id",
+ unicodeslot=0x1F9E4,
},
- [0x1F894]={
+ [0x1F9E5]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F894,
+ linebreak="id",
+ unicodeslot=0x1F9E5,
},
- [0x1F895]={
+ [0x1F9E6]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F895,
+ linebreak="id",
+ unicodeslot=0x1F9E6,
},
- [0x1F896]={
+ [0x1F9E7]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F896,
+ linebreak="id",
+ unicodeslot=0x1F9E7,
},
- [0x1F897]={
+ [0x1F9E8]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F897,
+ linebreak="id",
+ unicodeslot=0x1F9E8,
},
- [0x1F898]={
+ [0x1F9E9]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F898,
+ linebreak="id",
+ unicodeslot=0x1F9E9,
},
- [0x1F899]={
+ [0x1F9EA]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F899,
+ linebreak="id",
+ unicodeslot=0x1F9EA,
},
- [0x1F89A]={
+ [0x1F9EB]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F89A,
+ linebreak="id",
+ unicodeslot=0x1F9EB,
},
- [0x1F89B]={
+ [0x1F9EC]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F89B,
+ linebreak="id",
+ unicodeslot=0x1F9EC,
},
- [0x1F89C]={
+ [0x1F9ED]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F89C,
+ linebreak="id",
+ unicodeslot=0x1F9ED,
},
- [0x1F89D]={
+ [0x1F9EE]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F89D,
+ linebreak="id",
+ unicodeslot=0x1F9EE,
},
- [0x1F89E]={
+ [0x1F9EF]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F89E,
+ linebreak="id",
+ unicodeslot=0x1F9EF,
},
- [0x1F89F]={
+ [0x1F9F0]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F89F,
+ linebreak="id",
+ unicodeslot=0x1F9F0,
},
- [0x1F8A0]={
+ [0x1F9F1]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F8A0,
+ linebreak="id",
+ unicodeslot=0x1F9F1,
},
- [0x1F8A1]={
+ [0x1F9F2]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F8A1,
+ linebreak="id",
+ unicodeslot=0x1F9F2,
},
- [0x1F8A2]={
+ [0x1F9F3]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F8A2,
+ linebreak="id",
+ unicodeslot=0x1F9F3,
},
- [0x1F8A3]={
+ [0x1F9F4]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F8A3,
+ linebreak="id",
+ unicodeslot=0x1F9F4,
},
- [0x1F8A4]={
+ [0x1F9F5]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F8A4,
+ linebreak="id",
+ unicodeslot=0x1F9F5,
},
- [0x1F8A5]={
+ [0x1F9F6]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F8A5,
+ linebreak="id",
+ unicodeslot=0x1F9F6,
},
- [0x1F8A6]={
+ [0x1F9F7]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F8A6,
+ linebreak="id",
+ unicodeslot=0x1F9F7,
},
- [0x1F8A7]={
+ [0x1F9F8]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F8A7,
+ linebreak="id",
+ unicodeslot=0x1F9F8,
},
- [0x1F8A8]={
+ [0x1F9F9]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F8A8,
+ linebreak="id",
+ unicodeslot=0x1F9F9,
},
- [0x1F8A9]={
+ [0x1F9FA]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F8A9,
+ linebreak="id",
+ unicodeslot=0x1F9FA,
},
- [0x1F8AA]={
+ [0x1F9FB]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F8AA,
+ linebreak="id",
+ unicodeslot=0x1F9FB,
},
- [0x1F8AB]={
+ [0x1F9FC]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F8AB,
+ linebreak="id",
+ unicodeslot=0x1F9FC,
},
- [0x1F8AC]={
+ [0x1F9FD]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F8AC,
+ linebreak="id",
+ unicodeslot=0x1F9FD,
},
- [0x1F8AD]={
+ [0x1F9FE]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F8AD,
+ linebreak="id",
+ unicodeslot=0x1F9FE,
},
- [0x1F900]={
+ [0x1F9FF]={
category="so",
direction="on",
- linebreak="al",
- unicodeslot=0x1F900,
+ linebreak="id",
+ unicodeslot=0x1F9FF,
},
- [0x1F901]={
+ [0x1FA00]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F901,
+ unicodeslot=0x1FA00,
},
- [0x1F902]={
+ [0x1FA01]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F902,
+ unicodeslot=0x1FA01,
},
- [0x1F903]={
+ [0x1FA02]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F903,
+ unicodeslot=0x1FA02,
},
- [0x1F904]={
+ [0x1FA03]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F904,
+ unicodeslot=0x1FA03,
},
- [0x1F905]={
+ [0x1FA04]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F905,
+ unicodeslot=0x1FA04,
},
- [0x1F906]={
+ [0x1FA05]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F906,
+ unicodeslot=0x1FA05,
},
- [0x1F907]={
+ [0x1FA06]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F907,
+ unicodeslot=0x1FA06,
},
- [0x1F908]={
+ [0x1FA07]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F908,
+ unicodeslot=0x1FA07,
},
- [0x1F909]={
+ [0x1FA08]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F909,
+ unicodeslot=0x1FA08,
},
- [0x1F90A]={
+ [0x1FA09]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F90A,
+ unicodeslot=0x1FA09,
},
- [0x1F90B]={
+ [0x1FA0A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1F90B,
+ unicodeslot=0x1FA0A,
},
- [0x1F90D]={
+ [0x1FA0B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F90D,
+ linebreak="al",
+ unicodeslot=0x1FA0B,
},
- [0x1F90E]={
+ [0x1FA0C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F90E,
+ linebreak="al",
+ unicodeslot=0x1FA0C,
},
- [0x1F90F]={
+ [0x1FA0D]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F90F,
+ linebreak="al",
+ unicodeslot=0x1FA0D,
},
- [0x1F910]={
+ [0x1FA0E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F910,
+ linebreak="al",
+ unicodeslot=0x1FA0E,
},
- [0x1F911]={
+ [0x1FA0F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F911,
+ linebreak="al",
+ unicodeslot=0x1FA0F,
},
- [0x1F912]={
+ [0x1FA10]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F912,
+ linebreak="al",
+ unicodeslot=0x1FA10,
},
- [0x1F913]={
+ [0x1FA11]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F913,
+ linebreak="al",
+ unicodeslot=0x1FA11,
},
- [0x1F914]={
+ [0x1FA12]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F914,
+ linebreak="al",
+ unicodeslot=0x1FA12,
},
- [0x1F915]={
+ [0x1FA13]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F915,
+ linebreak="al",
+ unicodeslot=0x1FA13,
},
- [0x1F916]={
+ [0x1FA14]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F916,
+ linebreak="al",
+ unicodeslot=0x1FA14,
},
- [0x1F917]={
+ [0x1FA15]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F917,
+ linebreak="al",
+ unicodeslot=0x1FA15,
},
- [0x1F918]={
+ [0x1FA16]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F918,
+ linebreak="al",
+ unicodeslot=0x1FA16,
},
- [0x1F919]={
+ [0x1FA17]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F919,
+ linebreak="al",
+ unicodeslot=0x1FA17,
},
- [0x1F91A]={
+ [0x1FA18]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F91A,
+ linebreak="al",
+ unicodeslot=0x1FA18,
},
- [0x1F91B]={
+ [0x1FA19]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F91B,
+ linebreak="al",
+ unicodeslot=0x1FA19,
},
- [0x1F91C]={
+ [0x1FA1A]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F91C,
+ linebreak="al",
+ unicodeslot=0x1FA1A,
},
- [0x1F91D]={
+ [0x1FA1B]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F91D,
+ linebreak="al",
+ unicodeslot=0x1FA1B,
},
- [0x1F91E]={
+ [0x1FA1C]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F91E,
+ linebreak="al",
+ unicodeslot=0x1FA1C,
},
- [0x1F91F]={
+ [0x1FA1D]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F91F,
+ linebreak="al",
+ unicodeslot=0x1FA1D,
},
- [0x1F920]={
+ [0x1FA1E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F920,
+ linebreak="al",
+ unicodeslot=0x1FA1E,
},
- [0x1F921]={
+ [0x1FA1F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F921,
+ linebreak="al",
+ unicodeslot=0x1FA1F,
},
- [0x1F922]={
+ [0x1FA20]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F922,
+ linebreak="al",
+ unicodeslot=0x1FA20,
},
- [0x1F923]={
+ [0x1FA21]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F923,
+ linebreak="al",
+ unicodeslot=0x1FA21,
},
- [0x1F924]={
+ [0x1FA22]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F924,
+ linebreak="al",
+ unicodeslot=0x1FA22,
},
- [0x1F925]={
+ [0x1FA23]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F925,
+ linebreak="al",
+ unicodeslot=0x1FA23,
},
- [0x1F926]={
+ [0x1FA24]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F926,
+ linebreak="al",
+ unicodeslot=0x1FA24,
},
- [0x1F927]={
+ [0x1FA25]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F927,
+ linebreak="al",
+ unicodeslot=0x1FA25,
},
- [0x1F928]={
+ [0x1FA26]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F928,
+ linebreak="al",
+ unicodeslot=0x1FA26,
},
- [0x1F929]={
+ [0x1FA27]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F929,
+ linebreak="al",
+ unicodeslot=0x1FA27,
},
- [0x1F92A]={
+ [0x1FA28]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F92A,
+ linebreak="al",
+ unicodeslot=0x1FA28,
},
- [0x1F92B]={
+ [0x1FA29]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F92B,
+ linebreak="al",
+ unicodeslot=0x1FA29,
},
- [0x1F92C]={
+ [0x1FA2A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F92C,
+ linebreak="al",
+ unicodeslot=0x1FA2A,
},
- [0x1F92D]={
+ [0x1FA2B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F92D,
+ linebreak="al",
+ unicodeslot=0x1FA2B,
},
- [0x1F92E]={
+ [0x1FA2C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F92E,
+ linebreak="al",
+ unicodeslot=0x1FA2C,
},
- [0x1F92F]={
+ [0x1FA2D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F92F,
+ linebreak="al",
+ unicodeslot=0x1FA2D,
},
- [0x1F930]={
+ [0x1FA2E]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F930,
+ linebreak="al",
+ unicodeslot=0x1FA2E,
},
- [0x1F931]={
+ [0x1FA2F]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F931,
+ linebreak="al",
+ unicodeslot=0x1FA2F,
},
- [0x1F932]={
+ [0x1FA30]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F932,
+ linebreak="al",
+ unicodeslot=0x1FA30,
},
- [0x1F933]={
+ [0x1FA31]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F933,
+ linebreak="al",
+ unicodeslot=0x1FA31,
},
- [0x1F934]={
+ [0x1FA32]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F934,
+ linebreak="al",
+ unicodeslot=0x1FA32,
},
- [0x1F935]={
+ [0x1FA33]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F935,
+ linebreak="al",
+ unicodeslot=0x1FA33,
},
- [0x1F936]={
+ [0x1FA34]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F936,
+ linebreak="al",
+ unicodeslot=0x1FA34,
},
- [0x1F937]={
+ [0x1FA35]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F937,
+ linebreak="al",
+ unicodeslot=0x1FA35,
},
- [0x1F938]={
+ [0x1FA36]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F938,
+ linebreak="al",
+ unicodeslot=0x1FA36,
},
- [0x1F939]={
+ [0x1FA37]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F939,
+ linebreak="al",
+ unicodeslot=0x1FA37,
},
- [0x1F93A]={
+ [0x1FA38]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F93A,
+ linebreak="al",
+ unicodeslot=0x1FA38,
},
- [0x1F93B]={
+ [0x1FA39]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F93B,
+ linebreak="al",
+ unicodeslot=0x1FA39,
},
- [0x1F93C]={
+ [0x1FA3A]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F93C,
+ linebreak="al",
+ unicodeslot=0x1FA3A,
},
- [0x1F93D]={
+ [0x1FA3B]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F93D,
+ linebreak="al",
+ unicodeslot=0x1FA3B,
},
- [0x1F93E]={
+ [0x1FA3C]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F93E,
+ linebreak="al",
+ unicodeslot=0x1FA3C,
},
- [0x1F93F]={
+ [0x1FA3D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F93F,
+ linebreak="al",
+ unicodeslot=0x1FA3D,
},
- [0x1F940]={
+ [0x1FA3E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F940,
+ linebreak="al",
+ unicodeslot=0x1FA3E,
},
- [0x1F941]={
+ [0x1FA3F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F941,
+ linebreak="al",
+ unicodeslot=0x1FA3F,
},
- [0x1F942]={
+ [0x1FA40]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F942,
+ linebreak="al",
+ unicodeslot=0x1FA40,
},
- [0x1F943]={
+ [0x1FA41]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F943,
+ linebreak="al",
+ unicodeslot=0x1FA41,
},
- [0x1F944]={
+ [0x1FA42]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F944,
+ linebreak="al",
+ unicodeslot=0x1FA42,
},
- [0x1F945]={
+ [0x1FA43]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F945,
+ linebreak="al",
+ unicodeslot=0x1FA43,
},
- [0x1F946]={
+ [0x1FA44]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F946,
+ linebreak="al",
+ unicodeslot=0x1FA44,
},
- [0x1F947]={
+ [0x1FA45]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F947,
+ linebreak="al",
+ unicodeslot=0x1FA45,
},
- [0x1F948]={
+ [0x1FA46]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F948,
+ linebreak="al",
+ unicodeslot=0x1FA46,
},
- [0x1F949]={
+ [0x1FA47]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F949,
+ linebreak="al",
+ unicodeslot=0x1FA47,
},
- [0x1F94A]={
+ [0x1FA48]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F94A,
+ linebreak="al",
+ unicodeslot=0x1FA48,
},
- [0x1F94B]={
+ [0x1FA49]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F94B,
+ linebreak="al",
+ unicodeslot=0x1FA49,
},
- [0x1F94C]={
+ [0x1FA4A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F94C,
+ linebreak="al",
+ unicodeslot=0x1FA4A,
},
- [0x1F94D]={
+ [0x1FA4B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F94D,
+ linebreak="al",
+ unicodeslot=0x1FA4B,
},
- [0x1F94E]={
+ [0x1FA4C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F94E,
+ linebreak="al",
+ unicodeslot=0x1FA4C,
},
- [0x1F94F]={
+ [0x1FA4D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F94F,
+ linebreak="al",
+ unicodeslot=0x1FA4D,
},
- [0x1F950]={
+ [0x1FA4E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F950,
+ linebreak="al",
+ unicodeslot=0x1FA4E,
},
- [0x1F951]={
+ [0x1FA4F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F951,
+ linebreak="al",
+ unicodeslot=0x1FA4F,
},
- [0x1F952]={
+ [0x1FA50]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F952,
+ linebreak="al",
+ unicodeslot=0x1FA50,
},
- [0x1F953]={
+ [0x1FA51]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F953,
+ linebreak="al",
+ unicodeslot=0x1FA51,
},
- [0x1F954]={
+ [0x1FA52]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F954,
+ linebreak="al",
+ unicodeslot=0x1FA52,
},
- [0x1F955]={
+ [0x1FA53]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F955,
+ linebreak="al",
+ unicodeslot=0x1FA53,
},
- [0x1F956]={
+ [0x1FA60]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F956,
+ unicodeslot=0x1FA60,
},
- [0x1F957]={
+ [0x1FA61]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F957,
+ unicodeslot=0x1FA61,
},
- [0x1F958]={
+ [0x1FA62]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F958,
+ unicodeslot=0x1FA62,
},
- [0x1F959]={
+ [0x1FA63]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F959,
+ unicodeslot=0x1FA63,
},
- [0x1F95A]={
+ [0x1FA64]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F95A,
+ unicodeslot=0x1FA64,
},
- [0x1F95B]={
+ [0x1FA65]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F95B,
+ unicodeslot=0x1FA65,
},
- [0x1F95C]={
+ [0x1FA66]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F95C,
+ unicodeslot=0x1FA66,
},
- [0x1F95D]={
+ [0x1FA67]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F95D,
+ unicodeslot=0x1FA67,
},
- [0x1F95E]={
+ [0x1FA68]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F95E,
+ unicodeslot=0x1FA68,
},
- [0x1F95F]={
+ [0x1FA69]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F95F,
+ unicodeslot=0x1FA69,
},
- [0x1F960]={
+ [0x1FA6A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F960,
+ unicodeslot=0x1FA6A,
},
- [0x1F961]={
+ [0x1FA6B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F961,
+ unicodeslot=0x1FA6B,
},
- [0x1F962]={
+ [0x1FA6C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F962,
+ unicodeslot=0x1FA6C,
},
- [0x1F963]={
+ [0x1FA6D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F963,
+ unicodeslot=0x1FA6D,
},
- [0x1F964]={
+ [0x1FA70]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F964,
+ unicodeslot=0x1FA70,
},
- [0x1F965]={
+ [0x1FA71]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F965,
+ unicodeslot=0x1FA71,
},
- [0x1F966]={
+ [0x1FA72]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F966,
+ unicodeslot=0x1FA72,
},
- [0x1F967]={
+ [0x1FA73]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F967,
+ unicodeslot=0x1FA73,
},
- [0x1F968]={
+ [0x1FA74]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F968,
+ unicodeslot=0x1FA74,
},
- [0x1F969]={
+ [0x1FA78]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F969,
+ unicodeslot=0x1FA78,
},
- [0x1F96A]={
+ [0x1FA79]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F96A,
+ unicodeslot=0x1FA79,
},
- [0x1F96B]={
+ [0x1FA7A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F96B,
+ unicodeslot=0x1FA7A,
},
- [0x1F96C]={
+ [0x1FA80]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F96C,
+ unicodeslot=0x1FA80,
},
- [0x1F96D]={
+ [0x1FA81]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F96D,
+ unicodeslot=0x1FA81,
},
- [0x1F96E]={
+ [0x1FA82]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F96E,
+ unicodeslot=0x1FA82,
},
- [0x1F96F]={
+ [0x1FA83]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F96F,
+ unicodeslot=0x1FA83,
},
- [0x1F970]={
+ [0x1FA84]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F970,
+ unicodeslot=0x1FA84,
},
- [0x1F971]={
+ [0x1FA85]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F971,
+ unicodeslot=0x1FA85,
},
- [0x1F973]={
+ [0x1FA86]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F973,
+ unicodeslot=0x1FA86,
},
- [0x1F974]={
+ [0x1FA90]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F974,
+ unicodeslot=0x1FA90,
},
- [0x1F975]={
+ [0x1FA91]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F975,
+ unicodeslot=0x1FA91,
},
- [0x1F976]={
+ [0x1FA92]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F976,
+ unicodeslot=0x1FA92,
},
- [0x1F97A]={
+ [0x1FA93]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F97A,
+ unicodeslot=0x1FA93,
},
- [0x1F97B]={
+ [0x1FA94]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F97B,
+ unicodeslot=0x1FA94,
},
- [0x1F97C]={
+ [0x1FA95]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F97C,
+ unicodeslot=0x1FA95,
},
- [0x1F97D]={
+ [0x1FA96]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F97D,
+ unicodeslot=0x1FA96,
},
- [0x1F97E]={
+ [0x1FA97]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F97E,
+ unicodeslot=0x1FA97,
},
- [0x1F97F]={
+ [0x1FA98]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F97F,
+ unicodeslot=0x1FA98,
},
- [0x1F980]={
+ [0x1FA99]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F980,
+ unicodeslot=0x1FA99,
},
- [0x1F981]={
+ [0x1FA9A]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F981,
+ unicodeslot=0x1FA9A,
},
- [0x1F982]={
+ [0x1FA9B]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F982,
+ unicodeslot=0x1FA9B,
},
- [0x1F983]={
+ [0x1FA9C]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F983,
+ unicodeslot=0x1FA9C,
},
- [0x1F984]={
+ [0x1FA9D]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F984,
+ unicodeslot=0x1FA9D,
},
- [0x1F985]={
+ [0x1FA9E]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F985,
+ unicodeslot=0x1FA9E,
},
- [0x1F986]={
+ [0x1FA9F]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F986,
+ unicodeslot=0x1FA9F,
},
- [0x1F987]={
+ [0x1FAA0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F987,
+ unicodeslot=0x1FAA0,
},
- [0x1F988]={
+ [0x1FAA1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F988,
+ unicodeslot=0x1FAA1,
},
- [0x1F989]={
+ [0x1FAA2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F989,
+ unicodeslot=0x1FAA2,
},
- [0x1F98A]={
+ [0x1FAA3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F98A,
+ unicodeslot=0x1FAA3,
},
- [0x1F98B]={
+ [0x1FAA4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F98B,
+ unicodeslot=0x1FAA4,
},
- [0x1F98C]={
+ [0x1FAA5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F98C,
+ unicodeslot=0x1FAA5,
},
- [0x1F98D]={
+ [0x1FAA6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F98D,
+ unicodeslot=0x1FAA6,
},
- [0x1F98E]={
+ [0x1FAA7]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F98E,
+ unicodeslot=0x1FAA7,
},
- [0x1F98F]={
+ [0x1FAA8]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F98F,
+ unicodeslot=0x1FAA8,
},
- [0x1F990]={
+ [0x1FAB0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F990,
+ unicodeslot=0x1FAB0,
},
- [0x1F991]={
+ [0x1FAB1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F991,
+ unicodeslot=0x1FAB1,
},
- [0x1F992]={
+ [0x1FAB2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F992,
+ unicodeslot=0x1FAB2,
},
- [0x1F993]={
+ [0x1FAB3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F993,
+ unicodeslot=0x1FAB3,
},
- [0x1F994]={
+ [0x1FAB4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F994,
+ unicodeslot=0x1FAB4,
},
- [0x1F995]={
+ [0x1FAB5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F995,
+ unicodeslot=0x1FAB5,
},
- [0x1F996]={
+ [0x1FAB6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F996,
+ unicodeslot=0x1FAB6,
},
- [0x1F997]={
+ [0x1FAC0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F997,
+ unicodeslot=0x1FAC0,
},
- [0x1F998]={
+ [0x1FAC1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F998,
+ unicodeslot=0x1FAC1,
},
- [0x1F999]={
+ [0x1FAC2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F999,
+ unicodeslot=0x1FAC2,
},
- [0x1F99A]={
+ [0x1FAD0]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F99A,
+ unicodeslot=0x1FAD0,
},
- [0x1F99B]={
+ [0x1FAD1]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F99B,
+ unicodeslot=0x1FAD1,
},
- [0x1F99C]={
+ [0x1FAD2]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F99C,
+ unicodeslot=0x1FAD2,
},
- [0x1F99D]={
+ [0x1FAD3]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F99D,
+ unicodeslot=0x1FAD3,
},
- [0x1F99E]={
+ [0x1FAD4]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F99E,
+ unicodeslot=0x1FAD4,
},
- [0x1F99F]={
+ [0x1FAD5]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F99F,
+ unicodeslot=0x1FAD5,
},
- [0x1F9A0]={
+ [0x1FAD6]={
category="so",
direction="on",
linebreak="id",
- unicodeslot=0x1F9A0,
+ unicodeslot=0x1FAD6,
},
- [0x1F9A1]={
+ [0x1FB00]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9A1,
+ linebreak="al",
+ unicodeslot=0x1FB00,
},
- [0x1F9A2]={
+ [0x1FB01]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9A2,
+ linebreak="al",
+ unicodeslot=0x1FB01,
},
- [0x1F9A5]={
+ [0x1FB02]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9A5,
+ linebreak="al",
+ unicodeslot=0x1FB02,
},
- [0x1F9A6]={
+ [0x1FB03]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9A6,
+ linebreak="al",
+ unicodeslot=0x1FB03,
},
- [0x1F9A7]={
+ [0x1FB04]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9A7,
+ linebreak="al",
+ unicodeslot=0x1FB04,
},
- [0x1F9A8]={
+ [0x1FB05]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9A8,
+ linebreak="al",
+ unicodeslot=0x1FB05,
},
- [0x1F9A9]={
+ [0x1FB06]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9A9,
+ linebreak="al",
+ unicodeslot=0x1FB06,
},
- [0x1F9AA]={
+ [0x1FB07]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9AA,
+ linebreak="al",
+ unicodeslot=0x1FB07,
},
- [0x1F9AE]={
+ [0x1FB08]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9AE,
+ linebreak="al",
+ unicodeslot=0x1FB08,
},
- [0x1F9AF]={
+ [0x1FB09]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9AF,
+ linebreak="al",
+ unicodeslot=0x1FB09,
},
- [0x1F9B0]={
+ [0x1FB0A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9B0,
+ linebreak="al",
+ unicodeslot=0x1FB0A,
},
- [0x1F9B1]={
+ [0x1FB0B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9B1,
+ linebreak="al",
+ unicodeslot=0x1FB0B,
},
- [0x1F9B2]={
+ [0x1FB0C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9B2,
+ linebreak="al",
+ unicodeslot=0x1FB0C,
},
- [0x1F9B3]={
+ [0x1FB0D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9B3,
+ linebreak="al",
+ unicodeslot=0x1FB0D,
},
- [0x1F9B4]={
+ [0x1FB0E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9B4,
+ linebreak="al",
+ unicodeslot=0x1FB0E,
},
- [0x1F9B5]={
+ [0x1FB0F]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9B5,
+ linebreak="al",
+ unicodeslot=0x1FB0F,
},
- [0x1F9B6]={
+ [0x1FB10]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9B6,
+ linebreak="al",
+ unicodeslot=0x1FB10,
},
- [0x1F9B7]={
+ [0x1FB11]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9B7,
+ linebreak="al",
+ unicodeslot=0x1FB11,
},
- [0x1F9B8]={
+ [0x1FB12]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9B8,
+ linebreak="al",
+ unicodeslot=0x1FB12,
},
- [0x1F9B9]={
+ [0x1FB13]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9B9,
+ linebreak="al",
+ unicodeslot=0x1FB13,
},
- [0x1F9BA]={
+ [0x1FB14]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9BA,
+ linebreak="al",
+ unicodeslot=0x1FB14,
},
- [0x1F9BB]={
+ [0x1FB15]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9BB,
+ linebreak="al",
+ unicodeslot=0x1FB15,
},
- [0x1F9BC]={
+ [0x1FB16]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9BC,
+ linebreak="al",
+ unicodeslot=0x1FB16,
},
- [0x1F9BD]={
+ [0x1FB17]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9BD,
+ linebreak="al",
+ unicodeslot=0x1FB17,
},
- [0x1F9BE]={
+ [0x1FB18]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9BE,
+ linebreak="al",
+ unicodeslot=0x1FB18,
},
- [0x1F9BF]={
+ [0x1FB19]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9BF,
+ linebreak="al",
+ unicodeslot=0x1FB19,
},
- [0x1F9C0]={
+ [0x1FB1A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9C0,
+ linebreak="al",
+ unicodeslot=0x1FB1A,
},
- [0x1F9C1]={
+ [0x1FB1B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9C1,
+ linebreak="al",
+ unicodeslot=0x1FB1B,
},
- [0x1F9C2]={
+ [0x1FB1C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9C2,
+ linebreak="al",
+ unicodeslot=0x1FB1C,
},
- [0x1F9C3]={
+ [0x1FB1D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9C3,
+ linebreak="al",
+ unicodeslot=0x1FB1D,
},
- [0x1F9C4]={
+ [0x1FB1E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9C4,
+ linebreak="al",
+ unicodeslot=0x1FB1E,
},
- [0x1F9C5]={
+ [0x1FB1F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9C5,
+ linebreak="al",
+ unicodeslot=0x1FB1F,
},
- [0x1F9C6]={
+ [0x1FB20]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9C6,
+ linebreak="al",
+ unicodeslot=0x1FB20,
},
- [0x1F9C7]={
+ [0x1FB21]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9C7,
+ linebreak="al",
+ unicodeslot=0x1FB21,
},
- [0x1F9C8]={
+ [0x1FB22]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9C8,
+ linebreak="al",
+ unicodeslot=0x1FB22,
},
- [0x1F9C9]={
+ [0x1FB23]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9C9,
+ linebreak="al",
+ unicodeslot=0x1FB23,
},
- [0x1F9CA]={
+ [0x1FB24]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9CA,
+ linebreak="al",
+ unicodeslot=0x1FB24,
},
- [0x1F9CD]={
+ [0x1FB25]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9CD,
+ linebreak="al",
+ unicodeslot=0x1FB25,
},
- [0x1F9CE]={
+ [0x1FB26]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9CE,
+ linebreak="al",
+ unicodeslot=0x1FB26,
},
- [0x1F9CF]={
+ [0x1FB27]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9CF,
+ linebreak="al",
+ unicodeslot=0x1FB27,
},
- [0x1F9D0]={
+ [0x1FB28]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9D0,
+ linebreak="al",
+ unicodeslot=0x1FB28,
},
- [0x1F9D1]={
+ [0x1FB29]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9D1,
+ linebreak="al",
+ unicodeslot=0x1FB29,
},
- [0x1F9D2]={
+ [0x1FB2A]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9D2,
+ linebreak="al",
+ unicodeslot=0x1FB2A,
},
- [0x1F9D3]={
+ [0x1FB2B]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9D3,
+ linebreak="al",
+ unicodeslot=0x1FB2B,
},
- [0x1F9D4]={
+ [0x1FB2C]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9D4,
+ linebreak="al",
+ unicodeslot=0x1FB2C,
},
- [0x1F9D5]={
+ [0x1FB2D]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9D5,
+ linebreak="al",
+ unicodeslot=0x1FB2D,
},
- [0x1F9D6]={
+ [0x1FB2E]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9D6,
+ linebreak="al",
+ unicodeslot=0x1FB2E,
},
- [0x1F9D7]={
+ [0x1FB2F]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9D7,
+ linebreak="al",
+ unicodeslot=0x1FB2F,
},
- [0x1F9D8]={
+ [0x1FB30]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9D8,
+ linebreak="al",
+ unicodeslot=0x1FB30,
},
- [0x1F9D9]={
+ [0x1FB31]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9D9,
+ linebreak="al",
+ unicodeslot=0x1FB31,
},
- [0x1F9DA]={
+ [0x1FB32]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9DA,
+ linebreak="al",
+ unicodeslot=0x1FB32,
},
- [0x1F9DB]={
+ [0x1FB33]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9DB,
+ linebreak="al",
+ unicodeslot=0x1FB33,
},
- [0x1F9DC]={
+ [0x1FB34]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9DC,
+ linebreak="al",
+ unicodeslot=0x1FB34,
},
- [0x1F9DD]={
+ [0x1FB35]={
category="so",
direction="on",
- linebreak="eb",
- unicodeslot=0x1F9DD,
+ linebreak="al",
+ unicodeslot=0x1FB35,
},
- [0x1F9DE]={
+ [0x1FB36]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9DE,
+ linebreak="al",
+ unicodeslot=0x1FB36,
},
- [0x1F9DF]={
+ [0x1FB37]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9DF,
+ linebreak="al",
+ unicodeslot=0x1FB37,
},
- [0x1F9E0]={
+ [0x1FB38]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9E0,
+ linebreak="al",
+ unicodeslot=0x1FB38,
},
- [0x1F9E1]={
+ [0x1FB39]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9E1,
+ linebreak="al",
+ unicodeslot=0x1FB39,
},
- [0x1F9E2]={
+ [0x1FB3A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9E2,
+ linebreak="al",
+ unicodeslot=0x1FB3A,
},
- [0x1F9E3]={
+ [0x1FB3B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9E3,
+ linebreak="al",
+ unicodeslot=0x1FB3B,
},
- [0x1F9E4]={
+ [0x1FB3C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9E4,
+ linebreak="al",
+ unicodeslot=0x1FB3C,
},
- [0x1F9E5]={
+ [0x1FB3D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9E5,
+ linebreak="al",
+ unicodeslot=0x1FB3D,
},
- [0x1F9E6]={
+ [0x1FB3E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9E6,
+ linebreak="al",
+ unicodeslot=0x1FB3E,
},
- [0x1F9E7]={
+ [0x1FB3F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9E7,
+ linebreak="al",
+ unicodeslot=0x1FB3F,
},
- [0x1F9E8]={
+ [0x1FB40]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9E8,
+ linebreak="al",
+ unicodeslot=0x1FB40,
},
- [0x1F9E9]={
+ [0x1FB41]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9E9,
+ linebreak="al",
+ unicodeslot=0x1FB41,
},
- [0x1F9EA]={
+ [0x1FB42]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9EA,
+ linebreak="al",
+ unicodeslot=0x1FB42,
},
- [0x1F9EB]={
+ [0x1FB43]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9EB,
+ linebreak="al",
+ unicodeslot=0x1FB43,
},
- [0x1F9EC]={
+ [0x1FB44]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9EC,
+ linebreak="al",
+ unicodeslot=0x1FB44,
},
- [0x1F9ED]={
+ [0x1FB45]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9ED,
+ linebreak="al",
+ unicodeslot=0x1FB45,
},
- [0x1F9EE]={
+ [0x1FB46]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9EE,
+ linebreak="al",
+ unicodeslot=0x1FB46,
},
- [0x1F9EF]={
+ [0x1FB47]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9EF,
+ linebreak="al",
+ unicodeslot=0x1FB47,
},
- [0x1F9F0]={
+ [0x1FB48]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9F0,
+ linebreak="al",
+ unicodeslot=0x1FB48,
},
- [0x1F9F1]={
+ [0x1FB49]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9F1,
+ linebreak="al",
+ unicodeslot=0x1FB49,
},
- [0x1F9F2]={
+ [0x1FB4A]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9F2,
+ linebreak="al",
+ unicodeslot=0x1FB4A,
},
- [0x1F9F3]={
+ [0x1FB4B]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9F3,
+ linebreak="al",
+ unicodeslot=0x1FB4B,
},
- [0x1F9F4]={
+ [0x1FB4C]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9F4,
+ linebreak="al",
+ unicodeslot=0x1FB4C,
},
- [0x1F9F5]={
+ [0x1FB4D]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9F5,
+ linebreak="al",
+ unicodeslot=0x1FB4D,
},
- [0x1F9F6]={
+ [0x1FB4E]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9F6,
+ linebreak="al",
+ unicodeslot=0x1FB4E,
},
- [0x1F9F7]={
+ [0x1FB4F]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9F7,
+ linebreak="al",
+ unicodeslot=0x1FB4F,
},
- [0x1F9F8]={
+ [0x1FB50]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9F8,
+ linebreak="al",
+ unicodeslot=0x1FB50,
},
- [0x1F9F9]={
+ [0x1FB51]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9F9,
+ linebreak="al",
+ unicodeslot=0x1FB51,
},
- [0x1F9FA]={
+ [0x1FB52]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9FA,
+ linebreak="al",
+ unicodeslot=0x1FB52,
},
- [0x1F9FB]={
+ [0x1FB53]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9FB,
+ linebreak="al",
+ unicodeslot=0x1FB53,
},
- [0x1F9FC]={
+ [0x1FB54]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9FC,
+ linebreak="al",
+ unicodeslot=0x1FB54,
},
- [0x1F9FD]={
+ [0x1FB55]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9FD,
+ linebreak="al",
+ unicodeslot=0x1FB55,
},
- [0x1F9FE]={
+ [0x1FB56]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9FE,
+ linebreak="al",
+ unicodeslot=0x1FB56,
},
- [0x1F9FF]={
+ [0x1FB57]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1F9FF,
+ linebreak="al",
+ unicodeslot=0x1FB57,
},
- [0x1FA00]={
+ [0x1FB58]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA00,
+ unicodeslot=0x1FB58,
},
- [0x1FA01]={
+ [0x1FB59]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA01,
+ unicodeslot=0x1FB59,
},
- [0x1FA02]={
+ [0x1FB5A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA02,
+ unicodeslot=0x1FB5A,
},
- [0x1FA03]={
+ [0x1FB5B]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA03,
+ unicodeslot=0x1FB5B,
},
- [0x1FA04]={
+ [0x1FB5C]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA04,
+ unicodeslot=0x1FB5C,
},
- [0x1FA05]={
+ [0x1FB5D]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA05,
+ unicodeslot=0x1FB5D,
},
- [0x1FA06]={
+ [0x1FB5E]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA06,
+ unicodeslot=0x1FB5E,
},
- [0x1FA07]={
+ [0x1FB5F]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA07,
+ unicodeslot=0x1FB5F,
},
- [0x1FA08]={
+ [0x1FB60]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA08,
+ unicodeslot=0x1FB60,
},
- [0x1FA09]={
+ [0x1FB61]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA09,
+ unicodeslot=0x1FB61,
},
- [0x1FA0A]={
+ [0x1FB62]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA0A,
+ unicodeslot=0x1FB62,
},
- [0x1FA0B]={
+ [0x1FB63]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA0B,
+ unicodeslot=0x1FB63,
},
- [0x1FA0C]={
+ [0x1FB64]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA0C,
+ unicodeslot=0x1FB64,
},
- [0x1FA0D]={
+ [0x1FB65]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA0D,
+ unicodeslot=0x1FB65,
},
- [0x1FA0E]={
+ [0x1FB66]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA0E,
+ unicodeslot=0x1FB66,
},
- [0x1FA0F]={
+ [0x1FB67]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA0F,
+ unicodeslot=0x1FB67,
},
- [0x1FA10]={
+ [0x1FB68]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA10,
+ unicodeslot=0x1FB68,
},
- [0x1FA11]={
+ [0x1FB69]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA11,
+ unicodeslot=0x1FB69,
},
- [0x1FA12]={
+ [0x1FB6A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA12,
+ unicodeslot=0x1FB6A,
},
- [0x1FA13]={
+ [0x1FB6B]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA13,
+ unicodeslot=0x1FB6B,
},
- [0x1FA14]={
+ [0x1FB6C]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA14,
+ unicodeslot=0x1FB6C,
},
- [0x1FA15]={
+ [0x1FB6D]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA15,
+ unicodeslot=0x1FB6D,
},
- [0x1FA16]={
+ [0x1FB6E]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA16,
+ unicodeslot=0x1FB6E,
},
- [0x1FA17]={
+ [0x1FB6F]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA17,
+ unicodeslot=0x1FB6F,
},
- [0x1FA18]={
+ [0x1FB70]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA18,
+ unicodeslot=0x1FB70,
},
- [0x1FA19]={
+ [0x1FB71]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA19,
+ unicodeslot=0x1FB71,
},
- [0x1FA1A]={
+ [0x1FB72]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA1A,
+ unicodeslot=0x1FB72,
},
- [0x1FA1B]={
+ [0x1FB73]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA1B,
+ unicodeslot=0x1FB73,
},
- [0x1FA1C]={
+ [0x1FB74]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA1C,
+ unicodeslot=0x1FB74,
},
- [0x1FA1D]={
+ [0x1FB75]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA1D,
+ unicodeslot=0x1FB75,
},
- [0x1FA1E]={
+ [0x1FB76]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA1E,
+ unicodeslot=0x1FB76,
},
- [0x1FA1F]={
+ [0x1FB77]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA1F,
+ unicodeslot=0x1FB77,
},
- [0x1FA20]={
+ [0x1FB78]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA20,
+ unicodeslot=0x1FB78,
},
- [0x1FA21]={
+ [0x1FB79]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA21,
+ unicodeslot=0x1FB79,
},
- [0x1FA22]={
+ [0x1FB7A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA22,
+ unicodeslot=0x1FB7A,
},
- [0x1FA23]={
+ [0x1FB7B]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA23,
+ unicodeslot=0x1FB7B,
},
- [0x1FA24]={
+ [0x1FB7C]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA24,
+ unicodeslot=0x1FB7C,
},
- [0x1FA25]={
+ [0x1FB7D]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA25,
+ unicodeslot=0x1FB7D,
},
- [0x1FA26]={
+ [0x1FB7E]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA26,
+ unicodeslot=0x1FB7E,
},
- [0x1FA27]={
+ [0x1FB7F]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA27,
+ unicodeslot=0x1FB7F,
},
- [0x1FA28]={
+ [0x1FB80]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA28,
+ unicodeslot=0x1FB80,
},
- [0x1FA29]={
+ [0x1FB81]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA29,
+ unicodeslot=0x1FB81,
},
- [0x1FA2A]={
+ [0x1FB82]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA2A,
+ unicodeslot=0x1FB82,
},
- [0x1FA2B]={
+ [0x1FB83]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA2B,
+ unicodeslot=0x1FB83,
},
- [0x1FA2C]={
+ [0x1FB84]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA2C,
+ unicodeslot=0x1FB84,
},
- [0x1FA2D]={
+ [0x1FB85]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA2D,
+ unicodeslot=0x1FB85,
},
- [0x1FA2E]={
+ [0x1FB86]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA2E,
+ unicodeslot=0x1FB86,
},
- [0x1FA2F]={
+ [0x1FB87]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA2F,
+ unicodeslot=0x1FB87,
},
- [0x1FA30]={
+ [0x1FB88]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA30,
+ unicodeslot=0x1FB88,
},
- [0x1FA31]={
+ [0x1FB89]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA31,
+ unicodeslot=0x1FB89,
},
- [0x1FA32]={
+ [0x1FB8A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA32,
+ unicodeslot=0x1FB8A,
},
- [0x1FA33]={
+ [0x1FB8B]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA33,
+ unicodeslot=0x1FB8B,
},
- [0x1FA34]={
+ [0x1FB8C]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA34,
+ unicodeslot=0x1FB8C,
},
- [0x1FA35]={
+ [0x1FB8D]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA35,
+ unicodeslot=0x1FB8D,
},
- [0x1FA36]={
+ [0x1FB8E]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA36,
+ unicodeslot=0x1FB8E,
},
- [0x1FA37]={
+ [0x1FB8F]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA37,
+ unicodeslot=0x1FB8F,
},
- [0x1FA38]={
+ [0x1FB90]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA38,
+ unicodeslot=0x1FB90,
},
- [0x1FA39]={
+ [0x1FB91]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA39,
+ unicodeslot=0x1FB91,
},
- [0x1FA3A]={
+ [0x1FB92]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA3A,
+ unicodeslot=0x1FB92,
},
- [0x1FA3B]={
+ [0x1FB94]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA3B,
+ unicodeslot=0x1FB94,
},
- [0x1FA3C]={
+ [0x1FB95]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA3C,
+ unicodeslot=0x1FB95,
},
- [0x1FA3D]={
+ [0x1FB96]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA3D,
+ unicodeslot=0x1FB96,
},
- [0x1FA3E]={
+ [0x1FB97]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA3E,
+ unicodeslot=0x1FB97,
},
- [0x1FA3F]={
+ [0x1FB98]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA3F,
+ unicodeslot=0x1FB98,
},
- [0x1FA40]={
+ [0x1FB99]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA40,
+ unicodeslot=0x1FB99,
},
- [0x1FA41]={
+ [0x1FB9A]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA41,
+ unicodeslot=0x1FB9A,
},
- [0x1FA42]={
+ [0x1FB9B]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA42,
+ unicodeslot=0x1FB9B,
},
- [0x1FA43]={
+ [0x1FB9C]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA43,
+ unicodeslot=0x1FB9C,
},
- [0x1FA44]={
+ [0x1FB9D]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA44,
+ unicodeslot=0x1FB9D,
},
- [0x1FA45]={
+ [0x1FB9E]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA45,
+ unicodeslot=0x1FB9E,
},
- [0x1FA46]={
+ [0x1FB9F]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA46,
+ unicodeslot=0x1FB9F,
},
- [0x1FA47]={
+ [0x1FBA0]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA47,
+ unicodeslot=0x1FBA0,
},
- [0x1FA48]={
+ [0x1FBA1]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA48,
+ unicodeslot=0x1FBA1,
},
- [0x1FA49]={
+ [0x1FBA2]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA49,
+ unicodeslot=0x1FBA2,
},
- [0x1FA4A]={
+ [0x1FBA3]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA4A,
+ unicodeslot=0x1FBA3,
},
- [0x1FA4B]={
+ [0x1FBA4]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA4B,
+ unicodeslot=0x1FBA4,
},
- [0x1FA4C]={
+ [0x1FBA5]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA4C,
+ unicodeslot=0x1FBA5,
},
- [0x1FA4D]={
+ [0x1FBA6]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA4D,
+ unicodeslot=0x1FBA6,
},
- [0x1FA4E]={
+ [0x1FBA7]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA4E,
+ unicodeslot=0x1FBA7,
},
- [0x1FA4F]={
+ [0x1FBA8]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA4F,
+ unicodeslot=0x1FBA8,
},
- [0x1FA50]={
+ [0x1FBA9]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA50,
+ unicodeslot=0x1FBA9,
},
- [0x1FA51]={
+ [0x1FBAA]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA51,
+ unicodeslot=0x1FBAA,
},
- [0x1FA52]={
+ [0x1FBAB]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA52,
+ unicodeslot=0x1FBAB,
},
- [0x1FA53]={
+ [0x1FBAC]={
category="so",
direction="on",
linebreak="al",
- unicodeslot=0x1FA53,
+ unicodeslot=0x1FBAC,
},
- [0x1FA60]={
+ [0x1FBAD]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA60,
+ linebreak="al",
+ unicodeslot=0x1FBAD,
},
- [0x1FA61]={
+ [0x1FBAE]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA61,
+ linebreak="al",
+ unicodeslot=0x1FBAE,
},
- [0x1FA62]={
+ [0x1FBAF]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA62,
+ linebreak="al",
+ unicodeslot=0x1FBAF,
},
- [0x1FA63]={
+ [0x1FBB0]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA63,
+ linebreak="al",
+ unicodeslot=0x1FBB0,
},
- [0x1FA64]={
+ [0x1FBB1]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA64,
+ linebreak="al",
+ unicodeslot=0x1FBB1,
},
- [0x1FA65]={
+ [0x1FBB2]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA65,
+ linebreak="al",
+ unicodeslot=0x1FBB2,
},
- [0x1FA66]={
+ [0x1FBB3]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA66,
+ linebreak="al",
+ unicodeslot=0x1FBB3,
},
- [0x1FA67]={
+ [0x1FBB4]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA67,
+ linebreak="al",
+ unicodeslot=0x1FBB4,
},
- [0x1FA68]={
+ [0x1FBB5]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA68,
+ linebreak="al",
+ unicodeslot=0x1FBB5,
},
- [0x1FA69]={
+ [0x1FBB6]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA69,
+ linebreak="al",
+ unicodeslot=0x1FBB6,
},
- [0x1FA6A]={
+ [0x1FBB7]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA6A,
+ linebreak="al",
+ unicodeslot=0x1FBB7,
},
- [0x1FA6B]={
+ [0x1FBB8]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA6B,
+ linebreak="al",
+ unicodeslot=0x1FBB8,
},
- [0x1FA6C]={
+ [0x1FBB9]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA6C,
+ linebreak="al",
+ unicodeslot=0x1FBB9,
},
- [0x1FA6D]={
+ [0x1FBBA]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA6D,
+ linebreak="al",
+ unicodeslot=0x1FBBA,
},
- [0x1FA70]={
+ [0x1FBBB]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA70,
+ linebreak="al",
+ unicodeslot=0x1FBBB,
},
- [0x1FA71]={
+ [0x1FBBC]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA71,
+ linebreak="al",
+ unicodeslot=0x1FBBC,
},
- [0x1FA72]={
+ [0x1FBBD]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA72,
+ linebreak="al",
+ unicodeslot=0x1FBBD,
},
- [0x1FA73]={
+ [0x1FBBE]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA73,
+ linebreak="al",
+ unicodeslot=0x1FBBE,
},
- [0x1FA78]={
+ [0x1FBBF]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA78,
+ linebreak="al",
+ unicodeslot=0x1FBBF,
},
- [0x1FA79]={
+ [0x1FBC0]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA79,
+ linebreak="al",
+ unicodeslot=0x1FBC0,
},
- [0x1FA7A]={
+ [0x1FBC1]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA7A,
+ linebreak="al",
+ unicodeslot=0x1FBC1,
},
- [0x1FA80]={
+ [0x1FBC2]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA80,
+ linebreak="al",
+ unicodeslot=0x1FBC2,
},
- [0x1FA81]={
+ [0x1FBC3]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA81,
+ linebreak="al",
+ unicodeslot=0x1FBC3,
},
- [0x1FA82]={
+ [0x1FBC4]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA82,
+ linebreak="al",
+ unicodeslot=0x1FBC4,
},
- [0x1FA90]={
+ [0x1FBC5]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA90,
+ linebreak="al",
+ unicodeslot=0x1FBC5,
},
- [0x1FA91]={
+ [0x1FBC6]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA91,
+ linebreak="al",
+ unicodeslot=0x1FBC6,
},
- [0x1FA92]={
+ [0x1FBC7]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA92,
+ linebreak="al",
+ unicodeslot=0x1FBC7,
},
- [0x1FA93]={
+ [0x1FBC8]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA93,
+ linebreak="al",
+ unicodeslot=0x1FBC8,
},
- [0x1FA94]={
+ [0x1FBC9]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA94,
+ linebreak="al",
+ unicodeslot=0x1FBC9,
},
- [0x1FA95]={
+ [0x1FBCA]={
category="so",
direction="on",
- linebreak="id",
- unicodeslot=0x1FA95,
+ linebreak="al",
+ unicodeslot=0x1FBCA,
+ },
+ [0x1FBF0]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x30 },
+ unicodeslot=0x1FBF0,
+ },
+ [0x1FBF1]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x31 },
+ unicodeslot=0x1FBF1,
+ },
+ [0x1FBF2]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x32 },
+ unicodeslot=0x1FBF2,
+ },
+ [0x1FBF3]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x33 },
+ unicodeslot=0x1FBF3,
+ },
+ [0x1FBF4]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x34 },
+ unicodeslot=0x1FBF4,
+ },
+ [0x1FBF5]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x35 },
+ unicodeslot=0x1FBF5,
+ },
+ [0x1FBF6]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x36 },
+ unicodeslot=0x1FBF6,
+ },
+ [0x1FBF7]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x37 },
+ unicodeslot=0x1FBF7,
+ },
+ [0x1FBF8]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x38 },
+ unicodeslot=0x1FBF8,
+ },
+ [0x1FBF9]={
+ category="nd",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x39 },
+ unicodeslot=0x1FBF9,
},
[0x2F800]={
category="lo",
@@ -203508,9 +209232,9 @@ return {
[0x853]=0x2,
[0x854]=0x3,
[0x855]=0x2,
- [0x856]=0x4,
- [0x857]=0x4,
- [0x858]=0x4,
+ [0x856]=0x3,
+ [0x857]=0x3,
+ [0x858]=0x3,
[0x860]=0x2,
[0x861]=0x4,
[0x862]=0x2,
@@ -203551,6 +209275,16 @@ return {
[0x8BB]=0x2,
[0x8BC]=0x2,
[0x8BD]=0x2,
+ [0x8BE]=0x2,
+ [0x8BF]=0x2,
+ [0x8C0]=0x2,
+ [0x8C1]=0x2,
+ [0x8C2]=0x2,
+ [0x8C3]=0x2,
+ [0x8C4]=0x2,
+ [0x8C5]=0x2,
+ [0x8C6]=0x2,
+ [0x8C7]=0x2,
[0x8E2]=0x4,
[0x1806]=0x4,
[0x1807]=0x2,
@@ -203873,6 +209607,34 @@ return {
[0x10F52]=0x2,
[0x10F53]=0x2,
[0x10F54]=0x3,
+ [0x10FB0]=0x2,
+ [0x10FB1]=0x4,
+ [0x10FB2]=0x2,
+ [0x10FB3]=0x2,
+ [0x10FB4]=0x3,
+ [0x10FB5]=0x3,
+ [0x10FB6]=0x3,
+ [0x10FB7]=0x4,
+ [0x10FB8]=0x2,
+ [0x10FB9]=0x3,
+ [0x10FBA]=0x3,
+ [0x10FBB]=0x2,
+ [0x10FBC]=0x2,
+ [0x10FBD]=0x3,
+ [0x10FBE]=0x2,
+ [0x10FBF]=0x2,
+ [0x10FC0]=0x4,
+ [0x10FC1]=0x2,
+ [0x10FC2]=0x3,
+ [0x10FC3]=0x3,
+ [0x10FC4]=0x2,
+ [0x10FC5]=0x4,
+ [0x10FC6]=0x4,
+ [0x10FC7]=0x4,
+ [0x10FC8]=0x4,
+ [0x10FC9]=0x3,
+ [0x10FCA]=0x2,
+ [0x10FCB]=0x1,
[0x110BD]=0x4,
[0x110CD]=0x4,
[0x1E900]=0x2,
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-colors.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-colors.lua
index 2569eb1b48e..52d38a7eecf 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-colors.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-colors.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-colors",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / color",
license = "GPL v2.0",
author = "Khaled Hosny, Elie Roux, Philipp Gesang, Dohyun Kim, David Carlisle",
@@ -59,55 +59,24 @@ local identifiers = fonts.hashes.identifiers
local add_color_callback --[[ this used to be a global‽ ]]
--[[doc--
-This converts a single octet into a decimal with three digits of
-precision. The optional second argument limits precision to a single
-digit.
---doc]]--
-
---- string -> bool? -> string
-local hex_to_dec = function (hex,one) --- one isn’t actually used anywhere ...
- if one then
- return stringformat("%.1g", tonumber(hex, 16)/255)
- else
- return stringformat("%.3g", tonumber(hex, 16)/255)
- end
-end
-
---[[doc--
-Color string validator / parser.
+Color string parser.
--doc]]--
local lpeg = require"lpeg"
local lpegmatch = lpeg.match
local C, Cg, Ct, P, R, S = lpeg.C, lpeg.Cg, lpeg.Ct, lpeg.P, lpeg.R, lpeg.S
+local spaces = S"\t "^0
local digit16 = R("09", "af", "AF")
local opaque = S("fF") * S("fF")
-local octet = C(digit16 * digit16)
-
-local p_rgb = octet * octet * octet
-local p_rgba = p_rgb * (octet - opaque)
-local valid_digits = C(p_rgba + p_rgb) -- matches eight or six hex digits
-
-local p_Crgb = Cg(octet/hex_to_dec, "red") --- for captures
- * Cg(octet/hex_to_dec, "green")
- * Cg(octet/hex_to_dec, "blue")
-local p_Crgba = p_Crgb * Cg(octet/hex_to_dec, "alpha")
-local extract_color = Ct(p_Crgba + p_Crgb)
-
---- string -> (string | nil)
-local sanitize_color_expression = function (digits)
- digits = tostring(digits)
- local sanitized = lpegmatch(valid_digits, digits)
- if not sanitized then
- logreport("both", 0, "color",
- "%q is not a valid rgb[a] color expression",
- digits)
- return nil
- end
- return sanitized
+local octet = digit16 * digit16 / function(s)
+ return tonumber(s, 16) / 255
end
+local extract_color = spaces * octet * octet * octet / function(r,g,b)
+ return stringformat("%.3g %.3g %.3g rg", r, g, b)
+ end * (opaque + octet)^-1 * spaces * -1
+
--- something is carried around in ``res``
--- for later use by color_handler() --- but what?
@@ -115,48 +84,37 @@ local res = nil
--- float -> unit
local function pageresources(alpha)
- res = res or {}
- res[alpha] = true
+ res = res or {true} -- Initialize with /TransGs1
+ local f = res[alpha]
+ or stringformat("/TransGs%.3g gs", alpha, alpha)
+ res[alpha] = f
+ return f
end
---- we store results of below color handler as tuples of
---- push/pop strings
-local color_cache = { } --- (string, (string * string)) hash_t
-
---- string -> (string * string)
-local hex_to_rgba = function (digits)
- if not digits then
+--- string -> (string | nil)
+local function sanitize_color_expression (digits)
+ digits = tostring(digits)
+ local rgb, a = lpegmatch(extract_color, digits)
+ if not rgb then
+ logreport("both", 0, "color",
+ "%q is not a valid rgb[a] color expression",
+ digits)
return
end
+ return rgb, (a and pageresources(a))
+end
- --- this is called like a thousand times, so some
- --- memoizing is in order.
- local cached = color_cache[digits]
- if not cached then
- local push, pop
- local rgb = lpegmatch(extract_color, digits)
- if rgb.alpha then
- pageresources(rgb.alpha)
- push = stringformat(
- "/TransGs%g gs %s %s %s rg",
- rgb.alpha,
- rgb.red,
- rgb.green,
- rgb.blue)
- pop = "0 g /TransGs1 gs"
- else
- push = stringformat(
- "%s %s %s rg",
- rgb.red,
- rgb.green,
- rgb.blue)
- pop = "0 g"
- end
- color_cache[digits] = { push, pop }
- return push, pop
- end
-
- return cached[1], cached[2]
+local color_stack = 0
+-- Beside maybe allowing {transpareny} package compatibility at some
+-- point, this ensures that the stack is only created if it is actually
+-- needed. Especially important because it adds /TransGs1 gs to every page
+local function transparent_stack()
+ -- if token.is_defined'TRP@colorstack' then -- transparency
+ -- transparent_stack = tonumber(token.get_macro'TRP@colorstack')
+ -- else
+ transparent_stack = pdf.newcolorstack("/TransGs1 gs","direct",true)
+ -- end
+ return transparent_stack
end
--- Luatex internal types
@@ -167,50 +125,44 @@ local hlist_t = nodetype("hlist")
local vlist_t = nodetype("vlist")
local whatsit_t = nodetype("whatsit")
local disc_t = nodetype("disc")
-local pdfliteral_t = node.subtype("pdf_literal")
local colorstack_t = node.subtype("pdf_colorstack")
-local mlist_to_hlist = node.mlist_to_hlist
local color_callback
local color_attr = luatexbase.new_attribute("luaotfload_color_attribute")
--- (node * node * string * bool * (bool | nil)) -> (node * node * (string | nil))
-local color_whatsit
-color_whatsit = function (head, curr, color, push, tail)
- local pushdata = hex_to_rgba(color)
+local custom_setcolor
+
+-- Pass nil for new_color or old_color to indicate no color
+-- If color is nil, pass tail to decide where to add whatsit
+local function color_whatsit (head, curr, stack, old_color, new_color, tail)
+ if new_color == old_color then
+ return head, curr, old_color
+ end
local colornode = newnode(whatsit_t, colorstack_t)
- setfield(colornode, "stack", 0)
- setfield(colornode, "command", push and 1 or 2) -- 1: push, 2: pop
- setfield(colornode, "data", push and pushdata or nil)
+ setfield(colornode, "stack", tonumber(stack) or stack())
+ setfield(colornode, "command", new_color and (old_color and 0 or 1) or 2) -- 1: push, 2: pop
+ setfield(colornode, "data", new_color) -- Is nil for pop
if tail then
head, curr = insert_node_after (head, curr, colornode)
else
head = insert_node_before(head, curr, colornode)
end
- if not push and color:len() > 6 then
- local colornode = newnode(whatsit_t, pdfliteral_t)
- setfield(colornode, "mode", 2)
- setfield(colornode, "data", "/TransGs1 gs")
- if tail then
- head, curr = insert_node_after (head, curr, colornode)
- else
- head = insert_node_before(head, curr, colornode)
- end
- end
- color = push and color or nil
- return head, curr, color
+ return head, curr, new_color
end
-- number -> string | nil
-local get_glyph_color = function (font_id, char)
+local function get_glyph_color (font_id, char)
local tfmdata = identifiers[font_id]
- local font_color = tfmdata and tfmdata.properties and tfmdata.properties.color
+ local properties = tfmdata and tfmdata.properties
+ local font_color = properties and properties.color_rgb
+ local font_transparent = properties and properties.color_a
if type(font_color) == "table" then
local char_tbl = tfmdata.characters[char]
char = char_tbl and (char_tbl.index or char)
- return char and font_color[char] or font_color.default
+ font_color = char and font_color[char] or font_color.default
+ font_transparent = font_transparent and (char and font_transparent[char] or font_transparent.default)
end
- return font_color
+ return font_color, font_transparent
end
--[[doc--
@@ -220,8 +172,7 @@ values during the node list traversal.
--doc]]--
--- (node * (string | nil)) -> (node * (string | nil))
-local node_colorize
-node_colorize = function (head, toplevel, current_color)
+local function node_colorize (head, toplevel, current_color, current_transparent)
local n = head
while n do
local n_id = getid(n)
@@ -229,70 +180,60 @@ node_colorize = function (head, toplevel, current_color)
if n_id == hlist_t or n_id == vlist_t then
local n_list = getlist(n)
if getattribute(n_list, color_attr) then
- if current_color then
- head, n, current_color = color_whatsit(head, n, current_color, false)
- end
+ head, n, current_color = color_whatsit(head, n, color_stack, current_color, nil)
+ head, n, current_transparent = color_whatsit(head, n, transparent_stack, current_transparent, nil)
else
- n_list, current_color = node_colorize(n_list, false, current_color)
- if current_color and getsubtype(n) == 1 then -- created by linebreak
- n_list, _, current_color = color_whatsit(n_list, nodetail(n_list), current_color, false, true)
+ n_list, current_color, current_transparent = node_colorize(n_list, false, current_color, current_transparent)
+ if getsubtype(n) == 1 then -- created by linebreak
+ local nn = nodetail(n_list)
+ n_list, nn, current_color = color_whatsit(n_list, nn, color_stack, current_color, nil, true)
+ n_list, nn, current_transparent = color_whatsit(n_list, nn, transparent_stack, current_transparent, nil, true)
end
setfield(n, "head", n_list)
end
elseif n_id == disc_t then
local n_pre, n_post, n_replace = getdisc(n)
- n_replace, current_color = node_colorize(n_replace, false, current_color)
+ n_replace, current_color, current_transparent = node_colorize(n_replace, false, current_color, current_transparent)
setdisc(n, n_pre, n_post, n_replace)
elseif n_id == glyph_t then
--- colorization is restricted to those fonts
--- that received the “color” property upon
--- loading (see ``setcolor()`` above)
- local glyph_color = get_glyph_color(getfont(n), getchar(n))
- if glyph_color ~= current_color then
- if current_color then
- head, n, current_color = color_whatsit(head, n, current_color, false)
- end
+ local glyph_color, glyph_transparent = get_glyph_color(getfont(n), getchar(n))
+ if custom_setcolor then
if glyph_color then
- head, n, current_color = color_whatsit(head, n, glyph_color, true)
+ head, n = custom_setcolor(head, n, glyph_color) -- Don't change current_color to transform all other color_whatsit calls into noops
end
+ else
+ head, n, current_color = color_whatsit(head, n, color_stack, current_color, glyph_color)
end
-
- if current_color and color_callback == "pre_linebreak_filter" then
- local nn = getnext(n)
- while nn and getid(nn) == glyph_t do
- local glyph_color = get_glyph_color(getfont(nn), getchar(nn))
- if glyph_color == current_color then
- n = nn
- else
- break
- end
- nn = getnext(nn)
- end
- if getid(nn) == disc_t then
- head, n, current_color = color_whatsit(head, nn, current_color, false, true)
- else
- head, n, current_color = color_whatsit(head, n, current_color, false, true)
+ if custom_settransparent then
+ if glyph_transparent then
+ head, n = custom_settransparent(head, n, glyph_transparent) -- Don't change current_transparent to transform all other color_whatsit calls into noops
end
+ else
+ head, n, current_transparent = color_whatsit(head, n, transparent_stack, current_transparent, glyph_transparent)
end
elseif n_id == whatsit_t then
- if current_color then
- head, n, current_color = color_whatsit(head, n, current_color, false)
- end
+ head, n, current_color = color_whatsit(head, n, color_stack, current_color, nil)
+ head, n, current_transparent = color_whatsit(head, n, transparent_stack, current_transparent, nil)
end
n = getnext(n)
end
- if toplevel and current_color then
- head, _, current_color = color_whatsit(head, nodetail(head), current_color, false, true)
+ if toplevel then
+ local nn = nodetail(head)
+ head, nn, current_color = color_whatsit(head, nn, color_stack, current_color, nil, true)
+ head, nn, current_transparent = color_whatsit(head, nn, transparent_stack, current_transparent, nil, true)
end
setattribute(head, color_attr, 1)
- return head, current_color
+ return head, current_color, current_transparent
end
local getpageres = pdf.getpageresources or function() return pdf.pageresources end
@@ -302,23 +243,23 @@ local gettoks, scantoks = tex.gettoks, tex.scantoks
local pgf = { bye = "pgfutil@everybye", extgs = "\\pgf@sys@addpdfresource@extgs@plain" }
--- node -> node
-local color_handler = function (head)
+local function color_handler (head)
head = todirect(head)
head = node_colorize(head, true)
head = tonode(head)
-- now append our page resources
- if res then
- res["1"] = true
- if scantoks and pgf.bye and not pgf.loaded then
+ if res and tonumber(transparent_stack) then
+ if scantoks and nil == pgf.loaded then
pgf.loaded = token.create(pgf.bye).cmdname == "assign_toks"
- pgf.bye = pgf.loaded and pgf.bye
end
- local tpr = pgf.loaded and gettoks(pgf.bye) or getpageres() or ""
+ local tpr = pgf.loaded and gettoks(pgf.bye) or -- PGF
+ -- token.is_defined'TRP@list' and token.get_macro'TRP@list' or -- transparency
+ getpageres() or ""
local t = ""
for k in pairs(res) do
- local str = stringformat("/TransGs%s<>", k, k) -- don't touch stroking elements
+ local str = stringformat("/TransGs%.3g<>", k, k) -- don't touch stroking elements
if not tpr:find(str) then
t = t .. str
end
@@ -326,6 +267,8 @@ local color_handler = function (head)
if t ~= "" then
if pgf.loaded then
scantoks("global", pgf.bye, catat11, stringformat("%s{%s}%s", pgf.extgs, t, tpr))
+ -- elseif token.is_defined'TRP@list' then
+ -- token.set_macro('TRP@list', t .. tpr, 'global')
else
local tpr, n = tpr:gsub("/ExtGState<<", "%1"..t)
if n == 0 then
@@ -343,12 +286,6 @@ local color_callback_name = "luaotfload.color_handler"
local color_callback_activated = 0
local add_to_callback = luatexbase.add_to_callback
---- unit -> bool
-local mlist_to_hlist_initial = function ()
- local cdesc = luatexbase.callback_descriptions "mlist_to_hlist"
- return cdesc and cdesc[1] == color_callback_name
-end
-
--- unit -> unit
add_color_callback = function ( )
color_callback = config.luaotfload.run.color_callback
@@ -370,11 +307,8 @@ add_color_callback = function ( )
return head
end,
color_callback_name)
- add_to_callback("mlist_to_hlist",
- function (head, display_type, need_penalties)
- if mlist_to_hlist_initial () then
- head = mlist_to_hlist(head, display_type, need_penalties)
- end
+ add_to_callback("post_mlist_to_hlist_filter",
+ function (head, display_type)
if display_type == "text" then
return head
end
@@ -403,10 +337,10 @@ local glyph_color_tables = { }
-- and node and difficulties with getting the mapped unicode value for
-- a GID.
local function setcolor (tfmdata, value)
- local sanitized
+ local sanitized_rgb, sanitized_a
local color_table = glyph_color_tables[tonumber(value) or value]
if color_table then
- sanitized = {}
+ sanitized_rgb = {}
local unicodes = tfmdata.resources.unicodes
local gid_mapping = {}
local descriptions = tfmdata.descriptions or tfmdata.characters
@@ -419,7 +353,13 @@ local function setcolor (tfmdata, value)
gid = desc and (desc.index or unicode)
end
if gid then
- sanitized[gid] = sanitize_color_expression(color)
+ local a
+ sanitized_rgb[gid], a
+ = sanitize_color_expression(color)
+ if a then
+ sanitized_a = sanitized_a or {}
+ sanitized_a[gid] = a
+ end
else
-- TODO: ??? Error out, warn or just ignore? Ignore
-- makes sense because we have to ignore for GIDs
@@ -428,12 +368,12 @@ local function setcolor (tfmdata, value)
end
end
else
- sanitized = sanitize_color_expression(value)
+ sanitized_rgb, sanitized_a = sanitize_color_expression(value)
end
local properties = tfmdata.properties
- if sanitized then
- properties.color = sanitized
+ if sanitized_rgb then
+ properties.color_rgb, properties.color_a = sanitized_rgb, sanitized_a
add_color_callback()
end
end
@@ -449,6 +389,14 @@ function luaotfload.add_colorscheme(name, colortable)
return name
end
+-- cb must have the signature
+-- head, n = cb(head, n, color)
+-- and apply the PDF color operators in color to the node n.
+-- Call with nil to disable.
+function luaotfload.set_colorhandler(cb)
+ custom_setcolor = cb
+end
+
return function ()
logreport = luaotfload.log.report
if not fonts then
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-configuration.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-configuration.lua
index b6b214c249f..736b9c64d3f 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-configuration.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-configuration.lua
@@ -7,8 +7,8 @@
local ProvidesLuaModule = {
name = "luaotfload-configuration",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / config file reader",
license = "GPL v2.0"
}
@@ -137,7 +137,7 @@ local feature_presets = {
--doc]]--
-local default_fontloader = function ()
+local function default_fontloader ()
return luaotfloadstatus and luaotfloadstatus.notes.loader or "reference"
end
@@ -148,10 +148,10 @@ local registered_loaders = {
context = "context",
}
-local pick_fontloader = function (s)
+local function pick_fontloader (s)
local ldr = registered_loaders[s]
if ldr ~= nil and type (ldr) == "string" then
- logreport ("log", 2, "conf", "Using predefined fontloader \"%s\".", ldr)
+ logreport ("log", 2, "conf", "Using predefined fontloader %q.", ldr)
return ldr
end
local idx = stringfind (s, ":")
@@ -159,17 +159,17 @@ local pick_fontloader = function (s)
if stringsub (s, 1, idx - 1) == "context" then
local pth = stringsub (s, idx + 1)
pth = stringstrip (pth)
- logreport ("log", 2, "conf", "Context base path specified at \"%s\".", pth)
+ logreport ("log", 2, "conf", "Context base path specified at %q.", pth)
if lfsisdir (pth) then
- logreport ("log", 5, "conf", "Context base path exists at \"%s\".", pth)
+ logreport ("log", 5, "conf", "Context base path exists at %q.", pth)
return pth
end
pth = kpseexpand_path (pth)
if lfsisdir (pth) then
- logreport ("log", 5, "conf", "Context base path exists at \"%s\".", pth)
+ logreport ("log", 5, "conf", "Context base path exists at %q.", pth)
return pth
end
- logreport ("both", 0, "conf", "Context base path not found at \"%s\".", pth)
+ logreport ("both", 0, "conf", "Context base path not found at %q.", pth)
end
end
return nil
@@ -281,7 +281,7 @@ local min_terminal_width = 40
--- The “termwidth” value is only considered when printing
--- short status messages, e.g. when building the database
--- online.
-local check_termwidth = function ()
+local function check_termwidth ()
if config.luaotfload.misc.termwidth == nil then
local tw = 79
if not ( os.type == "windows" --- Assume broken terminal.
@@ -306,7 +306,7 @@ local check_termwidth = function ()
return true
end
-local set_font_filter = function ()
+local function set_font_filter ()
local names = fonts.names
if names and names.set_font_filter then
local formats = config.luaotfload.db.formats
@@ -318,7 +318,7 @@ local set_font_filter = function ()
return true
end
-local set_size_dimension = function ()
+local function set_size_dimension ()
local names = fonts.names
if names and names.set_size_dimension then
local dim = config.luaotfload.db.designsize_dimen
@@ -330,7 +330,7 @@ local set_size_dimension = function ()
return true
end
-local set_name_resolver = function ()
+local function set_name_resolver ()
local names = fonts.names
if names and names.resolve_cached then
--- replace the resolver from luatex-fonts
@@ -344,7 +344,7 @@ local set_name_resolver = function ()
return true
end
-local set_loglevel = function ()
+local function set_loglevel ()
if luaotfload then
luaotfload.log.set_loglevel (config.luaotfload.run.log_level)
return true
@@ -352,7 +352,7 @@ local set_loglevel = function ()
return false
end
-local build_cache_paths = function ()
+local function build_cache_paths ()
local paths = config.luaotfload.paths
local prefix = getwritablepath (paths.names_dir, "")
@@ -362,7 +362,7 @@ local build_cache_paths = function ()
end
prefix = lpegmatch (stripslashes, prefix)
- logreport ("log", 0, "conf", "Root cache directory is %s.", prefix)
+ logreport ("log", 0, "conf", "Root cache directory is %q.", prefix)
local index_file = filejoin (prefix, paths.index_file)
local lookups_file = filejoin (prefix, paths.lookups_file)
@@ -376,7 +376,7 @@ local build_cache_paths = function ()
end
-local set_default_features = function ()
+local function set_default_features ()
local default_features = config.luaotfload.default_features
luaotfload.features = luaotfload.features or {
global = { },
@@ -413,14 +413,14 @@ local number_t = "number"
local boolean_t = "boolean"
local function_t = "function"
-local tointeger = function (n)
+local function tointeger (n)
n = tonumber (n)
if n then
return mathfloor (n + 0.5)
end
end
-local toarray = function (s)
+local function toarray (s)
local fields = { lpegmatch (commasplitter, s) }
local ret = { }
for i = 1, #fields do
@@ -432,7 +432,7 @@ local toarray = function (s)
return ret
end
-local tohash = function (s)
+local function tohash (s)
local result = { }
local fields = toarray (s)
for _, field in next, fields do
@@ -571,7 +571,7 @@ local option_spec = {
return ldr
end
logreport ("log", 0, "conf",
- "Requested fontloader \"%s\" not defined, "
+ "Requested fontloader %q not defined, "
.. "use at your own risk.",
id)
return id
@@ -590,12 +590,12 @@ local option_spec = {
local cb = permissible_color_callbacks[cb_spec]
if cb then
logreport ("log", 3, "conf",
- "Using callback \"%s\" for font colorization.",
+ "Using callback %q for font colorization.",
cb)
return cb
end
logreport ("log", 0, "conf",
- "Requested callback identifier \"%s\" invalid, "
+ "Requested callback identifier %q invalid, "
.. "falling back to default.",
cb_spec)
return permissible_color_callbacks.default
@@ -637,32 +637,32 @@ local option_spec = {
--- FORMATTERS
-------------------------------------------------------------------------------
-local commented = function (str)
+local function commented (str)
return ";" .. str
end
local underscore_replacer = lpeg.replacer ("_", "-", true)
-local dashed = function (var)
+local function dashed (var)
--- INI spec dictates that dashes are valid in variable names, not
--- underscores.
return underscore_replacer (var) or var
end
local indent = " "
-local format_string = function (var, val)
+local function format_string (var, val)
return stringformat (indent .. "%s = %s", var, val)
end
-local format_integer = function (var, val)
+local function format_integer (var, val)
return stringformat (indent .. "%s = %d", var, val)
end
-local format_boolean = function (var, val)
+local function format_boolean (var, val)
return stringformat (indent .. "%s = %s", var, val == true and "true" or "false")
end
-local format_keyval = function (var, val)
+local function format_keyval (var, val)
local list = { }
local keys = table.sortedkeys (val)
for i = 1, #keys do
@@ -681,7 +681,7 @@ local format_keyval = function (var, val)
end
end
-local format_list = function (var, val)
+local function format_list (var, val)
local elts = { }
for i = 1, #val do elts [i] = val [i] end
if next (elts) then
@@ -690,7 +690,7 @@ local format_list = function (var, val)
end
end
-local format_section = function (title)
+local function format_section (title)
return stringformat ("[%s]", dashed (title))
end
@@ -764,7 +764,7 @@ local formatters = {
--doc]]--
-local tilde_expand = function (p)
+local function tilde_expand (p)
if #p > 2 then
if stringsub (p, 1, 2) == "~/" then
local homedir = osgetenv "HOME"
@@ -776,7 +776,7 @@ local tilde_expand = function (p)
return p
end
-local resolve_config_path = function ()
+local function resolve_config_path ()
for i = 1, #config_paths do
local t, p = unpack (config_paths[i])
local fullname
@@ -799,7 +799,7 @@ local resolve_config_path = function ()
return false
end
-local add_config_paths = function (t)
+local function add_config_paths (t)
if not next (t) then
return
end
@@ -887,8 +887,7 @@ local process_options = function (opts)
return new
end
-local apply
-apply = function (old, new)
+local function apply (old, new)
if not new then
if not old then
return false
@@ -916,7 +915,7 @@ apply = function (old, new)
return result
end
-local reconfigure = function ()
+local function reconfigure()
for i = 1, #reconf_tasks do
local name, task = unpack (reconf_tasks[i])
logreport ("both", 3, "conf", "Launch post-configuration task %q.", name)
@@ -928,7 +927,7 @@ local reconfigure = function ()
return true
end
-local read = function (extra)
+local function read (extra)
if extra then
add_config_paths (extra)
end
@@ -960,7 +959,7 @@ local read = function (extra)
return ret
end
-local apply_defaults = function ()
+local function apply_defaults ()
local defaults = default_config
local vars = read ()
--- Side-effects galore ...
@@ -968,7 +967,7 @@ local apply_defaults = function ()
return reconfigure ()
end
-local dump = function ()
+local function dump ()
local sections = table.sortedkeys (config.luaotfload)
local confdata = { }
for i = 1, #sections do
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-database.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-database.lua
index f4bace8b44e..11f3d911420 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-database.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-database.lua
@@ -5,8 +5,8 @@
do -- block to avoid to many local variables error
local ProvidesLuaModule = {
name = "luaotfload-database",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / database",
license = "GPL v2.0",
author = "Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger",
@@ -211,7 +211,7 @@ local name_index = nil --> upvalue for names.data
local lookup_cache = nil --> for names.lookups
--- string -> (string * string)
-local make_luanames = function (path)
+local function make_luanames (path)
return filereplacesuffix(path, "lua"),
filereplacesuffix(path, "luc")
end
@@ -224,7 +224,7 @@ local location_precedence = {
"local", "system", "texmf",
}
-local set_location_precedence = function (precedence)
+local function set_location_precedence (precedence)
location_precedence = precedence
end
@@ -282,7 +282,7 @@ local macroman2utf8 do
return utf8.char(table.unpack(bytes))
end
end
-local sanitize_fontname = function (str)
+local function sanitize_fontname (str)
if str ~= nil then
str = utf8len(str) and str or macroman2utf8(str)
str = alphnum_only(casefold(str, true))
@@ -291,7 +291,7 @@ local sanitize_fontname = function (str)
return nil
end
-local sanitize_fontnames = function (rawnames)
+local function sanitize_fontnames (rawnames)
local result = { }
for category, namedata in next, rawnames do
@@ -310,8 +310,7 @@ local sanitize_fontnames = function (rawnames)
return result
end
-local find_files_indeed
-find_files_indeed = function (acc, dirs, filter)
+local function find_files_indeed (acc, dirs, filter)
if not next (dirs) then --- done
return acc
end
@@ -343,14 +342,14 @@ find_files_indeed = function (acc, dirs, filter)
return find_files_indeed (acc, dirs, filter)
end
-local dummyfilter = function () return true end
+local function dummyfilter () return true end
--- the optional filter function receives the full path of a file
--- system entity. a filter applies if the first argument it returns is
--- true.
--- string -> function? -> string list
-local find_files = function (root, filter)
+local function find_files (root, filter)
if lfsisdir (root) then
return find_files_indeed ({}, { root }, filter or dummyfilter)
end
@@ -467,7 +466,7 @@ mtx-fonts has in names.tma:
--- string list -> string option -> dbobj
-local initialize_namedata = function (formats, created)
+local function initialize_namedata (formats, created)
local now = os.date "%Y-%m-%d %H:%M:%S" --- i. e. "%F %T" on POSIX systems
return {
status = { }, -- was: status; map abspath -> mapping
@@ -489,7 +488,7 @@ end
--- .luc.
--- string -> (string * table)
-local load_lua_file = function (path)
+local function load_lua_file (path)
local foundname = filereplacesuffix (path, "luc")
local code = nil
@@ -632,8 +631,7 @@ getmetadata = function ()
end
--- unit -> unit
-local load_lookups
-load_lookups = function ( )
+local function load_lookups ( )
local foundname, data = load_lua_file(config.luaotfload.paths.lookup_path_lua)
if data then
logreport ("log", 0, "cache", "Lookup cache loaded from %s.", foundname)
@@ -671,7 +669,7 @@ local casefold_search =
[(kpse.var_value'texmf_casefold_search' or '1'):sub(1,1)]
-- /MK
-local lookup_filename = function (filename)
+local function lookup_filename (filename)
if not name_index then name_index = load_names () end
local files = name_index.files
local basedata = files.base
@@ -778,7 +776,7 @@ end
--doc]]--
--- int -> bool * (string * int) option
-local get_font_file = function (index)
+local function get_font_file (index)
local entry = name_index.mappings [index]
if not entry then
return false
@@ -804,7 +802,7 @@ the texmf or filesystem. Again, due to the schizoprenic nature of the
font managment we have to check both the system path and the texmf.
--doc]]--
-local verify_font_file = function (basename)
+local function verify_font_file (basename)
local path = lookup_fullpath (basename)
if path and lfsisfile(path) then
return true
@@ -855,7 +853,7 @@ local hash_fields = {
local n_hash_fields = #hash_fields
--- spec -> string
-local hash_request = function (specification)
+local function hash_request (specification)
local key = { } --- segments of the hash
for i=1, n_hash_fields do
local field = specification[hash_fields[i]]
@@ -867,8 +865,7 @@ local hash_request = function (specification)
end
--- 'a -> 'a -> table -> (string * int|boolean * boolean)
-local lookup_font_name_cached
-lookup_font_name_cached = function (specification)
+local function lookup_font_name_cached (specification)
if not lookup_cache then load_lookups () end
local request = hash_request(specification)
logreport ("both", 4, "cache", "Looking for %q in cache ...",
@@ -916,7 +913,7 @@ end
--- this used to be inlined; with the lookup cache we don’t
--- have to be parsimonious wrt function calls anymore
--- “found” is the match accumulator
-local add_to_match = function (found, size, face)
+local function add_to_match (found, size, face)
local continue = true
@@ -944,7 +941,7 @@ local add_to_match = function (found, size, face)
return found, continue
end
-local choose_closest = function (distances)
+local function choose_closest (distances)
local closest = 2^51
local match
for i = 1, #distances do
@@ -1042,7 +1039,7 @@ end
--doc]]--
--- spec -> string -> string -> int -> string * int * bool
-local lookup_familyname = function (specification, name, style, askedsize)
+local function lookup_familyname (specification, name, style, askedsize)
local families = name_index.families
local mappings = name_index.mappings
local candidates = nil
@@ -1083,7 +1080,7 @@ local lookup_familyname = function (specification, name, style, askedsize)
return resolved, subfont, fallback
end
-local lookup_fontname = function (specification, name)
+local function lookup_fontname (specification, name)
local mappings = name_index.mappings
local fallback = nil
local lastresort = nil
@@ -1142,7 +1139,7 @@ do
design_size_dimension = dimens.bp
- set_size_dimension = function (dim)
+ function set_size_dimension (dim)
local conv = dimens [dim]
if conv ~= nil then
logreport ("both", 4, "db",
@@ -1306,7 +1303,7 @@ reload_db = function (why, caller, ...)
end
--- string -> string -> int
-local iterative_levenshtein = function (s1, s2)
+local function iterative_levenshtein (s1, s2)
local costs = { }
local len1, len2 = #s1, #s2
@@ -1334,7 +1331,7 @@ local iterative_levenshtein = function (s1, s2)
end
--- string list -> string list
-local delete_dupes = function (lst)
+local function delete_dupes (lst)
local n0 = #lst
if n0 == 0 then return lst end
tablesort (lst)
@@ -1413,7 +1410,7 @@ find_closest = function (name, limit)
local dist = distances[i]
local namelst = delete_dupes (by_distance[dist])
logreport (false, 0, "query",
- "Distance from \"%s\": %s\n "
+ "Distance from %q: %s\n "
.. tableconcat (namelst, "\n "),
name, dist)
end
@@ -1424,7 +1421,7 @@ find_closest = function (name, limit)
end --- find_closest()
--- string -> uint -> bool * (string | rawdata)
-local read_font_file = function (filename, subfont)
+local function read_font_file (filename, subfont)
local fontdata = otfhandler.readers.getinfo (filename,
{ subfont = subfont
, platformnames = true
@@ -1437,7 +1434,7 @@ local read_font_file = function (filename, subfont)
return true, fontdata
end
-local load_font_file = function (filename, subfont)
+local function load_font_file (filename, subfont)
local err, ret = read_font_file (filename, subfont)
if err == false then
logreport ("both", 1, "db", "ERROR: failed to open %q: %q.",
@@ -1457,7 +1454,7 @@ local get_size_info do --- too many upvalues :/
local sp = 2^16 -- pt
local bp = 7227 / 7200 -- pt
- get_size_info = function (rawinfo)
+ function get_size_info (rawinfo)
local design_size = rawinfo.design_size
local design_range_top = rawinfo.design_range_top
local design_range_bottom = rawinfo.design_range_bottom
@@ -1491,7 +1488,7 @@ end ---[local get_size_info]
stick to that part.
--doc]]--
-local get_english_names = function (metadata)
+local function get_english_names (metadata)
local namesource
local platformnames = metadata.platformnames
--[[--
@@ -1538,7 +1535,7 @@ end
For this reason we copy what is necessary whilst keeping the table
structure the same as in the tfmdata.
--]]--
-local get_raw_info = function (metadata, basename)
+local function get_raw_info (metadata, basename)
local fontname = metadata.fontname
local fullname = metadata.fullname
@@ -1569,10 +1566,10 @@ local get_raw_info = function (metadata, basename)
}
end
-local organize_namedata = function (rawinfo,
- nametable,
- basename,
- info)
+local function organize_namedata (rawinfo,
+ nametable,
+ basename,
+ info)
local default_name = nametable.compatiblefullname
or nametable.fullname
or nametable.postscriptname
@@ -1639,7 +1636,7 @@ end
local dashsplitter = lpegsplitat "-"
-local split_fontname = function (fontname)
+local function split_fontname (fontname)
--- sometimes the style hides in the latter part of the
--- fontname, separated by a dash, e.g. “Iwona-Regular”,
--- “GFSSolomos-Regular”
@@ -1649,7 +1646,7 @@ local split_fontname = function (fontname)
end
end
-local organize_styledata = function (metadata, rawinfo, info)
+local function organize_styledata (metadata, rawinfo, info)
local pfminfo = metadata.pfminfo
local names = rawinfo.names
return {
@@ -1777,13 +1774,13 @@ local loaders = {
--- not side-effect free!
-local compare_timestamps = function (fullname,
- currentstatus,
- currententrystatus,
- currentmappings,
- targetstatus,
- targetentrystatus,
- targetmappings)
+local function compare_timestamps (fullname,
+ currentstatus,
+ currententrystatus,
+ currentmappings,
+ targetstatus,
+ targetentrystatus,
+ targetmappings)
local currenttimestamp = currententrystatus
and currententrystatus.timestamp
@@ -1821,15 +1818,15 @@ local compare_timestamps = function (fullname,
return true
end
-local insert_fullinfo = function (fullname,
- basename,
- n_font,
- loader,
- format,
- location,
- targetmappings,
- targetentrystatus,
- info)
+local function insert_fullinfo (fullname,
+ basename,
+ n_font,
+ loader,
+ format,
+ location,
+ targetmappings,
+ targetentrystatus,
+ info)
local fullinfo = loader (fullname, n_font,
location, basename,
@@ -1856,10 +1853,10 @@ end
--- we return true if the font is new or re-indexed
--- string -> dbobj -> dbobj -> bool
-local read_font_names = function (fullname,
- currentnames,
- targetnames,
- location)
+local function read_font_names (fullname,
+ currentnames,
+ targetnames,
+ location)
local targetmappings = targetnames.mappings
local targetstatus = targetnames.status --- by full path
@@ -1963,7 +1960,7 @@ do
--- windows and dos
if os_type == "windows" or os_type == "msdos" then
--- ms platfom specific stuff
- path_normalize = function (path)
+ function path_normalize (path)
path = stringgsub(path, '\\', '/')
path = stringlower(path)
path = filecollapsepath(path)
@@ -1976,7 +1973,7 @@ do
--doc]]--
else -- posix
- path_normalize = function (path)
+ function path_normalize (path)
local dest = lfsreadlink(path)
if dest then
if kpsereadable_file(dest) then
@@ -1997,7 +1994,7 @@ local blacklist = { }
local p_blacklist --- prefixes of dirs
--- string list -> string list
-local collapse_prefixes = function (lst)
+local function collapse_prefixes (lst)
--- avoid redundancies in blacklist
if #lst < 2 then
return lst
@@ -2018,7 +2015,7 @@ local collapse_prefixes = function (lst)
end
--- string list -> string list -> (string, bool) hash_t
-local create_blacklist = function (blacklist, whitelist)
+local function create_blacklist (blacklist, whitelist)
local result = { }
local dirs = { }
@@ -2099,7 +2096,7 @@ end
local p_font_filter
do
- local extension_pattern = function (list)
+ local function extension_pattern (list)
if type (list) ~= "table" or #list == 0 then return P(-1) end
local pat
for i=#list, 1, -1 do
@@ -2119,7 +2116,7 @@ do
local current_formats = { }
- set_font_filter = function (formats)
+ function set_font_filter (formats)
if not formats or type (formats) ~= "string" then
return
@@ -2160,12 +2157,12 @@ do
p_font_filter = extension_pattern (current_formats)
end
- get_font_filter = function (formats)
+ function get_font_filter (formats)
return tablefastcopy (current_formats)
end
end
-local locate_matching_pfb = function (afmfile, dir)
+local function locate_matching_pfb (afmfile, dir)
local pfbname = filereplacesuffix (afmfile, "pfb")
local pfbpath = dir .. "/" .. pfbname
if lfsisfile (pfbpath) then
@@ -2175,8 +2172,7 @@ local locate_matching_pfb = function (afmfile, dir)
return kpsefind_file (pfbname, "type1 fonts")
end
-local process_dir_tree
-process_dir_tree = function (acc, dirs, done)
+local function process_dir_tree (acc, dirs, done)
if not next (dirs) then --- done
return acc
end
@@ -2229,7 +2225,7 @@ process_dir_tree = function (acc, dirs, done)
return process_dir_tree (tableappend (acc, newfiles), dirs, done)
end
-local process_dir = function (dir)
+local function process_dir (dir)
local pwd = lfscurrentdir ()
if lfschdir (dir) then
dir = lfscurrentdir () --- resolve symlinks
@@ -2262,7 +2258,7 @@ local process_dir = function (dir)
end
--- string -> bool -> string list
-local find_font_files = function (root, recurse)
+local function find_font_files (root, recurse)
if lfsisdir (root) then
if recurse == true then
return process_dir_tree ({}, { root }, {})
@@ -2276,7 +2272,7 @@ end
--- into a given terminal width. The parameter “restrict” (int)
--- indicates the number of characters already consumed on the
--- line.
-local truncate_string = function (str, restrict)
+local function truncate_string (str, restrict)
local tw = config.luaotfload.misc.termwidth
local wd = tw - restrict
local len = utf8len (str)
@@ -2304,7 +2300,7 @@ end
--doc]]--
--- string -> string -> string * string list
-local collect_font_filenames_dir = function (dirname, location)
+local function collect_font_filenames_dir (dirname, location)
if lpegmatch (p_blacklist, dirname) then
logreport ("both", 4, "db",
"Skipping blacklisted directory %s.", dirname)
@@ -2332,7 +2328,7 @@ local collect_font_filenames_dir = function (dirname, location)
end
--- string list -> string list
-local filter_out_pwd = function (dirs)
+local function filter_out_pwd (dirs)
local result = { }
if stripslashes == nil then
stripslashes = luaotfload.parsers and luaotfload.parsers.stripslashes
@@ -2344,7 +2340,7 @@ local filter_out_pwd = function (dirs)
local dir = path_normalize (lpegmatch (stripslashes, dirs[i]))
if dir == "." or dir == pwd then
logreport ("both", 3, "db",
- "Path “%s” matches $PWD (“%s”), skipping.",
+ "Path %q matches $PWD (%q), skipping.",
dir, pwd)
else
result[#result+1] = dir
@@ -2368,7 +2364,7 @@ local path_separator = os.type == "windows" and ";" or ":"
--doc]]--
--- unit -> string * string list
-local collect_font_filenames_texmf = function ()
+local function collect_font_filenames_texmf ()
local osfontdir = kpseexpand_path "$OSFONTDIR"
@@ -2417,7 +2413,8 @@ local function get_os_dirs ()
}
elseif os.type == "windows" or os.type == "msdos" then
local windir = osgetenv("WINDIR")
- return { filejoin(windir, 'Fonts') }
+ local appdata = osgetenv("LOCALAPPDATA")
+ return { filejoin(windir, 'Fonts'), filejoin(appdata, 'Microsoft/Windows/Fonts') }
else
local fonts_conves = { --- plural, much?
"/usr/local/etc/fonts/fonts.conf",
@@ -2439,7 +2436,7 @@ end
--doc]]--
--- string list -> size_t
-local count_removed = function (files)
+local function count_removed (files)
if not files or not files.full then
logreport ("log", 4, "db", "Empty file store; no data to work with.")
return 0
@@ -2452,7 +2449,7 @@ local count_removed = function (files)
local f = old[i]
if not kpsereadable_file (f) then
logreport ("log", 2, "db",
- "File %s does not exist in file system.")
+ "File %q does not exist in file system.")
nrem = nrem + 1
end
end
@@ -2474,7 +2471,7 @@ end
--doc]]--
--- string * string list -> dbobj -> dbobj -> bool? -> int * int
-local retrieve_namedata = function (files, currentnames, targetnames, dry_run)
+local function retrieve_namedata (files, currentnames, targetnames, dry_run)
local nfiles = #files
local nnew = 0
@@ -2516,7 +2513,7 @@ local retrieve_namedata = function (files, currentnames, targetnames, dry_run)
end
--- unit -> string * string list
-local collect_font_filenames_system = function ()
+local function collect_font_filenames_system ()
local n_scanned, n_new = 0, 0
logreport ("info", 1, "db", "Scanning system fonts...")
@@ -2551,7 +2548,7 @@ end
--doc]]--
--- unit -> string * string list
-local collect_font_filenames_local = function ()
+local function collect_font_filenames_local ()
local pwd = lfscurrentdir ()
logreport ("both", 1, "db", "Scanning for fonts in $PWD (%q) ...", pwd)
@@ -2757,11 +2754,11 @@ local pick_fallback_style
local check_regular
do
- pick_style = function (typographicsubfamily, subfamily)
+ function pick_style (typographicsubfamily, subfamily)
return style_synonym [typographicsubfamily or subfamily or ""]
end
- pick_fallback_style = function (italicangle, pfmweight, width)
+ function pick_fallback_style (italicangle, pfmweight, width)
--[[--
More aggressive, but only to determine bold faces.
Note: Before you make this test more inclusive, ensure
@@ -2792,12 +2789,12 @@ do
--- we use only exact matches here since there are constructs
--- like “regularitalic” (Cabin, Bodoni Old Fashion)
- check_regular = function (typographicsubfamily,
- subfamily,
- italicangle,
- weight,
- width,
- pfmweight)
+ function check_regular (typographicsubfamily,
+ subfamily,
+ italicangle,
+ weight,
+ width,
+ pfmweight)
local plausible_weight = false
--[[--
This filters out undesirable candidates that specify their
@@ -2838,7 +2835,7 @@ do
end
end
-local pull_values = function (entry)
+local function pull_values (entry)
local file = entry.file
local names = entry.names
local style = entry.style
@@ -2876,7 +2873,7 @@ local pull_values = function (entry)
end
end
-local add_family = function (name, subtable, modifier, entry)
+local function add_family (name, subtable, modifier, entry)
if not name then --- probably borked font
return
end
@@ -2892,7 +2889,7 @@ local add_family = function (name, subtable, modifier, entry)
}
end
-local add_lastresort_regular = function (name, subtable, entry)
+local function add_lastresort_regular (name, subtable, entry)
if not name then --- probably borked font
return
end
@@ -2904,7 +2901,7 @@ local add_lastresort_regular = function (name, subtable, entry)
familytable.fallback = entry.index
end
-local get_subtable = function (families, entry)
+local function get_subtable (families, entry)
local location = entry.location
local format = entry.format
local subtable = families [location] [format]
@@ -2915,7 +2912,7 @@ local get_subtable = function (families, entry)
return subtable
end
-local collect_families = function (mappings)
+local function collect_families (mappings)
logreport ("info", 2, "db", "Analyzing families.")
@@ -3081,7 +3078,7 @@ group_modifiers = function (mappings, families)
return families
end
-local cmp_sizes = function (a, b)
+local function cmp_sizes (a, b)
return a [1] < b [1]
end
@@ -3143,7 +3140,7 @@ end
--doc]]--
--- unit -> string * string list
-local collect_font_filenames = function ()
+local function collect_font_filenames ()
logreport ("info", 4, "db", "Scanning the filesystem for font files.")
@@ -3180,7 +3177,7 @@ end
--doc]]--
--- int -> string
-local nth_font_filename = function (n)
+local function nth_font_filename (n)
logreport ("info", 4, "db", "Picking font file no. %d.", n)
if not p_blacklist then
read_blacklist ()
@@ -3195,7 +3192,7 @@ end
--doc]]--
-local font_slice = function (lo, hi)
+local function font_slice (lo, hi)
logreport ("info", 4, "db", "Retrieving font files nos. %d--%d.", lo, hi)
if not p_blacklist then
read_blacklist ()
@@ -3217,7 +3214,7 @@ end
--doc]]--
--- unit -> int
-local count_font_files = function ()
+local function count_font_files ()
logreport ("info", 4, "db", "Counting font files.")
if not p_blacklist then
read_blacklist ()
@@ -3227,13 +3224,13 @@ end
--- dbobj -> stats
-local collect_statistics = function (mappings)
+local function collect_statistics (mappings)
local sum_dsnsize, n_dsnsize = 0, 0
local fullname, family, families = { }, { }, { }
local subfamily, typographicsubfamily = { }, { }
- local addtohash = function (hash, item)
+ local function addtohash (hash, item)
if item then
local times = hash [item]
if times then
@@ -3244,7 +3241,7 @@ local collect_statistics = function (mappings)
end
end
- local appendtohash = function (hash, key, value)
+ local function appendtohash (hash, key, value)
if key and value then
local entry = hash [key]
if entry then
@@ -3255,7 +3252,7 @@ local collect_statistics = function (mappings)
end
end
- local addtoset = function (hash, key, value)
+ local function addtoset (hash, key, value)
if key and value then
local set = hash [key]
if set then
@@ -3266,7 +3263,7 @@ local collect_statistics = function (mappings)
end
end
- local setsize = function (set)
+ local function setsize (set)
local n = 0
for _, _ in next, set do
n = n + 1
@@ -3274,7 +3271,7 @@ local collect_statistics = function (mappings)
return n
end
- local hashsum = function (hash)
+ local function hashsum (hash)
local n = 0
for _, m in next, hash do
n = n + m
@@ -3307,7 +3304,7 @@ local collect_statistics = function (mappings)
local n_family = setsize (family)
if log.get_loglevel () > 1 then
- local pprint_top = function (hash, n, set)
+ local function pprint_top (hash, n, set)
local freqs = { }
local items = { }
@@ -3356,12 +3353,12 @@ local collect_statistics = function (mappings)
pprint_top (families, 4, true)
logreport ("both", 0, "db",
- " · %d different “subfamily” kinds.",
+ " · %d different \"subfamily\" kinds.",
setsize (subfamily))
pprint_top (subfamily, 4)
logreport ("both", 0, "db",
- " · %d different “typographicsubfamily” kinds.",
+ " · %d different \"typographicsubfamily\" kinds.",
setsize (typographicsubfamily))
pprint_top (typographicsubfamily, 4)
@@ -3599,8 +3596,8 @@ end
--doc]]--
--- string -> string -> string list -> string list -> string list -> unit
-local print_cache = function (category, path, luanames, lucnames, rest)
- local report_indeed = function (...)
+local function print_cache (category, path, luanames, lucnames, rest)
+ local function report_indeed (...)
logreport ("info", 0, "cache", ...)
end
report_indeed("Luaotfload cache: %s", category)
@@ -3612,7 +3609,7 @@ local print_cache = function (category, path, luanames, lucnames, rest)
end
--- string -> string -> string list -> bool -> bool
-local purge_from_cache = function (category, path, list, all)
+local function purge_from_cache (category, path, list, all)
logreport ("info", 1, "cache", "Luaotfload cache: %s %s",
(all and "erase" or "purge"), category)
logreport ("info", 1, "cache", "location: %s", path)
@@ -3644,8 +3641,7 @@ end
--- string -> string list -> int -> string list -> string list -> string list ->
--- (string list * string list * string list * string list)
-local collect_cache collect_cache = function (path, all, n, luanames,
- lucnames, rest)
+local function collect_cache (path, all, n, luanames, lucnames, rest)
if not all then
local all = find_files (path)
@@ -3668,7 +3664,7 @@ local collect_cache collect_cache = function (path, all, n, luanames,
return luanames, lucnames, rest, all
end
-local getwritablecachepath = function ( )
+local function getwritablecachepath ( )
--- fonts.handlers.otf doesn’t exist outside a Luatex run,
--- so we have to improvise
local writable = getwritablepath (config.luaotfload.paths.cache_dir, "")
@@ -3677,7 +3673,7 @@ local getwritablecachepath = function ( )
end
end
-local getreadablecachepaths = function ( )
+local function getreadablecachepaths ( )
local readables = caches.getreadablepaths
(config.luaotfload.paths.cache_dir)
local result = { }
@@ -3693,7 +3689,7 @@ local getreadablecachepaths = function ( )
end
--- unit -> unit
-local purge_cache = function ( )
+local function purge_cache ( )
local writable_path = getwritablecachepath ()
local luanames, lucnames, rest = collect_cache(writable_path)
if log.get_loglevel() > 1 then
@@ -3704,7 +3700,7 @@ local purge_cache = function ( )
end
--- unit -> unit
-local erase_cache = function ( )
+local function erase_cache ( )
local writable_path = getwritablecachepath ()
local luanames, lucnames, rest, all = collect_cache(writable_path)
if log.get_loglevel() > 1 then
@@ -3714,12 +3710,12 @@ local erase_cache = function ( )
return success
end
-local separator = function ( )
+local function separator ( )
logreport ("info", 0, string.rep("-", 67))
end
--- unit -> unit
-local show_cache = function ( )
+local function show_cache ( )
local readable_paths = getreadablecachepaths ()
local writable_path = getwritablecachepath ()
local luanames, lucnames, rest = collect_cache(writable_path)
@@ -3746,27 +3742,27 @@ end
--- PHG: we need to investigate these, maybe they’re useful as early
--- hooks
-local reportmissingbase = function ()
+local function reportmissingbase ()
logreport ("info", 0, "db", --> bug‽
"Font name database not found but expected by fontloader.")
fonts.names.reportmissingbase = nil
end
-local reportmissingname = function ()
+local function reportmissingname ()
logreport ("info", 0, "db", --> bug‽
"Fontloader attempted to lookup name before Luaotfload \z
was initialized.")
fonts.names.reportmissingname = nil
end
-local getfilename = function (a1, a2)
+local function getfilename (a1, a2)
logreport ("info", 6, "db", --> bug‽
"Fontloader looked up font file (%s, %s) before Luaotfload \z
was initialized.", tostring(a1), tostring(a2))
return lookup_fullpath (a1, a2)
end
-local resolve = function (name, subfont)
+local function resolve (name, subfont)
logreport ("info", 6, "db", --> bug‽
"Fontloader attempted to resolve name (%s, %s) before \z
Luaotfload was initialized.", tostring(name), tostring(subfont))
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-diagnostics.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-diagnostics.lua
index c6bb5c93711..956e24e7476 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-diagnostics.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-diagnostics.lua
@@ -7,8 +7,8 @@
local ProvidesLuaModule = {
name = "luaotfload-diagnostics",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload-tool submodule / diagnostics",
license = "GPL v2.0"
}
@@ -58,7 +58,7 @@ local C, Cg, Ct = lpeg.C, lpeg.Cg, lpeg.Ct
local lpegmatch = lpeg.match
local report = luaotfload.log.report
-local out = function (...)
+local function out (...)
report (false, 0, "diagnose", ...)
end
@@ -66,7 +66,7 @@ local parsers = luaotfload.parsers
local stripslashes = parsers.stripslashes
local splitcomma = parsers.splitcomma
-local check_index = function (errcnt)
+local function check_index (errcnt)
out "================= font names =================="
local namedata = names.data()
@@ -107,7 +107,7 @@ local check_index = function (errcnt)
return errcnt
end
-local verify_files = function (errcnt)
+local function verify_files (errcnt)
out "================ verify files ================="
local status = config.luaotfload.status
local hashes = status.hashes
@@ -157,7 +157,7 @@ local verify_files = function (errcnt)
return errcnt
end
-local get_tentative_attributes = function (file)
+local function get_tentative_attributes (file)
if not lfsisfile (file) then
local chan = ioopen (file, "w")
if chan then
@@ -173,11 +173,11 @@ local p_permissions = Ct(Cg(Ct(C(1) * C(1) * C(1)), "u")
* Cg(Ct(C(1) * C(1) * C(1)), "g")
* Cg(Ct(C(1) * C(1) * C(1)), "o"))
-local analyze_permissions = function (raw)
+local function analyze_permissions (raw)
return lpegmatch (p_permissions, raw)
end
-local get_permissions = function (t, location)
+local function get_permissions (t, location)
if stringsub (location, #location) == "/" then
--- strip trailing slashes (lfs idiosyncrasy on Win)
location = lpegmatch (stripslashes, location)
@@ -219,7 +219,7 @@ local get_permissions = function (t, location)
}
end
-local check_conformance = function (spec, permissions, errcnt)
+local function check_conformance (spec, permissions, errcnt)
local uid = permissions.attributes.uid
local gid = permissions.attributes.gid
local raw = permissions.attributes.permissions
@@ -255,7 +255,7 @@ local check_conformance = function (spec, permissions, errcnt)
return errcnt
end
-local init_desired_permissions = function ()
+local function init_desired_permissions ()
local paths = config.luaotfload.paths
return {
{ "d", {"r","w"}, function () return caches.getwritablepath ("", "") end },
@@ -267,7 +267,7 @@ local init_desired_permissions = function ()
}
end
-local check_permissions = function (errcnt)
+local function check_permissions (errcnt)
out [[=============== file permissions ==============]]
local desired_permissions = init_desired_permissions ()
for i = 1, #desired_permissions do
@@ -294,7 +294,7 @@ end
local check_upstream
if kpsefind_file ("https.lua", "lua") == nil then
- check_upstream = function (errcnt)
+ function check_upstream (errcnt)
out [[============= upstream repository =============
WARNING: Cannot retrieve repository data.
Github API access requires the luasec library.
@@ -307,16 +307,16 @@ else
local https = require "ssl.https"
local gh_api_root = [[https://api.github.com]]
- local release_url = [[https://github.com/lualatex/luaotfload/releases]]
- local luaotfload_repo = [[lualatex/luaotfload]]
- local user_agent = [[lualatex/luaotfload integrity check]]
+ local release_url = [[https://github.com/latex3/luaotfload/releases]]
+ local luaotfload_repo = [[latex3/luaotfload]]
+ local user_agent = [[latex3/luaotfload integrity check]]
local shortbytes = 8
- local gh_shortrevision = function (rev)
+ local function gh_shortrevision (rev)
return stringsub (rev, 1, shortbytes)
end
- local gh_encode_parameters = function (parameters)
+ local function gh_encode_parameters (parameters)
local acc = {}
for field, value in next, parameters do
--- unsafe, non-urlencoded coz it’s all ascii chars
@@ -325,7 +325,7 @@ else
return "?" .. tableconcat (acc, "&")
end
- local gh_make_url = function (components, parameters)
+ local function gh_make_url (components, parameters)
local url = tableconcat ({ gh_api_root,
unpack (components) },
"/")
@@ -337,7 +337,7 @@ else
local alright = [[HTTP/1.1 200 OK]]
- local gh_api_request = function (...)
+ local function gh_api_request (...)
local args = {...}
local nargs = #args
local final = args[nargs]
@@ -361,7 +361,7 @@ else
return response
end
- local gh_api_checklimit = function (headers)
+ local function gh_api_checklimit (headers)
local rawlimit = gh_api_request "rate_limit"
local limitdata = lua_of_json (rawlimit)
if not limitdata and limitdata.rate then
@@ -387,7 +387,7 @@ else
return true
end
- local gh_tags = function ()
+ local function gh_tags ()
out "Fetching tags from repository, please stand by."
local rawtags = gh_api_request ("repos",
luaotfload_repo,
@@ -407,7 +407,7 @@ else
return latest
end
- local gh_compare = function (head, base)
+ local function gh_compare (head, base)
if base == nil then
base = "HEAD"
end
@@ -428,7 +428,7 @@ else
return status
end
- local gh_news = function (since)
+ local function gh_news (since)
local compared = gh_compare (since)
if not compared then
return false
@@ -452,7 +452,7 @@ else
return false
end
- local gh_catchup = function (current, latest)
+ local function gh_catchup (current, latest)
local compared = gh_compare (latest, current)
local ahead_by = tonumber (compared.ahead_by)
if ahead_by > 0 then
@@ -472,7 +472,7 @@ else
return false
end
- check_upstream = function (current)
+ function check_upstream (current)
out "============= upstream repository ============="
local _succ = gh_api_checklimit ()
local behind = gh_news (current)
@@ -491,7 +491,7 @@ else
end
--- github api stuff end
-local print_envvar = function (var)
+local function print_envvar (var)
local val = osgetenv (var)
if val then
out ("%20s: %q", stringformat ("$%s", var), val)
@@ -501,7 +501,7 @@ local print_envvar = function (var)
end
end
-local print_path = function (var)
+local function print_path (var)
local val = osgetenv (var)
if val then
local paths = filesplitpath (val)
@@ -523,7 +523,7 @@ local print_path = function (var)
end
end
-local print_kpsevar = function (var)
+local function print_kpsevar (var)
var = "$" .. var
local val = kpseexpand_var (var)
if val and val ~= var then
@@ -534,7 +534,7 @@ local print_kpsevar = function (var)
end
end
-local print_kpsepath = function (var)
+local function print_kpsepath (var)
var = "$" .. var
local val = kpseexpand_path (var)
if val and val ~= "" then
@@ -562,7 +562,7 @@ end
--- return the empty string both if the variable is unset and if
--- the directory does not exist
-local print_kpsepathvar = function (var)
+local function print_kpsepathvar (var)
local vvar = "$" .. var
local val = kpseexpand_var (vvar)
if val and val ~= vvar then
@@ -573,7 +573,7 @@ local print_kpsepathvar = function (var)
end
end
-local check_environment = function (errcnt)
+local function check_environment (errcnt)
out "============ environment settings ============="
out ("system: %s/%s", ostype, osname)
if ostype == "unix" and io.popen then
@@ -623,7 +623,7 @@ local anamneses = {
"permissions"
}
-local diagnose = function (job)
+local function diagnose (job)
local errcnt = 0
local asked = job.asked_diagnostics
if asked == "all" or asked == "thorough" then
@@ -681,7 +681,7 @@ local diagnose = function (job)
github:
× http://www.ctan.org/pkg/luaotfload
- × https://github.com/lualatex/luaotfload/releases
+ × https://github.com/latex3/luaotfload/releases
If you are uncertain as to how to proceed, then
ask on the lualatex mailing list:
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-embolden.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-embolden.lua
index eec5ffde158..9d36071c03f 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-embolden.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-embolden.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-embolden",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / color",
license = "GPL v2.0",
author = "Marcel Krüger"
@@ -18,24 +18,17 @@ end
local otffeatures = fonts.constructors.newfeatures "otf"
-local function setembolden(tfmdata, factor)
- tfmdata.embolden = factor
-end
-
-local function enableembolden(tfmdata)
- tfmdata.mode, tfmdata.width = 2, tfmdata.size*tfmdata.unscaled.embolden/6578.176
+local function enableembolden(tfmdata, _, embolden)
+ tfmdata.mode, tfmdata.width = 2, tfmdata.size*embolden/6578.176
end
otffeatures.register {
name = "embolden",
description = "embolden",
- initializers = {
- base = setembolden,
- node = setembolden,
- },
manipulators = {
base = enableembolden,
node = enableembolden,
+ plug = enableembolden,
}
}
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-fallback.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-fallback.lua
index e07b3c726ad..9b790ae8549 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-fallback.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-fallback.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-fallback",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / fallback",
license = "GPL v2.0",
author = "Marcel Krüger"
@@ -26,7 +26,7 @@ local protect_glyph = node.direct.protect_glyph
local otffeatures = fonts.constructors.newfeatures "otf"
-- local normalize = fonts.handlers.otf.features.normalize
local definers = fonts.definers
-local define_font = luaotfload.define_font
+local define_font -- = luaotfload.define_font % This is set when the first font is loaded.
local fallback_table_fontnames = {}
@@ -89,8 +89,8 @@ local function makefallbackfont(tfmdata, _, fallback)
end
local glyph_id = node.id'glyph'
--- TODO: unset last_script, matching parentheses etc
-function dofallback(head, _, _, _, direction)
+-- TODO: inherited fonts (combining accents etc.)
+local function dofallback(head, _, _, _, direction)
head = node.direct.todirect(head)
local last_fid, last_fallbacks
for cur, cid, fid in traverse_char(head) do
@@ -107,6 +107,7 @@ function dofallback(head, _, _, _, direction)
end
function luaotfload.add_fallback(name, fonts)
+ define_font = define_font or luaotfload.define_font -- Lazy loading because this file get's loaded before define_font is defined
if fonts == nil then
fonts = name
name = #fallback_table_fontnames + 1
@@ -131,4 +132,7 @@ otffeatures.register {
-- }
}
+return {
+ process = dofallback,
+}
--- vim:sw=2:ts=2:expandtab:tw=71
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-features.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-features.lua
index 0fe8a281c66..a54ef20e9d5 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-features.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-features.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-features",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / features",
license = "GPL v2.0",
author = "Hans Hagen, Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger",
@@ -69,11 +69,11 @@ local stringgsub = string.gsub
local stringformat = string.format
local stringis_empty = string.is_empty
-local cmp_by_idx = function (a, b) return a.idx < b.idx end
+local function cmp_by_idx (a, b) return a.idx < b.idx end
local defined_combos = 0
-local handle_combination = function (combo, spec)
+local function handle_combination (combo, spec)
defined_combos = defined_combos + 1
if not combo [1] then
report ("both", 0, "features",
@@ -151,7 +151,7 @@ local handle_combination = function (combo, spec)
local src = fnt.characters
local cnt = 0
- local pickchr = function (uc, unavailable)
+ local function pickchr (uc, unavailable)
local chr = src [uc]
if unavailable == true and basechar [uc] then
--- fallback mode: already known
@@ -202,7 +202,7 @@ end
---[[ begin excerpt from font-ott.lua ]]
-local swapped = function (h)
+local function swapped (h)
local r = { }
for k, v in next, h do
r[stringgsub(v,"[^a-z0-9]","")] = k -- is already lower
@@ -242,7 +242,7 @@ local support_incomplete = tabletohash({
--doc]]--
--- (string, string) dict -> (string, string) dict
-local apply_default_features = function (rawlist)
+local function apply_default_features (rawlist)
local speclist = {}
for k, v in pairs(rawlist) do
if type(v) == 'string' then
@@ -327,7 +327,7 @@ local supported = {
}
--- (string | (string * string) | bool) list -> (string * number)
-local handle_slashed = function (modifiers)
+local function handle_slashed (modifiers)
local style, optsize
for i=1, #modifiers do
local mod = modifiers[i]
@@ -356,7 +356,7 @@ do
end
--- spec -> spec
-local handle_request = function (specification)
+local function handle_request (specification)
local request = lpegmatch(luaotfload.parsers.font_request,
specification.specification)
----inspect(request)
@@ -569,7 +569,7 @@ local autofeatures = {
{ "!!??", interrolig_specification, "interrobang substitutions" },
}
-local add_auto_features = function ()
+local function add_auto_features ()
local nfeats = #autofeatures
report ("both", 5, "features",
"auto-installing %d feature definitions", nfeats)
@@ -582,6 +582,26 @@ end
luaotfload.apply_default_features = apply_default_features
+do
+ local function mathparaminitializer(tfmdata, value, features)
+ if not next(tfmdata.mathparameters) then return end
+ if value == 'auto' then
+ if features.script == 'math' then return end
+ end
+ tfmdata.mathparameters = {}
+ end
+ fonts.constructors.features.otf.register {
+ name = 'nomathparam',
+ description = 'Set Math parameters based on this font',
+ default = 'auto',
+ initializers = {
+ base = mathparaminitializer,
+ node = mathparaminitializer,
+ -- plug = mathparaminitializer,
+ },
+ }
+end
+
return function ()
if not fonts and fonts.handlers then
report ("log", 0, "features",
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-filelist.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-filelist.lua
index 11bc5255474..35b74f6fa31 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-filelist.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-filelist.lua
@@ -6,8 +6,8 @@
local ProvidesLuaModule = {
name = "luaotfload-filelist",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / filelist",
license = "GPL v2.0"
}
@@ -252,6 +252,8 @@ luaotfload.filelist.data =
{ name = "harf-plug" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
{ name = "loaders" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
{ name = "multiscript" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
+ { name = "scripts" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
+ { name = "szss" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
{ name = "fallback" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
{ name = "parsers" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
{ name = "resolvers" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-glyphlist.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-glyphlist.lua
index 50f1b4d5906..ca74e472573 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-glyphlist.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-glyphlist.lua
@@ -1,7 +1,7 @@
local ProvidesLuaModule = {
name = "luaotfload-glyphlist",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / autogenerated glyphlist",
copyright = "derived from https://raw.githubusercontent.com/adobe-type-tools/agl-aglfn/master/glyphlist.txt",
original = "Adobe Glyph List, version 2.0, September 20, 2002",
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-harf-define.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-harf-define.lua
index 555180435af..80895d0f4f9 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-harf-define.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-harf-define.lua
@@ -5,8 +5,8 @@
do -- block to avoid to many local variables error
local ProvidesLuaModule = {
name = "luaotfload-harf-define",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / database",
license = "GPL v2.0",
author = "Khaled Hosny, Marcel Krüger",
@@ -18,6 +18,7 @@ do -- block to avoid to many local variables error
end
end
+local unpack = string.unpack
local stringlower = string.lower
local stringupper = string.upper
local gsub = string.gsub
@@ -25,6 +26,11 @@ local gsub = string.gsub
local hb = luaotfload.harfbuzz
local scriptlang_to_harfbuzz = require'luaotfload-scripts'.to_harfbuzz
+local harf_settings = luaotfload.harf or {}
+luaotfload.harf = harf_settings
+
+harf_settings.default_buf_flags = hb.Buffer.FLAGS_DEFAULT or 0
+
local hbfonts = {}
local cfftag = hb.Tag.new("CFF ")
@@ -32,12 +38,44 @@ local cff2tag = hb.Tag.new("CFF2")
local os2tag = hb.Tag.new("OS/2")
local posttag = hb.Tag.new("post")
local glyftag = hb.Tag.new("glyf")
+local gpostag = hb.Tag.new("GPOS")
local invalid_l = hb.Language.new()
local invalid_s = hb.Script.new()
+local floor = math.floor
+local function round(x)
+ return floor(x + 0.5)
+end
+
+local get_designsize do
+ -- local lpeg = lpeg or require'lpeg'
+ -- local size_patt = 'size' * lpeg.C(2)/function(s)
+ -- local first, second = string.byte(s)
+ -- return (first << 8) | second
+ -- end
+ local factor = 6578.176 -- =803/125*2^10=7227/7200/10*2^16
+ function get_designsize(face)
+ local buf = face:get_table(gpostag):get_data()
+ if #buf == 0 then return 655360 end
+ local major, feature_off = unpack(">HxxxxH", buf)
+ assert(major == 1, "Unsupported major version of GPOS table")
+ local feature_count = unpack(">H", buf, feature_off + 1)
+ for off = feature_off + 3, feature_off + 6*feature_count, 6 do
+ local tag = buf:sub(off, off + 3)
+ if tag == 'size' then
+ local off = feature_off + 1 + unpack(">H", buf, off + 4)
+ local off = off + unpack(">H", buf, off)
+ local design_size = unpack(">H", buf, off) -- unpack(">HHHHH", buf, off))
+ return round(design_size * factor)
+ end
+ end
+ return 655360
+ end
+end
+
local containers = luaotfload.fontloader.containers
-local hbcacheversion = 1.0
+local hbcacheversion = 1.1
local facecache = containers.define("fonts", "hb", hbcacheversion, true)
local function loadfont(spec)
@@ -92,8 +130,8 @@ local function loadfont(spec)
local post = hbface:get_table(posttag)
local length = post:get_length()
local data = post:get_data()
- if length >= 32 and string.unpack(">i4", data) <= 0x00030000 then
- local italicangle = string.unpack(">i4", data, 5) / 2^16
+ if length >= 32 and unpack(">i4", data) <= 0x00030000 then
+ local italicangle = unpack(">i4", data, 5) / 2^16
if italicangle ~= 0 then
slant = -math.tan(italicangle * math.pi / 180) * 65536.0
end
@@ -111,6 +149,7 @@ local function loadfont(spec)
-- too slow.
local glyphcount = hbface:get_glyph_count()
local glyphs = {}
+ local autoitalic = slant ~= 0 and 20 or nil -- the magic 20 is taken from ConTeXt where it came from Dohyun Kim. We keep it to be metric compatible as far as possible
for gid = 0, glyphcount - 1 do
local width = hbfont:get_glyph_h_advance(gid)
local height, depth, italic = nil, nil, nil
@@ -118,8 +157,9 @@ local function loadfont(spec)
if extents then
height = extents.y_bearing
depth = extents.y_bearing + extents.height
- if extents.x_bearing < 0 then
- italic = -extents.x_bearing
+ local right_bearing = extents.x_bearing + extents.width - width
+ if autoitalic and right_bearing > -autoitalic then
+ italic = right_bearing + autoitalic
end
end
glyphs[gid] = {
@@ -146,10 +186,10 @@ local function loadfont(spec)
local os2 = hbface:get_table(os2tag)
local length = os2:get_length()
local data = os2:get_data()
- if length >= 96 and string.unpack(">H", data) > 1 then
+ if length >= 96 and unpack(">H", data) > 1 then
-- We don’t need much of the table, so we read from hard-coded offsets.
- xheight = string.unpack(">H", data, 87)
- capheight = string.unpack(">H", data, 89)
+ xheight = unpack(">H", data, 87)
+ capheight = unpack(">H", data, 89)
end
end
@@ -174,6 +214,7 @@ local function loadfont(spec)
cached = {
date = date,
size = size,
+ designsize = get_designsize(hbface),
gid_offset = 0x120000,
upem = upem,
fonttype = fonttype,
@@ -214,20 +255,6 @@ local function sanitize(psname)
return psname:gsub('[][\0-\32\127-\255(){}<>/%%]', '-')
end
--- Ligatures. The value is a character "ligature" table as described in the
--- manual.
-local tlig ={
- [0x2013] = { [0x002D] = { char = 0x2014 } }, -- [---]
- [0x002D] = { [0x002D] = { char = 0x2013 } }, -- [--]
- [0x0060] = { [0x0060] = { char = 0x201C } }, -- [``]
- [0x0027] = { [0x0027] = { char = 0x201D } }, -- ['']
- [0x0021] = { [0x0060] = { char = 0x00A1 } }, -- [!`]
- [0x003F] = { [0x0060] = { char = 0x00BF } }, -- [?`]
- [0x002C] = { [0x002C] = { char = 0x201E } }, -- [,,]
- [0x003C] = { [0x003C] = { char = 0x00AB } }, -- [<<]
- [0x003E] = { [0x003E] = { char = 0x00BB } }, -- [>>]
-}
-
local function scalefont(data, spec)
if not data then return data, spec end
local size = spec.size
@@ -241,7 +268,7 @@ local function scalefont(data, spec)
local gid_offset = data.gid_offset
if size < 0 then
- size = -655.36 * size
+ size = round(size * data.designsize / -1000)
end
-- We shape in font units (at UPEM) and then scale output with the desired
@@ -280,57 +307,11 @@ local function scalefont(data, spec)
end
end
- local letterspace = 0
- if features.letterspace then
- letterspace = tonumber(features.letterspace) / 100 * upem
- elseif features.kernfactor then
- letterspace = tonumber(features.kernfactor) * upem
- end
- space = space + letterspace
-
- local slantfactor = nil
- if features.slant then
- slantfactor = tonumber(features.slant) * 1000
- end
-
- local mode = nil
- local width = nil
- if features.embolden then
- mode = 2
- -- The multiplication by 7200.0/7227 is to undo the opposite conversion
- -- the engine is doing and make the final number written in the PDF file
- -- match XeTeX’s.
- width = (size * tonumber(features.embolden) / 6553.6) * (7200.0/7227)
- end
-
- local hscale = upem
- local extendfactor = nil
- if features.extend then
- extendfactor = tonumber(features.extend) * 1000
- hscale = hscale * tonumber(features.extend)
- end
-
- local vscale = upem
- local squeezefactor = nil
- if features.squeeze then
- squeezefactor = tonumber(features.squeeze) * 1000
- vscale = vscale * tonumber(features.squeeze)
- end
-
- if features.tlig then
- for char in next, characters do
- local ligatures = tlig[char]
- if ligatures then
- characters[char].ligatures = ligatures
- end
- end
- end
-
local tfmdata = {
name = spec.specification,
filename = 'harfloaded:' .. spec.resolved,
subfont = spec.sub or 1,
- designsize = size,
+ designsize = data.designsize,
psname = sanitize(data.psname),
fullname = data.fullname,
index = spec.index,
@@ -340,10 +321,6 @@ local function scalefont(data, spec)
tounicode = 1,
nomath = true,
format = data.fonttype,
- slant = slantfactor,
- mode = mode,
- width = width,
- extend = extendfactor,
squeeze = squeezefactor,
characters = characters,
parameters = {
@@ -358,15 +335,16 @@ local function scalefont(data, spec)
},
hb = {
scale = scale,
- spec = spec,
palette = palette,
shared = data,
- letterspace = letterspace,
- hscale = hscale,
- vscale = vscale,
+ hscale = upem,
+ vscale = upem,
+ buf_flags = harf_settings.default_buf_flags,
},
specification = spec,
- shared = {},
+ shared = {
+ features = features,
+ },
properties = {},
resources = {
unicodes = data.name_to_char,
@@ -421,10 +399,13 @@ fonts.readers.harf = function(spec)
return scalefont(loadfont(spec), spec)
end
+local find_file = kpse.find_file
luatexbase.add_to_callback('find_opentype_file', function(name)
- return name:gsub('^harfloaded:', '')
+ return find_file(name, 'opentype fonts')
+ or name:gsub('^harfloaded:', '')
end, 'luaotfload.harf.strip_prefix')
luatexbase.add_to_callback('find_truetype_file', function(name)
- return name:gsub('^harfloaded:', '')
+ return find_file(name, 'truetype fonts')
+ or name:gsub('^harfloaded:', '')
end, 'luaotfload.harf.strip_prefix')
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-harf-plug.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-harf-plug.lua
index c1d87de3129..726aaaea7e8 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-harf-plug.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-harf-plug.lua
@@ -5,8 +5,8 @@
do -- block to avoid to many local variables error
local ProvidesLuaModule = {
name = "luaotfload-harf-plug",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / database",
license = "GPL v2.0",
author = "Khaled Hosny, Marcel Krüger",
@@ -105,6 +105,8 @@ local fl_unsafe = hb.Buffer.GLYPH_FLAG_UNSAFE_TO_BREAK
local startactual_p = "luaotfload_startactualtext"
local endactual_p = "luaotfload_endactualtext"
+local empty_table = {}
+
-- "Copy" properties as done by LuaTeX: Make old properties metatable
local function copytable(old)
local new = {}
@@ -164,22 +166,11 @@ end
local process
--- Legacy TeX Input Method Disguised as Font Ligatures hack.
---
--- Single replacements, keyed by character to replace. Handled separately
--- because TeX ligaturing mechanism does not support one-to-one replacements.
-local trep = {
- [0x0022] = 0x201D, -- ["]
- [0x0027] = 0x2019, -- [']
- [0x0060] = 0x2018, -- [`]
-}
-
local function itemize(head, fontid, direction)
local fontdata = font.getfont(fontid)
local hbdata = fontdata and fontdata.hb
local spec = fontdata and fontdata.specification
local options = spec and spec.features.raw
- local texlig = options and options.tlig
local runs, codes = {}, {}
local dirstack = {}
@@ -189,20 +180,25 @@ local function itemize(head, fontid, direction)
for n, id, subtype in direct.traverse(head) do
local code = 0xFFFC -- OBJECT REPLACEMENT CHARACTER
- local skip = false
+ local skip = lastskip
+ local props = properties[n]
- if id == glyph_t then
+ if props and props.zwnj then
+ code = 0x200C
+ -- skip = false -- Not sure about this, but lastskip should be a bit faster
+ elseif id == glyph_t then
if is_char(n) and getfont(n) == fontid then
code = getchar(n)
+ skip = false
else
skip = true
end
elseif id == glue_t and subtype == spaceskip_t then
code = 0x0020 -- SPACE
- skip = lastskip
elseif id == disc_t then
if uses_font(n, fontid) then
code = 0x00AD -- SOFT HYPHEN
+ skip = false
else
skip = true
end
@@ -217,17 +213,8 @@ local function itemize(head, fontid, direction)
-- Pop the last direction from the stack.
currdir = tableremove(dirstack)
end
- skip = lastskip
elseif id == localpar_t then
currdir = getdir(n)
- skip = lastskip
- end
-
- if not skip and texlig then
- local replacement = trep[code]
- if replacement then
- code = replacement
- end
end
codes[#codes + 1] = code
@@ -277,7 +264,7 @@ local function makesub(run, codes, nodelist)
if nodelist == 0 then -- FIXME: This shouldn't happen
nodelist = nil
end
- nodelist, glyphs = shape(nodelist, nodelist, subrun)
+ nodelist, nodelist, glyphs = shape(nodelist, nodelist, subrun)
return { glyphs = glyphs, run = subrun, head = nodelist }
end
@@ -300,7 +287,8 @@ local function printnodes(label, head, after)
end
-- Main shaping function that calls HarfBuzz, and does some post-processing of
-- the output.
-function shape(head, node, run)
+function shape(head, firstnode, run)
+ local node = firstnode
local codes = run.codes
local offset = run.start
local nodeindex = offset
@@ -313,7 +301,7 @@ function shape(head, node, run)
local fontdata = font.getfont(fontid)
local hbdata = fontdata.hb
- local spec = hbdata.spec
+ local spec = fontdata.specification
local features = spec.hb_features
local options = spec.features.raw
local hbshared = hbdata.shared
@@ -324,6 +312,9 @@ function shape(head, node, run)
local shapers = options.shaper and { options.shaper } or {}
local buf = hb.Buffer.new()
+ if buf.set_flags then
+ buf:set_flags(hbdata.buf_flags)
+ end
buf:set_direction(dir)
buf:set_script(script)
buf:set_language(lang)
@@ -334,6 +325,41 @@ function shape(head, node, run)
local vscale = hbdata.vscale
hbfont:set_scale(hscale, vscale)
+ do
+ features = table.merged(features) -- We don't want to modify the global features
+ local current_features = {}
+ local n = node
+ for i = offset-1, offset+len-2 do
+ local props = properties[n] or empty_table
+ if props then
+ local local_feat = props.glyph_features or empty_table
+ if local_feat then
+ for tag, value in next, current_features do
+ local loc = local_feat[tag]
+ loc = loc ~= nil and (tonumber(loc) or (loc and 1 or 0)) or nil
+ if value.value ~= loc then -- This includes loc == nil
+ value._end = i
+ features[#features + 1] = value
+ current_features[tag] = nil
+ end
+ end
+ for tag, value in next, local_feat do
+ if not current_features[tag] then
+ local feat = hb.Feature.new(tag)
+ feat.value = tonumber(value) or (value and 1 or 0)
+ feat.start = i
+ current_features[tag] = feat
+ end
+ end
+ end
+ end
+ n = getnext(n)
+ end
+ for _, feat in next, current_features do
+ features[#features + 1] = feat
+ end
+ end
+
if hb.shape_full(hbfont, buf, features, shapers) then
-- The engine wants the glyphs in logical order, but HarfBuzz outputs them
-- in visual order, so we reverse RTL buffers.
@@ -372,7 +398,7 @@ function shape(head, node, run)
local node = node
for j = cluster,nextcluster-1 do
local id = getid(node)
- if id == glyph_t or id == glue_t then
+ if id == glyph_t or (id == glue_t and getsubtype(node) == spaceskip_t) then
local code = codes[j + 1]
hex = hex..to_utf16_hex(code)
str = str..utf8.char(code)
@@ -385,7 +411,8 @@ function shape(head, node, run)
local discindex = nil
local disc = node
for j = cluster + 1, nextcluster do
- if codes[j] == 0x00AD then
+ local props = properties[disc]
+ if (not (props and props.zwnj)) and getid(disc) == disc_t then
discindex = j
break
end
@@ -489,6 +516,9 @@ function shape(head, node, run)
local predisc = getprev(disc)
setnext(predisc, rep)
setprev(rep, predisc)
+ if firstnode == startnode then
+ firstnode = disc
+ end
if startnode == head then
head = disc
else
@@ -519,10 +549,10 @@ function shape(head, node, run)
end
end
end
- return head, glyphs, run.len - len
+ return head, firstnode, glyphs, run.len - len
end
- return head, {}, 0
+ return head, firstnode, {}, 0
end
local function color_to_rgba(color)
@@ -583,8 +613,10 @@ local function tonodes(head, node, run, glyphs)
local dir = run.dir
local fontid = run.font
local fontdata = font.getfont(fontid)
+ local space = fontdata.parameters.space
local characters = fontdata.characters
local hbdata = fontdata.hb
+ local hfactor = (fontdata.extend or 1000) / 1000
local palette = hbdata.palette
local hbshared = hbdata.shared
local hbface = hbshared.face
@@ -596,7 +628,6 @@ local function tonodes(head, node, run, glyphs)
local lastprops
local scale = hbdata.scale
- local letterspace = hbdata.letterspace
local haspng = hbshared.haspng
local fonttype = hbshared.fonttype
@@ -640,7 +671,8 @@ local function tonodes(head, node, run, glyphs)
freenode(oldnode)
nodeindex = nodeindex + 1
else
- if id == glyph_t then
+ if lastprops and lastprops.zwnj and nodeindex == glyph.cluster + 1 then
+ elseif id == glyph_t then
local done
local fontglyph = fontglyphs[gid]
local character = characters[char]
@@ -749,8 +781,14 @@ local function tonodes(head, node, run, glyphs)
-- glyph, keep the node char unchanged. Helps with primitives that
-- take characters as input but actually work on glyphs, like
-- `\rpcode`.
- if character.commands or not oldcharacter
- or character.index ~= oldcharacter.index then
+ if not oldcharacter then
+ if gid == 0 then
+ local new = copynode(node)
+ head, node = insertafter(head, node, new)
+ end
+ setchar(node, char)
+ elseif character.commands
+ or character.index ~= oldcharacter.index then
setchar(node, char)
end
local xoffset = (rtl and -glyph.x_offset or glyph.x_offset) * scale
@@ -795,8 +833,8 @@ local function tonodes(head, node, run, glyphs)
if glyph.endactual then
setprop(node, endactual_p, true)
end
- local x_advance = glyph.x_advance + letterspace
- local width = fontglyph.width
+ local x_advance = glyph.x_advance
+ local width = fontglyph.width * hfactor
if width ~= x_advance then
-- The engine always uses the glyph width from the font, so we need
-- to insert a kern node if the x advance is different.
@@ -807,14 +845,18 @@ local function tonodes(head, node, run, glyphs)
elseif id == glue_t and getsubtype(node) == spaceskip_t then
-- If the glyph advance is different from the font space, then a
-- substitution or positioning was applied to the space glyph changing
- -- it from the default, so reset the glue using the new advance.
+ -- it from the default. We try to maintain as much as possible from the
+ -- original value because we assume that we want to keep spacefactors and
+ -- assume that we got mostly positioning applied. TODO: Handle the case that
+ -- we became a glyph in the process.
-- We are intentionally not comparing with the existing glue width as
-- spacing after the period is larger by default in TeX.
- local width = (glyph.x_advance + letterspace) * scale
- if fontdata.parameters.space ~= width then
- setwidth(node, width)
- setfield(node, "stretch", width / 2)
- setfield(node, "shrink", width / 3)
+ local width = glyph.x_advance * scale
+ -- if space > width + 2 or width > space + 2 then
+ if space ~= width then
+ setwidth(node, getwidth(node) - space + width)
+ -- setfield(node, "stretch", width / 2)
+ -- setfield(node, "shrink", width / 3)
end
elseif id == kern_t and getsubtype(node) == italiccorr_t then
-- If this is an italic correction node and the previous node is a
@@ -844,19 +886,15 @@ local function shape_run(head, current, run)
if not run.skip then
-- Font loaded with our loader and an HarfBuzz face is present, do our
-- shaping.
- local fontid = run.font
- local fontdata = font.getfont(fontid)
- local options = fontdata.specification.features.raw
-
local glyphs, offset
- head, glyphs, offset = shape(head, current, run)
+ head, current, glyphs, offset = shape(head, current, run)
return offset, tonodes(head, current, run, glyphs)
else
return 0, head, run.after
end
end
-function process(head, font, direction)
+function process(head, font, _attr, direction)
local newhead, current = head, head
local runs = itemize(head, font, direction)
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua
index 0f8d7b3206f..e68741666a6 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua
@@ -7,8 +7,8 @@
local ProvidesLuaModule = {
name = "luaotfload-init",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / initialization",
license = "GPL v2.0"
}
@@ -144,7 +144,7 @@ local context_modules = {
} --[[context_modules]]
-local load_context_modules = function (pth)
+local function load_context_modules (pth)
local load_module = luaotfload.loaders.context
local ignore_module = luaotfload.loaders.ignore
@@ -238,7 +238,7 @@ local function init_main(early_hook)
logreport ("log", 4, "init", "Concealing callback.register().")
local trapped_register = callback.register
- callback.register = function (id)
+ function callback.register (id)
logreport ("log", 4, "init",
"Dummy callback.register() invoked on %s.",
id)
@@ -319,7 +319,7 @@ local function init_main(early_hook)
--- of our fontloader package. Perhaps something’s wrong with the status
--- file which contains the datestamped filename? In any case, it can’t
--- hurt reporting it as a bug.
- logreport ("both", 0, "init", "Fontloader substitution failed, got “default”.")
+ logreport ("both", 0, "init", "Fontloader substitution failed, got \"default\".")
logreport ("log", 4, "init", "Falling back to reference fontloader.")
load_fontloader_module (luaotfload.fontloader_package)
@@ -392,36 +392,36 @@ local function init_main(early_hook)
elseif lfsisdir (fontloader) and verify_context_dir (fontloader) then
logreport ("log", 0, "init",
- "Loading Context files under prefix “%s”.",
+ "Loading Context files under prefix %q.",
fontloader)
load_context_modules (fontloader)
elseif lfs.isfile (fontloader) then
logreport ("log", 0, "init",
- "Loading fontloader from absolute path “%s”.",
+ "Loading fontloader from absolute path %q.",
fontloader)
local _void = assert (loadfile (fontloader, nil, context_environment)) ()
elseif kpsefind_file (fontloader) then
local path = kpsefind_file (fontloader)
logreport ("log", 0, "init",
- "Loading fontloader “%s” from kpse-resolved path “%s”.",
+ "Loading fontloader %q from kpse-resolved path %q.",
fontloader, path)
local _void = assert (loadfile (path, nil, context_environment)) ()
elseif kpsefind_file (("fontloader-%s.lua"):format(fontloader)) then
logreport ("log", 0, "init",
- "Using predefined fontloader “%s”.",
+ "Using predefined fontloader %q.",
fontloader)
load_fontloader_module (fontloader)
else
logreport ("both", 0, "init",
- "No match for requested fontloader “%s”.",
+ "No match for requested fontloader %q.",
fontloader)
fontloader = luaotfload.fontloader_package
logreport ("both", 0, "init",
- "Defaulting to predefined fontloader “%s”.",
+ "Defaulting to predefined fontloader %q.",
fontloader)
load_fontloader_module (fontloader)
end
@@ -429,7 +429,7 @@ local function init_main(early_hook)
---load_fontloader_module "font-odv.lua" --- <= Devanagari support from Context
logreport ("log", 0, "init",
- "Context OpenType loader version “%s”",
+ "Context OpenType loader version %q",
fonts.handlers.otf.version)
callback.register = trapped_register
nodes = context_environment.nodes
@@ -448,14 +448,19 @@ local init_post_install_callbacks = function ()
--doc]]--
+ -- The order is important here: multiscript=auto needs to look at the
+ -- fallback fonts, so they already have to be processed at that stage
+ local fallback = luaotfload.loaders.luaotfload "fallback".process
+ local multiscript = luaotfload.loaders.luaotfload "multiscript".process
+
-- MK Pass current text direction to simple_font_handler
local handler = luaotfload.fontloader.nodes.simple_font_handler
local callback = function(head, groupcode, _, _, direction)
if not direction then
direction = tex.get'textdir'
end
- domultiscript(head, nil, nil, nil, direction)
- dofallback(head, nil, nil, nil, direction)
+ multiscript(head, nil, nil, nil, direction)
+ fallback(head, nil, nil, nil, direction)
return handler(head, groupcode, nil, nil, direction)
end
luatexbase.add_to_callback("pre_linebreak_filter",
@@ -469,7 +474,7 @@ local init_post_install_callbacks = function ()
-- /MK
end
-local init_post_load_agl = function ()
+local function init_post_load_agl ()
--[[doc--
@@ -532,7 +537,7 @@ local init_post_load_agl = function ()
return nil
end
logreport ("both", 4, "init",
- "found Adobe glyph list file at ``%s``, using that.",
+ "found Adobe glyph list file at %q, using that.",
glyphlist)
local unicodes = dofile(glyphlist)
@@ -549,7 +554,7 @@ local init_post_actions = {
}
--- unit -> size_t
-local init_post = function ()
+local function init_post ()
--- hook for actions that need to take place after the fontloader is
--- installed
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-letterspace.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-letterspace.lua
index ce7d6fcd565..2825b87ea72 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-letterspace.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-letterspace.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-letterspace",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / color",
license = "GPL v2.0",
copyright = "PRAGMA ADE / ConTeXt Development Team",
@@ -165,7 +165,7 @@ end
---=================================================================---
-- UF changed 2017-07-14
-local kern_injector = function (fillup, kern)
+local function kern_injector (fillup, kern)
if fillup then
local g = new_node(glue_code)
setglue(g, 0, kern, 0, 1, 0)
@@ -177,7 +177,7 @@ local kern_injector = function (fillup, kern)
end
-- /UF
-local kernable_skip = function (n)
+local function kernable_skip (n)
local st = getsubtype (n)
return st == userskip_code
or st == spaceskip_code
@@ -452,7 +452,7 @@ end
--- (node_t -> node_t) -> string -> string list -> bool
local registered_as = { } --- procname -> callbacks
-local add_processor = function (processor, name, ...)
+local function add_processor (processor, name, ...)
local callbacks = { ... }
for i=1, #callbacks do
luatexbase.add_to_callback(callbacks[i], processor, name)
@@ -461,18 +461,6 @@ local add_processor = function (processor, name, ...)
return true
end
---- string -> bool
-local remove_processor = function (name)
- local callbacks = registered_as[name]
- if callbacks then
- for i=1, #callbacks do
- luatexbase.remove_from_callback(callbacks[i], name)
- end
- return true
- end
- return false --> unregistered
-end
-
--- When font kerning is requested, usually by defining a font with the
--- ``letterspace`` parameter, we inject a wrapper for the
--- ``kerncharacters()`` node processor in the relevant callbacks. This
@@ -482,9 +470,9 @@ end
--- performs all node operations on direct nodes.
--- unit -> bool
-local enablefontkerning = function ( )
+local function enablefontkerning ( )
- local handler = function (hd)
+ local function handler (hd)
local direct_hd = todirect (hd)
logreport ("term", 5, "letterspace",
"kerncharacters() invoked with node.direct interface \z
@@ -523,7 +511,7 @@ end
local fontkerning_enabled = false --- callback state
--- fontobj -> float -> unit
-local initializefontkerning = function (tfmdata, factor)
+local function initializefontkerning (tfmdata, factor)
if factor ~= "max" then
factor = tonumber (factor) or 0
end
@@ -548,6 +536,7 @@ otffeatures.register {
initializers = {
base = initializefontkerning,
node = initializefontkerning,
+ plug = initializefontkerning,
}
}
@@ -562,7 +551,7 @@ otffeatures.register {
--doc]]--
-local initializecompatfontkerning = function (tfmdata, percentage)
+local function initializecompatfontkerning (tfmdata, percentage)
local factor = tonumber (percentage)
if not factor then
logreport ("both", 0, "letterspace",
@@ -580,6 +569,7 @@ otffeatures.register {
initializers = {
base = initializecompatfontkerning,
node = initializecompatfontkerning,
+ plug = initializecompatfontkerning,
}
}
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-loaders.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-loaders.lua
index 0f24e4542ec..3146fbd3c3b 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-loaders.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-loaders.lua
@@ -8,8 +8,8 @@
local ProvidesLuaModule = {
name = "luaotfload-loaders",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / callback handling",
license = "GPL v2.0"
}
@@ -26,7 +26,7 @@ if not luaotfload then error "this module requires Luaotfload" end
local logreport = luaotfload.log and luaotfload.log.report or print
-local lua_reader = function (specification)
+local function lua_reader (specification)
local fullname = specification.resolved
if fullname then
local loader = loadfile (fullname)
@@ -35,19 +35,19 @@ local lua_reader = function (specification)
end
end
-local eval_reader = function (specification)
+local function eval_reader (specification)
local eval = specification.eval
if not eval or type (eval) ~= "function" then return nil end
logreport ("both", 0, "loaders",
- "eval: found tfmdata for “%s”, injecting.",
+ "eval: found tfmdata for %q, injecting.",
specification.name)
return eval ()
end
-local unsupported_reader = function (format)
+local function unsupported_reader (format)
return function (specification)
logreport ("both", 4, "loaders",
- "font format “%s” unsupported; cannot load %s.",
+ "font format %q unsupported; cannot load %s.",
format, tostring (specification.name))
end
end
@@ -55,7 +55,7 @@ end
local type1_reader = fonts.readers.afm
local tfm_reader = fonts.readers.tfm
-local install_formats = function ()
+local function install_formats ()
local fonts = fonts
if not fonts then return false end
@@ -65,17 +65,17 @@ local install_formats = function ()
local formats = fonts.formats
if not readers or not formats then return false end
- local aux = function (which, reader)
+ local function aux (which, reader)
if not which or type (which) ~= "string"
or not reader or type (reader) ~= "function" then
- logreport ("both", 2, "loaders", "Error installing reader for “%s”.", which)
+ logreport ("both", 2, "loaders", "Error installing reader for %q.", which)
return false
end
formats [which] = "type1"
readers [which] = reader
if not seqset [which] then
logreport ("both", 3, "loaders",
- "Extending reader sequence for “%s”.", which)
+ "Extending reader sequence for %q.", which)
sequence [#sequence + 1] = which
seqset [which] = true
end
@@ -92,7 +92,7 @@ local install_formats = function ()
and aux ("dfont", unsupported_reader "dfont")
end
-local not_found_msg = function (specification, size, id)
+local function not_found_msg (specification, size, id)
logreport ("both", 0, "loaders", "")
logreport ("both", 0, "loaders",
"--------------------------------------------------------")
@@ -132,7 +132,7 @@ do
return id
end
- local patch = function (specification, size, id)
+ local function patch (specification, size, id)
local fontdata = ctx_read (specification, size, id)
----if not fontdata then not_found_msg (specification, size, id) end
if type (fontdata) == "table" and fontdata.encodingbytes == 2 then
@@ -151,7 +151,7 @@ do
return id
end
- local mk_info = function (name)
+ local function mk_info (name)
local definer = name == "patch" and patch or read
return function (specification, size, id)
logreport ("both", 0, "loaders", "defining font no. %d", id)
@@ -199,7 +199,7 @@ end
--doc]]--
-local purge_define_font = function ()
+local function purge_define_font ()
local cdesc = luatexbase.callback_descriptions "define_font"
--- define_font is an “exclusive” callback, meaning that there can
--- only ever be one entry. Everything beyond that would indicate
@@ -210,10 +210,10 @@ local purge_define_font = function ()
if d2 then --> issue warning
logreport ("both", 0, "loaders",
"Callback table for define_font contains multiple entries: \z
- { [%d] = “%s” } -- seems fishy.", i, d2)
+ { [%d] = %q } -- seems fishy.", i, d2)
end
logreport ("log", 0, "loaders",
- "Entry ``%s`` present in define_font callback; overriding.", d)
+ "Entry %q present in define_font callback; overriding.", d)
luatexbase.remove_from_callback ("define_font", d)
end
end
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-log.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-log.lua
index 2cbacd597f3..2a084772f50 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-log.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-log.lua
@@ -6,8 +6,8 @@
local ProvidesLuaModule = {
name = "luaotfload-log",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / logging",
license = "GPL v2.0",
author = "Khaled Hosny, Elie Roux, Philipp Gesang",
@@ -60,7 +60,7 @@ local loglevel = 0 --- default
local logout = "log"
--- int -> bool
-local set_loglevel = function (n)
+local function set_loglevel (n)
if type(n) == "number" then
loglevel = n
end
@@ -69,7 +69,7 @@ end
log.set_loglevel = set_loglevel
--- unit -> int
-local get_loglevel = function ( )
+local function get_loglevel ( )
return loglevel
end
log.get_loglevel = get_loglevel
@@ -85,7 +85,7 @@ to monitor the progress run "tail -f %s" in another terminal
local tmppath = os.getenv "TMPDIR" or "/tmp"
-local choose_logfile = function ( )
+local function choose_logfile ( )
if lfsisdir (tmppath) then
local fname
repeat --- ensure that file of that name doesn’t exist
@@ -98,7 +98,7 @@ local choose_logfile = function ( )
return false
end
-local set_logout = function (s, finalizers)
+local function set_logout (s, finalizers)
if s == "stdout" then
logout = "redirect"
elseif s == "file" then --- inject custom logger
@@ -149,14 +149,14 @@ log.set_logout = set_logout
local format_error_handler
if debug then
local debugtraceback = debug.traceback
- format_error_handler = function (err)
+ function format_error_handler (err)
print ""
print (stringformat ("luaotfload error: %q", err))
print (stringformat ("Lua interpreter %s", debugtraceback ()))
print ""
end
else
- format_error_handler = function (err)
+ function format_error_handler (err)
print ""
print (stringformat ("luaotfload error: %q", err))
print "Lua debug module not available; please enable for a backtrace"
@@ -164,7 +164,7 @@ else
end
end
-local basic_logger = function (category, fmt, ...)
+local function basic_logger (category, fmt, ...)
local res = { module_name, "|", category or "UNKNOWN", ":" }
if fmt then
local ok, val = xpcall (stringformat, format_error_handler, fmt, ...)
@@ -195,11 +195,11 @@ local kill_line = "\r\x1b[K"
if texjob == true then
--- We imitate the texio.* functions so the output is consistent.
- writeln = function (str)
+ function writeln (str)
iowrite "\n"
iowrite(str)
end
- statusln = function (str)
+ function statusln (str)
if first_status == false then
iowrite (kill_line)
else
@@ -208,11 +208,11 @@ if texjob == true then
iowrite (str)
end
else
- writeln = function (str)
+ function writeln (str)
iowrite(str)
iowrite "\n"
end
- statusln = function (str)
+ function statusln (str)
if first_status == false then
iowrite (kill_line)
end
@@ -220,7 +220,7 @@ else
end
end
-local stdout = function (writer, category, ...)
+local function stdout (writer, category, ...)
local res = { module_name, "|", category, ":" }
local nargs = select("#", ...)
if nargs == 0 then
@@ -331,7 +331,7 @@ local status_writer
local status_low = 99
local status_high = 99
-local status_start = function (low, high)
+local function status_start (low, high)
first_status = true
status_low = low
status_high = high
@@ -386,7 +386,7 @@ log.names_status_stop = status_stop
--doc]]--
-local texioreporter = function (message)
+local function texioreporter (message)
report ("log", 2, message)
end
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua
index 35378d91cbc..1c962c3950b 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua
@@ -20,8 +20,8 @@ local authors = "\z
-- version number is used below!
local ProvidesLuaModule = {
name = "luaotfload-main",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload entry point",
author = authors,
copyright = authors,
@@ -37,6 +37,7 @@ config = config or { }
luaotfload = luaotfload or { }
local luaotfload = luaotfload
luaotfload.log = luaotfload.log or { }
+local logreport
luaotfload.version = ProvidesLuaModule.version
luaotfload.loaders = { }
luaotfload.min_luatex_version = { 0, 95, 0 }
@@ -68,7 +69,7 @@ end
if not utf8 then
texio.write_nl("term and log", string.format("\z
\tluaotfload: module utf8 is unavailable\n\z
- \tutf8 is available in Lua 5.3+; engine\'s _VERSION is '%s'\n\z
+ \tutf8 is available in Lua 5.3+; engine\'s _VERSION is %q\n\z
\tThis probably means that the engine is not supported\n\z
\n",
_VERSION))
@@ -118,7 +119,7 @@ local type = type
--doc]]--
-local make_loader_name = function (prefix, name)
+local function make_loader_name (prefix, name)
local msg = luaotfload.log and luaotfload.log.report
or function (stream, lvl, cat, ...)
if lvl > 1 then --[[not pressing]] return end
@@ -129,14 +130,14 @@ local make_loader_name = function (prefix, name)
end
if not name then
msg ("both", 0, "load",
- "Fatal error: make_loader_name (“%s”, “%s”).",
+ "Fatal error: make_loader_name (%q, %q).",
tostring (prefix), tostring (name))
return "dummy-name"
end
name = tostring (name)
if prefix == false then
msg ("log", 9, "load",
- "No prefix requested, passing module name “%s” unmodified.",
+ "No prefix requested, passing module name %q unmodified.",
name)
return tostring (name) .. ".lua"
end
@@ -152,7 +153,7 @@ local timing_info = {
t_init = { },
}
-local make_loader = function (prefix, load_helper)
+local function make_loader (prefix, load_helper)
return function (name)
local t_0 = osgettimeofday ()
local modname = make_loader_name (prefix, name)
@@ -164,8 +165,8 @@ local make_loader = function (prefix, load_helper)
io.write "\n"
local msg = luaotfload.log and luaotfload.log.report or print
msg ("both", 0, "load", "FATAL ERROR")
- msg ("both", 0, "load", " × Failed to load module %q.",
- tostring (modname))
+ msg ("both", 0, "load", " × Failed to load %q module %q.",
+ tostring (prefix), tostring (name))
local lines = string.split (data, "\n\t")
if not lines then
msg ("both", 0, "load", " × Error message: %q", data)
@@ -194,9 +195,9 @@ end
called in the expected places.
--doc]]--
-local dummy_loader = function (name)
+local function dummy_loader (name)
luaotfload.log.report ("log", 3, "load",
- "Skipping module “%s” on purpose.",
+ "Skipping module %q on purpose.",
name)
end
@@ -205,14 +206,14 @@ luaotfload.fontloader = context_environment
local function context_isolated_load(name)
local fullname = kpse.find_file(name, 'lua')
if not fullname then
- error(string.format('Fontloader module "%s" could not be found.', name))
+ error(string.format('Fontloader module %q could not be found.', name))
end
return assert(loadfile(fullname, nil, context_environment))(name)
end
-local context_loader = function (name, path)
+local function context_loader (name, path)
luaotfload.log.report ("log", 3, "load",
- "Loading module “%s” from Context.",
+ "Loading module %q from Context.",
name)
local t_0 = osgettimeofday ()
local modname = make_loader_name (false, name)
@@ -220,12 +221,12 @@ local context_loader = function (name, path)
if path then
if lfs.isdir (path) then
luaotfload.log.report ("log", 3, "load",
- "Prepending path “%s”.",
+ "Prepending path %q.",
path)
modpath = file.join (path, modname)
else
luaotfload.log.report ("both", 0, "load",
- "Non-existant path “%s” specified, ignoring.",
+ "Non-existant path %q specified, ignoring.",
path)
end
end
@@ -239,12 +240,12 @@ local context_loader = function (name, path)
--- something isn’t right, but against HH’s coding practices. We’ll
--- silently ignore this ever happening on lower log levels.
luaotfload.log.report ("log", 4, "load",
- "Module “%s” returned “%s”.", ret)
+ "Module %q returned %q.", ret)
end
return ret
end
-local install_loaders = function ()
+local function install_loaders ()
local loaders = { }
local loadmodule = make_loader "luaotfload"
loaders.luaotfload = loadmodule
@@ -253,22 +254,21 @@ local install_loaders = function ()
loaders.ignore = dummy_loader
----loaders.plaintex = make_loader "luatex" --=> for Luatex-Plain
- loaders.initialize = function (name)
+ function loaders.initialize (name)
local tmp = loadmodule (name)
- local logreport = luaotfload.log.report
local init = type(tmp) == "table" and tmp.init or tmp
if init and type (init) == "function" then
local t_0 = osgettimeofday ()
if not init () then
logreport ("log", 0, "load",
- "Failed to load module “%s”.", name)
+ "Failed to load module %q.", name)
return
end
local t_end = osgettimeofday ()
local d_t = t_end - t_0
logreport ("log", 4, "load",
- "Module “%s” loaded in %d ms.",
- name, d_t)
+ "Module %q loaded in %g ms.",
+ name, d_t * 1000)
timing_info.t_init [name] = d_t
end
end
@@ -294,15 +294,22 @@ luaotfload.main = function ()
local initialize = loaders.initialize
local starttime = osgettimeofday ()
+
+ -- Feature detect HarfBuzz. This is done early to allow easy HarfBuzz
+ -- detection in other modules
+ local harfstatus, harfbuzz = pcall(require, 'luaharfbuzz')
+ if harfstatus then
+ luaotfload.harfbuzz = harfbuzz
+ end
+
local init = loadmodule "init" --- fontloader initialization
init (function ()
+ logreport = luaotfload.log.report
initialize "parsers" --- fonts.conf and syntax
initialize "configuration" --- configuration options
end)
- local logreport = luaotfload.log.report
-
initialize "loaders" --- Font loading; callbacks
initialize "database" --- Font management.
initialize "colors" --- Per-font colors.
@@ -316,18 +323,16 @@ luaotfload.main = function ()
initialize "features" --- font request and feature handling
- loadmodule "letterspace" --- extra character kerning
- loadmodule "embolden" --- fake bold
- loadmodule "notdef" --- missing glyph handling
- local harfstatus, harfbuzz = pcall(require, 'luaharfbuzz')
if harfstatus then
- luaotfload.harfbuzz = harfbuzz
loadmodule "harf-define"
loadmodule "harf-plug"
end
+ loadmodule "letterspace" --- extra character kerning
+ loadmodule "embolden" --- fake bold
+ loadmodule "notdef" --- missing glyph handling
+ loadmodule "suppress" --- suppress ligatures by adding ZWNJ
+ loadmodule "szss" --- missing glyph handling
initialize "auxiliary" --- additional high-level functionality
- loadmodule "fallback" --- ...
- loadmodule "multiscript" --- ...
loadmodule "tounicode"
luaotfload.aux.start_rewrite_fontname () --- to be migrated to fontspec
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-multiscript.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-multiscript.lua
index f6a272ecabd..5638d281c74 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-multiscript.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-multiscript.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-multiscript",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / multiscript",
license = "GPL v2.0",
author = "Marcel Krüger"
@@ -23,14 +23,30 @@ local getwhd = node.direct.getwhd
local insert_after = node.direct.insert_after
local traverse_char = node.direct.traverse_char
local protect_glyph = node.direct.protect_glyph
+local flush_node = node.direct.flush_node
+local remove = node.direct.remove
local otffeatures = fonts.constructors.newfeatures "otf"
-- local normalize = fonts.handlers.otf.features.normalize
local definers = fonts.definers
-local define_font = luaotfload.define_font
+local define_font -- = luaotfload.define_font % This is set when the first font is loaded.
local scripts_lib = require'luaotfload-scripts'.script
local script_to_iso = scripts_lib.to_iso
local script_to_ot = scripts_lib.to_ot
+local delayedremove, finishremove do
+ local removed
+ function finishremove()
+ if removed then
+ flush_node(removed)
+ end
+ removed = nil
+ end
+ function delayedremove(head, current)
+ finishremove()
+ removed = current
+ return remove(head, current)
+ end
+end
local harf = luaotfload.harfbuzz
local GSUBtag, GPOStag
if harf then
@@ -63,55 +79,56 @@ local script_extensions do
end
end
end
+local script_list = {}
local script_mapping do
-- We could extract these from PropertyValueAliases.txt...
local script_aliases = {
- Adlam = "Adlm", Caucasian_Albanian = "Aghb", Ahom = "Ahom", Arabic = "Arab",
- Imperial_Aramaic = "Armi", Armenian = "Armn", Avestan = "Avst",
- Balinese = "Bali", Bamum = "Bamu", Bassa_Vah = "Bass", Batak = "Batk",
- Bengali = "Beng", Bhaiksuki = "Bhks", Bopomofo = "Bopo", Brahmi = "Brah",
- Braille = "Brai", Buginese = "Bugi", Buhid = "Buhd", Chakma = "Cakm",
- Canadian_Aboriginal = "Cans", Carian = "Cari", Cham = "Cham",
- Cherokee = "Cher", Coptic = "Copt", Cypriot = "Cprt", Cyrillic = "Cyrl",
- Devanagari = "Deva", Dogra = "Dogr", Deseret = "Dsrt", Duployan = "Dupl",
- Egyptian_Hieroglyphs = "Egyp", Elbasan = "Elba", Elymaic = "Elym",
- Ethiopic = "Ethi", Georgian = "Geor", Glagolitic = "Glag",
- Gunjala_Gondi = "Gong", Masaram_Gondi = "Gonm", Gothic = "Goth",
- Grantha = "Gran", Greek = "Grek", Gujarati = "Gujr", Gurmukhi = "Guru",
- Hangul = "Hang", Han = "Hani", Hanunoo = "Hano", Hatran = "Hatr",
- Hebrew = "Hebr", Hiragana = "Hira", Anatolian_Hieroglyphs = "Hluw",
- Pahawh_Hmong = "Hmng", Nyiakeng_Puachue_Hmong = "Hmnp",
- Katakana_Or_Hiragana = "Hrkt", Old_Hungarian = "Hung", Old_Italic = "Ital",
- Javanese = "Java", Kayah_Li = "Kali", Katakana = "Kana",
- Kharoshthi = "Khar", Khmer = "Khmr", Khojki = "Khoj", Kannada = "Knda",
- Kaithi = "Kthi", Tai_Tham = "Lana", Lao = "Laoo", Latin = "Latn",
- Lepcha = "Lepc", Limbu = "Limb", Linear_A = "Lina", Linear_B = "Linb",
- Lisu = "Lisu", Lycian = "Lyci", Lydian = "Lydi", Mahajani = "Mahj",
- Makasar = "Maka", Mandaic = "Mand", Manichaean = "Mani", Marchen = "Marc",
- Medefaidrin = "Medf", Mende_Kikakui = "Mend", Meroitic_Cursive = "Merc",
- Meroitic_Hieroglyphs = "Mero", Malayalam = "Mlym", Modi = "Modi",
- Mongolian = "Mong", Mro = "Mroo", Meetei_Mayek = "Mtei", Multani = "Mult",
- Myanmar = "Mymr", Nandinagari = "Nand", Old_North_Arabian = "Narb",
- Nabataean = "Nbat", Newa = "Newa", Nko = "Nkoo", Nushu = "Nshu",
- Ogham = "Ogam", Ol_Chiki = "Olck", Old_Turkic = "Orkh", Oriya = "Orya",
- Osage = "Osge", Osmanya = "Osma", Palmyrene = "Palm", Pau_Cin_Hau = "Pauc",
- Old_Permic = "Perm", Phags_Pa = "Phag", Inscriptional_Pahlavi = "Phli",
- Psalter_Pahlavi = "Phlp", Phoenician = "Phnx", Miao = "Plrd",
- Inscriptional_Parthian = "Prti", Rejang = "Rjng", Hanifi_Rohingya = "Rohg",
- Runic = "Runr", Samaritan = "Samr", Old_South_Arabian = "Sarb",
- Saurashtra = "Saur", SignWriting = "Sgnw", Shavian = "Shaw",
- Sharada = "Shrd", Siddham = "Sidd", Khudawadi = "Sind", Sinhala = "Sinh",
- Sogdian = "Sogd", Old_Sogdian = "Sogo", Sora_Sompeng = "Sora",
- Soyombo = "Soyo", Sundanese = "Sund", Syloti_Nagri = "Sylo",
- Syriac = "Syrc", Tagbanwa = "Tagb", Takri = "Takr", Tai_Le = "Tale",
- New_Tai_Lue = "Talu", Tamil = "Taml", Tangut = "Tang", Tai_Viet = "Tavt",
- Telugu = "Telu", Tifinagh = "Tfng", Tagalog = "Tglg", Thaana = "Thaa",
- Thai = "Thai", Tibetan = "Tibt", Tirhuta = "Tirh", Ugaritic = "Ugar",
- Vai = "Vaii", Warang_Citi = "Wara", Wancho = "Wcho", Old_Persian = "Xpeo",
- Cuneiform = "Xsux", Yi = "Yiii", Zanabazar_Square = "Zanb",
- Inherited = "Zinh", Common = "Zyyy", Unknown = "Zzzz",
+ Adlam = "adlm", Caucasian_Albanian = "aghb", Ahom = "ahom", Arabic = "arab",
+ Imperial_Aramaic = "armi", Armenian = "armn", Avestan = "avst",
+ Balinese = "bali", Bamum = "bamu", Bassa_Vah = "bass", Batak = "batk",
+ Bengali = "beng", Bhaiksuki = "bhks", Bopomofo = "bopo", Brahmi = "brah",
+ Braille = "brai", Buginese = "bugi", Buhid = "buhd", Chakma = "cakm",
+ Canadian_Aboriginal = "cans", Carian = "cari", Cham = "cham",
+ Cherokee = "cher", Coptic = "copt", Cypriot = "cprt", Cyrillic = "cyrl",
+ Devanagari = "deva", Dogra = "dogr", Deseret = "dsrt", Duployan = "dupl",
+ Egyptian_Hieroglyphs = "egyp", Elbasan = "elba", Elymaic = "elym",
+ Ethiopic = "ethi", Georgian = "geor", Glagolitic = "glag",
+ Gunjala_Gondi = "gong", Masaram_Gondi = "gonm", Gothic = "goth",
+ Grantha = "gran", Greek = "grek", Gujarati = "gujr", Gurmukhi = "guru",
+ Hangul = "hang", Han = "hani", Hanunoo = "hano", Hatran = "hatr",
+ Hebrew = "hebr", Hiragana = "hira", Anatolian_Hieroglyphs = "hluw",
+ Pahawh_Hmong = "hmng", Nyiakeng_Puachue_Hmong = "hmnp",
+ Katakana_Or_Hiragana = "hrkt", Old_Hungarian = "hung", Old_Italic = "ital",
+ Javanese = "java", Kayah_Li = "kali", Katakana = "kana",
+ Kharoshthi = "khar", Khmer = "khmr", Khojki = "khoj", Kannada = "knda",
+ Kaithi = "kthi", Tai_Tham = "lana", Lao = "laoo", Latin = "latn",
+ Lepcha = "lepc", Limbu = "limb", Linear_A = "lina", Linear_B = "linb",
+ Lisu = "lisu", Lycian = "lyci", Lydian = "lydi", Mahajani = "mahj",
+ Makasar = "maka", Mandaic = "mand", Manichaean = "mani", Marchen = "marc",
+ Medefaidrin = "medf", Mende_Kikakui = "mend", Meroitic_Cursive = "merc",
+ Meroitic_Hieroglyphs = "mero", Malayalam = "mlym", Modi = "modi",
+ Mongolian = "mong", Mro = "mroo", Meetei_Mayek = "mtei", Multani = "mult",
+ Myanmar = "mymr", Nandinagari = "nand", Old_North_Arabian = "narb",
+ Nabataean = "nbat", Newa = "newa", Nko = "nkoo", Nushu = "nshu",
+ Ogham = "ogam", Ol_Chiki = "olck", Old_Turkic = "orkh", Oriya = "orya",
+ Osage = "osge", Osmanya = "osma", Palmyrene = "palm", Pau_Cin_Hau = "pauc",
+ Old_Permic = "perm", Phags_Pa = "phag", Inscriptional_Pahlavi = "phli",
+ Psalter_Pahlavi = "phlp", Phoenician = "phnx", Miao = "plrd",
+ Inscriptional_Parthian = "prti", Rejang = "rjng", Hanifi_Rohingya = "rohg",
+ Runic = "runr", Samaritan = "samr", Old_South_Arabian = "sarb",
+ Saurashtra = "saur", SignWriting = "sgnw", Shavian = "shaw",
+ Sharada = "shrd", Siddham = "sidd", Khudawadi = "sind", Sinhala = "sinh",
+ Sogdian = "sogd", Old_Sogdian = "sogo", Sora_Sompeng = "sora",
+ Soyombo = "soyo", Sundanese = "sund", Syloti_Nagri = "sylo",
+ Syriac = "syrc", Tagbanwa = "tagb", Takri = "takr", Tai_Le = "tale",
+ New_Tai_Lue = "talu", Tamil = "taml", Tangut = "tang", Tai_Viet = "tavt",
+ Telugu = "telu", Tifinagh = "tfng", Tagalog = "tglg", Thaana = "thaa",
+ Thai = "thai", Tibetan = "tibt", Tirhuta = "tirh", Ugaritic = "ugar",
+ Vai = "vaii", Warang_Citi = "wara", Wancho = "wcho", Old_Persian = "xpeo",
+ Cuneiform = "xsux", Yi = "yiii", Zanabazar_Square = "zanb",
+ Inherited = "zinh", Common = "zyyy", Unknown = "zzzz",
}
- local entry = lpeg.Cg(codepoint_range * sep * ((lpeg.R'AZ' + lpeg.R'az' + '_')^1/script_aliases/string.lower))^-1 * (1-lpeg.P'\n')^0 * '\n'
+ local entry = lpeg.Cg(codepoint_range * sep * ((lpeg.R'AZ' + lpeg.R'az' + '_')^1/script_aliases))^-1 * (1-lpeg.P'\n')^0 * '\n'
-- local entry = lpeg.Cg(codepoint_range * sep * lpeg.Cc(true))^-1 * (1-lpeg.P'\n')^0 * '\n'
local file = lpeg.Cf(
lpeg.Ct''
@@ -121,6 +138,23 @@ local script_mapping do
local f = io.open(kpse.find_file"Scripts.txt")
script_mapping = file:match(f:read'*a')
f:close()
+
+ for _, scr in next, script_aliases do
+ script_list[#script_list + 1] = scr
+ end
+end
+
+table.sort(script_list)
+local script_mark_offset = 0x200000
+local script_marks = {}
+do
+ for i=1,#script_list do
+ local codepoint = script_mark_offset - 1 + i
+ local scr = script_list[i]
+ -- script_mapping[codepoint] = scr
+ script_marks[scr] = codepoint
+ script_marks[codepoint] = scr
+ end
end
local function load_on_demand(specifications, size)
@@ -184,6 +218,7 @@ local function is_dominant_script(scripts, script, first, ...)
end
local function makecombifont(tfmdata, _, additional_scripts)
+ define_font = define_font or luaotfload.define_font -- Lazy loading because this file get's loaded before define_font is defined
local has_auto
additional_scripts = tostring(additional_scripts)
if additional_scripts:sub(1, 5) == "auto+" then
@@ -287,12 +322,12 @@ end
local glyph_id = node.id'glyph'
-- TODO: unset last_script, matching parentheses etc
-function domultiscript(head, _, _, _, direction)
+local function domultiscript(head, _, _, _, direction)
head = node.direct.todirect(head)
local last_fid, last_fonts, last_script
for cur, cid, fid in traverse_char(head) do
if fid ~= last_fid then
- last_fid, last_fonts, last_script = fid, additional_scripts_fonts[fid]
+ last_fid, last_fonts = fid, additional_scripts_fonts[fid]
end
if last_fonts then
local mapped_scr = script_mapping[cid]
@@ -321,8 +356,18 @@ function domultiscript(head, _, _, _, direction)
if mapped_font then
setfont(cur, mapped_font)
end
+ elseif fid == 0 then
+ local script_mark = script_marks[cid]
+ if script_mark then
+ head = delayedremove(head, current) -- Instead of removing them we could also keep them and suppress the missing glyph warning, but this seems cleaner
+ last_script = script_mark
+ end
+ else
+ last_script = nil
end
end
+ finishremove() -- Cleanup
+ return head
end
function luaotfload.add_multiscript(name, fonts)
@@ -336,6 +381,10 @@ function luaotfload.add_multiscript(name, fonts)
return name
end
+function luaotfload.get_script_mark(scr)
+ return script_marks[scr]
+end
+
otffeatures.register {
name = "multiscript",
description = "Combine fonts for multiple scripts",
@@ -349,4 +398,8 @@ otffeatures.register {
-- }
}
+return {
+ -- I would omit the table if that wouldn't cause the function to be used as initializer
+ process = domultiscript,
+}
--- vim:sw=2:ts=2:expandtab:tw=71
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-notdef.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-notdef.lua
index 3156882e866..7108e7d7dfd 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-notdef.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-notdef.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-notdef",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / color",
license = "GPL v2.0",
author = "Marcel Krüger"
@@ -16,6 +16,7 @@ if luatexbase and luatexbase.provides_module then
luatexbase.provides_module (ProvidesLuaModule)
end
+local harfbuzz = luaotfload.harfbuzz
local flush_node = node.direct.flush_node
local getfont = font.getfont
local getnext = node.direct.getnext
@@ -23,12 +24,21 @@ local getwhd = node.direct.getwhd
local insert = table.insert
local insert_after = node.direct.insert_after
local kern_id = node.id'kern'
+local disc_id = node.id'disc'
local nodenew = node.direct.new
+local nodecopy = node.direct.copy
local otfregister = fonts.constructors.features.otf.register
local protect_glyph = node.direct.protect_glyph
local remove = node.direct.remove
local setfont = node.direct.setfont
local traverse_char = node.direct.traverse_char
+local traverse_id = node.direct.traverse_id
+local setchar = node.direct.setchar
+local getwidth = node.direct.getwidth
+local setkern = node.direct.setkern
+local setattributelist = node.direct.setattributelist
+local getattributelist = node.direct.getattributelist
+local setmove = luaotfload.fontloader.nodes.injections.setmove
-- According to DerivedCoreProperties.txt, Default_Ignorable_Code_Point
-- is generated from:
@@ -154,42 +164,211 @@ otfregister {
}
}
-function fonts.handlers.otf.handlers.gsub_remove(head,char,dataset,sequence,replacement)
- local next
- head, next = remove(head, char)
- flush_node(char)
- if not head and not next then -- Avoid a double free if we were alone
- head = nodenew(kern_id)
- end
- return head, next, true, true
-end
+local font_invisible_replacement = setmetatable({}, {__index = function(t, fid)
+ local fontdata = font.getfont(fid)
+ local replacement = fontdata.shared.features.invisible
+ if replacement == "remove" then
+ t[fid] = false
+ return false
+ end
+ replacement = tonumber(replacement) or 32
+ local char = fontdata.characters[replacement]
+ if char then
+ t[fid] = {replacement, -char.width}
+ return t[fid]
+ else
+ t[fid] = false
+ return false
+ end
+end})
-local sequence = {
- features = {invisible = {["*"] = {["*"] = true}}},
+local push, pop do
+ local function checkprop(n)
+ local p = node.direct.getproperty(n)
+ return p and p.zwnj
+ end
+ local list = {}
+ function push(head)
+ head = node.direct.todirect(head)
+ local l = {}
+ list[#list+1] = l
+ for n, id in node.direct.traverse(head) do
+ if checkprop(n) then
+ head = node.direct.remove(head, n)
+ l[#l+1] = n
+ elseif id == disc_id then
+ local pre, post, replace = node.direct.getdisc(n)
+ for nn in node.direct.traverse(pre) do
+ if checkprop(nn) then
+ local after
+ pre, after = node.direct.remove(pre, nn)
+ l[#l+1] = {nn, n, 'pre'}
+ end
+ end
+ for nn in node.direct.traverse(post) do
+ if checkprop(nn) then
+ post = node.direct.remove(post, nn)
+ l[#l+1] = {nn, n, 'post'}
+ end
+ end
+ for nn in node.direct.traverse(replace) do
+ if checkprop(nn) then
+ replace = node.direct.remove(replace, nn)
+ l[#l+1] = {nn, n, 'replace'}
+ end
+ end
+ node.direct.setdisc(n, pre, post, replace)
+ end
+ end
+ return head
+ end
+ local getfield, setfield = node.direct.getfield, node.direct.setfield
+ local function pop(head)
+ head = node.direct.todirect(head)
+ local l = list[#list]
+ list[#list] = nil
+ for i = #l,1,-1 do
+ local e = l[i]
+ local n = tonumber(e)
+ local disc, thishead
+ if n then
+ thishead = head
+ else
+ disc, n = e[2], e[1]
+ thishead = getfield(disc, e[3])
+ end
+ local prev, next = node.direct.getboth(n)
+ if prev or not next then
+ thishead = node.direct.insert_after(thishead, prev, n)
+ else
+ thishead = node.direct.insert_before(thishead, next, n)
+ end
+ if disc then
+ setfield(disc, e[3], thishead)
+ else
+ head = thishead
+ end
+ end
+ return head
+ end
+ fonts.handlers.otf.handlers.marked_push = push
+ fonts.handlers.otf.handlers.marked_pop = pop
+end
+local sequence1 = {
+ features = {["semiignored-node"] = {["*"] = {["*"] = true}}},
flags = {false, false, false, false},
- name = "invisible",
- order = {"invisible"},
- nofsteps = 1,
- steps = {{
- coverage = ignorable_codepoints,
- index = 1,
- }},
- type = "gsub_remove",
+ name = "semiignored-node",
+ order = {"semiignored-node"},
+ type = "marked_push",
}
-local function invisibleinitialiser(tfmdata, value)
+local sequence2 = {
+ features = {["semiignored-node"] = {["*"] = {["*"] = true}}},
+ flags = {false, false, false, false},
+ name = "semiignored-node",
+ order = {"semiignored-node"},
+ type = "marked_pop",
+}
+local function pushpopinitialiser(tfmdata, value, features)
local resources = tfmdata.resources
local sequences = resources and resources.sequences
+ local first_gpos, last_gpos
if sequences then
- -- Now we get to the interesting part: At which point should our new sequence be inserted? Let's do it at the end, then they are still seen by all features.
- insert(sequences, sequence)
+ local alreadydone
+ for i=1,#sequences do
+ local sequence = sequences[i]
+ if sequence1 == sequence then
+ return
+ elseif sequence.type:sub(1,5) == "gpos_" then
+ if not first_gpos then
+ first_gpos = i
+ end
+ last_gpos = i
+ end
+ end
+ if first_gpos then
+ insert(sequences, last_gpos+1, sequence2)
+ insert(sequences, first_gpos, sequence1)
+ end
end
end
+
+otfregister {
+ name = 'semiignored-node',
+ description = 'Allow adding nodes which break ligatures but do not affect kerning',
+ default = true, -- Should basically never be disabled manually
+ initializers = {
+ node = pushpopinitialiser,
+ -- plug = ? -- TODO: Manually handle in luaotfload-harf-plug.lua
+ },
+}
+
+ignorable_replacement = {}
+
+local delayed_remove do
+ local delayed
+ function delayed_remove(n)
+ flush_node(delayed)
+ delayed = n
+ end
+end
+
+local function ignorablehandler(head, fid, ...) -- FIXME: The arguments are probably wrong
+ local fontparam = font_invisible_replacement[fid]
+ local replacement = fontparam and fontparam[1]
+ local font_kern = fontparam and fontparam[2]
+ for n, c, f in traverse_char(head) do if f == fid then
+ local lookup = ignorable_codepoints[c]
+ if lookup then
+ if replacement then
+ setchar(n, replacement)
+ if font_kern then
+ local k = nodenew(kern_id)
+ setkern(k, font_kern)
+ setattributelist(k, getattributelist(n))
+ head = insert_after(head, n, k)
+ end
+ else
+ local after
+ head, after = remove(head, n)
+ delayed_remove(n)
+ end
+ end
+ end end
+ delayed_remove()
+ for n in traverse_id(head, disc_id) do
+ local a, b, c = getdisc(n)
+ setdisc(ignorablehandler(a, fid), ignorablehandler(b, fid), ignorablehandler(c, fid))
+ end
+ return head
+end
+
+if harfbuzz then
+ local harf_settings = luaotfload.harf
+ local preserve_flag = harfbuzz.Buffer.FLAG_PRESERVE_DEFAULT_IGNORABLES or 0
+ local remove_flag = harfbuzz.Buffer.FLAG_REMOVE_DEFAULT_IGNORABLES or 0
+ local dotted_circle_flag = harfbuzz.Buffer.FLAG_DO_NOT_INSERT_DOTTED_CIRCLE or 0
+ harf_settings.default_buf_flags = (harf_settings.default_buf_flags & ~remove_flag) | preserve_flag | dotted_circle_flag
+ local function dottedcircleinitialize(tfmdata, value)
+ if not tfmdata.hb then return end
+ local hb = tfmdata.hb
+ hb.buf_flags = hb.buf_flags & ~dotted_circle_flag
+ end
+ otfregister {
+ name = 'dottedcircle',
+ description = 'Insert dotted circle to fix invalid clusters',
+ default = true,
+ initializers = {
+ plug = dottedcircleinitialize,
+ },
+ }
+end
otfregister {
name = 'invisible',
description = 'Remove invisible control characters',
default = true,
- initializers = {
- node = invisibleinitialiser,
+ processors = {
+ node = ignorablehandler,
+ plug = ignorablehandler,
},
}
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-parsers.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-parsers.lua
index 2cdd0063783..c331cb4ef02 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-parsers.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-parsers.lua
@@ -7,8 +7,8 @@
local ProvidesLuaModule = {
name = "luaotfload-parsers",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / filelist",
license = "GPL v2.0"
}
@@ -147,7 +147,7 @@ local xml_attr_list = Cf(Ct"" * xml_attr^1, rawset)
scan_node creates a parser for a given xml tag.
--doc]]--
--- string -> bool -> lpeg_t
-local scan_node = function (tag)
+local function scan_node (tag)
--- Node attributes go into a table with the index “attributes”
--- (relevant for “prefix="xdg"” and the likes).
local p_tag = P(tag)
@@ -192,7 +192,7 @@ local p_cheapxml = header * root
of the nodes it managed to extract from the file.
--doc]]--
--- string -> path list
-local fonts_conf_scanner = function (path)
+local function fonts_conf_scanner (path)
logreport("both", 5, "db", "Read fontconfig file %s.", path)
local fh = ioopen(path, "r")
if not fh then
@@ -218,7 +218,7 @@ end
local p_conf = P".conf" * P(-1)
local p_filter = (1 - p_conf)^1 * p_conf
-local conf_filter = function (path)
+local function conf_filter (path)
if lpegmatch (p_filter, path) then
return true
end
@@ -248,18 +248,16 @@ end
--- -> string list -> string list -> string list
--- -> (string -> fun option -> string list)
--- -> tab * tab * tab
-local read_fonts_conf_indeed
--- MK Made basedir an explicit parameter to fix relative paths
-read_fonts_conf_indeed = function (depth,
- start,
- home,
- xdg_config_home,
- xdg_data_home,
- acc,
- done,
- dirs_done,
- find_files,
- basedir)
+local function read_fonts_conf_indeed (depth,
+ start,
+ home,
+ xdg_config_home,
+ xdg_data_home,
+ acc,
+ done,
+ dirs_done,
+ find_files,
+ basedir)
logreport ("both", 4, "db",
"Fontconfig scanner processing path %s.",
@@ -371,7 +369,6 @@ read_fonts_conf_indeed = function (depth,
--inspect(done)
return acc, done, dirs_done
end --- read_fonts_conf_indeed()
--- /MK
--[[doc--
read_fonts_conf() sets up an accumulator and two sets
@@ -386,7 +383,7 @@ end --- read_fonts_conf_indeed()
--- list -> (string -> function option -> string list) -> list
-local read_fonts_conf = function (path_list, find_files)
+local function read_fonts_conf (path_list, find_files)
local home = kpseexpand_path"~" --- could be os.getenv"HOME"
local xdg_config_home = kpseexpand_path"$XDG_CONFIG_HOME"
if xdg_config_home == "" then xdg_config_home = filejoin(home, ".config") end
@@ -502,7 +499,7 @@ local splitcomma = Ct((C(noncomma^1) + comma)^1)
--doc]]--
-local handle_xetex_option = function (val)
+local function handle_xetex_option (val)
return tostring(1 + tonumber(val))
end
@@ -514,7 +511,7 @@ end
--doc]]--
-local check_garbage = function (_,i, garbage)
+local function check_garbage (_,i, garbage)
if stringfind(garbage, "/") then
logreport("log", 0, "load", --- ffs use path!
"warning: path in file: lookups is deprecated; ")
@@ -536,7 +533,7 @@ local featuresep = comma + semicolon
we only support the shorthands for italic / bold / bold italic
shapes, as well as setting optical size, the rest is ignored.
--doc]]--
-local style_modifier = (P"BI" + P"IB" + P"bi" + P"ib" + S"biBI")
+local style_modifier = (S'bB' * S'iI'^-1 + S'iI' * S'bB'^-1)
/ stringlower
local size_modifier = S"Ss" * P"=" --- optical size
* Cc"optsize" * C(decimal)
@@ -697,7 +694,7 @@ local truth_ids = {
off = false,
}
-local maybe_cast = function (var)
+local function maybe_cast (var)
local bool = truth_ids[var]
if bool ~= nil then
return bool
@@ -705,7 +702,7 @@ local maybe_cast = function (var)
return tonumber (var) or var
end
-local escape = function (chr, repl)
+local function escape (chr, repl)
return (backslash * P(chr) / (repl or chr))
end
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-resolvers.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-resolvers.lua
index c49fa58fd97..e07c09cde67 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-resolvers.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-resolvers.lua
@@ -11,8 +11,8 @@
local ProvidesLuaModule = {
name = "luaotfload-resolvers",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / resolvers",
license = "GPL v2.0"
}
@@ -114,9 +114,9 @@ local function resolve_name (specification)
end
local resolved, subfont = resolver (specification)
if resolved then
- logreport ("log", 1, "resolve", "name lookup %q -> \"%s%s\"",
- specification.name, resolved,
- subfont and stringformat ("(%d)", subfont) or "")
+ logreport ("log", 1, "resolve", "name lookup %q -> %q",
+ specification.name, resolved ..
+ (subfont and stringformat ("(%d)", subfont) or ""))
return resolved, tonumber(subfont)
end
return resolve_file (specification)
@@ -149,7 +149,7 @@ end
local tex_formats = { "tfm", "ofm" }
local resolvers_findfile = luaotfload.fontloader.resolvers.findfile
-local resolve_tex_format = function (specification)
+local function resolve_tex_format (specification)
local name = specification.name
for i=1, #tex_formats do
local format = tex_formats [i]
@@ -160,7 +160,7 @@ local resolve_tex_format = function (specification)
end
end
-local resolve_path_if_exists = function (specification)
+local function resolve_path_if_exists (specification)
local spec = specification.specification
local exists = lfsisfile (spec)
if exists then
@@ -179,7 +179,7 @@ end
Custom file resolvers via callback.
--doc]]--
-local resolve_my = function (specification)
+local function resolve_my (specification)
return luatexbase.call_callback ("luaotfload.resolve_font", specification)
end
@@ -191,7 +191,7 @@ local resolve_methods = {
my = resolve_my,
}
-local resolve_sequence = function (seq, specification)
+local function resolve_sequence (seq, specification)
for i = 1, #seq do
local id = seq [i]
local mth = resolve_methods [id]
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-scripts.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-scripts.lua
index 814223b5ed5..4a9ec0f6dc5 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-scripts.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-scripts.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-script",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / Script helpers",
license = "CC0 1.0 Universal",
author = "Marcel Krüger"
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-status.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-status.lua
index ed3324f304c..02cf06f89ce 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-status.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-status.lua
@@ -1,14 +1,14 @@
return {
["hashes"]={
- { "fontloader-2020-01-26.lua", "010915906c0926fc7f5f4d064a879be4" },
+ { "fontloader-2020-04-30.lua", "e3b9c1d6344645b552f8002a97aa09ca" },
{ "fontloader-util-fil.lua", "4bb3e4dc72e308d8ed67cd7a80027fa7" },
- { "fontloader-util-str.lua", "2e4625b13a5f4be76b1d8664a32119ec" },
+ { "fontloader-util-str.lua", "2c1a12d8248d3719c0b5fc93184242bf" },
{ "fontloader-l-unicode.lua", "9bc311ce08ce498f9caacb6164ea1d9f" },
{ "fontloader-l-math.lua", "a373be3ed2db0d5f98588fa81abca48f" },
{ "fontloader-l-boolean.lua", "18ed6c4b2c40dd87224ea33229548d20" },
{ "fontloader-l-file.lua", "60ddd3948d9de7bde8b4a0f5c51ff9f5" },
{ "fontloader-l-io.lua", "a4042e9d6bce71c61fdd94e6e17f2bf4" },
- { "fontloader-l-table.lua", "a495e837874aa3e4fa57fea4dd05a26c" },
+ { "fontloader-l-table.lua", "20c03ae1b81e902217f3f76995b9d294" },
{ "fontloader-l-string.lua", "e1347bef0eeeff9f098df83b30b32df9" },
{ "fontloader-l-function.lua", "f771cc91839ebcdfc094083434fbe00f" },
{ "fontloader-l-lpeg.lua", "efe630e3a9a1d269120e59cfd8fba4ba" },
@@ -21,7 +21,7 @@ return {
{ "fontloader-fonts-enc.lua", "3e71a54297e8f85a1ac438bb0f20dd79" },
{ "fontloader-fonts-mis.lua", "bc9eb43c27f63ce9d0fff67e104fe1c6" },
{ "fontloader-basics-chr.lua", "58b7ef0c486e06090b362971b9f85e27" },
- { "fontloader-basics-nod.lua", "4ce2f7c752fdc4c1d6d9f74e8cd50be8" },
+ { "fontloader-basics-nod.lua", "68226d7dadd241bca55171af9ce1f243" },
{ "fontloader-font-imp-effects.lua", "73a660359a0ec71e44cc2b7225a715ac" },
{ "fontloader-font-imp-italics.lua", "fe1ca80fb5ea4a2f8d2d5c484e7ba913" },
{ "fontloader-font-imp-ligatures.lua", "043daa4fcccf2560868da359d71d3a4a" },
@@ -32,63 +32,64 @@ return {
{ "fontloader-font-one.lua", "987c5c5ed3754ad2feab80985067d59e" },
{ "fontloader-font-onr.lua", "22572ec0f86f53631e14b6d1ed43ee51" },
{ "fontloader-font-otc.lua", "1204a2fdc436e644127c0aa38ab69607" },
- { "fontloader-font-ocl.lua", "c1f4cbea3c4ec5002a04fc637b135711" },
- { "fontloader-font-osd.lua", "39e92f6e575741646d75ea79e3be87f3" },
- { "fontloader-font-ots.lua", "d0107799ec82da7f96dafe9626c5ee7f" },
- { "fontloader-font-ota.lua", "d6dfb94563d6a52675e274b2e673e4a6" },
- { "fontloader-font-otj.lua", "66c7a910d95d4a52b81061de776898e1" },
+ { "fontloader-font-ocl.lua", "e6b45379971219a6227e8655cda14aff" },
+ { "fontloader-font-osd.lua", "61f05fcf91add1aa5dac9bc8b235adc9" },
+ { "fontloader-font-ots.lua", "113b7ad0c40d4786bb026706e479c3f3" },
+ { "fontloader-font-ota.lua", "dd5f1c8ba28abaf4505fd960d04a3a98" },
+ { "fontloader-font-otj.lua", "c9ded1d935bfa43020657e1f408fb820" },
{ "fontloader-font-oto.lua", "24238a7c600d090a8ee88312321dd9b3" },
- { "fontloader-font-otl.lua", "ec0241b7465a7713e53c246e8e9fb2a8" },
- { "fontloader-font-oup.lua", "0cef35af01739f52fd09feb5401192ae" },
- { "fontloader-font-dsp.lua", "5d3db0184c903829b2c5bddcb8cdb14c" },
+ { "fontloader-font-otl.lua", "f111f9ac18d24049fadeb8883e4e8da5" },
+ { "fontloader-font-oup.lua", "1700a2dac4f8b105c187d4e5b84cecdf" },
+ { "fontloader-font-dsp.lua", "618e5e760ec5dceb0c898a83816dbe61" },
{ "fontloader-font-ttf.lua", "44e61cef50dab9b1aaf48130f9367c34" },
- { "fontloader-font-cff.lua", "c769020b41b39418f703347f3d328bc7" },
+ { "fontloader-font-cff.lua", "155821e11e84021437869ff973e75d93" },
{ "fontloader-font-ott.lua", "aba6d8335a5f38a5a62d3631492f3392" },
{ "fontloader-font-oti.lua", "dbae7722baae24d917a17176553825cf" },
{ "fontloader-font-otr.lua", "d96724dcb40c673ac294df7044a39925" },
{ "fontloader-font-vfc.lua", "94937140f2c909e9c831ba021f1ab303" },
- { "fontloader-font-map.lua", "f486746e90fe972de4b73e208ac7cbb2" },
+ { "fontloader-font-map.lua", "51d0362c19d2d0f621e5cb750410a809" },
{ "fontloader-font-cid.lua", "4d87988efa86020a14708ee03c23415f" },
- { "fontloader-font-con.lua", "b436bf6880a56216445779ac68fee877" },
+ { "fontloader-font-con.lua", "40e3a857b2f31be1959dc6d445aaa9c4" },
{ "fontloader-font-ini.lua", "4dee96e1e1474d324dd126bd5d375df8" },
{ "fontloader-data-con.lua", "de6ae0997b0e70a23bcc9afff5d8b072" },
- { "fontloader-reference.lua", "0c0e3262f5cc53d1142e459921526f69" },
- { "fontloader-basics-gen.lua", "b88f9848c3247e4222b7bb63b0ee3f35" },
+ { "fontloader-reference.lua", "87a3b4d84d8ca6551dc8ccb539d30fd8" },
+ { "fontloader-basics-gen.lua", "b21e91bbd534f77e368f0ec13f865aed" },
{ "mktests", "c7cff7025962922944376acc1ffa9c47" },
- { "mkstatus", "72f4b4ff15c9f4fd95b8ba942b541b20" },
+ { "mkstatus", "879eb12b7dc63a18d94ed61b90c4b3da" },
{ "mkcharacters", "92c24bb582fc84c0365634f29eb89863" },
- { "mkglyphlist", "557836886d4f0e6d656eac3ded4456a2" },
+ { "mkglyphlist", "95bbf91338214d40b2102114285ccd3f" },
{ "mkimport", "60e0b11a1a68719033e86a3e0f4d5e86" },
- { "luaotfload-glyphlist.lua", "0c2e6db4d2d944b5e4e6d83971edc166" },
- { "luaotfload-characters.lua", "593ce9dccf6ddc4f7d4be0514f581102" },
- { "luaotfload-tounicode.lua", "8c678ba2c2c809706a63a79a339d102b" },
- { "luaotfload-unicode.lua", "ec04cec91b4c7a73acace241f791a228" },
- { "luaotfload-resolvers.lua", "92c1c59341213f716a6eee355b847849" },
- { "luaotfload-parsers.lua", "ef73b50dee1935a1af4cd76ed303bba6" },
- { "luaotfload-multiscript.lua", "d5a1d602ecc4b4caad5f89772dd8affa" },
- { "luaotfload-loaders.lua", "084e6b89d85ccdc59d90102059d8020a" },
- { "luaotfload-harf-plug.lua", "09d1f0baf43fb6932d5619436d0ff950" },
- { "luaotfload-harf-define.lua", "e27975867cbe2eac101ea2ff366050dc" },
- { "luaotfload-notdef.lua", "1a4f3eeedfb374927fa0673849c5f95b" },
- { "luaotfload-embolden.lua", "8412b95b699231918ea78384ada0e3df" },
- { "luaotfload-letterspace.lua", "2ffa8128161281fa2ca7605fc056e13d" },
- { "luaotfload-features.lua", "2db4774ed71aa8ba4e859655e6076f1b" },
- { "luaotfload-database.lua", "c11b6638c72aa2216aaf0432278654cc" },
- { "luaotfload-configuration.lua", "d4c270b581eb22ded89bc2c6dffd7a78" },
- { "luaotfload-colors.lua", "693b527638ff44e88530bef81cff360c" },
- { "luaotfload-auxiliary.lua", "90307f9dc0fde714e7ade75ed8606de6" },
- { "luaotfload-filelist.lua", "629600766c33b11ebce09dd77dbd67c0" },
- { "luaotfload-tool.lua", "dfa990067c3f21fdebfcbd47b291fc9c" },
- { "luaotfload-diagnostics.lua", "7c13bd4abdd110073b6dd438c94d28ec" },
- { "luaotfload-log.lua", "c6e62cd69d185ea57605c21919ae103e" },
- { "luaotfload-init.lua", "0e156bb051ffa7c51dbdaca4afe0b5ae" },
- { "luaotfload-main.lua", "352cf2115d0b60e8537557baa9748f7a" },
+ { "luaotfload-glyphlist.lua", "d717ba808181ed805d7012259ceec613" },
+ { "luaotfload-characters.lua", "6a46f4749368e4f56a863da9c61b7bd6" },
+ { "luaotfload-tounicode.lua", "1423c465dd9674c1d048314566e4c9e5" },
+ { "luaotfload-unicode.lua", "2ef5d6f97171db54da3fbb304571bf4d" },
+ { "luaotfload-resolvers.lua", "028ada14621d61296d6c193113841a3c" },
+ { "luaotfload-parsers.lua", "1bb3f4e75cd433de2b29ea9961896dba" },
+ { "luaotfload-fallback.lua", "26ac47f65211bee402055d656ebedf30" },
+ { "luaotfload-multiscript.lua", "bc5cd5ca148d8938310317f8f70b51f4" },
+ { "luaotfload-loaders.lua", "b6bca1abc2fef454a4e14997b87c500e" },
+ { "luaotfload-harf-plug.lua", "e0b02973cd653b50d5ad8c0f971bbf44" },
+ { "luaotfload-harf-define.lua", "74026f364fd71375c6ac0fcdabaf2c69" },
+ { "luaotfload-notdef.lua", "feccfc85ad4ddb6ccaeb4974f50d93c1" },
+ { "luaotfload-embolden.lua", "faa7cdeb00ba548b7f8f4cf79f52ea62" },
+ { "luaotfload-letterspace.lua", "d12550ea62b1edb348f0f6d388b2701f" },
+ { "luaotfload-features.lua", "4941176787992fa1b319d3e8822672a6" },
+ { "luaotfload-database.lua", "6a17fb92cbb4d0e2ccdb435b7f33c052" },
+ { "luaotfload-configuration.lua", "5ba63b9b0731e3701c39c06a1217dbe4" },
+ { "luaotfload-colors.lua", "5fe6a37d50374deb75f041a4c26e08ce" },
+ { "luaotfload-auxiliary.lua", "f721a22653fe32413af7d057b6236382" },
+ { "luaotfload-filelist.lua", "b9383bafa3dbf4ef3140592f6ed47e54" },
+ { "luaotfload-tool.lua", "2b1a2aabe4f9c3f88836feb833c89e78" },
+ { "luaotfload-diagnostics.lua", "b32da598f5bbb68e2b76cce03a7df033" },
+ { "luaotfload-log.lua", "30158f122a25bc38eecd61ab86c4bc70" },
+ { "luaotfload-init.lua", "ab2d6107e6d94455f1d024afb8f6a8c1" },
+ { "luaotfload-main.lua", "6ee30f9b6f5d381df4d5f9c868bc9d9f" },
},
["notes"]={
["committer"]="Ulrike Fischer ",
- ["description"]="v3.12/2020-02-02",
- ["loader"]="fontloader-2020-01-26.lua",
- ["revision"]="df675afec78546b857a89f1c416dc0f2600c8ff0",
- ["timestamp"]="2020-02-02 22:36:36 +0100",
+ ["description"]="v3.13/2020-05-01",
+ ["loader"]="fontloader-2020-04-30.lua",
+ ["revision"]="aa279bff2274832c341338d7763132bad3941768",
+ ["timestamp"]="2020-05-01 15:37:41 +0200",
},
}
\ No newline at end of file
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-suppress.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-suppress.lua
new file mode 100644
index 00000000000..eba776fe85d
--- /dev/null
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-suppress.lua
@@ -0,0 +1,89 @@
+-----------------------------------------------------------------------
+-- FILE: luaotfload-suppress.lua
+-- DESCRIPTION: part of luaotfload / suppress
+-----------------------------------------------------------------------
+
+local ProvidesLuaModule = {
+ name = "luaotfload-suppress",
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
+ description = "luaotfload submodule / suppress",
+ license = "GPL v2.0",
+ author = "Marcel Krüger"
+}
+
+if luatexbase and luatexbase.provides_module then
+ luatexbase.provides_module (ProvidesLuaModule)
+end
+
+local direct = node.direct
+local otfregister = fonts.constructors.features.otf.register
+
+local copy = direct.copy
+local getdisc = direct.getdisc
+local getnext = direct.getnext
+local insert_after = direct.insert_after
+local is_char = direct.is_char
+local setchar = direct.setchar
+local setdisc = direct.setdisc
+local getfont = font.getfont
+
+local disc_t = node.id'disc'
+
+local empty = {}
+
+local lpeg = lpeg or require'lpeg'
+local valueparser do
+ local digits = lpeg.R'09'^1/tonumber
+ local hexdigits = (lpeg.P'u+' + '"' + '0x') * (lpeg.R('09', 'AF', 'af')^1/function(s) return tonumber(s, 16) end)
+ local entry = lpeg.Cg((hexdigits + digits) * lpeg.Cc(true))
+ local sep = lpeg.P' '^0 * lpeg.S'/|,;' * lpeg.P' '^0
+ valueparser = lpeg.Cf(lpeg.Ct'' * entry * (sep * entry)^0, rawset) * -1
+end
+
+local function initializer(tfmdata, value, features)
+ local properties = tfmdata.properties
+ properties.suppress_liga = valueparser:match(value)
+ if not properties.suppress_liga then
+ error[[Invalid suppress value]]
+ end
+end
+
+local function processor(head,font) -- ,attr,direction)
+ local supp = getfont(font).properties.suppress_liga
+ if not supp then return head end
+ local n = head
+ while n do
+ local c, id = is_char(n, font)
+ if supp[c] then
+ local nn = copy(n)
+ setchar(nn, 0x200C)
+ head, n = insert_after(head, n, nn)
+ elseif id == disc_t then
+ local pre, post, replace = getdisc(n)
+ pre = processor(pre, font)
+ post = processor(post, font)
+ replace = processor(replace, font)
+ setdisc(n, pre, post, replace)
+ end
+ n = getnext(n)
+ end
+ return head
+end
+
+otfregister {
+ name = 'suppress',
+ description = 'Insert ZWNJ to suppress ligatures',
+ default = false,
+ initializers = {
+ -- node = initializer,
+ plug = initializer,
+ },
+ processors = {
+ position = 1,
+ -- node = processor,
+ plug = processor,
+ },
+}
+
+--- vim:sw=2:ts=2:expandtab:tw=71
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-szss.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-szss.lua
new file mode 100644
index 00000000000..23b479f33e6
--- /dev/null
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-szss.lua
@@ -0,0 +1,226 @@
+-----------------------------------------------------------------------
+-- FILE: luaotfload-szss.lua
+-- DESCRIPTION: part of luaotfload / szss
+-----------------------------------------------------------------------
+
+local ProvidesLuaModule = {
+ name = "luaotfload-szss",
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
+ description = "luaotfload submodule / color",
+ license = "GPL v2.0",
+ author = "Marcel Krüger"
+}
+
+if luatexbase and luatexbase.provides_module then
+ luatexbase.provides_module (ProvidesLuaModule)
+end
+
+local direct = node.direct
+local otfregister = fonts.constructors.features.otf.register
+
+local copy = direct.copy
+local getdisc = direct.getdisc
+local getnext = direct.getnext
+local insert_after = direct.insert_after
+local is_char = direct.is_char
+local setchar = direct.setchar
+local setdisc = direct.setdisc
+
+local disc_t = node.id'disc'
+
+local szsstable = setmetatable({}, { __index = function(t, i)
+ local v = font.getfont(i)
+ v = v and v.properties
+ v = v and v.transform_sz or false
+ t[i] = v
+ return v
+end})
+
+local function szssinitializer(tfmdata, value, features)
+ if value == 'auto' then
+ value = not tfmdata.characters[0x1E9E]
+ end
+ local properties = tfmdata.properties
+ properties.transform_sz = value
+end
+
+local function szssprocessor(head,font) -- ,attr,direction)
+ if not szsstable[font] then return end
+ local n = head
+ while n do
+ local c, id = is_char(n, font)
+ if c == 0x1E9E then
+ setchar(n, 0x53)
+ head, n = insert_after(head, n, copy(n))
+ elseif id == disc_t then
+ local pre, post, replace = getdisc(n)
+ pre = szssprocessor(pre, font)
+ post = szssprocessor(post, font)
+ replace = szssprocessor(replace, font)
+ setdisc(n, pre, post, replace)
+ end
+ n = getnext(n)
+ end
+ return head
+end
+
+otfregister {
+ name = 'szss',
+ description = 'Replace capital ß with SS',
+ default = 'auto',
+ initializers = {
+ node = szssinitializer,
+ plug = szssinitializer,
+ },
+ processors = {
+ position = 1,
+ node = szssprocessor,
+ plug = szssprocessor,
+ },
+}
+
+-- harf-only features (for node they are implemented in the fontloader
+
+otfregister {
+ name = 'extend',
+ description = 'Fake extend',
+ default = false,
+ manipulators = {
+ plug = function(tfmdata, _, value)
+ value = tonumber(value)
+ if not value then
+ error[[Invalid extend value]]
+ end
+ tfmdata.extend = value * 1000
+ tfmdata.hb.hscale = tfmdata.units_per_em * value
+ local parameters = tfmdata.parameters
+ parameters.slant = parameters.slant * value
+ parameters.space = parameters.space * value
+ parameters.space_stretch = parameters.space_stretch * value
+ parameters.space_shrink = parameters.space_shrink * value
+ parameters.quad = parameters.quad * value
+ parameters.extra_space = parameters.extra_space * value
+ local done = {}
+ for _, char in next, tfmdata.characters do
+ if char.width and not done[char] then
+ char.width = char.width * value
+ done[char] = true
+ end
+ end
+ end,
+ },
+}
+
+otfregister {
+ name = 'slant',
+ description = 'Fake slant',
+ default = false,
+ manipulators = {
+ plug = function(tfmdata, _, value)
+ value = tonumber(value)
+ if not value then
+ error[[Invalid slant value]]
+ end
+ tfmdata.slant = value * 1000
+ local parameters = tfmdata.parameters
+ parameters.slant = parameters.slant + value * 65536
+ end,
+ },
+}
+
+otfregister {
+ name = 'squeeze',
+ description = 'Fake squeeze',
+ default = false,
+ manipulators = {
+ plug = function(tfmdata, _, value)
+ value = tonumber(value)
+ if not value then
+ error[[Invalid squeeze value]]
+ end
+ tfmdata.squeeze = value * 1000
+ tfmdata.hb.vscale = tfmdata.units_per_em * value
+ local parameters = tfmdata.parameters
+ parameters.slant = parameters.slant / value
+ parameters.x_height = parameters.x_height * value
+ parameters[8] = parameters[8] * value
+ local done = {}
+ for _, char in next, tfmdata.characters do
+ if not done[char] then
+ if char.height then
+ char.height = char.height * value
+ end
+ if char.depth then
+ char.depth = char.depth * value
+ end
+ done[char] = true
+ end
+ end
+ end,
+ },
+}
+
+-- Legacy TeX Input Method Disguised as Font Ligatures hack.
+--
+-- Single replacements, keyed by character to replace. Handled separately
+-- because TeX ligaturing mechanism does not support one-to-one replacements.
+local trep = {
+ [0x0022] = 0x201D, -- ["]
+ [0x0027] = 0x2019, -- [']
+ [0x0060] = 0x2018, -- [`]
+}
+
+-- Ligatures. The value is a character "ligature" table as described in the
+-- manual.
+local tlig ={
+ [0x2013] = { [0x002D] = { char = 0x2014 } }, -- [---]
+ [0x002D] = { [0x002D] = { char = 0x2013 } }, -- [--]
+ [0x0060] = { [0x0060] = { char = 0x201C } }, -- [``]
+ [0x0027] = { [0x0027] = { char = 0x201D } }, -- ['']
+ [0x0021] = { [0x0060] = { char = 0x00A1 } }, -- [!`]
+ [0x003F] = { [0x0060] = { char = 0x00BF } }, -- [?`]
+ [0x002C] = { [0x002C] = { char = 0x201E } }, -- [,,]
+ [0x003C] = { [0x003C] = { char = 0x00AB } }, -- [<<]
+ [0x003E] = { [0x003E] = { char = 0x00BB } }, -- [>>]
+}
+
+local function tligprocessor(head, font)
+ local n = head
+ while n do
+ local c, id = is_char(n, font)
+ local rep = trep[c]
+ if rep then
+ setchar(n, rep)
+ elseif id == disc_t then
+ local pre, post, replace = getdisc(n)
+ tligprocessor(pre, font)
+ tligprocessor(post, font)
+ tligprocessor(replace, font)
+ end
+ n = getnext(n)
+ end
+end
+
+otfregister {
+ name = 'tlig',
+ description = 'Traditional TeX ligatures',
+ default = false,
+ manipulators = {
+ plug = function(tfmdata, _, value)
+ local characters = tfmdata.characters
+ for codepoint, ligatures in next, tlig do
+ local char = characters[codepoint]
+ if char then
+ char.ligatures = ligatures
+ end
+ end
+ end,
+ },
+ processors = {
+ position=1,
+ plug = tligprocessor,
+ },
+}
+
+--- vim:sw=2:ts=2:expandtab:tw=71
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-tounicode.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-tounicode.lua
index 509a0d782d7..95e4b55b66b 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-tounicode.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-tounicode.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-tounicode",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / tounicode",
license = "GPL v2.0",
author = "Hans Hagen, Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger",
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-unicode.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-unicode.lua
index 8c1f92cf318..79d196fb648 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-unicode.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-unicode.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-unicode",
- version = "3.12", --TAGVERSION
- date = "2020-02-02", --TAGDATE
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --TAGDATE
description = "luaotfload submodule / Unicode helpers",
license = "CC0 1.0 Universal",
author = "Marcel Krüger"
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.sty b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.sty
index f779ecbf83a..383bbde5fde 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.sty
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.sty
@@ -40,7 +40,7 @@
\fi
\ifdefined\ProvidesPackage
\ProvidesPackage{luaotfload}%
- [2020/02/02 v3.12 OpenType layout system]
+ [2020/05/01 v3.13 OpenType layout system]
\fi
\directlua{
if xpcall(function ()%
--
cgit v1.2.3