Initial commit of liblouis_for_aas

Derived from LibLouis 3.4.0.
Includes a few small additions that allow aas to dynamically invoke
LibLouis.

To build liblouis.so, use the build_liblouis.sh script.

Change-Id: Iebde3c091a74a69005266e88f2373d20e72e9cd2
diff --git a/liblouis/ANNOUNCEMENT b/liblouis/ANNOUNCEMENT
new file mode 100644
index 0000000..afb053a
--- /dev/null
+++ b/liblouis/ANNOUNCEMENT
@@ -0,0 +1,152 @@
+liblouis 3.4.0 has been released
+
+The liblouis developer team is proud to announce the liblouis release
+3.4.0. The release is available for download at:
+
+    https://github.com/liblouis/liblouis/releases
+
+Introduction
+============
+
+Liblouis is an open-source braille translator and back-translator. It
+features support for computer, literary and math braille, supports
+contracted and uncontracted translation for many, many languages[1].
+It plays an important role in an open source accessibility stack and
+is used by screenreaders such as NVDA, Orca and JAWS. A companion
+project liblouisutdml[2] deals with formatting of braille.
+
+Changes in this release
+=======================
+
+This release brings together a lot of work by lots of different
+people. Probably the most prominent fix is the work on output
+positions by Bue and Bert. NVDA should benefit from this. Then there
+are new and massively improved tables like the Lithuanian 6-dot table
+by Rimas or the improved back-translation for French by Michel and
+André-Abush to name just a few. There are too many contributors to
+name them here, thanks to them all.
+
+For a detailed list of all the changes refer to
+
+    https://github.com/liblouis/liblouis/milestone/14?closed=1
+
+New features
+~~~~~~~~~~~~
+- Add support for `inputPos' and `outputPos' checking in
+  `lou_checkyaml' thanks to Bue Vester-Andersen. See the manual for
+  details and examples.
+
+
+Bug fixes
+~~~~~~~~~
+- output positions (`outputPos') are now calculated based on input
+  positions (`inputPos') thanks to Bert Frees. This avoids a whole
+  class of bugs that previously plagued the output positions. This fix
+  also obviates the need for the `pass1Only' flag. See below for the
+  deprecation notice.
+
+
+Braille table improvements
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Addition of Nemeth and Kangxi radical characters and other
+  improvements to Chinese braille (`zh-tw.ctb') thanks to Bo-Cheng
+  Jhan and 黃偉豪.
+- Improvements to the Spanish chardefs table thanks to Luis Lorente
+  Barajas and Simon Aittamaa.
+- Fixed a lowercase ó in Spanish first reported for NVDA thanks to
+  Sukil Etxenike.
+- New Norwegian 6-dot display braille table for Braillo embossers
+  thanks to Lars Bjørndal
+- Added a bunch of whitespace-like codepoints as spaces thanks to
+  Rimas Kudelis
+- Added Lithuanian 6-dot table thanks to Rimas Kudelis.
+- Addition of more characters to the French tables thanks to Samuel
+  Thibault
+- Improvements to the Hungarian tables thanks to Attila Hammer
+- Improvements to the Mongolian tables thanks to Tsengel Maidar
+- Fix some math signs in Czech Braille (`cs-chardefs.cti'). Thanks to
+  Christian Herden of ViewPlus for reporting this.
+- Updates to the SEB British Braille Tables thanks to Paul Wood
+- Massive improvements to French back-translation thanks to Michel
+  Such and André-Abush Clause
+
+Other changes
+~~~~~~~~~~~~~
+
+Improved documentation
+----------------------
+- Bue Vester-Andersen added some notes about back-translation and
+  documented all possible values of the `mode' parameter. Also the
+  description of `decpoint' and `litdigit' was improved.
+- The `match' opcode is now documented thanks to Mike Gray and
+  Christian Egli.
+
+
+lou_maketable
+-------------
+Numerous bug fixes and performance enhancements thanks to Bert Frees
+
+
+Code refactoring
+----------------
+Many global variables have been removed thanks to Bert Frees
+
+
+Code formatting
+---------------
+Thanks to clang-format There is now a uniform coding style over the
+whole code base
+
+
+Fix broken NMakefile
+--------------------
+Thanks to Davy Kager building with nmake should work again
+
+
+Deprecation notice
+~~~~~~~~~~~~~~~~~~
+The `pass1Only' flag has been deprecated. Its use should be avoided,
+and it will be completely removed from the code in the next version of
+Liblouis. When using the `pass1Only' flag in this release you will get
+a warning.
+
+
+Backwards incompatible changes
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+None
+
+
+New, renamed or removed tables
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+New
+---
+- no-no-braillo-047-01.dis
+- lt-6dot.utb
+
+
+Renamed
+-------
+None
+
+
+Removed
+-------
+None
+
+Next release
+============
+
+The next release will be published on March 5 2018 so please keep up
+the excellent work and keep those improvements coming.
+
+Share and Enjoy!
+
+-- Christian Egli, on behalf of the liblouis developers
+
+Footnotes
+=========
+
+[1]  See https://github.com/liblouis/liblouis/tree/master/tables
+[2]  See https://github.com/liblouis/liblouisutdml
diff --git a/liblouis/AUTHORS b/liblouis/AUTHORS
new file mode 100644
index 0000000..a4b4909
--- /dev/null
+++ b/liblouis/AUTHORS
@@ -0,0 +1,189 @@
+MAIN AUTHOR
+
+  John J. Boyer <john.boyer@abilitiessoft.org> from Abilitiessoft, Inc.
+  - is the founder, creator and original author of the liblouis
+    project(s)
+  - has put his heart and soul into liblouis
+  - has written the bulk of the code
+  - maintainer emeritus
+
+CODE CONTRIBUTORS
+
+A team of three developers has taken over maintenance work since John
+Boyer did a step back in 2014:
+
+  Christian Egli <christian.egli@sbs.ch> from SBS <www.sbs.ch>
+  - maintains the build and version control systems and does releases
+    on a regular basis
+  - has done code contributions
+  - is one of the project maintainers
+
+  Mesar Hameed <mesar.hameed@gmail.com>
+  - has done code contributions
+  - has done a lot of table maintenance
+  - was the main developer of the test harness
+  - is one of the project maintainers
+
+  Bert Frees <bertfrees@gmail.com> for DocArch <www.docarch.be> and SBS <www.sbs.ch>
+  - has done code contributions
+  - has done table contributions as well
+  - is one of the project maintainers
+
+Considerable coding was done by:
+
+  Davy Kager <mail@davykager.nl>
+  Eitan Isaacson <eitan@ascender.com>
+  James Teh <jamie@jantrid.net>
+  Michael Curran <mick@kulgan.net>
+  Michael Whapples <mwhapples@aim.com>
+  Mike Gray <mgray@aph.org>
+  Dave Mielke <dave@mielke.cc>
+
+Patches were provided by:
+
+  Jeremy Roman <jbroman@google.com>
+  Milan Zamazal <pdm@brailcom.org>
+  Peter Nilsson Lundblad <plundblad@google.com>
+  Timothy Lee <timothy.ty.lee@gmail.com>
+  Vincent Untz <vuntz@gnome.org>
+  Volker Bijewitz <v.bijewitz@baum.de>
+  Simon Aittamaa, Index Braille <simon.aittamaa@indexbraille.com>
+  Ken Perry <kperry@aph.org>
+  Martin Michlmayr <tbm@cyrius.com>
+  Arend Arends <arend.arends@hccnet.nl>
+  Victor Montalvao vicmont@microsoft.com
+  Bue Vester-Andersen <bue@vester-andersen.dk>
+
+BRLTTY AUTHORS
+
+Liblouis was derived from the Linux screen reader BRLTTY. Because it
+is rather difficult to trace back exactly which parts of BRLTTY ended
+up in liblouis we just list all BRLTTY contributors here (see also
+brltty.com/contact.html).
+
+The team:
+
+  Dave Mielke <dave@mielke.cc>
+  Nicolas Pitre <nico@fluxnic.net>
+  Stéphane Doyon <s.doyon@videotron.ca>
+
+Other contributors:
+
+  Andreas Gross <andi@andi-bika.de>
+  August Hörandl <hoerandl@elina.htlw1.ac.at>
+  Brailcom o.p.s. <technik@brailcom.cz>
+  Christian Comaschi <christian_comaschi@libero.it>
+  Coscell Kao <coscell@mail.batol.net>
+  James Bowden
+  John Boyer <director@chpi.org>
+  Jos Lemmens <jlemmens@inter.nl.net>
+  Mario Lang <mlang@delysid.org>
+  Nikhil Nair <nn201@cus.cam.ac.uk>
+  Oscar Fernandez <ofa@once.es>
+  Per Lejontand <pele@acc.umu.se>
+  Samuel Thibault <samuel.thibault@labri.fr>
+  Sébastien Hinderer <sebastien.hinderer@libertysurf.fr>
+  Stephane Dalton <sdalton@videotron.ca>
+  Wolfgang Astleitner <wolfgang.astleitner@liwest.at>
+  Yannick Plassiard <Yannick.Plassiard@free.fr>
+
+TABLE CONTRIBUTORS
+
+  Amar Usama <ammar.usama@nlb.no>
+  Aaron Cannon <cannona@fireantproductions.com>
+  Abdolamir Banisaeid <saedjan@gmail.com>
+  Adi Kushnir <adikushnir@gmail.com>
+  Alex Ho
+  Ammar Usama <ammar.usama@nlb.no>
+  André-Abush Clause <clause.andreabush@gmail.com>
+  Birkir Gunnarsson <birkir@midstod.is>
+  Brailcom, o.p.s. <technik@brailcom.cz>
+  Branislav Mamojka <mamojka@unss.sk>
+  Bue Vester-Andersen <bue@vester-andersen.dk>
+  Carles Sadurní Anguita <www.transcriptor.net>
+  Carlos Ferreira <cferreira9886@gmail.com>
+  Caterina Avoledo <catery81@yahoo.it>
+  Chennai Shankar <brailleacl@gmail.com> from Braille Section Team, Anna Centenary Library
+  Christian Waldvogel <christian.waldvogel@sbszh.ch> from SBS <www.sbs.ch>
+  Coscell Kao <coscell@molerat.net>
+  Danko Butorac <danko@ipsis.hr>
+  Dave Mielke <dave@mielke.cc>
+  David Hole
+  David Reynolds <dkreynolds@ntlworld.com>
+  Dinakar T.D. <td.dinkar@gmail.com>
+  Dinesh Kaushal<dineshkaushal@hotmail.com>
+  Dipendra Manocha <d@saksham.org>
+  Eric Yip
+  Frédéric Schwebel
+  Greg Kearney <gkearney@gmail.com>
+  Henri Apperloo <h.apperloo@cbb.nl> from CBB <www.cbb.nl>
+  International league of Blind Esperantists (LIBE) <libe.narzan.com>
+  Igor B. Poretsky <poretsky@mlbox.ru>
+  James Bowden <james.bowden@rnib.org.uk> from Royal National Institute of Blind People (RNIB)
+  Jan Halousek <merit@login.cz> from MERIT
+  Jan Hegr <hegrjan@gmail.com>
+  Joseph Lee <joseph.lee22590@gmail.com>
+  Jostein Austvik Jacobsen <josteinaj@gmail.com>
+  José Enrique Fernández del Campo <jefdelcampo@gmail.com>
+  Jožef Gregorc <jozko.gregorc@gmail.com>
+  Juan Carlos Buño Suárez <quetzatl@eresmas.net>
+  Jukka Eerikäinen <jukka.eerikainen@celia.fi> from Celia <www.celia.fi>
+  Jürgen Dengo <jyrgen.dengo@gmail.com>
+  Halim Sahin <halim.sahin@web.de>
+  Hammer Attila <hammera@pickup.hu>, <hammer.attila@infoalap.hu> from IT Foundation for the Visually Impaired in Hungary
+  Hans Schou <chlor@schou.dk>
+  Harri Pasanen <harri@mpaja.com>
+  Him Prasad Gautam
+  Kaifang Bao baokaifang@gmail.com from RejoinTech
+  Karol Pecyna <HarpoDeveloper@gmail.com> from Harpo <http://int.harpo.com.pl>
+  Keny Yuen
+  KM Yuen
+  Knut Arne Bjørndal <bob+liblouis@cakebox.net>
+  Lars Bjørndal <lars@handytech.no>, <lars@lamasti.net>
+  Leon Ungier <Leon.Ungier@ViewPlus.com> from ViewPlus Technologies, Inc. <www.viewplus.com>
+  Leona Holloway <Leona.Holloway@visionaustralia.org> from Vision Australia
+  Mateja Jenčič
+  Michel Such <michel.such@free.fr>
+  Mike Sivill <mike.sivill@viewplustechnologies.com> from ViewPlus Technologies, Inc.
+  Mohammed R. Ramadan <mramadan@nattiq.com>
+  Monk Jeremiah from Visoki Dečani <visokidecani@gmail.com>
+  Neil Soiffer <NeilS@dessci.com>
+  Nicolas Pitre <nico@cam.org>
+  Nicolai Svendsen <chojiro1990@gmail.com>
+  Patrick Zajda
+  Paul Wood <paulw.torchtrust@gmail.com>
+  Peter Engström <peter.engstrom@indexbraille.com> from Index Braille
+  Peter Vágner <pvdeejay@gmail.com>
+  Rui Batista <ruiandrebatista@gmail.com>
+  Rui Fontes <rui.fontes@tiflotecnia.com>
+  Rumiana Kamenska <rkamenska@gmail.com>
+  Samuel Thibault <samuel.thibault@ens-lyon.org>
+  Sébastien Sablé <sable@users.sourceforge.net>
+  Simone Dal Maso <simone.dalmaso@juvox.it>
+  Sreeja Parameswaran <sreeja.param@gmail.com>
+  Stefan Moisei <vortex37@gmail.com>
+  Tamru E. Belay <tamru@sympatico.ca>, <g.braille@sympatico.ca> from Adaptive Technology Center for the Blind (ATCB)
+  Tom Johnston <Tom.Johnston@accessibilityconsulting.co.uk>
+  Tsengel Maidar tsengel@digitalsunngo.org
+  Yuemei Sun from ViewPlus Technologies, Inc.
+  Zvonimir Stanecic <zvonimirek222@yandex.com>
+  <Aliminator83@gmail.com>
+  <eric@integra-belgium.com>
+
+LIBHNJ AUTHORS
+
+Code was borrowed from the hyphenation library Libhnj.
+
+  Raph Levien <raph@acm.org>
+
+Hyphenation dictionaries were copied from OpenOffice.org.
+
+OTHER CONTRIBUTORS
+
+These are contributions not in the form of code or tables.
+
+  John Gardner <john.gardner@viewplus.com> from ViewPlus Technologies, Inc. <www.viewplus.com>
+
+Unknown contribution:
+
+  Alastair Irving
diff --git a/liblouis/Android.mk b/liblouis/Android.mk
new file mode 100644
index 0000000..7c1f7d9
--- /dev/null
+++ b/liblouis/Android.mk
@@ -0,0 +1,19 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+LOCAL_CFLAGS += -DTABLESDIR='"__non_existent_path__"'
+LOCAL_SRC_FILES  := \
+ liblouis/commonTranslationFunctions.c \
+ liblouis/compileTranslationTable.c \
+ liblouis/logging.c \
+ liblouis/lou_backTranslateString.c \
+ liblouis/lou_translateString.c \
+ liblouis/maketable.c \
+ liblouis/metadata.c \
+ liblouis/pattern.c \
+ liblouis/utils.c
+LOCAL_C_INCLUDES := \
+ liblouis/config.h \
+ liblouis/internal.h \
+ liblouis/liblouis.h
+LOCAL_MODULE     := liblouis
+include $(BUILD_SHARED_LIBRARY)
\ No newline at end of file
diff --git a/liblouis/COPYING b/liblouis/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/liblouis/COPYING
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/liblouis/COPYING.LESSER b/liblouis/COPYING.LESSER
new file mode 100644
index 0000000..4362b49
--- /dev/null
+++ b/liblouis/COPYING.LESSER
@@ -0,0 +1,502 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/liblouis/ChangeLog b/liblouis/ChangeLog
new file mode 100644
index 0000000..31e92e1
--- /dev/null
+++ b/liblouis/ChangeLog
@@ -0,0 +1,1654 @@
+2014-03-21  Lars Bjørndal  <lars@lamasti.net>
+
+	* tables/no-no-g0.utb:
+	* tables/hyph_nn_NO.dic:
+	* tables/hyph_nb_NO.dic: Add hyphenation tables from the hyphen-nb
+	and hyphen-nn packages version 2.1.
+
+2014-01-06  Peter Nilsson Lundblad <plundblad@google.com>
+
+	* liblouis/wrappers.c: Two unused variables that I just removed.
+
+	* liblouis/lou_translateString.c: Changed two variables of type
+	typeforms to int since they're used as bitfields.
+	* liblouis/compileTranslationTable.c (parseChars): The loop
+	counter in the utf8 decoding couldn't go below 0, but the compiler
+	couldn't prove that. I think the change from >= to > in the
+	termination condition is correct since the byte has to be >= 0x80
+	in this case so the finial iteration isn't necessary (if it would
+	be, the compiler would be right and we'd actually have an array
+	out of bounds).
+
+2013-07-19  Patrick Zajda  <patrick@zajda.fr>
+
+	* tables/fr-bfu-comp8.utb: corrections.
+
+2013-06-21  Christian Egli  <christian.egli@sbs.ch>
+
+	* configure.ac: Update release number
+
+2013-06-10  Joseph Lee <joseph.lee22590@gmail.com>
+
+	* tables/en-ueb-g1.ctb:
+	* tables/en-ueb-chardefs.uti: latest additions to Unified English
+	Braille.
+
+2013-06-06  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/Makefile.am (table_files):
+	* liblouis/compileTranslationTable.c (doLang2table):
+	(compileTranslationTable): Remove the lang2table feature. It was
+	never used, undocumented and contains an out-of-bounds access bug.
+	See also
+	http://www.freelists.org/post/liblouis-liblouisxml/PATCH-FW-Outofbounds-access-in-doLang2Table
+
+2013-06-03  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/hash_collision.c:
+	* tests/Makefile.am (XFAIL_TESTS): Mark the hash_collision test as
+	a known failure.
+
+	* liblouis/compileTranslationTable.c (allocateSpaceInTable): When
+	the table needs more space it is reallocated. Unfortunately not
+	all references to the table (such as the tableChain) are updated.
+	This is now fixed.
+
+	* tests/tables/large.ctb:
+	* tests/tables/Makefile.am:
+	* HACKING: Added a new section about profiling and some test table
+	that can be used for profiling.
+
+2013-05-28  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/hash_collision.c:
+	* tests/tables/empty.ctb:
+	* tests/tables/Makefile.am:
+	* tests/Makefile.am: Add a new test to benchmark the hash
+	algorithm.
+
+2013-01-28  Igor B. Poretsky <poretsky@mlbox.ru>
+
+	* tables/ru-litbrl.ctb:
+	* tables/ru-letters.dis:
+	* tables/ru-compbrl.ctb:
+	* tables/ru-chardefs.cti:
+	* tables/Makefile.am (table_files): Add new russian tables.
+
+	* tables/hyph_ru.dic: Added russian hyphenation dictionary.
+
+	* tables/it-it-comp6.utb: A little fix for Italian table.
+
+2013-01-28  Knut Arne Bjørndal <bob+liblouis@cakebox.net>
+
+	* tables/no-no-g0.utb: Fixes for Emphasis marks in the norwegian
+	braille table.
+
+2013-01-25  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/no-no-g0.utb: Corrections for double angle quotation
+	mark. Thanks to Knut Arne Bjørndal <bob+liblouis@cakebox.net> for
+	the patch.
+
+2013-01-24  Christian Egli  <christian.egli@sbs.ch>
+
+	* tools/lou_trace.c: Fix warnings and run through indent.
+
+2013-01-24  David Reynolds <dkreynolds@ntlworld.com>
+
+	* tables/en-gb-comp8.ctb: Add the British pound sign.
+
+2013-01-21  David Reynolds <dkreynolds@ntlworld.com>
+
+	* tables/en-gb-comp8.ctb: Added a table for U.K. English 8 dot
+	Computer braille.
+
+2013-01-21  Joseph Lee <joseph.lee22590@gmail.com>
+
+	* tables/en-ueb-g2.ctb: Improvements based on Leona's requested
+	changes.
+
+2013-01-17  Joseph Lee <joseph.lee22590@gmail.com>
+
+	* tables/en-ueb-g2.ctb: Changed some entries thanks to the
+	document that Leona provided.
+
+2013-01-11  Christian Egli  <christian.egli@sbs.ch>
+
+	* liblouis/Makefile.am:
+	* gnulib/Makefile.am:
+	* configure.ac:
+	* HACKING: Use the malloc and realloc modules from gnulib to
+	enable cross compilation to windows using mingw.
+
+2013-01-09  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/ko.ctb: Fixes for the Korean tables by Joseph Lee.
+
+2013-01-04  Christian Egli  <christian.egli@sbs.ch>
+
+	* gnulib/sys/*.h:
+	* gnulib/m4/*.m4
+	* gnulib/*.h:
+	* gnulib/*.c:
+	* gnulib/Makefile.am:
+	* build-aux/snippet/*.h: Upgrade to gnulib v0.0-7794-g964bbc2
+
+	* tables/en-ueb-g2.ctb: excludes entries that are not needed,
+	thanks to Joseph Lee.
+
+	* tables/Makefile.am (table_files):
+	* tables/ko.ctb:
+	* tables/ko-g2.ctb:
+	* tables/ko-g1.ctb: Added Korean tables by Joseph Lee.
+
+	* tests/check_all_tables.pl: Ignore zip files.
+
+2012-12-21  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/check_all_tables.pl: Exclude backup, patch, diff and txt
+	files from the table tests.
+
+2012-12-20  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/Makefile.am (table_files):
+	* tables/ru-ru-comp8: Remove ru-ru-comp8 table as it fails and is
+	a duplicate of ru.ctb
+
+	* tests/check_all_tables.pl: Check all files by default and
+	exclude only known exceptions, e.g. Makefiles, shell scripts, etc.
+
+2012-12-19  Christian Egli  <christian.egli@sbs.ch>
+
+	* gnulib/m4/unistd_h.m4:
+	* gnulib/m4/gnulib-comp.m4:
+	* gnulib/m4/extern-inline.m4:
+	* gnulib/unistd.in.h:
+	* gnulib/unistd.c:
+	* gnulib/Makefile.am (libgnu_la_SOURCES):
+	* build-aux/snippet/warn-on-use.h: Upgrade to newest gnulib
+
+	* tests/brl_checks.c (convert_typeform): Make it compile under
+	C89.
+
+	* tools/lou_translate.c (print_help):
+	* tools/lou_trace.c (print_help):
+	* tools/lou_debug.c (print_help):
+	* tools/lou_checktable.c (print_help):
+	* tools/lou_checkhyphens.c (print_help):
+	* tools/lou_allround.c (print_help): Update the usage message to
+	show that more than one table can be specified.
+
+2012-12-18  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/tables/Makefile.am (EXTRA_DIST): Add all test tables.
+
+2012-12-17  Christian Egli  <christian.egli@sbs.ch>
+
+	* NEWS: Added all new features to the NEWS entry for this release.
+
+	* doc/liblouis.texi: Add documentation for the lou_trace program.
+
+	* tools/lou_trace.c: Add copyright information.
+	(print_script): Fixes to the printing of context rules.
+
+	* liblouis/lou_translateString.c (checkMultCaps):
+	(noCompbrlAhead): Fix the valgrind warnings properly without
+	adding a regression.
+	(translateString): Make sure appliedRules are also updated for the
+	context opcode.
+
+2012-12-17  Hammer Attila <hammera@pickup.hu>
+
+	* tests/harnessSources/hu-hu-g1_harness_source.txt:
+	* tests/harnessSources/hu-hu-g1-hyph_harness_source.txt:
+	* tests/harness/hu-hu-g1_harness.txt:
+	* tests/harness/hu-hu-g1-hyph_harness.txt:
+	* tables/hu-exceptionwords.cti: Bug fix and tests for the
+	Hungarian grade 1 table.
+
+2012-12-14  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/typeform.c: Added a comment about the purpose of this
+	file, as it isn't really a test
+
+	* tests/brl_checks.h:
+	* tests/brl_checks.c (convert_typeform): Add the new function to
+	the header file.
+
+2012-12-13  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/typeform.c:
+	* tests/en_gb_g1_italics.c:
+	* tests/brl_checks.c:
+	* liblouis/compileTranslationTable.c: Fix compiler warnings, like
+	unused variables, macro redefinition, comparison between signed
+	and unsigned integer expressions, etc.
+
+	* configure.ac:
+	* NEWS: Update for release 2.5.2
+
+2012-12-13  Paul Wood <paulw.torchtrust@gmail.com>
+
+	* tables/en-GB-g2.ctb: Fix a regression with the 'com'
+	contraction.
+
+2012-12-10  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/ukchardefs.cti: Fixes provided by Paul Paul Wood.
+
+2012-12-07  Paul Wood <paulw.torchtrust@gmail.com>
+
+	* tables/en-GB-g2.ctb: Corrections to the g2 table.
+
+2012-12-06  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/ko.ctb:
+	* tables/Makefile.am (table_files): Add a table for Korean
+	provided by Joseph Lee <joseph.lee22590@gmail.com>
+
+2012-12-04  Christian Egli  <christian.egli@sbs.ch>
+
+	* liblouis/Makefile.am (AM_ETAGSFLAGS): The langmap option only
+	works if you use ctags. Newer versions of etags (i.e. emacs 24 and
+	up) seem to generate proper TAGS files even for *.ci files, so
+	this option can be removed.
+
+2012-12-03  Christian Egli  <christian.egli@sbs.ch>
+
+	* liblouis/lou_translateString.c (lou_dotsToChar): Fix some
+	valgrind warnings about invalid reads, i.e. do some array bound
+	checking.
+
+2012-12-03  Joseph Lee <joseph.lee22590@gmail.com>
+
+	* tables/Makefile.am (table_files):
+	* tables/en-ueb-g1.ctb:
+	* tables/en-ueb-g2.ctb: Added ueb tables
+
+2012-10-02  Christian Egli  <christian.egli@sbs.ch>
+
+	* gnulib: Update gnulib
+
+2012-09-21  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/it-it-comp8.utb: More fixes to the italian table. Thanks
+	to Simone Dal Maso <simone.dalmaso@juvox.it>
+
+2012-09-06  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/Makefile.am (check_PROGRAMS):
+	* tests/brl_checks.c:
+	* tests/brl_checks.h:
+	* tests/pass1Only.c: Added a test case for the reported memory
+	problem with pass1Only.
+
+2012-09-05  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/runHarness.py (test_allCases): Add some code to enable the
+	harness to return the result of the tests. Disable it for now as
+	there are still some tables that fail that we cannot fix before
+	release.
+
+	* tables/de-de-comp8.ctb: Added more unicode definitions. Thanks
+	to Aliminator83@gmail.com.
+
+2012-09-04  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/check_all_tables.pl:
+	* tests/check_endless_loop.pl:
+	* tests/multiple_table_path.pl: When doing VPATH builds (such as
+	in `make distcheck`) the binary for lou_checktable is not found.
+	Just use a relative path to find it.
+
+2012-07-10  Christian Egli  <christian.egli@sbs.ch>
+
+	* doc/liblouis.texi (How to Write Translation Tables): Document
+	the fact that translation tables can now be in UTF-8.
+	(Top): Document the doctests.
+	(How to Write Translation Tables): Add some minimal documentation
+	about the doctests
+
+2012-06-28  Christian Egli  <christian.egli@sbs.ch>
+
+	* doc/liblouis.texi (Miscellaneous Opcodes): Enhance the
+	documentation on the display opcode
+
+2012-06-14  Christian Egli  <christian.egli@sbs.ch>
+
+	* liblouis/lou_translateString.c (hyphenate): Fix a buffer overrun.
+
+2012-06-07  Christian Egli  <christian.egli@sbs.ch>
+
+	* liblouis/compileTranslationTable.c (compilePassOpcode): Increase
+	the number of chars matched in a $a. expression from 32 to 0xffff.
+
+	* doc/liblouis.texi (The Context and Multipass Opcodes): Document
+	the fact that context $a. matches are limited to 0xffff
+
+	* python/louis/__init__.py.in (hyphenate): Now that we know that
+	hyphens array should be inlen+1 adapt the Python bindings
+	accordingly.
+
+	* doc/liblouis.texi (lou_hyphenate): Fix a documentation bug with
+	lou_hyphenate. The length of the hyphens array should be inlen+1.
+
+	* tests/Makefile.am (check_PROGRAMS):
+	* tests/brl_checks.c (check_hyphenation):
+	* tests/brl_checks.h:
+	* tests/hyphenate.c (main): Add a test program hyphenation.
+
+2012-06-01  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/Makefile.am:
+	* tests/repeated.c:
+	* tests/squash_space.c:
+	* tests/tables/Makefile.am:
+	* tests/tables/repeated.utb:
+	* tests/tables/repeated_with_correct.utb:
+	* tests/tables/squash_space_with_context_1.utb:
+	* tests/tables/squash_space_with_context_2.utb:
+	* tests/tables/squash_space_with_correct.utb:
+	* tests/tables/squash_space_with_repeated.utb: More tests for
+	squashing white space. It looks like I found some bugs after all.
+
+	* tests/brl_checks.c (check_translation): Also print the input
+	string and delimit the strings with single quotes to better see
+	white space.
+
+	* TODO: Added a TODO file to note things that could/should be
+	done.
+
+	* tables/de-de-comp8.ctb: Add Symbols such as double quotes,
+	dashes to the German computer braille table. Thanks to
+	Aliminator83@gmail.com
+
+2012-05-31  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/Makefile.am:
+	* tests/repeated.c:
+	* tests/tables/Makefile.am:
+	* tests/tables/repeated.utb:
+	* tests/tables/repeated_with_correct.utb: Added a test for the
+	repeated opcode. Rumors had it that it was buggy, but it does what
+	it is supposed to.
+
+	* doc/liblouis.texi (The correct Opcode): Remove the comment about
+	input and output positions being incorrect. This bug has been fixed.
+
+2012-05-30  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/tables/letterDefTest_uppercase.ctb:
+	* tests/tables/letterDefTest_uplow.ctb:
+	* tests/tables/letterDefTest_lowercase.ctb:
+	* tests/tables/letterDefTest_letter.ctb:
+	* tests/letterDefTest.c (main): Convert the test so that it
+	returns the result of the test. Also use the \xhhhh notation for
+	unicode so that it works with the c based test framework.
+
+2012-05-11  Christian Egli  <christian.egli@sbs.ch>
+
+	* liblouis/compileTranslationTable.c (doLang2table): Remove an
+	unused variable that was reported by -Wall
+	(getALine): Properly initialize a variable. This issue was
+	reported by Valgrind.
+
+2012-05-07  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/brl_checks.c (check_translation): Enhance to be able to
+	handle \xhhhh encoded strings like the rest of liblouis. This is
+	to support unicode based test cases.
+
+	* tests/uplow_with_unicode.c:
+	* tests/tables/uplow_with_unicode.ctb:
+	* tests/tables/lowercase_with_unicode.ctb:
+	* tests/Makefile.am (uplow_with_unicode_SOURCES): Add a test for
+	the problem with lowercase and unicode.
+
+2012-04-20  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/nl-BE.dis:
+	* tables/Makefile.am (table_files):
+	* tests/doctests/Makefile.am:
+	* tests/doctests/nl-BE-g1.ctb_test.txt: Added a doctest for the
+	dutch tables
+
+2012-04-18  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/pass2_outpos.c:
+	* tests/pass2_inpos.c: Rename test to reflect what it really
+	tests.
+
+	* tests/Makefile.am:
+	* tests/brl_checks.h:
+	* tests/brl_checks.c (check_inpos):
+	* tests/inpos_compbrl.c: Rename check_outpos to check_inpos to
+	reflect the true intention of the function.
+
+2012-04-17  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/doctests/en-GB-g2.ctb_test.txt:
+	* tests/check_doctests.py (TestHelper): Add a test helper to
+	simplify the writing of doctests.
+
+	* tests/tables/moreTables/include.utb:
+	* tests/Makefile.am (TESTS_ENVIRONMENT):
+	* tests/multiple_table_path.pl: Added some tests for the improved
+	LOUIS_TABLEPATH functionality.
+
+2012-04-13  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/Makefile.am:
+	* tests/tables/pass2.ctb:
+	* tests/pass2_outpos.c: Add a test for the problem with pass2 and outpos.
+
+	* tests/brl_checks.h:
+	* tests/brl_checks.c (check_outpos):
+	* tests/inpos_compbrl.c (main): Enhance so that output position
+	can be checked for different tables.
+
+2012-03-23  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/tables/pass2.ctb:
+	* tests/tables/Makefile.am:
+	* tests/pass2.c:
+	* tests/Makefile.am: Add a test to show the regression with the
+	pass2 opcode.
+
+	* tests/brl_checks.c (check_translation): Make the printing of
+	test results more robust (against out of bound errors).
+
+2012-03-21  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/Makefile.am (TESTS_ENVIRONMENT): Set the env variables so
+	that the libraries and executables from the source directories are
+	used instead of the installed ones.
+
+2012-03-20  Christian Egli  <christian.egli@sbs.ch>
+
+	* configure.ac:
+	* tests/Makefile.am: Only enable the Python based tests if
+	configured with ucs4.
+
+2012-03-02  Mesar Hameed <mesar.hameed@gmail.com>
+
+	* configure.ac:
+	* doc/liblouis.texi:
+	* tests/Makefile.am:
+	* tests/harness/Makefile.am:
+	* tests/harness/__init__.py:
+	* tests/harness/en-GB-g2_harness.py:
+	* tests/runHarness.py: Add a test harness, i.e. an infrastructure
+	to be able to do table tests in a simple and concise syntax.
+
+2012-03-01  Christian Egli  <christian.egli@sbs.ch>
+
+	* configure.ac:
+	* python/louis/Makefile.am:
+	* tests/Makefile.am:
+	* tests/check_doctests.py:
+	* tests/doctests/Makefile.am:
+	* tests/doctests/en-GB-g2.ctb_test.txt: Check for Python in
+	configure and if there is a Python interpreter enable some Python
+	based doctests.
+
+
+2012-02-27  Mesar Hameed <mesar.hameed@gmail.com>
+
+	* python/louis/__init__.py.in: Expose the constants otherTrans and
+	ucBrl in the python bindings.
+
+2012-02-22  Christian Egli  <christian.egli@sbs.ch>
+
+	* configure.ac: Update version number
+
+	* tables/ta-ta-g1.ctb: Added a new tamil table by Mesar Hameed
+	<mesar.hameed@gmail.com>
+
+	* tables/no-no.ctb: Additions to the Norwegian braille tables
+	thanks to David Hole.
+
+2012-02-21  Juan Carlos Buño Suárez <quetzatl@eresmas.net>
+
+	* tables/Es-Es-G0.utb: add support for the letter Ñ to the Spanish
+	table.
+
+2012-02-20  Birkir Gunnarsson <birkir@midstod.is>
+
+	* tables/is.ctb: Updates and additions to Icelandic 8-dot braille
+	table.
+
+2012-02-06  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/Es-Es-G0.utb: Added Spanish grade0 table provided by José
+	Enrique Fernández del Campo and Juan Carlos Buño Suárez.
+
+2012-02-01  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/pt-pt-g1.utb: Added improvements to Portuguese table by
+	Rui Batista <ruiandrebatista@gmail.com>.
+
+	* tables/hyph_cs_CZ.dic:
+	* tables/Makefile.am (table_files): Added hyphenation table for
+	Czech provided by Jan Halousek
+
+2012-01-09  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/ar-ar-g1.utb: Added updates to Generic Arabic table by
+	Mesar Hameed <mesar.hameed@gmail.com>
+
+2011-08-19  Bert Frees <bertfrees@gmail.com>
+
+	* tables/cs-chardefs.cti:
+	* tables/cs-g1.ctb:
+	* tables/cs-translation.ctb: Improved translation tables for Czech
+	braille. Credit goes to Jan Halousek
+
+2011-08-08  Michel Such  <michel.such@free.fr>
+
+	* tables/fr-bfu-comp8.utb:
+	* tables/fr-bfu-comp6.utb: Updated French tables.
+
+2011-06-28  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/Makefile.am (table_files): Added the table provided by
+	Mesar Hameed to the build process.
+
+2011-06-28  Mesar Hameed <mesar.hameed@gmail.com>
+
+	* tables/ar-fa.utb: Added a table for Arabic Farsi.
+
+	* tables/ar-ar-g1.utb: Enhance the Generic Arabic Grade 1 table
+
+2011-06-24  Christian Egli  <christian.egli@sbs.ch>
+
+	* windows/Makefile.nmake: Rename the Makefile to Makefile.nmake to
+	make sure it's not overwritten by autoconf
+
+	* windows/Makefile.am (SUBDIRS): Add the include sub dir
+
+2011-06-17  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/Makefile.am (en_gb_g1_italics_SOURCES):
+	* tests/en_gb_g1_italics.c (main): Add a test case for italics
+	with the en-gb-g1.utb table.
+
+2011-05-30  Stefan Moisei  <vortex37@gmail.com>
+
+	* tables/ro.ctb: Updates to Romanian table.
+
+2011-05-25  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/brl_checks.c (check_translation): Print the outbuf using a
+	dedicated function. The normal printf with the %ls modifier
+	doesn't work as outbuf is not really of type wchar_t. Now the
+	received output is correctly printed in the test cases.
+
+2011-05-18  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/braille-patterns.cti: Fix a problem with the definition
+	of Unicode character U+2800. This issue was brought up on the list
+	by James Teh.
+
+2011-05-18  Michel Such  <michel.such@free.fr>
+
+	* tables/fr-bfu-comp8.utb: Some fixes for french tables.
+
+2011-05-09  Christian Egli  <christian.egli@sbs.ch>
+
+	* NEWS:
+	* configure.ac: Changed the version number.
+
+2011-05-03  Coscell Kao <coscell@molerat.net>
+
+	* tables/zh-tw.ctb: Update the Chinese braille table.
+
+2011-04-26  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/ar-ar-g1.utb (math): Integrate a patch by Mesar Hameed
+	<mesar.hameed@gmail.com>, some white space and encoding cleanup.
+
+2011-04-15  Peter Engström <peter.engstrom@indexbraille.com>
+
+	* tables/sr-chardefs.cti:
+	* tables/sr-g1.ctb:
+	* tables/sr-translation.ctb:
+	* tables/Makefile.am (table_files): Added braille tables for
+	Serbian
+
+	* tables/gez-chardefs.cti:
+	* tables/gez-g1.ctb:
+	* tables/gez-translation.ctb:
+	* tables/Makefile.am (table_files): Added braille tables for
+	Ethiopic
+
+	* tables/ckb-chardefs.cti:
+	* tables/ckb-g1.ctb:
+	* tables/ckb-translation.ctb:
+	* tables/Makefile.am (table_files): Added braille tables for
+	Sorani (Kurdish)
+
+2011-04-15  Bert Frees  <bertfrees@gmail.com>
+
+	* tables/es-chardefs.cti:
+	* tables/es-g1.ctb:
+	* tables/es-translation.ctb:
+	* tables/Makefile.am (table_files): Improvements to the Spanish
+	Braille tables.
+
+	* tables/nl-BE-translation.ctb:
+	* tables/nl-BE-g1.ctb:
+	* tables/Makefile.am (table_files): Improvements to the Dutch
+	Braille tables.
+
+	* tables/braille-patterns.cti:
+	* tables/nl-BE-chardefs.cti:
+	* tables/wiskunde-chardefs.cti:
+	* tables/wiskunde-translation.ctb:
+	* tables/wiskunde.ctb:
+	* tables/Makefile.am (table_files): Improvements to the Flemish
+	Braille Math Code tables.
+
+2011-04-15  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/check_all_tables.pl: Make sure translation tables which
+	are just meant to be included such as *-translation.ctb are not
+	checked.
+
+2011-04-08  Coscell Kao <coscell@molerat.net>
+
+	* tables/zh-tw.ctb: Improvements to the Chinese braille table
+
+2011-03-30  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/multiple_table_path.pl: Make sure the test also run in a
+	VPATH build, i.e. in make distcheck.
+
+2011-03-28  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/Makefile.am (table_files): Added a new swedish table
+	provided by Samuel Thibault.
+
+	* doc/liblouis.texi (Deprecated Opcodes): Added a section on
+	deprecated opcodes.
+
+2011-03-21  Christian Egli  <christian.egli@sbs.ch>
+
+	* contrib/liblouis.spec: Removed spec file as it is now maintained
+	in Fedora.
+
+2011-03-03  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/it-it-g1.utb2: Added an updated italian 8 dot table
+	provided by Caterina Avoledo <catery81@yahoo.it>
+
+2010-12-16  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/check_all_tables: Removed
+
+	* tests/check_all_tables.pl: Port the check_all_tables shell
+	script to perl and add a timeout to handle the endless loop
+	problem when checking all the tables.
+
+2010-12-09  Bert Frees  <bertfrees@gmail.com>
+
+	* tables/nl-BE.cti:
+	* tables/nl-BE-g1.ctb: modified the Dutch tables a bit, for
+	improved back-translation and hyphenation.
+
+2010-12-09  Lars Bjørndal  <lars@lamasti.net>
+
+	* tables/no-no-g0.utb:
+	* tables/no-no-g1.utb:
+	* tables/no-no-g2.utb:
+	* tables/no-no-g3.utb: Added slightly modified versions of
+	Norwegian braille tables.
+
+2010-12-07  Christian Egli  <christian.egli@sbs.ch>
+
+	* tests/tables/loop.ctb:
+	* tests/tables/Makefile.am:
+	* tests/check_endless_loop.pl:
+	* tests/Makefile.am:
+	* configure.ac: Add a new test case which exhibits an endless loop
+	in the table compiler if you configure with --enable-ucs4.
+
+	* tables/is-chardefs6.cti: Fix a problem with undefined dot
+	patterns.
+
+2010-12-07  Bert Frees  <bertfrees@gmail.com>
+
+	* tables/wiskunde_edit.cti:
+	* tables/wiskunde.cti:
+	* tables/wiskunde.ctb:
+	* tables/nl-BE.cti:
+	* tables/nl-BE-g1.ctb: Added Dutch tables provided by Bert Frees
+
+2010-11-26  Christian Egli  <christian.egli@sbs.ch>
+
+	* doc/liblouis.texi (Translation Opcodes): Fix typos and add an
+	example for the usage of joinnum.
+	(The Context and Multipass Opcodes): Added some clarification on
+	the workings of the multipass opcode that was posted to the
+	mailing list by Bert Frees.
+	(The Context and Multipass Opcodes): beautify the table
+	of characters that can be used for attribute strings.
+
+2010-11-18  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/is-chardefs8.cti: Add table for computer braille based on
+	the IceBraille standard, v1.0 by Birkir Gunnarsson,
+	birkir@midstod.is
+
+2010-11-12  Christian Egli  <christian.egli@sbs.ch>
+
+	* tables/Makefile.am (table_files):
+	* tables/es-old.dis:
+	* tables/es-new.dis:
+	* tables/es-g1.ctb:
+	* tables/es-chardefs.cti:
+	* tables/ca-g1.ctb:
+	* tables/ca-chardefs.cti: Added Spanish tables made by Bert Frees
+	<bertfrees@gmail.com>.
+
+2010-09-27  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tables/Makefile.am (table_files): Integrate the new indian tables.
+	(table_files): Integrate the new Icelandic table.
+
+2010-09-27  Birkir Gunnarsson <birkir@midstod.is>
+
+	* tables/is-chardefs6.cti: Added support for Icelandic 6-dot.
+
+2010-09-27  Samuel Thibault <samuel.thibault@ens-lyon.org>
+
+	* tables/as.ctb:
+	* tables/awa.ctb:
+	* tables/bengali.cti:
+	* tables/bh.ctb:
+	* tables/bn.ctb:
+	* tables/bra.ctb:
+	* tables/devanagari.cti:
+	* tables/dra.ctb:
+	* tables/gon.ctb:
+	* tables/gu.ctb:
+	* tables/gujarati.cti:
+	* tables/gurmukhi.cti:
+	* tables/hi.ctb:
+	* tables/kannada.cti:
+	* tables/kha.ctb:
+	* tables/kn.ctb:
+	* tables/kok.ctb:
+	* tables/kru.ctb:
+	* tables/malayalam.cti:
+	* tables/ml.ctb:
+	* tables/mni.ctb:
+	* tables/mr.ctb:
+	* tables/mun.ctb:
+	* tables/mwr.ctb:
+	* tables/ne.ctb:
+	* tables/new.ctb:
+	* tables/or.ctb:
+	* tables/oriya.cti:
+	* tables/pa.ctb:
+	* tables/pi.ctb:
+	* tables/sa.ctb:
+	* tables/sat.ctb:
+	* tables/sd.ctb:
+	* tables/ta.ctb:
+	* tables/tamil.cti:
+	* tables/te.ctb:
+	* tables/telugu.cti: Added quite a few indian tables.
+
+2010-08-27  Christian Egli  <christian.egli@sbszh.ch>
+
+	* NEWS: Added NEWS entry for release 2.1.1
+
+2010-08-23  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tests/lastworditalafter.c (main): Handle two tests more elegantly.
+
+	* tests/brl_checks.c (check_translation): Make the testing code
+	robust against NULL values in the typeform parameter.
+
+	* tests/Makefile.am (check_PROGRAMS): Add lastworditalafter to
+	check_PROGRAMS.
+
+2010-08-23  James Teh <jamie@jantrid.net>
+
+	* NEWS: Small corrections. Also, include issue numbers with
+	their associated changes.
+
+2010-08-19  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tests/Makefile.am (XFAIL_TESTS): Move lastworditalafter to
+	XFAIL_TESTS as they currently fail
+
+	* NEWS: Added News items for release 1.9.0, 2.0.0 and 2.1.0
+
+2010-08-06  James Teh <jamie@jantrid.net>
+
+	* liblouis/lou_translateString.c: Fix the output cursorPos when the
+	compbrlAtCursor mode is enabled and the characters around the cursor
+	translate to multiple braille cells, such as in the Chinese braille
+	tables.
+
+2010-08-05  James Teh <jamie@jantrid.net>
+
+	* python/louis/__init__.py.in: Allow the user to configure the maximum
+	output length by specifying a number by which the input length is
+	multiplied using the outlenMultiplier module variable. The default will
+	handle the case where every input character is undefined in the
+	translation table. Previously, this was hard-coded to 2, which was
+	insufficient in some cases.
+	Rename tran_tables argument to tableList in all functions to be
+	consistent with liblouis itself.
+
+2010-08-04  James Teh <jamie@jantrid.net>
+
+	* python/louis/__init__.py.in: Corrections/clarifications to docstrings.
+	Add compbrlLeftCursor mode constant.
+	Add compileString function which wraps lou_compileString.
+
+2010-08-03  James Teh <jamie@jantrid.net>
+
+	* liblouis/lou_translateString.c: Fix the input/output position arrays
+	for characters in the input which are undefined in the translation
+	table.
+
+2010-07-21  James Teh <jamie@jantrid.net>
+
+	* python/setup.py: Remove unnecessary imports, allowing this to
+	run in Python 2.7. (issue 12)
+
+2010-04-15  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tests/brl_checks.h: 
+	* tests/brl_checks.c (check_translation): Add a function for
+	checking a translation against an expected result.
+
+	* tests/lastworditalafter.c (main): Add a test for handling of
+	italics using an English and a German table
+
+	* tests/Makefile.am (lastworditalafter_SOURCES): Added the
+	lastworditalafter test to the check programs
+
+2010-02-12 Michael Whapples <mwhapples@aim.com>
+
+	* python/louis/__init__.py.in: Added python function louis.backTranslate
+	to wrap lou_backTranslate. Has same calling as louis.translate but again
+	with the slightly different meanings as described in liblouis
+	documentation for lou_backTranslate.
+	Also made some minor error corrections in docstrings.
+
+2010-02-12 Michael Whapples <mwhapples@aim.com>
+
+	* python/louis/__init__.py.in: Added louis.backTranslateString to wrap
+	lou_backTranslateString in python. Calling is similar to that for
+	louis.translateString. You should be aware of the possible different
+	use of typeform in lou_translateString and lou_backTranslateString.
+
+2010-02-11 Michael Whapples <mwhapples@aim.com>
+
+	* python/louis/__init__.py.in: Added support for python to recieve
+	typeform data back from louis.translate and louis.translateString.
+	For both of these the data will be placed in the typeform list handed
+	in to the function. If you don't want this to happen then don't
+	use a list (eg. use a tuple).
+
+2010-02-11 Michael Whapples <mwhapples@aim.com>
+
+	* python/louis/__init__.py.in: Added louis.hyphenate to allow access
+	from python to the lou_hyphenate function. Its definition is
+	def hyphenate(tran_tables, inbuf, mode=0)
+	Where tran_tables is a list like for the translate functions,
+	inbuf is the text or Braille to hyphenate and mode says if inbuf
+	is to be treated as text or Braille. It returns the hyphenation
+	data in a string.
+
+2010-02-04  James Teh  <jamie@jantrid.net>
+
+	* python/louis/__init__.py.in: lou_translate* writes output information
+	in typeform, so allocate enough bytes for it. Fixes possible buffer
+	overruns and resultant crashes.
+
+2010-01-07  Christian Egli  <christian.egli@sbszh.ch>
+
+	* liblouis/compileTranslationTable.c (compileError): Change the
+	format of table checking error messages to a format similar to the
+	one used in gcc.
+
+2009-11-30  Carlos Ferreira <cferreira9886@gmail.com>
+
+	* tables/Pt-Pt-g1.utb:
+	* tables/pt-pt-g2.ctb: Added tables for Portuguese grade 1 and 2.
+
+2009-11-30  Mike Sivill <mike.sivill@viewplus.com>
+
+	* tables/da-dk-g2.ctb: Added tables for Danish grade 2.
+
+2009-11-23  John J. Boyer <john.boyer@abilitiessoft.org>
+
+	* Release 1.8.0: See NEWS for new features
+
+
+2009-11-20  Christian Waldvogel  <christian.waldvogel@sbszh.ch>
+
+	* tables/de-ch-accents.cti:
+	* tables/de-ch-g0.utb:
+	* tables/de-ch-g1.ctb:
+	* tables/de-ch-g2.ctb:
+	* tables/de-chardefs6.cti:
+	* tables/de-chardefs8.cti:
+	* tables/de-de-accents.cti:
+	* tables/de-de-g0.utb:
+	* tables/de-de-g1.ctb:
+	* tables/de-de-g2.ctb:
+	* tables/de-eurobrl6.dis:
+	* tables/de-eurobrl6u.dis:
+	* tables/de-g0-core.utb:
+	* tables/de-g1-core.ctb:
+	* tables/de-g2-core.ctb:
+	* tests/check_all_tables: Added German grade 2 and Swiss German
+	grade 0, 1 and 2.
+
+2009-11-18  Christian Egli  <christian.egli@sbszh.ch>
+
+	* doc/liblouis.texi (lou_checkhyphens): Document the --help and
+	--version options that all the tools support now. Also document
+	the lou_checkhyphens tool.
+
+2009-11-12  Christian Egli  <christian.egli@sbszh.ch>
+
+	* liblouis/liblouis.h.in (widechar):
+	* liblouis/liblouis.h (widechar):
+	* configure.ac: No longer include config.h in liblouis.h. Instead
+	define the type of widechar in configure and generate liblouis.h
+	based on the options given to configure and liblouis.h.in.
+
+2009-11-05  Christian Egli  <christian.egli@sbszh.ch>
+
+	* COPYING:
+	* COPYING.LIB:
+	* README: Explain that the library is licensed under LGPL and the
+	tools under GPL.
+
+	* HACKING: Mention the use of gnulib and explain how to update it.
+
+2009-11-02  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tables/Makefile.am (table_files):
+	* tables/sv-1996.ctb:
+	* tables/sv-1989.ctb: Added two more tables for Swedish that were
+	ported from brltty by Samuel Thibault.
+
+2009-10-16  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tests/table_test_corpuses/README:
+	* tests/table_test_corpuses/Makefile.am:
+	* tests/table_test_corpuses/test_de-de-g0.utb:
+	* tests/table_test_corpuses/test_en-us-g2.ctb:
+	* tests/check_tables_against_corpus.pl:
+	* tests/Makefile.am: Added a framework for corpus based table tests.
+
+2009-10-13  Christian Egli  <christian.egli@sbszh.ch>
+
+	* man/Makefile.am: When generating the man pages at distribution
+	time you need to make sure that all the libraries and all the
+	tools are built. This makes the Makefile complex for no good
+	reason (since John doesn't have help2man anyway). So the man pages
+	are not distributed now. If a user wants man pages they have to
+	install help2man.
+
+2009-10-09  Christian Egli  <christian.egli@sbszh.ch>
+
+	* Makefile.am:
+	* configure.ac:
+	* tools/lou_allround.c:
+	* tools/lou_checkhyphens.c:
+	* tools/lou_checktable.c:
+	* tools/lou_debug.c:
+	* tools/lou_translate.c: Integrate gnulib (modules getopt,
+	progname and version-etc) and use it to add --help and --version
+	options to all the tools. Due to an (apparent) restriction in
+	progname I also changed the config header to (standard) "config.h"
+	instead of "louiscfg.h".
+
+	* man/Makefile.am (man_MANS): Automatically generate man pages for
+	all the tools if help2man is installed.
+
+2009-10-08  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tools/lou_allround.c:
+	* tools/lou_checkhyphens.c:
+	* tools/lou_checktable.c:
+	* tools/lou_debug.c:
+	* tools/lou_translate.c: Change the license of the tools to GPL.
+
+2009-09-18  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tests/Makefile.am: Define the test scripts with check_SCRIPTS
+	and make sure they are distributed.
+
+
+2009-08-24  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tests/Makefile.am: Re-enable the present_progressive test but
+	mark it as "expected failure" so that the test suite still passes.
+
+	* tests/present_progressive.c: Add a description as to what this
+	test is trying to check. Thanks Jamie for the explanation.
+
+2009-08-21  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tests/Makefile.am: Comment out the present_progressive test
+	completely so autogen.sh no longer complains.
+
+2009-08-19  Mike Sivill <mike.sivill@viewplus.com>
+
+	* tables/da.ctb:
+	* tables/da-dk-g1.utb: Bug fixes for the Danish tables
+
+2009-08-19  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tests/Makefile.am (check_PROGRAMS): disable the
+	present_progressive test.
+
+	* tables/Makefile.list, tables/Makefile.skel: removed as
+	functionality is now provided by maketablelist.sh
+
+	* tables/maketablelist.sh: renamed from tables/maketablelist
+
+2009-08-12  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tests/check_all_tables (TABLES): No longer check include tables
+	that are not valid on their own.
+
+2009-08-11 John J. Boyer <john.boyer@abilitiessoft.org>
+
+	* Updated edit tables for UK maths and Marburg to give more
+	readable output.
+
+2009-08-03 John J. Boyer <john.boyer@abilitiessoft.org>
+
+	* Added new tables for Marburg maths.
+
+
+2009-07-29 John J. Boyer <john.boyer@abilitiessoft.org>
+
+	* Added replaceGrouping function
+
+
+2009-07-28  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tables/Makefile.am: Remove some spurious files from the list of
+	tables.
+
+2009-07-28 John J. Boyer <john.boyer@abilitiessoft.org>
+	* Alpha release of UK Maths tables
+
+2009-07-17  Lars Bjørndal <lars@lamasti.net>
+
+	* contrib/liblouis.spec: Added rpm spec file.
+
+2009-07-13 John J. Boyer <john.boyer@abilitiessoft.org>
+
+	* Merged compileTranslationTable.c and lou_translateString.c
+	  with code for non-nemeth math back into trunk
+
+2009-07-06  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tables/Makefile.am (table_files): Bring the list of tables up to
+	date.
+
+2009-07-03  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tests/Makefile.am (TESTS_ENVIRONMENT): Set the environment so
+	that the tests also pass when building in a separate directory and
+	in particular for the `distcheck' rule.
+
+	* tests/brl_checks.c (TRANTAB): Since the Makefile sets the
+	LOUIS_TABLEPATH we no longer need to specify the path to the
+	table.
+
+	* tests/check_all_tables: Use LOUIS_TABLEPATH to find the tables.
+
+	* tables/sk-sk.utb: Fix errors that were reported by
+	lou_checktable.
+
+2009-07-03  James Teh <jamie@jantrid.net>
+
+	* configure.ac: Include the version suffix in the dll name for Windows again (don't add -avoid-version).
+	* python/Makefile.am:
+	* python/louis/__init__.py.in: Use the precise name of the library
+	that the bindings were built with. This ensures the correct ABI
+	and allows the bindings to work on systems which do not use the .so
+	extension.
+
+2009-07-02  Christian Egli  <christian.egli@sbszh.ch>
+
+	* doc/liblouis.texi (How to Write Translation Tables): Fix the
+	prefix for characters operand. It is \y for 5 digits and \z for 8
+	digits.
+
+2009-07-02  Samuel Thibault  <samuel.thibault@ens-lyon.org>
+
+	* tables/spaces.ctb:
+	* tables/ru.ctb:
+	* tables/gd.ctb:
+	* tables/en-chess.ctb:
+	* tables/fr-2007.ctb:
+	* tables/boxes.ctb:
+	* tables/de-chess.ctb: Fixed problems with 5-digit character
+	operands in tables.
+
+2009-07-01  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tests/check_all_tables: Added a test that invokes lou_checktable
+	on all tables.
+
+	* tests/Makefile.am (TESTS): Add the check_all_tables test to the
+	list of tests.
+
+2009-06-12 John J. Boyer <john.boyer@abilitiessoft.org>
+
+	* Added lou_checkhyphens tool for checking hyphenation tables and
+	the performance of the lou_hyphenate function. Did bugfixes in
+	lou_hyphenate. More to come.
+
+2009-05-19 John J. Boyer <john.boyer@abilitiessoft.org>
+
+	 * Added noback and nofor opcode prefixes
+	* Documentation in liblouis.texi, etc.
+
+
+2009-04-22 John J. Boyer <john.boyer@abilitiessoft.org>
+	* Added repword opcode with documentation
+
+2009-03-24 John J. Boyer <john.boyer@abilitiessoft.org>
+
+	* Added ability to specify first four user-defined classes in
+	multipass opcodes.
+
+	* Updated documentation with table of multipass attributes
+
+
+2009-03-19 John J. Boyer <john.boyer@abilitiessoft.org>
+	* Fixed bug with French back-translation.
+
+
+2009-03-12 John J. Boyer <john.boyer@abilitiessoft.org>
+	* doc/Makefile.am: datarootdir may not be correct.
+
+
+2009-03-09  Christian Egli  <christian.egli@sbszh.ch>
+
+	* doc/Makefile.am (doc_DATA): Use the default location for docdir.
+	Thanks to Lars Bjørndal for the report.
+
+2009-03-04 John J. Boyer <john.boyer@abilitiessoft.org>
+	* New Norwegian tables
+	* Release 1.6.0
+
+
+2009-02-26 John J. Boyer <john.boyer@abilitiessoft.org>
+
+	* Removed egregiously bad German Grade 2 taale.
+
+
+2009-02-23 (2) John J. Boyer <john.boyer@abilitiessoft.org>
+
+	* doc/louis.texi: Correcting and updating documentation
+
+
+2009-02-20 (2) John J. Boyer <john.boyer@abilitiessoft.org>
+
+	* Moved mac-osx-10.5 directory to liblouisxml
+
+
+2009-02-20 John J. Boyer <john.boyer@abilitiessoft.org>
+
+	* Added the directory mac-osx-10.5 and its files for building
+	liblouis and liblouisxml on the Mac.
+
+
+2009-02-19  Christian Egli  <christian.egli@sbszh.ch>
+
+	* tables/hyph_nl_NL.dic:
+	* tables/cy-cy-g1.utb: The svn:eol-style says these files are LF,
+	however they contain CRs. So when doing a svn cat you'll get an
+	error saying "svn: Inconsistent line ending style". I fixed this
+	with dos2unix.
+
+2009-02-18 John J. Boyer <john.boyer@abilitiessoft.org>
+
+	* Changing e-mail, website and company name to abilitiessoft.
+
+
+2009-02-17 John J. Boyer <john.boyer@jjb-software.com>
+
+	* Added Russian Tables and correct Danish tables from ViewPlus
+
+2009-02-16 John J. Boyer <john.boyer@jjb-software.com>
+	* Documented exactdots opcode.
+
+
+2009-02-15 John J. Boyer <john.boyer@jjb-software.com>
+
+	* compileTranslationTable.c: Fined automatic path finding. Moved
+	getProgramPath there from paths.c in liblouisxml, and made it
+	exportable as lou_getProgramPath
+	* liblouis.h: added lou_getProgramPath for Windows only.
+
+2009-02-14  James Teh <jamie@jantrid.net>
+
+	* liblouis/compileTranslationTable.c:
+	* liblouis/liblouis.h:
+	* liblouis/lou_backTranslateString.c:
+	* liblouis/lou_translateString.c: Use stdcall calling convention if building for Windows.
+	* configure.ac: If building for Windows, pass --add-stdcall-alias to the linker so that non-decorated function aliases are generated for the stdcall exported functions.
+	* python/louis/__init__.py: Update to work with stdcall under Windows.
+
+2009-02-14  Eitan Isaacson  <eitan@ascender.com>
+
+	* liblouis/compileTranslationTable.c (getFullTablePath): Added a
+	new table search path function.
+	* liblouis/Makefile.am: Define a macro with the installed 
+	tables directory TABLESDIR.
+
+2009-02-09 John J. Boyer <john.boyer@jjb-software.com>
+
+	* Latest French tables.
+
+2009-02-09  Christian Egli  <christian.egli@sbszh.ch>
+
+	* doc/liblouis.texi (Programming with liblouis): Move the
+	programming section to the back and rename to emphasize more on
+	the user instead of the programmer.
+
+	* doc/liblouis-guide.texi: rename it to liblouis.texi.
+
+2009-02-03 John J. Boyer <john.boyer@jjb-software.com>
+
+	* Implement exactdots opcode
+
+2009-01-22  Christian Egli  <christian.egli@sbszh.ch>
+
+	* doc/liblouis-guide.texi (The Context and Multipass Opcodes):
+	Document the problem with correct and multipass opcodes and input
+	and output positions.
+
+2009-01-21  James Teh <jamie@jantrid.net>
+
+	* tables/UEBC-g1.ctb: Some fixes to the UEBC grade 1 table.
+
+2009-01-20  James Teh <jamie@jantrid.net>
+
+	* python/louis/__init__.py: Add pass1Only mode.
+
+2009-01-20 (2) John J. Boyer <john.boyer@jjb-software.com>
+	* Implemented pass1Only mode bit
+	* Can now set pass1Only in lou_allround
+2009-01-20 John J. Boyer <john.boyer@jjb-software.com>
+	* Change version in configure.ac to 1.5.2
+
+2009-01-20  James Teh <jamie@jantrid.net>
+
+	* liblouis/lou_translateString.c: Fix the bug whereby the next character in the input was skipped if doing compbrlAtCursor and the first character of the word was a capital letter.
+	* liblouis/compileTranslationTable.c: lou_version() now returns PACKAGE_VERSION as defined in louiscfg.h.
+	* configure.ac: Include -avoid-version in LDFLAGS if the host is mingw or cygwin so that the version suffix is not included in the dll filename.
+
+2009-01-19  Christian Egli  <christian.egli@sbszh.ch>
+
+	* doc/liblouis-guide.texi (Top): Added some minimal docu for the
+	Python bindings.
+
+2009-01-19  Eitan Isaacson  <eitan@ascender.com>
+
+	* Makefile.am:
+	* configure.ac:
+	* python/Makefile.am:
+	* python/louis/Makefile.am: Added Python bindings to autotooled
+	distribution.
+
+	* python/README: Unset executable flag.
+
+2009-01-19  James Teh <jamie@jantrid.net>
+
+	* liblouis/lou_translateString.c: Fix issues when compbrlAtCursor is set, input is being removed due to a "repeated" opcode and cursorPos lies within the repeated input.
+
+2009-01-18  James Teh <jamie@jantrid.net>
+
+	* liblouis/lou_translateString.c: When contracting or expanding in the output, map all positions of the input to the first position of the output and all positions of the output to the first position of the input. Mapping to subsequent positions of a contraction doesn't make sense, as the contraction only makes sense as a whole.
+
+2009-01-15  Eitan Isaacson  <eitan@ascender.com>
+
+	* python/setup.py:
+	* python/louis/__init__.py: Added Python bindings.
+
+2009-01-15 John J. Boyer <john.boyer/jjb-software.com>
+
+	* Version 1.5.1: bugfix
+	 * liblouis/lou_translateString.c: fixed multi-word phrases
+	* tools/lou_debug.c : fixed bug in character display
+	* liblouis/compileTranslationTable.c : fixed bug in 
+	  findOpcodeName
+
+2009-01-14  James Teh <jamie@jantrid.net>
+
+	* liblouis/lou_translateString.c: Fix the inpos array values for the case where a rule has an output length which is larger than its input length. For example, using UEBC, given the input "#", the output will be "_?". The array mapping from output to input (inpos) previously specified [0, 1], which is incorrect; there is no character at index 1 in the input. The correct result is now returned; i.e. [0, 0].
+
+2009-01-12 John J. Boyer <john.boyer@jjb-software.com>
+
+	* Fixed problem with French Braille
+	 * Completed lou_debug tool
+	* Added hooks in compileTranslationTable.c for lou_debug
+	* Updated louis.h with hook prototypes and documentation
+	* Changed version number to 1.5.0
+
+2009-01-08  Christian Egli  <christian.egli@sbszh.ch>
+
+	* doc/Makefile.am (AM_MAKEINFOHTMLFLAGS): Generate the html as one
+	big page.
+
+2008-12-20  Eitan Isaacson  <eitan@ascender.com>
+
+	* ChangeLog:
+	* configure.ac:
+	* doc/Makefile.am:
+	* doc/liblouis-guide.texi:
+	* doc/version.texi:
+	* liblouis/lou_translateString.c:
+	* liblouis/louiscfg.h.in:
+	* tables/Cz-Cz-g1.utb:
+	* tables/Fr-Ca-g2.ctb:
+	* tables/Fr-Fr-g2.ctb:
+	* tables/Lv-Lv-g1.utb:
+	* tables/Makefile.am:
+	* tables/Nl-Nl-g1.utb:
+	* tables/No-No-g0.utb:
+	* tables/No-No-g1.ctb:
+	* tables/No-No-g2.ctb:
+	* tables/No-No-g3.ctb:
+	* tables/Pl-Pl-g1.utb:
+	* tables/Pt-Pt-g1.utb:
+	* tables/Se-Se-g1.utb:
+	* tables/UEBC-g1.utb:
+	* tables/UEBC-g2.ctb:
+	* tables/ar-ar-g1.utb:
+	* tables/bg.ctb:
+	* tables/boxes.ctb:
+	* tables/cy-cy-g1.utb:
+	* tables/cy-cy-g2.ctb:
+	* tables/da-1252.ctb:
+	* tables/da-lt.ctb:
+	* tables/da.ctb:
+	* tables/de-chess.ctb:
+	* tables/de-de-g0.utb:
+	* tables/de-de-g1.ctb:
+	* tables/de-de-g2.ctb:
+	* tables/de-de.dis:
+	* tables/en-GB-g2.ctb:
+	* tables/en-chess.ctb:
+	* tables/en-gb-g1.utb:
+	* tables/en-us-brf.dis:
+	* tables/en-us-comp6.ctb:
+	* tables/en-us-comp8.ctb:
+	* tables/en-us-g1.utb:
+	* tables/en-us-g2.ctb:
+	* tables/en-us-interline.ctb:
+	* tables/en_CA.ctb:
+	* tables/eo.ctb:
+	* tables/et.ctb:
+	* tables/eurodefs.cti:
+	* tables/fi-fi-8dot.ctb:
+	* tables/fi-fi.ctb:
+	* tables/fi1.ctb:
+	* tables/fi2.ctb:
+	* tables/fr-2007.ctb:
+	* tables/fr-bfu-comp6.utb:
+	* tables/fr-bfu-comp8.utb:
+	* tables/fr-ca-g1.utb:
+	* tables/fr-fr-g1.utb:
+	* tables/gd.ctb:
+	* tables/gr-bb.ctb:
+	* tables/gr-gr-g1.utb:
+	* tables/hi-in-g1.utb:
+	* tables/hr.ctb:
+	* tables/hy.ctb:
+	* tables/hyph_de_DE.dic:
+	* tables/hyph_it_IT.dic:
+	* tables/hyph_nl_NL.dic:
+	* tables/hyph_no_NO.dic:
+	* tables/is.ctb:
+	* tables/it-it-g1.utb:
+	* tables/it-it-g1.utb2:
+	* tables/lt.ctb:
+	* tables/nemeth_edit.ctb:
+	* tables/nl-be-g1.utb:
+	* tables/no-gen.dis:
+	* tables/no-no.dis:
+	* tables/ro.ctb:
+	* tables/ru.ctb:
+	* tables/se-se.dis:
+	* tables/sk-sk-g1.utb:
+	* tables/sk-sk.utb:
+	* tables/spaces.ctb:
+	* tables/text_nabcc.dis:
+	* tables/tr.ctb:
+	* tables/ukchardefs.cti:
+	* tables/uni-text.dis:
+	* tables/vi.ctb:
+	* tables/zh-tw.ctb:
+	* tools/Makefile.am:
+	* tools/lou_checktable.c:
+	* tools/lou_debug.c:
+	* configure.in:
+	* doc/liblouis-guide.html:
+	* doc/liblouis-guide.txt: Merge with 1.4.0, and John's autotools.
+
+
+2008-11-12  Christian Egli  <christian.egli@sbszh.ch>
+
+	* doc/liblouis-guide.texi: Added the guide in texinfo
+	* doc/Makefile.am (.texi.txt): Integrate the texinfo guide in the
+	build system.
+
+2008-06-16 John J. Boyer <john.boyer@jjb-software.com>
+
+	* Release liblouis-1.3.8
+	* Competed conversion to Gnu autotools that Eitan Isaacson started.
+
+2008-05-29 John J. Boyer <john.boyer@jjb-software.com>
+
+	* Release liblouis-1.3.71
+	* Bugs with compbrlAtCursor and returned inlen have been fixed.
+	* lou_allround has a new heature to test returned lengths.
+	* Bugs with nocont opcode fixed.
+
+2008-05-12 John J. Boyer <john.boyer@jjb-software.com>
+
+	* Release liblouis-1.3.7
+	* The moretables directory has been renamed to tables.
+	* Documentation has been moved to the docs directory.
+	* Only the programs allround, checktable and translate
+	are now supported.
+	* The names of these programs have been changed to lou_allround,
+	lou_checktable and lou_translate
+	* A few bugs have been fixed.
+
+2008-03-31 John J. Boyer <john.boyer@jjb-software.com>
+
+	* Release 1.3.6
+	* The moretables directory now contains the latest versions of
+	both the translation and hyphenation tables.
+	* The COPYING file has been changed to reflct the change from GPL to LGPL.
+
+2008-01-29  Eitan Isaacson  <eitan@ascender.com>
+
+	* configure.in: Bumped to new version.
+	* tools/Makefile.am: Changed tool names
+	* tools/allround.c:
+	* tools/basicround.c:
+	* tools/checktable.c:
+	* tools/dotsround.c:
+	* tools/roundtrip.c:
+	* tools/testback.c:
+	* tools/translate.c:
+	* tools/lou_allround.c:
+	* tools/lou_basicround.c:
+	* tools/lou_checktable.c:
+	* tools/lou_dotsround.c:
+	* tools/lou_roundtrip.c:
+	* tools/lou_testback.c:
+	* tools/lou_translate.c: Prefixed all binaries with lou_.
+
+2008-01-23  Eitan Isaacson  <eitan@ascender.com>
+
+	* configure.in:
+	* doc/liblouis-guide.html:
+	* doc/liblouis-guide.txt:
+	* liblouis/lou_backTranslateString.c:
+	* liblouis/lou_translateString.c:
+	* tables/chardefs.cti:
+	* tables/en-us-g2.ctb:
+	* tools/allround.c: John's 1.3.51 release.
+	
+	* liblouis/lou_translateString.c:
+	* tools/Makefile.am:
+	* tools/allround.c: Jonh's 1.3.42 release.
+
+2008-01-17  Eitan Isaacson  <eitan@ascender.com>
+	
+	* configure.in: Tagged version 1.3.5.
+	
+	* configure.in: Removed unsupported/Makefile.am
+	* tables/Makefile.am: Removed unsupported subdir.
+	* tables/unsupported: Removed.
+
+	* liblouis.pc.in: Added a variable called 'tablesdir'.
+	* tables/Cz-Cz-g1.utb:
+	* tables/Es-Es-g1.utb:
+	* tables/Fr-Ca-g2.ctb:
+	* tables/Fr-Fr-g2.ctb:
+	* tables/Lv-Lv-g1.utb:
+	* tables/Makefile.am:
+	* tables/Nl-Nl-g1.utb:
+	* tables/No-No-g0.utb:
+	* tables/No-No-g1.ctb:
+	* tables/No-No-g2.ctb:
+	* tables/No-No-g3.ctb:
+	* tables/Pl-Pl-g1.utb:
+	* tables/Pt-Pt-g1.utb:
+	* tables/README:
+	* tables/Se-Se-g1.utb:
+	* tables/UEBC-g1.utb:
+	* tables/UEBC-g2.ctb:
+	* tables/ar-ar-g1.utb:
+	* tables/cy-cy-g1.utb:
+	* tables/cy-cy-g2.ctb:
+	* tables/de-de-g0.utb:
+	* tables/de-de-g1.ctb:
+	* tables/de-de-g2.ctb:
+	* tables/de-de.dis:
+	* tables/en-GB-g2.ctb:
+	* tables/en-gb-g1.utb:
+	* tables/en-us-g1.utb:
+	* tables/errors:
+	* tables/eurodefs.cti:
+	* tables/fr-ca-g1.utb:
+	* tables/fr-fr-g1.utb:
+	* tables/gr-gr-g1.utb:
+	* tables/hi-in-g1.utb:
+	* tables/hyph_de_DE.dic:
+	* tables/hyph_en_US.dic:
+	* tables/hyph_es_ES.dic:
+	* tables/hyph_fr_FR.dic:
+	* tables/hyph_it_IT.dic:
+	* tables/hyph_nl_NL.dic:
+	* tables/hyph_no_NO.dic:
+	* tables/hyph_pl_PL.dic:
+	* tables/hyph_pt_PT.dic:
+	* tables/hyph_sv_SE.dic:
+	* tables/it-it-g1.utb:
+	* tables/nl-be-g1.utb:
+	* tables/no-no.dis:
+	* tables/se-se.dis:
+	* tables/text_nabcc.dis:
+	* tables/ukchardefs.cti:
+	* tables/uni-text.dis:
+	* tables/unsupported:
+	* tables/unsupported/Cz-Cz-g1.utb:
+	* tables/unsupported/Es-Es-g1.utb:
+	* tables/unsupported/Fr-Ca-g2.ctb:
+	* tables/unsupported/Fr-Fr-g2.ctb:
+	* tables/unsupported/Lv-Lv-g1.utb:
+	* tables/unsupported/Makefile.am:
+	* tables/unsupported/Nl-Nl-g1.utb:
+	* tables/unsupported/No-No-g0.utb:
+	* tables/unsupported/No-No-g1.ctb:
+	* tables/unsupported/No-No-g2.ctb:
+	* tables/unsupported/No-No-g3.ctb:
+	* tables/unsupported/Pl-Pl-g1.utb:
+	* tables/unsupported/Pt-Pt-g1.utb:
+	* tables/unsupported/README:
+	* tables/unsupported/Se-Se-g1.utb:
+	* tables/unsupported/UEBC-g1.utb:
+	* tables/unsupported/UEBC-g2.ctb:
+	* tables/unsupported/ar-ar-g1.utb:
+	* tables/unsupported/chardefs.cti:
+	* tables/unsupported/countries.cti:
+	* tables/unsupported/cy-cy-g1.utb:
+	* tables/unsupported/cy-cy-g2.ctb:
+	* tables/unsupported/de-de-g0.utb:
+	* tables/unsupported/de-de-g1.ctb:
+	* tables/unsupported/de-de-g2.ctb:
+	* tables/unsupported/de-de.dis:
+	* tables/unsupported/en-GB-g2.ctb:
+	* tables/unsupported/en-gb-g1.utb:
+	* tables/unsupported/en-us-g1.utb:
+	* tables/unsupported/en-us-g2.ctb:
+	* tables/unsupported/errors:
+	* tables/unsupported/eurodefs.cti:
+	* tables/unsupported/fr-ca-g1.utb:
+	* tables/unsupported/fr-fr-g1.utb:
+	* tables/unsupported/gr-gr-g1.utb:
+	* tables/unsupported/hi-in-g1.utb:
+	* tables/unsupported/hyph_de_DE.dic:
+	* tables/unsupported/hyph_en_US.dic:
+	* tables/unsupported/hyph_es_ES.dic:
+	* tables/unsupported/hyph_fr_FR.dic:
+	* tables/unsupported/hyph_it_IT.dic:
+	* tables/unsupported/hyph_nl_NL.dic:
+	* tables/unsupported/hyph_no_NO.dic:
+	* tables/unsupported/hyph_pl_PL.dic:
+	* tables/unsupported/hyph_pt_PT.dic:
+	* tables/unsupported/hyph_sv_SE.dic:
+	* tables/unsupported/it-it-g1.utb:
+	* tables/unsupported/nl-be-g1.utb:
+	* tables/unsupported/no-no.dis:
+	* tables/unsupported/se-se.dis:
+	* tables/unsupported/text_nabcc.dis:
+	* tables/unsupported/ukchardefs.cti:
+	* tables/unsupported/uni-text.dis: Flattened tables directory,
+	all tables not live in basedir/tables.
+
+2008-01-16  Eitan Isaacson  <eitan@ascender.com>
+
+	* README:
+	* doc/liblouis-guide.html:
+	* doc/liblouis-guide.txt:
+	* liblouis/compileTranslationTable.c:
+	* liblouis/lou_backTranslateString.c:
+	* liblouis/lou_translateString.c:
+	* tables/chardefs.cti: John's changes.
+	* configure.in: Bumped to version 1.3.41.
+
+	* liblouis/liblouis.h: Added an include to louiscfg.h for
+	character width.
+	* configure.in: Added --enable-ucs4 for 4 byte wide characters.
+	* liblouis/Makefile.am: Added louiscfg.h for installation.
+
+2008-01-03  Eitan Isaacson  <eitan@ascender.com>
+
+	* configure.in: First autotooled version.
+
diff --git a/liblouis/Dockerfile b/liblouis/Dockerfile
new file mode 100644
index 0000000..a05410f
--- /dev/null
+++ b/liblouis/Dockerfile
@@ -0,0 +1,29 @@
+FROM debian:jessie
+
+LABEL maintainer="Liblouis Maintainers <liblouis-liblouisxml@freelists.org>"
+
+# Fetch build dependencies
+RUN apt-get update && apt-get install -y \
+    autoconf \
+    automake \
+    curl \
+    libtool \
+    libyaml-dev \
+    make \
+    pkg-config \
+    python \
+    texinfo \
+   && rm -rf /var/lib/apt/lists/*
+
+# compile and install liblouis
+ADD . /usr/src/liblouis
+WORKDIR /usr/src/liblouis
+RUN ./autogen.sh && ./configure --enable-ucs4 && make && make install && ldconfig
+
+# install python bindings
+WORKDIR /usr/src/liblouis/python
+RUN python setup.py install
+
+# clean up
+WORKDIR /root
+RUN rm -rf /usr/src/liblouis
diff --git a/liblouis/Dockerfile.dev b/liblouis/Dockerfile.dev
new file mode 100644
index 0000000..cff5ee2
--- /dev/null
+++ b/liblouis/Dockerfile.dev
@@ -0,0 +1,33 @@
+FROM debian:jessie
+
+MAINTAINER Liblouis Maintainers "liblouis-liblouisxml@freelists.org"
+
+# developer environment
+RUN apt-get update
+RUN apt-get install -y make autoconf automake libtool pkg-config
+
+# for cross-compiling
+RUN apt-get install -y mingw32 mingw-w64 libc6-dev-i386
+
+# for running cross-compiled tests
+RUN dpkg --add-architecture i386 && apt-get update && apt-get install -y wine32 wine64
+
+# for check_yaml
+WORKDIR /root/src/
+RUN apt-get install -y curl patch
+RUN curl -L https://github.com/yaml/libyaml/tarball/0.1.4 | tar zx
+RUN mv yaml-libyaml-4dce9c1 libyaml
+WORKDIR /root/src/libyaml
+ADD libyaml_mingw.patch /root/src/libyaml/mingw.patch
+RUN patch -p1 <mingw.patch
+RUN ./bootstrap
+RUN ./configure --host i586-mingw32msvc --prefix=/root/build/win32/libyaml
+RUN make
+RUN make install
+
+ADD . /root/src/liblouis
+WORKDIR /root/src/liblouis
+
+# create Makefile
+RUN ./autogen.sh
+RUN ./configure
diff --git a/liblouis/Doxyfile b/liblouis/Doxyfile
new file mode 100644
index 0000000..f731f38
--- /dev/null
+++ b/liblouis/Doxyfile
@@ -0,0 +1,2427 @@
+# Doxyfile 1.8.11
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "Liblouis"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = Braille Translation and Back-Translation Library
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = doc
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = liblouis
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl,
+# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js.
+
+FILE_PATTERNS          =
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse-libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: YES.
+
+HAVE_DOT               = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
+# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
+# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/liblouis/HACKING b/liblouis/HACKING
new file mode 100644
index 0000000..4fffb75
--- /dev/null
+++ b/liblouis/HACKING
@@ -0,0 +1,453 @@
+This HACKING file describes the development environment.  	-*- org -*-
+
+  Copyright (C) 2008, 2009, 2011 ViewPlus Technologies, Inc. and Abilitiessoft, Inc.
+  Copyright (C) 2012, 2013, 2014,2015 Swiss Library for the Blind, Visually Impaired and Print Disabled
+
+  Copying and distribution of this file, with or without modification,
+  are permitted in any medium without royalty provided the copyright
+  notice and this notice are preserved. This file is offered as-is,
+  without any warranty.
+
+This file attempts to describe the maintainer-specific notes to follow
+when hacking liblouis. 
+
+* Table of Contents 							:TOC:
+ - [[#developing][Developing]]
+   - [[#where-to-get-it][Where to get it]]
+   - [[#build-requirements][Build requirements]]
+   - [[#gnulib][Gnulib]]
+   - [[#how-to-build][How to build]]
+   - [[#install-with-homebrew][Install with Homebrew]]
+   - [[#docker][Docker]]
+   - [[#how-to-run-tests][How to run tests]]
+   - [[#how-to-debug][How to debug]]
+   - [[#how-to-find-memory-leaks][How to find memory leaks]]
+   - [[#how-to-analyze-performance][How to analyze performance]]
+   - [[#how-to-build-for-windows][How to build for Windows]]
+ - [[#release-procedure][Release Procedure]]
+   - [[#update-the-news-entry][Update the NEWS entry]]
+   - [[#set-the-version-number][Set the version number]]
+   - [[#commit-and-tag][Commit and tag]]
+   - [[#make-the-release][Make the release]]
+   - [[#upload][Upload]]
+   - [[#online-documentation][Online documentation]]
+   - [[#web-site-maintenance][Web site maintenance]]
+   - [[#announce][Announce]]
+
+* Developing
+** Where to get it
+The development sources are available through git at github.com:
+
+  https://github.com/liblouis/liblouis
+
+** Build requirements
+To build Automake, Autoconf, and Libtool are used. If you are getting
+the sources from git (or change configure.ac), you'll need to have
+these tools installed to (re)build. Optionally (if you want to
+generate man pages) you'll also need ~help2man~. All of these programs
+are available from ftp://ftp.gnu.org/gnu.
+
+If you want to run the YAML based test suite you will have to install
+~libyaml~.
+
+On Mac OS, the programs can be optained with Homebrew (http://brew.sh):
+
+#+BEGIN_SRC shell
+$ brew install automake libtool pkg-config texinfo
+#+END_SRC
+
+Note that if you are using Homebrew to install liblouis (see below),
+the build dependencies are installed automatically.
+
+** Gnulib
+Gnulib (http://www.gnu.org/software/gnulib) is used to provide
+portable basic functionality to programs and libraries. We use two
+instances of gnulib, one to provide portable functions such as
+~malloc~, ~strndup~, etc to the library and another one to provide
+portable functionality such as ~getopt~, ~progname~ or
+~version-etc~ to the tools.
+
+The first time invocation to import gnulib for the library was
+
+#+BEGIN_SRC shell
+$ gnulib-tool --add-import --lib=libgnu --source-base=gnulib \
+              --m4-base=gnulib/m4 --aux-dir=build-aux --libtool \
+	      --macro-prefix=gl --no-vc-files \
+	      malloc-gnu realloc-gnu strndup
+#+END_SRC
+
+and for the tools
+
+#+BEGIN_SRC shell
+$ gnulib-tool --add-import --lib=libgnutools --source-base=tools/gnulib \
+              --m4-base=tools/gnulib/m4 --aux-dir=build-aux --libtool \
+	      --macro-prefix=gl_tools --no-vc-files \
+	      getopt-gnu malloc-gnu progname version-etc
+#+END_SRC
+
+More modules might have been added since. The currently-used gnulib
+modules and other gnulib information are recorded in
+~gnulib/m4/gnulib-cache.m4~ and ~tools/gnulib/m4/gnulib-cache.m4~.
+
+If you want to update from the current gnulib, install gnulib, and
+then run the following commands in the top-level directory.
+
+#+BEGIN_SRC shell
+$ gnulib-tool --add-import --lib=libgnu --source-base=gnulib \
+              --m4-base=gnulib/m4 --aux-dir=build-aux --libtool \
+	      --macro-prefix=gl --no-vc-files
+$ gnulib-tool --add-import --lib=libgnutools --source-base=tools/gnulib \
+              --m4-base=tools/gnulib/m4 --aux-dir=build-aux --libtool \
+	      --macro-prefix=gl_tools --no-vc-files
+#+END_SRC
+
+** How to build
+After getting the sources from git, with 
+
+#+BEGIN_SRC shell
+$ git clone https://github.com/liblouis/liblouis.git
+#+END_SRC
+
+and installing the tools above, change to the liblouis directory and
+and bootstrap the project with the following command
+
+#+BEGIN_SRC shell
+$ ./autogen.sh
+#+END_SRC
+
+to do a fresh build. Then run configure as usual:
+
+#+BEGIN_SRC shell
+$ ./configure
+#+END_SRC
+
+You have the choice to compile liblouis for either 16- or 32-bit
+Unicode. By default it is compiled for the former. To get 32-bit
+Unicode run configure with ~--enable-ucs4~.
+
+After running configure run ~make~ and then ~make install~. You must
+have root privileges for the installation step.
+
+** Install with Homebrew
+Homebrew (http://brew.sh) is a package manager for Mac OS X that
+installs software from source. There is nothing special about the
+installation process in the sense that under the hood it happens
+exactly as described above, with the only difference that Homebrew
+automates it completely.
+
+First, use the ~brew tap~ command to add the repository that includes
+the liblouis formula:
+
+#+BEGIN_SRC shell
+$ brew tap liblouis/liblouis
+#+END_SRC
+
+Now you are ready to install liblouis:
+
+#+BEGIN_SRC shell
+$ brew install liblouis
+#+END_SRC
+
+** Docker
+Docker (https://www.docker.com) can be useful both for creating a
+development environment for liblouis, and for shipping the
+application.
+
+Setting up a developer environment can take long and can be
+problematic especially for Windows. Thanks to Docker we can set up the
+environment for you, we can easily distribute it as an image, which
+can be run by anybody and will behave exactly the same for everybody.
+
+Docker images of liblouis are being built automatically each time
+something changes in the code (see https://registry.hub.docker.com/repos/liblouis).
+In order to use them, first get Docker at
+http://docs.docker.com/introduction/get-docker. Download the latest
+liblouis image with:
+
+#+BEGIN_SRC shell
+$ docker pull liblouis/liblouis
+#+END_SRC
+
+Then, enter the development environment by running the image in a
+Docker container:
+
+#+BEGIN_SRC shell
+$ docker run -it liblouis/liblouis bash
+#+END_SRC
+
+Local files and directories can be "mounted" inside the container, in
+order to make it easier to edit files and to persist changes across
+runs. For example, to use local table files:
+
+#+BEGIN_SRC shell
+$ docker run -it -v $(pwd)/tables:/tmp/liblouis/tables liblouis/liblouis bash
+#+END_SRC
+
+See the Docker documentation for more info.
+
+The same Docker image can be used as a development environment and as
+the application itself. For example, to run the lou_translate tool
+from inside a Docker container:
+
+#+BEGIN_SRC shell
+$ docker run -it liblouis/liblouis lou_translate en-us-g1.ctb
+#+END_SRC
+
+To rebuild the image yourself, run the following command in the root
+directory of the liblouis source:
+
+#+BEGIN_SRC shell
+$ docker build -t liblouis/liblouis .
+#+END_SRC
+
+A ~.dockerignore~ file is required if you want to compile the source
+both on te host and in the Docker container. The ~.dockerignore~ file
+can be updated from ~.gitignore~ with:
+
+#+BEGIN_SRC shell
+$ make .dockerignore
+#+END_SRC
+
+** How to run tests
+Tests are run with
+
+#+BEGIN_SRC shell
+$ make check
+#+END_SRC
+
+** How to debug
+First you have to build liblouis with debugging info enabled.
+
+#+BEGIN_SRC shell
+$ ./configure CFLAGS='-g -O0 -Wall -Wextra'
+$ make
+#+END_SRC
+
+Starting the programs under the tools directory within gdb is a little
+tricky as they are linked with libtool. See the info page of libtool
+for more information. To start ~lou_checktable~ for table
+~wiskunde.ctb~ for example you'd have to issue the following commands:
+
+#+BEGIN_SRC shell
+$ libtool --mode=execute gdb ./tools/lou_checktable
+(gdb) run tables/wiskunde.ctb
+#+END_SRC
+
+** How to find memory leaks
+Valgrind is a tool that can be used to find memory errors. It is
+recommended that you compile liblouis without any optimizations and
+with all warnings enabled before running it through Valgrind:
+
+#+BEGIN_SRC shell
+$ ./configure CFLAGS='-g -O0 -Wall'
+$ make
+#+END_SRC
+
+Then use Valgrind to analyze liblouis. For example you can run
+~lou_translate~ trough Valgrind:
+
+#+BEGIN_SRC shell
+$ libtool --mode=execute valgrind -v --tool=memcheck \
+  --leak-check=full --leak-resolution=high --log-file=valgrind.log \
+  ./tools/lou_translate en-us-g2.ctb
+#+END_SRC
+
+Type a few words at the prompt, check translation and terminate
+~lou_translate~. Now open the file ~valgrind.log~ and see if there are
+any memory leaks reported.
+
+You can also just run lou_checktable for example:
+
+#+BEGIN_SRC shell
+$ libtool --mode=execute valgrind -v --tool=memcheck \
+  --leak-check=full --leak-resolution=high --log-file=valgrind.log \
+  ./tools/lou_checktable tables/nl-BE-g0.utb
+#+END_SRC
+
+Again open valgrind.log to see if any memory leaks were reported.
+
+For the full experience run lou_allround under Valgrind:
+
+#+BEGIN_SRC shell
+$ libtool --mode=execute valgrind -v --tool=memcheck \
+  --leak-check=full --show-reachable=yes \
+  --leak-resolution=high --track-origins=yes \
+  --log-file=valgrind.log ./tools/lou_allround
+#+END_SRC
+
+*** AddressSanitizer
+[[https://github.com/google/sanitizers/wiki/AddressSanitizer][AdressSanitizer]] is a memory error detector for C/C++. It is part of
+both LLVM and gcc. To check liblouis build it as follows:
+
+#+BEGIN_SRC shell
+$ ./autogen.sh
+$ ./configure CFLAGS='-fsanitize=address -O1 -fno-omit-frame-pointer -g'
+$ make
+$ ./tools/lou_translate tables/en-ueb-g2.ctb
+#+END_SRC
+
+Run a few translations, end the program and marvel at the output
+AddressSanitizer. At the time of this writing it complained pretty
+hard:
+
+#+BEGIN_EXAMPLE
+SUMMARY: AddressSanitizer: 12384 byte(s) leaked in 12 allocation(s).
+#+END_EXAMPLE
+
+*** Electric Fence
+Electric Fence is a tool that helps detect memory access that overruns
+the boundaries of a ~malloc()~ memory allocation, and access to memory
+that has been released with ~free()~.
+
+Under Debian the usage is fairly straightforward:
+
+#+BEGIN_SRC shell
+$ sudo apt install sudo apt install electric-fence
+#+END_SRC
+
+Then compile [[#how-to-debug][as above]] and invoke the debugger [[#how-to-debug][as above]]. Inside ~gdb~
+set up ~LOUIS_TABLEPATH~ and ~LD_PRELOAD~ as follows:
+
+#+BEGIN_SRC shell
+$ libtool --mode=execute gdb ./tools/lou_allround
+(gdb) set environment LOUIS_TABLEPATH ./tables,./tests/tables,./tests/tables/moreTables,./tests/tablesWithMetadata,./tests/tables/emphclass
+(gdb) set environment LD_PRELOAD /usr/lib/libefence.so.0.0
+(gdb) run
+#+END_SRC
+
+If there are problems with memory access the program will run into a
+segmentation fault which you can consequently analyze in the debugger.
+
+** How to analyze performance
+Gprof helps you analyze the performance of programs. You have to
+compile liblouis as follows:
+
+#+BEGIN_SRC shell
+$ ./configure --disable-shared
+$ make clean all CFLAGS='-g -O0 -pg' LDFLAGS='-all-static'
+#+END_SRC
+
+Then translate some stuff with a large table:
+
+#+BEGIN_SRC shell
+$ ./tools/lou_translate tests/tables/large.ctb 
+#+END_SRC
+
+Finally look at the call profile:
+
+#+BEGIN_SRC shell
+$ libtool --mode=execute gprof ./tools/lou_translate gmon.out
+#+END_SRC
+
+** How to build for Windows
+See the ~README.windows~ file and the windows subdirectory.
+
+*** How to cross-compile for Windows
+To compile for win32, use the MinGW win32 cross-compiler as shown
+below. Use the prefix option to install the binaries to a temporary
+place where you can create a zip file. The ~LDFLAGS='-all-static'~
+ensures that libgcc is linked in statically. Otherwise the users need
+to have ~libgcc_s_sjlj-1.dll~.
+
+Some users want the dlls unversioned. To achieve that add
+~-avoid-version~ to ~LDFLAGS~.
+
+#+BEGIN_SRC shell
+$ ./configure --build=i686-pc-linux-gnu --host=i686-w64-mingw32 --prefix=/tmp/liblouis-mingw32
+$ make LDFLAGS='-avoid-version -Xcompiler -static-libgcc'
+$ make install
+$ zip -r liblouis-mingw32msvc.zip /tmp/liblouis-mingw32
+#+END_SRC
+
+To compile for win64, use the MinGW-w64 cross-compiler:
+
+#+BEGIN_SRC shell
+$ ./configure --build=i686-pc-linux-gnu --host=x86_64-w64-mingw32 --prefix=/tmp/liblouis-w64-mingw32
+$ make LDFLAGS='-avoid-version -Xcompiler -static-libgcc'
+$ make install
+$ zip -r liblouis-w64-mingw32.zip /tmp/liblouis-w64-mingw32
+#+END_SRC
+
+Two makefile rules have been provided to do this automatically for you. Docker will be used if the
+right cross-compiler is not installed. To compile for win32 using the MinGW cross-compiler, run ~make
+distwin32~. This will produce a ZIP file called ~liblouis-<version>-win32.zip~. To compile for win64
+using the MinGW-w64 cross-compiler, run ~make distwin64~. This will produce a ZIP file called
+~liblouis-<version>-win64.zip~.
+
+*** TODO How to build for Windows using Cygwin
+(possibly use a Vagrantfile as demonstration + explain that Cygwin
+binaries can not be used outside the Cygwin environment)
+
+*** TODO How to build for Windows using MinGW
+(possibly use a Vagrant file as demonstration)
+
+* Release Procedure
+These steps describe what a maintainer does to make a release; they
+are not needed for ordinary patch submission.
+
+** Update the NEWS entry
+If any new tables were added, renamed or removed please note them with
+their file name in the NEWS entry. This is usefull for projects like
+NVDA.
+
+** Set the version number
+Update the version number in ~NEWS~ (with version, date, and release
+type), ~ChangeLog~, ~configure.ac~ and ~windows/include/config.h~.
+
+Don't forget to update the libtool versioning info in ~configure.ac~,
+i.e. ~LIBLOUIS_REVISION~ and possibly ~LIBLOUIS_CURRENT~ and ~LIBLOUIS_AGE~.
+
+** Commit and tag
+Commit the changes and tag this version
+
+#+BEGIN_SRC shell
+$ git tag -s v2.6.0 -m "Release 2.6.0"
+$ git push origin v2.6.0
+#+END_SRC
+
+If you know the exact version number that needs to be tagged use
+
+#+BEGIN_SRC shell
+$ git tag -s v2.6.0 -m "Release 2.6.0" <commit>
+$ git push origin v2.6.0
+#+END_SRC
+
+** Make the release
+Check out a clean copy in a different directory, like /tmp. Run
+autogen.sh and configure with no special prefixes. Run make distcheck.
+This will make sure that all needed files are present, and do a
+general sanity check. Run make dist. This will produce a tarball.
+
+#+BEGIN_SRC shell
+$ ./autogen.sh && ./configure && make && make distcheck && make dist
+#+END_SRC
+
+** Upload
+Add the tarball to the github liblouis releases page, i.e. add it
+under https://github.com/liblouis/liblouis/releases with the specific
+release and add a link to it in $WEBSITE/downloads/index.md. See below
+for instructions on how to update the web site.
+
+** Online documentation
+The online documentation is part of the liblouis web site. To add it to the
+site simply copy doc/liblouis.html to $WEBSITE/documentation/liblouis.html.
+Make sure you add the proper YAML front matter. Again see below for
+instructions on how to update the web site.
+
+** Web site maintenance
+The liblouis web site at liblouis.org is maintained with the help of
+[[https://pages.github.com/][github pages]]. To edit the site just check out the repo at
+https://github.com/liblouis/liblouis.github.io. You'll need to know a
+few things about [[http://jekyllrb.com/][Jekyll]] and markdown, the markup that is used to edit
+the content. In order to update the site simply edit, commit and push.
+
+For the new release update the project web site.
+
+- Add a post containing the current NEWS to the _posts directory and
+- add the download artifacts to the download page
+
+** Announce
+Send an announcement to the liblouis list
+~liblouis-liblouisxml@freelists.org~. See ~ANNOUNCEMENT~ for an
+example.
+
diff --git a/liblouis/LICENSE b/liblouis/LICENSE
new file mode 100644
index 0000000..cca7fc2
--- /dev/null
+++ b/liblouis/LICENSE
@@ -0,0 +1,165 @@
+		   GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/liblouis/License.md b/liblouis/License.md
new file mode 100644
index 0000000..19e3071
--- /dev/null
+++ b/liblouis/License.md
@@ -0,0 +1,504 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+(This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.)
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    {description}
+    Copyright (C) {year} {fullname}
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
+    USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random
+  Hacker.
+
+  {signature of Ty Coon}, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/liblouis/Makefile.am b/liblouis/Makefile.am
new file mode 100644
index 0000000..f2cf8ad
--- /dev/null
+++ b/liblouis/Makefile.am
@@ -0,0 +1,64 @@
+SUBDIRS = gnulib liblouis tools tables man tests python windows
+
+# only build the documentation if we have makeinfo 5
+if HAVE_MAKEINFO_5
+SUBDIRS += doc
+endif
+
+ACLOCAL_AMFLAGS = -I m4 -I gnulib/m4 -I tools/gnulib/m4
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = liblouis.pc
+
+EXTRA_DIST = liblouis.pc README.windows HACKING
+
+distwin32 : distwin32-zip
+
+distwin32-zip : distwin32-dir
+	rm -f liblouis-$(VERSION)-win32.zip
+	zip -r liblouis-$(VERSION)-win32.zip liblouis-$(VERSION)-win32
+
+distwin32-dir :
+	rm -rf liblouis-$(VERSION)-win32/*
+	@if which i586-mingw32msvc-gcc >/dev/null; then \
+	  ./configure --host i586-mingw32msvc --prefix=$(CURDIR)/liblouis-$(VERSION)-win32 && \
+	  make LDFLAGS="$$LDFLAGS -avoid-version -Xcompiler -static-libgcc" && \
+	  make check WINE=wine32&& \
+	  make install; \
+	elif which i686-w64-mingw32-gcc >/dev/null; then \
+	  ./configure --host i686-w64-mingw32 --prefix=$(CURDIR)/liblouis-$(VERSION)-win32 && \
+	  make LDFLAGS="$$LDFLAGS -avoid-version -Xcompiler -static-libgcc" && \
+	  make install; \
+	elif which docker >/dev/null; then \
+	  gtar --transform='s/Dockerfile.dev/Dockerfile/' --exclude-from=.dockerignore -cz * | docker build -t liblouis-dev - && \
+	  mkdir -p liblouis-$(VERSION)-win32 && \
+	  docker run --rm -v $(CURDIR)/liblouis-$(VERSION)-win32:/root/src/liblouis/liblouis-$(VERSION)-win32 liblouis-dev \
+	    make CPPFLAGS='-I/root/build/win32/libyaml/include/' \
+	         LDFLAGS='-L/root/build/win32/libyaml/lib/' \
+	         distwin32-dir; \
+	fi
+
+distwin64 : distwin64-zip
+
+distwin64-zip : distwin64-dir
+	rm -f liblouis-$(VERSION)-win64.zip
+	zip -r liblouis-$(VERSION)-win64.zip liblouis-$(VERSION)-win64
+
+distwin64-dir :
+	rm -rf liblouis-$(VERSION)-win64/*
+	@if which x86_64-w64-mingw32-gcc >/dev/null; then \
+	  ./configure --host x86_64-w64-mingw32 --prefix=$(CURDIR)/liblouis-$(VERSION)-win64 && \
+	  make LDFLAGS='-avoid-version -Xcompiler -static-libgcc' && \
+	  make check WINE=wine64&& \
+	  make install; \
+	elif which docker >/dev/null; then \
+	  gtar --transform='s/Dockerfile.dev/Dockerfile/' --exclude-from=.dockerignore -cz * | docker build -t liblouis-dev - && \
+	  mkdir -p liblouis-$(VERSION)-win64 && \
+	  docker run --rm -v $(CURDIR)/liblouis-$(VERSION)-win64:/root/src/liblouis/liblouis-$(VERSION)-win64 liblouis-dev \
+	    make distwin64-dir; \
+	fi
+
+# .dockerignore
+.dockerignore : .gitignore
+	sed -e 's|^\([^/#]\)|# \1|' -e 's|^/||' -e 's|\+|\\+|g' $< >$@
+
diff --git a/liblouis/NEWS b/liblouis/NEWS
new file mode 100644
index 0000000..42c319b
--- /dev/null
+++ b/liblouis/NEWS
@@ -0,0 +1,1299 @@
+liblouis NEWS -- history of user-visible changes.  	-*- org -*-
+
+* Noteworthy changes in release 3.4.0 (2017-12-04)
+This release brings together a lot of work by lots of different
+people. Probably the most prominent fix is the work on output
+positions by Bue and Bert. NVDA should benefit from this. Then there
+are new and massively improved tables like the Lithuanian 6-dot table
+by Rimas or the improved back-translation for French by Michel and
+André-Abush to name just a few. There are too many contributors to
+name them here, thanks to them all.
+
+For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/14?closed=1][the list of closed
+issues]].
+
+** New features
+- Add support for ~inputPos~ and ~outputPos~ checking in
+  ~lou_checkyaml~ thanks to Bue Vester-Andersen. See the manual for
+  details and examples.
+** Bug fixes
+- output positions (~outputPos~) are now calculated based on input
+  positions (~inputPos~) thanks to Bert Frees. This avoids a whole
+  class of bugs that previously plagued the output positions. This fix
+  also obviates the need for the ~pass1Only~ flag. See below for the
+  deprecation notice.
+** Braille table improvements
+- Addition of Nemeth and Kangxi radical characters and other
+  improvements to Chinese braille (~zh-tw.ctb~) thanks to Bo-Cheng
+  Jhan and 黃偉豪.
+- Improvements to the Spanish chardefs table thanks to Luis Lorente
+  Barajas and Simon Aittamaa.
+- Fixed a lowercase ó in Spanish first reported for NVDA thanks to
+  Sukil Etxenike.
+- New Norwegian 6-dot display braille table for Braillo embossers
+  thanks to Lars Bjørndal
+- Added a bunch of whitespace-like codepoints as spaces thanks to
+  Rimas Kudelis
+- Added Lithuanian 6-dot table thanks to Rimas Kudelis.
+- Addition of more characters to the French tables thanks to Samuel
+  Thibault
+- Improvements to the Hungarian tables thanks to Attila Hammer
+- Improvements to the Mongolian tables thanks to Tsengel Maidar
+- Fix some math signs in Czech Braille (~cs-chardefs.cti~). Thanks to
+  Christian Herden of ViewPlus for reporting this.
+- Updates to the SEB British Braille Tables thanks to Paul Wood
+- Massive improvements to French back-translation thanks to Michel
+  Such and André-Abush Clause
+** Other changes
+*** Improved documentation
+- Bue Vester-Andersen added some notes about back-translation and
+  documented all possible values of the ~mode~ parameter. Also the
+  description of ~decpoint~ and ~litdigit~ was improved.
+- The ~match~ opcode is now documented thanks to Mike Gray and
+  Christian Egli.
+
+*** lou_maketable
+Numerous bug fixes and performance enhancements thanks to Bert Frees
+
+*** Code refactoring
+Many global variables have been removed thanks to Bert Frees
+
+*** Code formatting
+Thanks to clang-format There is now a uniform coding style over the
+whole code base
+
+*** Fix broken NMakefile
+Thanks to Davy Kager building with nmake should work again
+
+** Deprecation notice
+The ~pass1Only~ flag has been deprecated. Its use should be avoided,
+and it will be completely removed from the code in the next version of
+Liblouis. When using the ~pass1Only~ flag in this release you will get
+a warning.
+
+** Backwards incompatible changes
+None
+
+** New, renamed or removed tables
+*** New
+- no-no-braillo-047-01.dis
+- lt-6dot.utb
+*** Renamed
+None
+*** Removed
+None
+
+* Noteworthy changes in release 3.3.0 (2017-09-04)
+This release brings a slew of Braille table improvements, fixes a
+number of security related bugs and introduces a new tool to generate
+liblouis Braille tables based on a corpus of know good Braille
+translations. For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/13?closed=1][the list
+of closed issues]].
+
+** New features
+*** maketable tool
+A new tool ~lou_maketable~ enables the creation of tables based on a
+corpus of known good Braille translations. This has huge potential to
+simplify table maintenance for tables that have so far been dominated
+by large exception lists. Thanks to Bert Frees.
+*** Meta data query API
+A new API and a corresponding command line tool to query table meta
+data thanks to Bert Frees
+
+** Bug fixes
+*** Back translation
+- UEB grade 2
+  - Fix back-translation of whole word contractions followed by other
+    contractions thanks to James Teh.
+  - Fix back-translation for contractions followed by punctuation
+    thanks to James Teh.
+*** Security
+- Fix a number of CVEs (illegal address access, buffer overflow and
+  use-after-free or in terms of CVEs: CVE-2017-13738, CVE-2017-13739,
+  CVE-2017-13740, CVE-2017-13741, CVE-2017-13742 and CVE-2017-13744)
+  thanks to Mike Gorse.
+- Fix CVE-2017-13743 thanks to Christian Egli.
+
+** Braille table improvements
+- New table for Croatian grade 1 Braille thanks to Zlatko Sobočan.
+- Fixes and tests for Slovak Braille thanks to Simon Aittamaa
+- Numerous fixes in the character definitions of the Spanish tables
+  thanks to Simon Aittamaa
+- Unified French 6 dots and 8 dots improvements for back-translation
+  thanks to Michel Such
+- Updates to the Chinese braille table thanks to Coscell Kao
+- Updates to Nemeth character definitions thanks to Attila Hammer
+- The Hungarian tables now conform to the new 2017 standard thanks to
+  Attila Hammer
+
+** Backwards incompatible changes
+- The constant ~otherTrans~ has been removed in both the C API and the
+  corresponding Python bindings.
+- The constants ~ucBrl~, ~noUndefinedDots~ and ~partialTrans~ have
+  different values now in both the C API and the corresponding Python
+  bindings.
+
+** New, renamed or removed tables
+*** New
+- hr-g1.ctb
+*** Renamed
+- hr.ctb -> hr-comp8.utb
+*** Removed
+
+* Noteworthy changes in release 3.2.0 (2017-06-06)
+Aside from the usual improvements to Braille tables this release
+focuses on improving the internal infrastructure. Numerous bugs have
+been fixed, the CI infrastructure also checks mingw builds now and MSVC
+compatibility has been massively improved. For a detailed list of all
+the changes refer to [[https://github.com/liblouis/liblouis/milestone/10?closed=1][the list of closed issues]].
+
+** Bug fixes
+- Fix capsnocont opcode. Also mark capital letters with capsletter
+  symbol when capsnocont is defined but no begcapsword indicator is
+  defined. Thanks to Bue Vester-Andersen.
+- Fix the syllable opcode. It had been broken under some circumstances
+  since 3.0. Thanks to Bert Frees and Christian Egli.
+** Other changes
+- Fix building of Python bindings when cross-compiling. Thanks to
+  Chris Brannon
+- lou_checkyaml is now only installed if libyaml is available. Thanks
+  to Christian Egli
+- Major internal changes to improve MSVC compatibility. Thanks to Davy
+  Kager
+- Enhance documentation on usage of display tables in particular
+  in conjunction with Unicode dot patterns. Thanks to Bert Frees
+** Braille table improvements
+- Improvements to the Swedish 8-dots table (~se-se.ctb~) thanks to
+  Kevin Derome
+- Improvements to the Simplified-Chinese Braille table thanks to
+  Roshanson
+- Fixes for the International Phonetic Alphabet Braille table thanks
+  to Ludovic Oger
+- Added more Unicode symbols (fractions and not equal) to the UEB
+  tables. Thanks to Paul Wood and James Bowden.
+- Fixes to UEB grade 2 (en-ueb-g2.ctb) thanks to Mike Gray.
+- Vastly improved Danish tables thanks to Bue Vester-Andersen.
+  - New literary tables for 6 dots, mainly for embossing (no
+    back-translation).
+  - Improved back-translation in 6 dots tables, all grades.
+  - New support for many Unicode characters in all 6 dots tables.
+  - Strengthened internal tests to prevent breaking of tables due to
+    changes in the code.
+  - Fixed 8 dots tables which were broken in the previous version.
+- New Braille tables for Sinhala script thanks to Ashoka Bandula
+  Weerawardhana.
+- New Hungarian grade 2 Braille table thanks to Attila Hammer.
+- Improvements to UEB in particular to symbols specified mostly on the
+  Appendix 3 (Symbols List) from the Rules of Unified English Braille
+  Second Edition 2013 document thanks to Victor Montalvão.
+- Improvements to Persian 8 dot computer Braille table thanks to
+  Mohammadreza Rashad.
+** Backwards incompatible changes
+- The old Greek table gr-gr-g1.utb is gone. Use el.ctb instead
+- The doctests are gone. They have been superseded by the YAML tests.
+- The internal API which was previously in louis.h has been made
+  internal, i.e. the file is renamed to internal.h and the function
+  names are prepended with underscores ('_').
+
+** New, renamed or removed tables
+*** New
+- sin.cti
+- sin.utb
+- hu-hu-g2.ctb (new)
+- da-dk-6miscChars.cti (new)
+- da-dk-g16-lit.ctb (new)
+- da-dk-g26-lit.ctb (new)
+- da-dk-g26l-lit.ctb (new)
+*** Renamed
+- gr-gr-g1.utb (removed and replaced by el.ctb)
+*** Removed
+- da-chardefs6.cti
+- da-dk-common6.uti
+- da-dk-g26-patches.cti
+- da-dk-g2core.cti
+- da-dk-nocaps.uti
+
+* Noteworthy changes in release 3.1.0 (2017-03-06)
+An influx of new contributors have made sure that liblouis continues
+to improve. Back translation has seen major improvements, there are
+some additional modes to help screen readers, for many tables meta
+data has been added, the Python bindings are more robust, Windows
+support has been improved, the YAML test suite has been generalized
+and as usual new and improved braille tables have been included. On
+the licensing front we managed to get almost all tables re-licensed to
+LGPLv2.1+.
+
+** New features
+*** Meta data
+Most of the translation tables now contain meta data. This makes them
+discoverable. Programs can use the lou_findTable function to find a
+table based on a query.
+
+*** noUndefinedDots mode
+Add a noUndefinedDots mode to disable the output of dot numbers when
+back-translating undefined patterns. Thanks to James Teh.
+
+When back translating input from a braille keyboard cell by cell, it is
+desirable to output characters as soon as they are produced.
+Similarly, when back translating contracted braille, it is desirable to
+provide a "guess" to the user of the characters they typed. To achieve
+this, liblouis needs to have the ability to produce no text when
+indicators (which don't produce a character by themselves) are not
+followed by another cell. This works already for indicators liblouis
+knows about such as capital sign, number sign, etc., but it does not
+work for indicators which are not (and cannot be) specifically defined
+as indicators. For example, in UEB, dots 4 5 6 alone produces the text
+"\456/". Setting the noUndefinedDots mode suppresses this dot number
+output.
+
+*** partialTrans mode
+Add a partialTrans mode to specify that back-translation input should
+be treated as an incomplete word. Thanks to James Teh.
+  
+If this mode is set, rules that apply only for complete words or at
+the end of a word will not take effect. This is intended to be used
+when translating input typed on a braille keyboard to provide a rough
+idea to the user of the characters they are typing before the word is
+complete.
+
+*** YAML test framework
+The YAML framework has been extended and is much more useful now. You
+can test multiple tables within one YAML file, you can define test
+tables directly inline and you can test multiple tables using the same
+test data. Refer to the documentation for the details.
+
+If really not wanted the YAML tests can be disabled by specifying
+~configure --without-yaml~.
+
+** Bug fixes
+- Fixes implicit declaration of 'pattern_check' thanks to  Reiner Dolp
+- Fix a stackoverflow crash on applications with smaller stack size.
+  Thanks to Victor Montalvão.
+- Fix the \v escape sequence. Thanks to Davy Kager.
+- The Python bindings now give a helpful error if liblouis has been
+  compiled with a different character size than Python. Thanks to Matt
+  Wenn.
+- Massive bug fixes in multipass rules. Dave Mielke has done a
+  tremendous job improving the multipass machinery also in the
+  context of back-translation. Where needed nofor/noback has been
+  added to the multipass rules.
+
+** Other changes
+- Improvements to the Emacs mode for editing liblouis tables thanks to
+  Christian Egli
+- Documenting lou_charSize thanks to Reiner Dolp
+- Support for relative table paths in the tests. This will make sure
+  you always know which table a test actually uses.
+- Infrastructure to build windows binaries in a Docker container,
+  thanks to Bert Frees
+
+** Braille table improvements
+- UEB improvements, thanks to Mike Gray
+  - Fixed apostrophe and back translation
+  - Added rules for Unicode apostrophe handling
+  - Improvements to UEB and Nemeth math
+- Complete overhaul of Lithuanian 8-dots table, thanks to Rimas
+  Kudelis
+- New Urdu 6 Dot Grade 1 and 2 Braille tables thanks to Jake Kyle
+- Improvements to Italian 8 dots computer braille, thanks to Simone
+  Dal Maso.
+- New table ~unicode-braille.utb~ that helps to back translate braille
+  input to Unicode braille output, thanks to Leonard de Ruijter.
+- Improvements to the Chinese braille table thanks to Coscell Kao.
+- New Turkish braille table for grade 1 that should replace the
+  old ~tr.ctb~ table, thanks to Arend Arends.
+- New Persian grade 1 table and 8-dots computer table thanks to
+  Mohammadreza Rashad.
+- New table for the International Phonetic Alphabet thanks to Ludovic
+  Oger
+- Fixes for the French 6 and 8 dots tables thanks to Michel Such. Some
+  errors have been fixed and many Unicode characters have been added.
+- Add an extended 8-dot computer braille table for U.S. English thanks
+  to Davy Kager. The table is tailored for use on Windows (CP-1252)
+  and uses dot patterns from Windows screen readers, but should be
+  useful on other platforms too.
+- New Greek table that is better than the existing Greek Grade 1
+  Braille Table (gr-gr-g1.utb) thanks to Dave Mielke.
+- Improved number back-translations on fr-fr-g1 and vi-g1 tables
+  thanks to Victor Montalvao.
+- New Chinese Braille table for use in the mainland of China thanks to
+  Kaifang Bao of RejoinTech.
+- The Black Circle character is commonly used for displaying password
+  characters. The absence of its definition leads to users not being
+  able to know how many characters were typed in such fields. This has
+  been improved for many tables thanks to Victor Montalvao.
+
+** License changes
+- DocArch has agreed to re-license their tables, so we have 8 more
+  tables under the LGPLv2.1+.
+
+** Backwards incompatible changes
+- The naming in the YAML test framework has changed slightly from
+  `tables:` to `table:`.
+
+* Noteworthy changes in release 3.0.0 (2016-07-14)
+This is the biggest release of liblouis in years. The major news are
+that we now have proper support for UEB and secondly that liblouis is
+now licensed under [[https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html][LGPLv2.1+]].
+
+In order to support UEB the internals of liblouis have seen a major
+rewrite. New Opcodes have been added to support the requirements for
+proper UEB for example for emphasis handling or to handle proper
+translation of numbers. Changes to the opcodes are described in the
+documentation. Some of these changes are not backwards compatible. All
+tables that come with liblouis have been migrated. If you have private
+tables look at the section on upgrading from previous versions in the
+[[https://github.com/liblouis/liblouis/wiki/Emphasis-Opcodes#upgrade-from-previous-versions][wiki]].
+
+This release also changes the C API. External applications will have
+to adapt the way they call liblouis. In particular the typeform
+parameter has changed.
+
+The license of the library and most of the tables has been changed to
+LGPLv2.1. For a detailed list which tables are still in the process of
+migrating the license refer to the [[https://github.com/liblouis/liblouis/wiki/Licensing-of-liblouis-tables][wiki page about the license change]].
+
+** New features
+- Numerous features to support UEB properly. Thanks to Mike Gray,
+  William Freeman, Davy Kager, Keith Creasy and the American Printing
+  House for the Blind for sponsoring this work.
+  - support the many emphasis classes needed for UEB.
+  - support translation of numbers according to the rules of UEB.
+  - Capitalization is now handled just like emphasis.
+  - support for numeric mode
+- UTF-8 support for all tools thanks to Christian Egli.
+- The YAML tests now allow for an optional test description. See the
+  documentation for more details.
+- Add ~lou_checkTable~ and ~lou_getTypeformForEmphClass~ to the C API
+  and to the Python bindings
+** Bug fixes
+- Stop buffer overrun in ~lou_getProgramPath~, and also free memory
+  after usage. Thanks to Michael Curran.
+** Other changes
+- The license of the library and most of the tables has been changed
+  to [[https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html][LGPLv2.1+]].
+- Improvements to the test suite:
+  - Output is printed to ~stderr~. This helps with locating errors when
+    testing with the YAML test suite.
+  - typeform is included in output.
+** Braille table improvements
+- Improved Finish 6-dot braille thanks to Jukka Eerikäinen
+- Improvements to the Chinese braille table thanks to Coscell Kao
+- Improvements to Mongolian thanks to Tsengel Maidar and Sreeja Param
+- Added new Slovak tables based off the official Slovak braille
+  standard thanks to Peter Vagner
+- Changes to the Norwegian tables. There are now three Norwegian 8-dot
+  tables
+  - ~no-no-comp8.ctb~: Norwegian 8-dot computer braille table
+  - ~no-no-8dot.utb~: Norwegian 8-dot braille table
+  - ~no-no-8dot-fallback-6dot-g0.utb~: Norwegian 8-dot braille table
+    with uncontracted 6-dot fallback
+- Changes to the Dutch tables
+  - Conforms better to the standard.
+  - ~nl-BE-g1.ctb~ renamed to ~nl-BE-g0.utb~
+  - ~nl-NL-g1.ctb~ renamed to ~nl-NL-g0.utb~
+- Improvements to Danish tables: Added grade 2 with limited
+  contractions to 6 and 8 dots. Corrected contraction of many words.
+  - Renamed:
+    - ~da-ansi8.dis~ -> ~da-dk-octobraille.dis~
+    - ~da-dk-g16.utb~ -> ~da-dk-g16.ctb~
+    - ~da-dk-g18.utb~ -> ~da-dk-g18.ctb~
+    - ~hyph_da_DK.dic~ -> ~hyph_brl_da_dk.dic~
+  - Removed: ~da-dk-g28caps.cti~, ~da-dk-g28-patches.cti~ and
+    ~da-chardefs8.cti~
+** Backwards incompatible changes
+- The json based harness test suite has been removed as its
+  functionality has been superceded by the YAML tests. Please use
+  these from now on.
+- A number of opcodes to handle emphasis have been renamed.
+- The C API regarding the typeform parameter has changed.
+
+* Noteworthy changes in release 2.6.5 (2015-12-1)
+This minor release introduces new tables (Mongolian and Norwegian 8
+dot) and new features to the tracing tool. But the most exiting news
+about this release is probably the fact that 12 developers have
+contributed to it, showing how widely used liblouis is and how
+actively the development progresses.
+
+** New features
+- A DEF file is now generated automatically for the windows builds.
+  Thanks to Christian Egli
+- lou_trace supports backtranslation now. Thanks to Bert Frees
+
+** Bug fixes
+- Fix a bug in the findtable code. Thanks to Michael Katzmann for the
+  report.
+- Fix some compile time warnings on Windows, thanks to Bue
+  Vester-Andersen.
+- Fixes to the logging code by Arend Arends.
+
+** Other changes
+- Add test data for EUB symbols, thanks to Paul Wood
+- Clean up dead code i.e. remove support for (undocumented) nobreak
+  opcode. Thanks to Bue Vester-Andersen.
+
+** Braille table improvements
+- New Mongolian table thanks to Tsengel Maidar and Sreeja Param.
+- Improvements to the Chinese braille table thanks to Coscell Kao.
+- Massive improvements to Norwegian, thanks to Lars Bjørndal, Ammar
+  Usama and Jostein Austvik Jacobsen. They added a 8 dot table and
+  lots of test data.
+- Improvements to Hungarian, thanks to Attila Hammer
+
+* Noteworthy changes in release 2.6.4 (2015-08-31)
+This is a minor release in terms of features. But in terms of test
+coverage and stability it is a vast improvement over previous versions
+of Liblouis. The new YAML based test suite contains more than a
+million of validated translations. Every change in Liblouis is tested
+against this corpus ensuring the change doesn't break anything.
+
+** New features
+- YAML based harness tests. Harness tests can now be written in simple
+  YAML notation and they are integrated with the normal `make check`
+  command. They can be used for both ucs2 and ucs4 and no Python is
+  required. Thanks to Christian Egli.
+
+** Bug fixes
+- Use a separate gnulib instance for the library and the tools. Use
+  the strndup module to avoid build problems on windows.
+- Fix a problem with the nocross opcode when used in combination with
+  the opcodes nocont and compbrl, thanks to Bue Vester-Andersen.
+- Fix a problem with the decoding of the harness test files. Thanks to
+  Bert Frees.
+- Fix numerous problems in the way braille indicators are handled.
+  There is now a safe version of the checkAttr function which makes
+  sure that no attributes are checked beyond the boundaries of the
+  currentInput. This fixes the random behavior with tests where the
+  emphasis extends to the end of the input string. Thanks to Christian
+  Egli.
+
+** Other changes
+- if found use texi2any to build the documentation, thanks to Martin
+  Michlmayr.
+- Fix permissions of Korean tables, thanks to Peter Lundblad.
+- Update the windows build instructions, thanks to Bue
+  Vester-Andersen.
+
+** Braille table improvements
+- Improvements to Hungarian, thanks to Attila Hammer
+- Improvements to Hungarian 8 dot and Serbian grade 1, thanks to
+  Zvonimir Stanecic
+
+* Noteworthy changes in release 2.6.3 (2015-06-01)
+Given the release number you might think this is only a minor release.
+However looking at the number of developers who contributed to it and
+the number of pull requests and issues that were solved this turns out
+to be a very impressive and solid release. Most prominently we have a
+new function to discover tables based on meta data in table headers.
+Also makeinfo is no longer required to build liblouis. And lastly we
+have numerous improvements in Braille tables such as Korean,
+Vietnamese and UEB to name just a few.
+
+** New features
+- [beta] The new function lou_findTable can be used for table
+  discovery based on meta data in table headers. Thanks to Bert Frees.
+- The Python API now has a new function to check tables aptly named
+  ~checkTable~. Thanks to Davy Kager.
+
+** Bug fixes
+- Fixed a problem in resolveTable when using a Java resolver, thanks
+  to Bert Frees
+
+** Other changes
+- The build dependency on makeinfo is now optional. If it is not
+  installed we simply do not build the documentation.
+
+** Braille table improvements
+- Improvements to Bengali, Devanagari, Kannada, Gujarati, Malayalam,
+  Telugu and Oriya, thanks to Sreeja Param
+- Corrections and improvements made to en-GB tables thanks to Paul
+  Wood
+- Vast restructuring to Korean tables. In 2006 the Institute for Korean
+  Braille modified some dots in Korean Braille. Specifically, some
+  punctuation dots are now based on English. To accommodate this change
+  and to retain the old tables, the Korean table set was revised as
+  follows:
+  - Added three files: ko-chars, the Korean characters dictionary, and
+    rules for g1 and g2.
+  - ko-g1 and ko-g2 are now interface files that includes needed
+    files.
+  - Added three files for Korean Braille 2006 revision along with a
+    test harness.
+- New table for Polish 8 dot computer braille. Thanks to Karol Pecyna.
+- New table for Vietnamese 6 dot. Thanks to Harri Pasanen.
+- Corrections and improvements made to UEB tables thanks to Paul Wood
+  - Typeform passage indicators
+  - Degree sign
+  - Dash signs
+  - Math signs
+  - Accent modifiers
+  - Accented letters
+
+* Noteworthy changes in release 2.6.2 (2015-03-02)
+This release, which was mostly pushed out the door by Bert and Mesar,
+fixes a long standing emphasis bug, adds more functionality to the
+harness test suite and improves, as usual, on Braille tables. Notably
+there is a brand new finish table backed by Celia.
+
+** New features
+- Harness tests now can test for typeform differences.
+
+** Bug fixes
+- Fix for emphasis bug, thanks to Michael Gray
+
+** Braille table improvements
+- Correction to comments in Norwegian generic tables, thanks to Lars
+  Bjørndal
+- Corrections to dot patterns in no-no-g0.utb thanks to Lars Bjørndal
+- Corrections and additional test cases for Hungarian grade 1, thanks
+  to Hammer Attila.
+- New 6-dot table for Finnish thanks to Jukka Eerikäinen from
+  Celia. The existing tables for Finnish were 8-dot, but there is an
+  official specification only for 6-dot braille in Finnish.
+
+* Noteworthy changes in release 2.6.1 (2014-12-01)
+This release focuses on table and documentation improvements. The
+documentation has been restructured to cater to people starting with
+writing Braille tables. End users will see improvements to Braille for
+Danish, Dutch, Hungarian, Irish and UK English.
+
+** New features
+*** New Braille tables
+- New grade 1 and grade 2 Gaeilge tables implementing the 2014 UIB
+  standard. Including tests, thanks to Ronan McGuirk, Mesar Hameed.
+
+** Braille table improvements
+- Updates and correction to Hungarian braille tables, thanks to Hammer
+  Attila.
+- Correction to English UK grade 2 braille tables and new tests,
+  thanks to Paul Wood, Mesar Hameed
+- Vastly improved Danish tables thanks to Bue Vester-Andersen
+  - back-translation, both in 6 dots grade 2 and 8 dots grade 2.
+  - Better handling of dash, slash, and other punctuation within words
+    in 8 dots grade 2.
+- New table for Dutch (Netherlands) thanks to Henri Apperloo from CBB
+
+** Bug fixes
+- fix a compiler warning in the logging code. Thanks Peter Lundblad
+  for reporting it and Michael Whapples for fixing the problem.
+
+** Documentation updates
+- The documentation has been restructured to be more beginner friendly
+  and a short introduction to translation table writing has been
+  added. Thanks to Joseph Lee and Christian Egli
+
+** Other changes
+- When compiling with mingw or cygwin resulting dll is liblouis.dll.
+- runHarness.py: add new output format, compact output mode suitable
+  for grepping.
+
+** Backwards incompatible changes
+- Deleted ga.ctb now superseded by ga-g1.utb and ga.g2.ctb.
+- Nl-Nl-g1.utb has been removed. It is superseded by nl-NL-g1.ctb.
+- nl-be-g1.utb has been removed. It is superseded by nl-BE-g1.ctb.
+
+* Noteworthy changes in release 2.6.0 (2014-09-01)
+This is the first release by the new maintainer team. A lot of work by
+people from across the community contributed to this release. There
+are massive additions and updates to the Braille tables (e.g.
+Afrikaans, Hebrew, many Indian languages, Korean) and also changes to
+the C API to enable call backs for error messages and warnings.
+
+** New features
+*** New Braille tables
+- Tables for Afrikaans, Cherokee, Hawaiian, Maori, Sotho and Tswana
+  were donated by Greg Kearney. Afrikaans, Cherokee, Maori and Hawaiian
+  all are grade 1 tables and with the exception of Cherokee were
+  derived from World Braille Usage 2013. The Cherokee was taken from
+  the specification published at www.cbtbc.org/cherokee/.
+*** Logging callback
+There is now a callback system in place to get error messages and
+warnings. This can be used from programs that use liblouis to log
+warnings for example.
+
+** Bug fixes
+- fix back translation problems when word gets split in unusual places
+  causing back translation of whole words for example K5 back
+  translates to Knowledgeen, M>k back translates to Moreark, and M5
+  back translates to Moren.  This caused over 8400 extra back
+  translation errors in en-us-g2 and 5000 in en-ueb-g2. Thanks to Ken
+  Perry.
+- Fixed bug to prevent removal of \xffff between largesign rules. This
+  solves a Liblouisutdml bug where \xffff is used as a segment
+  delimiter.
+- Fixed a bug in back translation, when a letsign was encountered, the
+  letsign was being applied beyond the element it applied to.
+- Fix memory leaks in the default table resolver introduced in the
+  previous release.
+- Fixes to the build system by Simon Aittamaa
+
+** Braille table improvements
+- Major improvements to Indian tables thanks to the Indian National
+  Institute for Visually Handicapped, in particular Dipendra Manocha,
+  Mesar Hameed, Dinesh Kaushall and Sreeja Parameswaran:
+  - Corrected opcodes for letters, punctuation marks, digits, signs
+    etc.
+  - Updated braille codes according to prescribed braille codes for
+    each Unicode character by the Braille Council of India for all
+    Indian languages.
+  - defined rules for dealing with Nukhta character in Hindi table
+  - defined rule to insert dot-1 between consonant followed by full
+    vowel character in all Indian Languages
+  - defined rules for shifting of halant character before the
+    consonant. This character is placed after the consonant in normal
+    typing but need to be before the consonant in braille. This rule
+    is applicable for all Indian languages.
+  - defined rules for two conjunct characters "ksha and gya" used in
+    all Indian Languages for which there are specific codes in
+    Braille.
+- New Hebrew table that is based on the new unified Hebrew Braille
+  code standard that was put together on January 2014 after a
+  conference with all of the specialists in this field in Israel. It
+  includes improved representation of Hebrew letters, special letters
+  that are called Nikud, and punctuation symbols. The old Braille
+  standard is not relevant any more. Thanks to Adi Kushnir.
+- UEB table fixes: Fix ity contraction, fixed the missing end word
+  contraction ;n ;d sign 46. thanks to Ken Perry.
+- Fix for Norwegian where letsign is affecting some extra characters
+  thanks to Lars Bjørndal
+- Much improved hyphenation for Norwegian thanks to Lars Bjørndal
+- Korean Grade 2 now includes support for reading English text using
+  grade 2.
+- en-us-g1.ctb and en-ueb.g1.ctb are now able to display 8 dot Unicode
+  braille.
+
+* Noteworthy changes in release 2.5.4 (2014-03-03)
+This release contains nine months worth of braille table improvements
+for example for Danish, UEB, en-us, Nemeth, Bulgarian, Slovenian and
+many more. Also there are fixes to the core for table path resolving
+and back-translation.
+
+** New features
+   - Added function lou_registerTableResolver for plugging in a table
+     resolver callback from your host language.
+
+** Bug fixes
+   - Fixed ENDSEGMENT indicator in computer Braille thanks to John
+     Boyer.
+   - Emphasized words should now be contracted consistently thanks to
+     John Boyer.
+   - Fixed several problems with back-translation. A slash within a
+     number and strings such as 5-inch-diameter and 25-year-old-man
+     should now back-translate correctly. Thanks to John Boyer.
+   - Fixed a problem with syllable opcode. Thanks to John Boyer.
+   - Fix warnings with gcc 4.8.2. Thanks to Peter Lundblad.
+   - When a table is specified with an absolute or relative path, the
+     "includes" in that table will now work as expected, meaning files
+     in the same directory will be found.
+
+** Braille table improvements
+   - fr-bfu-comp8.utb: corrections, zero was wrongly displayed in some
+     instances.
+   - en-us-g2.ctb, en-ueb-g2.ctb: Fixes for that's, can't and s'
+     thanks to Ken Perry.
+   - en-us-g2.ctb: Fix for back-translation of things like
+     http://address.com, words including after, capsigns. thanks to
+     Ken Perry.
+   - Further corrections and testcases to the Hungarian tables thanks
+     to Hammer Attila
+   - Fixed letter sign in en-us and en-ueb tables. Thanks to John
+     Boyer and Ken Perry.
+   - UEB Fixes thanks to Mesar Hameed, Ken Perry and Joseph Lee:
+     - chardefs - correct title and fixed a long standing bug
+       where dots 46 was inserted between letters (especially for web
+       addresses).
+     - Fix problem with at sign.
+     - Removed section of accented letters, that were left behind from
+       US table.
+     - Added todo for accents, to define according to the formal docs.
+     - Corrected mathematical forall symbol.
+     - Modified emphasis dot combinations to follow UEB standard.
+     - Corrected the display of period when used as a midword.
+     - Ensure 'inin' is correctly back-translated in words such as
+       asinine, feminine and others.
+   - Bulgarian bg.ctb: updated to meet modern standards (added Latin
+     letters, corrected punctuation/mathematical symbols, misc typos).
+     Thanks to Rumiana Kamenska
+   - en-gb-g1.utb: Fixes thanks to Paul Wood
+   - Fix for the lich sign in the German tables. Thanks to Halim
+     Sahin.
+   - Nemeth improvements thanks to John Boyer.
+     - Spaces in nemethdefs.cti were changed to unbreakable spaces.
+       This was done so that Nemeth expressions would not be broken
+       between lines.
+     - The number sign is now inserted between the minus sign and the
+       number at the beginning of an expression. Some problems with
+       pass2 opcodes have also been corrected.
+   - The Esperanto table has additional punctuation characters and a
+     test harness. Thanks to Aaron Cannon.
+   - Added missing symbols to the US English BRF display table. Thanks
+     to Aaron Cannon.
+   - Improvements to the Slovenian table and a new Slovenian eight dot
+     computer table provided by Jožef Gregorc.
+   - Fixes to the Norwegian tables thanks to Lars Bjørndal
+     - Fixes for less than / greater than.
+     - Add entries for URLs, domains and file names.
+   - Added ne.utb, an alternative Nepali braille table. One of ne.utb
+     or ne.ctb will be removed/merged in a future version. Keeping
+     both for the time being so that users can test and give feedback
+     on which is most correct. Thanks to Him Prasad Gautam, and Mesar
+     Hameed
+   - Much improved danish grade 1 and grade 2 6 and 8 dot braille,
+     thanks to Bue Vester-Andersen and Mesar Hameed
+
+** Backwards incompatible changes
+   - Delete the table chardefs-ueb.cti as these rules are now provided
+     by en-ueb-chardefs.uti
+
+** Invisible changes
+   - Refactoring in compileTranslationTable.c: separated more clearly
+     the compilation from the table resolving, removed duplicate code,
+     etc.
+
+* Noteworthy changes in release 2.5.3 (2013-06-21)
+** New features
+*** New Braille tables
+    - Korean grade 1 and grade 2 thanks to Joseph Lee
+    - U.K. English 8 dot computer braille table thanks to David
+      Reynolds
+    - New Russian literary and computer braille tables thanks to Igor
+      B. Poretsky. These replace the older Russian tables which are
+      left for backwards compatibility.
+    - New hyphenation dictionary for Russian thanks to Igor B.
+      Poretsky.
+    - Updated hyphenation tables for the Norwegian language (nynorsk
+      and bokmål) thanks to Lars Bjørndal.
+    - New hyphenation dictionary for Esperanto thanks to Aaron Cannon.
+    - New Esperanto grade 1 table, using the x system for accented
+      letters, thanks to Aaron Cannon.
+
+*** runHarness.py: 
+    Accept filename globs on the commandline to run specific harness files.
+    In tests/harness, one can do make <filename> or make runall
+    Removed from make check because these checks are checking the validity
+    of our tables, rather than validity of the code.
+
+** Braille Table Improvements
+   - da-dk-g2.ctb, mostly rewritten to use nocross and hyphenation
+     table.
+   - Most tables: removed the default collapse whitespace statements,
+     if you need to compress whitespace, consider adding compress.ctb
+     to the list of tables when processing.
+   - Corrections to Unified English Braille Code (Grade 1 and 2),
+     thanks to Joseph Lee
+   - Corrections to apostrophes in the Computer Spanish 8 dots Braille
+     table (Es-Es-G0.utb). Thanks to Juan C. Buno.
+   - Corrections for double angle quotation marks and emphasis marks
+     in the Norwegian Grade 0 Braille Table. Thanks to Knut Arne
+     Bjørndal.
+   - Fixes for a minor problem regarding the noletsign in Norwegian
+     contracted braille. Thanks to Lars Bjørndal.
+   - Corrections to the Italian table thanks to Igor B. Poretsky.
+   - Corrections to the Hungarian grade 1 table thanks to Hammer
+     Attila
+   - Corrections to English, U.S. Grade 2 (ABAE) table. Thanks to Ken
+     Perry for reporting the bug and John J. Boyer for fixing it.
+   - Further reorganization of the tables to remove duplication. Move
+     litdigit opcode common parts and include where needed.
+   - Removed obsolete en-us-g1.utb, which has been replaced by
+     en-us-g1.ctb.
+   - Added dictionary harness tests for: en-ueb-g2.ctb, en-us-g2.ctb.
+   - Corrections to Nemeth character definitions thanks to Neil
+     Soiffer.
+   - Corrections to the Esperanto table thanks to Aaron Cannon.
+
+** Bug Fixes
+   - Cursor position calculation is now based on the same code that
+     calculates inpos and outpos. This probably solves a number of
+     bugs.
+   - Fix nocross opcode processing.
+   - Fix several buffer over/under runs in
+     lou_translateString.c:hyphenate.
+   - Fix the '=' problem, i.e. fix inputPositions calculation for the
+     case where the equals sign is used as the dots operand. Thanks to
+     Bert Frees
+   - Fix a bug when resizing a table. Previously not all references to
+     this table were updated.
+
+** Backwards incompatible changes
+   - The feature that allowed a mapping between language code and
+     Braille table was removed as it contained a out-of-bounds access
+     bug, was never documented and probably never used. Thanks to
+     Peter Nilsson Lundblad and Jeremy Roman for analyzing this
+     problem and providing a patch.
+
+* Noteworthy changes in release 2.5.2 (2012-12-18)
+
+While initially planned as mainly a bug fix release this release
+contains some notable new features: There is a new tool to trace which
+rules have been used to perform a translation. Also along with other
+new tables the long awaited table for UEB is finally here.
+
+** New features
+*** New tool to trace rule application
+    There is a new tool (lou_trace) which helps to trace which rules
+    have been used to perform a Braille translation. This is helpful
+    for writing Braille tables. See the documentation for more
+    information.
+*** New Braille tables
+    - Inuktitut grade 1, thanks to Greg Kearney.
+    - UEB grade 1 and 2, thanks to Joseph Lee. These tables replace
+      the old UEB tables (UEBC-g1.utb and UEBC-g2.ctb).
+    - Korean table thanks to Joseph Lee
+
+** Braille Table Improvements
+   - da-dk-g2.ctb, fixes for transposed â, å, æ, ä, ø  and ö,
+     corrected/improved harness tests.
+   - Corrections for en-GB-g2.ctb thanks to Paul Wood
+   - Corrections to the Hungarian grade 1 table thanks to Hammer
+     Attila
+
+** Bug Fixes
+   - Update gnulib
+   - Fix a bug in the correct opcode which causes sometimes random
+     results when translating. Thanks to Bert Frees.
+   - Fixes for compiler warnings.
+   - Fix some Valgrind warnings about invalid reads
+ 
+* Noteworthy changes in release 2.5.1 (2012-9-24)
+
+** Braille Table Improvements
+- Fix encoding problem in italian table and added more character
+  definitions. Thanks to Simone Dal Maso <simone.dalmaso@juvox.it>.
+- Rename it-it-g1.utb to it-it-comp6.utb and it-it-g1.utb2 to
+  it-it-comp8.utb.
+
+** Bug fixes
+- Fix outputPos and inlen where an input character generates multiple
+  output characters.
+
+* Noteworthy changes in release 2.5.0 (2012-9-10)
+
+This release contains a tremendous amount of work many developers.
+Many long standing bugs have been fixed. The tables can finally be in
+UTF-8. A grand table cleanup removed duplication from the tables.
+There are now two extensive test frameworks for table writers. A
+number of new tables have been contributed on top of the usual
+assortment of table improvements. Thanks to all of this liblouis has
+already seen quite a bit of uptake in a number of places, notably the
+new DAISY pipeline will ship with this release of liblouis.
+
+NOTE: If you have private tables you might want to migrate them to
+utf-8. To do this just use iconv as follows:
+
+  $ iconv -f latin-1 -t utf-8 <input >output
+
+** New features
+*** New Braille tables
+    - Estonian grade 0, thanks to Jürgen Dengo.
+    - Portuguese 8 dot Computer braille, Thanks to Rui Fontes
+*** UTF-8 support in tables
+    Braille tables can now contain UTF-8 in the opcode arguments.
+*** Improvements to the python bindings
+    All constants defined in liblouis.h are now exposed in the bindings.
+*** Add a doctest infrastructure
+    These tests are based on the Python doctest framework and are only
+    run if there is a Python interpreter on the system
+*** Add a test harness
+    This test infrastructure allows the user to do table tests in a
+    simple and concise syntax. These tests are based on the Python
+    nose testing framework and are only run if either Python 2.x or
+    3.x with the related nose python module is installed on the
+    system. See the documentation for more information. Thanks to
+    Mesar Hameed.
+*** Add a test harness generator
+    A harness generator that uses simple text files with a little
+    formatting to help to generate the json harness files. The purpose
+    of this tool is to make it much easier and faster to add checks
+    for a given table. You are expected to read the generated harness
+    file and make necessary changes, the tool only helps you to get
+    the tests into the harness format, not check their validity.
+*** Support for Python 3 in the Python bindings
+    The Python bindings now work for both Python 2 and Python 3.
+    Thanks to Michael Whapples.
+
+** Improved C-based test framework
+   - Improved the test framework to be able to test translations
+     involving Unicode.
+   - Added numerous tests, e.g. for lowercase and Unicode, for the
+     input position, for repeated, etc.
+
+** Improved the documentation
+   - Document the test harness (json format, fields, flags).
+   - Document the use of Valgrind to find memory leaks
+   - Improve the documentation on the display opcode
+
+** Bug fixes
+   - lou_allround and lou_translate now properly handle Unicode
+     characters
+   - Fix some issues reported by Valgrind
+   - Fix inputPos for situation where context and multipass opcodes
+     are involved
+   - Fixed a number of bugs with the letter, uppercase and lowercase
+     opcodes when dealing with Unicode
+   - Fixed a couple of bugs with hyphenation (documentation, Python
+     bindings and a number of buffer overruns in the C library).
+     Thanks Milan Zamazal <pdm@brailcom.org> for reporting this.
+   - Fix a bug in the $a. matcher in the multipass rules where only 32
+     chars were matched. It now matches 0xffff chars.
+   - Fix a bug reported by James Teh related to pass1Only
+
+** Braille Table Improvements
+   - all table files have consistent encoding, UTF-8.
+   - The grand table cleanup: Reorganize the tables to remove
+     duplication. Move common parts such as Latin letter, eight and
+     six dot digit definitions to separate files which are then
+     included. This should ease table maintenance. Thanks to Mesar Hameed. 
+   - Fixes to de-de-comp8.ctb thanks to Aliminator83@gmail.com
+   - hu1.ctb renamed to hu-hu-g1.ctb
+   - hu.ctb renamed to hu-hu-comp8.ctb
+   - eo.ctb renamed to eo-g1.ctb
+   - Fixes to eo-g1.ctb thanks to Aaron Cannon <cannona@fireantproductions.com>
+   - hu-hu-g1.ctb: improvements and extensive test harness, with
+     working back-translation, Thanks to Hammer Attila
+   - Fixes to fr-bfu-comp6.utb and fr-bfu-comp8.utb thanks to Michel
+     Such <michel.such@free.fr>
+   - Reworked and extended Ethiopic braille table ethio-g1.ctb,
+     superseeds gez*, thanks to Dr. Tamru E. Belay
+     <g.braille@sympatico.ca>
+   - Fixes to no-no-g3.ctb thanks to Lars Bjørndal <lars@lamasti.net>
+
+* Noteworthy changes in release 2.4.1 (2012-2-22)
+
+** New features
+   - Czech hyphenation table thanks to Jan Hegr
+   - Spanish grade 1 table provided by José Enrique Fernández del
+     Campo and Juan Carlos Buño Suárez
+   - New Tamil table thanks to Mesar Hameed
+
+** Braille Table Improvements
+   - Improvements to the Portuguese grade1 braille tables
+   - Updates and additions to Icelandic 8-dot braille table.
+   - Improvements to the uncontracted Spanish computer braille table.
+   - Improvements to the Norwegian braille table thanks to David Hole.
+
+* Noteworthy changes in release 2.4.0 (2012-01-31)
+
+** New features
+   - New Generic Farsi Grade 1 table: A new table for Generic Farsi
+     Grade 1 braille has been provided by Mesar Hameed.
+   - Emacs mode for editing Braille tables thanks to Christian Egli
+
+** Braille Table Improvements
+   - Improvements to the French comp6 and comp8 braille tables
+   - Improvements to the Romanian braille table
+   - Improvements to the Generic Arabic Grade 1 table
+   - Improvements to the Czech tables thanks to Jan Halousek and to
+     Jan Hegr
+
+* Noteworthy changes in release 2.3.0 (2011-05-09)
+
+This release contains support for many more languages than before
+(Swedish, Kurdish, Ethiopic, Serbian, many Indian languages). The
+search path for tables is now a list of paths. Finally there is the
+usual assortment of bug fixes.
+
+** New features
+*** Multiple table search path
+    The environment variable LOUIS_TABLEPATH can now contain a list of
+    paths (separated by commas) where liblouis should look for tables.
+    This allows the user to keep local tables.
+*** New --quiet option for lou_checktable
+    lou_checktable writes to stderr even in the case of success. This
+    can now be suppressed with the new option --quiet.
+*** New Swedish table
+    A new table for Swedish braille has been provided by Samuel
+    Thibault.
+*** New table for Sorani (Kurdish)
+    A new table for Sorani (Kurdish) Braille has been donated by Peter
+    Engström from Index Braille
+*** New table for Ethiopic
+    A new table for Ethiopic Braille has been donated by Tamru E.
+    Belay PH.D from Adaptive Technology Center for the Blind (ATCB)
+*** New table for Serbian
+    A new table for Serbian Braille has been donated by Peter Engström
+    from Index Braille
+
+** Improved the documentation
+   The deprecated opcodes have been moved to a separate section
+
+** Bug fixes
+   - Fixed a long standing bug with an infinite loop in the table
+     compiler
+
+** Braille Table Improvements
+   - Improvements to the Chinese braille table
+   - Improvements to the Flemish Braille Math Code tables
+   - Improvements to the Dutch	Braille tables
+   - Improvements to the Spanish Braille tables.
+   - Fixes for the uncontracted French 6 and 8 dot tables
+   - Improved support for Italian 8 dot
+   - Improvements to the Generic Arabic Grade 1 table
+
+* Noteworthy changes in release 2.2.0 (????-??-??)
+
+** New features
+*** New tables
+    - Support for many indian languages
+    - Support for Icelandic 6- and 8-dot
+    - Support for Catalan
+    - Support for Dutch Braille (for Belgium and the Netherlands)
+    - Support for Flemish Braille Math Code (a.k.a. Woluwe code)
+
+
+*** New functions to make libraries relocatable
+    Two new functions, to set the search path for tables and files.
+    They make the library relocatable. See the in the documentation
+    for lou_setDataPath and lou_getDataPath.
+
+** Bug fixes
+    - Improved support for Spanish
+    - Improved Norwegian tables
+
+* Noteworthy changes in release 2.1.1 (2010-8-23)
+
+** Bug fixes
+   - Fixed problems with the Danish grade 2 table
+   - Fixed problems with the Marburg maths table for mathematics and
+     the UK maths table for mathematics
+
+* Noteworthy changes in release 2.1.0 (2010-8-19)
+
+** New features
+*** New tables
+    - Added tables for Portuguese grade 1 and 2
+    - Added unicode.dis for Unicode braille
+*** Modified tables
+    - Updated Danish tables
+*** Implemented language to table mapping
+*** New format of error messages
+    The error messages are now reported in a format similar to the one
+    used in gcc. 
+*** New opcode
+    - added undefined opcode
+*** Python bindings
+    - Allow the user to configure the maximum output length by
+      specifying a number by which the input length is multiplied
+      using the outlenMultiplier module variable. The default will
+      handle the case where every input character is undefined in the
+      translation table. Previously, this was hard-coded to 2, which
+      was insufficient in some cases.
+    - Add compbrlLeftCursor mode constant.
+    - Add compileString function which wraps lou_compileString.
+    - Corrections/clarifications to docstrings.
+    - Add python binding for the lou_hyphenate function.
+    - Added python wrapper for lou_backTranslateString and lou_backTranslate.
+
+*** liblouisxslt as an example
+    Add liblouisxslt as an example to python/examples. This is
+    basically an extension of libxslt that lets you invoke liblouis
+    from an xslt stylesheet to do Braille translation on text nodes
+    for example. 
+*** compbrlLeftCursor
+    Added a patch provided by Volker Bijewitz to implement
+    compbrlLeftCursor.
+
+** Bug fixes
+*** output cursorPos
+    Fix the output cursorPos when the compbrlAtCursor mode is enabled
+    and the characters around the cursor translate to multiple braille
+    cells, such as in the Chinese braille tables.
+*** outpos when doing back translation
+    Include a patch by Timothy Lee to fix outpos when doing back translation
+      (issue 11)
+*** inputPos/outputPos for undefined characters
+    Fix the input/output position arrays for characters in the input
+      which are undefined in the translation table.
+*** table fixes
+    - Fixed a bug with back translation of '*n'. (issue 13)
+    - Fixes to the en-us-g2.ctb table
+*** Python bindings
+    - Remove unnecessary imports, allowing the bindings to run in Python
+      2.7. (issue 12)
+    - lou_translate* writes output information in typeform, so
+      allocate enough bytes for it. Fixes possible buffer overruns and
+      resultant crashes.
+*** Miscellaneous
+    - Fixes to the man page generation to fix issues that were
+      reported by the Debian packaging builder
+    - Do not invoke help2man when cross-compiling 
+    - Documentation updates (issue 10)
+    - Removing noletsign defaults
+    - Many small fixes
+
+* Noteworthy changes in release 2.0.0 (2010-7-6)
+
+** New features
+*** New functions
+    - Adding lou_charSize function
+
+* Noteworthy changes in release 1.9.0 (2010-6-29)
+
+** New features
+*** New functions
+    - lou_dotsToChar and lou_charToDots function
+    - Added lou_compileString for adding entries to tables at
+      run-time.
+
+* Noteworthy changes in release 1.8.0 (2009-11-23)
+
+This release contains a number of improvements notably the integration
+of gnulib, the automatic generation of man pages and the addition of
+tables for German grade 2.
+
+** New features
+*** New tables
+    - Tables German Grade 2
+    - Swiss German
+    - Swedish (1989 standard)
+    - Swedish (1996 standard)
+
+*** Modified tables
+    - Updated Norwegian tables
+    - Updated Chinese braille table
+
+*** man pages
+    All tools accept the --version and --help options and are
+    documented in man pages
+
+*** Corpus based test cases for tables
+    You can now have corpus based tests for tables. See the README in
+    tests/table_test_corpuses.
+
+** Bug fixes
+   - config.h is no longer exported
+   - Many small fixes
+
+* Noteworthy changes in release 1.7.0 (2009-08-21)
+
+The main new feature of this release is the support for UK and Marburg
+math. Other changes include a new tool to check hyphenation and the
+usual improvement and addition of tables. Also The test suite has been
+enhanced and finally passes.
+
+** New features
+*** New tables
+    - Tables for UK and Marburg math
+    - Hong Kong Cantonese
+    - Hebrew
+    - Hungarian
+    - Slovene
+    - Tibetan
+    - Irish
+    - Maltese
+
+*** Modified tables
+    - Updated Norwegian tables
+    - Bug fixes in Russian tables
+    - Updated French tables
+
+*** lou_checkhyphens tool
+    New tool to check hyphenation
+*** rpm spec file
+*** Test cases for tables
+    The tables can now be tested with `make check'
+*** New opcodes
+    - noback and nofor opcode prefixes
+    - grouping opcode
+    - multipass subopcodes
+
+** Bug fixes
+   - Fix for library name and Python bindings
+   - Documentation fixes
+   - Many small fixes
+
+* Noteworthy changes in release 1.6.2 (2009-05-01)
+
+This release contains a new opcode for Malaysian Braille. See the
+documentation for a description of the new opcode.
+
+** New features
+
+*** repword opcode 
+The repword opcode is needed for Malaysian Braille
+
+* Noteworthy changes in release 1.6.1 (2009-04-21)
+
+This is mostly a bug fix release. It contains many bug fixes that were
+discovered in the course of developing UK Math tables.
+
+** Bug fixes
+
+*** bug fixes for correct, context and multipass opcodes
+*** bug fixes for largesign opcode
+*** fixed bug with French back-translation
+*** fixed the installation path for docs
+*** documentation improvement
+
+* Noteworthy changes in release 1.6 (2009-03-04)
+
+This release features support for Danish and Russian and updated
+tables for French and Norwegian. The search path for tables can now be
+specified using an environment variable. Finally there is the usual
+assortment of bug fixes.
+
+** New features
+
+*** exactdots opcode
+The exactdots opcode is intended for use in liblouisxml
+semantic-action files to specify exact dot patterns, as in
+mathematical codes.
+*** LOUIS_TABLEPATH env variable
+You can now specify where liblouis is to look for tables with the
+LOUIS_TABLEPATH environment variable.
+*** New Tables for Danish and Russian
+There is now support for Danish and Russian.
+
+** Bug fixes
+
+*** Updated French and Norwegian tables
+*** Use stdcall calling convention if building for Windows
+
+** Changes in behavior
+
+None
+
+* Noteworthy changes in release 1.5 (2009-01-21)
+
+This is a big release for liblouis. It's the first time that it is
+done from the Google code page. A number of people have contributed,
+namely John Boyer (table debugger, bug fixes), Eitan Isaacson (Python
+bindings), James Teh (Python bindings, bug fixes), Christian Egli
+(documentation) and Michel Such (table for French grade 2).
+
+
+** New features
+
+*** Python bindings
+The liblouis library can now be used from Python. For more info
+consult the README file in the python directory.
+
+*** Table debugger
+liblouis now comes with a debugger that can help to find problems with
+translation tables.
+
+*** French table for grade 2
+There is now a translation table for French grade 2.
+
+*** pass1Only mode bit
+The new pass1Only mode bit will help developers of screen readers as
+the cursor will stay where it is expected to.
+
+** Bug fixes
+
+Fix the inpos array values for the case where a rule has an output
+length which is larger than its input length.
+
+fixed multi-word phrases
+
+fixed bug in character display
+
+fixed bug in findOpcodeName
+
+lou_version now returns the correct liblouis version
+
+** Changes in behavior
+
+None
+
+#+OPTIONS: toc:nil num:nil
diff --git a/liblouis/README b/liblouis/README
new file mode 100644
index 0000000..02999e7
--- /dev/null
+++ b/liblouis/README
@@ -0,0 +1,109 @@
+# Introduction
+
+[![Build Status](https://travis-ci.org/liblouis/liblouis.svg?branch=master)](https://travis-ci.org/liblouis/liblouis)
+
+Liblouis is an open-source braille translator and back-translator
+named in honor of [Louis Braille][]. It features support for computer
+and literary braille, supports contracted and uncontracted translation
+for [many languages][] and has support for hyphenation. New languages
+can easily be added through tables that support a rule- or dictionary
+based approach. Tools for testing and debugging tables are also
+included. Liblouis also supports math braille (Nemeth and Marburg).
+
+Liblouis has features to support screen-reading programs. This has led
+to its use in two open-source screenreaders, [NVDA][] and [Orca][]. It
+is also used in some commercial assistive technology applications for
+example by [ViewPlus][].
+
+Liblouis is based on the translation routines in the [BRLTTY][]
+screenreader for Linux. It has, however, gone far beyond these
+routines. In Linux and Mac OSX it is a shared library, and in Windows
+it is a DLL.
+
+Liblouis is free software licensed under the [GNU LGPLv2.1+][] (see
+the file COPYING.LESSER).
+
+The command line tools, are licensed under the [GNU GPLv3+][] (see the
+file COPYING).
+
+# Documentation
+
+For documentation, see the [liblouis documentation][] (either as info
+file, html, txt or pdf) in the doc directory. For examples
+of translation tables, see `en-us-g2.ctb`, `en-us-g1.ctb`,
+`chardefs.cti`, and whatever other files they may include in the
+tables directory. This directory contains tables for many languages.
+The Nemeth files will only work with the sister library
+[liblouisutdml][].
+
+# Installation
+
+After unpacking the distribution tarball go to the directory it creates. 
+You now have the choice to compile liblouis for either 16- or 32-bit
+unicode. By default it is compiled for the former. To get 32-bit Unicode
+run configure with `--enable-ucs4`.
+
+After running `./configure` run `make` and then `make install`. You
+must have root privileges for the installation step.
+
+This will produce the liblouis library and the programs `lou_allround`
+(for testing the library), `lou_checkhyphens`, `lou_checktable` (for
+checking translation tables), `lou_debug` (for debugging translation
+tables), `lou_translate` (for extensive testing of forward and
+backwards translation) and `lou_trace` (for tracing if individual
+translations). For more details see the liblouis documentation.
+
+If you wish to have man pages for the programs you might want to
+install `help2man` before running configure.
+
+If you want to run the test suite with `make check` you should install
+`libyaml` as that will enable extensive tests on the tables. If you
+want to skip those tests you can do so by running `configure --without-yaml`.
+
+# Participating
+
+You can contribute to Liblouis in several different ways:
+
+  - If you have comments, questions, or want to use your knowledge to
+    help others, come join the conversation on either the mailing list
+    or on IRC. You can reach us at liblouis-liblouisxml@freelists.org
+    or in channel #liblouis on irc:irc.oftc.net.
+
+  - To report a problem or request a feature, please file an issue.
+
+  - Of course, we welcome pull requests and patches.
+
+Finally, if you want to see what we have for the future and learn more
+about our release cycles, all this information is detailed on the
+[wiki](https://github.com/liblouis/liblouis/wiki/Release-schedule)
+
+# Release Notes
+
+For notes on the newest and older releases see the file NEWS.
+
+# History
+
+Liblouis was begun in 2002 largely as a business decision by
+[ViewPlus][]. They believed that they could never have good braille
+except as part of an open source effort and knew that John Boyer was
+dying to start just such a project. So ViewPlus did start it on the
+agreement that they would give a small monthly stipend to John Boyer
+that allowed him to pay for sighted assistants. While ViewPlus has not
+contributed much to the coding, it certainly has contributed and
+continues to contribute to liblouis through that support of John
+Boyer.
+
+[Louis Braille]: http://en.wikipedia.org/wiki/Louis_Braille
+[many languages]: https://github.com/liblouis/liblouis/tree/master/tables
+[NVDA]: http://www.nvda-project.org/
+[Orca]: http://live.gnome.org/Orca
+[ViewPlus]: http://www.viewplus.com
+[BRLTTY]: http://mielke.cc/brltty/
+[GNU LGPLv2.1+]: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
+[GNU GPLv3+]: https://www.gnu.org/licenses/gpl.html
+[liblouisutdml]: http://www.liblouis.org/
+[liblouis documentation]: http://www.liblouis.org/documentation/liblouis.html
+
+<!-- Local Variables: -->
+<!-- mode: markdown -->
+<!-- End: -->
diff --git a/liblouis/README.md b/liblouis/README.md
new file mode 100644
index 0000000..02999e7
--- /dev/null
+++ b/liblouis/README.md
@@ -0,0 +1,109 @@
+# Introduction
+
+[![Build Status](https://travis-ci.org/liblouis/liblouis.svg?branch=master)](https://travis-ci.org/liblouis/liblouis)
+
+Liblouis is an open-source braille translator and back-translator
+named in honor of [Louis Braille][]. It features support for computer
+and literary braille, supports contracted and uncontracted translation
+for [many languages][] and has support for hyphenation. New languages
+can easily be added through tables that support a rule- or dictionary
+based approach. Tools for testing and debugging tables are also
+included. Liblouis also supports math braille (Nemeth and Marburg).
+
+Liblouis has features to support screen-reading programs. This has led
+to its use in two open-source screenreaders, [NVDA][] and [Orca][]. It
+is also used in some commercial assistive technology applications for
+example by [ViewPlus][].
+
+Liblouis is based on the translation routines in the [BRLTTY][]
+screenreader for Linux. It has, however, gone far beyond these
+routines. In Linux and Mac OSX it is a shared library, and in Windows
+it is a DLL.
+
+Liblouis is free software licensed under the [GNU LGPLv2.1+][] (see
+the file COPYING.LESSER).
+
+The command line tools, are licensed under the [GNU GPLv3+][] (see the
+file COPYING).
+
+# Documentation
+
+For documentation, see the [liblouis documentation][] (either as info
+file, html, txt or pdf) in the doc directory. For examples
+of translation tables, see `en-us-g2.ctb`, `en-us-g1.ctb`,
+`chardefs.cti`, and whatever other files they may include in the
+tables directory. This directory contains tables for many languages.
+The Nemeth files will only work with the sister library
+[liblouisutdml][].
+
+# Installation
+
+After unpacking the distribution tarball go to the directory it creates. 
+You now have the choice to compile liblouis for either 16- or 32-bit
+unicode. By default it is compiled for the former. To get 32-bit Unicode
+run configure with `--enable-ucs4`.
+
+After running `./configure` run `make` and then `make install`. You
+must have root privileges for the installation step.
+
+This will produce the liblouis library and the programs `lou_allround`
+(for testing the library), `lou_checkhyphens`, `lou_checktable` (for
+checking translation tables), `lou_debug` (for debugging translation
+tables), `lou_translate` (for extensive testing of forward and
+backwards translation) and `lou_trace` (for tracing if individual
+translations). For more details see the liblouis documentation.
+
+If you wish to have man pages for the programs you might want to
+install `help2man` before running configure.
+
+If you want to run the test suite with `make check` you should install
+`libyaml` as that will enable extensive tests on the tables. If you
+want to skip those tests you can do so by running `configure --without-yaml`.
+
+# Participating
+
+You can contribute to Liblouis in several different ways:
+
+  - If you have comments, questions, or want to use your knowledge to
+    help others, come join the conversation on either the mailing list
+    or on IRC. You can reach us at liblouis-liblouisxml@freelists.org
+    or in channel #liblouis on irc:irc.oftc.net.
+
+  - To report a problem or request a feature, please file an issue.
+
+  - Of course, we welcome pull requests and patches.
+
+Finally, if you want to see what we have for the future and learn more
+about our release cycles, all this information is detailed on the
+[wiki](https://github.com/liblouis/liblouis/wiki/Release-schedule)
+
+# Release Notes
+
+For notes on the newest and older releases see the file NEWS.
+
+# History
+
+Liblouis was begun in 2002 largely as a business decision by
+[ViewPlus][]. They believed that they could never have good braille
+except as part of an open source effort and knew that John Boyer was
+dying to start just such a project. So ViewPlus did start it on the
+agreement that they would give a small monthly stipend to John Boyer
+that allowed him to pay for sighted assistants. While ViewPlus has not
+contributed much to the coding, it certainly has contributed and
+continues to contribute to liblouis through that support of John
+Boyer.
+
+[Louis Braille]: http://en.wikipedia.org/wiki/Louis_Braille
+[many languages]: https://github.com/liblouis/liblouis/tree/master/tables
+[NVDA]: http://www.nvda-project.org/
+[Orca]: http://live.gnome.org/Orca
+[ViewPlus]: http://www.viewplus.com
+[BRLTTY]: http://mielke.cc/brltty/
+[GNU LGPLv2.1+]: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
+[GNU GPLv3+]: https://www.gnu.org/licenses/gpl.html
+[liblouisutdml]: http://www.liblouis.org/
+[liblouis documentation]: http://www.liblouis.org/documentation/liblouis.html
+
+<!-- Local Variables: -->
+<!-- mode: markdown -->
+<!-- End: -->
diff --git a/liblouis/README.windows b/liblouis/README.windows
new file mode 100644
index 0000000..0c05c7a
--- /dev/null
+++ b/liblouis/README.windows
@@ -0,0 +1,24 @@
+This file describes how to build liblouis.dll That is the only binary 
+file needed by someone who wishes to use liblouis in an application. The 
+tables are in the tables subdirectory of the liblouis distribution. For 
+an overview of liblouis see README. 
+
+First, obtain the liblouis source, either by downloading the latest 
+tarball or from the Git repository. See HACKING for instructions. 
+If you downloaded the tarball, unpack it.
+
+To build liblouis.dll you will need the Microsoft command-line C/C++ 
+tools. You will also have to set environment variables correctly. You 
+can download the Community version of Microsoft Visual Studio, including 
+Visual C++, and the Microsoft Windows SDK for free. It has a batch file 
+that sets environment variables and then displays a command prompt.
+
+Next, go to the subdirectory windows. Edit the file configure.mk. If you 
+want 32-bit Unicode change the 2 in the line UCS=2 to a 4.
+
+Now type
+
+nmake /f Makefile.nmake
+
+The directory will contain liblouis.dll and liblouis.lib, along with 
+object files.
diff --git a/liblouis/TODO b/liblouis/TODO
new file mode 100644
index 0000000..9b766af
--- /dev/null
+++ b/liblouis/TODO
@@ -0,0 +1,71 @@
+This file describes the TODO items for the liblouis project.  	-*- org -*-
+
+When a task is done and accepted, consider moving it into the NEWS
+file, with a bit of extra info.
+
+* 2.6
+** Document the changes to LOUIS_TABLEPATH
+** Extend and document the scripting language
+http://www.freelists.org/post/liblouis-liblouisxml/Very-preliminary-documentation-of-scripting-language
+
+* near term
+** (google issue 9) bindings should provide variable to pick up table location at runtime.
+
+** Fix the problem that LOUIS_TABLEPATH always looks in the standard PATH
+even if that was not in the environment var
+
+** fix bug described by squash_space.c
+
+** Esperanto table should not be blacklisted, work out whats wrong and make sure it is usable.
+
+* unallocated
+** (google issue 16) infinite loop in lou_backtranslate.
+
+** (google issue 6) italword opcode not documented
+
+** (google issue 4) problem with contraction cursor position and compBrlAtCursor.
+
+** Add java bindings
+It would be nice to have some canonical java bindings. There are
+several potential candidates:
+- Bindings by Michael Whapples
+- Minimal jna bindings by SBS
+- port jni bindings from utdml
+- new jna bindings by Bert Frees
+
+** Enhance the API to handle pre-hyphenated text
+This basically just means to port the code which is in the java
+bindings to C so that it can be used from other bindings
+
+** Add readline support to all the tools
+
+** Use portable malloc from gnulib 
+to get rid of the windows #ifdefs
+
+** Enhance translation table compiler to issue warnings
+[jb]: It should be an error to define the same single-cell dot pattern
+for two different characters. I am considering issuing an error
+message and rejecting the table if this happens.
+
+[mh]: It would also be very helpful if we could issue a warning when a
+character has been defined as two or more braille representations.
+Could we have these as warnings, not errors please.
+
+** followup to above enhancement, either at the terminal or when called by 
+bindings, we should be able to give more useful feedback, i.e. could
+not translate because table not found, or table found but has errors,
+or characters undefined, etc. also see:
+http://www.nvda-project.org/ticket/2448
+
+** Optimize for use with large tables
+When used with dictionary based tables liblouis is very slow. The
+issue is probably that the hash key is not very well suited for this
+use case and there will be tons of collisions, making the lookup
+essentially linear.
+
+There was a discussion about this on the mailing list
+(http://www.freelists.org/post/liblouis-liblouisxml/Improved-hash-function-for-tables).
+
+** apply the the patch by Igor B. Poretsky
+
+** apply the jptest_patch
diff --git a/liblouis/autogen.sh b/liblouis/autogen.sh
new file mode 100755
index 0000000..e0eadec
--- /dev/null
+++ b/liblouis/autogen.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+# Copyright 2008 Eitan Isaacson
+# Copyright 2008 Christian Egli
+# Copyright 2012 Michael Whapples
+#
+# This file is part of liblouis.
+# 
+# liblouis is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation, either version 2.1 of the
+# License, or (at your option) any later version.
+# 
+# liblouis is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with liblouis. If not, see
+# <http://www.gnu.org/licenses/>.
+#
+# autogen.sh glue for liblouis
+#
+# Requires: automake 1.9, autoconf 2.57+
+# Conflicts: autoconf 2.13
+set -e
+
+# Refresh GNU autotools toolchain.
+echo Cleaning autotools files...
+find -type d -name autom4te.cache -print0 | xargs -0 rm -rf \;
+find -type f \( -name missing -o -name install-sh -o -name mkinstalldirs \
+	-o -name depcomp -o -name ltmain.sh -o -name configure \
+	-o -name config.sub -o -name config.guess -o -name config.h.in \
+        -o -name mdate-sh -o -name texinfo.tex \
+	-o -name Makefile.in -o -name aclocal.m4 \) -print0 | xargs -0 rm -f
+
+echo Running autoreconf...
+autoreconf --force --install
+
+exit 0
diff --git a/liblouis/build-aux/link-warning.h b/liblouis/build-aux/link-warning.h
new file mode 100644
index 0000000..fda0194
--- /dev/null
+++ b/liblouis/build-aux/link-warning.h
@@ -0,0 +1,28 @@
+/* GL_LINK_WARNING("literal string") arranges to emit the literal string as
+   a linker warning on most glibc systems.
+   We use a linker warning rather than a preprocessor warning, because
+   #warning cannot be used inside macros.  */
+#ifndef GL_LINK_WARNING
+  /* This works on platforms with GNU ld and ELF object format.
+     Testing __GLIBC__ is sufficient for asserting that GNU ld is in use.
+     Testing __ELF__ guarantees the ELF object format.
+     Testing __GNUC__ is necessary for the compound expression syntax.  */
+# if defined __GLIBC__ && defined __ELF__ && defined __GNUC__
+#  define GL_LINK_WARNING(message) \
+     GL_LINK_WARNING1 (__FILE__, __LINE__, message)
+#  define GL_LINK_WARNING1(file, line, message) \
+     GL_LINK_WARNING2 (file, line, message)  /* macroexpand file and line */
+#  define GL_LINK_WARNING2(file, line, message) \
+     GL_LINK_WARNING3 (file ":" #line ": warning: " message)
+#  define GL_LINK_WARNING3(message) \
+     ({ static const char warning[sizeof (message)]		\
+          __attribute__ ((__unused__,				\
+                          __section__ (".gnu.warning"),		\
+                          __aligned__ (1)))			\
+          = message "\n";					\
+        (void)0;						\
+     })
+# else
+#  define GL_LINK_WARNING(message) ((void) 0)
+# endif
+#endif
diff --git a/liblouis/build_liblouis.sh b/liblouis/build_liblouis.sh
new file mode 100644
index 0000000..b50ad81
--- /dev/null
+++ b/liblouis/build_liblouis.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+# sh build_liblouis.sh <ndk-build path>
+BASEDIR=$(dirname "$0")
+sh $1 NDK_PROJECT_PATH=$BASEDIR APP_BUILD_SCRIPT=$BASEDIR/Android.mk
\ No newline at end of file
diff --git a/liblouis/configure.ac b/liblouis/configure.ac
new file mode 100644
index 0000000..21e1b61
--- /dev/null
+++ b/liblouis/configure.ac
@@ -0,0 +1,206 @@
+# Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.68)
+AC_INIT([Liblouis], [3.4.0], [liblouis-liblouisxml@freelists.org], [liblouis], [http://www.liblouis.org])
+AC_CONFIG_SRCDIR([liblouis/lou_backTranslateString.c])
+AM_CONFIG_HEADER(liblouis/config.h)
+
+AC_CONFIG_AUX_DIR([build-aux])
+AC_CONFIG_MACRO_DIR([m4])
+AM_INIT_AUTOMAKE
+
+# Checks for programs.
+# Try to compile using C99
+AC_PROG_CC_C99
+
+# gnulib for the library
+gl_EARLY
+# gnulib for the tools
+gl_tools_EARLY
+
+gl_INIT
+gl_tools_INIT
+
+# Checks for more programs.
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_MAKE_SET
+
+# Checks for libraries.
+AC_CHECK_LIB([yaml], [yaml_parser_initialize])
+
+# Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS([stddef.h stdlib.h string.h])
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+
+# Checks for library functions.
+AC_FUNC_MEMCMP
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS([memset])
+
+# This is for stuff that absolutely must end up in pyconfig.h.
+# Please use pyport.h instead, if possible.
+AH_TOP([
+#ifndef LOUISCFG_H
+#define LOUISCFG_H
+])
+AH_BOTTOM([
+#endif /*LOUISCFG_H*/
+])
+
+# increment if the interface has additions, changes, removals.
+LIBLOUIS_CURRENT=15
+
+# increment any time the source changes; set to 0 if you increment
+# CURRENT
+LIBLOUIS_REVISION=1
+
+# increment if any interfaces have been added; set to 0 if any
+# interfaces have been changed or removed. removal has precedence over
+# adding, so set to 0 if both happened.
+LIBLOUIS_AGE=1
+
+AC_SUBST(LIBLOUIS_CURRENT)
+AC_SUBST(LIBLOUIS_REVISION)
+AC_SUBST(LIBLOUIS_AGE)
+
+# needed to build the liblouis.def
+DLL_VERSION=`expr ${LIBLOUIS_CURRENT} - ${LIBLOUIS_AGE}`
+AC_SUBST(DLL_VERSION)
+
+AC_ISC_POSIX
+AC_HEADER_STDC
+AC_LIBTOOL_WIN32_DLL
+AC_PROG_LIBTOOL
+
+# define an additional recursive make target to format the sources.
+# Also check if clang-format is installed
+AM_EXTRA_RECURSIVE_TARGETS([format-sources])
+AC_CHECK_PROG([SOURCE_FORMATTER], [clang-format], [clang-format])
+AM_CONDITIONAL([HAVE_SOURCE_FORMATTER], [test x$SOURCE_FORMATTER = xclang-format])
+
+# GNU help2man creates man pages from --help output; in many cases,
+# this is sufficient, and obviates the need to maintain man pages
+# separately. However, some developers do not have it so we do not
+# make its use mandatory.
+if test "x$cross_compiling" = xyes; then
+  AC_MSG_WARN([cannot generate manual pages while cross compiling])
+else
+  AC_CHECK_PROG([HELP2MAN], [help2man], [help2man])
+fi
+AM_CONDITIONAL([HAVE_HELP2MAN], [test x$HELP2MAN = xhelp2man])
+
+# Only run parts of the tests if we are cross compiling
+AM_CONDITIONAL([CROSS_COMPILING], [test "x$cross_compiling" = xyes])
+
+# Check for makeinfo version >= 5, required for building documentation.
+have_makeinfo_5=false
+AC_PROG_SED
+AC_CHECK_PROG([MAKEINFO_FOUND], [makeinfo], [yes])
+if test x"${MAKEINFO_FOUND}" = xyes
+then
+  MAKEINFO_VERSION_REQ=5
+  AC_MSG_CHECKING([for makeinfo version >= $MAKEINFO_VERSION_REQ])
+  MAKEINFO_VERSION=`makeinfo --version | sed -ne 's/^\(makeinfo\|texi2any\) .* \([[0-9]][[0-9]]*\)\.[[0-9]][[0-9]]*$/\2/p'`
+  if test x$MAKEINFO_VERSION = x -o 0$MAKEINFO_VERSION -lt $MAKEINFO_VERSION_REQ
+  then
+    AC_MSG_RESULT([no])
+    AC_MSG_WARN([Program 'makeinfo' version >= $MAKEINFO_VERSION_REQ is required. Documentation will not be built.])
+  else
+    AC_MSG_RESULT([yes])
+    have_makeinfo_5=true
+  fi
+else
+  AC_MSG_WARN([Missing program 'makeinfo', Documentation will not be built. Please install you you want documentation or refer to online resources.])
+fi
+AM_CONDITIONAL([HAVE_MAKEINFO_5], [test x$have_makeinfo_5 = xtrue])
+
+# Check if the user wants to enable yaml tests
+AC_ARG_WITH([yaml],
+  [AS_HELP_STRING([--with-yaml], [enable YAML-based tests @<:@default=yes@:>@])],
+  [with_yaml=$withval],
+  [])
+
+if test "x$with_yaml" == xno; then
+  AC_DEFINE([WITHOUT_YAML],[1],[Disable YAML tests])
+fi
+
+# if libyaml is missing warn or die depending on --with-yaml
+if test x$ac_cv_lib_yaml_yaml_parser_initialize != xyes; then
+  case "$with_yaml" in
+  yes) AC_MSG_ERROR([--with-yaml was given, but libyaml was not found]);;
+  no) ;;
+  *) AC_MSG_WARN([libyaml was not found. YAML tests will be skipped]);;
+  esac
+fi
+
+AM_CONDITIONAL([WITH_YAML], [test "x$ac_cv_lib_yaml_yaml_parser_initialize" == xyes -a "x$with_yaml" != xno])
+
+AC_PATH_PROG(PKG_CONFIG, pkg-config)
+
+AC_ARG_ENABLE(ucs4,
+              AC_HELP_STRING(--enable-ucs4, Enable 4 byte-wide characters),
+              [AC_DEFINE([WIDECHARS_ARE_UCS4], [1], [Define if widechars are ucs4])],
+              [enable_ucs4=no])
+
+AC_MSG_CHECKING([whether 4 byte-wide characters should be supported])
+AC_MSG_RESULT($enable_ucs4)
+
+case "$enable_ucs4" in
+yes) WIDECHAR_TYPE='unsigned int';;
+*) WIDECHAR_TYPE='unsigned short int';;
+esac
+AC_SUBST(WIDECHAR_TYPE)
+AM_CONDITIONAL([HAVE_UCS4], [test x$enable_ucs4 = xyes])
+
+case $host in
+  *mingw* | *cygwin*)
+    CFLAGS="$CFLAGS -Wl,--add-stdcall-alias"
+    LDFLAGS="$LDFLAGS -avoid-version"
+  ;;
+esac
+
+AC_CANONICAL_HOST
+build_macosx=no
+case $host_os in
+  darwin*)
+    build_macosx=yes
+  ;;
+esac
+AM_CONDITIONAL([OSX], [test "$build_macosx" = "yes"])
+
+AC_CONFIG_FILES([
+	Makefile
+	doc/Makefile
+	man/Makefile
+	liblouis/Makefile
+	liblouis/liblouis.h
+	windows/Makefile
+	windows/include/Makefile
+	windows/utils/Makefile
+	tables/Makefile
+	liblouis.pc
+	tests/Makefile
+	tests/resolve_table.h
+	tests/tables/Makefile
+	tests/tables/emphclass/Makefile
+	tests/tables/moreTables/Makefile
+	tests/tables/resolve_table/Makefile
+	tests/tables/resolve_table/dir_1/Makefile
+	tests/tables/resolve_table/dir_1/dir_1.1/Makefile
+	tests/tables/resolve_table/dir_2/Makefile
+	tests/tablesWithMetadata/Makefile
+	tests/ueb_test_data/Makefile
+	tests/yaml/Makefile
+	python/Makefile
+	python/setup.py
+	python/louis/Makefile
+	tools/Makefile
+	tools/gnulib/Makefile
+	tools/lou_maketable.d/Makefile
+	tools/lou_maketable.d/lou_maketable
+	gnulib/Makefile])
+AC_OUTPUT
diff --git a/liblouis/contrib/braille-input.el b/liblouis/contrib/braille-input.el
new file mode 100644
index 0000000..df7c46a
--- /dev/null
+++ b/liblouis/contrib/braille-input.el
@@ -0,0 +1,291 @@
+;;; braille-input.el --- A simple input method for braille
+
+;; Copyright (C) 2013 Swiss Library for the Blind, Visually Impaired and Print Disabled 
+
+;; This file is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation, either version 3 of the License,
+;; or (at your option) any later version.
+
+;; This file is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+
+;;; Code:
+
+;; This code is inspired by Vim unicode braille () and http://benizi.com/vim/braille.vim
+
+(robin-define-package "braille-numerical"
+  "A simple input method for braille."
+
+  ("b0" ?⠀)
+  ("b1" ?⠁)
+  ("b2" ?⠂)
+  ("b12" ?⠃)
+  ("b3" ?⠄)
+  ("b13" ?⠅)
+  ("b23" ?⠆)
+  ("b123" ?⠇)
+  ("b4" ?⠈)
+  ("b14" ?⠉)
+  ("b24" ?⠊)
+  ("b124" ?⠋)
+  ("b34" ?⠌)
+  ("b134" ?⠍)
+  ("b234" ?⠎)
+  ("b1234" ?⠏)
+  ("b5" ?⠐)
+  ("b15" ?⠑)
+  ("b25" ?⠒)
+  ("b125" ?⠓)
+  ("b35" ?⠔)
+  ("b135" ?⠕)
+  ("b235" ?⠖)
+  ("b1235" ?⠗)
+  ("b45" ?⠘)
+  ("b145" ?⠙)
+  ("b245" ?⠚)
+  ("b1245" ?⠛)
+  ("b345" ?⠜)
+  ("b1345" ?⠝)
+  ("b2345" ?⠞)
+  ("b12345" ?⠟)
+  ("b6" ?⠠)
+  ("b16" ?⠡)
+  ("b26" ?⠢)
+  ("b126" ?⠣)
+  ("b36" ?⠤)
+  ("b136" ?⠥)
+  ("b236" ?⠦)
+  ("b1236" ?⠧)
+  ("b46" ?⠨)
+  ("b146" ?⠩)
+  ("b246" ?⠪)
+  ("b1246" ?⠫)
+  ("b346" ?⠬)
+  ("b1346" ?⠭)
+  ("b2346" ?⠮)
+  ("b12346" ?⠯)
+  ("b56" ?⠰)
+  ("b156" ?⠱)
+  ("b256" ?⠲)
+  ("b1256" ?⠳)
+  ("b356" ?⠴)
+  ("b1356" ?⠵)
+  ("b2356" ?⠶)
+  ("b12356" ?⠷)
+  ("b456" ?⠸)
+  ("b1456" ?⠹)
+  ("b2456" ?⠺)
+  ("b12456" ?⠻)
+  ("b3456" ?⠼)
+  ("b13456" ?⠽)
+  ("b23456" ?⠾)
+  ("b123456" ?⠿)
+  ("b7" ?⡀)
+  ("b17" ?⡁)
+  ("b27" ?⡂)
+  ("b127" ?⡃)
+  ("b37" ?⡄)
+  ("b137" ?⡅)
+  ("b237" ?⡆)
+  ("b1237" ?⡇)
+  ("b47" ?⡈)
+  ("b147" ?⡉)
+  ("b247" ?⡊)
+  ("b1247" ?⡋)
+  ("b347" ?⡌)
+  ("b1347" ?⡍)
+  ("b2347" ?⡎)
+  ("b12347" ?⡏)
+  ("b57" ?⡐)
+  ("b157" ?⡑)
+  ("b257" ?⡒)
+  ("b1257" ?⡓)
+  ("b357" ?⡔)
+  ("b1357" ?⡕)
+  ("b2357" ?⡖)
+  ("b12357" ?⡗)
+  ("b457" ?⡘)
+  ("b1457" ?⡙)
+  ("b2457" ?⡚)
+  ("b12457" ?⡛)
+  ("b3457" ?⡜)
+  ("b13457" ?⡝)
+  ("b23457" ?⡞)
+  ("b123457" ?⡟)
+  ("b67" ?⡠)
+  ("b167" ?⡡)
+  ("b267" ?⡢)
+  ("b1267" ?⡣)
+  ("b367" ?⡤)
+  ("b1367" ?⡥)
+  ("b2367" ?⡦)
+  ("b12367" ?⡧)
+  ("b467" ?⡨)
+  ("b1467" ?⡩)
+  ("b2467" ?⡪)
+  ("b12467" ?⡫)
+  ("b3467" ?⡬)
+  ("b13467" ?⡭)
+  ("b23467" ?⡮)
+  ("b123467" ?⡯)
+  ("b567" ?⡰)
+  ("b1567" ?⡱)
+  ("b2567" ?⡲)
+  ("b12567" ?⡳)
+  ("b3567" ?⡴)
+  ("b13567" ?⡵)
+  ("b23567" ?⡶)
+  ("b123567" ?⡷)
+  ("b4567" ?⡸)
+  ("b14567" ?⡹)
+  ("b24567" ?⡺)
+  ("b124567" ?⡻)
+  ("b34567" ?⡼)
+  ("b134567" ?⡽)
+  ("b234567" ?⡾)
+  ("b1234567" ?⡿)
+  ("b8" ?⢀)
+  ("b18" ?⢁)
+  ("b28" ?⢂)
+  ("b128" ?⢃)
+  ("b38" ?⢄)
+  ("b138" ?⢅)
+  ("b238" ?⢆)
+  ("b1238" ?⢇)
+  ("b48" ?⢈)
+  ("b148" ?⢉)
+  ("b248" ?⢊)
+  ("b1248" ?⢋)
+  ("b348" ?⢌)
+  ("b1348" ?⢍)
+  ("b2348" ?⢎)
+  ("b12348" ?⢏)
+  ("b58" ?⢐)
+  ("b158" ?⢑)
+  ("b258" ?⢒)
+  ("b1258" ?⢓)
+  ("b358" ?⢔)
+  ("b1358" ?⢕)
+  ("b2358" ?⢖)
+  ("b12358" ?⢗)
+  ("b458" ?⢘)
+  ("b1458" ?⢙)
+  ("b2458" ?⢚)
+  ("b12458" ?⢛)
+  ("b3458" ?⢜)
+  ("b13458" ?⢝)
+  ("b23458" ?⢞)
+  ("b123458" ?⢟)
+  ("b68" ?⢠)
+  ("b168" ?⢡)
+  ("b268" ?⢢)
+  ("b1268" ?⢣)
+  ("b368" ?⢤)
+  ("b1368" ?⢥)
+  ("b2368" ?⢦)
+  ("b12368" ?⢧)
+  ("b468" ?⢨)
+  ("b1468" ?⢩)
+  ("b2468" ?⢪)
+  ("b12468" ?⢫)
+  ("b3468" ?⢬)
+  ("b13468" ?⢭)
+  ("b23468" ?⢮)
+  ("b123468" ?⢯)
+  ("b568" ?⢰)
+  ("b1568" ?⢱)
+  ("b2568" ?⢲)
+  ("b12568" ?⢳)
+  ("b3568" ?⢴)
+  ("b13568" ?⢵)
+  ("b23568" ?⢶)
+  ("b123568" ?⢷)
+  ("b4568" ?⢸)
+  ("b14568" ?⢹)
+  ("b24568" ?⢺)
+  ("b124568" ?⢻)
+  ("b34568" ?⢼)
+  ("b134568" ?⢽)
+  ("b234568" ?⢾)
+  ("b1234568" ?⢿)
+  ("b78" ?⣀)
+  ("b178" ?⣁)
+  ("b278" ?⣂)
+  ("b1278" ?⣃)
+  ("b378" ?⣄)
+  ("b1378" ?⣅)
+  ("b2378" ?⣆)
+  ("b12378" ?⣇)
+  ("b478" ?⣈)
+  ("b1478" ?⣉)
+  ("b2478" ?⣊)
+  ("b12478" ?⣋)
+  ("b3478" ?⣌)
+  ("b13478" ?⣍)
+  ("b23478" ?⣎)
+  ("b123478" ?⣏)
+  ("b578" ?⣐)
+  ("b1578" ?⣑)
+  ("b2578" ?⣒)
+  ("b12578" ?⣓)
+  ("b3578" ?⣔)
+  ("b13578" ?⣕)
+  ("b23578" ?⣖)
+  ("b123578" ?⣗)
+  ("b4578" ?⣘)
+  ("b14578" ?⣙)
+  ("b24578" ?⣚)
+  ("b124578" ?⣛)
+  ("b34578" ?⣜)
+  ("b134578" ?⣝)
+  ("b234578" ?⣞)
+  ("b1234578" ?⣟)
+  ("b678" ?⣠)
+  ("b1678" ?⣡)
+  ("b2678" ?⣢)
+  ("b12678" ?⣣)
+  ("b3678" ?⣤)
+  ("b13678" ?⣥)
+  ("b23678" ?⣦)
+  ("b123678" ?⣧)
+  ("b4678" ?⣨)
+  ("b14678" ?⣩)
+  ("b24678" ?⣪)
+  ("b124678" ?⣫)
+  ("b34678" ?⣬)
+  ("b134678" ?⣭)
+  ("b234678" ?⣮)
+  ("b1234678" ?⣯)
+  ("b5678" ?⣰)
+  ("b15678" ?⣱)
+  ("b25678" ?⣲)
+  ("b125678" ?⣳)
+  ("b35678" ?⣴)
+  ("b135678" ?⣵)
+  ("b235678" ?⣶)
+  ("b1235678" ?⣷)
+  ("b45678" ?⣸)
+  ("b145678" ?⣹)
+  ("b245678" ?⣺)
+  ("b1245678" ?⣻)
+  ("b345678" ?⣼)
+  ("b1345678" ?⣽)
+  ("b2345678" ?⣾)
+  ("b12345678" ?⣿))
+
+(register-input-method
+ "braille-numerical"
+ "braille"
+ 'robin-use-package
+ "braille"
+ "A simple numerical braille input method")
+
diff --git a/liblouis/contrib/liblouis.el b/liblouis/contrib/liblouis.el
new file mode 100644
index 0000000..3a9bafa
--- /dev/null
+++ b/liblouis/contrib/liblouis.el
@@ -0,0 +1,141 @@
+;;; liblouis.el --- mode for editing liblouis translation tables
+
+;; Copyright (C) 2009, 2011 Christian Egli
+
+;; This file is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation, either version 3 of the License,
+;; or (at your option) any later version.
+
+;; This file is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+
+;;; Code:
+
+(defvar liblouis-mode-hook nil
+  "Normal hook run when entering liblouis mode.")
+
+(defvar liblouis-mode-abbrev-table nil
+  "Abbrev table in use in liblouis mode buffers.")
+(define-abbrev-table 'liblouis-mode-abbrev-table ())
+
+(eval-after-load "compile"
+  '(add-to-list 'compilation-error-regexp-alist
+                ;; WARNING: foo.txt: line 13: section title out of sequence: expected level 3, got level 4
+                ;; ERROR: foo.txt: line 18: only book doctypes can contain level 0 sections
+                '("^\\(ERROR\\|WARNING\\|DEPRECATED\\): \\([^:]*\\): line \\([0-9]+\\):" 2 3)))
+
+(defconst liblouis-comment-regexp "\\(\\s-+.*\\)??")
+
+(defconst liblouis-font-lock-keywords
+  (list
+   
+   ;; Comment Lines
+   (cons "^#.*$" 'font-lock-comment-face)
+   
+   ;; Opcodes (with one word arg)
+   (list
+    (concat "^"
+	    (regexp-opt
+	     '("include" "locale" "noletsign" "noletsignbefore" "noletsignafter"
+	       "nocont" "compbrl" "contraction" "emphclass") 'words)
+	    "\\s-+\\([^       ]+\\)" liblouis-comment-regexp "$")
+    '(1 font-lock-keyword-face)
+    '(2 font-lock-constant-face)
+    '(3 font-lock-comment-face nil t))
+   
+   ;; Opcodes (with one dot pattern arg)
+   (list
+    (concat "^"
+	    (regexp-opt
+	     '("numsign" "capsletter" "firstwordital"
+	       "lastworditalbefore" "lastworditalafter"
+	       "firstletterital" "lastletterital" "singleletterital"
+	       "firstwordbold" "lastwordboldbefore" "lastwordboldafter"
+	       "firstletterbold" "lastletterbold" "singleletterbold"
+	       "firstwordunder" "lastwordunderbefore" "lastwordunderafter"
+	       "firstletterunder" "lastletterunder" "singleletterunder"
+	       "begcomp" "endcomp"
+	       "begcaps" "endcaps" "letsign" "nocontractsign"
+	       "exactdots") 'words)
+	    "\\s-+\\([0-9-@]+\\)" liblouis-comment-regexp "$")
+    '(1 font-lock-keyword-face)
+    '(2 font-lock-constant-face)
+    '(3 font-lock-comment-face nil t))
+   
+   ;; Opcodes (with two args)
+   (list
+    (concat "^"
+	    (regexp-opt
+	     '("comp6" "after" "before" "space" "punctuation" "digit" "lowercase" "uppercase"
+	       "letter" "uplow" "litdigit" "sign" "math" "display" "repeated"  "always"
+	       "nocross" "syllable" "largesign" "word" "partword" "joinnum" "joinword"
+	       "lowword" "sufword" "prfword" "begword" "begmidword" "midword" "midendword"
+	       "endword" "prepunc" "postpunc" "begnum" "midnum" "endnum" "decpoint" "hyphen"
+	       "begemphword" "endemphword" "begemphphrase" "lenemphphrase") 'words)
+	    "\\s-+\\([^       ]+?\\)\\s-+\\([-0-9=@a-f]+\\)" liblouis-comment-regexp "$")
+    '(1 font-lock-keyword-face)
+    '(2 font-lock-string-face)
+    '(3 font-lock-constant-face)
+    '(4 font-lock-comment-face nil t))
+   
+   ;; Opcodes (with three args)
+   (list
+    (concat "^"
+	    (regexp-opt
+	     '("endemphphrase") 'words)
+	    "\\s-+\\([^       ]+?\\)\\s-+\\([^       ]+?\\)\\s-+\\([-0-9=@a-f]+\\)" liblouis-comment-regexp "$")
+    '(1 font-lock-keyword-face)
+    '(2 font-lock-string-face)
+    '(3 font-lock-string-face)
+    '(4 font-lock-constant-face)
+    '(5 font-lock-comment-face nil t))
+
+   ;; Opcodes (with two args where the second one is not a dot pattern)
+   (list
+    (concat "^"
+	    (regexp-opt
+	     '("class" "replace" "context" "correct" "pass2" "pass3" "pass4" ) 'words)
+	    "\\s-+\\([^       ]+?\\)\\s-+\\([^        ]+\\)" liblouis-comment-regexp "$")
+    '(1 font-lock-keyword-face)
+    '(2 font-lock-string-face)
+    '(3 font-lock-constant-face)
+    '(4 font-lock-comment-face nil t))
+					; FIXME: "multind" "lenitalphrase" lenboldphrase lenunderphrase  "swapcd" "swapdd" "capsnocont"
+   )
+  "Default expressions to highlight in liblouis mode.")
+
+;;###autoload
+(define-derived-mode liblouis-mode prog-mode "liblouis"
+  "Major mode for editing liblouis translation tables.
+Turning on liblouis mode runs the normal hook `liblouis-mode-hook'.
+"
+  (modify-syntax-entry ?\'  ".")
+  (modify-syntax-entry ?# "< b")
+  (modify-syntax-entry ?\n "> b")
+
+  (set (make-local-variable 'compile-command)
+       (concat "lou_checktable " buffer-file-name))
+
+  (set (make-local-variable 'require-final-newline) t)
+
+  (set (make-local-variable 'font-lock-defaults)
+       '(liblouis-font-lock-keywords
+         nil				; KEYWORDS-ONLY: no
+         nil				; CASE-FOLD: no
+         ((?_ . "w"))			; SYNTAX-ALIST
+	 ))
+
+  (set (make-local-variable 'comment-start) "#")
+
+  (run-hooks 'liblouis-mode-hook))
+
+(provide 'liblouis-mode)
diff --git a/liblouis/doc/Makefile.am b/liblouis/doc/Makefile.am
new file mode 100644
index 0000000..afefb06
--- /dev/null
+++ b/liblouis/doc/Makefile.am
@@ -0,0 +1,19 @@
+doc_DATA = \
+	liblouis.html \
+	liblouis.txt
+
+EXTRA_DIST = \
+	liblouis.html \
+	liblouis.txt
+
+CLEANFILES = $(EXTRA_DIST)
+
+info_TEXINFOS = liblouis.texi
+
+# generate one big html file
+AM_MAKEINFOHTMLFLAGS = --no-headers --no-split
+
+SUFFIXES                = .txt
+
+.texi.txt:
+	$(MAKEINFO) --plaintext $< -o $@
diff --git a/liblouis/doc/liblouis.texi b/liblouis/doc/liblouis.texi
new file mode 100644
index 0000000..6ab4c6b
--- /dev/null
+++ b/liblouis/doc/liblouis.texi
@@ -0,0 +1,3571 @@
+\input texinfo
+@c %**start of header
+@setfilename liblouis.info
+@documentencoding UTF-8
+@include version.texi
+@settitle Liblouis User's and Programmer's Manual
+
+@dircategory Misc
+@direntry
+* Liblouis: (liblouis). A braille translator and back-translator
+@end direntry
+
+@finalout
+
+@c Macro definitions
+
+@defindex opcode
+
+@c Opcode.
+@macro opcode{name, args}
+@opcodeindex \name\
+@anchor{\name\ opcode}
+@item \name\ \args\
+@end macro
+
+@macro opcoderef{name}
+@code{\name\} opcode (@pxref{\name\ opcode,\name\,@code{\name\}})
+@end macro
+
+@c Opcode.
+@macro deprecatedopcode{name, args, replacement}
+@opcodeindex \name\
+@anchor{\name\ opcode}
+@item \name\ \args\
+This opcode is deprecated. Use the @opcoderef{\replacement\} instead.
+@end macro
+
+@copying
+This manual is for liblouis (version @value{VERSION}, @value{UPDATED}),
+a Braille Translation and Back-Translation Library derived from the
+Linux screen reader @acronym{BRLTTY}.
+
+@vskip 10pt
+
+@noindent
+Copyright @copyright{} 1999-2006 by the BRLTTY Team.
+
+@noindent
+Copyright @copyright{} 2004-2007 ViewPlus Technologies, Inc.
+@uref{www.viewplus.com}.
+
+@noindent
+Copyright @copyright{} 2007, 2009 Abilitiessoft, Inc.
+@uref{www.abilitiessoft.org}.
+
+@noindent
+Copyright @copyright{} 2014, 2016 Swiss Library for the Blind, Visually
+Impaired and Print Disabled. @uref{www.sbs.ch}.
+
+@vskip 10pt
+
+@quotation
+This file is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser (or library) General Public License
+(LGPL) as published by the Free Software Foundation; either version 3,
+or (at your option) any later version.
+
+This file is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser (or Library) General Public License LGPL for more details.
+
+You should have received a copy of the GNU Lesser (or Library) General
+Public License (LGPL) along with this program; see the file COPYING.
+If not, write to the Free Software Foundation, 51 Franklin Street,
+Fifth Floor, Boston, MA 02110-1301, USA.
+@end quotation
+@end copying
+
+@titlepage
+@title Liblouis User's and Programmer's Manual
+
+@subtitle for version @value{VERSION}, @value{UPDATED}
+@author by John J. Boyer
+
+@c The following two commands start the copyright page.
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@c Output the table of contents at the beginning.
+@contents
+
+@ifnottex
+@node Top
+@top Liblouis User's and Programmer's Manual
+
+@insertcopying
+@end ifnottex
+
+@menu
+* Introduction::
+* How to Write Translation Tables::
+* Notes on Back-Translation::
+* Table Metadata::
+* Testing Translation Tables interactively::
+* Automated Testing of Translation Tables::
+* Programming with liblouis::
+* Concept Index::
+* Opcode Index::
+* Function Index::
+* Program Index::
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+How to Write Translation Tables
+
+* Overview::
+* Hyphenation Tables::
+* Character-Definition Opcodes::
+* Braille Indicator Opcodes::
+* Emphasis Opcodes::
+* Special Symbol Opcodes::
+* Special Processing Opcodes::
+* Translation Opcodes::
+* Character-Class Opcodes::
+* Swap Opcodes::
+* The Context and Multipass Opcodes::
+* The correct Opcode::
+* The match Opcode::
+* Miscellaneous Opcodes::
+
+Emphasis Opcodes
+
+* Emphasis class::
+* Contexts::
+* Fallback behavior::
+* Computer braille::
+
+Contexts
+
+* None::
+* Letter::
+* Word::
+* Phrase::
+* Symbol::
+
+Testing Translation Tables interactively
+
+* lou_debug::
+* lou_trace::
+* lou_checktable::
+* lou_allround::
+* lou_translate (program)::
+* lou_checkhyphens::
+* lou_checkyaml::
+
+Programming with liblouis
+
+* Overview (library)::
+* Data structure of liblouis tables::
+* How tables are found::
+* Deprecation of the logging system::
+* lou_version::
+* lou_translateString::
+* lou_translate::
+* lou_backTranslateString::
+* lou_backTranslate::
+* lou_hyphenate::
+* lou_compileString::
+* lou_getTypeformForEmphClass::
+* lou_dotsToChar::
+* lou_charToDots::
+* lou_registerLogCallback::
+* lou_setLogLevel::
+* lou_logFile::
+* lou_logPrint::
+* lou_logEnd::
+* lou_setDataPath::
+* lou_getDataPath::
+* lou_getTable::
+* lou_findTable::
+* lou_indexTables::
+* lou_checkTable::
+* lou_readCharFromFile::
+* lou_free::
+* lou_charSize::
+* Python bindings::
+
+@end detailmenu
+@end menu
+
+@node Introduction
+@chapter Introduction
+
+Liblouis is an open-source braille translator and back-translator
+derived from the translation routines in the BRLTTY screen reader for
+Linux. It has, however, gone far beyond these routines. It is named in
+honor of Louis Braille. In Linux and Mac OSX it is a shared library,
+and in Windows it is a DLL. For installation instructions see the
+README file. Please report bugs and oddities to the mailing list,
+@email{liblouis-liblouisxml@@freelists.org}
+
+This documentation is derived from the BRLTTY manual, but
+it has been extensively rewritten to cover new features.
+
+@section Who is this manual for
+
+This manual has two main audiences: People who want to write or
+improve a braille translation table and people who want to use the
+braille translator library in their own programs. This manual is
+probably not for people who are looking for some turn-key braille
+translation software.
+
+@section How to read this manual
+
+If you are mostly interested in writing braille translation tables
+then you want to focus on @ref{How to Write Translation Tables}. You
+might want to look at @ref{Notes on Back-Translation} if you are
+interested in back-translation. Read @ref{Table Metadata} if you want
+to find out how you can augment your tables with metadata in order to
+make them discoverable by programs. Finally @ref{Testing Translation
+Tables interactively} and @ref{Automated Testing of Translation
+Tables} will show how your braille translation tables can be tested
+interactively and also in an automated fashion.
+
+If you want to use the braille translation library in your own program
+or you are interested in enhancing the braille translation library
+itself then you will want to look at @ref{Programming with liblouis}.
+
+@node How to Write Translation Tables
+@chapter How to Write Translation Tables
+
+For many languages there is already a translation table, so before
+creating a new table start by looking at existing tables to modify
+them as needed.
+
+Typically, a braille translation table consists of several parts.
+First are header and includes, in which you write what the table is
+for, license information and include tables you need for your table.
+
+Following this, you'll write various translation rules and lastly you
+write special rules to handle certain situations.
+
+@cindex opcode
+A translation rule is composed of at least three parts: the opcode
+(translation command), character(s) and braille dots. An opcode is a
+command you give to a machine or a program to perform something on
+your behalf. In liblouis, an opcode tells it which rule to use when
+translating characters into braille. An operand can be thought of as
+parameters for the translation rule and is composed of two parts: the
+character or word to be translated and the braille dots.
+
+For example, suppose you want to read the word @samp{world} using
+braille dots @samp{456}, followed by the letter @samp{W} all the time.
+Then you'd write:
+
+@example
+always world 456-2456
+@end example
+
+The word @code{always} is an opcode which tells liblouis to always
+honor this translation, that is to say when the word @samp{world} (an
+operand) is encountered, always show braille dots @samp{456} followed
+by the letter @samp{w} (@samp{2456}).
+
+When you write any braille table for any language, we'd recommend
+working from some sort of official standard, and have a device or a
+program in which you can test your work.
+
+@menu
+* Overview::
+* Hyphenation Tables::
+* Character-Definition Opcodes::
+* Braille Indicator Opcodes::
+* Emphasis Opcodes::
+* Special Symbol Opcodes::
+* Special Processing Opcodes::
+* Translation Opcodes::
+* Character-Class Opcodes::
+* Swap Opcodes::
+* The Context and Multipass Opcodes::
+* The correct Opcode::
+* The match Opcode::
+* Miscellaneous Opcodes::
+@end menu
+
+@node Overview
+@section Overview
+
+Many translation (contraction) tables have already been made up. They
+are included in the distribution in the tables directory and can be
+studied as part of the documentation. Some of the more helpful (and
+normative) are listed in the following table:
+
+@table @file
+@item chardefs.cti 
+Character definitions for U.S. tables
+@item compress.ctb
+Remove excessive whitespace
+@item en-us-g1.ctb
+Uncontracted American English
+@item en-us-g2.ctb
+Contracted or Grade 2 American English
+@item en-us-brf.dis
+Make liblouis output conform to BRF standard
+@item en-us-comp8.ctb
+8-dot computer braille for use in coding examples
+@item en-us-comp6.ctb
+6-dot computer braille
+@item nemeth.ctb
+Nemeth Code translation for use with liblouisutdml
+@item nemeth_edit.ctb
+Fixes errors at the boundaries of math and text
+
+@end table
+
+The names used for files containing translation tables are completely
+arbitrary. They are not interpreted in any way by the translator.
+Contraction tables may be 8-bit ASCII files, UTF-8, 16-bit big-endian
+Unicode files or 16-bit little-endian Unicode files. Blank lines are
+ignored. Any leading and trailing whitespace (any number of blanks
+and/or tabs) is ignored. Lines which begin with a number sign or hatch
+mark (@samp{#}) are ignored, i.e. they are comments. If the number
+sign is not the first non-blank character in the line, it is treated
+as an ordinary character. If the first non-blank character is
+less-than (@samp{<}) the line is also treated as a comment. This makes
+it possible to mark up tables as xhtml documents. Lines which are not
+blank or comments define table entries. The general format of a table
+entry is:
+
+@example
+opcode operands comments
+@end example
+
+Table entries may not be split between lines. The opcode is a mnemonic
+that specifies what the entry does. The operands may be character
+sequences, braille dot patterns or occasionally something else. They
+are described for each opcode, please @pxref{Opcode Index}. With some
+exceptions, opcodes expect a certain number of operands. Any text on
+the line after the last operand is ignored, and may be a comment. A
+few opcodes accept a variable number of operands. In this case a
+number sign (@samp{#}) begins a comment unless it is preceded by a
+backslash (@samp{\}).
+
+Here are some examples of table entries.
+
+@example
+# This is a comment.
+always world 456-2456 A word and the dot pattern of its contraction
+@end example
+
+Most opcodes have both a "characters" operand and a "dots" operand,
+though some have only one and a few have other types.
+
+@cindex characters operand
+The characters operand consists of any combination of characters and
+escape sequences proceeded and followed by whitespace. Escape
+sequences are used to represent difficult characters. They begin with
+a backslash (@samp{\}). They are:
+
+@table @kbd
+@item \
+backslash
+@item \f
+form feed
+@item \n
+new line
+@item \r
+carriage return
+@item \s
+blank (space)
+@item \t
+horizontal tab
+@item \v
+vertical tab
+@item \e
+"escape" character (hex 1b, dec 27)
+@item \xhhhh
+4-digit hexadecimal value of a character
+
+@end table
+
+If liblouis has been compiled for 32-bit Unicode the following are
+also recognized.
+
+@table @kbd
+@item \yhhhhh
+5-digit (20 bit) character
+@item \zhhhhhhhh
+Full 32-bit value.
+
+@end table
+
+@cindex dots operand
+The dots operand is a braille dot pattern. The real braille dots, 1
+through 8, must be specified with their standard numbers.
+
+@cindex virtual dots
+@anchor{virtual dots}
+liblouis recognizes @emph{virtual dots}, which are used for special
+purposes, such as distinguishing accent marks. There are seven virtual
+dots. They are specified by the number 9 and the letters @samp{a}
+through @samp{f}.
+
+@cindex multi-cell dot pattern
+For a multi-cell dot pattern, the cell specifications must be
+separated from one another by a dash (@samp{-}). For example, the
+contraction for the English word @samp{lord} (the letter @samp{l}
+preceded by dot 5) would be specified as @samp{5-123}. A space may be
+specified with the special dot number 0.
+
+An opcode which is helpful in writing translation tables is
+@code{include}. Its format is:
+
+@example
+include filename
+@end example
+
+It reads the file indicated by @code{filename} and incorporates or
+includes its entries into the table. Included files can include other
+files, which can include other files, etc. For an example, see what
+files are included by the entry @code{include en-us-g1.ctb} in the table
+@file{en-us-g2.ctb}. If the included file is not in the same directory
+as the main table, use a full path name for filename. Tables can also be
+specified in a table list, in which the table names are separated by
+commas and given as a single table name in calls to the translation
+functions.
+
+The order of the various types of opcodes or table entries is
+important. Character-definition opcodes should come first. However, if
+the optional @opcoderef{display} is used it should precede
+character-definition opcodes. Braille-indicator opcodes should come
+next. Translation opcodes should follow. The @opcoderef{context} is a
+translation opcode, even though it is considered along with the
+multipass opcodes. These latter should follow the translation opcodes.
+The @opcoderef{correct} can be used anywhere after the
+character-definition opcodes, but it is probably a good idea to group
+all @code{correct} opcodes together. The @opcoderef{include} can be
+used anywhere, but the order of entries in the combined table must
+conform to the order given above. Within each type of opcode, the
+order of entries is generally unimportant. Thus the translation
+entries can be grouped alphabetically or in any other order that is
+convenient. Hyphenation tables may be specified either with an 
+@code{include} opcode or as part of a table list. They should come after 
+everything else. Character-definition opcodes are necessary for 
+hyphenation tables to work.
+
+@node Hyphenation Tables
+@section Hyphenation Tables
+
+Hyphenation tables are necessary to make opcodes such as the
+@opcoderef{nocross} function properly. There are no opcodes for
+hyphenation table entries because these tables have a special format.
+Therefore, they cannot be specified as part of an ordinary table.
+Rather, they must be included using the @opcoderef{include} or as part
+of a table list. The liblouis hyphenation algorithm was adopted from the
+one used by OpenOffice. Note that Hyphenation tables must follow
+character definitions and should preferably be the last. For an example
+of a hyphenation table, see @file{hyph_en_US.dic}.
+
+@node Character-Definition Opcodes
+@section Character-Definition Opcodes
+
+These opcodes are needed to define attributes such as digit,
+punctuation, letter, etc. for all characters and their dot patterns.
+liblouis has no built-in character definitions, but such definitions
+are essential to the operation of the @opcoderef{context}, the
+@opcoderef{correct}, the multipass opcodes and the back-translator. If
+the dot pattern is a single cell, it is used to define the mapping
+between dot patterns and characters, unless a @opcoderef{display} for
+that character-dot-pattern pair has been used previously. If only a
+single-cell dot pattern has been given for a character, that dot
+pattern is defined with the character's own attributes. If more than
+one cell is given and some of them have not previously been defined as
+single cells, the undefined cells are entered into the dots table with
+the space attribute. This is done for backward compatibility with
+old tables, but it may cause problems with the above opcodes or
+back-translation. For this reason, every single-cell dot pattern
+should be defined before it is used in a multi-cell character
+representation. The best way to do this is to use the 8-dot computer
+braille representation for the particular braille code. If a character
+or dot pattern used in any rule, except those with the @code{display}
+opcode, the @opcoderef{repeated} or the @opcoderef{replace}, is not
+defined by one of the character-definition opcodes, liblouis will give
+an error message and refuse to continue until the problem is fixed. If
+the translator or back-translator encounters an undefined character in
+its input it produces a succinct error indication in its output, and
+the character is treated as a space.
+
+You may have multiple definitions of a character using the same or
+different dot patterns. If you use different dot patterns for the same
+character, only the first dot pattern will be used during forward
+translation. However, during back-translation, all the relevant dot
+patterns will back-translate to the character you defined.
+
+You can also define a character multiple times using the same dot
+pattern for the character, but using different character classes. The
+following example would define the character @samp{*} (star) as both
+@opcoderef{math} and @opcoderef{sign}.
+
+@example
+math * 16
+sign * 16
+@end example
+
+Likewise, you can define multiple characters as the same dot pattern.
+The characters you define this way will be forward translated to the
+same dot pattern. However, when back-translating, the dot pattern will
+always back-translate to the first character that was defined with
+this pattern.
+
+This technique may be useful when defining characters that have one
+representation in the Windows character set (CP1252) and another
+representation in the Unicode character set, e.g. the Euro sign,
+@samp{€}. It may also be of use when you have to define several
+variants of the same letter with different accents, which may be
+represented in your Braille code by the same dot pattern. This is a
+very common practice for accented letters that are foreign to the
+Braille code. In the following example using the @opcoderef{uplow}
+opcode, both e acute (@samp{é}) and e grave (@samp{è}) are defined as
+dot 4 followed by dots 1 and 5.
+
+@example
+uplow \x00c9\x00e9 4-15 # E acute
+uplow \x00c8\x00e8 4-15 # E grave
+@end example
+
+In this example, the dot pattern would always back-translate to e
+acute, since this is the first definition. You could use the
+@opcoderef{correct} opcode to correct at least the most common errors
+on that account. However, there is no fail-safe way to know what
+accented letter to use when you back-translate from a dot pattern
+representing more than one variant.
+
+@table @code
+@opcode{space, character dots}
+Defines a character as a space and also defines the dot pattern as
+such. for example:
+
+@example
+space \s 0 \s is the escape sequence for blank; 0 means no dots.
+@end example
+
+@opcode{punctuation, character dots}
+Associates a punctuation mark in the particular language with a
+braille representation and defines the character and dot pattern as
+punctuation. For example:
+
+@example
+punctuation . 46 dot pattern for period in NAB computer braille
+@end example
+
+@opcode{digit, character dots}
+Associates a digit with a dot pattern and defines the character as a
+digit. For example:
+
+@example
+digit 0 356 NAB computer braille
+@end example
+
+@opcode{uplow, characters dots [@comma{}dots]}
+The characters operand must be a pair of letters, of which the first
+is uppercase and the second lowercase. The first dots suboperand
+indicates the dot pattern for the upper-case letter. It may have more
+than one cell. The second dots suboperand must be separated from the
+first by a comma and is optional, as indicated by the square brackets.
+If present, it indicates the dot pattern for the lower-case letter. It
+may also have more than one cell. If the second dots suboperand is not
+present the first is used for the lower-case letter as well as the
+upper-case letter. This opcode is needed because not all languages
+follow a consistent pattern in assigning Unicode codes to upper and
+lower case letters. It should be used even for languages that do. The
+distinction is important in the forward translator. for example:
+
+@example
+uplow Aa 17,1
+@end example
+
+@opcode{grouping, name characters dots @comma{}dots}
+This opcode is used to indicate pairs of grouping symbols used in
+processing mathematical expressions. These symbols are usually
+generated by the MathML interpreter in liblouisutdml. They are used in
+multipass opcodes. The name operand must contain only letters, but
+they may be upper- or lower-case. The characters operand must contain
+exactly two Unicode characters. The dots operand must contain exactly
+two braille cells, separated by a comma. Note that grouping dot
+patterns also need to be declared with the @opcoderef{exactdots}. The
+characters may need to be declared with the @opcoderef{math}.
+
+@example
+grouping mrow \x0001\x0002 1e,2e
+grouping mfrac \x0003\x0004 3e,4e
+@end example
+
+@opcode{letter, character dots}
+Associates a letter in the language with a braille representation and
+defines the character as a letter. This is intended for letters which
+are neither uppercase nor lowercase.
+
+@opcode{lowercase, character dots}
+Associates a character with a dot pattern and defines the character as
+a lowercase letter. Both the character and the dot pattern have the
+attributes lowercase and letter.
+
+@opcode{uppercase, character dots}
+Associates a character with a dot pattern and defines the character as
+an uppercase letter. Both the character and the dot pattern have the
+attributes uppercase and letter. @code{lowercase} and @code{uppercase}
+should be used when a letter has only one case. Otherwise use the
+@opcoderef{uplow}.
+
+@opcode{litdigit, digit dots}
+Associates a digit with the dot pattern which should be used to
+represent it in literary texts. For example:
+
+@example
+litdigit 0 245
+litdigit 1 1
+@end example
+
+@opcode{sign, character dots}
+Associates a character with a dot pattern and defines both as a sign.
+This opcode should be used for things like at sign (@samp{@@}),
+percent (@samp{%}), dollar sign (@samp{$}), etc. Do not use it to
+define ordinary punctuation such as period and comma. For example:
+
+@example
+sign % 4-25-1234 literary percent sign
+@end example
+
+@opcode{math, character dots}
+Associates a character and a dot pattern and defines them as a
+mathematical symbol. It should be used for less than (@samp{<}),
+greater than(@samp{>}), equals(@samp{=}), plus(@samp{+}), etc. For
+example:
+
+@example
+math + 346 plus
+@end example
+
+@end table
+
+@node Braille Indicator Opcodes
+@section Braille Indicator Opcodes
+
+Braille indicators are dot patterns which are inserted into the
+braille text to indicate such things as capitalization, italic type,
+computer braille, etc. The opcodes which define them are followed only
+by a dot pattern, which may be one or more cells.
+
+@table @code
+@opcode{capsletter, dots}
+The dot pattern which indicates capitalization of a single letter. In
+English, this is dot 6. For example:
+
+@example
+capsletter 6
+@end example
+
+@opcode{begcapsword, dots}
+The dot pattern which begins a block of capital letters at the
+beginning or within a word. For example:
+
+@example
+begcapsword 6-6
+@end example
+
+@opcode{endcapsword, dots}
+The dot pattern which ends a block of capital letters within a word.
+For example:
+
+@example
+endcapsword 6-3
+@end example
+
+@opcode{begcaps, dots}
+The dot pattern which begins a block of capital letters defined by the
+provided @code{typeform} without regard for any other rules. For
+example:
+
+@example
+begcaps 6-6
+@end example
+
+@opcode{endcaps, dots}
+The dot pattern which ends a block of capital letters defined by the
+provided @code{typeform} without regard for any other rules. For
+example:
+
+@example
+endcaps 6-3
+@end example
+
+@opcode{letsign, dots}
+This indicator is needed in Grade 2 to show that a single letter is
+not a contraction. It is also used when an abbreviation happens to be
+a sequence of letters that is the same as a contraction. For example:
+
+@example
+letsign 56
+@end example
+
+@opcode{noletsign, letters}
+
+The letters in the operand will not be proceeded by a letter sign.
+More than one @code{noletsign} opcode can be used. This is equivalent
+to a single entry containing all the letters. In addition, if a single
+letter, such as @samp{a} in English, is defined as a @code{word}
+(@pxref{word opcode,word,@code{word}}) or @code{largesign}
+(@pxref{largesign opcode,largesign,@code{largesign}}), it will be
+treated as though it had also been specified in a @code{noletsign}
+entry.
+
+@opcode{noletsignbefore, characters}
+If any of the characters proceeds a single letter without a space a
+letter sign is not used. By default the characters apostrophe
+(@samp{'}) and period (@samp{.}) have this property. Use of a
+@code{noletsignbefore} entry cancels the defaults. If more than one
+@code{noletsignbefore} entry is used, the characters in all entries
+are combined.
+
+@opcode{noletsignafter, characters}
+If any of the characters follows a single letter without a space a
+letter sign is not used. By default the characters apostrophe
+(@samp{'}) and period (@samp{.}) have this property. Use of a
+@code{noletsignafter} entry cancels the defaults. If more than one
+@code{noletsignafter} entry is used the characters in all entries are
+combined.
+
+@opcode{nocontractsign, dots}
+
+The dots in this opcode are used to indicate a letter or a sequence of
+letters that are not a contraction, e.g. @samp{CD}. The opcode is
+similar to the @opcoderef{letsign}.
+
+@c FIXME: In what way is the nocontractsign opcode different from the
+@c letsign opcode, apart from apparently being a more focused version of
+@c letsign?
+
+@opcode{numsign, dots}
+The translator inserts this indicator before numbers made up of digits
+defined with the @opcoderef{litdigit} to show that they are a number
+and not letters or some other symbols. For example:
+
+@example
+numsign 3456
+@end example
+
+@end table
+
+@node Emphasis Opcodes
+@section Emphasis Opcodes
+
+In many braille systems emphasis such as bold, italics or underline is
+indicated using special dot patterns that mark the start and often
+also the end. For some languages these braille indicators differ
+depending on the context, i.e. here is an separate indicator for an
+emphasized word and another one for an emphasized phrase. To
+accommodate for all these usage scenarios liblouis provides a number of
+opcodes for various contexts.
+
+At the same time some braille systems use different indicators for
+different kinds of emphasis while others know only one kind of
+emphasis. For that reason liblouis doesn't hard code any emphasis but
+the table author defines which kind of emphasis exist for a specific
+language using the @opcoderef{emphclass} opcode.
+
+@menu
+* Emphasis class::
+* Contexts::
+* Fallback behavior::
+* Computer braille::
+@end menu
+
+@node Emphasis class
+@subsection Emphasis class
+
+The @code{emphclass} opcode defines the classes of emphasis that are
+relevant for a particular language. For all emphasis that need special
+indicators an emphasis class has to be declared.
+
+@table @code
+@opcode{emphclass, <emphasis class>}
+Define an emphasis class to be used later in other emphasis related
+opcodes in the table.
+
+@example
+emphclass italic
+emphclass underline
+emphclass bold
+emphclass transnote
+@end example
+
+@end table
+
+@node Contexts
+@subsection Contexts
+
+In order to understand the capabilities of Liblouis for emphasis
+handling we have to look at the different contexts that are supported.
+
+@menu
+* None::
+* Letter::
+* Word::
+* Phrase::
+* Symbol::
+@end menu
+
+@node None
+@subsubsection None
+
+For some languages there is no such concept as contexts. Emphasis is
+always handled the same regardless of context. There is simply an
+indicator for the beginning of emphasis and another one for the end of
+the emphasis.
+
+@table @code
+@opcode{begemph, <emphasis class> <dot pattern>}
+Braille dot pattern to indicate the beginning of emphasis.
+
+@example
+begemph italic 46-3
+@end example
+
+@opcode{endemph, <emphasis class> <dot pattern>}
+Braille dot pattern to indicate the end of emphasis.
+
+@example
+endemph italic 46-36
+@end example
+
+@end table
+
+@node Letter
+@subsubsection Letter
+
+Some languages have special indicators for single letter emphasis.
+
+@table @code
+@opcode{emphletter, <emphasis class> <dot pattern>}
+Braille dot pattern to indicate that the next character is emphasized.
+
+@example
+emphletter italic 46-25
+@end example
+
+@end table
+
+@node Word
+@subsubsection Word
+
+Many languages have special indicators for emphasized words. Usually
+they start at the beginning of the word and and implicitly, i.e.
+without a closing indicator at the end of the word. There are also use
+cases where the emphasis starts in the middle of the word and an
+explicit closing indicator is required.
+
+@table @code
+@opcode{begemphword, <emphasis class> <dot pattern>}
+Braille dot pattern to indicate the beginning of an emphasized word
+or the beginning of emphasized characters within a word.
+
+@example
+begemphword underline 456-36
+@end example
+
+@opcode{endemphword, <emphasis class>  <dot pattern>}
+Generally emphasis with word context ends when the word ends. However
+when an indication is required to close a word emphasis then this
+opcode defines the Braille dot pattern that indicates the end of a word
+emphasis.
+
+@example
+endemphword transnote 6-3
+@end example
+
+If emphasis ends in the middle of a word the Braille dot pattern
+defined in this opcode is also used.
+
+@end table
+
+@node Phrase
+@subsubsection Phrase
+
+Many languages have a concept of a phrase where the emphasis is valid
+for a number of words. The beginning of the phase is indicated with a
+braille dot pattern and a closing indicator is put before or after the
+last word of the phrase. To define how many words are considered a
+phrase in your language use the @opcoderef{lenemphphrase}.
+
+@table @code
+@opcode{begemphphrase, <emphasis class> <dot pattern>}
+Braille dot pattern to indicate the beginning of a phrase.
+
+@example
+begemphphrase bold 456-46-46
+@end example
+
+@c define a special opcode macro that can handle the two-word nature
+@c of the endemphphrase opcode
+@macro endemphphraseopcode{where}
+@opcodeindex endemphphrase \where\
+@anchor{endemphphrase \where\ opcode}
+@item endemphphrase <emphasis class> \where\ <dot pattern>
+@end macro
+
+@endemphphraseopcode{before}
+Braille dot pattern to indicate the end of a phrase. The closing indicator
+will be placed before the last word of the phrase.
+
+@example
+endemphphrase bold before 456-46
+@end example
+
+@endemphphraseopcode{after}
+Braille dot pattern to indicate the end of a phrase. The closing
+indicator will be placed after the last word of the phrase. If both
+@code{endemphphrase <emphasis class> before} and @code{endemphphrase
+<emphasis class> after} are defined an error will be signaled.
+
+@example
+endemphphrase underline after 6-3
+@end example
+
+@opcode{lenemphphrase, <emphasis class> <number>}
+Define how many words are required before a sequence of words is
+considered a phrase.
+
+@example
+lenemphphrase underline 3
+@end example
+
+@end table
+
+@node Symbol
+@subsubsection Symbol
+UEB has a concept of symbols that need special indication. When the
+translator detects an emphasis sequence that needs to be indicated
+with the rules for a symbol then it will use the dots defined with the
+@opcoderef{emphletter}. To indicate the end of the symbol it will use
+the dots defined in the @opcoderef{endemphword}.
+
+@node Fallback behavior
+@subsection Fallback behavior
+
+Many braille systems either handle emphasis using no contexts or
+otherwise by employing a combination of the letter, word and phrase
+contexts. So if a table defines any opcodes for the letter, word or
+phrase contexts then liblouis will signal an error for opcodes that
+define emphasis with no context. In other words contrary to previous
+versions of liblouis there is no fallback behavior.
+
+As a consequence, there will only be emphasis for a context when the
+table defines it. So for example when defining a braille dot pattern
+for phrases and not for words liblouis will not indicate emphasis on
+words that aren't part of a phrase.
+
+@node Computer braille
+@subsection Computer braille
+
+For computer braille there are only two braille indicators, for the
+beginning and end of a sequence of characters to be rendered in
+computer braille. Such a sequence may also have other emphasis. The
+computer braille indicators are applied not only when computer braille
+is indicated in the @code{typeform} parameter, but also when a
+sequence of characters is determined to be computer braille because it
+contains a subsequence defined by the @opcoderef{compbrl}.
+
+@node Special Symbol Opcodes
+@section Special Symbol Opcodes
+
+These opcodes define certain symbols, such as the decimal point, which
+require special treatment.
+
+@table @code
+@opcode{decpoint, character dots}
+
+This opcode defines the decimal point. It is useful if your Braille
+code requires the decimal separator to show as a dot pattern different
+from the normal representation of this character, i.e. period or
+comma. In addition, it allows the notation @samp{.001} to be
+translated correctly. This notation is common in some languages
+instead of @samp{0.001} (no leading 0). When you use the
+@code{decpoint} opcode, the decimal point will be taken to be part of
+the number and correctly preceded by number sign.
+
+The character operand must have only one character. For example, in
+@file{en-us-g1.ctb} we have:
+
+@example
+decpoint . 46
+@end example
+
+@opcode{hyphen, character dots}
+This opcode defines the hyphen, that is, the character used in
+compound words such as @samp{have-nots}. The back-translator uses it
+to determine the end of individual words.
+
+@end table
+
+@node Special Processing Opcodes
+@section Special Processing Opcodes
+
+These opcodes cause special processing to be carried out.
+
+@table @code
+@opcode{capsnocont,}
+This opcode has no operands. If it is specified, words or parts of
+words in all caps are not contracted. This is needed for languages
+such as Norwegian.
+
+Note: If you use the capsnocont opcode and do not define the
+      @opcoderef{begcapsword} indicator, every cap will be marked with the
+@opcoderef{capsletter} indicator. This is useful if you need to process caps
+separately in a later pass.
+
+@end table
+
+@node Translation Opcodes
+@section Translation Opcodes
+
+These opcodes define the braille representations for character
+sequences. Each of them defines an entry within the contraction table.
+These entries may be defined in any order except, as noted below, when
+they define alternate representations for the same character sequence.
+
+Each of these opcodes specifies a condition under which the
+translation is legal, and each also has a characters operand and a
+dots operand. The text being translated is processed strictly from
+left to right, character by character, with the most eligible entry
+for each position being used. If there is more than one eligible entry
+for a given position in the text, then the one with the longest
+character string is used. If there is more than one eligible entry for
+the same character string, then the one defined first is is tested for
+legality first. (This is the only case in which the order of the
+entries makes a difference.)
+
+The characters operand is a sequence or string of characters preceded
+and followed by whitespace. Each character can be entered in the
+normal way, or it can be defined as a four-digit hexadecimal number
+preceded by @samp{\x}.
+
+The dots operand defines the braille representation for the characters
+operand. It may also be specified as an equals sign (@samp{=}). This
+means that the the default representation for each character
+(@pxref{Character-Definition Opcodes}) within the sequence is to be
+used. Note however that the @samp{=} shortcut for dot patterns is
+deprecated. Dot patterns should be written out. Otherwise
+back-translation may not be correct.
+
+In what follows the word @samp{characters} means a sequence of one or
+more consecutive letters between spaces and/or punctuation marks.
+
+@table @code
+
+@opcode{noback, opcode ...}
+This is an opcode prefix, that is to say, it modifies the operation of 
+the opcode that follows it on the same line. noback specifies that
+back-translation is not to use information on this line.
+
+@example
+noback always ;\s; 0
+@end example
+
+@opcode{nofor, opcode ...}
+This is an opcode prefix which modifies the operation of the opcode 
+following it on the same line. nofor specifies that forward translation 
+is not to use the information on this line.
+
+@opcode{compbrl, characters}
+If the characters are found within a block of text surrounded by
+whitespace the entire block is translated according to the default
+braille representations defined by the @ref{Character-Definition
+Opcodes}, if 8-dot computer braille is enabled or according to the dot
+patterns given in the @opcoderef{comp6}, if 6-dot computer braille is
+enabled. For example:
+
+@example
+compbrl www translate URLs in computer braille
+@end example
+
+@opcode{comp6, character dots}
+This opcode specifies the translation of characters in 6-dot computer
+braille. It is necessary because the translation of a single character
+may require more than one cell. The first operand must be a character
+with a decimal representation from 0 to 255 inclusive. The second
+operand may specify as many cells as necessary. The opcode is somewhat
+of a misnomer, since any dots, not just dots 1 through 6, can be
+specified. This even includes virtual dots (@pxref{virtual dots}).
+
+@opcode{nocont, characters}
+Like @code{compbrl}, except that the string is uncontracted.
+@opcoderef{prepunc} and @opcoderef{postpunc} rules are applied,
+however. This is useful for specifying that foreign words should not
+be contracted in an entire document.
+
+@opcode{replace, characters @{characters@}}
+Replace the first set of characters, no matter where they appear, with
+the second. Note that the second operand is @emph{NOT} a dot pattern.
+It is also optional. If it is omitted the character(s) in the first
+operand will be discarded. This is useful for ignoring characters. It
+is possible that the "ignored" characters may still affect the
+translation indirectly. Therefore, it is preferable to use
+@opcoderef{correct}.
+
+@opcode{always, characters dots}
+Replace the characters with the dot pattern no matter where they
+appear. Do @emph{NOT} use an entry such as @code{always a 1}. Use the
+@code{uplow}, @code{letter}, etc. character definition opcodes
+instead. For example:
+
+@example
+always world 456-2456 unconditional translation
+@end example
+
+@opcode{repeated, characters dots}
+Replace the characters with the dot pattern no matter where they
+appear. Ignore any consecutive repetitions of the same character
+sequence. This is useful for shortening long strings of spaces or
+hyphens or periods. For example:
+
+@example
+repeated --- 36-36-36 shorten separator lines made with hyphens
+@end example
+
+@opcode{repword, characters dots}
+When characters are encountered check to see if the word before this
+string matches the word after it. If so, replace characters with dots
+and eliminate the second word and any word following another
+occurrence of characters that is the same. This opcode is used in
+Malaysian braille. In this case the rule is:
+
+@example
+repword - 123456
+@end example
+
+@opcode{largesign, characters dots}
+Replace the characters with the dot pattern no matter where they
+appear. In addition, if two words defined as large signs follow each
+other, remove the space between them. For example, in
+@file{en-us-g2.ctb} the words @samp{and} and @samp{the} are both
+defined as large signs. Thus, in the phrase @samp{the cat and the dog}
+the space would be deleted between @samp{and} and @samp{the}, with the
+result @samp{the cat andthe dog}. Of course, @samp{and} and @samp{the}
+would be properly contracted. The term @code{largesign} is a bit of
+braille jargon that pleases braille experts.
+
+@opcode{word, characters dots}
+Replace the characters with the dot pattern if they are a word, that
+is, are surrounded by whitespace and/or punctuation.
+
+@opcode{syllable, characters dots}
+As its name indicates, this opcode defines a "syllable" which must be
+represented by exactly the dot patterns given. Contractions may not
+cross the boundaries of this "syllable" either from left or right. The
+character string defined by this opcode need not be a lexical
+syllable, though it usually will be. The equal sign in the following
+example means that the the default representation for each character
+within the sequence is to be used (@pxref{Translation Opcodes}):
+
+@example
+syllable horse = sawhorse, horseradish
+@end example
+
+@opcode{nocross, characters dots}
+Replace the characters with the dot pattern if the characters are all
+in one syllable (do not cross a syllable boundary). For this opcode to
+work, a hyphenation table must be included. If this is not done,
+@code{nocross} behaves like the @opcoderef{always}. For example, if
+the English Grade 2 table is being used and the appropriate
+hyphenation table has been included @code{nocross sh 146} will cause
+the @samp{sh} in @samp{monkshood} not to be contracted.
+
+@opcode{joinword, characters dots}
+Replace the characters with the dot pattern if they are a word which
+is followed by whitespace and a letter. In addition remove the
+whitespace. For example, @file{en-us-g2.ctb} has @code{joinword to
+235}. This means that if the word @samp{to} is followed by another
+word the contraction is to be used and the space is to be omitted. If
+these conditions are not met, the word is translated according to any
+other opcodes that may apply to it.
+
+@opcode{lowword, characters dots}
+Replace the characters with the dot pattern if they are a word
+preceded and followed by whitespace. No punctuation either before or
+after the word is allowed. The term @code{lowword} derives from the
+fact that in English these contractions are written in the lower part
+of the cell. For example:
+
+@example
+lowword were 2356
+@end example
+
+@opcode{contraction, characters}
+If you look at @file{en-us-g2.ctb} you will see that some words are
+actually contracted into some of their own letters. A famous example
+among braille transcribers is @samp{also}, which is contracted as
+@samp{al}. But this is also the name of a person. To take another
+example, @samp{altogether} is contracted as @samp{alt}, but this is
+the abbreviation for the alternate key on a computer keyboard.
+Similarly @samp{could} is contracted into @samp{cd}, but this is the
+abbreviation for compact disk. To prevent confusion in such cases, the
+letter sign (see @opcoderef{letsign}) is placed before such letter
+combinations when they actually are abbreviations, not contractions.
+The @code{contraction} opcode tells the translator to do this.
+
+@opcode{sufword, characters dots}
+Replace the characters with the dot pattern if they are either a word
+or at the beginning of a word.
+
+@opcode{prfword, characters dots}
+Replace the characters with the dot pattern if they are either a word
+or at the end of a word.
+
+@opcode{begword, characters dots}
+Replace the characters with the dot pattern if they are at the
+beginning of a word.
+
+@opcode{begmidword, characters dots}
+Replace the characters with the dot pattern if they are either at the
+beginning or in the middle of a word.
+
+@opcode{midword, characters dots}
+Replace the characters with the dot pattern if they are in the middle
+of a word.
+
+@opcode{midendword, characters dots}
+Replace the characters with the dot pattern if they are either in the
+middle or at the end of a word.
+
+@opcode{endword, characters dots}
+Replace the characters with the dot pattern if they are at the end of
+a word.
+
+@opcode{partword, characters dots}
+Replace the characters with the dot pattern if the characters are
+anywhere in a word, that is, if they are proceeded or followed by a
+letter.
+
+@opcode{exactdots, @@dots}
+Note that the operand must begin with an at sign (@samp{@@}). The dot
+pattern following it is evaluated for validity. If it is valid,
+whenever an at sign followed by this dot pattern appears in the source
+document it is replaced by the characters corresponding to the dot
+pattern in the output. This opcode is intended for use in liblouisutdml
+semantic-action files to specify exact dot patterns, as in
+mathematical codes. For example:
+
+@example
+exactdots @@4-46-12356
+@end example
+will produce the characters with these dot patterns in the output.
+
+@opcode{prepunc, characters dots}
+Replace the characters with the dot pattern if they are part of
+punctuation at the beginning of a word.
+
+@opcode{postpunc, characters dots}
+Replace the characters with the dot pattern if they are part of
+punctuation at the end of a word.
+
+@opcode{begnum, characters dots}
+Replace the characters with the dot pattern if they are at the
+beginning of a number, that is, before all its digits. For example, in
+@file{en-us-g1.ctb} we have @code{begnum # 4}.
+
+@opcode{midnum, characters dots}
+Replace the characters with the dot pattern if they are in the middle
+of a number. For example, @file{en-us-g1.ctb} has @code{midnum . 46}.
+This is because the decimal point has a different dot pattern than the
+period.
+
+@opcode{endnum, characters dots}
+Replace the characters with the dot pattern if they are at the end of
+a number. For example @file{en-us-g1.ctb} has @code{endnum th 1456}.
+This handles things like @samp{4th}. A letter sign is @emph{NOT}
+inserted.
+
+@opcode{joinnum, characters dots}
+Replace the characters with the dot pattern. In addition, if
+whitespace and a number follows omit the whitespace. This opcode can
+be used to join currency symbols to numbers for example:
+
+@example
+joinnum \x20AC 15 (EURO SIGN)
+joinnum \x0024 145 (DOLLAR SIGN)
+joinnum \x00A3 1234 (POUND SIGN)
+joinnum \x00A5 13456 (YEN SIGN)
+@end example
+
+@end table
+
+@node Character-Class Opcodes
+@section Character-Class Opcodes
+
+These opcodes define and use character classes. A character class
+associates a set of characters with a name. The name then refers to
+any character within the class. A character may belong to more than
+one class.
+
+The basic character classes correspond to the character definition
+opcodes, with the exception of the @opcoderef{uplow}, which defines
+characters belonging to the two classes @code{uppercase} and
+@code{lowercase}. These classes are:
+
+@table @code
+@item space
+Whitespace characters such as blank and tab
+@item digit
+Numeric characters
+@item letter
+Both uppercase and lowercase alphabetic characters
+@item lowercase
+Lowercase alphabetic characters
+@item uppercase
+Uppercase alphabetic characters
+@item punctuation
+Punctuation marks
+@item sign
+Signs such as percent (@samp{%})
+@item math
+Mathematical symbols
+@item litdigit
+Literary digit
+@item undefined
+Not properly defined
+
+@end table
+
+The opcodes which define and use character classes are shown below.
+For examples see @file{el.ctb}.
+
+@table @code
+
+@opcode{class, name characters}
+Define a new character class. The characters operand must be specified
+as a string. A character class may not be used until it has been
+defined.
+
+@opcode{after, class opcode ...}
+The specified opcode is further constrained in that the matched
+character sequence must be immediately preceded by a character
+belonging to the specified class. If this opcode is used more than
+once on the same line then the union of the characters in all the
+classes is used.
+
+@opcode{before, class opcode ...}
+The specified opcode is further constrained in that the matched
+character sequence must be immediately followed by a character
+belonging to the specified class. If this opcode is used more than
+once on the same line then the union of the characters in all the
+classes is used.
+
+@end table
+
+@node Swap Opcodes
+@section Swap Opcodes
+
+The swap opcodes are needed to tell the @opcoderef{context}, the
+@opcoderef{correct} and multipass opcodes which dot patterns to swap
+for which characters. There are three, @code{swapcd}, @code{swapdd}
+and @code{swapcc}. The first swaps dot patterns for characters. The
+second swaps dot patterns for dot patterns and the third swaps
+characters for characters. The first is used in the @code{context}
+opcode and the second is used in the multipass opcodes. Dot patterns
+are separated by commas and may contain more than one cell.
+
+@table @code
+
+@opcode{swapcd, name characters dots@comma{} dots@comma{} dots@comma{} ...}
+See above paragraph for explanation. For example:
+
+@example
+swapcd dropped 0123456789 356,2,23,...
+@end example
+
+@opcode{swapdd, name dots@comma{} dots@comma{} dots ... dotpattern1@comma{} dotpattern2@comma{} dotpattern3@comma{} ...}
+The @code{swapdd} opcode defines substitutions for the multipass
+opcodes. In the second operand the dot patterns must be single cells,
+but in the third operand multi-cell dot patterns are allowed. This is
+because multi-cell patterns in the second operand would lead to
+ambiguities.
+
+@opcode{swapcc, name characters characters} 
+The @code{swapcc} opcode swaps characters in its second operand for
+characters in the corresponding places in its third operand. It is
+intended for use with @code{correct} opcodes and can solve problems
+such as formatting phone numbers.
+
+@end table
+
+@node The Context and Multipass Opcodes
+@section The Context and Multipass Opcodes
+
+The @code{context} and multipass opcodes (@code{pass2}, @code{pass3}
+and @code{pass4}) provide translation capabilities beyond those of the
+basic translation opcodes (@pxref{Translation Opcodes}) discussed
+previously. The multipass opcodes cause additional passes to be made
+over the string to be translated. The number after the word
+@code{pass} indicates in which pass the entry is to be applied. If no
+multipass opcodes are given, only the first translation pass is made.
+The @code{context} opcode is basically a multipass opcode for the
+first pass. It differs slightly from the multipass opcodes per se.
+When back-translating, the passes are performed in the reverse order, i.e.
+@code{pass4}, @code{pass3}, @code{pass2}, @code{context}.
+Each of these opcodes must be prefixed by either
+the @opcoderef{noback} or the @opcoderef{nofor}.
+The format of all these opcodes is @code{opcode test action}.
+The specific opcodes are invoked as follows:
+
+@table @code
+@anchor{context opcode}
+@opcodeindex context
+@opcodeindex pass2
+@opcodeindex pass3
+@opcodeindex pass4
+@item context test action
+@itemx pass2 test action
+@itemx pass3 test action
+@itemx pass4 test action
+@end table
+
+The @code{test} and @code{action} operands have suboperands. Each
+suboperand begins with a non-alphanumeric character and ends when
+another non-alphanumeric character is encountered. The suboperands and
+their initial characters are as follows.
+
+@table @kbd
+@item " (double quote)
+a string of characters. This string must be terminated by another
+double quote. It may contain any characters. If a double quote is
+needed within the string, it must be preceded by a backslash
+(@samp{\}). If a space is needed, it must be represented by the escape
+sequence \s. This suboperand is valid
+in the test and action parts of the @code{correct} opcode,
+in the test part of the @code{context} opcode when forward translating,
+and in the action part of the @code{context} opcode when back translating.
+
+@item @@ (at sign)
+a sequence of dot patterns. Cells are separated by hyphens as usual.
+This suboperand is valid in the test and action parts of
+the @code{pass2}, @code{pass3}, and @code{pass4} opcodes,
+in the action part of the @code{context} opcode when forward translating,
+and in the test part of the @code{context} opcode when back translating.
+
+@item ` (accent mark)
+If this is the beginning of the string being translated this
+suboperand is true. It is valid only in the test part and must be the
+first thing in this operand.
+
+@item ~ (tilde)
+If this is the end of the string being translated this suboperand is
+true. It is valid only in the test part and must be the last thing in
+this operand.
+
+@item $ (dollar sign)
+a string of attributes, such as @samp{d} for digit, @samp{l} for
+letter, etc. More than one attribute can be given. If you wish to
+check characters with any attribute, use the letter @samp{a}. Input
+characters are checked to see if they have at least one of the
+attributes. The attribute string can be followed by numbers specifying
+how many characters are to be checked. If no numbers are given, 1 is
+assumed. If two numbers separated by a hyphen are given, the input is
+checked to make sure that at least the first number of characters with
+the attributes are present, but no more than the second number. If
+only one number is present, then exactly that many characters must
+have the attributes. A period instead of the numbers indicates an
+indefinite number of characters (for technical reasons the number of
+characters that are actually matched is limited to 65535).
+
+This suboperand is valid in all test parts but not in action parts.
+For the characters which can be used in attribute strings, see the
+following table.
+
+@item ! (exclamation point)
+reverses the logical meaning of the suboperand which follows. For
+example, !$d is true only if the character is @emph{NOT} a digit. This
+suboperand is valid in test parts only.
+
+@item % (percent sign)
+the name of a class defined by the @opcoderef{class} or the name of a
+swap set defined by the swap opcodes (@pxref{Swap Opcodes}). Names may
+contain only letters. The letters may be upper or
+lower-case. The case matters. Class names may be used in test parts
+only. Swap names are valid everywhere.
+
+@item  @{ (left brace)
+Name: the name of a grouping pair. The left brace indicates that the
+first (or left) member of the pair is to be used in matching. If this
+is between replacement brackets it must be the only item. This is also
+valid in the action part.
+
+@item  @} (right brace)
+Name: the name of a grouping pair. The right brace indicates that the
+second (or right) member is to be used in matching. See the remarks on
+the left brace immediately above.
+
+@item / (slash)
+Search the input for the expression following the slash and return
+true if found. This can be used to set a variable.
+
+@item _ (underscore)
+Move backward. If a number follows, move backward that number of
+characters. The default is to move backward one character. This
+suboperand is valid only in test parts. The test fails if moving
+backward beyond the beginning of the input string.
+
+@item [ (left bracket)
+start replacement here. This suboperand must always be paired with a
+right bracket and is valid only in test parts. Multiple pairs of
+square brackets in a single expression are not allowed.
+
+@item ] (right bracket)
+end replacement here. This suboperand must always be paired with a
+left bracket and is valid only in test parts.
+
+@item # (number sign or crosshatch)
+test or set a variable. Variables are referred to by numbers
+(0 through 49), e.g. @code{#1}, @code{#2}, @code{#25}.
+Variables may be set by one @code{context} or multipass opcode and tested
+by another. Thus, an operation that occurs at one place in a translation
+can tell an operation that occurs later within the same pass about itself.
+This feature is used in math translation, and may also help to alleviate
+the need for new opcodes. This suboperand is valid everywhere.
+
+Variables are set in the action part. To set a variable, use an
+expression like @code{#1=1}. All of the variables are initialized to 0
+at the start of each pass.
+
+Variables can also be incremented and decremented by one in the action
+part with expressions like @code{#1+} and @code{#3-} respectively.
+An attempt to decrement a variable below 0 is silently ignored.
+
+Variables are tested in the test part with conditional expressions like:
+@code{#1=2}, @code{#3<4}, @code{#5>6}, @code{#7<=8}, @code{#9>=10}.
+
+@item * (asterisk)
+Copy the input characters or dot patterns within the replacement brackets
+into the output, and discard anything else that was matched. If there are
+no replacement brackets then copy all of the matched input. This
+suboperand is only valid within the action part. It may be specified any
+number of times. This feature is used, for example, for handling numeric
+subscripts in Nemeth.
+
+@item ? (question mark)
+Valid only in the action part. The characters to be replaced are
+simply ignored. That is, they are replaced with nothing. If either
+member of a grouping pair is in the replace brackets the other member
+at the same level is also removed.
+
+@end table
+
+The characters which can be used in attribute strings are as follows:
+
+@table @kbd
+@item a 
+any attribute
+@item d 
+digit
+@item D 
+literary digit
+@item l 
+letter
+@item m 
+math
+@item p 
+punctuation
+@item S 
+sign
+@item s 
+space
+@item U 
+uppercase
+@item u 
+lowercase
+@item w 
+first user-defined class
+@item x 
+second user-defined class
+@item y 
+third user-defined class
+@item z 
+fourth user-defined class
+@end table
+
+The following illustrates the algorithm how text is evaluated with
+multipass expressions:
+
+@noindent
+Loop over context, pass2, pass3 and pass4 and do the following for each pass:
+
+@enumerate a
+@item
+Match the text following the cursor against all expressions in the
+current pass
+@item
+If there is no match: shift the cursor one position to the right and
+continue the loop
+@item
+If there is a match: choose the longest match
+@item
+Do the replacement (everything between square brackets)
+@item
+Place the cursor after the replaced text
+@item
+continue loop
+@end enumerate
+
+@node The correct Opcode
+@section The correct Opcode
+
+@table @code
+@opcode{correct, test action}
+Because some input (such as that from an OCR program) may contain
+systematic errors, it is sometimes advantageous to use a
+pre-translation pass to remove them. The errors and their corrections
+are specified by the @code{correct} opcode. If there are no
+@code{correct} opcodes in a table, the pre-translation pass is not used.
+If any back-translation corrections have been specified then they are
+applied in a post-translation (i.e. the very last) pass.
+
+Note that like the @opcoderef{context} and multi-pass opcodes, the
+@code{correct} opcode must be preceded by @opcoderef{noback} or
+@opcoderef{nofor}.
+
+The format of the @code{correct} opcode is very similar to that
+of the @opcoderef{context}. The only difference is that in the action
+part strings may be used and dot patterns may not be used. Some
+examples of @code{correct} opcode entries are:
+
+@example
+noback correct "\\" ? Eliminate backslashes
+noback correct "cornf" "comf" fix a common "scano"
+noback correct "cornm" "comm"
+noback correct "cornp" "comp"
+noback correct "*" ? Get rid of stray asterisks
+noback correct "|" ? ditto for vertical bars
+noback correct "\s?" "?" drop space before question mark
+@end example
+
+@end table
+
+@node The match Opcode
+@section The match Opcode
+
+The match opcode is similar the multipass opcodes and can be seen as
+the more low-level and powerful cousin to the @opcoderef{context}.
+
+@strong{Note:} For historical reasons despite being fairly similar in
+syntax and functionality both the @opcoderef{context} and the
+@opcoderef{match} exist and are in use in modern braille tables. But
+in the future they might be merged under some common opcode. For that
+reason consider the match opcode @emph{somewhat experimental}.
+
+@table @code
+@opcode{match, pre-pattern characters post-pattern dots}
+
+This opcode allows for matching a string of characters via @emph{pre}
+and @emph{post patterns}. The patterns are specified using an
+expression syntax somewhat like regular expressions (@pxref{pattern
+expression syntax}). A single hyphen (@samp{-}) by itself means no
+pattern is specified.
+
+The following will replace @samp{xyz} with the dots
+@samp{1346-13456-1356} when it appears in the string @samp{abxyzcd}.
+
+@example
+match ab xyz cd 1346-13456-1356
+@end example
+
+The following will replace @samp{ONE} with @samp{3456-1} when it
+starts the input and is followed by @samp{:}
+
+@example
+match ^ ONE : 3456-1
+@end example
+@end table
+
+@anchor{pattern expression syntax}
+The @code{pre-pattern} and the @code{post-pattern} can contain
+any of the following expressions:
+
+@table @samp
+@item [ ]
+Expression can be any of the characters between the brackets. If only
+one character present then the brackets are not needed unless it is a
+special character, in which it should be escaped with the backslash.
+
+@item .
+Expression can be any character.
+
+@item %[ ]
+Expression is a character with the attributes listed between the
+brackets. If only one character is present then the brackets are not
+needed. The set of attributes are specified as follows:
+
+@table @samp
+@item _
+space
+@item #
+digit
+@item a
+letter
+@item u
+uppercase
+@item l
+lowercase
+@item .
+punctuation
+@item $
+sign
+@end table
+
+@item ^
+Match at the end of input processing (or beginning depending of the
+direction pre or post).
+
+@item $
+Same as @samp{^}.
+@end table
+
+For example the following will replace @samp{bb} with the dots @samp{23} when it
+is between letters.
+
+@example
+match %a bb %a 23
+@end example
+
+The following will replace @samp{con} with the dots @samp{25} when it
+is preceded by a space or beginning of input, and followed by an
+@samp{s} and then any letter.
+
+@example
+match %[^_] con s%a 25
+@end example
+
+Similar to regular expressions the pattern expressions can contain
+grouping, quantifiers and even negation:
+
+@table @samp
+@item ( )
+Expressions between parentheses are grouped together as one
+expression.
+
+@item !
+The following expression is negated.
+
+@item ?
+The previous expression must match zero or one times.
+
+@item *
+The previous expression must match zero or more times.
+
+@item +
+The previous expression must match one or more times.
+
+@item |
+Either the previous or the following expressions must match.
+@end table
+
+For example the following will replace @samp{ing} with the dots
+@samp{346} when it is @emph{not} preceded by a space or beginning of
+input. What follows after the @samp{ing} does not matter, hence the
+@samp{-}.
+
+@example
+!%[^_] ing - 346
+@end example
+
+The following will replace @samp{con} with the dots @samp{25} when it
+is preceded by a space, or beginning of input; then followed by a
+@samp{c} that is followed by any character but @samp{h}.
+
+@example
+match %[^_] con c!h 25
+@end example
+
+@node Miscellaneous Opcodes
+@section Miscellaneous Opcodes
+
+@table @code
+@opcode{include, filename}
+Read the file indicated by @code{filename} and incorporate or include
+its entries into the table. Included files can include other files,
+which can include other files, etc. For an example, see what files are
+included by the entry include @file{en-us-g1.ctb} in the table
+@file{en-us-g2.ctb}. If the included file is not in the same directory
+as the main table, use a full path name for filename.
+
+@opcode{locale, characters}
+Not implemented, but recognized and ignored for backward
+compatibility.
+
+@opcode{undefined, dots}
+If this opcode is used in a table any characters which have not been
+defined in the table but are encountered in the text will be replaced
+by the dot pattern. If this opcode is not used, any undefined
+characters are replaced by @code{'\xhhhh'}, where the h's are
+hexadecimal digits.
+
+@opcode{display, character dots}
+Associates dot patterns with the characters which will be sent to a
+braille embosser, display or screen font. The character must be in the
+range 0-255 and the dots must specify a single cell. Here are some
+examples:
+
+@example
+# When the character a is sent to the embosser or display,
+# it will produce a dot 1.
+display a 1
+@end example
+
+@example
+# When the character L is sent to the display or embosser
+# it will produce dots 1-2-3.
+display L 123
+@end example
+
+The @code{display} opcode is optional. It is used when the embosser or
+display has a different mapping of characters to dot patterns than
+that given in @ref{Character-Definition Opcodes}. If used, display
+entries must proceed character-definition entries.
+
+A possible use case would be to define display opcodes so that the
+result is Unicode braille for use on a display and a second set of
+display opcodes (in a different file) to produce plain ASCII braille
+for use with an embosser.
+
+@opcode{multind, dots opcode opcode ...}
+The @code{multind} opcode tells the back-translator that a sequence of
+braille cells represents more than one braille indicator. For example,
+in @file{en-us-g2.ctb} we have @code{multind 56-6 letsign capsletter}.
+The back-translator can generally handle single braille indicators,
+but it cannot apply them when they immediately follow each other. It
+recognizes the letter sign if it is followed by a letter and takes
+appropriate action. It also recognizes the capital sign if it is
+followed by a letter. But when there is a letter sign followed by a
+capital sign it fails to recognize the letter sign unless the sequence
+has been defined with @code{multind}. A @code{multind} entry may not
+contain a comment because liblouis would attempt to interpret it as an
+opcode.
+
+@end table
+
+@node Notes on Back-Translation
+@chapter Notes on Back-Translation
+
+@anchor{General Notes}
+@section General Notes
+
+Back-translation refers to the process of translating backwards, i.e.
+from Braille to text. For many years, Liblouis was mainly concerned
+with forward translation, and so were most of the authors of the
+translation tables. Today however, Liblouis is being used extensively
+in conjunction with screen reading programs like NVDA and JAWS for
+Windows as well as Braille note-takers like BrailleSense from HIMS and
+BrailleNote from HumanWare. So when writing a translation table for
+Liblouis, it is indeed relevant to consider how the table will work
+when used for back-translation, if anything special must be done, or if
+you want to write separate tables for forward translation and
+back-translation.
+
+Back-translation is generally harder to do in a computer program than
+forward translation. Ideally, any text could be translated to Braille
+and then translated back to text giving exactly the same result as the
+original. However, many Braille codes omit a lot of information and
+leaves it to the reader to fill in the missing bits. An example of this
+is letters with accents. In languages where accents are uncommon, e.g.
+English, Accented letters are usually just marked with a Braille
+indicator stating that there is an accent, but not which accent, even
+though this may be crucial to the meaning of the word or the sentence.
+Another example of this is when not all capital letters are marked in
+the Braille code, but only the "important" capital letters. A third
+example is when a Braille character serves as both a punctuation sign,
+a math sign, and perhaps even as a contraction, and the Braille code
+then leaves it up to the reader to use his/her knowledge of the context
+to decide the meaning of the Braille character.
+
+In some cases, you may need to bend the rules of the Braille code if it
+is important to create Braille that can be properly back-translated.
+This may include marking all capital letters instead of just the
+"important" ones, or perhaps marking a Braille character with an
+indicator stating that this character should in fact be interpreted as
+a math sign and not a punctuation or Braille contraction. In some
+cases, the best solution may be to create two separate sets of tables
+for forward translation: One set for Braille that must be
+back-translatable (for use with screen readers and note-takers), and
+another for good and nice literary Braille (for embossing).
+But no matter how you bend the Braille code, the back-translation
+process may not be perfect.
+
+@anchor{Back-translation with Liblouis}
+@section Back-translation with Liblouis
+
+Back-translation is carried out by the function
+@code{lou_backTranslateString}. Its calling sequence is described in
+@ref{Programming with liblouis}. @code{lou_backTranslateString} first
+performs @code{pass4}, if
+present, then @code{pass3}, then @code{pass2}, then the
+backtranslation, then corrections. Note that this is exactly the
+inverse of forward translation.
+
+Most opcodes can be preceded by @opcoderef{noback} or @opcoderef{nofor},
+and the @code{correct}, @code{context} and multi-pass opcodes must be
+preceded with either @code{noback} or @code{nofor}. So in most cases,
+it will be perfectly possible to make one table for translation in both
+directions, although a separate table for forward and backward
+translation might be more readable in some cases.
+
+Most of the opcodes associated with pass 1 have two operands, a
+character operand to the left and a dots operand to the right. During
+forward translation, these operands are used to replace the characters
+with the dot pattern according to the conditions of the opcode. The
+opcode works from left to right. When back-translating, these opcodes
+work the opposite way. The dot patterns are replaced by the text. The
+opcodes work from right to left.
+
+On the other hand, the @code{correct}, @code{context} and multi-pass
+opcodes have a test part to the left and an action part to the right.
+These opcodes work from left to right in both translation directions.
+The test is performed, and if true, the action is executed, i.e.
+replacing, inserting or deleting characters or dots. This is why a
+translation direction always has to be specified with these opcodes
+using @code{noback} or @code{nofor}.
+
+@node Table Metadata
+@chapter Table Metadata
+
+Translation tables may contain metadata. This makes them
+discoverable. Programs may for example use the Liblouis function
+@ref{lou_findTable,@code{lou_findTable}} to find a table based on a
+special query of which the @ref{Query Syntax,syntax} is described
+below.
+
+@section Syntax
+
+Metadata must be defined in special comments within the table
+header. The table header is the area at the top of the file, before
+the first translation rule, consisting of only comments or empty
+lines. Any metadata within included tables is ignored.
+
+A metadata field must be defined on its own line, starting with
+@code{#+}. It has the following syntax:
+
+@example
+#+<key>: <value>
+@end example
+
+where @samp{<key>} and @samp{<value>} are sequences of
+one or more characters @code{0} to @code{9}, @code{a} to @code{z},
+@code{A} tot @code{Z}, @code{-} and @code{_}. The colon that separates
+the key and value may have zero or more spaces or tabs on either side.
+
+A value is optional. In case of no value the colon must be omitted as
+well:
+
+@example
+#+<key>
+@end example
+
+There is no restriction on which keys and values are allowed, as long
+as the syntax is correct. However in order to be really useful there
+must be some standard keys and values. A possible grammar is proposed
+on the wiki page
+@url{https://github.com/liblouis/liblouis/wiki/Table-discovery-based-on-table-metadata#standard-metadata-tags, Standard metadata tags}.
+
+@anchor{Query Syntax}
+@section Query Syntax
+
+A query that is passed to the @ref{lou_findTable,@code{lou_findTable}}
+function must have the following syntax:
+
+@example
+<feature1> <feature2> <feature3> ...
+@end example
+
+where @samp{<feature>} is either:
+
+@example
+<key>: <value>
+@end example
+
+or:
+
+@example
+<key>
+@end example
+
+Features are separated by one or more spaces or tabs. No spaces are
+allowed around colons.
+
+@node Testing Translation Tables interactively
+@chapter Testing Translation Tables interactively
+
+A number of test programs are provided as part of the liblouis
+package. They are intended for testing liblouis and for debugging
+tables. None of them is suitable for braille transcription. An
+application that can be used for transcription is @command{file2brl},
+which is part of the liblouisutdml package (@pxref{Top, , Introduction,
+liblouisutdml, Liblouisutdml User's and Programmer's Manual}). The source
+code of the test programs can be studied to learn how to use the
+liblouis library and they can be used to perform the following
+functions.
+
+@anchor{common options}
+All of these programs recognize the @option{--help} and
+@option{--version} options.
+
+@table @option
+
+@item --help
+@itemx -h
+Print a usage message listing all available options, then exit
+successfully.
+
+@item --version
+@itemx -v
+Print the version number, then exit successfully.
+
+@end table
+
+Most test programs let you specify one or multiple tables to use.
+These tables are usually found in standard locations in the file
+system or local to where the command is executed. @xref{How tables are
+found}, for a description on how the tables are located.
+
+@menu
+* lou_debug::
+* lou_trace::
+* lou_checktable::
+* lou_allround::
+* lou_translate (program)::
+* lou_checkhyphens::
+* lou_checkyaml::
+@end menu
+
+@node lou_debug
+@section lou_debug
+@pindex lou_debug
+
+The @command{lou_debug} tool is intended for debugging liblouis
+translation tables. The command line for @command{lou_debug} is:
+
+@example
+lou_debug [OPTIONS] TABLE[,TABLE,...]
+@end example
+
+The command line options that are accepted by @command{lou_debug} are
+described in @ref{common options}.
+
+The table (or comma-separated list of tables) is compiled. If no
+errors are found a brief command summary is printed, then the prompt
+@samp{Command:}. You can then input one of the command letters and get
+output, as described below.
+
+Most of the commands print information in the various arrays of
+@code{TranslationTableHeader}. Since these arrays are pointers to
+chains of hashed items, the commands first print the hash number, then
+the first item, then the next item chained to it, and so on. After
+each item there is a prompt indicated by @samp{=>}. You can then press
+enter (@kbd{@key{RET}}) to see the next item in the chain or the first
+item in the next chain. Or you can press @kbd{h} (for next-(h)ash) to
+skip to the next hash chain. You can also press @kbd{e} to exit the
+command and go back to the @samp{command:} prompt.
+
+@table @kbd
+@item h
+Brings up a screen of somewhat more extensive help.
+
+@item f
+Display the first forward-translation rule in the first non-empty hash
+bucket. The number of the bucket is displayed at the beginning of the
+chain. Each rule is identified by the word @samp{Rule:}. The fields
+are displayed by phrases consisting of the name of the field, an equal
+sign, and its value. The before and after fields are displayed only if
+they are nonzero. Special opcodes such as the @opcoderef{correct} and
+the multipass opcodes are shown with the code that instructs the
+virtual machine that interprets them. If you want to see only the
+rules for a particular character string you can type @kbd{p} at the
+@samp{command:} prompt. This will take you to the @samp{particular:}
+prompt, where you can press @kbd{f} and then type in the string. The
+whole hash chain containing the string will be displayed.
+
+@item b
+Display back-translation rules. This display is very similar to that
+of forward translation rules except that the dot pattern is displayed
+before the character string.
+
+@item c
+Display character definitions, again within their hash chains.
+
+@item d
+Displays single-cell dot definitions. If a character-definition opcode
+gives a multi-cell dot pattern, it is displayed among the
+back-translation rules.
+
+@item C
+Display the character-to-dots map. This is set up by the
+character-definition opcodes and can also be influenced by the
+@opcoderef{display}.
+
+@item D
+Display the dot to character map, which shows which single-cell dot
+patterns map to which characters.
+
+@item z
+Show the multi-cell dot patterns which have been assigned to the
+characters from 0 to 255 to comply with computer braille codes such as
+a 6-dot code. Note that the character-definition opcodes should use
+8-dot computer braille.
+
+@item p
+Bring up a secondary (@samp{particular:}) prompt from which you can
+examine particular character strings, dot patterns, etc. The commands
+(given in its own command summary) are very similar to those of the
+main @samp{command:} prompt, but you can type a character string or
+dot pattern. They include @kbd{h}, @kbd{f}, @kbd{b}, @kbd{c}, @kbd{d},
+@kbd{C}, @kbd{D}, @kbd{z} and @kbd{x} (to exit this prompt), but not
+@kbd{p}, @kbd{i} and @kbd{m}.
+
+@item i
+Show braille indicators. This shows the dot patterns for various
+opcodes such as the @opcoderef{capsletter} and the @opcoderef{numsign}.
+It also shows emphasis dot patterns, such as those for the
+@opcoderef{begemphword}, the @opcoderef{begemphphrase}, etc. If a
+given opcode has not been used nothing is printed for it.
+
+@item m
+Display various miscellaneous information about the table, such as the
+number of passes, whether certain opcodes have been used, and whether
+there is a hyphenation table.
+
+@item q
+Exit the program.
+@end table
+
+@node lou_trace
+@section lou_trace
+@pindex lou_trace
+
+When working on translation tables it is sometimes useful to determine
+what rules were applied when translating a string. @command{lou_trace}
+helps with exactly that. It list all the the applied rules for a given
+translation table and an input string.
+
+@example
+lou_trace [OPTIONS] TABLE[,TABLE,...]
+@end example
+
+Aside from the standard options (@pxref{common options})
+@command{lou_trace} also accepts the following options:
+
+@table @option
+
+@item --forward
+@itemx -f
+Trace a forward translation.
+
+@item --backward
+@itemx -b
+Trace a backward translation.
+
+@end table
+
+If no options are given forward translation is assumed.
+
+Once started you can type an input string followed by @kbd{@key{RET}}.
+@command{lou_trace} will print the braille translation followed by
+list of rules that were applied to produce the translation. A possible
+invocation is listed in the following example:
+
+@example
+$ lou_trace tables/en-us-g2.ctb 
+the u.s. postal service
+! u4s4 po/al s@}vice
+1.      largesign       the     2346
+2.      repeated                0
+3.      lowercase       u       136
+4.      punctuation     .       46
+5.      context _$l["."]$l      @@256
+6.      lowercase       s       234
+7.      postpunc        .       256
+8.      repeated                0
+9.      begword post    1234-135-34
+10.     largesign       a       1
+11.     lowercase       l       123
+12.     repeated                0
+13.     lowercase       s       234
+14.     always  er      12456
+15.     lowercase       v       1236
+16.     lowercase       i       24
+17.     lowercase       c       14
+18.     lowercase       e       15
+19.     pass2   $s1-10  @@0
+20.     pass2   $s1-10  @@0
+21.     pass2   $s1-10  @@0
+@end example
+
+@node lou_checktable
+@section lou_checktable
+@pindex lou_checktable
+
+To use this program type the following:
+
+@example
+lou_checktable [OPTIONS] TABLE
+@end example
+
+Aside from the standard options (@pxref{common options})
+@command{lou_checktable} also accepts the following options:
+
+@table @option
+
+@item --quiet
+@itemx -q
+Do not write to standard error if there are no errors.
+
+@end table
+
+If the table contains errors, appropriate messages will be displayed.
+If there are no errors the message @samp{no errors found.} will be
+shown.
+
+@node lou_allround
+@section lou_allround
+@pindex lou_allround
+
+This program tests every capability of the liblouis library. It is
+completely interactive. Invoke it as follows:
+
+@example
+lou_allround [OPTIONS]
+@end example 
+
+The command line options that are accepted by @command{lou_allround}
+are described in @ref{common options}.
+
+You will see a few lines telling you how to use the program. Pressing
+one of the letters in parentheses and then enter will take you to a
+message asking for more information or for the answer to a yes/no
+question. Typing the letter @samp{r} and then @key{RET} will take you
+to a screen where you can enter a line to be processed by the library
+and then view the results.
+
+@node lou_translate (program)
+@section lou_translate
+@pindex lou_translate
+
+This program translates whatever is on the standard input unit and
+prints it on the standard output unit. It is intended for large-scale
+testing of the accuracy of translation and back-translation. The
+command line for @command{lou_translate} is:
+
+@example
+lou_translate [OPTION] TABLE[,TABLE,...]
+@end example
+
+Aside from the standard options (@pxref{common options}) this program
+also accepts the following options:
+
+@table @option
+
+@item --forward
+@itemx -f
+Do a forward translation.
+
+@item --backward
+@itemx -b
+Do a backward translation.
+
+@end table
+
+If no options are given forward translation is assumed.
+
+Use the following command to do a forward translation with translation
+table @file{en-us-g2.ctb}. The resulting braille is ASCII encoded (as
+defined in @file{en-us-g2.ctb}).
+
+@example
+lou_translate --forward en-us-g2.ctb < input.txt
+@end example
+
+The next example illustrates a forward translation with translation
+table @file{en-us-g2.ctb} and display table @file{unicode.dis}. The
+resulting braille is encoded as Unicode dot patterns (as defined in
+@file{unicode.dis}).
+
+@example
+lou_translate --forward unicode.dis,en-us-g2.ctb < input.txt
+@end example
+
+Use a pipe if you would rather just pass some given text to the
+translator.
+
+@example
+echo "The quick brown fox jumps over the lazy dog" | lou_translate -f unicode.dis,en-us-g2.ctb
+@end example
+
+The result will be written to standard output:
+
+@example
+⠠⠮ ⠟⠅ ⠃⠗⠪⠝ ⠋⠕⠭ ⠚⠥⠍⠏⠎ ⠕⠧⠻ ⠮ ⠇⠁⠵⠽ ⠙⠕⠛
+@end example
+
+Backward translation can be done as follows:
+
+@example
+echo ",! qk br@{n fox jumps ov@} ! lazy dog" | lou_translate --backward en-us-g2.ctb
+@end example
+
+which results in
+
+@example
+The quick brown fox jumps over the lazy dog
+@end example
+
+You can also do a backward translation using Unicode dot patterns
+
+@example
+echo "⠠⠮ ⠟⠅ ⠃⠗⠪⠝ ⠋⠕⠭" | lou_translate --backward unicode.dis,en-us-g2.ctb
+@end example
+
+resulting in
+
+@example
+The quick brown fox
+@end example
+
+@node lou_checkhyphens
+@section lou_checkhyphens
+@pindex lou_checkhyphens
+
+This program checks the accuracy of hyphenation in Braille translation
+for both translated and untranslated words. It is completely
+interactive. Invoke it as follows:
+
+@example
+lou_checkhyphens [OPTIONS]
+@end example 
+
+The command line options that are accepted by
+@command{lou_checkhyphens} are described in @ref{common options}.
+
+You will see a few lines telling you how to use the program.
+
+@node lou_checkyaml
+@section lou_checkyaml
+@pindex lou_checkyaml
+
+This program tests a liblouis table against a corpus of known good
+Braille translations defined in YAML format. For a description of the
+format refer to @ref{YAML Tests}. The program returns 0 if all tests
+pass or 1 if any of the tests fail. Invoke it as follows:
+
+@example
+lou_checkyaml YAML_TEST_FILE
+@end example
+
+The command line options that are accepted by
+@command{lou_checkyaml} are described in @ref{common options}.
+
+@cindex Running YAML tests manually
+@cindex Running individual YAML tests
+Due to some technical limitations the YAML tests work best if the
+@env{LOUIS_TABLEPATH} is set up correctly. By running @command{make}
+this is all taken care for you. You can also run individual YAML tests
+as shown in the following example:
+
+@example
+cd tests
+make check TESTS=yaml/en-ueb-g2_backward.yaml
+@end example
+
+@node Automated Testing of Translation Tables
+@chapter Automated Testing of Translation Tables
+
+There are a number of automated tests for liblouis and they are
+proving to be of tremendous value. When changing the code the
+developers can run the tests to see if anything broke.
+
+The easiest way to test the translation tables is to write a YAML file
+where you define the table that is to be tested and any number of
+words or phrases to translate together with their respective expected
+translation.
+
+The YAML tests are data driven, i.e. you give the test data, a string
+to translate and the expected output. The data is in a standard format
+namely YAML. If you have @file{libyaml} installed they will
+automatically be invoked as part of the standard @command{make check}
+command.
+
+@anchor{YAML Tests}
+@section YAML Tests
+@url{http://yaml.org/,YAML} is a human readable data serialization
+format that allows for an easy and compact way to define tests.
+
+A YAML file first defines which tables are to be used for the tests.
+Then it optionally defines flags such as the @samp{testmode}. Finally
+all the tests are defined.
+
+Let's just look at a simple example how tests could be defined:
+
+@iftex
+@emph{(For technical reasons the Unicode braille in the expected
+translation in the following YAML examples is not displayed correctly.
+Please refer to the example YAML file @file{example_test.yaml} in the
+@file{tests} directory of the source distribution or read these
+examples in another version of the documentation such as HTML)}
+@end iftex
+
+@example
+# comments start with '#' anywhere on a line
+# first define which tables will be used for your tests
+table: [unicode.dis, en-ueb-g1.ctb]
+
+# then optionally define flags such as testmode. If no flags are
+# defined forward translation is assumed
+
+# now define the tests
+tests:
+  - # each test is a list.
+    # The first item is the string to translate. Quoting of strings is
+    # optional
+    - hello
+    # The second item is the expected translation
+    - ⠓⠑⠇⠇⠕
+  - # optionally you can define additional parameters in a third
+    # item such as typeform or expected failure, etc
+    - Hello
+    - ⠨⠶⠠⠓⠑⠇⠇⠕⠨⠄
+    - @{typeform: @{italic: '++++ '@}, xfail: true@}
+  - # a simple, no-frills test
+    - Good bye
+    - ⠠⠛⠕⠕⠙ ⠃⠽⠑
+  # same as above using "flow style" notation
+  - [Good bye,  ⠠⠛⠕⠕⠙ ⠃⠽⠑]
+@end example
+
+The three basic components of a test file are as follows:
+
+@table @samp
+@item tables
+A list containing table names, which the tests should be run against.
+This is usually just one table, but for some situations more than one
+table can be required.
+
+To test the @file{en-ueb-g1.ctb} table using unicode braille you could
+use the following definition:
+
+@example
+table: [unicode.dis, en-ueb-g1.ctb]
+@end example
+
+If you wanted to test the @file{eo-g1.ctb} table using brf notation
+then you would use the following definition:
+
+@example
+table: [en-us-brf.dis, eo-g1.ctb]
+@end example
+
+@item flags
+The flags that apply for all tests in this file. At the moment only
+the @samp{testmode} flag is supported. It can have three possible
+values:
+
+@table @samp
+@item forward
+This indicates that the tests are for forward translation
+@item backward
+This indicates that the tests are for backward translation
+@item hyphenate
+This indicates that the tests are for hyphenation
+@end table
+
+If no flags are defined forward translation is assumed.
+
+@item tests
+A list of tests. Each test consists of a list of two, three or in some
+cases even four items. The first item is the unicode text to be
+tested. The second item is the expected braille output. This can be
+either unicode braille or an ASCII-braille like encoding. Quoting
+strings is optional. Comments can be inserted almost anywhere using
+the @samp{#} sign. A simple test would look at follows:
+
+@example
+  - # a simple, no-frills test
+    - Good bye
+    - ⠠⠛⠕⠕⠙ ⠃⠽⠑
+@end example
+
+Using the more compact ``flow style'' notation it would look like the
+following:
+
+@example
+  - [Good bye, ⠠⠛⠕⠕⠙ ⠃⠽⠑]
+@end example
+
+An optional third item can contain additional options for a test such
+as the typeform, or whether a test is expected to fail. The following
+shows a typical example:
+
+@example
+  -
+    - Hello
+    - ⠨⠶⠠⠓⠑⠇⠇⠕⠨⠄
+    - @{typeform: @{italic: '++++ '@}, xfail: true@}
+  # same test more compact
+  - [Hello, ⠨⠶⠠⠓⠑⠇⠇⠕⠨⠄, @{typeform: @{italic: '++++ '@}, xfail: true@}]
+@end example
+
+The valid additional options for a test are as follows:
+
+@table @samp
+@item xfail
+Whether a test is expected to fail. If you expect a test to fail, set
+this to @samp{true}. If you prefer you can also specify a reason for
+the failure:
+
+@example
+  - [Hello, ⠨, @{xfail: Test case is not complete@}]
+@end example
+
+If you expect a test case to pass then just don't mark it with
+@samp{xfail} or if you really have to, set @samp{xfail} to
+@samp{false} or @samp{off}.
+
+@item typeform
+The typeform used for a translation. It consists of one or more
+emphasis specifications. For each character in the specifications that
+is not a space the corresponding emphasis will be set. Valid options
+for emphasis are @samp{italic}, @samp{underline}, @samp{bold},
+@samp{computer_braille}, @samp{passage_break}, @samp{word_reset},
+@samp{script}, @samp{trans_note}, @samp{trans_note_1},
+@samp{trans_note_2}, @samp{trans_note_3}, @samp{trans_note_4} or
+@samp{trans_note_5}. The following shows an example where both
+@samp{italic} and @samp{underline} are specified:
+
+@example
+  -
+    - Hello
+    - ⠨⠶⠠⠓⠑⠇⠇⠕⠨⠄
+    - typeform:
+        italic:    '++++ '
+        underline: '    +'
+@end example
+
+@item inputPos
+A list of 0-based input positions, one for each output position. Useful when
+simulating screen reader interaction, to debug contraction and cursor
+behavior as in the following example.
+Note that all positions in this and the following examples start at 0.
+Also note that in these examples the additional options are not
+passed using the ``flow style'' notation.
+
+@example
+  -
+    - went
+    - ⠺⠢⠞
+    - inputPos: [0,1,3]
+@end example
+
+@item outputPos
+A list of 0-based output positions, one for each input position. Useful when
+simulating screen reader interaction, to debug contraction and cursor
+behavior as in the following example.
+
+@example
+  -
+    - went
+    - ⠺⠢⠞
+    - outputPos: [0,1,1,2]
+@end example
+
+@item cursorPos
+A list of cursor positions, one for each input position. Useful when
+simulating screen reader interaction, to debug contraction and cursor
+behavior as in the following example:
+
+Note that compbrlAtCursor is implicitly specified for all cursor
+positions. This makes this test suitable only for testing a single
+word, since the translation would otherwise vary according to the
+cursor position.
+
+@example
+  -
+    - went
+    - ⠺⠑⠝⠞
+    - cursorPos: [0,1,2,3]
+@end example
+
+@item mode
+A list of translation modes that should be used for this test. If not
+defined defaults to 0. Valid mode values are @samp{noContractions},
+@samp{compbrlAtCursor}, @samp{dotsIO}, @samp{comp8Dots},
+@samp{pass1Only}, @samp{compbrlLeftCursor},
+@samp{ucBrl}, @samp{noUndefinedDots} or @samp{partialTrans}.
+
+For a description of the various translation mode flags, please see
+the function @ref{lou_translateString}.
+
+@end table
+
+@end table
+
+@subsection Optional test description
+When a test contains three or four items the first item is assumed to
+be a test description, the second item is the unicode text to be
+tested and the third item is the expected braille output. Again an
+optional fourth item can contain additional options for the test. The
+following shows an example:
+
+@example
+  -
+    - Number-text-transitions with italic
+    - 123abc
+    - ⠼⠁⠃⠉⠨⠶⠰⠁⠃⠉⠨⠄
+    - @{typeform: '000111'@}
+@end example
+
+In case the test fails the description will be printed together with
+the expected and the actual braille output.
+
+For more examples and inspiration please see the YAML tests
+(@file{*.yaml}) in the @file{tests} directory of the source
+distribution.
+
+@subsection Testing multiple tables within the same YAML test file
+Sometimes you are more focused on testing a particular feature across
+several tables rather than just testing one table. For that reason the
+following is also allowed:
+
+@example
+table: ...
+tests:
+  - [..., ...]
+  - [..., ...]
+table: ...
+tests:
+  - [..., ...]
+  - [..., ...]
+@end example
+
+@subsection Inline definition of tables
+When testing very specific opcode combinations it is sometimes tedious
+to create specific test tables just for that. Hence the YAML tests
+allow for specification of table definitions inline. Instead of
+referring to a table by name you just define the table inline by using
+what the YAML spec calls a
+@url{http://www.yaml.org/spec/1.2/spec.html#id2795688,Literal Style
+Block}. Start the definition with a @samp{|}, then list the opcodes
+with an indentation. The inline table ends when the indentation ends.
+
+@example
+table: |
+  sign a 1
+  ...
+tests:
+  - ...
+  - ...
+@end example
+
+@subsection Running the same test data on multiple tables
+Sometimes you maintain multiple tables which are very similar and
+basically contain the same test data. Instead of copying the YAML test
+and changing the table name you can also define multiple tables. This
+will cause the YAML tests to be checked against both tables.
+
+@example
+table: nl-NL
+table: nl-BE
+tests:
+  - [..., ...]
+  - [..., ...]
+@end example
+
+@node Programming with liblouis
+@chapter Programming with liblouis
+
+@menu
+* Overview (library)::
+* Data structure of liblouis tables::
+* How tables are found::
+* Deprecation of the logging system::
+* lou_version::
+* lou_translateString::
+* lou_translate::
+* lou_backTranslateString::
+* lou_backTranslate::
+* lou_hyphenate::
+* lou_compileString::
+* lou_getTypeformForEmphClass::
+* lou_dotsToChar::
+* lou_charToDots::
+* lou_registerLogCallback::
+* lou_setLogLevel::
+* lou_logFile::
+* lou_logPrint::
+* lou_logEnd::
+* lou_setDataPath::
+* lou_getDataPath::
+* lou_getTable::
+* lou_findTable::
+* lou_indexTables::
+* lou_checkTable::
+* lou_readCharFromFile::
+* lou_free::
+* lou_charSize::
+* Python bindings::
+@end menu
+
+@node Overview (library)
+@section Overview
+
+You use the liblouis library by calling the following functions,
+@code{lou_translateString}, @code{lou_backTranslateString},
+@code{lou_translate}, @code{lou_backTranslate},
+@code{lou_registerLogCallback}, @code{lou_setLogLevel},
+@code{lou_logFile}, @code{lou_logPrint}, @code{lou_logEnd},
+@code{lou_getTable}, @code{lou_findTable}, @code{lou_indexTables},
+@code{lou_checkTable}, @code{lou_hyphenate}, @code{lou_charToDots},
+@code{lou_dotsToChar}, @code{lou_compileString},
+@code{lou_getTypeformForEmphClass}, @code{lou_readCharFromFile},
+@code{lou_version}, @code{lou_free} and @code{lou_charSize}. These are
+described below. The header file, @file{liblouis.h}, also contains
+brief descriptions. Liblouis is written in straight C. It has four
+code modules, @file{compileTranslationTable.c}, @file{logging.c},
+@file{lou_translateString.c} and @file{lou_backTranslateString.c}. In
+addition, there are two header files, @file{liblouis.h}, which defines
+the API, and @file{louis.h}, used only internally and by
+liblouisutdml. The latter includes @file{liblouis.h}.
+
+Persons who wish to use liblouis from Python may want to skip ahead to
+@ref{Python bindings}.
+
+@file{compileTranslationTable.c} keeps track of all translation tables
+which an application has used. It is called by the translation,
+hyphenation and checking functions when they start. If a table has not
+yet been compiled @file{compileTranslationTable.c} checks it for
+correctness and compiles it into an efficient internal representation.
+The main entry point is @code{lou_getTable}. Since it is the module
+that keeps track of memory usage, it also contains the @code{lou_free}
+function. In addition, it contains the @code{lou_checkTable} function,
+plus some utility functions which are used by the other modules.
+
+By default, liblouis handles all characters internally as 16-bit
+unsigned integers. It can be compiled for 32-bit characters as
+explained below. The meanings of these integers are not hard-coded.
+Rather they are defined by the character-definition opcodes. However,
+the standard printable characters, from decimal 32 to 126 are
+recognized for the purpose of processing the opcodes. Hence, the
+following definition is included in @file{liblouis.h}. It is correct
+for computers with at least 32-bit processors.
+
+@example
+#define widechar unsigned short int
+@end example
+
+To make liblouis handle 32-bit Unicode simply remove the word
+@code{short} in the above @code{define}. This will cause the translate and
+back-translate functions to expect input in 32-bit form and to deliver
+their output in this form. The input to the compiler (tables) is
+unaffected except that two new escape sequences for 20-bit and 32-bit
+characters are recognized.
+
+At runtime, the width of a character specified during compilation may
+be obtained using @code{lou_charSize}.
+
+Here are the definitions of the eleven liblouis functions and their
+parameters. They are given in terms of 16-bit Unicode. If liblouis has
+been compiled for 32-bit Unicode simply read 32 instead of 16.
+
+@node Data structure of liblouis tables
+@section Data structure of liblouis tables
+
+The data structure @code{TranslationTableHeader} is defined by a
+@code{typedef} statement in @file{louis.h}. To find the beginning,
+search for the word @samp{header}. As its name implies, this is
+actually the table header. Data are placed in the @code{ruleArea}
+array, which is the last item defined in this structure. This array is
+declared with a length of 1 and is expanded as needed. The table
+header consists mostly of arrays of pointers of size @code{HASHNUM}.
+These pointers are actually offsets into @code{ruleArea} and point to
+chains of items which have been placed in the same hash bucket by a
+simple hashing algorithm. @code{HASHNUM} should be a prime and is
+currently 1123. The structure of the table was chosen to optimize
+speed rather than memory usage.
+
+The first part of the table contains miscellaneous information, such
+as the number of passes and whether various opcodes have been used. It
+also contains the amount of memory allocated to the table and the
+amount actually used.
+
+The next section contains pointers to various braille indicators and
+begins with @code{capitalSign}. The rules pointed to contain the 
+dot pattern for the indicator and an opcode which is used by the
+back-translator but does not appear in the list of opcodes. The
+braille indicators also include various kinds of emphasis, such as
+italic and bold and information about the length of emphasized
+phrases. The latter is contained directly in the table item instead of
+in a rule.
+
+After the braille indicators comes information about when a letter
+sign should be used.
+
+Next is an array of size @code{HASHNUM} which points to character
+definitions. These are created by the character-definition opcodes.
+
+Following this is a similar array pointing to definitions of
+single-cell dot patterns. This is also created from the
+character-definition opcodes. If a character definition contains a
+multi-cell dot pattern this is compiled into ordinary forward and
+backward rules. If such a multi-cell dot pattern contains a single
+cell which has not previously been defined that cell is placed in this
+array, but is given the attribute @code{space}.
+
+Next come arrays that map characters to single-cell dot patterns and
+dots to characters. These are created from both character-definition
+opcodes and display opcodes.
+
+Next is an array of size 256 which maps characters in this range to
+dot patterns which may consist of multiple cells. It is used, for
+example, to map @samp{@{} to dots 456-246. These mappings are created
+@c FIXME: the compdots opcode should be documented
+@c by the @opcoderef{compdots} 
+by the @code{compdots} 
+or the @opcoderef{comp6}.
+
+Next are two small arrays that held pointers to chains of rules
+produced by the @opcoderef{swapcd} and the @opcoderef{swapdd} and by
+some multipass, @code{context} and @code{correct} opcodes.
+
+Now we get to an array of size @code{HASHNUM} which points to chains
+of rules for forward translation.
+
+Following this is a similar array for back-translation.
+
+Finally is the @code{ruleArea}, an array of variable size to which
+various structures are mapped and to which almost everything else
+points.
+
+@node How tables are found
+@section How tables are found
+@cindex Table search path
+@cindex LOUIS_TABLEPATH
+liblouis knows where to find all the tables that have been distributed
+with it. So you can just give a table name such as @code{en-us-g2.ctb}
+and liblouis will load it. You can also give a table name which
+includes a path. If this is the first table in a list, all the tables
+in the list must be on the same path. You can specify a path on which
+liblouis will look for table names by setting the environment variable
+@env{LOUIS_TABLEPATH}. This environment variable can contain one or
+more paths separated by commas. On receiving a table name liblouis
+first checks to see if it can be found on any of these paths. If not,
+it then checks to see if it can be found in the current directory, or,
+if the first (or only) name in a table list, if it contains a
+path name, can be found on that path. If not, it checks to see if it
+can be found on the path where the distributed tables have been
+installed. If a table has already been loaded and compiled this
+path-checking is skipped.
+
+@node Deprecation of the logging system
+@section Deprecation of the logging system
+
+As of version 2.6.0 @code{lou_logFile}, @code{lou_logPrint} and
+@code{lou_logEnd} are deprecated. They are replaced by a more powerful,
+abstract API consisting of @code{lou_registerLogCallback} and
+@code{lou_setLogLevel}. 
+
+Usage of @code{lou_logFile}, @code{lou_logPrint} and @code{lou_logEnd} is
+discouraged as they may not be part of future releases. Applications using
+Liblouis should implement their own logging system.
+
+During the transitional phase, @code{lou_logPrint} is registered as default
+callback in @code{lou_registerLogCallback}. @code{lou_logPrint} is overwritten
+by the first call to @code{lou_registerLogCallback} and reattached when
+@code{NULL} is set as callback. Note that calling @code{lou_logPrint} directly
+will not cause an invocation of the registered callback.
+
+@node lou_version
+@section lou_version
+@findex lou_version
+
+@example
+char *lou_version ()
+@end example
+
+This function returns a pointer to a character string containing the
+version of liblouis, plus other information, such as the release date
+and perhaps notable changes.
+
+@node lou_translateString
+@section lou_translateString
+@findex lou_translateString
+
+@example
+int lou_translateString(
+  const char *tableList,
+  const widechar *inbuf,
+  int *inlen,
+  widechar *outbuf,
+  int *outlen,
+  formtype *typeform,
+  char *spacing,
+  int mode);
+@end example
+
+This function takes a string of 16-bit Unicode characters in
+@code{inbuf} and translates it into a string of 16-bit characters in
+@code{outbuf}. Each 16-bit character produces a particular dot pattern
+in one braille cell when sent to an embosser or braille display or to
+a screen type font. Which 16-bit character represents which dot pattern
+is indicated by the character-definition and display opcodes in the
+translation table.
+
+@anchor{translation-tables}
+The @code{tableList} parameter points to a list of translation tables
+separated by commas. @xref{How tables are found}, for a description on
+how the tables are located in the file system. If only one table is
+given, no comma should be used after it. It is these tables which
+control just how the translation is made, whether in Grade 2, Grade 1,
+or something else.
+
+The tables in a list are all compiled into the same internal table.
+The list is then regarded as the name of this table. As explained in
+@ref{How to Write Translation Tables}, each table is a file which may
+be plain text, big-endian Unicode or little-endian Unicode. A table
+(or list of tables) is compiled into an internal representation the
+first time it is used. Liblouis keeps track of which tables have been
+compiled. For this reason, it is essential to call the @code{lou_free}
+function at the end of your application to avoid memory leaks. Do
+@emph{NOT} call @code{lou_free} after each translation. This will
+force liblouis to compile the translation tables each time they are
+used, leading to great inefficiency.
+
+Note that both the @code{*inlen} and @code{*outlen} parameters are
+pointers to integers. When the function is called, these integers
+contain the maximum input and output lengths, respectively. When it
+returns, they are set to the actual lengths used.
+
+The @code{typeform} parameter is used to indicate italic type,
+boldface type, computer braille, etc. It is an array of @code{formtype}
+with the same length as the input buffer pointed to by @code{*inbuf}.
+However, it is used to pass back character-by-character results, so
+enough space must be provided to match the @code{*outlen} parameter.
+Each element indicates the typeform of the corresponding character
+in the input buffer. The values and their meaning can be consulted in the
+@code{typeforms} enum in @file{liblouis.h}. These values can be
+added for multiple emphasis. If this parameter is @code{NULL}, no
+checking for type forms is done. In addition, if this parameter is not
+@code{NULL}, it is set on return to have an 8 at every position
+corresponding to a character in @code{outbuf} which was defined to
+have a dot representation containing dot 7, dot 8 or both, and to 0
+otherwise.
+
+The @code{spacing} parameter is used to indicate differences in
+spacing between the input string and the translated output string. It
+is also of the same length as the string pointed to by @code{*inbuf}.
+If this parameter is @code{NULL}, no spacing information is computed.
+
+The @code{mode} parameter specifies how the translation should be
+done. The valid values of mode are defined in @file{liblouis.h}. They
+are all powers of 2, so that a combined mode can be specified by
+adding up different values.
+
+Note that the @code{mode} parameter is an integer, not a pointer to
+an integer.
+
+A combination of the following mode flags can be used with the
+@code{lou_translateString} function:
+
+@table @code
+@item compbrlAtCursor
+If this bit is set in the @code{mode} parameter the space-bounded
+characters containing the cursor will be translated in computer
+braille.
+
+@item compbrlLeftCursor
+If this bit is set, only the characters to the left of the cursor will
+be in computer braille. This bit overrides @code{compbrlAtCursor}.
+
+@item dotsIO
+When this bit is set, during forward translation, Liblouis will produce
+output as dot patterns. During back-translation Liblouis accepts input
+as dot patterns. Note that the produced dot patterns are affected if
+you have any @opcoderef{display} defined in any of your tables.
+
+@item ucBrl
+The @code{ucBrl} (Unicode Braille) bit is used by the functions
+@code{lou_charToDots} and @code{lou_translate}. It causes the dot
+patterns to be Unicode Braille rather than the liblouis representation.
+Note that you will not notice any change when setting @code{ucBrl}
+unless @code{dotsIO} is also set. @code{lou_dotsToChar} and
+@code{lou_backTranslate} recognize Unicode braille automatically.
+
+@item pass1Only
+When this bit is set, Only pass 1 of the translation will be run. This
+excludes all rules that use the @code{correct} and @code{multi-pass}
+opcodes as well as some rules using the @code{context} opcode. The flag
+was originally introduced for the benefit of screen reading programs,
+but has now been deprecated, and will be removed in the near future.
+
+@item partialTrans
+This flag specifies that back-translation input should be treated as an
+incomplete word. Rules that apply only for complete words or at the end
+of a word will not take effect. This is intended to be used when
+translating input typed on a braille keyboard to provide a rough idea
+to the user of the characters they are typing before the word is
+complete.
+
+@item noUndefinedDots
+Setting this bit disables the output of dot numbers when
+back-translating undefined Braille patterns. When back translating
+input from a braille keyboard cell by cell, it is desirable to output
+characters as soon as they are produced. Similarly, when back
+translating contracted braille, it is desirable to provide a "guess" to
+the user of the characters they typed. To achieve this, liblouis needs
+to have the ability to produce no text when indicators (which don't
+produce a character by themselves) are not followed by another cell.
+This works automatically for indicators liblouis knows about such as
+capital sign, number sign, etc., but it does not work for indicators
+which are not (and cannot be) specifically defined as indicators. For
+example, in UEB, dots 4 5 6 alone produces the text "\456/". Setting
+the noUndefinedDots mode suppresses this dot number output.
+
+@end table
+
+The function returns 1 if no errors were encountered and 0 if a
+complete translation could not be done.
+
+@node lou_translate
+@section lou_translate
+@findex lou_translate
+
+@example
+int lou_translate(
+  const char *tableList,
+  const widechar *inbuf,
+  int *inlen,
+  widechar *outbuf,
+  int *outlen,
+  formtype *typeform,
+  char *spacing,
+  int *outputPos,
+  int *inputPos,
+  int *cursorPos,
+  int mode);
+@end example
+
+This function adds the parameters @code{outputPos}, @code{inputPos}
+and @code{cursorPos}, to facilitate use in screen reader programs. The
+@code{outputPos} parameter must point to an array of integers with at
+least @code{inlen} elements. On return, this array will contain the
+position in @code{outbuf} corresponding to each input position.
+Similarly, @code{inputPos} must point to an array of integers of at
+least @code{outlen} elements. On return, this array will contain the
+position in @code{inbuf} corresponding to each position in
+@code{outbuf}. @code{cursorPos} must point to an integer containing
+the position of the cursor in the input. On return, it will contain
+the cursor position in the output. Any parameter after @code{outlen}
+may be @code{NULL}. In this case, the actions corresponding to it will
+not be carried out.
+
+For a description of all other parameters, please see
+@ref{lou_translateString}.
+
+@node lou_backTranslateString
+@section lou_backTranslateString
+@findex lou_backTranslateString
+
+@example
+int lou_backTranslateString(
+  const char *tableList,
+  const widechar *inbuf,
+  int *inlen,
+  widechar *outbuf,
+  int *outlen,
+  formtype *typeform,
+  char *spacing,
+  int mode);
+@end example
+
+This is exactly the opposite of @code{lou_translateString}.
+@code{inbuf} is a string of 16-bit Unicode characters representing
+braille. @code{outbuf} will contain a string of 16--bit Unicode
+characters. @code{typeform} will indicate any emphasis found in the
+input string, while @code{spacing} will indicate any differences in
+spacing between the input and output strings. The @code{typeform} and
+@code{spacing} parameters may be @code{NULL} if this information is
+not needed. @code{mode} again specifies how the back-translation
+should be done.
+
+There are two additional modes that only apply to back-translation. By
+default, if a dot pattern in the input is undefined, the dot numbers
+will be included in the output. If the @code{noUndefinedDots} mode is
+set, this does not occur; an undefined dot pattern simply produces no
+output. The @code{partialTrans} mode specifies that the input should be
+treated as an incomplete word. That is, rules that apply only for
+complete words or at the end of a word will not take effect. This is
+intended to be used when translating input typed on a braille keyboard
+to provide a rough idea to the user of the characters they are typing
+before the word is complete.
+
+@node lou_backTranslate
+@section lou_backTranslate
+@findex lou_backTranslate
+
+@example
+int lou_backTranslate(
+  const char *tableList,
+  const widechar *inbuf,
+  int *inlen,
+  widechar *outbuf,
+  int *outlen,
+  formtype *typeform,
+  char *spacing,
+  int *outputPos,
+  int *inputPos,
+  int *cursorPos,
+  int mode);
+@end example
+
+This function is exactly the inverse of @code{lou_translate}.
+
+@node lou_hyphenate
+@section lou_hyphenate
+@findex lou_hyphenate
+
+@example
+int lou_hyphenate (
+  const char *tableList,
+  const widechar *inbuf,
+  int inlen,
+  char *hyphens,
+  int mode);
+@end example
+
+This function looks at the characters in @code{inbuf} and if it finds
+a sequence of letters attempts to hyphenate it as a word. Note that
+lou_hyphenate operates on single words only, and spaces or punctuation
+marks between letters are not allowed. Leading and trailing
+punctuation marks are ignored. The table named by the @code{tableList}
+parameter must contain a hyphenation table. If it does not, the
+function does nothing. @code{inlen} is the length of the character
+string in @code{inbuf}. @code{hyphens} is an array of characters and
+must be of size @code{inlen} + 1 (to account for the NULL terminator).
+If hyphenation is successful it will have a 1 at the beginning of each
+syllable and a 0 elsewhere. If the @code{mode} parameter is 0
+@code{inbuf} is assumed to contain untranslated characters. Any
+nonzero value means that @code{inbuf} contains a translation. In this
+case, it is back-translated, hyphenation is performed, and it is
+re-translated so that the hyphens can be placed correctly. The
+@code{lou_translate} and @code{lou_backTranslate} functions are used
+in this process. @code{lou_hyphenate} returns 1 if hyphenation was
+successful and 0 otherwise. In the latter case, the contents of the
+@code{hyphens} parameter are undefined. This function was provided for
+use in liblouisutdml.
+
+@node lou_compileString
+@section lou_compileString
+@findex lou_compileString
+
+@example
+int lou_compileString (const char *tableList, const char *inString)
+@end example
+
+This function enables you to compile a table entry on the fly at 
+run-time. The new entry is added to @code{tableList} and remains in force 
+until @code{lou_free} is called. If @code{tableList} has not previously 
+been loaded it is loaded and compiled. @code{inString} contains the 
+table entry to be added. It may be anything valid. Error messages 
+will be produced if it is invalid. The function returns 1 on success and 
+0 on failure.
+
+@node lou_getTypeformForEmphClass
+@section lou_getTypeformForEmphClass
+@findex lou_getTypeformForEmphClass
+
+@example
+int lou_getTypeformForEmphClass (const char *tableList, const char *emphClass);
+@end example
+
+This function returns the typeform bit associated with the given
+emphasis class. If the emphasis class is undefined this function
+returns @code{0}. If errors are found error messages are logged to the
+log callback (see @code{lou_registerLogCallback}) and the return value
+is @code{0}. @code{tableList} is a list of names of table files
+separated by commas, as explained previously
+(@pxref{translation-tables,,@code{tableList} parameter in
+@code{lou_translateString}}). @code{emphClass} is the name of an
+emphasis class.
+
+@node lou_dotsToChar
+@section lou_dotsToChar
+@findex lou_dotsToChar
+
+@example
+int lou_dotsToChar (
+  const char *tableList,
+  const widechar *inbuf,
+  widechar *outbuf,
+  int length,
+  int mode)
+@end example
+
+This function takes a widechar string in @code{inbuf} consisting of dot 
+patterns and converts it to a widechar string in @code{outbuf} 
+consisting of characters according to the specifications in 
+@code{tableList}. @code{length} is the length of both @code{inbuf} and 
+@code{outbuf}. The dot patterns in @code{inbuf} can be in either 
+liblouis format or Unicode braille. The function returns 1 on success 
+and 0 on failure.
+
+@node lou_charToDots
+@section lou_charToDots
+@findex lou_charToDots
+
+@example
+int lou_charToDots (
+  const char *tableList,
+  const widechar *inbuf,
+  widechar *outbuf,
+  int length,
+  int mode)
+@end example
+
+This function is the inverse of @code{lou_dotsToChar}. It takes a
+widechar string in @code{inbuf} consisting of characters and converts it
+to a widechar string in @code{outbuf} consisting of dot patterns
+according to the specifications in @code{tableList}. @code{length} is the
+length of both @code{inbuf} and @code{outbuf}. The dot patterns in
+@code{outbufbuf} are in liblouis format if the mode bit @code{ucBrl} is 
+not set and in Unicode format if it is set. The function returns 1 on
+success and 0 on failure.
+
+@node lou_registerLogCallback
+@section lou_registerLogCallback
+@findex lou_registerLogCallback
+
+@example
+typedef void (*logcallback) (
+  int level,
+  const char *message);
+  
+void lou_registerLogCallback (
+  logcallback callback);
+@end example
+
+This function can be used to register a custom logging callback. The
+callback must take a single argument, the message string. By default
+log messages are printed to stderr, or if a filename was specified
+with @code{lou_logFile} then messages are logged to that
+file. @code{lou_registerLogCallback} overrides the default
+callback. Passing @code{NULL} resets to the default callback.
+
+@node lou_setLogLevel
+@section lou_setLogLevel
+@findex lou_setLogLevel
+
+@example
+typedef enum
+@{
+  LOG_ALL = 0,
+  LOG_DEBUG = 10000,
+  LOG_INFO = 20000,
+  LOG_WARN = 30000,
+  LOG_ERROR = 40000,
+  LOG_FATAL = 50000,
+  LOG_OFF = 60000
+@} logLevels;
+void lou_setLogLevel (
+  logLevels level);
+@end example
+
+This function can be used to influence the amount of logging, from
+fatal error messages only to detailed debugging messages. Supported
+values are @code{LOG_DEBUG}, @code{LOG_INFO}, @code{LOG_WARN},
+@code{LOG_ERROR}, @code{LOG_FATAL} and @code{LOG_OFF}. Enabling
+logging at a given level also enables logging at all higher
+levels. Setting the level to @code{LOG_OFF} disables logging. The
+default level is @code{LOG_INFO}.
+
+@node lou_logFile
+@section lou_logFile (deprecated)
+@findex lou_logFile
+
+@example
+void lou_logFile (
+  char *fileName);
+@end example
+
+This function is used when it is not convenient either to let messages
+be printed on stderr or to use redirection, as when liblouis is used
+in a GUI application or in liblouisutdml. Any error messages generated
+will be printed to the file given in this call. The entire path name of
+the file must be given.
+
+This function is deprecated. See @ref{Deprecation of the logging system}.
+
+@node lou_logPrint
+@section lou_logPrint (deprecated)
+@findex lou_logPrint
+
+@example
+void lou_logPrint (
+  char *format,
+  ...);
+@end example
+
+This function is called like @code{fprint}. It can be used by other
+libraries to print messages to the file specified by the call to
+@code{lou_logFile}. In particular, it is used by the companion
+library liblouisutdml.
+
+This function is deprecated. See @ref{Deprecation of the logging system}.
+
+@node lou_logEnd
+@section lou_logEnd (deprecated)
+@findex lou_logEnd
+
+@example
+lou_logEnd ();
+@end example
+
+This function is used at the end of processing a document to close the 
+log file, so that it can be read by the rest of the program.
+
+This function is deprecated. See @ref{Deprecation of the logging system}.
+
+@node lou_setDataPath
+@section lou_setDataPath
+@findex lou_setDataPath
+
+@example
+char *lou_setDataPath (
+  char *path);
+@end example
+
+This function is used to tell liblouis and liblouisutdml where tables
+and files are located. It thus makes them completely relocatable, even
+on Linux. The @code{path} is the directory where the subdirectories
+@code{liblouis/tables} and @code{liblouisutdml/lbu_files} are rooted
+or located. The function returns a pointer to the @code{path}.
+
+@node lou_getDataPath
+@section lou_getDataPath
+@findex lou_getDataPath
+
+@example
+char *lou_getDataPath ();
+@end example
+
+This function returns a pointer to the path set by
+@code{lou_setDataPath}. If no path has been set it returns
+@code{NULL}.
+
+@node lou_getTable
+@section lou_getTable
+@findex lou_getTable
+
+@example
+void *lou_getTable (
+  char *tableList);
+@end example
+
+@code{tableList} is a list of names of table files separated by
+commas, as explained previously
+(@pxref{translation-tables,,@code{tableList} parameter in
+@code{lou_translateString}}). If no errors are found this function
+returns a pointer to the compiled table. If errors are found error
+messages are logged to the log callback (see
+@code{lou_registerLogCallback}). Errors result in a @code{NULL}
+pointer being returned.
+
+@node lou_findTable
+@section lou_findTable
+@findex lou_findTable
+
+@example
+char *lou_findTable (const char *query);
+@end example
+
+This function can be used to find a table based on
+metadata. @code{query} is a string in the special @ref{Query
+Syntax,query syntax}. It is matched against @ref{Table Metadata,table
+metadata} inside the tables that were previously indexed with
+@ref{lou_indexTables,@code{lou_indexTables}}. Returns the file name of
+the best match. Returns @code{NULL} if the query is invalid or if no
+match can be found.
+
+The match algorithm works as follows:
+
+@itemize @bullet
+@item
+For every table a match quotient with the query is computed. The table
+with the highest (positive) match quotient wins. If no table has a
+positive quotient, there is no match.
+@item
+A query is a list of features. Features defined first have a higher
+importance (have a higher impact on the final quotient) than features
+defined later.
+@item
+A feature that matches a metadata field in the table (keys equal and
+values equal, or both values absent) adds to the quotient.
+@item
+A feature that is undefined in the table (no field with that key)
+creates a medium penalty.
+@item
+A feature that is defined in the table but does not match (keys equal
+but values not equal) creates the highest penalty.
+@item
+Every field in the table that has no corresponding feature in the
+query creates a very small penalty.
+@end itemize
+
+@node lou_indexTables
+@section lou_indexTables
+@findex lou_indexTables
+
+@example
+void lou_indexTables (const char **tables);
+@end example
+
+This function must be called prior to
+@ref{lou_findTable,@code{lou_findTable}}. It parses, analyzes and
+indexes all specified tables. @code{tables} must be an array of file
+names. Tables that contain invalid metadata are ignored.
+
+@node lou_checkTable
+@section lou_checkTable
+@findex lou_checkTable
+
+@example
+int lou_checkTable (const char *tableList);
+@end example
+
+This function does the same as @code{lou_getTable} but does not return
+a pointer to the resulting table. It is to be preferred if only the
+validity of a table needs to be checked. @code{tableList} is a list of
+names of table files separated by commas, as explained previously
+(@pxref{translation-tables,,@code{tableList} parameter in
+@code{lou_translateString}}). If no errors are found this function
+returns a non-zero. If errors are found error messages are logged to
+the log callback (see @code{lou_registerLogCallback}) and the return
+value is @code{0}.
+
+@node lou_readCharFromFile
+@section lou_readCharFromFile
+@findex lou_readCharFromFile
+
+@example
+int lou_readCharFromFile (
+  const char *fileName,
+  int *mode);
+@end example
+
+This function is provided for situations where it is necessary to read
+a file which may contain little-endian or big-endian 16-bit Unicode
+characters or ASCII8 characters. The return value is a little-endian
+character, encoded as an integer. The @code{fileName} parameter is the
+name of the file to be read. The @code{mode} parameter is a pointer to
+an integer which must be set to 1 on the first call. After that, the
+function takes care of it. On end-of-file the function returns
+@code{EOF}.
+
+@node lou_free
+@section lou_free
+@findex lou_free
+
+@example
+void lou_free ();
+@end example
+
+This function should be called at the end of the application to free
+all memory allocated by liblouis. Failure to do so will result in
+memory leaks. Do @emph{NOT} call @code{lou_free} after each
+translation. This will force liblouis to compile the translation
+tables every time they are used, resulting in great inefficiency.
+
+@node lou_charSize
+@section lou_charSize
+@findex lou_charSize
+
+@example
+int lou_charSize ();
+@end example
+
+This function returns the size of @code{widechar} in bytes and can
+therefore be used to differentiate between 16-bit and 32bit-Unicode
+builds of liblouis.
+
+@node Python bindings
+@section Python bindings
+
+There are Python bindings for @code{lou_translateString},
+@code{lou_translate}, @code{lou_backTranslateString},
+@code{lou_backTranslate}, @code{lou_hyphenate}, @code{checkTable},
+@code{lou_compileString} and @code{lou_version}. For installation
+instructions see the the @file{README} file in the @file{python}
+directory. Usage information is included in the Python module itself.
+
+
+@node Concept Index
+@unnumbered Concept Index
+@printindex cp
+
+@node Opcode Index
+@unnumbered Opcode Index
+@printindex opcode
+
+@node Function Index
+@unnumbered Function Index
+@printindex fn
+
+@node Program Index
+@unnumbered Program Index
+@printindex pg
+
+@bye
+
+@c The following list is a list of exceptions for the ispell spell
+@c checker
+
+@c  LocalWords:  liblouis opcode args BRLTTY ViewPlus Abilitiessoft LGPL lou
+@c  LocalWords:  checktable allround checkhyphens Opcodes Multipass dotsToChar
+@c  LocalWords:  translateString backTranslateString backTranslate charToDots
+@c  LocalWords:  compileString logFile logPrint checkyaml findTable
+@c  LocalWords:  getTable checkTable readCharFromFile itemx charSize
+@c  LocalWords:  README liblouisxml pindex samp kbd opcodes opcoderef numsign
+@c  LocalWords:  FIXME ctb nemeth filename multipass suboperand uplow litdigit
+@c  LocalWords:  begcaps endcaps letsign noletsign largesign typeform
+@c  LocalWords:  noletsignbefore noletsignafter compbrl firstwordital
+@c  LocalWords:  lenitalphrase doubleOpcode lastworditalbefore firstletterital
+@c  LocalWords:  lastworditalafter lastletterital firstwordbold UTF
+@c  LocalWords:  singleletterital lastwordboldbefore lastwordboldafter
+@c  LocalWords:  firstletterbold lastletterbold lenboldphrase filll
+@c  LocalWords:  singleletterbold firstwordunder lastwordunderbefore
+@c  LocalWords:  lastwordunderafter firstletterunder lastletterunder
+@c  LocalWords:  singleletterunder lenunderphrase begcomp endcomp decpoint texi
+@c  LocalWords:  capsnocont noback nofor texinfo setfilename settitle direntry
+@c  LocalWords:  dircategory finalout defindex opcodeindex noindent uref vskip
+@c  LocalWords:  titlepage insertcopying ifnottex dir detailmenu italword RET
+@c  LocalWords:  TranslationTableHeader txt cti nocross exactdots nocont emph
+@c  LocalWords:  prepunc postpunc repword joinword lowword sufword prfword API
+@c  LocalWords:  begword begmidword midword midendword endword partword begnum
+@c  LocalWords:  midnum endnum joinnum swapcd swapdd swapcc multind endLog
+@c  LocalWords:  backtranslation compileTranslationTable typedef louis ruleArea
+@c  LocalWords:  HASHNUM capitalSign compdots findex const inbuf outbuf outlen
+@c  LocalWords:  tableList TABLEPATH widechar inputPos cursorPos outputPos
+@c  LocalWords:  inlen compbrlAtCursor compbrlLeftCursor trantab stderr endian
+@c  LocalWords:  tablelist fileName printindex deprecatedopcode setDataPath
+@c  LocalWords:  getDataPath MathML suboperands logEnd liblouisutdml whitespace
+@c  LocalWords:  xhhhh yhhhhh zhhhhhhhh OpenOffice documentencoding
+@c  LocalWords:  YAML JSON logLevels nocontractsign OSX DLL env NVDA
+@c  LocalWords:  MERCHANTABILITY registerLogCallback setLogLevel brf
+@c  LocalWords:  cindex chardefs xhtml pxref dec multi hyph dic Aa al
+@c  LocalWords:  mrow mfrac emphclass transnote subsubsection begemph
+@c  LocalWords:  endemph emphletter begemphword endemphword www cd th
+@c  LocalWords:  lenemphphrase begemphphrase endemphphrase andthe se
+@c  LocalWords:  abrege decrement pre cornf comf scano cornm cornp po
+@c  LocalWords:  h's brl testtrans UCS asis libyaml url yaml formtype
+@c  LocalWords:  testmode iftex unicode ueb xfail eo noContractions
+@c  LocalWords:  dotsIO ucBrl noUndefinedDots partialTrans capsletter
+@c  LocalWords:  abc doctest inString enum cp outbufbuf logcallback fprint
+@c  LocalWords:  lbu EOF heckTable fn ispell getTypeformForEmphClass
+@c  LocalWords:  indexTables begcapsword endcapsword typeforms
+@c  LocalWords:  endemphphraseopcode emphClass BrailleSense HumanWare
+@c  LocalWords:  BrailleNote
diff --git a/liblouis/gnulib/Makefile.am b/liblouis/gnulib/Makefile.am
new file mode 100644
index 0000000..272bf3f
--- /dev/null
+++ b/liblouis/gnulib/Makefile.am
@@ -0,0 +1,771 @@
+## DO NOT EDIT! GENERATED AUTOMATICALLY!
+## Process this file with automake to produce Makefile.in.
+# Copyright (C) 2002-2017 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this file.  If not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=gnulib --m4-base=gnulib/m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --no-conditional-dependencies --libtool --macro-prefix=gl --no-vc-files dirent lib-msvc-compat malloc-gnu realloc-gnu setenv strndup
+
+AUTOMAKE_OPTIONS = 1.9.6 gnits
+
+SUBDIRS =
+noinst_HEADERS =
+noinst_LIBRARIES =
+noinst_LTLIBRARIES =
+EXTRA_DIST =
+BUILT_SOURCES =
+SUFFIXES =
+MOSTLYCLEANFILES = core *.stackdump
+MOSTLYCLEANDIRS =
+CLEANFILES =
+DISTCLEANFILES =
+MAINTAINERCLEANFILES =
+# No GNU Make output.
+EXTRA_DIST += m4/gnulib-cache.m4
+
+AM_CPPFLAGS =
+AM_CFLAGS =
+
+noinst_LTLIBRARIES += libgnu.la
+
+libgnu_la_SOURCES =
+libgnu_la_LIBADD = $(gl_LTLIBOBJS)
+libgnu_la_DEPENDENCIES = $(gl_LTLIBOBJS)
+EXTRA_libgnu_la_SOURCES =
+libgnu_la_LDFLAGS = $(AM_LDFLAGS)
+libgnu_la_LDFLAGS += -no-undefined
+
+## begin gnulib module absolute-header
+
+# Use this preprocessor expression to decide whether #include_next works.
+# Do not rely on a 'configure'-time test for this, since the expression
+# might appear in an installed header, which is used by some other compiler.
+HAVE_INCLUDE_NEXT = (__GNUC__ || 60000000 <= __DECC_VER)
+
+## end   gnulib module absolute-header
+
+## begin gnulib module alloca-opt
+
+BUILT_SOURCES += $(ALLOCA_H)
+
+# We need the following in order to create <alloca.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_ALLOCA_H
+alloca.h: alloca.in.h $(top_builddir)/config.status
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  cat $(srcdir)/alloca.in.h; \
+	} > $@-t && \
+	mv -f $@-t $@
+else
+alloca.h: $(top_builddir)/config.status
+	rm -f $@
+endif
+MOSTLYCLEANFILES += alloca.h alloca.h-t
+
+EXTRA_DIST += alloca.in.h
+
+## end   gnulib module alloca-opt
+
+## begin gnulib module dirent
+
+BUILT_SOURCES += dirent.h
+
+# We need the following in order to create <dirent.h> when the system
+# doesn't have one that works with the given compiler.
+dirent.h: dirent.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''HAVE_DIRENT_H''@|$(HAVE_DIRENT_H)|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_DIRENT_H''@|$(NEXT_DIRENT_H)|g' \
+	      -e 's/@''GNULIB_OPENDIR''@/$(GNULIB_OPENDIR)/g' \
+	      -e 's/@''GNULIB_READDIR''@/$(GNULIB_READDIR)/g' \
+	      -e 's/@''GNULIB_REWINDDIR''@/$(GNULIB_REWINDDIR)/g' \
+	      -e 's/@''GNULIB_CLOSEDIR''@/$(GNULIB_CLOSEDIR)/g' \
+	      -e 's/@''GNULIB_DIRFD''@/$(GNULIB_DIRFD)/g' \
+	      -e 's/@''GNULIB_FDOPENDIR''@/$(GNULIB_FDOPENDIR)/g' \
+	      -e 's/@''GNULIB_SCANDIR''@/$(GNULIB_SCANDIR)/g' \
+	      -e 's/@''GNULIB_ALPHASORT''@/$(GNULIB_ALPHASORT)/g' \
+	      -e 's/@''HAVE_OPENDIR''@/$(HAVE_OPENDIR)/g' \
+	      -e 's/@''HAVE_READDIR''@/$(HAVE_READDIR)/g' \
+	      -e 's/@''HAVE_REWINDDIR''@/$(HAVE_REWINDDIR)/g' \
+	      -e 's/@''HAVE_CLOSEDIR''@/$(HAVE_CLOSEDIR)/g' \
+	      -e 's|@''HAVE_DECL_DIRFD''@|$(HAVE_DECL_DIRFD)|g' \
+	      -e 's|@''HAVE_DECL_FDOPENDIR''@|$(HAVE_DECL_FDOPENDIR)|g' \
+	      -e 's|@''HAVE_FDOPENDIR''@|$(HAVE_FDOPENDIR)|g' \
+	      -e 's|@''HAVE_SCANDIR''@|$(HAVE_SCANDIR)|g' \
+	      -e 's|@''HAVE_ALPHASORT''@|$(HAVE_ALPHASORT)|g' \
+	      -e 's|@''REPLACE_OPENDIR''@|$(REPLACE_OPENDIR)|g' \
+	      -e 's|@''REPLACE_CLOSEDIR''@|$(REPLACE_CLOSEDIR)|g' \
+	      -e 's|@''REPLACE_DIRFD''@|$(REPLACE_DIRFD)|g' \
+	      -e 's|@''REPLACE_FDOPENDIR''@|$(REPLACE_FDOPENDIR)|g' \
+	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+	      < $(srcdir)/dirent.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+MOSTLYCLEANFILES += dirent.h dirent.h-t
+
+EXTRA_DIST += dirent.in.h
+
+## end   gnulib module dirent
+
+## begin gnulib module limits-h
+
+BUILT_SOURCES += $(LIMITS_H)
+
+# We need the following in order to create <limits.h> when the system
+# doesn't have one that is compatible with GNU.
+if GL_GENERATE_LIMITS_H
+limits.h: limits.in.h $(top_builddir)/config.status
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_LIMITS_H''@|$(NEXT_LIMITS_H)|g' \
+	      < $(srcdir)/limits.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+else
+limits.h: $(top_builddir)/config.status
+	rm -f $@
+endif
+MOSTLYCLEANFILES += limits.h limits.h-t
+
+EXTRA_DIST += limits.in.h
+
+## end   gnulib module limits-h
+
+## begin gnulib module malloc-gnu
+
+
+EXTRA_DIST += malloc.c
+
+EXTRA_libgnu_la_SOURCES += malloc.c
+
+## end   gnulib module malloc-gnu
+
+## begin gnulib module malloc-posix
+
+
+EXTRA_DIST += malloc.c
+
+EXTRA_libgnu_la_SOURCES += malloc.c
+
+## end   gnulib module malloc-posix
+
+## begin gnulib module malloca
+
+libgnu_la_SOURCES += malloca.c
+
+EXTRA_DIST += malloca.h malloca.valgrind
+
+## end   gnulib module malloca
+
+## begin gnulib module realloc-gnu
+
+
+EXTRA_DIST += realloc.c
+
+EXTRA_libgnu_la_SOURCES += realloc.c
+
+## end   gnulib module realloc-gnu
+
+## begin gnulib module realloc-posix
+
+
+EXTRA_DIST += realloc.c
+
+EXTRA_libgnu_la_SOURCES += realloc.c
+
+## end   gnulib module realloc-posix
+
+## begin gnulib module setenv
+
+
+EXTRA_DIST += setenv.c
+
+EXTRA_libgnu_la_SOURCES += setenv.c
+
+## end   gnulib module setenv
+
+## begin gnulib module snippet/_Noreturn
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+_NORETURN_H=$(srcdir)/_Noreturn.h
+
+EXTRA_DIST += _Noreturn.h
+
+## end   gnulib module snippet/_Noreturn
+
+## begin gnulib module snippet/arg-nonnull
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+ARG_NONNULL_H=$(srcdir)/arg-nonnull.h
+
+EXTRA_DIST += arg-nonnull.h
+
+## end   gnulib module snippet/arg-nonnull
+
+## begin gnulib module snippet/c++defs
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+CXXDEFS_H=$(srcdir)/c++defs.h
+
+EXTRA_DIST += c++defs.h
+
+## end   gnulib module snippet/c++defs
+
+## begin gnulib module snippet/warn-on-use
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+WARN_ON_USE_H=$(srcdir)/warn-on-use.h
+
+EXTRA_DIST += warn-on-use.h
+
+## end   gnulib module snippet/warn-on-use
+
+## begin gnulib module stddef
+
+BUILT_SOURCES += $(STDDEF_H)
+
+# We need the following in order to create <stddef.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_STDDEF_H
+stddef.h: stddef.in.h $(top_builddir)/config.status
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \
+	      -e 's|@''HAVE_MAX_ALIGN_T''@|$(HAVE_MAX_ALIGN_T)|g' \
+	      -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \
+	      -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \
+	      < $(srcdir)/stddef.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+else
+stddef.h: $(top_builddir)/config.status
+	rm -f $@
+endif
+MOSTLYCLEANFILES += stddef.h stddef.h-t
+
+EXTRA_DIST += stddef.in.h
+
+## end   gnulib module stddef
+
+## begin gnulib module stdint
+
+BUILT_SOURCES += $(STDINT_H)
+
+# We need the following in order to create <stdint.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_STDINT_H
+stdint.h: stdint.in.h $(top_builddir)/config.status
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_STDINT_H''@|$(NEXT_STDINT_H)|g' \
+	      -e 's/@''HAVE_C99_STDINT_H''@/$(HAVE_C99_STDINT_H)/g' \
+	      -e 's/@''HAVE_SYS_TYPES_H''@/$(HAVE_SYS_TYPES_H)/g' \
+	      -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \
+	      -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \
+	      -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \
+	      -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \
+	      -e 's/@''HAVE_LONG_LONG_INT''@/$(HAVE_LONG_LONG_INT)/g' \
+	      -e 's/@''HAVE_UNSIGNED_LONG_LONG_INT''@/$(HAVE_UNSIGNED_LONG_LONG_INT)/g' \
+	      -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
+	      -e 's/@''BITSIZEOF_PTRDIFF_T''@/$(BITSIZEOF_PTRDIFF_T)/g' \
+	      -e 's/@''PTRDIFF_T_SUFFIX''@/$(PTRDIFF_T_SUFFIX)/g' \
+	      -e 's/@''BITSIZEOF_SIG_ATOMIC_T''@/$(BITSIZEOF_SIG_ATOMIC_T)/g' \
+	      -e 's/@''HAVE_SIGNED_SIG_ATOMIC_T''@/$(HAVE_SIGNED_SIG_ATOMIC_T)/g' \
+	      -e 's/@''SIG_ATOMIC_T_SUFFIX''@/$(SIG_ATOMIC_T_SUFFIX)/g' \
+	      -e 's/@''BITSIZEOF_SIZE_T''@/$(BITSIZEOF_SIZE_T)/g' \
+	      -e 's/@''SIZE_T_SUFFIX''@/$(SIZE_T_SUFFIX)/g' \
+	      -e 's/@''BITSIZEOF_WCHAR_T''@/$(BITSIZEOF_WCHAR_T)/g' \
+	      -e 's/@''HAVE_SIGNED_WCHAR_T''@/$(HAVE_SIGNED_WCHAR_T)/g' \
+	      -e 's/@''WCHAR_T_SUFFIX''@/$(WCHAR_T_SUFFIX)/g' \
+	      -e 's/@''BITSIZEOF_WINT_T''@/$(BITSIZEOF_WINT_T)/g' \
+	      -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \
+	      -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \
+	      -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \
+	      < $(srcdir)/stdint.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+else
+stdint.h: $(top_builddir)/config.status
+	rm -f $@
+endif
+MOSTLYCLEANFILES += stdint.h stdint.h-t
+
+EXTRA_DIST += stdint.in.h
+
+## end   gnulib module stdint
+
+## begin gnulib module stdlib
+
+BUILT_SOURCES += stdlib.h
+
+# We need the following in order to create <stdlib.h> when the system
+# doesn't have one that works with the given compiler.
+stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
+  $(_NORETURN_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \
+	      -e 's/@''GNULIB__EXIT''@/$(GNULIB__EXIT)/g' \
+	      -e 's/@''GNULIB_ATOLL''@/$(GNULIB_ATOLL)/g' \
+	      -e 's/@''GNULIB_CALLOC_POSIX''@/$(GNULIB_CALLOC_POSIX)/g' \
+	      -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GNULIB_CANONICALIZE_FILE_NAME)/g' \
+	      -e 's/@''GNULIB_GETLOADAVG''@/$(GNULIB_GETLOADAVG)/g' \
+	      -e 's/@''GNULIB_GETSUBOPT''@/$(GNULIB_GETSUBOPT)/g' \
+	      -e 's/@''GNULIB_GRANTPT''@/$(GNULIB_GRANTPT)/g' \
+	      -e 's/@''GNULIB_MALLOC_POSIX''@/$(GNULIB_MALLOC_POSIX)/g' \
+	      -e 's/@''GNULIB_MBTOWC''@/$(GNULIB_MBTOWC)/g' \
+	      -e 's/@''GNULIB_MKDTEMP''@/$(GNULIB_MKDTEMP)/g' \
+	      -e 's/@''GNULIB_MKOSTEMP''@/$(GNULIB_MKOSTEMP)/g' \
+	      -e 's/@''GNULIB_MKOSTEMPS''@/$(GNULIB_MKOSTEMPS)/g' \
+	      -e 's/@''GNULIB_MKSTEMP''@/$(GNULIB_MKSTEMP)/g' \
+	      -e 's/@''GNULIB_MKSTEMPS''@/$(GNULIB_MKSTEMPS)/g' \
+	      -e 's/@''GNULIB_POSIX_OPENPT''@/$(GNULIB_POSIX_OPENPT)/g' \
+	      -e 's/@''GNULIB_PTSNAME''@/$(GNULIB_PTSNAME)/g' \
+	      -e 's/@''GNULIB_PTSNAME_R''@/$(GNULIB_PTSNAME_R)/g' \
+	      -e 's/@''GNULIB_PUTENV''@/$(GNULIB_PUTENV)/g' \
+	      -e 's/@''GNULIB_QSORT_R''@/$(GNULIB_QSORT_R)/g' \
+	      -e 's/@''GNULIB_RANDOM''@/$(GNULIB_RANDOM)/g' \
+	      -e 's/@''GNULIB_RANDOM_R''@/$(GNULIB_RANDOM_R)/g' \
+	      -e 's/@''GNULIB_REALLOC_POSIX''@/$(GNULIB_REALLOC_POSIX)/g' \
+	      -e 's/@''GNULIB_REALPATH''@/$(GNULIB_REALPATH)/g' \
+	      -e 's/@''GNULIB_RPMATCH''@/$(GNULIB_RPMATCH)/g' \
+	      -e 's/@''GNULIB_SECURE_GETENV''@/$(GNULIB_SECURE_GETENV)/g' \
+	      -e 's/@''GNULIB_SETENV''@/$(GNULIB_SETENV)/g' \
+	      -e 's/@''GNULIB_STRTOD''@/$(GNULIB_STRTOD)/g' \
+	      -e 's/@''GNULIB_STRTOLL''@/$(GNULIB_STRTOLL)/g' \
+	      -e 's/@''GNULIB_STRTOULL''@/$(GNULIB_STRTOULL)/g' \
+	      -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GNULIB_SYSTEM_POSIX)/g' \
+	      -e 's/@''GNULIB_UNLOCKPT''@/$(GNULIB_UNLOCKPT)/g' \
+	      -e 's/@''GNULIB_UNSETENV''@/$(GNULIB_UNSETENV)/g' \
+	      -e 's/@''GNULIB_WCTOMB''@/$(GNULIB_WCTOMB)/g' \
+	      < $(srcdir)/stdlib.in.h | \
+	  sed -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \
+	      -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \
+	      -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \
+	      -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \
+	      -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
+	      -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \
+	      -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \
+	      -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \
+	      -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \
+	      -e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \
+	      -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \
+	      -e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \
+	      -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \
+	      -e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \
+	      -e 's|@''HAVE_QSORT_R''@|$(HAVE_QSORT_R)|g' \
+	      -e 's|@''HAVE_RANDOM''@|$(HAVE_RANDOM)|g' \
+	      -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \
+	      -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \
+	      -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \
+	      -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \
+	      -e 's|@''HAVE_SECURE_GETENV''@|$(HAVE_SECURE_GETENV)|g' \
+	      -e 's|@''HAVE_DECL_SETENV''@|$(HAVE_DECL_SETENV)|g' \
+	      -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \
+	      -e 's|@''HAVE_STRTOLL''@|$(HAVE_STRTOLL)|g' \
+	      -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \
+	      -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \
+	      -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \
+	      -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \
+	      -e 's|@''HAVE_DECL_UNSETENV''@|$(HAVE_DECL_UNSETENV)|g' \
+	      -e 's|@''REPLACE_CALLOC''@|$(REPLACE_CALLOC)|g' \
+	      -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \
+	      -e 's|@''REPLACE_MALLOC''@|$(REPLACE_MALLOC)|g' \
+	      -e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \
+	      -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
+	      -e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \
+	      -e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \
+	      -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \
+	      -e 's|@''REPLACE_QSORT_R''@|$(REPLACE_QSORT_R)|g' \
+	      -e 's|@''REPLACE_RANDOM_R''@|$(REPLACE_RANDOM_R)|g' \
+	      -e 's|@''REPLACE_REALLOC''@|$(REPLACE_REALLOC)|g' \
+	      -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \
+	      -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \
+	      -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \
+	      -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \
+	      -e 's|@''REPLACE_WCTOMB''@|$(REPLACE_WCTOMB)|g' \
+	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+	      -e '/definition of _Noreturn/r $(_NORETURN_H)' \
+	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+	} > $@-t && \
+	mv $@-t $@
+MOSTLYCLEANFILES += stdlib.h stdlib.h-t
+
+EXTRA_DIST += stdlib.in.h
+
+## end   gnulib module stdlib
+
+## begin gnulib module string
+
+BUILT_SOURCES += string.h
+
+# We need the following in order to create <string.h> when the system
+# doesn't have one that works with the given compiler.
+string.h: string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \
+	      -e 's/@''GNULIB_FFSL''@/$(GNULIB_FFSL)/g' \
+	      -e 's/@''GNULIB_FFSLL''@/$(GNULIB_FFSLL)/g' \
+	      -e 's/@''GNULIB_MBSLEN''@/$(GNULIB_MBSLEN)/g' \
+	      -e 's/@''GNULIB_MBSNLEN''@/$(GNULIB_MBSNLEN)/g' \
+	      -e 's/@''GNULIB_MBSCHR''@/$(GNULIB_MBSCHR)/g' \
+	      -e 's/@''GNULIB_MBSRCHR''@/$(GNULIB_MBSRCHR)/g' \
+	      -e 's/@''GNULIB_MBSSTR''@/$(GNULIB_MBSSTR)/g' \
+	      -e 's/@''GNULIB_MBSCASECMP''@/$(GNULIB_MBSCASECMP)/g' \
+	      -e 's/@''GNULIB_MBSNCASECMP''@/$(GNULIB_MBSNCASECMP)/g' \
+	      -e 's/@''GNULIB_MBSPCASECMP''@/$(GNULIB_MBSPCASECMP)/g' \
+	      -e 's/@''GNULIB_MBSCASESTR''@/$(GNULIB_MBSCASESTR)/g' \
+	      -e 's/@''GNULIB_MBSCSPN''@/$(GNULIB_MBSCSPN)/g' \
+	      -e 's/@''GNULIB_MBSPBRK''@/$(GNULIB_MBSPBRK)/g' \
+	      -e 's/@''GNULIB_MBSSPN''@/$(GNULIB_MBSSPN)/g' \
+	      -e 's/@''GNULIB_MBSSEP''@/$(GNULIB_MBSSEP)/g' \
+	      -e 's/@''GNULIB_MBSTOK_R''@/$(GNULIB_MBSTOK_R)/g' \
+	      -e 's/@''GNULIB_MEMCHR''@/$(GNULIB_MEMCHR)/g' \
+	      -e 's/@''GNULIB_MEMMEM''@/$(GNULIB_MEMMEM)/g' \
+	      -e 's/@''GNULIB_MEMPCPY''@/$(GNULIB_MEMPCPY)/g' \
+	      -e 's/@''GNULIB_MEMRCHR''@/$(GNULIB_MEMRCHR)/g' \
+	      -e 's/@''GNULIB_RAWMEMCHR''@/$(GNULIB_RAWMEMCHR)/g' \
+	      -e 's/@''GNULIB_STPCPY''@/$(GNULIB_STPCPY)/g' \
+	      -e 's/@''GNULIB_STPNCPY''@/$(GNULIB_STPNCPY)/g' \
+	      -e 's/@''GNULIB_STRCHRNUL''@/$(GNULIB_STRCHRNUL)/g' \
+	      -e 's/@''GNULIB_STRDUP''@/$(GNULIB_STRDUP)/g' \
+	      -e 's/@''GNULIB_STRNCAT''@/$(GNULIB_STRNCAT)/g' \
+	      -e 's/@''GNULIB_STRNDUP''@/$(GNULIB_STRNDUP)/g' \
+	      -e 's/@''GNULIB_STRNLEN''@/$(GNULIB_STRNLEN)/g' \
+	      -e 's/@''GNULIB_STRPBRK''@/$(GNULIB_STRPBRK)/g' \
+	      -e 's/@''GNULIB_STRSEP''@/$(GNULIB_STRSEP)/g' \
+	      -e 's/@''GNULIB_STRSTR''@/$(GNULIB_STRSTR)/g' \
+	      -e 's/@''GNULIB_STRCASESTR''@/$(GNULIB_STRCASESTR)/g' \
+	      -e 's/@''GNULIB_STRTOK_R''@/$(GNULIB_STRTOK_R)/g' \
+	      -e 's/@''GNULIB_STRERROR''@/$(GNULIB_STRERROR)/g' \
+	      -e 's/@''GNULIB_STRERROR_R''@/$(GNULIB_STRERROR_R)/g' \
+	      -e 's/@''GNULIB_STRSIGNAL''@/$(GNULIB_STRSIGNAL)/g' \
+	      -e 's/@''GNULIB_STRVERSCMP''@/$(GNULIB_STRVERSCMP)/g' \
+	      < $(srcdir)/string.in.h | \
+	  sed -e 's|@''HAVE_FFSL''@|$(HAVE_FFSL)|g' \
+	      -e 's|@''HAVE_FFSLL''@|$(HAVE_FFSLL)|g' \
+	      -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \
+	      -e 's|@''HAVE_MEMCHR''@|$(HAVE_MEMCHR)|g' \
+	      -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \
+	      -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \
+	      -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \
+	      -e 's|@''HAVE_RAWMEMCHR''@|$(HAVE_RAWMEMCHR)|g' \
+	      -e 's|@''HAVE_STPCPY''@|$(HAVE_STPCPY)|g' \
+	      -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \
+	      -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \
+	      -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \
+	      -e 's|@''HAVE_DECL_STRNDUP''@|$(HAVE_DECL_STRNDUP)|g' \
+	      -e 's|@''HAVE_DECL_STRNLEN''@|$(HAVE_DECL_STRNLEN)|g' \
+	      -e 's|@''HAVE_STRPBRK''@|$(HAVE_STRPBRK)|g' \
+	      -e 's|@''HAVE_STRSEP''@|$(HAVE_STRSEP)|g' \
+	      -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \
+	      -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \
+	      -e 's|@''HAVE_DECL_STRERROR_R''@|$(HAVE_DECL_STRERROR_R)|g' \
+	      -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \
+	      -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \
+	      -e 's|@''REPLACE_STPNCPY''@|$(REPLACE_STPNCPY)|g' \
+	      -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \
+	      -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \
+	      -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \
+	      -e 's|@''REPLACE_STRCHRNUL''@|$(REPLACE_STRCHRNUL)|g' \
+	      -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \
+	      -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \
+	      -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \
+	      -e 's|@''REPLACE_STRERROR_R''@|$(REPLACE_STRERROR_R)|g' \
+	      -e 's|@''REPLACE_STRNCAT''@|$(REPLACE_STRNCAT)|g' \
+	      -e 's|@''REPLACE_STRNDUP''@|$(REPLACE_STRNDUP)|g' \
+	      -e 's|@''REPLACE_STRNLEN''@|$(REPLACE_STRNLEN)|g' \
+	      -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \
+	      -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \
+	      -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \
+	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+	      < $(srcdir)/string.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+MOSTLYCLEANFILES += string.h string.h-t
+
+EXTRA_DIST += string.in.h
+
+## end   gnulib module string
+
+## begin gnulib module strndup
+
+
+EXTRA_DIST += strndup.c
+
+EXTRA_libgnu_la_SOURCES += strndup.c
+
+## end   gnulib module strndup
+
+## begin gnulib module strnlen
+
+
+EXTRA_DIST += strnlen.c
+
+EXTRA_libgnu_la_SOURCES += strnlen.c
+
+## end   gnulib module strnlen
+
+## begin gnulib module sys_types
+
+BUILT_SOURCES += sys/types.h
+
+# We need the following in order to create <sys/types.h> when the system
+# doesn't have one that works with the given compiler.
+sys/types.h: sys_types.in.h $(top_builddir)/config.status
+	$(AM_V_at)$(MKDIR_P) sys
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_SYS_TYPES_H''@|$(NEXT_SYS_TYPES_H)|g' \
+	      -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
+	      < $(srcdir)/sys_types.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+MOSTLYCLEANFILES += sys/types.h sys/types.h-t
+
+EXTRA_DIST += sys_types.in.h
+
+## end   gnulib module sys_types
+
+## begin gnulib module unistd
+
+BUILT_SOURCES += unistd.h
+libgnu_la_SOURCES += unistd.c
+
+# We need the following in order to create an empty placeholder for
+# <unistd.h> when the system doesn't have one.
+unistd.h: unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \
+	      -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
+	      -e 's/@''GNULIB_CHDIR''@/$(GNULIB_CHDIR)/g' \
+	      -e 's/@''GNULIB_CHOWN''@/$(GNULIB_CHOWN)/g' \
+	      -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \
+	      -e 's/@''GNULIB_DUP''@/$(GNULIB_DUP)/g' \
+	      -e 's/@''GNULIB_DUP2''@/$(GNULIB_DUP2)/g' \
+	      -e 's/@''GNULIB_DUP3''@/$(GNULIB_DUP3)/g' \
+	      -e 's/@''GNULIB_ENVIRON''@/$(GNULIB_ENVIRON)/g' \
+	      -e 's/@''GNULIB_EUIDACCESS''@/$(GNULIB_EUIDACCESS)/g' \
+	      -e 's/@''GNULIB_FACCESSAT''@/$(GNULIB_FACCESSAT)/g' \
+	      -e 's/@''GNULIB_FCHDIR''@/$(GNULIB_FCHDIR)/g' \
+	      -e 's/@''GNULIB_FCHOWNAT''@/$(GNULIB_FCHOWNAT)/g' \
+	      -e 's/@''GNULIB_FDATASYNC''@/$(GNULIB_FDATASYNC)/g' \
+	      -e 's/@''GNULIB_FSYNC''@/$(GNULIB_FSYNC)/g' \
+	      -e 's/@''GNULIB_FTRUNCATE''@/$(GNULIB_FTRUNCATE)/g' \
+	      -e 's/@''GNULIB_GETCWD''@/$(GNULIB_GETCWD)/g' \
+	      -e 's/@''GNULIB_GETDOMAINNAME''@/$(GNULIB_GETDOMAINNAME)/g' \
+	      -e 's/@''GNULIB_GETDTABLESIZE''@/$(GNULIB_GETDTABLESIZE)/g' \
+	      -e 's/@''GNULIB_GETGROUPS''@/$(GNULIB_GETGROUPS)/g' \
+	      -e 's/@''GNULIB_GETHOSTNAME''@/$(GNULIB_GETHOSTNAME)/g' \
+	      -e 's/@''GNULIB_GETLOGIN''@/$(GNULIB_GETLOGIN)/g' \
+	      -e 's/@''GNULIB_GETLOGIN_R''@/$(GNULIB_GETLOGIN_R)/g' \
+	      -e 's/@''GNULIB_GETPAGESIZE''@/$(GNULIB_GETPAGESIZE)/g' \
+	      -e 's/@''GNULIB_GETUSERSHELL''@/$(GNULIB_GETUSERSHELL)/g' \
+	      -e 's/@''GNULIB_GROUP_MEMBER''@/$(GNULIB_GROUP_MEMBER)/g' \
+	      -e 's/@''GNULIB_ISATTY''@/$(GNULIB_ISATTY)/g' \
+	      -e 's/@''GNULIB_LCHOWN''@/$(GNULIB_LCHOWN)/g' \
+	      -e 's/@''GNULIB_LINK''@/$(GNULIB_LINK)/g' \
+	      -e 's/@''GNULIB_LINKAT''@/$(GNULIB_LINKAT)/g' \
+	      -e 's/@''GNULIB_LSEEK''@/$(GNULIB_LSEEK)/g' \
+	      -e 's/@''GNULIB_PIPE''@/$(GNULIB_PIPE)/g' \
+	      -e 's/@''GNULIB_PIPE2''@/$(GNULIB_PIPE2)/g' \
+	      -e 's/@''GNULIB_PREAD''@/$(GNULIB_PREAD)/g' \
+	      -e 's/@''GNULIB_PWRITE''@/$(GNULIB_PWRITE)/g' \
+	      -e 's/@''GNULIB_READ''@/$(GNULIB_READ)/g' \
+	      -e 's/@''GNULIB_READLINK''@/$(GNULIB_READLINK)/g' \
+	      -e 's/@''GNULIB_READLINKAT''@/$(GNULIB_READLINKAT)/g' \
+	      -e 's/@''GNULIB_RMDIR''@/$(GNULIB_RMDIR)/g' \
+	      -e 's/@''GNULIB_SETHOSTNAME''@/$(GNULIB_SETHOSTNAME)/g' \
+	      -e 's/@''GNULIB_SLEEP''@/$(GNULIB_SLEEP)/g' \
+	      -e 's/@''GNULIB_SYMLINK''@/$(GNULIB_SYMLINK)/g' \
+	      -e 's/@''GNULIB_SYMLINKAT''@/$(GNULIB_SYMLINKAT)/g' \
+	      -e 's/@''GNULIB_TTYNAME_R''@/$(GNULIB_TTYNAME_R)/g' \
+	      -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GNULIB_GL_UNISTD_H_GETOPT)/g' \
+	      -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GNULIB_UNISTD_H_NONBLOCKING)/g' \
+	      -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GNULIB_UNISTD_H_SIGPIPE)/g' \
+	      -e 's/@''GNULIB_UNLINK''@/$(GNULIB_UNLINK)/g' \
+	      -e 's/@''GNULIB_UNLINKAT''@/$(GNULIB_UNLINKAT)/g' \
+	      -e 's/@''GNULIB_USLEEP''@/$(GNULIB_USLEEP)/g' \
+	      -e 's/@''GNULIB_WRITE''@/$(GNULIB_WRITE)/g' \
+	      < $(srcdir)/unistd.in.h | \
+	  sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \
+	      -e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \
+	      -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \
+	      -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \
+	      -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \
+	      -e 's|@''HAVE_FCHDIR''@|$(HAVE_FCHDIR)|g' \
+	      -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \
+	      -e 's|@''HAVE_FDATASYNC''@|$(HAVE_FDATASYNC)|g' \
+	      -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \
+	      -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \
+	      -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \
+	      -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \
+	      -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \
+	      -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \
+	      -e 's|@''HAVE_GROUP_MEMBER''@|$(HAVE_GROUP_MEMBER)|g' \
+	      -e 's|@''HAVE_LCHOWN''@|$(HAVE_LCHOWN)|g' \
+	      -e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \
+	      -e 's|@''HAVE_LINKAT''@|$(HAVE_LINKAT)|g' \
+	      -e 's|@''HAVE_PIPE''@|$(HAVE_PIPE)|g' \
+	      -e 's|@''HAVE_PIPE2''@|$(HAVE_PIPE2)|g' \
+	      -e 's|@''HAVE_PREAD''@|$(HAVE_PREAD)|g' \
+	      -e 's|@''HAVE_PWRITE''@|$(HAVE_PWRITE)|g' \
+	      -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \
+	      -e 's|@''HAVE_READLINKAT''@|$(HAVE_READLINKAT)|g' \
+	      -e 's|@''HAVE_SETHOSTNAME''@|$(HAVE_SETHOSTNAME)|g' \
+	      -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \
+	      -e 's|@''HAVE_SYMLINK''@|$(HAVE_SYMLINK)|g' \
+	      -e 's|@''HAVE_SYMLINKAT''@|$(HAVE_SYMLINKAT)|g' \
+	      -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \
+	      -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \
+	      -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \
+	      -e 's|@''HAVE_DECL_FCHDIR''@|$(HAVE_DECL_FCHDIR)|g' \
+	      -e 's|@''HAVE_DECL_FDATASYNC''@|$(HAVE_DECL_FDATASYNC)|g' \
+	      -e 's|@''HAVE_DECL_GETDOMAINNAME''@|$(HAVE_DECL_GETDOMAINNAME)|g' \
+	      -e 's|@''HAVE_DECL_GETLOGIN''@|$(HAVE_DECL_GETLOGIN)|g' \
+	      -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \
+	      -e 's|@''HAVE_DECL_GETPAGESIZE''@|$(HAVE_DECL_GETPAGESIZE)|g' \
+	      -e 's|@''HAVE_DECL_GETUSERSHELL''@|$(HAVE_DECL_GETUSERSHELL)|g' \
+	      -e 's|@''HAVE_DECL_SETHOSTNAME''@|$(HAVE_DECL_SETHOSTNAME)|g' \
+	      -e 's|@''HAVE_DECL_TTYNAME_R''@|$(HAVE_DECL_TTYNAME_R)|g' \
+	      -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \
+	      -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \
+	  | \
+	  sed -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \
+	      -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \
+	      -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \
+	      -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \
+	      -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \
+	      -e 's|@''REPLACE_FTRUNCATE''@|$(REPLACE_FTRUNCATE)|g' \
+	      -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \
+	      -e 's|@''REPLACE_GETDOMAINNAME''@|$(REPLACE_GETDOMAINNAME)|g' \
+	      -e 's|@''REPLACE_GETDTABLESIZE''@|$(REPLACE_GETDTABLESIZE)|g' \
+	      -e 's|@''REPLACE_GETLOGIN_R''@|$(REPLACE_GETLOGIN_R)|g' \
+	      -e 's|@''REPLACE_GETGROUPS''@|$(REPLACE_GETGROUPS)|g' \
+	      -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \
+	      -e 's|@''REPLACE_ISATTY''@|$(REPLACE_ISATTY)|g' \
+	      -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \
+	      -e 's|@''REPLACE_LINK''@|$(REPLACE_LINK)|g' \
+	      -e 's|@''REPLACE_LINKAT''@|$(REPLACE_LINKAT)|g' \
+	      -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \
+	      -e 's|@''REPLACE_PREAD''@|$(REPLACE_PREAD)|g' \
+	      -e 's|@''REPLACE_PWRITE''@|$(REPLACE_PWRITE)|g' \
+	      -e 's|@''REPLACE_READ''@|$(REPLACE_READ)|g' \
+	      -e 's|@''REPLACE_READLINK''@|$(REPLACE_READLINK)|g' \
+	      -e 's|@''REPLACE_READLINKAT''@|$(REPLACE_READLINKAT)|g' \
+	      -e 's|@''REPLACE_RMDIR''@|$(REPLACE_RMDIR)|g' \
+	      -e 's|@''REPLACE_SLEEP''@|$(REPLACE_SLEEP)|g' \
+	      -e 's|@''REPLACE_SYMLINK''@|$(REPLACE_SYMLINK)|g' \
+	      -e 's|@''REPLACE_SYMLINKAT''@|$(REPLACE_SYMLINKAT)|g' \
+	      -e 's|@''REPLACE_TTYNAME_R''@|$(REPLACE_TTYNAME_R)|g' \
+	      -e 's|@''REPLACE_UNLINK''@|$(REPLACE_UNLINK)|g' \
+	      -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \
+	      -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \
+	      -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \
+	      -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \
+	      -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
+	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+	} > $@-t && \
+	mv $@-t $@
+MOSTLYCLEANFILES += unistd.h unistd.h-t
+
+EXTRA_DIST += unistd.in.h
+
+## end   gnulib module unistd
+
+## begin gnulib module verify
+
+
+EXTRA_DIST += verify.h
+
+## end   gnulib module verify
+
+## begin gnulib module xalloc-oversized
+
+
+EXTRA_DIST += xalloc-oversized.h
+
+## end   gnulib module xalloc-oversized
+
+
+mostlyclean-local: mostlyclean-generic
+	@for dir in '' $(MOSTLYCLEANDIRS); do \
+	  if test -n "$$dir" && test -d $$dir; then \
+	    echo "rmdir $$dir"; rmdir $$dir; \
+	  fi; \
+	done; \
+	:
diff --git a/liblouis/gnulib/_Noreturn.h b/liblouis/gnulib/_Noreturn.h
new file mode 100644
index 0000000..c44ad89
--- /dev/null
+++ b/liblouis/gnulib/_Noreturn.h
@@ -0,0 +1,10 @@
+#if !defined _Noreturn && __STDC_VERSION__ < 201112
+# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \
+      || 0x5110 <= __SUNPRO_C)
+#  define _Noreturn __attribute__ ((__noreturn__))
+# elif 1200 <= _MSC_VER
+#  define _Noreturn __declspec (noreturn)
+# else
+#  define _Noreturn
+# endif
+#endif
diff --git a/liblouis/gnulib/alloca.in.h b/liblouis/gnulib/alloca.in.h
new file mode 100644
index 0000000..c3dc38a
--- /dev/null
+++ b/liblouis/gnulib/alloca.in.h
@@ -0,0 +1,65 @@
+/* Memory allocation on the stack.
+
+   Copyright (C) 1995, 1999, 2001-2004, 2006-2017 Free Software Foundation,
+   Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public
+   License along with this program; if not, see
+   <http://www.gnu.org/licenses/>.
+  */
+
+/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
+   means there is a real alloca function.  */
+#ifndef _GL_ALLOCA_H
+#define _GL_ALLOCA_H
+
+/* alloca (N) returns a pointer to N bytes of memory
+   allocated on the stack, which will last until the function returns.
+   Use of alloca should be avoided:
+     - inside arguments of function calls - undefined behaviour,
+     - in inline functions - the allocation may actually last until the
+       calling function returns,
+     - for huge N (say, N >= 65536) - you never know how large (or small)
+       the stack is, and when the stack cannot fulfill the memory allocation
+       request, the program just crashes.
+ */
+
+#ifndef alloca
+# ifdef __GNUC__
+#  define alloca __builtin_alloca
+# elif defined _AIX
+#  define alloca __alloca
+# elif defined _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# elif defined __DECC && defined __VMS
+#  define alloca __ALLOCA
+# elif defined __TANDEM && defined _TNS_E_TARGET
+#  ifdef  __cplusplus
+extern "C"
+#  endif
+void *_alloca (unsigned short);
+#  pragma intrinsic (_alloca)
+#  define alloca _alloca
+# elif defined __MVS__
+#  include <stdlib.h>
+# else
+#  include <stddef.h>
+#  ifdef  __cplusplus
+extern "C"
+#  endif
+void *alloca (size_t);
+# endif
+#endif
+
+#endif /* _GL_ALLOCA_H */
diff --git a/liblouis/gnulib/arg-nonnull.h b/liblouis/gnulib/arg-nonnull.h
new file mode 100644
index 0000000..1e62cc8
--- /dev/null
+++ b/liblouis/gnulib/arg-nonnull.h
@@ -0,0 +1,26 @@
+/* A C macro for declaring that specific arguments must not be NULL.
+   Copyright (C) 2009-2017 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
+   that the values passed as arguments n, ..., m must be non-NULL pointers.
+   n = 1 stands for the first argument, n = 2 for the second argument etc.  */
+#ifndef _GL_ARG_NONNULL
+# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+#  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
+# else
+#  define _GL_ARG_NONNULL(params)
+# endif
+#endif
diff --git a/liblouis/gnulib/c++defs.h b/liblouis/gnulib/c++defs.h
new file mode 100644
index 0000000..f03f359
--- /dev/null
+++ b/liblouis/gnulib/c++defs.h
@@ -0,0 +1,316 @@
+/* C++ compatible function declaration macros.
+   Copyright (C) 2010-2017 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_CXXDEFS_H
+#define _GL_CXXDEFS_H
+
+/* Begin/end the GNULIB_NAMESPACE namespace.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
+# define _GL_END_NAMESPACE }
+#else
+# define _GL_BEGIN_NAMESPACE
+# define _GL_END_NAMESPACE
+#endif
+
+/* The three most frequent use cases of these macros are:
+
+   * For providing a substitute for a function that is missing on some
+     platforms, but is declared and works fine on the platforms on which
+     it exists:
+
+       #if @GNULIB_FOO@
+       # if !@HAVE_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       # endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on all platforms,
+     but is broken/insufficient and needs to be replaced on some platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on some platforms
+     but is broken/insufficient and needs to be replaced on some of them and
+     is additionally either missing or undeclared on some other platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       #  if !@HAVE_FOO@   or   if !@HAVE_DECL_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       #  endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+*/
+
+/* _GL_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#if defined __cplusplus
+# define _GL_EXTERN_C extern "C"
+#else
+# define _GL_EXTERN_C extern
+#endif
+
+/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
+   declares a replacement function, named rpl_func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
+  _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
+#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype rpl_func parameters_and_attributes
+
+/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
+   declares the system function, named func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype func parameters_and_attributes
+
+/* _GL_CXXALIAS_RPL (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+
+   Wrapping rpl_func in an object with an inline conversion operator
+   avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::rpl_func;                                  \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
+   is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
+   except that the C function rpl_func may have a slightly different
+   declaration.  A cast is used to silence the "invalid conversion" error
+   that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                     \
+    {                                                              \
+      static const struct _gl_ ## func ## _wrapper                 \
+      {                                                            \
+        typedef rettype (*type) parameters;                        \
+                                                                   \
+        inline operator type () const                              \
+        {                                                          \
+          return reinterpret_cast<type>(::rpl_func);               \
+        }                                                          \
+      } func = {};                                                 \
+    }                                                              \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to the system provided function func, if GNULIB_NAMESPACE
+   is defined.
+   Example:
+     _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+
+   Wrapping func in an object with an inline conversion operator
+   avoids a reference to func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS(func,rettype,parameters)            \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::func;                                      \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                          \
+    {                                                   \
+      static const struct _gl_ ## func ## _wrapper      \
+      {                                                 \
+        typedef rettype (*type) parameters;             \
+                                                        \
+        inline operator type () const                   \
+        {                                               \
+          return reinterpret_cast<type>(::func);        \
+        }                                               \
+      } func = {};                                      \
+    }                                                   \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function is picked among a set of overloaded functions,
+   namely the one with rettype2 and parameters2.  Two consecutive casts
+   are used to silence the "cannot find a match" and "invalid conversion"
+   errors that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+  /* The outer cast must be a reinterpret_cast.
+     The inner cast: When the function is defined as a set of overloaded
+     functions, it works as a static_cast<>, choosing the designated variant.
+     When the function is defined as a single variant, it works as a
+     reinterpret_cast<>. The parenthesized cast syntax works both ways.  */
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    namespace GNULIB_NAMESPACE                                                \
+    {                                                                         \
+      static const struct _gl_ ## func ## _wrapper                            \
+      {                                                                       \
+        typedef rettype (*type) parameters;                                   \
+                                                                              \
+        inline operator type () const                                         \
+        {                                                                     \
+          return reinterpret_cast<type>((rettype2 (*) parameters2)(::func));  \
+        }                                                                     \
+      } func = {};                                                            \
+    }                                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN (func);
+   causes a warning to be emitted when ::func is used but not when
+   GNULIB_NAMESPACE::func is used.  func must be defined without overloaded
+   variants.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN(func) \
+   _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN_1(func,namespace) \
+   _GL_CXXALIASWARN_2 (func, namespace)
+/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !__OPTIMIZE__
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+    _GL_WARN_ON_USE (func, \
+                     "The symbol ::" #func " refers to the system function. " \
+                     "Use " #namespace "::" #func " instead.")
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     extern __typeof__ (func) func
+# else
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN(func) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
+   causes a warning to be emitted when the given overloaded variant of ::func
+   is used but not when GNULIB_NAMESPACE::func is used.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+   _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
+                        GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
+   _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
+/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !__OPTIMIZE__
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+                         "The symbol ::" #func " refers to the system function. " \
+                         "Use " #namespace "::" #func " instead.")
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+     extern __typeof__ (func) func
+# else
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+#endif /* _GL_CXXDEFS_H */
diff --git a/liblouis/gnulib/dirent.in.h b/liblouis/gnulib/dirent.in.h
new file mode 100644
index 0000000..f591787
--- /dev/null
+++ b/liblouis/gnulib/dirent.in.h
@@ -0,0 +1,267 @@
+/* A GNU-like <dirent.h>.
+   Copyright (C) 2006-2017 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _@GUARD_PREFIX@_DIRENT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard.  */
+#if @HAVE_DIRENT_H@
+# @INCLUDE_NEXT@ @NEXT_DIRENT_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_DIRENT_H
+#define _@GUARD_PREFIX@_DIRENT_H
+
+/* Get ino_t.  Needed on some systems, including glibc 2.8.  */
+#include <sys/types.h>
+
+#if !@HAVE_DIRENT_H@
+/* Define types DIR and 'struct dirent'.  */
+# if !GNULIB_defined_struct_dirent
+struct dirent
+{
+  char d_type;
+  char d_name[1];
+};
+/* Possible values for 'd_type'.  */
+#  define DT_UNKNOWN 0
+#  define DT_FIFO    1          /* FIFO */
+#  define DT_CHR     2          /* character device */
+#  define DT_DIR     4          /* directory */
+#  define DT_BLK     6          /* block device */
+#  define DT_REG     8          /* regular file */
+#  define DT_LNK    10          /* symbolic link */
+#  define DT_SOCK   12          /* socket */
+#  define DT_WHT    14          /* whiteout */
+typedef struct gl_directory DIR;
+#  define GNULIB_defined_struct_dirent 1
+# endif
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __pure__ was added in gcc 2.96.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE /* empty */
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+
+/* Declare overridden functions.  */
+
+#if @GNULIB_OPENDIR@
+# if @REPLACE_OPENDIR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef opendir
+#   define opendir rpl_opendir
+#   define GNULIB_defined_opendir 1
+#  endif
+_GL_FUNCDECL_RPL (opendir, DIR *, (const char *dir_name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (opendir, DIR *, (const char *dir_name));
+# else
+#  if !@HAVE_OPENDIR@
+_GL_FUNCDECL_SYS (opendir, DIR *, (const char *dir_name) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (opendir, DIR *, (const char *dir_name));
+# endif
+_GL_CXXALIASWARN (opendir);
+#elif defined GNULIB_POSIXCHECK
+# undef opendir
+# if HAVE_RAW_DECL_OPENDIR
+_GL_WARN_ON_USE (opendir, "opendir is not portable - "
+                 "use gnulib module opendir for portability");
+# endif
+#endif
+
+#if @GNULIB_READDIR@
+# if !@HAVE_READDIR@
+_GL_FUNCDECL_SYS (readdir, struct dirent *, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (readdir, struct dirent *, (DIR *dirp));
+_GL_CXXALIASWARN (readdir);
+#elif defined GNULIB_POSIXCHECK
+# undef readdir
+# if HAVE_RAW_DECL_READDIR
+_GL_WARN_ON_USE (readdir, "readdir is not portable - "
+                 "use gnulib module readdir for portability");
+# endif
+#endif
+
+#if @GNULIB_REWINDDIR@
+# if !@HAVE_REWINDDIR@
+_GL_FUNCDECL_SYS (rewinddir, void, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (rewinddir, void, (DIR *dirp));
+_GL_CXXALIASWARN (rewinddir);
+#elif defined GNULIB_POSIXCHECK
+# undef rewinddir
+# if HAVE_RAW_DECL_REWINDDIR
+_GL_WARN_ON_USE (rewinddir, "rewinddir is not portable - "
+                 "use gnulib module rewinddir for portability");
+# endif
+#endif
+
+#if @GNULIB_CLOSEDIR@
+# if @REPLACE_CLOSEDIR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef closedir
+#   define closedir rpl_closedir
+#   define GNULIB_defined_closedir 1
+#  endif
+_GL_FUNCDECL_RPL (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (closedir, int, (DIR *dirp));
+# else
+#  if !@HAVE_CLOSEDIR@
+_GL_FUNCDECL_SYS (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (closedir, int, (DIR *dirp));
+# endif
+_GL_CXXALIASWARN (closedir);
+#elif defined GNULIB_POSIXCHECK
+# undef closedir
+# if HAVE_RAW_DECL_CLOSEDIR
+_GL_WARN_ON_USE (closedir, "closedir is not portable - "
+                 "use gnulib module closedir for portability");
+# endif
+#endif
+
+#if @GNULIB_DIRFD@
+/* Return the file descriptor associated with the given directory stream,
+   or -1 if none exists.  */
+# if @REPLACE_DIRFD@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dirfd
+#   define dirfd rpl_dirfd
+#  endif
+_GL_FUNCDECL_RPL (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (dirfd, int, (DIR *));
+
+#  ifdef __KLIBC__
+/* Gnulib internal hooks needed to maintain the dirfd metadata.  */
+_GL_EXTERN_C int _gl_register_dirp_fd (int fd, DIR *dirp)
+     _GL_ARG_NONNULL ((2));
+_GL_EXTERN_C void _gl_unregister_dirp_fd (int fd);
+#  endif
+# else
+#  if defined __cplusplus && defined GNULIB_NAMESPACE && defined dirfd
+    /* dirfd is defined as a macro and not as a function.
+       Turn it into a function and get rid of the macro.  */
+static inline int (dirfd) (DIR *dp) { return dirfd (dp); }
+#   undef dirfd
+#  endif
+#  if !(@HAVE_DECL_DIRFD@ || defined dirfd)
+_GL_FUNCDECL_SYS (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (dirfd, int, (DIR *));
+# endif
+_GL_CXXALIASWARN (dirfd);
+#elif defined GNULIB_POSIXCHECK
+# undef dirfd
+# if HAVE_RAW_DECL_DIRFD
+_GL_WARN_ON_USE (dirfd, "dirfd is unportable - "
+                 "use gnulib module dirfd for portability");
+# endif
+#endif
+
+#if @GNULIB_FDOPENDIR@
+/* Open a directory stream visiting the given directory file
+   descriptor.  Return NULL and set errno if fd is not visiting a
+   directory.  On success, this function consumes fd (it will be
+   implicitly closed either by this function or by a subsequent
+   closedir).  */
+# if @REPLACE_FDOPENDIR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fdopendir
+#   define fdopendir rpl_fdopendir
+#  endif
+_GL_FUNCDECL_RPL (fdopendir, DIR *, (int fd));
+_GL_CXXALIAS_RPL (fdopendir, DIR *, (int fd));
+# else
+#  if !@HAVE_FDOPENDIR@ || !@HAVE_DECL_FDOPENDIR@
+_GL_FUNCDECL_SYS (fdopendir, DIR *, (int fd));
+#  endif
+_GL_CXXALIAS_SYS (fdopendir, DIR *, (int fd));
+# endif
+_GL_CXXALIASWARN (fdopendir);
+#elif defined GNULIB_POSIXCHECK
+# undef fdopendir
+# if HAVE_RAW_DECL_FDOPENDIR
+_GL_WARN_ON_USE (fdopendir, "fdopendir is unportable - "
+                 "use gnulib module fdopendir for portability");
+# endif
+#endif
+
+#if @GNULIB_SCANDIR@
+/* Scan the directory DIR, calling FILTER on each directory entry.
+   Entries for which FILTER returns nonzero are individually malloc'd,
+   sorted using qsort with CMP, and collected in a malloc'd array in
+   *NAMELIST.  Returns the number of entries selected, or -1 on error.  */
+# if !@HAVE_SCANDIR@
+_GL_FUNCDECL_SYS (scandir, int,
+                  (const char *dir, struct dirent ***namelist,
+                   int (*filter) (const struct dirent *),
+                   int (*cmp) (const struct dirent **, const struct dirent **))
+                  _GL_ARG_NONNULL ((1, 2, 4)));
+# endif
+/* Need to cast, because on glibc systems, the fourth parameter is
+                        int (*cmp) (const void *, const void *).  */
+_GL_CXXALIAS_SYS_CAST (scandir, int,
+                       (const char *dir, struct dirent ***namelist,
+                        int (*filter) (const struct dirent *),
+                        int (*cmp) (const struct dirent **, const struct dirent **)));
+_GL_CXXALIASWARN (scandir);
+#elif defined GNULIB_POSIXCHECK
+# undef scandir
+# if HAVE_RAW_DECL_SCANDIR
+_GL_WARN_ON_USE (scandir, "scandir is unportable - "
+                 "use gnulib module scandir for portability");
+# endif
+#endif
+
+#if @GNULIB_ALPHASORT@
+/* Compare two 'struct dirent' entries alphabetically.  */
+# if !@HAVE_ALPHASORT@
+_GL_FUNCDECL_SYS (alphasort, int,
+                  (const struct dirent **, const struct dirent **)
+                  _GL_ATTRIBUTE_PURE
+                  _GL_ARG_NONNULL ((1, 2)));
+# endif
+/* Need to cast, because on glibc systems, the parameters are
+                       (const void *, const void *).  */
+_GL_CXXALIAS_SYS_CAST (alphasort, int,
+                       (const struct dirent **, const struct dirent **));
+_GL_CXXALIASWARN (alphasort);
+#elif defined GNULIB_POSIXCHECK
+# undef alphasort
+# if HAVE_RAW_DECL_ALPHASORT
+_GL_WARN_ON_USE (alphasort, "alphasort is unportable - "
+                 "use gnulib module alphasort for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_DIRENT_H */
+#endif /* _@GUARD_PREFIX@_DIRENT_H */
diff --git a/liblouis/gnulib/limits.in.h b/liblouis/gnulib/limits.in.h
new file mode 100644
index 0000000..08d3c32
--- /dev/null
+++ b/liblouis/gnulib/limits.in.h
@@ -0,0 +1,74 @@
+/* A GNU-like <limits.h>.
+
+   Copyright 2016-2017 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License
+   as published by the Free Software Foundation; either version 3, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _@GUARD_PREFIX@_LIMITS_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard.  */
+#@INCLUDE_NEXT@ @NEXT_LIMITS_H@
+
+#ifndef _@GUARD_PREFIX@_LIMITS_H
+#define _@GUARD_PREFIX@_LIMITS_H
+
+/* For HP-UX 11.31.  */
+#if defined LONG_LONG_MIN && !defined LLONG_MIN
+# define LLONG_MIN LONG_LONG_MIN
+#endif
+#if defined LONG_LONG_MAX && !defined LLONG_MAX
+# define LLONG_MAX LONG_LONG_MAX
+#endif
+#if defined ULONG_LONG_MAX && !defined ULLONG_MAX
+# define ULLONG_MAX ULONG_LONG_MAX
+#endif
+
+/* The number of usable bits in an unsigned or signed integer type
+   with minimum value MIN and maximum value MAX, as an int expression
+   suitable in #if.  Cover all known practical hosts.  This
+   implementation exploits the fact that MAX is 1 less than a power of
+   2, and merely counts the number of 1 bits in MAX; "COBn" means
+   "count the number of 1 bits in the low-order n bits").  */
+#define _GL_INTEGER_WIDTH(min, max) (((min) < 0) + _GL_COB128 (max))
+#define _GL_COB128(n) (_GL_COB64 ((n) >> 31 >> 31 >> 2) + _GL_COB64 (n))
+#define _GL_COB64(n) (_GL_COB32 ((n) >> 31 >> 1) + _GL_COB32 (n))
+#define _GL_COB32(n) (_GL_COB16 ((n) >> 16) + _GL_COB16 (n))
+#define _GL_COB16(n) (_GL_COB8 ((n) >> 8) + _GL_COB8 (n))
+#define _GL_COB8(n) (_GL_COB4 ((n) >> 4) + _GL_COB4 (n))
+#define _GL_COB4(n) (!!((n) & 8) + !!((n) & 4) + !!((n) & 2) + !!((n) & 1))
+
+/* Macros specified by ISO/IEC TS 18661-1:2014.  */
+
+#if (! defined ULLONG_WIDTH                                             \
+     && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__))
+# define CHAR_WIDTH _GL_INTEGER_WIDTH (CHAR_MIN, CHAR_MAX)
+# define SCHAR_WIDTH _GL_INTEGER_WIDTH (SCHAR_MIN, SCHAR_MAX)
+# define UCHAR_WIDTH _GL_INTEGER_WIDTH (0, UCHAR_MAX)
+# define SHRT_WIDTH _GL_INTEGER_WIDTH (SHRT_MIN, SHRT_MAX)
+# define USHRT_WIDTH _GL_INTEGER_WIDTH (0, USHRT_MAX)
+# define INT_WIDTH _GL_INTEGER_WIDTH (INT_MIN, INT_MAX)
+# define UINT_WIDTH _GL_INTEGER_WIDTH (0, UINT_MAX)
+# define LONG_WIDTH _GL_INTEGER_WIDTH (LONG_MIN, LONG_MAX)
+# define ULONG_WIDTH _GL_INTEGER_WIDTH (0, ULONG_MAX)
+# define LLONG_WIDTH _GL_INTEGER_WIDTH (LLONG_MIN, LLONG_MAX)
+# define ULLONG_WIDTH _GL_INTEGER_WIDTH (0, ULLONG_MAX)
+#endif /* !ULLONG_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */
+
+#endif /* _@GUARD_PREFIX@_LIMITS_H */
+#endif /* _@GUARD_PREFIX@_LIMITS_H */
diff --git a/liblouis/gnulib/m4/00gnulib.m4 b/liblouis/gnulib/m4/00gnulib.m4
new file mode 100644
index 0000000..bb3512f
--- /dev/null
+++ b/liblouis/gnulib/m4/00gnulib.m4
@@ -0,0 +1,46 @@
+# 00gnulib.m4 serial 3
+dnl Copyright (C) 2009-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This file must be named something that sorts before all other
+dnl gnulib-provided .m4 files.  It is needed until such time as we can
+dnl assume Autoconf 2.64, with its improved AC_DEFUN_ONCE and
+dnl m4_divert semantics.
+
+# Until autoconf 2.63, handling of the diversion stack required m4_init
+# to be called first; but this does not happen with aclocal.  Wrapping
+# the entire execution in another layer of the diversion stack fixes this.
+# Worse, prior to autoconf 2.62, m4_wrap depended on the underlying m4
+# for whether it was FIFO or LIFO; in order to properly balance with
+# m4_init, we need to undo our push just before anything wrapped within
+# the m4_init body.  The way to ensure this is to wrap both sides of
+# m4_init with a one-shot macro that does the pop at the right time.
+m4_ifndef([_m4_divert_diversion],
+[m4_divert_push([KILL])
+m4_define([gl_divert_fixup], [m4_divert_pop()m4_define([$0])])
+m4_define([m4_init],
+  [gl_divert_fixup()]m4_defn([m4_init])[gl_divert_fixup()])])
+
+
+# AC_DEFUN_ONCE([NAME], VALUE)
+# ----------------------------
+# Define NAME to expand to VALUE on the first use (whether by direct
+# expansion, or by AC_REQUIRE), and to nothing on all subsequent uses.
+# Avoid bugs in AC_REQUIRE in Autoconf 2.63 and earlier.  This
+# definition is slower than the version in Autoconf 2.64, because it
+# can only use interfaces that existed since 2.59; but it achieves the
+# same effect.  Quoting is necessary to avoid confusing Automake.
+m4_version_prereq([2.63.263], [],
+[m4_define([AC][_DEFUN_ONCE],
+  [AC][_DEFUN([$1],
+    [AC_REQUIRE([_gl_DEFUN_ONCE([$1])],
+      [m4_indir([_gl_DEFUN_ONCE([$1])])])])]dnl
+[AC][_DEFUN([_gl_DEFUN_ONCE([$1])], [$2])])])
+
+# gl_00GNULIB
+# -----------
+# Witness macro that this file has been included.  Needed to force
+# Automake to include this file prior to all other gnulib .m4 files.
+AC_DEFUN([gl_00GNULIB])
diff --git a/liblouis/gnulib/m4/absolute-header.m4 b/liblouis/gnulib/m4/absolute-header.m4
new file mode 100644
index 0000000..c73adc8
--- /dev/null
+++ b/liblouis/gnulib/m4/absolute-header.m4
@@ -0,0 +1,102 @@
+# absolute-header.m4 serial 16
+dnl Copyright (C) 2006-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Derek Price.
+
+# gl_ABSOLUTE_HEADER(HEADER1 HEADER2 ...)
+# ---------------------------------------
+# Find the absolute name of a header file, testing first if the header exists.
+# If the header were sys/inttypes.h, this macro would define
+# ABSOLUTE_SYS_INTTYPES_H to the '""' quoted absolute name of sys/inttypes.h
+# in config.h
+# (e.g. '#define ABSOLUTE_SYS_INTTYPES_H "///usr/include/sys/inttypes.h"').
+# The three "///" are to pacify Sun C 5.8, which otherwise would say
+# "warning: #include of /usr/include/... may be non-portable".
+# Use '""', not '<>', so that the /// cannot be confused with a C99 comment.
+# Note: This macro assumes that the header file is not empty after
+# preprocessing, i.e. it does not only define preprocessor macros but also
+# provides some type/enum definitions or function/variable declarations.
+AC_DEFUN([gl_ABSOLUTE_HEADER],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_LANG_PREPROC_REQUIRE()dnl
+dnl FIXME: gl_absolute_header and ac_header_exists must be used unquoted
+dnl until we can assume autoconf 2.64 or newer.
+m4_foreach_w([gl_HEADER_NAME], [$1],
+  [AS_VAR_PUSHDEF([gl_absolute_header],
+                  [gl_cv_absolute_]m4_defn([gl_HEADER_NAME]))dnl
+  AC_CACHE_CHECK([absolute name of <]m4_defn([gl_HEADER_NAME])[>],
+    m4_defn([gl_absolute_header]),
+    [AS_VAR_PUSHDEF([ac_header_exists],
+                    [ac_cv_header_]m4_defn([gl_HEADER_NAME]))dnl
+    AC_CHECK_HEADERS_ONCE(m4_defn([gl_HEADER_NAME]))dnl
+    if test AS_VAR_GET(ac_header_exists) = yes; then
+      gl_ABSOLUTE_HEADER_ONE(m4_defn([gl_HEADER_NAME]))
+    fi
+    AS_VAR_POPDEF([ac_header_exists])dnl
+    ])dnl
+  AC_DEFINE_UNQUOTED(AS_TR_CPP([ABSOLUTE_]m4_defn([gl_HEADER_NAME])),
+                     ["AS_VAR_GET(gl_absolute_header)"],
+                     [Define this to an absolute name of <]m4_defn([gl_HEADER_NAME])[>.])
+  AS_VAR_POPDEF([gl_absolute_header])dnl
+])dnl
+])# gl_ABSOLUTE_HEADER
+
+# gl_ABSOLUTE_HEADER_ONE(HEADER)
+# ------------------------------
+# Like gl_ABSOLUTE_HEADER, except that:
+#   - it assumes that the header exists,
+#   - it uses the current CPPFLAGS,
+#   - it does not cache the result,
+#   - it is silent.
+AC_DEFUN([gl_ABSOLUTE_HEADER_ONE],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_LANG_CONFTEST([AC_LANG_SOURCE([[#include <]]m4_dquote([$1])[[>]])])
+  dnl AIX "xlc -E" and "cc -E" omit #line directives for header files
+  dnl that contain only a #include of other header files and no
+  dnl non-comment tokens of their own. This leads to a failure to
+  dnl detect the absolute name of <dirent.h>, <signal.h>, <poll.h>
+  dnl and others. The workaround is to force preservation of comments
+  dnl through option -C. This ensures all necessary #line directives
+  dnl are present. GCC supports option -C as well.
+  case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+changequote(,)
+  case "$host_os" in
+    mingw*)
+      dnl For the sake of native Windows compilers (excluding gcc),
+      dnl treat backslash as a directory separator, like /.
+      dnl Actually, these compilers use a double-backslash as
+      dnl directory separator, inside the
+      dnl   # line "filename"
+      dnl directives.
+      gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+  dnl A sed expression that turns a string into a basic regular
+  dnl expression, for use within "/.../".
+  gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo '$1' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+changequote([,])
+  dnl eval is necessary to expand gl_absname_cpp.
+  dnl Ultrix and Pyramid sh refuse to redirect output of eval,
+  dnl so use subshell.
+  AS_VAR_SET([gl_cv_absolute_]AS_TR_SH([[$1]]),
+[`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD |
+  sed -n "$gl_absolute_header_sed"`])
+])
diff --git a/liblouis/gnulib/m4/alloca.m4 b/liblouis/gnulib/m4/alloca.m4
new file mode 100644
index 0000000..7f0604c
--- /dev/null
+++ b/liblouis/gnulib/m4/alloca.m4
@@ -0,0 +1,121 @@
+# alloca.m4 serial 14
+dnl Copyright (C) 2002-2004, 2006-2007, 2009-2017 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ALLOCA],
+[
+  AC_REQUIRE([AC_FUNC_ALLOCA])
+  if test $ac_cv_func_alloca_works = no; then
+    gl_PREREQ_ALLOCA
+  fi
+
+  # Define an additional variable used in the Makefile substitution.
+  if test $ac_cv_working_alloca_h = yes; then
+    AC_CACHE_CHECK([for alloca as a compiler built-in], [gl_cv_rpl_alloca], [
+      AC_EGREP_CPP([Need own alloca], [
+#if defined __GNUC__ || defined _AIX || defined _MSC_VER
+        Need own alloca
+#endif
+        ], [gl_cv_rpl_alloca=yes], [gl_cv_rpl_alloca=no])
+    ])
+    if test $gl_cv_rpl_alloca = yes; then
+      dnl OK, alloca can be implemented through a compiler built-in.
+      AC_DEFINE([HAVE_ALLOCA], [1],
+        [Define to 1 if you have 'alloca' after including <alloca.h>,
+         a header that may be supplied by this distribution.])
+      ALLOCA_H=alloca.h
+    else
+      dnl alloca exists as a library function, i.e. it is slow and probably
+      dnl a memory leak. Don't define HAVE_ALLOCA in this case.
+      ALLOCA_H=
+    fi
+  else
+    ALLOCA_H=alloca.h
+  fi
+  AC_SUBST([ALLOCA_H])
+  AM_CONDITIONAL([GL_GENERATE_ALLOCA_H], [test -n "$ALLOCA_H"])
+])
+
+# Prerequisites of lib/alloca.c.
+# STACK_DIRECTION is already handled by AC_FUNC_ALLOCA.
+AC_DEFUN([gl_PREREQ_ALLOCA], [:])
+
+# This works around a bug in autoconf <= 2.68.
+# See <http://lists.gnu.org/archive/html/bug-gnulib/2011-06/msg00277.html>.
+
+m4_version_prereq([2.69], [] ,[
+
+# This is taken from the following Autoconf patch:
+# http://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=6cd9f12520b0d6f76d3230d7565feba1ecf29497
+
+# _AC_LIBOBJ_ALLOCA
+# -----------------
+# Set up the LIBOBJ replacement of 'alloca'.  Well, not exactly
+# AC_LIBOBJ since we actually set the output variable 'ALLOCA'.
+# Nevertheless, for Automake, AC_LIBSOURCES it.
+m4_define([_AC_LIBOBJ_ALLOCA],
+[# The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble.  Some versions do not even contain alloca or
+# contain a buggy version.  If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+AC_LIBSOURCES(alloca.c)
+AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])dnl
+AC_DEFINE(C_ALLOCA, 1, [Define to 1 if using 'alloca.c'.])
+
+AC_CACHE_CHECK(whether 'alloca.c' needs Cray hooks, ac_cv_os_cray,
+[AC_EGREP_CPP(webecray,
+[#if defined CRAY && ! defined CRAY2
+webecray
+#else
+wenotbecray
+#endif
+], ac_cv_os_cray=yes, ac_cv_os_cray=no)])
+if test $ac_cv_os_cray = yes; then
+  for ac_func in _getb67 GETB67 getb67; do
+    AC_CHECK_FUNC($ac_func,
+                  [AC_DEFINE_UNQUOTED(CRAY_STACKSEG_END, $ac_func,
+                                      [Define to one of '_getb67', 'GETB67',
+                                       'getb67' for Cray-2 and Cray-YMP
+                                       systems. This function is required for
+                                       'alloca.c' support on those systems.])
+    break])
+  done
+fi
+
+AC_CACHE_CHECK([stack direction for C alloca],
+               [ac_cv_c_stack_direction],
+[AC_RUN_IFELSE([AC_LANG_SOURCE(
+[AC_INCLUDES_DEFAULT
+int
+find_stack_direction (int *addr, int depth)
+{
+  int dir, dummy = 0;
+  if (! addr)
+    addr = &dummy;
+  *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
+  dir = depth ? find_stack_direction (addr, depth - 1) : 0;
+  return dir + dummy;
+}
+
+int
+main (int argc, char **argv)
+{
+  return find_stack_direction (0, argc + !argv + 20) < 0;
+}])],
+               [ac_cv_c_stack_direction=1],
+               [ac_cv_c_stack_direction=-1],
+               [ac_cv_c_stack_direction=0])])
+AH_VERBATIM([STACK_DIRECTION],
+[/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at runtime.
+        STACK_DIRECTION > 0 => grows toward higher addresses
+        STACK_DIRECTION < 0 => grows toward lower addresses
+        STACK_DIRECTION = 0 => direction of growth unknown */
+@%:@undef STACK_DIRECTION])dnl
+AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction)
+])# _AC_LIBOBJ_ALLOCA
+])
diff --git a/liblouis/gnulib/m4/dirent_h.m4 b/liblouis/gnulib/m4/dirent_h.m4
new file mode 100644
index 0000000..1f9c4f3
--- /dev/null
+++ b/liblouis/gnulib/m4/dirent_h.m4
@@ -0,0 +1,64 @@
+# dirent_h.m4 serial 16
+dnl Copyright (C) 2008-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Bruno Haible.
+
+AC_DEFUN([gl_DIRENT_H],
+[
+  dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+  dnl once only, before all statements that occur in other macros.
+  AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+
+  dnl <dirent.h> is always overridden, because of GNULIB_POSIXCHECK.
+  gl_CHECK_NEXT_HEADERS([dirent.h])
+  if test $ac_cv_header_dirent_h = yes; then
+    HAVE_DIRENT_H=1
+  else
+    HAVE_DIRENT_H=0
+  fi
+  AC_SUBST([HAVE_DIRENT_H])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use.
+  gl_WARN_ON_USE_PREPARE([[#include <dirent.h>
+    ]], [alphasort closedir dirfd fdopendir opendir readdir rewinddir scandir])
+])
+
+AC_DEFUN([gl_DIRENT_MODULE_INDICATOR],
+[
+  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+  AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+  dnl Define it also as a C macro, for the benefit of the unit tests.
+  gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_DIRENT_H_DEFAULTS],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl for REPLACE_FCHDIR
+  GNULIB_OPENDIR=0;     AC_SUBST([GNULIB_OPENDIR])
+  GNULIB_READDIR=0;     AC_SUBST([GNULIB_READDIR])
+  GNULIB_REWINDDIR=0;   AC_SUBST([GNULIB_REWINDDIR])
+  GNULIB_CLOSEDIR=0;    AC_SUBST([GNULIB_CLOSEDIR])
+  GNULIB_DIRFD=0;       AC_SUBST([GNULIB_DIRFD])
+  GNULIB_FDOPENDIR=0;   AC_SUBST([GNULIB_FDOPENDIR])
+  GNULIB_SCANDIR=0;     AC_SUBST([GNULIB_SCANDIR])
+  GNULIB_ALPHASORT=0;   AC_SUBST([GNULIB_ALPHASORT])
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE_OPENDIR=1;       AC_SUBST([HAVE_OPENDIR])
+  HAVE_READDIR=1;       AC_SUBST([HAVE_READDIR])
+  HAVE_REWINDDIR=1;     AC_SUBST([HAVE_REWINDDIR])
+  HAVE_CLOSEDIR=1;      AC_SUBST([HAVE_CLOSEDIR])
+  HAVE_DECL_DIRFD=1;    AC_SUBST([HAVE_DECL_DIRFD])
+  HAVE_DECL_FDOPENDIR=1;AC_SUBST([HAVE_DECL_FDOPENDIR])
+  HAVE_FDOPENDIR=1;     AC_SUBST([HAVE_FDOPENDIR])
+  HAVE_SCANDIR=1;       AC_SUBST([HAVE_SCANDIR])
+  HAVE_ALPHASORT=1;     AC_SUBST([HAVE_ALPHASORT])
+  REPLACE_OPENDIR=0;    AC_SUBST([REPLACE_OPENDIR])
+  REPLACE_CLOSEDIR=0;   AC_SUBST([REPLACE_CLOSEDIR])
+  REPLACE_DIRFD=0;      AC_SUBST([REPLACE_DIRFD])
+  REPLACE_FDOPENDIR=0;  AC_SUBST([REPLACE_FDOPENDIR])
+])
diff --git a/liblouis/gnulib/m4/eealloc.m4 b/liblouis/gnulib/m4/eealloc.m4
new file mode 100644
index 0000000..96b9bca
--- /dev/null
+++ b/liblouis/gnulib/m4/eealloc.m4
@@ -0,0 +1,31 @@
+# eealloc.m4 serial 3
+dnl Copyright (C) 2003, 2009-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_EEALLOC],
+[
+  AC_REQUIRE([gl_EEMALLOC])
+  AC_REQUIRE([gl_EEREALLOC])
+])
+
+AC_DEFUN([gl_EEMALLOC],
+[
+  _AC_FUNC_MALLOC_IF(
+    [gl_cv_func_malloc_0_nonnull=1],
+    [gl_cv_func_malloc_0_nonnull=0])
+  AC_DEFINE_UNQUOTED([MALLOC_0_IS_NONNULL], [$gl_cv_func_malloc_0_nonnull],
+    [If malloc(0) is != NULL, define this to 1.  Otherwise define this
+     to 0.])
+])
+
+AC_DEFUN([gl_EEREALLOC],
+[
+  _AC_FUNC_REALLOC_IF(
+    [gl_cv_func_realloc_0_nonnull=1],
+    [gl_cv_func_realloc_0_nonnull=0])
+  AC_DEFINE_UNQUOTED([REALLOC_0_IS_NONNULL], [$gl_cv_func_realloc_0_nonnull],
+    [If realloc(NULL,0) is != NULL, define this to 1.  Otherwise define this
+     to 0.])
+])
diff --git a/liblouis/gnulib/m4/environ.m4 b/liblouis/gnulib/m4/environ.m4
new file mode 100644
index 0000000..3b9fa5f
--- /dev/null
+++ b/liblouis/gnulib/m4/environ.m4
@@ -0,0 +1,47 @@
+# environ.m4 serial 6
+dnl Copyright (C) 2001-2004, 2006-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_ENVIRON],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  dnl Persuade glibc <unistd.h> to declare environ.
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+  AC_CHECK_HEADERS_ONCE([unistd.h])
+  gt_CHECK_VAR_DECL(
+    [#if HAVE_UNISTD_H
+     #include <unistd.h>
+     #endif
+     /* mingw, BeOS, Haiku declare environ in <stdlib.h>, not in <unistd.h>.  */
+     #include <stdlib.h>
+    ],
+    [environ])
+  if test $gt_cv_var_environ_declaration != yes; then
+    HAVE_DECL_ENVIRON=0
+  fi
+])
+
+# Check if a variable is properly declared.
+# gt_CHECK_VAR_DECL(includes,variable)
+AC_DEFUN([gt_CHECK_VAR_DECL],
+[
+  define([gt_cv_var], [gt_cv_var_]$2[_declaration])
+  AC_MSG_CHECKING([if $2 is properly declared])
+  AC_CACHE_VAL([gt_cv_var], [
+    AC_COMPILE_IFELSE(
+      [AC_LANG_PROGRAM(
+         [[$1
+           extern struct { int foo; } $2;]],
+         [[$2.foo = 1;]])],
+      [gt_cv_var=no],
+      [gt_cv_var=yes])])
+  AC_MSG_RESULT([$gt_cv_var])
+  if test $gt_cv_var = yes; then
+    AC_DEFINE([HAVE_]m4_translit($2, [a-z], [A-Z])[_DECL], 1,
+              [Define if you have the declaration of $2.])
+  fi
+  undefine([gt_cv_var])
+])
diff --git a/liblouis/gnulib/m4/extensions.m4 b/liblouis/gnulib/m4/extensions.m4
new file mode 100644
index 0000000..c60f537
--- /dev/null
+++ b/liblouis/gnulib/m4/extensions.m4
@@ -0,0 +1,173 @@
+# serial 15  -*- Autoconf -*-
+# Enable extensions on systems that normally disable them.
+
+# Copyright (C) 2003, 2006-2017 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This definition of AC_USE_SYSTEM_EXTENSIONS is stolen from git
+# Autoconf.  Perhaps we can remove this once we can assume Autoconf
+# 2.70 or later everywhere, but since Autoconf mutates rapidly
+# enough in this area it's likely we'll need to redefine
+# AC_USE_SYSTEM_EXTENSIONS for quite some time.
+
+# If autoconf reports a warning
+#     warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS
+# or  warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS
+# the fix is
+#   1) to ensure that AC_USE_SYSTEM_EXTENSIONS is never directly invoked
+#      but always AC_REQUIREd,
+#   2) to ensure that for each occurrence of
+#        AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+#      or
+#        AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+#      the corresponding gnulib module description has 'extensions' among
+#      its dependencies. This will ensure that the gl_USE_SYSTEM_EXTENSIONS
+#      invocation occurs in gl_EARLY, not in gl_INIT.
+
+# AC_USE_SYSTEM_EXTENSIONS
+# ------------------------
+# Enable extensions on systems that normally disable them,
+# typically due to standards-conformance issues.
+#
+# Remember that #undef in AH_VERBATIM gets replaced with #define by
+# AC_DEFINE.  The goal here is to define all known feature-enabling
+# macros, then, if reports of conflicts are made, disable macros that
+# cause problems on some platforms (such as __EXTENSIONS__).
+AC_DEFUN_ONCE([AC_USE_SYSTEM_EXTENSIONS],
+[AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl
+AC_BEFORE([$0], [AC_RUN_IFELSE])dnl
+
+  AC_CHECK_HEADER([minix/config.h], [MINIX=yes], [MINIX=])
+  if test "$MINIX" = yes; then
+    AC_DEFINE([_POSIX_SOURCE], [1],
+      [Define to 1 if you need to in order for 'stat' and other
+       things to work.])
+    AC_DEFINE([_POSIX_1_SOURCE], [2],
+      [Define to 2 if the system does not provide POSIX.1 features
+       except with this defined.])
+    AC_DEFINE([_MINIX], [1],
+      [Define to 1 if on MINIX.])
+    AC_DEFINE([_NETBSD_SOURCE], [1],
+      [Define to 1 to make NetBSD features available.  MINIX 3 needs this.])
+  fi
+
+dnl Use a different key than __EXTENSIONS__, as that name broke existing
+dnl configure.ac when using autoheader 2.62.
+  AH_VERBATIM([USE_SYSTEM_EXTENSIONS],
+[/* Enable extensions on AIX 3, Interix.  */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable general extensions on macOS.  */
+#ifndef _DARWIN_C_SOURCE
+# undef _DARWIN_C_SOURCE
+#endif
+/* Enable GNU extensions on systems that have them.  */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable threading extensions on Solaris.  */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-5:2014.  */
+#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+# undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-1:2014.  */
+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+# undef __STDC_WANT_IEC_60559_BFP_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-2:2015.  */
+#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
+# undef __STDC_WANT_IEC_60559_DFP_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-4:2015.  */
+#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
+# undef __STDC_WANT_IEC_60559_FUNCS_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-3:2015.  */
+#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
+# undef __STDC_WANT_IEC_60559_TYPES_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TR 24731-2:2010.  */
+#ifndef __STDC_WANT_LIB_EXT2__
+# undef __STDC_WANT_LIB_EXT2__
+#endif
+/* Enable extensions specified by ISO/IEC 24747:2009.  */
+#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
+# undef __STDC_WANT_MATH_SPEC_FUNCS__
+#endif
+/* Enable extensions on HP NonStop.  */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable X/Open extensions if necessary.  HP-UX 11.11 defines
+   mbstate_t only if _XOPEN_SOURCE is defined to 500, regardless of
+   whether compiling with -Ae or -D_HPUX_SOURCE=1.  */
+#ifndef _XOPEN_SOURCE
+# undef _XOPEN_SOURCE
+#endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+])
+  AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__],
+    [ac_cv_safe_to_define___extensions__],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM([[
+#         define __EXTENSIONS__ 1
+          ]AC_INCLUDES_DEFAULT])],
+       [ac_cv_safe_to_define___extensions__=yes],
+       [ac_cv_safe_to_define___extensions__=no])])
+  test $ac_cv_safe_to_define___extensions__ = yes &&
+    AC_DEFINE([__EXTENSIONS__])
+  AC_DEFINE([_ALL_SOURCE])
+  AC_DEFINE([_DARWIN_C_SOURCE])
+  AC_DEFINE([_GNU_SOURCE])
+  AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])
+  AC_DEFINE([__STDC_WANT_IEC_60559_ATTRIBS_EXT__])
+  AC_DEFINE([__STDC_WANT_IEC_60559_BFP_EXT__])
+  AC_DEFINE([__STDC_WANT_IEC_60559_DFP_EXT__])
+  AC_DEFINE([__STDC_WANT_IEC_60559_FUNCS_EXT__])
+  AC_DEFINE([__STDC_WANT_IEC_60559_TYPES_EXT__])
+  AC_DEFINE([__STDC_WANT_LIB_EXT2__])
+  AC_DEFINE([__STDC_WANT_MATH_SPEC_FUNCS__])
+  AC_DEFINE([_TANDEM_SOURCE])
+  AC_CACHE_CHECK([whether _XOPEN_SOURCE should be defined],
+    [ac_cv_should_define__xopen_source],
+    [ac_cv_should_define__xopen_source=no
+     AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM([[
+          #include <wchar.h>
+          mbstate_t x;]])],
+       [],
+       [AC_COMPILE_IFELSE(
+          [AC_LANG_PROGRAM([[
+             #define _XOPEN_SOURCE 500
+             #include <wchar.h>
+             mbstate_t x;]])],
+          [ac_cv_should_define__xopen_source=yes])])])
+  test $ac_cv_should_define__xopen_source = yes &&
+    AC_DEFINE([_XOPEN_SOURCE], [500])
+])# AC_USE_SYSTEM_EXTENSIONS
+
+# gl_USE_SYSTEM_EXTENSIONS
+# ------------------------
+# Enable extensions on systems that normally disable them,
+# typically due to standards-conformance issues.
+AC_DEFUN_ONCE([gl_USE_SYSTEM_EXTENSIONS],
+[
+  dnl Require this macro before AC_USE_SYSTEM_EXTENSIONS.
+  dnl gnulib does not need it. But if it gets required by third-party macros
+  dnl after AC_USE_SYSTEM_EXTENSIONS is required, autoconf 2.62..2.63 emit a
+  dnl warning: "AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS".
+  dnl Note: We can do this only for one of the macros AC_AIX, AC_GNU_SOURCE,
+  dnl AC_MINIX. If people still use AC_AIX or AC_MINIX, they are out of luck.
+  AC_REQUIRE([AC_GNU_SOURCE])
+
+  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+])
diff --git a/liblouis/gnulib/m4/extern-inline.m4 b/liblouis/gnulib/m4/extern-inline.m4
new file mode 100644
index 0000000..00f9609
--- /dev/null
+++ b/liblouis/gnulib/m4/extern-inline.m4
@@ -0,0 +1,102 @@
+dnl 'extern inline' a la ISO C99.
+
+dnl Copyright 2012-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_EXTERN_INLINE],
+[
+  AH_VERBATIM([extern_inline],
+[/* Please see the Gnulib manual for how to use these macros.
+
+   Suppress extern inline with HP-UX cc, as it appears to be broken; see
+   <http://lists.gnu.org/archive/html/bug-texinfo/2013-02/msg00030.html>.
+
+   Suppress extern inline with Sun C in standards-conformance mode, as it
+   mishandles inline functions that call each other.  E.g., for 'inline void f
+   (void) { } inline void g (void) { f (); }', c99 incorrectly complains
+   'reference to static identifier "f" in extern inline function'.
+   This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
+
+   Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
+   on configurations that mistakenly use 'static inline' to implement
+   functions or macros in standard C headers like <ctype.h>.  For example,
+   if isdigit is mistakenly implemented via a static inline function,
+   a program containing an extern inline function that calls isdigit
+   may not work since the C standard prohibits extern inline functions
+   from calling static functions.  This bug is known to occur on:
+
+     OS X 10.8 and earlier; see:
+     http://lists.gnu.org/archive/html/bug-gnulib/2012-12/msg00023.html
+
+     DragonFly; see
+     http://muscles.dragonflybsd.org/bulk/bleeding-edge-potential/latest-per-pkg/ah-tty-0.3.12.log
+
+     FreeBSD; see:
+     http://lists.gnu.org/archive/html/bug-gnulib/2014-07/msg00104.html
+
+   OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and
+   for clang but remains for g++; see <http://trac.macports.org/ticket/41033>.
+   Assume DragonFly and FreeBSD will be similar.  */
+#if (((defined __APPLE__ && defined __MACH__) \
+      || defined __DragonFly__ || defined __FreeBSD__) \
+     && (defined __header_inline \
+         ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \
+            && ! defined __clang__) \
+         : ((! defined _DONT_USE_CTYPE_INLINE_ \
+             && (defined __GNUC__ || defined __cplusplus)) \
+            || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \
+                && defined __GNUC__ && ! defined __cplusplus))))
+# define _GL_EXTERN_INLINE_STDHEADER_BUG
+#endif
+#if ((__GNUC__ \
+      ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \
+      : (199901L <= __STDC_VERSION__ \
+         && !defined __HP_cc \
+         && !defined __PGI \
+         && !(defined __SUNPRO_C && __STDC__))) \
+     && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# define _GL_INLINE inline
+# define _GL_EXTERN_INLINE extern inline
+# define _GL_EXTERN_INLINE_IN_USE
+#elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \
+       && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__
+   /* __gnu_inline__ suppresses a GCC 4.2 diagnostic.  */
+#  define _GL_INLINE extern inline __attribute__ ((__gnu_inline__))
+# else
+#  define _GL_INLINE extern inline
+# endif
+# define _GL_EXTERN_INLINE extern
+# define _GL_EXTERN_INLINE_IN_USE
+#else
+# define _GL_INLINE static _GL_UNUSED
+# define _GL_EXTERN_INLINE static _GL_UNUSED
+#endif
+
+/* In GCC 4.6 (inclusive) to 5.1 (exclusive),
+   suppress bogus "no previous prototype for 'FOO'"
+   and "no previous declaration for 'FOO'" diagnostics,
+   when FOO is an inline function in the header; see
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113> and
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63877>.  */
+#if __GNUC__ == 4 && 6 <= __GNUC_MINOR__
+# if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__
+#  define _GL_INLINE_HEADER_CONST_PRAGMA
+# else
+#  define _GL_INLINE_HEADER_CONST_PRAGMA \
+     _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"")
+# endif
+# define _GL_INLINE_HEADER_BEGIN \
+    _Pragma ("GCC diagnostic push") \
+    _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \
+    _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \
+    _GL_INLINE_HEADER_CONST_PRAGMA
+# define _GL_INLINE_HEADER_END \
+    _Pragma ("GCC diagnostic pop")
+#else
+# define _GL_INLINE_HEADER_BEGIN
+# define _GL_INLINE_HEADER_END
+#endif])
+])
diff --git a/liblouis/gnulib/m4/gnulib-cache.m4 b/liblouis/gnulib/m4/gnulib-cache.m4
new file mode 100644
index 0000000..77c7e25
--- /dev/null
+++ b/liblouis/gnulib/m4/gnulib-cache.m4
@@ -0,0 +1,54 @@
+# Copyright (C) 2002-2017 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this file.  If not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+#
+# This file represents the specification of how gnulib-tool is used.
+# It acts as a cache: It is written and read by gnulib-tool.
+# In projects that use version control, this file is meant to be put under
+# version control, like the configure.ac and various Makefile.am files.
+
+
+# Specification in the form of a command-line invocation:
+#   gnulib-tool --import --lib=libgnu --source-base=gnulib --m4-base=gnulib/m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --no-conditional-dependencies --libtool --macro-prefix=gl --no-vc-files dirent lib-msvc-compat malloc-gnu realloc-gnu setenv strndup
+
+# Specification in the form of a few gnulib-tool.m4 macro invocations:
+gl_LOCAL_DIR([])
+gl_MODULES([
+  dirent
+  lib-msvc-compat
+  malloc-gnu
+  realloc-gnu
+  setenv
+  strndup
+])
+gl_AVOID([])
+gl_SOURCE_BASE([gnulib])
+gl_M4_BASE([gnulib/m4])
+gl_PO_BASE([])
+gl_DOC_BASE([doc])
+gl_TESTS_BASE([tests])
+gl_LIB([libgnu])
+gl_MAKEFILE_NAME([])
+gl_LIBTOOL
+gl_MACRO_PREFIX([gl])
+gl_PO_DOMAIN([])
+gl_WITNESS_C_MACRO([])
+gl_VC_FILES([false])
diff --git a/liblouis/gnulib/m4/gnulib-common.m4 b/liblouis/gnulib/m4/gnulib-common.m4
new file mode 100644
index 0000000..36f2acc
--- /dev/null
+++ b/liblouis/gnulib/m4/gnulib-common.m4
@@ -0,0 +1,467 @@
+# gnulib-common.m4 serial 38
+dnl Copyright (C) 2007-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# gl_COMMON
+# is expanded unconditionally through gnulib-tool magic.
+AC_DEFUN([gl_COMMON], [
+  dnl Use AC_REQUIRE here, so that the code is expanded once only.
+  AC_REQUIRE([gl_00GNULIB])
+  AC_REQUIRE([gl_COMMON_BODY])
+])
+AC_DEFUN([gl_COMMON_BODY], [
+  AH_VERBATIM([_Noreturn],
+[/* The _Noreturn keyword of C11.  */
+#if ! (defined _Noreturn \
+       || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__))
+# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \
+      || 0x5110 <= __SUNPRO_C)
+#  define _Noreturn __attribute__ ((__noreturn__))
+# elif defined _MSC_VER && 1200 <= _MSC_VER
+#  define _Noreturn __declspec (noreturn)
+# else
+#  define _Noreturn
+# endif
+#endif
+])
+  AH_VERBATIM([isoc99_inline],
+[/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports
+   the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of
+   earlier versions), but does not display it by setting __GNUC_STDC_INLINE__.
+   __APPLE__ && __MACH__ test for Mac OS X.
+   __APPLE_CC__ tests for the Apple compiler and its version.
+   __STDC_VERSION__ tests for the C99 mode.  */
+#if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__
+# define __GNUC_STDC_INLINE__ 1
+#endif])
+  AH_VERBATIM([unused_parameter],
+[/* Define as a marker that can be attached to declarations that might not
+    be used.  This helps to reduce warnings, such as from
+    GCC -Wunused-parameter.  */
+#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+# define _GL_UNUSED __attribute__ ((__unused__))
+#else
+# define _GL_UNUSED
+#endif
+/* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name
+   is a misnomer outside of parameter lists.  */
+#define _UNUSED_PARAMETER_ _GL_UNUSED
+
+/* gcc supports the "unused" attribute on possibly unused labels, and
+   g++ has since version 4.5.  Note to support C++ as well as C,
+   _GL_UNUSED_LABEL should be used with a trailing ;  */
+#if !defined __cplusplus || __GNUC__ > 4 \
+    || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+# define _GL_UNUSED_LABEL _GL_UNUSED
+#else
+# define _GL_UNUSED_LABEL
+#endif
+
+/* The __pure__ attribute was added in gcc 2.96.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE /* empty */
+#endif
+
+/* The __const__ attribute was added in gcc 2.95.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
+# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+#else
+# define _GL_ATTRIBUTE_CONST /* empty */
+#endif
+])
+  dnl Preparation for running test programs:
+  dnl Tell glibc to write diagnostics from -D_FORTIFY_SOURCE=2 to stderr, not
+  dnl to /dev/tty, so they can be redirected to log files.  Such diagnostics
+  dnl arise e.g., in the macros gl_PRINTF_DIRECTIVE_N, gl_SNPRINTF_DIRECTIVE_N.
+  LIBC_FATAL_STDERR_=1
+  export LIBC_FATAL_STDERR_
+])
+
+# gl_MODULE_INDICATOR_CONDITION
+# expands to a C preprocessor expression that evaluates to 1 or 0, depending
+# whether a gnulib module that has been requested shall be considered present
+# or not.
+m4_define([gl_MODULE_INDICATOR_CONDITION], [1])
+
+# gl_MODULE_INDICATOR_SET_VARIABLE([modulename])
+# sets the shell variable that indicates the presence of the given module to
+# a C preprocessor expression that will evaluate to 1.
+AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE],
+[
+  gl_MODULE_INDICATOR_SET_VARIABLE_AUX(
+    [GNULIB_[]m4_translit([[$1]],
+                          [abcdefghijklmnopqrstuvwxyz./-],
+                          [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])],
+    [gl_MODULE_INDICATOR_CONDITION])
+])
+
+# gl_MODULE_INDICATOR_SET_VARIABLE_AUX([variable])
+# modifies the shell variable to include the gl_MODULE_INDICATOR_CONDITION.
+# The shell variable's value is a C preprocessor expression that evaluates
+# to 0 or 1.
+AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX],
+[
+  m4_if(m4_defn([gl_MODULE_INDICATOR_CONDITION]), [1],
+    [
+     dnl Simplify the expression VALUE || 1 to 1.
+     $1=1
+    ],
+    [gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([$1],
+                                             [gl_MODULE_INDICATOR_CONDITION])])
+])
+
+# gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([variable], [condition])
+# modifies the shell variable to include the given condition.  The shell
+# variable's value is a C preprocessor expression that evaluates to 0 or 1.
+AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR],
+[
+  dnl Simplify the expression 1 || CONDITION to 1.
+  if test "$[]$1" != 1; then
+    dnl Simplify the expression 0 || CONDITION to CONDITION.
+    if test "$[]$1" = 0; then
+      $1=$2
+    else
+      $1="($[]$1 || $2)"
+    fi
+  fi
+])
+
+# gl_MODULE_INDICATOR([modulename])
+# defines a C macro indicating the presence of the given module
+# in a location where it can be used.
+#                                             |  Value  |   Value   |
+#                                             | in lib/ | in tests/ |
+# --------------------------------------------+---------+-----------+
+# Module present among main modules:          |    1    |     1     |
+# --------------------------------------------+---------+-----------+
+# Module present among tests-related modules: |    0    |     1     |
+# --------------------------------------------+---------+-----------+
+# Module not present at all:                  |    0    |     0     |
+# --------------------------------------------+---------+-----------+
+AC_DEFUN([gl_MODULE_INDICATOR],
+[
+  AC_DEFINE_UNQUOTED([GNULIB_]m4_translit([[$1]],
+      [abcdefghijklmnopqrstuvwxyz./-],
+      [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]),
+    [gl_MODULE_INDICATOR_CONDITION],
+    [Define to a C preprocessor expression that evaluates to 1 or 0,
+     depending whether the gnulib module $1 shall be considered present.])
+])
+
+# gl_MODULE_INDICATOR_FOR_TESTS([modulename])
+# defines a C macro indicating the presence of the given module
+# in lib or tests. This is useful to determine whether the module
+# should be tested.
+#                                             |  Value  |   Value   |
+#                                             | in lib/ | in tests/ |
+# --------------------------------------------+---------+-----------+
+# Module present among main modules:          |    1    |     1     |
+# --------------------------------------------+---------+-----------+
+# Module present among tests-related modules: |    1    |     1     |
+# --------------------------------------------+---------+-----------+
+# Module not present at all:                  |    0    |     0     |
+# --------------------------------------------+---------+-----------+
+AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS],
+[
+  AC_DEFINE([GNULIB_TEST_]m4_translit([[$1]],
+      [abcdefghijklmnopqrstuvwxyz./-],
+      [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [1],
+    [Define to 1 when the gnulib module $1 should be tested.])
+])
+
+# gl_ASSERT_NO_GNULIB_POSIXCHECK
+# asserts that there will never be a need to #define GNULIB_POSIXCHECK.
+# and thereby enables an optimization of configure and config.h.
+# Used by Emacs.
+AC_DEFUN([gl_ASSERT_NO_GNULIB_POSIXCHECK],
+[
+  dnl Override gl_WARN_ON_USE_PREPARE.
+  dnl But hide this definition from 'aclocal'.
+  AC_DEFUN([gl_W][ARN_ON_USE_PREPARE], [])
+])
+
+# gl_ASSERT_NO_GNULIB_TESTS
+# asserts that there will be no gnulib tests in the scope of the configure.ac
+# and thereby enables an optimization of config.h.
+# Used by Emacs.
+AC_DEFUN([gl_ASSERT_NO_GNULIB_TESTS],
+[
+  dnl Override gl_MODULE_INDICATOR_FOR_TESTS.
+  AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], [])
+])
+
+# Test whether <features.h> exists.
+# Set HAVE_FEATURES_H.
+AC_DEFUN([gl_FEATURES_H],
+[
+  AC_CHECK_HEADERS_ONCE([features.h])
+  if test $ac_cv_header_features_h = yes; then
+    HAVE_FEATURES_H=1
+  else
+    HAVE_FEATURES_H=0
+  fi
+  AC_SUBST([HAVE_FEATURES_H])
+])
+
+# m4_foreach_w
+# is a backport of autoconf-2.59c's m4_foreach_w.
+# Remove this macro when we can assume autoconf >= 2.60.
+m4_ifndef([m4_foreach_w],
+  [m4_define([m4_foreach_w],
+    [m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3])])])
+
+# AS_VAR_IF(VAR, VALUE, [IF-MATCH], [IF-NOT-MATCH])
+# ----------------------------------------------------
+# Backport of autoconf-2.63b's macro.
+# Remove this macro when we can assume autoconf >= 2.64.
+m4_ifndef([AS_VAR_IF],
+[m4_define([AS_VAR_IF],
+[AS_IF([test x"AS_VAR_GET([$1])" = x""$2], [$3], [$4])])])
+
+# gl_PROG_CC_C99
+# Modifies the value of the shell variable CC in an attempt to make $CC
+# understand ISO C99 source code.
+# This is like AC_PROG_CC_C99, except that
+# - AC_PROG_CC_C99 did not exist in Autoconf versions < 2.60,
+# - AC_PROG_CC_C99 does not mix well with AC_PROG_CC_STDC
+#   <http://lists.gnu.org/archive/html/bug-gnulib/2011-09/msg00367.html>,
+#   but many more packages use AC_PROG_CC_STDC than AC_PROG_CC_C99
+#   <http://lists.gnu.org/archive/html/bug-gnulib/2011-09/msg00441.html>.
+# Remaining problems:
+# - When AC_PROG_CC_STDC is invoked twice, it adds the C99 enabling options
+#   to CC twice
+#   <http://lists.gnu.org/archive/html/bug-gnulib/2011-09/msg00431.html>.
+# - AC_PROG_CC_STDC is likely to change now that C11 is an ISO standard.
+AC_DEFUN([gl_PROG_CC_C99],
+[
+  dnl Change that version number to the minimum Autoconf version that supports
+  dnl mixing AC_PROG_CC_C99 calls with AC_PROG_CC_STDC calls.
+  m4_version_prereq([9.0],
+    [AC_REQUIRE([AC_PROG_CC_C99])],
+    [AC_REQUIRE([AC_PROG_CC_STDC])])
+])
+
+# gl_PROG_AR_RANLIB
+# Determines the values for AR, ARFLAGS, RANLIB that fit with the compiler.
+# The user can set the variables AR, ARFLAGS, RANLIB if he wants to override
+# the values.
+AC_DEFUN([gl_PROG_AR_RANLIB],
+[
+  dnl Minix 3 comes with two toolchains: The Amsterdam Compiler Kit compiler
+  dnl as "cc", and GCC as "gcc". They have different object file formats and
+  dnl library formats. In particular, the GNU binutils programs ar and ranlib
+  dnl produce libraries that work only with gcc, not with cc.
+  AC_REQUIRE([AC_PROG_CC])
+  dnl The '][' hides this use from 'aclocal'.
+  AC_BEFORE([$0], [A][M_PROG_AR])
+  AC_CACHE_CHECK([for Minix Amsterdam compiler], [gl_cv_c_amsterdam_compiler],
+    [
+      AC_EGREP_CPP([Amsterdam],
+        [
+#ifdef __ACK__
+Amsterdam
+#endif
+        ],
+        [gl_cv_c_amsterdam_compiler=yes],
+        [gl_cv_c_amsterdam_compiler=no])
+    ])
+
+  dnl Don't compete with AM_PROG_AR's decision about AR/ARFLAGS if we are not
+  dnl building with __ACK__.
+  if test $gl_cv_c_amsterdam_compiler = yes; then
+    if test -z "$AR"; then
+      AR='cc -c.a'
+    fi
+    if test -z "$ARFLAGS"; then
+      ARFLAGS='-o'
+    fi
+  else
+    dnl AM_PROG_AR was added in automake v1.11.2.  AM_PROG_AR does not AC_SUBST
+    dnl ARFLAGS variable (it is filed into Makefile.in directly by automake
+    dnl script on-demand, if not specified by ./configure of course).
+    dnl Don't AC_REQUIRE the AM_PROG_AR otherwise the code for __ACK__ above
+    dnl will be ignored.  Also, pay attention to call AM_PROG_AR in else block
+    dnl because AM_PROG_AR is written so it could re-set AR variable even for
+    dnl __ACK__.  It may seem like its easier to avoid calling the macro here,
+    dnl but we need to AC_SUBST both AR/ARFLAGS (thus those must have some good
+    dnl default value and automake should usually know them).
+    dnl
+    dnl The '][' hides this use from 'aclocal'.
+    m4_ifdef([A][M_PROG_AR], [A][M_PROG_AR], [:])
+  fi
+
+  dnl In case the code above has not helped with setting AR/ARFLAGS, use
+  dnl Automake-documented default values for AR and ARFLAGS, but prefer
+  dnl ${host}-ar over ar (useful for cross-compiling).
+  AC_CHECK_TOOL([AR], [ar], [ar])
+  if test -z "$ARFLAGS"; then
+    ARFLAGS='cr'
+  fi
+
+  AC_SUBST([AR])
+  AC_SUBST([ARFLAGS])
+  if test -z "$RANLIB"; then
+    if test $gl_cv_c_amsterdam_compiler = yes; then
+      RANLIB=':'
+    else
+      dnl Use the ranlib program if it is available.
+      AC_PROG_RANLIB
+    fi
+  fi
+  AC_SUBST([RANLIB])
+])
+
+# AC_PROG_MKDIR_P
+# is a backport of autoconf-2.60's AC_PROG_MKDIR_P, with a fix
+# for interoperability with automake-1.9.6 from autoconf-2.62.
+# Remove this macro when we can assume autoconf >= 2.62 or
+# autoconf >= 2.60 && automake >= 1.10.
+# AC_AUTOCONF_VERSION was introduced in 2.62, so use that as the witness.
+m4_ifndef([AC_AUTOCONF_VERSION],[
+m4_ifdef([AC_PROG_MKDIR_P], [
+  dnl For automake-1.9.6 && autoconf < 2.62: Ensure MKDIR_P is AC_SUBSTed.
+  m4_define([AC_PROG_MKDIR_P],
+    m4_defn([AC_PROG_MKDIR_P])[
+    AC_SUBST([MKDIR_P])])], [
+  dnl For autoconf < 2.60: Backport of AC_PROG_MKDIR_P.
+  AC_DEFUN_ONCE([AC_PROG_MKDIR_P],
+    [AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake
+     MKDIR_P='$(mkdir_p)'
+     AC_SUBST([MKDIR_P])])])
+])
+
+# AC_C_RESTRICT
+# This definition is copied from post-2.69 Autoconf and overrides the
+# AC_C_RESTRICT macro from autoconf 2.60..2.69.  It can be removed
+# once autoconf >= 2.70 can be assumed.  It's painful to check version
+# numbers, and in practice this macro is more up-to-date than Autoconf
+# is, so override Autoconf unconditionally.
+AC_DEFUN([AC_C_RESTRICT],
+[AC_CACHE_CHECK([for C/C++ restrict keyword], [ac_cv_c_restrict],
+  [ac_cv_c_restrict=no
+   # The order here caters to the fact that C++ does not require restrict.
+   for ac_kw in __restrict __restrict__ _Restrict restrict; do
+     AC_COMPILE_IFELSE(
+      [AC_LANG_PROGRAM(
+	 [[typedef int *int_ptr;
+	   int foo (int_ptr $ac_kw ip) { return ip[0]; }
+	   int bar (int [$ac_kw]); /* Catch GCC bug 14050.  */
+	   int bar (int ip[$ac_kw]) { return ip[0]; }
+	 ]],
+	 [[int s[1];
+	   int *$ac_kw t = s;
+	   t[0] = 0;
+	   return foo (t) + bar (t);
+	 ]])],
+      [ac_cv_c_restrict=$ac_kw])
+     test "$ac_cv_c_restrict" != no && break
+   done
+  ])
+ AH_VERBATIM([restrict],
+[/* Define to the equivalent of the C99 'restrict' keyword, or to
+   nothing if this is not supported.  Do not define if restrict is
+   supported directly.  */
+#undef restrict
+/* Work around a bug in Sun C++: it does not support _Restrict or
+   __restrict__, even though the corresponding Sun C compiler ends up with
+   "#define restrict _Restrict" or "#define restrict __restrict__" in the
+   previous line.  Perhaps some future version of Sun C++ will work with
+   restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */
+#if defined __SUNPRO_CC && !defined __RESTRICT
+# define _Restrict
+# define __restrict__
+#endif])
+ case $ac_cv_c_restrict in
+   restrict) ;;
+   no) AC_DEFINE([restrict], []) ;;
+   *)  AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;;
+ esac
+])# AC_C_RESTRICT
+
+# gl_BIGENDIAN
+# is like AC_C_BIGENDIAN, except that it can be AC_REQUIREd.
+# Note that AC_REQUIRE([AC_C_BIGENDIAN]) does not work reliably because some
+# macros invoke AC_C_BIGENDIAN with arguments.
+AC_DEFUN([gl_BIGENDIAN],
+[
+  AC_C_BIGENDIAN
+])
+
+# gl_CACHE_VAL_SILENT(cache-id, command-to-set-it)
+# is like AC_CACHE_VAL(cache-id, command-to-set-it), except that it does not
+# output a spurious "(cached)" mark in the midst of other configure output.
+# This macro should be used instead of AC_CACHE_VAL when it is not surrounded
+# by an AC_MSG_CHECKING/AC_MSG_RESULT pair.
+AC_DEFUN([gl_CACHE_VAL_SILENT],
+[
+  saved_as_echo_n="$as_echo_n"
+  as_echo_n=':'
+  AC_CACHE_VAL([$1], [$2])
+  as_echo_n="$saved_as_echo_n"
+])
+
+# AS_VAR_COPY was added in autoconf 2.63b
+m4_define_default([AS_VAR_COPY],
+[AS_LITERAL_IF([$1[]$2], [$1=$$2], [eval $1=\$$2])])
+
+# AC_PROG_SED was added in autoconf 2.59b
+m4_ifndef([AC_PROG_SED],
+[AC_DEFUN([AC_PROG_SED],
+[AC_CACHE_CHECK([for a sed that does not truncate output], ac_cv_path_SED,
+    [dnl ac_script should not contain more than 99 commands (for HP-UX sed),
+     dnl but more than about 7000 bytes, to catch a limit in Solaris 8 /usr/ucb/sed.
+     ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     AS_UNSET([ac_script])
+     if test -z "$SED"; then
+       ac_path_SED_found=false
+       _AS_PATH_WALK([], [
+         for ac_prog in sed gsed; do
+           for ac_exec_ext in '' $ac_executable_extensions; do
+             ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+             AS_EXECUTABLE_P(["$ac_path_SED"]) || continue
+             case `"$ac_path_SED" --version 2>&1` in
+               *GNU*) ac_cv_path_SED=$ac_path_SED ac_path_SED_found=:;;
+               *)
+                 ac_count=0
+                 _AS_ECHO_N([0123456789]) >conftest.in
+                 while :
+                 do
+                   cat conftest.in conftest.in >conftest.tmp
+                   mv conftest.tmp conftest.in
+                   cp conftest.in conftest.nl
+                   echo >> conftest.nl
+                   "$ac_path_SED" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break
+                   diff conftest.out conftest.nl >/dev/null 2>&1 || break
+                   ac_count=`expr $ac_count + 1`
+                   if test $ac_count -gt ${ac_path_SED_max-0}; then
+                     # Best so far, but keep looking for better
+                     ac_cv_path_SED=$ac_path_SED
+                     ac_path_SED_max=$ac_count
+                   fi
+                   test $ac_count -gt 10 && break
+                 done
+                 rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+             esac
+             $ac_path_SED_found && break 3
+           done
+         done])
+       if test -z "$ac_cv_path_SED"; then
+         AC_ERROR([no acceptable sed could be found in \$PATH])
+       fi
+     else
+       ac_cv_path_SED=$SED
+     fi
+    ])
+ SED="$ac_cv_path_SED"
+ AC_SUBST([SED])dnl
+ rm -f conftest.sed
+])
+])
diff --git a/liblouis/gnulib/m4/gnulib-comp.m4 b/liblouis/gnulib/m4/gnulib-comp.m4
new file mode 100644
index 0000000..01daff2
--- /dev/null
+++ b/liblouis/gnulib/m4/gnulib-comp.m4
@@ -0,0 +1,336 @@
+# DO NOT EDIT! GENERATED AUTOMATICALLY!
+# Copyright (C) 2002-2017 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this file.  If not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+#
+# This file represents the compiled summary of the specification in
+# gnulib-cache.m4. It lists the computed macro invocations that need
+# to be invoked from configure.ac.
+# In projects that use version control, this file can be treated like
+# other built files.
+
+
+# This macro should be invoked from ./configure.ac, in the section
+# "Checks for programs", right after AC_PROG_CC, and certainly before
+# any checks for libraries, header files, types and library functions.
+AC_DEFUN([gl_EARLY],
+[
+  m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace
+  m4_pattern_allow([^gl_ES$])dnl a valid locale name
+  m4_pattern_allow([^gl_LIBOBJS$])dnl a variable
+  m4_pattern_allow([^gl_LTLIBOBJS$])dnl a variable
+
+  # Pre-early section.
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+  AC_REQUIRE([gl_PROG_AR_RANLIB])
+
+  # Code from module absolute-header:
+  # Code from module alloca-opt:
+  # Code from module dirent:
+  # Code from module environ:
+  # Code from module extensions:
+  # Code from module extern-inline:
+  # Code from module include_next:
+  # Code from module lib-msvc-compat:
+  # Code from module limits-h:
+  # Code from module malloc-gnu:
+  # Code from module malloc-posix:
+  # Code from module malloca:
+  # Code from module multiarch:
+  # Code from module realloc-gnu:
+  # Code from module realloc-posix:
+  # Code from module setenv:
+  # Code from module snippet/_Noreturn:
+  # Code from module snippet/arg-nonnull:
+  # Code from module snippet/c++defs:
+  # Code from module snippet/warn-on-use:
+  # Code from module ssize_t:
+  # Code from module stddef:
+  # Code from module stdint:
+  # Code from module stdlib:
+  # Code from module string:
+  # Code from module strndup:
+  # Code from module strnlen:
+  # Code from module sys_types:
+  # Code from module unistd:
+  # Code from module verify:
+  # Code from module xalloc-oversized:
+])
+
+# This macro should be invoked from ./configure.ac, in the section
+# "Check for header files, types and library functions".
+AC_DEFUN([gl_INIT],
+[
+  AM_CONDITIONAL([GL_COND_LIBTOOL], [true])
+  gl_cond_libtool=true
+  gl_m4_base='gnulib/m4'
+  m4_pushdef([AC_LIBOBJ], m4_defn([gl_LIBOBJ]))
+  m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl_REPLACE_FUNCS]))
+  m4_pushdef([AC_LIBSOURCES], m4_defn([gl_LIBSOURCES]))
+  m4_pushdef([gl_LIBSOURCES_LIST], [])
+  m4_pushdef([gl_LIBSOURCES_DIR], [])
+  gl_COMMON
+  gl_source_base='gnulib'
+  gl_FUNC_ALLOCA
+  gl_DIRENT_H
+  gl_ENVIRON
+  gl_UNISTD_MODULE_INDICATOR([environ])
+  AC_REQUIRE([gl_EXTERN_INLINE])
+  gl_LD_OUTPUT_DEF
+  gl_LIMITS_H
+  gl_FUNC_MALLOC_GNU
+  if test $REPLACE_MALLOC = 1; then
+    AC_LIBOBJ([malloc])
+  fi
+  gl_MODULE_INDICATOR([malloc-gnu])
+  gl_FUNC_MALLOC_POSIX
+  if test $REPLACE_MALLOC = 1; then
+    AC_LIBOBJ([malloc])
+  fi
+  gl_STDLIB_MODULE_INDICATOR([malloc-posix])
+  gl_MALLOCA
+  gl_MULTIARCH
+  gl_FUNC_REALLOC_GNU
+  if test $REPLACE_REALLOC = 1; then
+    AC_LIBOBJ([realloc])
+  fi
+  gl_MODULE_INDICATOR([realloc-gnu])
+  gl_FUNC_REALLOC_POSIX
+  if test $REPLACE_REALLOC = 1; then
+    AC_LIBOBJ([realloc])
+  fi
+  gl_STDLIB_MODULE_INDICATOR([realloc-posix])
+  gl_FUNC_SETENV
+  if test $HAVE_SETENV = 0 || test $REPLACE_SETENV = 1; then
+    AC_LIBOBJ([setenv])
+  fi
+  gl_STDLIB_MODULE_INDICATOR([setenv])
+  gt_TYPE_SSIZE_T
+  gl_STDDEF_H
+  gl_STDINT_H
+  gl_STDLIB_H
+  gl_HEADER_STRING_H
+  gl_FUNC_STRNDUP
+  if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then
+    AC_LIBOBJ([strndup])
+  fi
+  gl_STRING_MODULE_INDICATOR([strndup])
+  gl_FUNC_STRNLEN
+  if test $HAVE_DECL_STRNLEN = 0 || test $REPLACE_STRNLEN = 1; then
+    AC_LIBOBJ([strnlen])
+    gl_PREREQ_STRNLEN
+  fi
+  gl_STRING_MODULE_INDICATOR([strnlen])
+  gl_SYS_TYPES_H
+  AC_PROG_MKDIR_P
+  gl_UNISTD_H
+  # End of code from modules
+  m4_ifval(gl_LIBSOURCES_LIST, [
+    m4_syscmd([test ! -d ]m4_defn([gl_LIBSOURCES_DIR])[ ||
+      for gl_file in ]gl_LIBSOURCES_LIST[ ; do
+        if test ! -r ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file ; then
+          echo "missing file ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file" >&2
+          exit 1
+        fi
+      done])dnl
+      m4_if(m4_sysval, [0], [],
+        [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])])
+  ])
+  m4_popdef([gl_LIBSOURCES_DIR])
+  m4_popdef([gl_LIBSOURCES_LIST])
+  m4_popdef([AC_LIBSOURCES])
+  m4_popdef([AC_REPLACE_FUNCS])
+  m4_popdef([AC_LIBOBJ])
+  AC_CONFIG_COMMANDS_PRE([
+    gl_libobjs=
+    gl_ltlibobjs=
+    if test -n "$gl_LIBOBJS"; then
+      # Remove the extension.
+      sed_drop_objext='s/\.o$//;s/\.obj$//'
+      for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
+        gl_libobjs="$gl_libobjs $i.$ac_objext"
+        gl_ltlibobjs="$gl_ltlibobjs $i.lo"
+      done
+    fi
+    AC_SUBST([gl_LIBOBJS], [$gl_libobjs])
+    AC_SUBST([gl_LTLIBOBJS], [$gl_ltlibobjs])
+  ])
+  gltests_libdeps=
+  gltests_ltlibdeps=
+  m4_pushdef([AC_LIBOBJ], m4_defn([gltests_LIBOBJ]))
+  m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gltests_REPLACE_FUNCS]))
+  m4_pushdef([AC_LIBSOURCES], m4_defn([gltests_LIBSOURCES]))
+  m4_pushdef([gltests_LIBSOURCES_LIST], [])
+  m4_pushdef([gltests_LIBSOURCES_DIR], [])
+  gl_COMMON
+  gl_source_base='tests'
+changequote(,)dnl
+  gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS
+changequote([, ])dnl
+  AC_SUBST([gltests_WITNESS])
+  gl_module_indicator_condition=$gltests_WITNESS
+  m4_pushdef([gl_MODULE_INDICATOR_CONDITION], [$gl_module_indicator_condition])
+  m4_popdef([gl_MODULE_INDICATOR_CONDITION])
+  m4_ifval(gltests_LIBSOURCES_LIST, [
+    m4_syscmd([test ! -d ]m4_defn([gltests_LIBSOURCES_DIR])[ ||
+      for gl_file in ]gltests_LIBSOURCES_LIST[ ; do
+        if test ! -r ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file ; then
+          echo "missing file ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file" >&2
+          exit 1
+        fi
+      done])dnl
+      m4_if(m4_sysval, [0], [],
+        [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])])
+  ])
+  m4_popdef([gltests_LIBSOURCES_DIR])
+  m4_popdef([gltests_LIBSOURCES_LIST])
+  m4_popdef([AC_LIBSOURCES])
+  m4_popdef([AC_REPLACE_FUNCS])
+  m4_popdef([AC_LIBOBJ])
+  AC_CONFIG_COMMANDS_PRE([
+    gltests_libobjs=
+    gltests_ltlibobjs=
+    if test -n "$gltests_LIBOBJS"; then
+      # Remove the extension.
+      sed_drop_objext='s/\.o$//;s/\.obj$//'
+      for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
+        gltests_libobjs="$gltests_libobjs $i.$ac_objext"
+        gltests_ltlibobjs="$gltests_ltlibobjs $i.lo"
+      done
+    fi
+    AC_SUBST([gltests_LIBOBJS], [$gltests_libobjs])
+    AC_SUBST([gltests_LTLIBOBJS], [$gltests_ltlibobjs])
+  ])
+])
+
+# Like AC_LIBOBJ, except that the module name goes
+# into gl_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gl_LIBOBJ], [
+  AS_LITERAL_IF([$1], [gl_LIBSOURCES([$1.c])])dnl
+  gl_LIBOBJS="$gl_LIBOBJS $1.$ac_objext"
+])
+
+# Like AC_REPLACE_FUNCS, except that the module name goes
+# into gl_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gl_REPLACE_FUNCS], [
+  m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl
+  AC_CHECK_FUNCS([$1], , [gl_LIBOBJ($ac_func)])
+])
+
+# Like AC_LIBSOURCES, except the directory where the source file is
+# expected is derived from the gnulib-tool parameterization,
+# and alloca is special cased (for the alloca-opt module).
+# We could also entirely rely on EXTRA_lib..._SOURCES.
+AC_DEFUN([gl_LIBSOURCES], [
+  m4_foreach([_gl_NAME], [$1], [
+    m4_if(_gl_NAME, [alloca.c], [], [
+      m4_define([gl_LIBSOURCES_DIR], [gnulib])
+      m4_append([gl_LIBSOURCES_LIST], _gl_NAME, [ ])
+    ])
+  ])
+])
+
+# Like AC_LIBOBJ, except that the module name goes
+# into gltests_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gltests_LIBOBJ], [
+  AS_LITERAL_IF([$1], [gltests_LIBSOURCES([$1.c])])dnl
+  gltests_LIBOBJS="$gltests_LIBOBJS $1.$ac_objext"
+])
+
+# Like AC_REPLACE_FUNCS, except that the module name goes
+# into gltests_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gltests_REPLACE_FUNCS], [
+  m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl
+  AC_CHECK_FUNCS([$1], , [gltests_LIBOBJ($ac_func)])
+])
+
+# Like AC_LIBSOURCES, except the directory where the source file is
+# expected is derived from the gnulib-tool parameterization,
+# and alloca is special cased (for the alloca-opt module).
+# We could also entirely rely on EXTRA_lib..._SOURCES.
+AC_DEFUN([gltests_LIBSOURCES], [
+  m4_foreach([_gl_NAME], [$1], [
+    m4_if(_gl_NAME, [alloca.c], [], [
+      m4_define([gltests_LIBSOURCES_DIR], [tests])
+      m4_append([gltests_LIBSOURCES_LIST], _gl_NAME, [ ])
+    ])
+  ])
+])
+
+# This macro records the list of files which have been installed by
+# gnulib-tool and may be removed by future gnulib-tool invocations.
+AC_DEFUN([gl_FILE_LIST], [
+  lib/_Noreturn.h
+  lib/alloca.in.h
+  lib/arg-nonnull.h
+  lib/c++defs.h
+  lib/dirent.in.h
+  lib/limits.in.h
+  lib/malloc.c
+  lib/malloca.c
+  lib/malloca.h
+  lib/malloca.valgrind
+  lib/realloc.c
+  lib/setenv.c
+  lib/stddef.in.h
+  lib/stdint.in.h
+  lib/stdlib.in.h
+  lib/string.in.h
+  lib/strndup.c
+  lib/strnlen.c
+  lib/sys_types.in.h
+  lib/unistd.c
+  lib/unistd.in.h
+  lib/verify.h
+  lib/warn-on-use.h
+  lib/xalloc-oversized.h
+  m4/00gnulib.m4
+  m4/absolute-header.m4
+  m4/alloca.m4
+  m4/dirent_h.m4
+  m4/eealloc.m4
+  m4/environ.m4
+  m4/extensions.m4
+  m4/extern-inline.m4
+  m4/gnulib-common.m4
+  m4/include_next.m4
+  m4/ld-output-def.m4
+  m4/limits-h.m4
+  m4/longlong.m4
+  m4/malloc.m4
+  m4/malloca.m4
+  m4/multiarch.m4
+  m4/off_t.m4
+  m4/realloc.m4
+  m4/setenv.m4
+  m4/ssize_t.m4
+  m4/stddef_h.m4
+  m4/stdint.m4
+  m4/stdlib_h.m4
+  m4/string_h.m4
+  m4/strndup.m4
+  m4/strnlen.m4
+  m4/sys_types_h.m4
+  m4/unistd_h.m4
+  m4/warn-on-use.m4
+  m4/wchar_t.m4
+  m4/wint_t.m4
+])
diff --git a/liblouis/gnulib/m4/gnulib-tool.m4 b/liblouis/gnulib/m4/gnulib-tool.m4
new file mode 100644
index 0000000..2e2d8f6
--- /dev/null
+++ b/liblouis/gnulib/m4/gnulib-tool.m4
@@ -0,0 +1,57 @@
+# gnulib-tool.m4 serial 2
+dnl Copyright (C) 2004-2005, 2009-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl The following macros need not be invoked explicitly.
+dnl Invoking them does nothing except to declare default arguments
+dnl for "gnulib-tool --import".
+
+dnl Usage: gl_LOCAL_DIR([DIR])
+AC_DEFUN([gl_LOCAL_DIR], [])
+
+dnl Usage: gl_MODULES([module1 module2 ...])
+AC_DEFUN([gl_MODULES], [])
+
+dnl Usage: gl_AVOID([module1 module2 ...])
+AC_DEFUN([gl_AVOID], [])
+
+dnl Usage: gl_SOURCE_BASE([DIR])
+AC_DEFUN([gl_SOURCE_BASE], [])
+
+dnl Usage: gl_M4_BASE([DIR])
+AC_DEFUN([gl_M4_BASE], [])
+
+dnl Usage: gl_PO_BASE([DIR])
+AC_DEFUN([gl_PO_BASE], [])
+
+dnl Usage: gl_DOC_BASE([DIR])
+AC_DEFUN([gl_DOC_BASE], [])
+
+dnl Usage: gl_TESTS_BASE([DIR])
+AC_DEFUN([gl_TESTS_BASE], [])
+
+dnl Usage: gl_WITH_TESTS
+AC_DEFUN([gl_WITH_TESTS], [])
+
+dnl Usage: gl_LIB([LIBNAME])
+AC_DEFUN([gl_LIB], [])
+
+dnl Usage: gl_LGPL or gl_LGPL([VERSION])
+AC_DEFUN([gl_LGPL], [])
+
+dnl Usage: gl_MAKEFILE_NAME([FILENAME])
+AC_DEFUN([gl_MAKEFILE_NAME], [])
+
+dnl Usage: gl_LIBTOOL
+AC_DEFUN([gl_LIBTOOL], [])
+
+dnl Usage: gl_MACRO_PREFIX([PREFIX])
+AC_DEFUN([gl_MACRO_PREFIX], [])
+
+dnl Usage: gl_PO_DOMAIN([DOMAIN])
+AC_DEFUN([gl_PO_DOMAIN], [])
+
+dnl Usage: gl_VC_FILES([BOOLEAN])
+AC_DEFUN([gl_VC_FILES], [])
diff --git a/liblouis/gnulib/m4/include_next.m4 b/liblouis/gnulib/m4/include_next.m4
new file mode 100644
index 0000000..068f6f6
--- /dev/null
+++ b/liblouis/gnulib/m4/include_next.m4
@@ -0,0 +1,224 @@
+# include_next.m4 serial 24
+dnl Copyright (C) 2006-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert and Derek Price.
+
+dnl Sets INCLUDE_NEXT, INCLUDE_NEXT_AS_FIRST_DIRECTIVE, PRAGMA_SYSTEM_HEADER,
+dnl and PRAGMA_COLUMNS.
+dnl
+dnl INCLUDE_NEXT expands to 'include_next' if the compiler supports it, or to
+dnl 'include' otherwise.
+dnl
+dnl INCLUDE_NEXT_AS_FIRST_DIRECTIVE expands to 'include_next' if the compiler
+dnl supports it in the special case that it is the first include directive in
+dnl the given file, or to 'include' otherwise.
+dnl
+dnl PRAGMA_SYSTEM_HEADER can be used in files that contain #include_next,
+dnl so as to avoid GCC warnings when the gcc option -pedantic is used.
+dnl '#pragma GCC system_header' has the same effect as if the file was found
+dnl through the include search path specified with '-isystem' options (as
+dnl opposed to the search path specified with '-I' options). Namely, gcc
+dnl does not warn about some things, and on some systems (Solaris and Interix)
+dnl __STDC__ evaluates to 0 instead of to 1. The latter is an undesired side
+dnl effect; we are therefore careful to use 'defined __STDC__' or '1' instead
+dnl of plain '__STDC__'.
+dnl
+dnl PRAGMA_COLUMNS can be used in files that override system header files, so
+dnl as to avoid compilation errors on HP NonStop systems when the gnulib file
+dnl is included by a system header file that does a "#pragma COLUMNS 80" (which
+dnl has the effect of truncating the lines of that file and all files that it
+dnl includes to 80 columns) and the gnulib file has lines longer than 80
+dnl columns.
+
+AC_DEFUN([gl_INCLUDE_NEXT],
+[
+  AC_LANG_PREPROC_REQUIRE()
+  AC_CACHE_CHECK([whether the preprocessor supports include_next],
+    [gl_cv_have_include_next],
+    [rm -rf conftestd1a conftestd1b conftestd2
+     mkdir conftestd1a conftestd1b conftestd2
+     dnl IBM C 9.0, 10.1 (original versions, prior to the 2009-01 updates) on
+     dnl AIX 6.1 support include_next when used as first preprocessor directive
+     dnl in a file, but not when preceded by another include directive. Check
+     dnl for this bug by including <stdio.h>.
+     dnl Additionally, with this same compiler, include_next is a no-op when
+     dnl used in a header file that was included by specifying its absolute
+     dnl file name. Despite these two bugs, include_next is used in the
+     dnl compiler's <math.h>. By virtue of the second bug, we need to use
+     dnl include_next as well in this case.
+     cat <<EOF > conftestd1a/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+     cat <<EOF > conftestd1b/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include <stdio.h>
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+     cat <<EOF > conftestd2/conftest.h
+#ifndef DEFINED_IN_CONFTESTD1
+#error "include_next test doesn't work"
+#endif
+#define DEFINED_IN_CONFTESTD2
+EOF
+     gl_save_CPPFLAGS="$CPPFLAGS"
+     CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2"
+dnl We intentionally avoid using AC_LANG_SOURCE here.
+     AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include <conftest.h>]],
+       [gl_cv_have_include_next=yes],
+       [CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2"
+        AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include <conftest.h>]],
+          [gl_cv_have_include_next=buggy],
+          [gl_cv_have_include_next=no])
+       ])
+     CPPFLAGS="$gl_save_CPPFLAGS"
+     rm -rf conftestd1a conftestd1b conftestd2
+    ])
+  PRAGMA_SYSTEM_HEADER=
+  if test $gl_cv_have_include_next = yes; then
+    INCLUDE_NEXT=include_next
+    INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+    if test -n "$GCC"; then
+      PRAGMA_SYSTEM_HEADER='#pragma GCC system_header'
+    fi
+  else
+    if test $gl_cv_have_include_next = buggy; then
+      INCLUDE_NEXT=include
+      INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+    else
+      INCLUDE_NEXT=include
+      INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include
+    fi
+  fi
+  AC_SUBST([INCLUDE_NEXT])
+  AC_SUBST([INCLUDE_NEXT_AS_FIRST_DIRECTIVE])
+  AC_SUBST([PRAGMA_SYSTEM_HEADER])
+  AC_CACHE_CHECK([whether system header files limit the line length],
+    [gl_cv_pragma_columns],
+    [dnl HP NonStop systems, which define __TANDEM, have this misfeature.
+     AC_EGREP_CPP([choke me],
+       [
+#ifdef __TANDEM
+choke me
+#endif
+       ],
+       [gl_cv_pragma_columns=yes],
+       [gl_cv_pragma_columns=no])
+    ])
+  if test $gl_cv_pragma_columns = yes; then
+    PRAGMA_COLUMNS="#pragma COLUMNS 10000"
+  else
+    PRAGMA_COLUMNS=
+  fi
+  AC_SUBST([PRAGMA_COLUMNS])
+])
+
+# gl_CHECK_NEXT_HEADERS(HEADER1 HEADER2 ...)
+# ------------------------------------------
+# For each arg foo.h, if #include_next works, define NEXT_FOO_H to be
+# '<foo.h>'; otherwise define it to be
+# '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
+# Also, if #include_next works as first preprocessing directive in a file,
+# define NEXT_AS_FIRST_DIRECTIVE_FOO_H to be '<foo.h>'; otherwise define it to
+# be
+# '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
+# That way, a header file with the following line:
+#       #@INCLUDE_NEXT@ @NEXT_FOO_H@
+# or
+#       #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_FOO_H@
+# behaves (after sed substitution) as if it contained
+#       #include_next <foo.h>
+# even if the compiler does not support include_next.
+# The three "///" are to pacify Sun C 5.8, which otherwise would say
+# "warning: #include of /usr/include/... may be non-portable".
+# Use '""', not '<>', so that the /// cannot be confused with a C99 comment.
+# Note: This macro assumes that the header file is not empty after
+# preprocessing, i.e. it does not only define preprocessor macros but also
+# provides some type/enum definitions or function/variable declarations.
+#
+# This macro also checks whether each header exists, by invoking
+# AC_CHECK_HEADERS_ONCE or AC_CHECK_HEADERS on each argument.
+AC_DEFUN([gl_CHECK_NEXT_HEADERS],
+[
+  gl_NEXT_HEADERS_INTERNAL([$1], [check])
+])
+
+# gl_NEXT_HEADERS(HEADER1 HEADER2 ...)
+# ------------------------------------
+# Like gl_CHECK_NEXT_HEADERS, except do not check whether the headers exist.
+# This is suitable for headers like <stddef.h> that are standardized by C89
+# and therefore can be assumed to exist.
+AC_DEFUN([gl_NEXT_HEADERS],
+[
+  gl_NEXT_HEADERS_INTERNAL([$1], [assume])
+])
+
+# The guts of gl_CHECK_NEXT_HEADERS and gl_NEXT_HEADERS.
+AC_DEFUN([gl_NEXT_HEADERS_INTERNAL],
+[
+  AC_REQUIRE([gl_INCLUDE_NEXT])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+
+  m4_if([$2], [check],
+    [AC_CHECK_HEADERS_ONCE([$1])
+    ])
+
+dnl FIXME: gl_next_header and gl_header_exists must be used unquoted
+dnl until we can assume autoconf 2.64 or newer.
+  m4_foreach_w([gl_HEADER_NAME], [$1],
+    [AS_VAR_PUSHDEF([gl_next_header],
+                    [gl_cv_next_]m4_defn([gl_HEADER_NAME]))
+     if test $gl_cv_have_include_next = yes; then
+       AS_VAR_SET(gl_next_header, ['<'gl_HEADER_NAME'>'])
+     else
+       AC_CACHE_CHECK(
+         [absolute name of <]m4_defn([gl_HEADER_NAME])[>],
+         m4_defn([gl_next_header]),
+         [m4_if([$2], [check],
+            [AS_VAR_PUSHDEF([gl_header_exists],
+                            [ac_cv_header_]m4_defn([gl_HEADER_NAME]))
+             if test AS_VAR_GET(gl_header_exists) = yes; then
+             AS_VAR_POPDEF([gl_header_exists])
+            ])
+           gl_ABSOLUTE_HEADER_ONE(gl_HEADER_NAME)
+           AS_VAR_COPY([gl_header], [gl_cv_absolute_]AS_TR_SH(gl_HEADER_NAME))
+           AS_VAR_SET(gl_next_header, ['"'$gl_header'"'])
+          m4_if([$2], [check],
+            [else
+               AS_VAR_SET(gl_next_header, ['<'gl_HEADER_NAME'>'])
+             fi
+            ])
+         ])
+     fi
+     AC_SUBST(
+       AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])),
+       [AS_VAR_GET(gl_next_header)])
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'gl_HEADER_NAME'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=AS_VAR_GET(gl_next_header)
+     fi
+     AC_SUBST(
+       AS_TR_CPP([NEXT_AS_FIRST_DIRECTIVE_]m4_defn([gl_HEADER_NAME])),
+       [$gl_next_as_first_directive])
+     AS_VAR_POPDEF([gl_next_header])])
+])
+
+# Autoconf 2.68 added warnings for our use of AC_COMPILE_IFELSE;
+# this fallback is safe for all earlier autoconf versions.
+m4_define_default([AC_LANG_DEFINES_PROVIDED])
diff --git a/liblouis/gnulib/m4/ld-output-def.m4 b/liblouis/gnulib/m4/ld-output-def.m4
new file mode 100644
index 0000000..275001f
--- /dev/null
+++ b/liblouis/gnulib/m4/ld-output-def.m4
@@ -0,0 +1,29 @@
+# ld-output-def.m4 serial 2
+dnl Copyright (C) 2008-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Simon Josefsson
+
+# gl_LD_OUTPUT_DEF()
+# -------------
+# Check if linker supports -Wl,--output-def and define automake
+# conditional HAVE_LD_OUTPUT_DEF if it is.
+AC_DEFUN([gl_LD_OUTPUT_DEF],
+[
+  AC_CACHE_CHECK([if gcc/ld supports -Wl,--output-def],
+    [gl_cv_ld_output_def],
+    [if test "$enable_shared" = no; then
+       gl_cv_ld_output_def="not needed, shared libraries are disabled"
+     else
+       gl_ldflags_save=$LDFLAGS
+       LDFLAGS="-Wl,--output-def,conftest.def"
+       AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
+                   [gl_cv_ld_output_def=yes],
+                   [gl_cv_ld_output_def=no])
+       rm -f conftest.def
+       LDFLAGS="$gl_ldflags_save"
+     fi])
+  AM_CONDITIONAL([HAVE_LD_OUTPUT_DEF], test "x$gl_cv_ld_output_def" = "xyes")
+])
diff --git a/liblouis/gnulib/m4/limits-h.m4 b/liblouis/gnulib/m4/limits-h.m4
new file mode 100644
index 0000000..443f91b
--- /dev/null
+++ b/liblouis/gnulib/m4/limits-h.m4
@@ -0,0 +1,31 @@
+dnl Check whether limits.h has needed features.
+
+dnl Copyright 2016-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+AC_DEFUN_ONCE([gl_LIMITS_H],
+[
+  gl_CHECK_NEXT_HEADERS([limits.h])
+
+  AC_CACHE_CHECK([whether limits.h has ULLONG_WIDTH etc.],
+    [gl_cv_header_limits_width],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM([[#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+                           #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+                          #endif
+                          #include <limits.h>
+                          int ullw = ULLONG_WIDTH;]])],
+       [gl_cv_header_limits_width=yes],
+       [gl_cv_header_limits_width=no])])
+  if test "$gl_cv_header_limits_width" = yes; then
+    LIMITS_H=
+  else
+    LIMITS_H=limits.h
+  fi
+  AC_SUBST([LIMITS_H])
+  AM_CONDITIONAL([GL_GENERATE_LIMITS_H], [test -n "$LIMITS_H"])
+])
diff --git a/liblouis/gnulib/m4/longlong.m4 b/liblouis/gnulib/m4/longlong.m4
new file mode 100644
index 0000000..9a3294b
--- /dev/null
+++ b/liblouis/gnulib/m4/longlong.m4
@@ -0,0 +1,113 @@
+# longlong.m4 serial 17
+dnl Copyright (C) 1999-2007, 2009-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_LONG_LONG_INT if 'long long int' works.
+# This fixes a bug in Autoconf 2.61, and can be faster
+# than what's in Autoconf 2.62 through 2.68.
+
+# Note: If the type 'long long int' exists but is only 32 bits large
+# (as on some very old compilers), HAVE_LONG_LONG_INT will not be
+# defined. In this case you can treat 'long long int' like 'long int'.
+
+AC_DEFUN([AC_TYPE_LONG_LONG_INT],
+[
+  AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+  AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
+     [ac_cv_type_long_long_int=yes
+      if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+        ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
+        if test $ac_cv_type_long_long_int = yes; then
+          dnl Catch a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
+          dnl If cross compiling, assume the bug is not important, since
+          dnl nobody cross compiles for this platform as far as we know.
+          AC_RUN_IFELSE(
+            [AC_LANG_PROGRAM(
+               [[@%:@include <limits.h>
+                 @%:@ifndef LLONG_MAX
+                 @%:@ define HALF \
+                          (1LL << (sizeof (long long int) * CHAR_BIT - 2))
+                 @%:@ define LLONG_MAX (HALF - 1 + HALF)
+                 @%:@endif]],
+               [[long long int n = 1;
+                 int i;
+                 for (i = 0; ; i++)
+                   {
+                     long long int m = n << i;
+                     if (m >> i != n)
+                       return 1;
+                     if (LLONG_MAX / 2 < m)
+                       break;
+                   }
+                 return 0;]])],
+            [],
+            [ac_cv_type_long_long_int=no],
+            [:])
+        fi
+      fi])
+  if test $ac_cv_type_long_long_int = yes; then
+    AC_DEFINE([HAVE_LONG_LONG_INT], [1],
+      [Define to 1 if the system has the type 'long long int'.])
+  fi
+])
+
+# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
+# This fixes a bug in Autoconf 2.61, and can be faster
+# than what's in Autoconf 2.62 through 2.68.
+
+# Note: If the type 'unsigned long long int' exists but is only 32 bits
+# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
+# will not be defined. In this case you can treat 'unsigned long long int'
+# like 'unsigned long int'.
+
+AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
+[
+  AC_CACHE_CHECK([for unsigned long long int],
+    [ac_cv_type_unsigned_long_long_int],
+    [ac_cv_type_unsigned_long_long_int=yes
+     if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+       AC_LINK_IFELSE(
+         [_AC_TYPE_LONG_LONG_SNIPPET],
+         [],
+         [ac_cv_type_unsigned_long_long_int=no])
+     fi])
+  if test $ac_cv_type_unsigned_long_long_int = yes; then
+    AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
+      [Define to 1 if the system has the type 'unsigned long long int'.])
+  fi
+])
+
+# Expands to a C program that can be used to test for simultaneous support
+# of 'long long' and 'unsigned long long'. We don't want to say that
+# 'long long' is available if 'unsigned long long' is not, or vice versa,
+# because too many programs rely on the symmetry between signed and unsigned
+# integer types (excluding 'bool').
+AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
+[
+  AC_LANG_PROGRAM(
+    [[/* For now, do not test the preprocessor; as of 2007 there are too many
+         implementations with broken preprocessors.  Perhaps this can
+         be revisited in 2012.  In the meantime, code should not expect
+         #if to work with literals wider than 32 bits.  */
+      /* Test literals.  */
+      long long int ll = 9223372036854775807ll;
+      long long int nll = -9223372036854775807LL;
+      unsigned long long int ull = 18446744073709551615ULL;
+      /* Test constant expressions.   */
+      typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
+                     ? 1 : -1)];
+      typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
+                     ? 1 : -1)];
+      int i = 63;]],
+    [[/* Test availability of runtime routines for shift and division.  */
+      long long int llmax = 9223372036854775807ll;
+      unsigned long long int ullmax = 18446744073709551615ull;
+      return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
+              | (llmax / ll) | (llmax % ll)
+              | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
+              | (ullmax / ull) | (ullmax % ull));]])
+])
diff --git a/liblouis/gnulib/m4/malloc.m4 b/liblouis/gnulib/m4/malloc.m4
new file mode 100644
index 0000000..e1d2ec6
--- /dev/null
+++ b/liblouis/gnulib/m4/malloc.m4
@@ -0,0 +1,101 @@
+# malloc.m4 serial 15
+dnl Copyright (C) 2007, 2009-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+m4_version_prereq([2.70], [] ,[
+
+# This is adapted with modifications from upstream Autoconf here:
+# http://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=04be2b7a29d65d9a08e64e8e56e594c91749598c
+AC_DEFUN([_AC_FUNC_MALLOC_IF],
+[
+  AC_REQUIRE([AC_HEADER_STDC])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles
+  AC_CHECK_HEADERS([stdlib.h])
+  AC_CACHE_CHECK([for GNU libc compatible malloc],
+    [ac_cv_func_malloc_0_nonnull],
+    [AC_RUN_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#if defined STDC_HEADERS || defined HAVE_STDLIB_H
+            # include <stdlib.h>
+            #else
+            char *malloc ();
+            #endif
+          ]],
+          [[char *p = malloc (0);
+            int result = !p;
+            free (p);
+            return result;]])
+       ],
+       [ac_cv_func_malloc_0_nonnull=yes],
+       [ac_cv_func_malloc_0_nonnull=no],
+       [case "$host_os" in
+          # Guess yes on platforms where we know the result.
+          *-gnu* | freebsd* | netbsd* | openbsd* \
+          | hpux* | solaris* | cygwin* | mingw*)
+            ac_cv_func_malloc_0_nonnull=yes ;;
+          # If we don't know, assume the worst.
+          *) ac_cv_func_malloc_0_nonnull=no ;;
+        esac
+       ])
+    ])
+  AS_IF([test $ac_cv_func_malloc_0_nonnull = yes], [$1], [$2])
+])# _AC_FUNC_MALLOC_IF
+
+])
+
+# gl_FUNC_MALLOC_GNU
+# ------------------
+# Test whether 'malloc (0)' is handled like in GNU libc, and replace malloc if
+# it is not.
+AC_DEFUN([gl_FUNC_MALLOC_GNU],
+[
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  dnl _AC_FUNC_MALLOC_IF is defined in Autoconf.
+  _AC_FUNC_MALLOC_IF(
+    [AC_DEFINE([HAVE_MALLOC_GNU], [1],
+               [Define to 1 if your system has a GNU libc compatible 'malloc'
+                function, and to 0 otherwise.])],
+    [AC_DEFINE([HAVE_MALLOC_GNU], [0])
+     REPLACE_MALLOC=1
+    ])
+])
+
+# gl_FUNC_MALLOC_POSIX
+# --------------------
+# Test whether 'malloc' is POSIX compliant (sets errno to ENOMEM when it
+# fails), and replace malloc if it is not.
+AC_DEFUN([gl_FUNC_MALLOC_POSIX],
+[
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
+  if test $gl_cv_func_malloc_posix = yes; then
+    AC_DEFINE([HAVE_MALLOC_POSIX], [1],
+      [Define if the 'malloc' function is POSIX compliant.])
+  else
+    REPLACE_MALLOC=1
+  fi
+])
+
+# Test whether malloc, realloc, calloc are POSIX compliant,
+# Set gl_cv_func_malloc_posix to yes or no accordingly.
+AC_DEFUN([gl_CHECK_MALLOC_POSIX],
+[
+  AC_CACHE_CHECK([whether malloc, realloc, calloc are POSIX compliant],
+    [gl_cv_func_malloc_posix],
+    [
+      dnl It is too dangerous to try to allocate a large amount of memory:
+      dnl some systems go to their knees when you do that. So assume that
+      dnl all Unix implementations of the function are POSIX compliant.
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM(
+           [[]],
+           [[#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+             choke me
+             #endif
+            ]])],
+        [gl_cv_func_malloc_posix=yes],
+        [gl_cv_func_malloc_posix=no])
+    ])
+])
diff --git a/liblouis/gnulib/m4/malloca.m4 b/liblouis/gnulib/m4/malloca.m4
new file mode 100644
index 0000000..6956baf
--- /dev/null
+++ b/liblouis/gnulib/m4/malloca.m4
@@ -0,0 +1,15 @@
+# malloca.m4 serial 1
+dnl Copyright (C) 2003-2004, 2006-2007, 2009-2017 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MALLOCA],
+[
+  dnl Use the autoconf tests for alloca(), but not the AC_SUBSTed variables
+  dnl @ALLOCA@ and @LTALLOCA@.
+  dnl gl_FUNC_ALLOCA   dnl Already brought in by the module dependencies.
+  AC_REQUIRE([gl_EEMALLOC])
+  AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+])
diff --git a/liblouis/gnulib/m4/multiarch.m4 b/liblouis/gnulib/m4/multiarch.m4
new file mode 100644
index 0000000..30006cb
--- /dev/null
+++ b/liblouis/gnulib/m4/multiarch.m4
@@ -0,0 +1,62 @@
+# multiarch.m4 serial 7
+dnl Copyright (C) 2008-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Determine whether the compiler is or may be producing universal binaries.
+#
+# On Mac OS X 10.5 and later systems, the user can create libraries and
+# executables that work on multiple system types--known as "fat" or
+# "universal" binaries--by specifying multiple '-arch' options to the
+# compiler but only a single '-arch' option to the preprocessor.  Like
+# this:
+#
+#     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+#                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+#                 CPP="gcc -E" CXXCPP="g++ -E"
+#
+# Detect this situation and set APPLE_UNIVERSAL_BUILD accordingly.
+
+AC_DEFUN_ONCE([gl_MULTIARCH],
+[
+  dnl Code similar to autoconf-2.63 AC_C_BIGENDIAN.
+  gl_cv_c_multiarch=no
+  AC_COMPILE_IFELSE(
+    [AC_LANG_SOURCE(
+      [[#ifndef __APPLE_CC__
+         not a universal capable compiler
+        #endif
+        typedef int dummy;
+      ]])],
+    [
+     dnl Check for potential -arch flags.  It is not universal unless
+     dnl there are at least two -arch flags with different values.
+     arch=
+     prev=
+     for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do
+       if test -n "$prev"; then
+         case $word in
+           i?86 | x86_64 | ppc | ppc64)
+             if test -z "$arch" || test "$arch" = "$word"; then
+               arch="$word"
+             else
+               gl_cv_c_multiarch=yes
+             fi
+             ;;
+         esac
+         prev=
+       else
+         if test "x$word" = "x-arch"; then
+           prev=arch
+         fi
+       fi
+     done
+    ])
+  if test $gl_cv_c_multiarch = yes; then
+    APPLE_UNIVERSAL_BUILD=1
+  else
+    APPLE_UNIVERSAL_BUILD=0
+  fi
+  AC_SUBST([APPLE_UNIVERSAL_BUILD])
+])
diff --git a/liblouis/gnulib/m4/off_t.m4 b/liblouis/gnulib/m4/off_t.m4
new file mode 100644
index 0000000..92c45ef
--- /dev/null
+++ b/liblouis/gnulib/m4/off_t.m4
@@ -0,0 +1,18 @@
+# off_t.m4 serial 1
+dnl Copyright (C) 2012-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Check whether to override the 'off_t' type.
+dnl Set WINDOWS_64_BIT_OFF_T.
+
+AC_DEFUN([gl_TYPE_OFF_T],
+[
+  m4_ifdef([gl_LARGEFILE], [
+    AC_REQUIRE([gl_LARGEFILE])
+  ], [
+    WINDOWS_64_BIT_OFF_T=0
+  ])
+  AC_SUBST([WINDOWS_64_BIT_OFF_T])
+])
diff --git a/liblouis/gnulib/m4/realloc.m4 b/liblouis/gnulib/m4/realloc.m4
new file mode 100644
index 0000000..3d05b44
--- /dev/null
+++ b/liblouis/gnulib/m4/realloc.m4
@@ -0,0 +1,79 @@
+# realloc.m4 serial 14
+dnl Copyright (C) 2007, 2009-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+m4_version_prereq([2.70], [] ,[
+
+# This is adapted with modifications from upstream Autoconf here:
+# http://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=04be2b7a29d65d9a08e64e8e56e594c91749598c
+AC_DEFUN([_AC_FUNC_REALLOC_IF],
+[
+  AC_REQUIRE([AC_HEADER_STDC])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles
+  AC_CHECK_HEADERS([stdlib.h])
+  AC_CACHE_CHECK([for GNU libc compatible realloc],
+    [ac_cv_func_realloc_0_nonnull],
+    [AC_RUN_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#if defined STDC_HEADERS || defined HAVE_STDLIB_H
+            # include <stdlib.h>
+            #else
+            char *realloc ();
+            #endif
+          ]],
+          [[char *p = realloc (0, 0);
+            int result = !p;
+            free (p);
+            return result;]])
+       ],
+       [ac_cv_func_realloc_0_nonnull=yes],
+       [ac_cv_func_realloc_0_nonnull=no],
+       [case "$host_os" in
+          # Guess yes on platforms where we know the result.
+          *-gnu* | freebsd* | netbsd* | openbsd* \
+          | hpux* | solaris* | cygwin* | mingw*)
+            ac_cv_func_realloc_0_nonnull=yes ;;
+          # If we don't know, assume the worst.
+          *) ac_cv_func_realloc_0_nonnull=no ;;
+        esac
+       ])
+    ])
+  AS_IF([test $ac_cv_func_realloc_0_nonnull = yes], [$1], [$2])
+])# AC_FUNC_REALLOC
+
+])
+
+# gl_FUNC_REALLOC_GNU
+# -------------------
+# Test whether 'realloc (0, 0)' is handled like in GNU libc, and replace
+# realloc if it is not.
+AC_DEFUN([gl_FUNC_REALLOC_GNU],
+[
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  dnl _AC_FUNC_REALLOC_IF is defined in Autoconf.
+  _AC_FUNC_REALLOC_IF(
+    [AC_DEFINE([HAVE_REALLOC_GNU], [1],
+               [Define to 1 if your system has a GNU libc compatible 'realloc'
+                function, and to 0 otherwise.])],
+    [AC_DEFINE([HAVE_REALLOC_GNU], [0])
+     REPLACE_REALLOC=1
+    ])
+])# gl_FUNC_REALLOC_GNU
+
+# gl_FUNC_REALLOC_POSIX
+# ---------------------
+# Test whether 'realloc' is POSIX compliant (sets errno to ENOMEM when it
+# fails), and replace realloc if it is not.
+AC_DEFUN([gl_FUNC_REALLOC_POSIX],
+[
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
+  if test $gl_cv_func_malloc_posix = yes; then
+    AC_DEFINE([HAVE_REALLOC_POSIX], [1],
+      [Define if the 'realloc' function is POSIX compliant.])
+  else
+    REPLACE_REALLOC=1
+  fi
+])
diff --git a/liblouis/gnulib/m4/setenv.m4 b/liblouis/gnulib/m4/setenv.m4
new file mode 100644
index 0000000..005aa8c
--- /dev/null
+++ b/liblouis/gnulib/m4/setenv.m4
@@ -0,0 +1,160 @@
+# setenv.m4 serial 26
+dnl Copyright (C) 2001-2004, 2006-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SETENV],
+[
+  AC_REQUIRE([gl_FUNC_SETENV_SEPARATE])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  if test $ac_cv_func_setenv = no; then
+    HAVE_SETENV=0
+  else
+    AC_CACHE_CHECK([whether setenv validates arguments],
+      [gl_cv_func_setenv_works],
+      [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+       #include <stdlib.h>
+       #include <errno.h>
+       #include <string.h>
+      ]], [[
+       int result = 0;
+       {
+         if (setenv ("", "", 0) != -1)
+           result |= 1;
+         else if (errno != EINVAL)
+           result |= 2;
+       }
+       {
+         if (setenv ("a", "=", 1) != 0)
+           result |= 4;
+         else if (strcmp (getenv ("a"), "=") != 0)
+           result |= 8;
+       }
+       return result;
+      ]])],
+      [gl_cv_func_setenv_works=yes], [gl_cv_func_setenv_works=no],
+      [case "$host_os" in
+                 # Guess yes on glibc systems.
+         *-gnu*) gl_cv_func_setenv_works="guessing yes" ;;
+                 # If we don't know, assume the worst.
+         *)      gl_cv_func_setenv_works="guessing no" ;;
+       esac
+      ])])
+    case "$gl_cv_func_setenv_works" in
+      *yes) ;;
+      *)
+        REPLACE_SETENV=1
+        ;;
+    esac
+  fi
+])
+
+# Like gl_FUNC_SETENV, except prepare for separate compilation
+# (no REPLACE_SETENV, no AC_LIBOBJ).
+AC_DEFUN([gl_FUNC_SETENV_SEPARATE],
+[
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  AC_CHECK_DECLS_ONCE([setenv])
+  if test $ac_cv_have_decl_setenv = no; then
+    HAVE_DECL_SETENV=0
+  fi
+  AC_CHECK_FUNCS_ONCE([setenv])
+  gl_PREREQ_SETENV
+])
+
+AC_DEFUN([gl_FUNC_UNSETENV],
+[
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  AC_CHECK_DECLS_ONCE([unsetenv])
+  if test $ac_cv_have_decl_unsetenv = no; then
+    HAVE_DECL_UNSETENV=0
+  fi
+  AC_CHECK_FUNCS([unsetenv])
+  if test $ac_cv_func_unsetenv = no; then
+    HAVE_UNSETENV=0
+  else
+    HAVE_UNSETENV=1
+    dnl Some BSDs return void, failing to do error checking.
+    AC_CACHE_CHECK([for unsetenv() return type], [gt_cv_func_unsetenv_ret],
+      [AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM(
+            [[
+#undef _BSD
+#define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 <stdlib.h> */
+#include <stdlib.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+int unsetenv (const char *name);
+            ]],
+            [[]])],
+         [gt_cv_func_unsetenv_ret='int'],
+         [gt_cv_func_unsetenv_ret='void'])])
+    if test $gt_cv_func_unsetenv_ret = 'void'; then
+      AC_DEFINE([VOID_UNSETENV], [1], [Define to 1 if unsetenv returns void
+       instead of int.])
+      REPLACE_UNSETENV=1
+    fi
+
+    dnl Solaris 10 unsetenv does not remove all copies of a name.
+    dnl Haiku alpha 2 unsetenv gets confused by assignment to environ.
+    dnl OpenBSD 4.7 unsetenv("") does not fail.
+    AC_CACHE_CHECK([whether unsetenv obeys POSIX],
+      [gl_cv_func_unsetenv_works],
+      [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+       #include <stdlib.h>
+       #include <errno.h>
+       extern char **environ;
+      ]], [[
+       char entry1[] = "a=1";
+       char entry2[] = "b=2";
+       char *env[] = { entry1, entry2, NULL };
+       if (putenv ((char *) "a=1")) return 1;
+       if (putenv (entry2)) return 2;
+       entry2[0] = 'a';
+       unsetenv ("a");
+       if (getenv ("a")) return 3;
+       if (!unsetenv ("") || errno != EINVAL) return 4;
+       entry2[0] = 'b';
+       environ = env;
+       if (!getenv ("a")) return 5;
+       entry2[0] = 'a';
+       unsetenv ("a");
+       if (getenv ("a")) return 6;
+      ]])],
+      [gl_cv_func_unsetenv_works=yes], [gl_cv_func_unsetenv_works=no],
+      [case "$host_os" in
+                 # Guess yes on glibc systems.
+         *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;;
+                 # If we don't know, assume the worst.
+         *)      gl_cv_func_unsetenv_works="guessing no" ;;
+       esac
+      ])])
+    case "$gl_cv_func_unsetenv_works" in
+      *yes) ;;
+      *)
+        REPLACE_UNSETENV=1
+        ;;
+    esac
+  fi
+])
+
+# Prerequisites of lib/setenv.c.
+AC_DEFUN([gl_PREREQ_SETENV],
+[
+  AC_REQUIRE([AC_FUNC_ALLOCA])
+  AC_REQUIRE([gl_ENVIRON])
+  AC_CHECK_HEADERS_ONCE([unistd.h])
+  AC_CHECK_HEADERS([search.h])
+  AC_CHECK_FUNCS([tsearch])
+])
+
+# Prerequisites of lib/unsetenv.c.
+AC_DEFUN([gl_PREREQ_UNSETENV],
+[
+  AC_REQUIRE([gl_ENVIRON])
+  AC_CHECK_HEADERS_ONCE([unistd.h])
+])
diff --git a/liblouis/gnulib/m4/ssize_t.m4 b/liblouis/gnulib/m4/ssize_t.m4
new file mode 100644
index 0000000..66ba9d4
--- /dev/null
+++ b/liblouis/gnulib/m4/ssize_t.m4
@@ -0,0 +1,23 @@
+# ssize_t.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2001-2003, 2006, 2010-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether ssize_t is defined.
+
+AC_DEFUN([gt_TYPE_SSIZE_T],
+[
+  AC_CACHE_CHECK([for ssize_t], [gt_cv_ssize_t],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <sys/types.h>]],
+          [[int x = sizeof (ssize_t *) + sizeof (ssize_t);
+            return !x;]])],
+       [gt_cv_ssize_t=yes], [gt_cv_ssize_t=no])])
+  if test $gt_cv_ssize_t = no; then
+    AC_DEFINE([ssize_t], [int],
+              [Define as a signed type of the same size as size_t.])
+  fi
+])
diff --git a/liblouis/gnulib/m4/stddef_h.m4 b/liblouis/gnulib/m4/stddef_h.m4
new file mode 100644
index 0000000..f45def1
--- /dev/null
+++ b/liblouis/gnulib/m4/stddef_h.m4
@@ -0,0 +1,51 @@
+dnl A placeholder for <stddef.h>, for platforms that have issues.
+# stddef_h.m4 serial 5
+dnl Copyright (C) 2009-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_STDDEF_H],
+[
+  AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
+  AC_REQUIRE([gt_TYPE_WCHAR_T])
+  STDDEF_H=
+  AC_CHECK_TYPE([max_align_t], [], [HAVE_MAX_ALIGN_T=0; STDDEF_H=stddef.h],
+    [[#include <stddef.h>
+    ]])
+  if test $gt_cv_c_wchar_t = no; then
+    HAVE_WCHAR_T=0
+    STDDEF_H=stddef.h
+  fi
+  AC_CACHE_CHECK([whether NULL can be used in arbitrary expressions],
+    [gl_cv_decl_null_works],
+    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stddef.h>
+      int test[2 * (sizeof NULL == sizeof (void *)) -1];
+]])],
+      [gl_cv_decl_null_works=yes],
+      [gl_cv_decl_null_works=no])])
+  if test $gl_cv_decl_null_works = no; then
+    REPLACE_NULL=1
+    STDDEF_H=stddef.h
+  fi
+  AC_SUBST([STDDEF_H])
+  AM_CONDITIONAL([GL_GENERATE_STDDEF_H], [test -n "$STDDEF_H"])
+  if test -n "$STDDEF_H"; then
+    gl_NEXT_HEADERS([stddef.h])
+  fi
+])
+
+AC_DEFUN([gl_STDDEF_MODULE_INDICATOR],
+[
+  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+  AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+])
+
+AC_DEFUN([gl_STDDEF_H_DEFAULTS],
+[
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  REPLACE_NULL=0;                AC_SUBST([REPLACE_NULL])
+  HAVE_MAX_ALIGN_T=1;            AC_SUBST([HAVE_MAX_ALIGN_T])
+  HAVE_WCHAR_T=1;                AC_SUBST([HAVE_WCHAR_T])
+])
diff --git a/liblouis/gnulib/m4/stdint.m4 b/liblouis/gnulib/m4/stdint.m4
new file mode 100644
index 0000000..4ac854d
--- /dev/null
+++ b/liblouis/gnulib/m4/stdint.m4
@@ -0,0 +1,541 @@
+# stdint.m4 serial 50
+dnl Copyright (C) 2001-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert and Bruno Haible.
+dnl Test whether <stdint.h> is supported or must be substituted.
+
+AC_DEFUN_ONCE([gl_STDINT_H],
+[
+  AC_PREREQ([2.59])dnl
+
+  AC_REQUIRE([gl_LIMITS_H])
+  AC_REQUIRE([gt_TYPE_WINT_T])
+
+  dnl Check for long long int and unsigned long long int.
+  AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
+  if test $ac_cv_type_long_long_int = yes; then
+    HAVE_LONG_LONG_INT=1
+  else
+    HAVE_LONG_LONG_INT=0
+  fi
+  AC_SUBST([HAVE_LONG_LONG_INT])
+  AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+  if test $ac_cv_type_unsigned_long_long_int = yes; then
+    HAVE_UNSIGNED_LONG_LONG_INT=1
+  else
+    HAVE_UNSIGNED_LONG_LONG_INT=0
+  fi
+  AC_SUBST([HAVE_UNSIGNED_LONG_LONG_INT])
+
+  dnl Check for <wchar.h>, in the same way as gl_WCHAR_H does.
+  AC_CHECK_HEADERS_ONCE([wchar.h])
+  if test $ac_cv_header_wchar_h = yes; then
+    HAVE_WCHAR_H=1
+  else
+    HAVE_WCHAR_H=0
+  fi
+  AC_SUBST([HAVE_WCHAR_H])
+
+  dnl Check for <inttypes.h>.
+  dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_inttypes_h.
+  if test $ac_cv_header_inttypes_h = yes; then
+    HAVE_INTTYPES_H=1
+  else
+    HAVE_INTTYPES_H=0
+  fi
+  AC_SUBST([HAVE_INTTYPES_H])
+
+  dnl Check for <sys/types.h>.
+  dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_sys_types_h.
+  if test $ac_cv_header_sys_types_h = yes; then
+    HAVE_SYS_TYPES_H=1
+  else
+    HAVE_SYS_TYPES_H=0
+  fi
+  AC_SUBST([HAVE_SYS_TYPES_H])
+
+  gl_CHECK_NEXT_HEADERS([stdint.h])
+  if test $ac_cv_header_stdint_h = yes; then
+    HAVE_STDINT_H=1
+  else
+    HAVE_STDINT_H=0
+  fi
+  AC_SUBST([HAVE_STDINT_H])
+
+  dnl Now see whether we need a substitute <stdint.h>.
+  if test $ac_cv_header_stdint_h = yes; then
+    AC_CACHE_CHECK([whether stdint.h conforms to C99],
+      [gl_cv_header_working_stdint_h],
+      [gl_cv_header_working_stdint_h=no
+       AC_COMPILE_IFELSE([
+         AC_LANG_PROGRAM([[
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
+/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in <wchar.h>.  */
+#if !(defined WCHAR_MIN && defined WCHAR_MAX)
+#error "WCHAR_MIN, WCHAR_MAX not defined in <stdint.h>"
+#endif
+]
+gl_STDINT_INCLUDES
+[
+#ifdef INT8_MAX
+int8_t a1 = INT8_MAX;
+int8_t a1min = INT8_MIN;
+#endif
+#ifdef INT16_MAX
+int16_t a2 = INT16_MAX;
+int16_t a2min = INT16_MIN;
+#endif
+#ifdef INT32_MAX
+int32_t a3 = INT32_MAX;
+int32_t a3min = INT32_MIN;
+#endif
+#ifdef INT64_MAX
+int64_t a4 = INT64_MAX;
+int64_t a4min = INT64_MIN;
+#endif
+#ifdef UINT8_MAX
+uint8_t b1 = UINT8_MAX;
+#else
+typedef int b1[(unsigned char) -1 != 255 ? 1 : -1];
+#endif
+#ifdef UINT16_MAX
+uint16_t b2 = UINT16_MAX;
+#endif
+#ifdef UINT32_MAX
+uint32_t b3 = UINT32_MAX;
+#endif
+#ifdef UINT64_MAX
+uint64_t b4 = UINT64_MAX;
+#endif
+int_least8_t c1 = INT8_C (0x7f);
+int_least8_t c1max = INT_LEAST8_MAX;
+int_least8_t c1min = INT_LEAST8_MIN;
+int_least16_t c2 = INT16_C (0x7fff);
+int_least16_t c2max = INT_LEAST16_MAX;
+int_least16_t c2min = INT_LEAST16_MIN;
+int_least32_t c3 = INT32_C (0x7fffffff);
+int_least32_t c3max = INT_LEAST32_MAX;
+int_least32_t c3min = INT_LEAST32_MIN;
+int_least64_t c4 = INT64_C (0x7fffffffffffffff);
+int_least64_t c4max = INT_LEAST64_MAX;
+int_least64_t c4min = INT_LEAST64_MIN;
+uint_least8_t d1 = UINT8_C (0xff);
+uint_least8_t d1max = UINT_LEAST8_MAX;
+uint_least16_t d2 = UINT16_C (0xffff);
+uint_least16_t d2max = UINT_LEAST16_MAX;
+uint_least32_t d3 = UINT32_C (0xffffffff);
+uint_least32_t d3max = UINT_LEAST32_MAX;
+uint_least64_t d4 = UINT64_C (0xffffffffffffffff);
+uint_least64_t d4max = UINT_LEAST64_MAX;
+int_fast8_t e1 = INT_FAST8_MAX;
+int_fast8_t e1min = INT_FAST8_MIN;
+int_fast16_t e2 = INT_FAST16_MAX;
+int_fast16_t e2min = INT_FAST16_MIN;
+int_fast32_t e3 = INT_FAST32_MAX;
+int_fast32_t e3min = INT_FAST32_MIN;
+int_fast64_t e4 = INT_FAST64_MAX;
+int_fast64_t e4min = INT_FAST64_MIN;
+uint_fast8_t f1 = UINT_FAST8_MAX;
+uint_fast16_t f2 = UINT_FAST16_MAX;
+uint_fast32_t f3 = UINT_FAST32_MAX;
+uint_fast64_t f4 = UINT_FAST64_MAX;
+#ifdef INTPTR_MAX
+intptr_t g = INTPTR_MAX;
+intptr_t gmin = INTPTR_MIN;
+#endif
+#ifdef UINTPTR_MAX
+uintptr_t h = UINTPTR_MAX;
+#endif
+intmax_t i = INTMAX_MAX;
+uintmax_t j = UINTMAX_MAX;
+
+/* Check that SIZE_MAX has the correct type, if possible.  */
+#if 201112 <= __STDC_VERSION__
+int k = _Generic (SIZE_MAX, size_t: 0);
+#elif (2 <= __GNUC__ || defined __IBM__TYPEOF__ \
+       || (0x5110 <= __SUNPRO_C && !__STDC__))
+extern size_t k;
+extern __typeof__ (SIZE_MAX) k;
+#endif
+
+#include <limits.h> /* for CHAR_BIT */
+#define TYPE_MINIMUM(t) \
+  ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t)))
+#define TYPE_MAXIMUM(t) \
+  ((t) ((t) 0 < (t) -1 \
+        ? (t) -1 \
+        : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
+struct s {
+  int check_PTRDIFF:
+      PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t)
+      && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t)
+      ? 1 : -1;
+  /* Detect bug in FreeBSD 6.0 / ia64.  */
+  int check_SIG_ATOMIC:
+      SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t)
+      && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t)
+      ? 1 : -1;
+  int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1;
+  int check_WCHAR:
+      WCHAR_MIN == TYPE_MINIMUM (wchar_t)
+      && WCHAR_MAX == TYPE_MAXIMUM (wchar_t)
+      ? 1 : -1;
+  /* Detect bug in mingw.  */
+  int check_WINT:
+      WINT_MIN == TYPE_MINIMUM (wint_t)
+      && WINT_MAX == TYPE_MAXIMUM (wint_t)
+      ? 1 : -1;
+
+  /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others.  */
+  int check_UINT8_C:
+        (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1;
+  int check_UINT16_C:
+        (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1;
+
+  /* Detect bugs in OpenBSD 3.9 stdint.h.  */
+#ifdef UINT8_MAX
+  int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1;
+#endif
+#ifdef UINT16_MAX
+  int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1;
+#endif
+#ifdef UINT32_MAX
+  int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1;
+#endif
+#ifdef UINT64_MAX
+  int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1;
+#endif
+  int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1;
+  int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1;
+  int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1;
+  int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1;
+  int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1;
+  int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1;
+  int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1;
+  int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1;
+  int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;
+  int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1;
+  int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1;
+};
+         ]])],
+         [dnl Determine whether the various *_MIN, *_MAX macros are usable
+          dnl in preprocessor expression. We could do it by compiling a test
+          dnl program for each of these macros. It is faster to run a program
+          dnl that inspects the macro expansion.
+          dnl This detects a bug on HP-UX 11.23/ia64.
+          AC_RUN_IFELSE([
+            AC_LANG_PROGRAM([[
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
+]
+gl_STDINT_INCLUDES
+[
+#include <stdio.h>
+#include <string.h>
+#define MVAL(macro) MVAL1(macro)
+#define MVAL1(expression) #expression
+static const char *macro_values[] =
+  {
+#ifdef INT8_MAX
+    MVAL (INT8_MAX),
+#endif
+#ifdef INT16_MAX
+    MVAL (INT16_MAX),
+#endif
+#ifdef INT32_MAX
+    MVAL (INT32_MAX),
+#endif
+#ifdef INT64_MAX
+    MVAL (INT64_MAX),
+#endif
+#ifdef UINT8_MAX
+    MVAL (UINT8_MAX),
+#endif
+#ifdef UINT16_MAX
+    MVAL (UINT16_MAX),
+#endif
+#ifdef UINT32_MAX
+    MVAL (UINT32_MAX),
+#endif
+#ifdef UINT64_MAX
+    MVAL (UINT64_MAX),
+#endif
+    NULL
+  };
+]], [[
+  const char **mv;
+  for (mv = macro_values; *mv != NULL; mv++)
+    {
+      const char *value = *mv;
+      /* Test whether it looks like a cast expression.  */
+      if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0
+          || strncmp (value, "((unsigned short)"/*)*/, 17) == 0
+          || strncmp (value, "((unsigned char)"/*)*/, 16) == 0
+          || strncmp (value, "((int)"/*)*/, 6) == 0
+          || strncmp (value, "((signed short)"/*)*/, 15) == 0
+          || strncmp (value, "((signed char)"/*)*/, 14) == 0)
+        return mv - macro_values + 1;
+    }
+  return 0;
+]])],
+              [gl_cv_header_working_stdint_h=yes],
+              [],
+              [dnl When cross-compiling, assume it works.
+               gl_cv_header_working_stdint_h=yes
+              ])
+         ])
+      ])
+  fi
+
+  HAVE_C99_STDINT_H=0
+  HAVE_SYS_BITYPES_H=0
+  HAVE_SYS_INTTYPES_H=0
+  STDINT_H=stdint.h
+  if test "$gl_cv_header_working_stdint_h" = yes; then
+    HAVE_C99_STDINT_H=1
+    dnl Now see whether the system <stdint.h> works without
+    dnl __STDC_CONSTANT_MACROS/__STDC_LIMIT_MACROS defined.
+    AC_CACHE_CHECK([whether stdint.h predates C++11],
+      [gl_cv_header_stdint_predates_cxx11_h],
+      [gl_cv_header_stdint_predates_cxx11_h=yes
+       AC_COMPILE_IFELSE([
+         AC_LANG_PROGRAM([[
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#include <stdint.h>
+]
+gl_STDINT_INCLUDES
+[
+intmax_t im = INTMAX_MAX;
+int32_t i32 = INT32_C (0x7fffffff);
+         ]])],
+         [gl_cv_header_stdint_predates_cxx11_h=no])])
+
+    if test "$gl_cv_header_stdint_predates_cxx11_h" = yes; then
+      AC_DEFINE([__STDC_CONSTANT_MACROS], [1],
+                [Define to 1 if the system <stdint.h> predates C++11.])
+      AC_DEFINE([__STDC_LIMIT_MACROS], [1],
+                [Define to 1 if the system <stdint.h> predates C++11.])
+    fi
+    AC_CACHE_CHECK([whether stdint.h has UINTMAX_WIDTH etc.],
+      [gl_cv_header_stdint_width],
+      [gl_cv_header_stdint_width=no
+       AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM([[
+            /* Work if build is not clean.  */
+            #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1
+            #ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+             #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+            #endif
+            #include <stdint.h>
+            ]gl_STDINT_INCLUDES[
+            int iw = UINTMAX_WIDTH;
+            ]])],
+         [gl_cv_header_stdint_width=yes])])
+    if test "$gl_cv_header_stdint_width" = yes; then
+      STDINT_H=
+    fi
+  else
+    dnl Check for <sys/inttypes.h>, and for
+    dnl <sys/bitypes.h> (used in Linux libc4 >= 4.6.7 and libc5).
+    AC_CHECK_HEADERS([sys/inttypes.h sys/bitypes.h])
+    if test $ac_cv_header_sys_inttypes_h = yes; then
+      HAVE_SYS_INTTYPES_H=1
+    fi
+    if test $ac_cv_header_sys_bitypes_h = yes; then
+      HAVE_SYS_BITYPES_H=1
+    fi
+    gl_STDINT_TYPE_PROPERTIES
+  fi
+
+  dnl The substitute stdint.h needs the substitute limit.h's _GL_INTEGER_WIDTH.
+  LIMITS_H=limits.h
+  AM_CONDITIONAL([GL_GENERATE_LIMITS_H], [test -n "$LIMITS_H"])
+
+  AC_SUBST([HAVE_C99_STDINT_H])
+  AC_SUBST([HAVE_SYS_BITYPES_H])
+  AC_SUBST([HAVE_SYS_INTTYPES_H])
+  AC_SUBST([STDINT_H])
+  AM_CONDITIONAL([GL_GENERATE_STDINT_H], [test -n "$STDINT_H"])
+])
+
+dnl gl_STDINT_BITSIZEOF(TYPES, INCLUDES)
+dnl Determine the size of each of the given types in bits.
+AC_DEFUN([gl_STDINT_BITSIZEOF],
+[
+  dnl Use a shell loop, to avoid bloating configure, and
+  dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
+  dnl   config.h.in,
+  dnl - extra AC_SUBST calls, so that the right substitutions are made.
+  m4_foreach_w([gltype], [$1],
+    [AH_TEMPLATE([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]),
+       [Define to the number of bits in type ']gltype['.])])
+  for gltype in $1 ; do
+    AC_CACHE_CHECK([for bit size of $gltype], [gl_cv_bitsizeof_${gltype}],
+      [AC_COMPUTE_INT([result], [sizeof ($gltype) * CHAR_BIT],
+         [$2
+#include <limits.h>], [result=unknown])
+       eval gl_cv_bitsizeof_${gltype}=\$result
+      ])
+    eval result=\$gl_cv_bitsizeof_${gltype}
+    if test $result = unknown; then
+      dnl Use a nonempty default, because some compilers, such as IRIX 5 cc,
+      dnl do a syntax check even on unused #if conditions and give an error
+      dnl on valid C code like this:
+      dnl   #if 0
+      dnl   # if  > 32
+      dnl   # endif
+      dnl   #endif
+      result=0
+    fi
+    GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    AC_DEFINE_UNQUOTED([BITSIZEOF_${GLTYPE}], [$result])
+    eval BITSIZEOF_${GLTYPE}=\$result
+  done
+  m4_foreach_w([gltype], [$1],
+    [AC_SUBST([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))])
+])
+
+dnl gl_CHECK_TYPES_SIGNED(TYPES, INCLUDES)
+dnl Determine the signedness of each of the given types.
+dnl Define HAVE_SIGNED_TYPE if type is signed.
+AC_DEFUN([gl_CHECK_TYPES_SIGNED],
+[
+  dnl Use a shell loop, to avoid bloating configure, and
+  dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
+  dnl   config.h.in,
+  dnl - extra AC_SUBST calls, so that the right substitutions are made.
+  m4_foreach_w([gltype], [$1],
+    [AH_TEMPLATE([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]),
+       [Define to 1 if ']gltype[' is a signed integer type.])])
+  for gltype in $1 ; do
+    AC_CACHE_CHECK([whether $gltype is signed], [gl_cv_type_${gltype}_signed],
+      [AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM([$2[
+            int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];]])],
+         result=yes, result=no)
+       eval gl_cv_type_${gltype}_signed=\$result
+      ])
+    eval result=\$gl_cv_type_${gltype}_signed
+    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    if test "$result" = yes; then
+      AC_DEFINE_UNQUOTED([HAVE_SIGNED_${GLTYPE}], [1])
+      eval HAVE_SIGNED_${GLTYPE}=1
+    else
+      eval HAVE_SIGNED_${GLTYPE}=0
+    fi
+  done
+  m4_foreach_w([gltype], [$1],
+    [AC_SUBST([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))])
+])
+
+dnl gl_INTEGER_TYPE_SUFFIX(TYPES, INCLUDES)
+dnl Determine the suffix to use for integer constants of the given types.
+dnl Define t_SUFFIX for each such type.
+AC_DEFUN([gl_INTEGER_TYPE_SUFFIX],
+[
+  dnl Use a shell loop, to avoid bloating configure, and
+  dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
+  dnl   config.h.in,
+  dnl - extra AC_SUBST calls, so that the right substitutions are made.
+  m4_foreach_w([gltype], [$1],
+    [AH_TEMPLATE(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX],
+       [Define to l, ll, u, ul, ull, etc., as suitable for
+        constants of type ']gltype['.])])
+  for gltype in $1 ; do
+    AC_CACHE_CHECK([for $gltype integer literal suffix],
+      [gl_cv_type_${gltype}_suffix],
+      [eval gl_cv_type_${gltype}_suffix=no
+       eval result=\$gl_cv_type_${gltype}_signed
+       if test "$result" = yes; then
+         glsufu=
+       else
+         glsufu=u
+       fi
+       for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
+         case $glsuf in
+           '')  gltype1='int';;
+           l)   gltype1='long int';;
+           ll)  gltype1='long long int';;
+           i64) gltype1='__int64';;
+           u)   gltype1='unsigned int';;
+           ul)  gltype1='unsigned long int';;
+           ull) gltype1='unsigned long long int';;
+           ui64)gltype1='unsigned __int64';;
+         esac
+         AC_COMPILE_IFELSE(
+           [AC_LANG_PROGRAM([$2[
+              extern $gltype foo;
+              extern $gltype1 foo;]])],
+           [eval gl_cv_type_${gltype}_suffix=\$glsuf])
+         eval result=\$gl_cv_type_${gltype}_suffix
+         test "$result" != no && break
+       done])
+    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    eval result=\$gl_cv_type_${gltype}_suffix
+    test "$result" = no && result=
+    eval ${GLTYPE}_SUFFIX=\$result
+    AC_DEFINE_UNQUOTED([${GLTYPE}_SUFFIX], [$result])
+  done
+  m4_foreach_w([gltype], [$1],
+    [AC_SUBST(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX])])
+])
+
+dnl gl_STDINT_INCLUDES
+AC_DEFUN([gl_STDINT_INCLUDES],
+[[
+  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+     included before <wchar.h>.  */
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <stdio.h>
+  # include <time.h>
+  # include <wchar.h>
+  #endif
+]])
+
+dnl gl_STDINT_TYPE_PROPERTIES
+dnl Compute HAVE_SIGNED_t, BITSIZEOF_t and t_SUFFIX, for all the types t
+dnl of interest to stdint.in.h.
+AC_DEFUN([gl_STDINT_TYPE_PROPERTIES],
+[
+  AC_REQUIRE([gl_MULTIARCH])
+  if test $APPLE_UNIVERSAL_BUILD = 0; then
+    gl_STDINT_BITSIZEOF([ptrdiff_t size_t],
+      [gl_STDINT_INCLUDES])
+  fi
+  gl_STDINT_BITSIZEOF([sig_atomic_t wchar_t wint_t],
+    [gl_STDINT_INCLUDES])
+  gl_CHECK_TYPES_SIGNED([sig_atomic_t wchar_t wint_t],
+    [gl_STDINT_INCLUDES])
+  gl_cv_type_ptrdiff_t_signed=yes
+  gl_cv_type_size_t_signed=no
+  if test $APPLE_UNIVERSAL_BUILD = 0; then
+    gl_INTEGER_TYPE_SUFFIX([ptrdiff_t size_t],
+      [gl_STDINT_INCLUDES])
+  fi
+  gl_INTEGER_TYPE_SUFFIX([sig_atomic_t wchar_t wint_t],
+    [gl_STDINT_INCLUDES])
+
+  dnl If wint_t is smaller than 'int', it cannot satisfy the ISO C 99
+  dnl requirement that wint_t is "unchanged by default argument promotions".
+  dnl In this case gnulib's <wchar.h> and <wctype.h> override wint_t.
+  dnl Set the variable BITSIZEOF_WINT_T accordingly.
+  if test $GNULIB_OVERRIDES_WINT_T = 1; then
+    BITSIZEOF_WINT_T=32
+  fi
+])
+
+dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in.
+dnl Remove this when we can assume autoconf >= 2.61.
+m4_ifdef([AC_COMPUTE_INT], [], [
+  AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])])
+])
diff --git a/liblouis/gnulib/m4/stdlib_h.m4 b/liblouis/gnulib/m4/stdlib_h.m4
new file mode 100644
index 0000000..110fe2d
--- /dev/null
+++ b/liblouis/gnulib/m4/stdlib_h.m4
@@ -0,0 +1,120 @@
+# stdlib_h.m4 serial 43
+dnl Copyright (C) 2007-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_STDLIB_H],
+[
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  gl_NEXT_HEADERS([stdlib.h])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use, and which is not
+  dnl guaranteed by C89.
+  gl_WARN_ON_USE_PREPARE([[#include <stdlib.h>
+#if HAVE_SYS_LOADAVG_H
+# include <sys/loadavg.h>
+#endif
+#if HAVE_RANDOM_H
+# include <random.h>
+#endif
+    ]], [_Exit atoll canonicalize_file_name getloadavg getsubopt grantpt
+    initstate initstate_r mkdtemp mkostemp mkostemps mkstemp mkstemps
+    posix_openpt ptsname ptsname_r qsort_r random random_r realpath rpmatch
+    secure_getenv setenv setstate setstate_r srandom srandom_r
+    strtod strtoll strtoull unlockpt unsetenv])
+])
+
+AC_DEFUN([gl_STDLIB_MODULE_INDICATOR],
+[
+  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+  dnl Define it also as a C macro, for the benefit of the unit tests.
+  gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_STDLIB_H_DEFAULTS],
+[
+  GNULIB__EXIT=0;         AC_SUBST([GNULIB__EXIT])
+  GNULIB_ATOLL=0;         AC_SUBST([GNULIB_ATOLL])
+  GNULIB_CALLOC_POSIX=0;  AC_SUBST([GNULIB_CALLOC_POSIX])
+  GNULIB_CANONICALIZE_FILE_NAME=0;  AC_SUBST([GNULIB_CANONICALIZE_FILE_NAME])
+  GNULIB_GETLOADAVG=0;    AC_SUBST([GNULIB_GETLOADAVG])
+  GNULIB_GETSUBOPT=0;     AC_SUBST([GNULIB_GETSUBOPT])
+  GNULIB_GRANTPT=0;       AC_SUBST([GNULIB_GRANTPT])
+  GNULIB_MALLOC_POSIX=0;  AC_SUBST([GNULIB_MALLOC_POSIX])
+  GNULIB_MBTOWC=0;        AC_SUBST([GNULIB_MBTOWC])
+  GNULIB_MKDTEMP=0;       AC_SUBST([GNULIB_MKDTEMP])
+  GNULIB_MKOSTEMP=0;      AC_SUBST([GNULIB_MKOSTEMP])
+  GNULIB_MKOSTEMPS=0;     AC_SUBST([GNULIB_MKOSTEMPS])
+  GNULIB_MKSTEMP=0;       AC_SUBST([GNULIB_MKSTEMP])
+  GNULIB_MKSTEMPS=0;      AC_SUBST([GNULIB_MKSTEMPS])
+  GNULIB_POSIX_OPENPT=0;  AC_SUBST([GNULIB_POSIX_OPENPT])
+  GNULIB_PTSNAME=0;       AC_SUBST([GNULIB_PTSNAME])
+  GNULIB_PTSNAME_R=0;     AC_SUBST([GNULIB_PTSNAME_R])
+  GNULIB_PUTENV=0;        AC_SUBST([GNULIB_PUTENV])
+  GNULIB_QSORT_R=0;       AC_SUBST([GNULIB_QSORT_R])
+  GNULIB_RANDOM=0;        AC_SUBST([GNULIB_RANDOM])
+  GNULIB_RANDOM_R=0;      AC_SUBST([GNULIB_RANDOM_R])
+  GNULIB_REALLOC_POSIX=0; AC_SUBST([GNULIB_REALLOC_POSIX])
+  GNULIB_REALPATH=0;      AC_SUBST([GNULIB_REALPATH])
+  GNULIB_RPMATCH=0;       AC_SUBST([GNULIB_RPMATCH])
+  GNULIB_SECURE_GETENV=0; AC_SUBST([GNULIB_SECURE_GETENV])
+  GNULIB_SETENV=0;        AC_SUBST([GNULIB_SETENV])
+  GNULIB_STRTOD=0;        AC_SUBST([GNULIB_STRTOD])
+  GNULIB_STRTOLL=0;       AC_SUBST([GNULIB_STRTOLL])
+  GNULIB_STRTOULL=0;      AC_SUBST([GNULIB_STRTOULL])
+  GNULIB_SYSTEM_POSIX=0;  AC_SUBST([GNULIB_SYSTEM_POSIX])
+  GNULIB_UNLOCKPT=0;      AC_SUBST([GNULIB_UNLOCKPT])
+  GNULIB_UNSETENV=0;      AC_SUBST([GNULIB_UNSETENV])
+  GNULIB_WCTOMB=0;        AC_SUBST([GNULIB_WCTOMB])
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE__EXIT=1;              AC_SUBST([HAVE__EXIT])
+  HAVE_ATOLL=1;              AC_SUBST([HAVE_ATOLL])
+  HAVE_CANONICALIZE_FILE_NAME=1;  AC_SUBST([HAVE_CANONICALIZE_FILE_NAME])
+  HAVE_DECL_GETLOADAVG=1;    AC_SUBST([HAVE_DECL_GETLOADAVG])
+  HAVE_GETSUBOPT=1;          AC_SUBST([HAVE_GETSUBOPT])
+  HAVE_GRANTPT=1;            AC_SUBST([HAVE_GRANTPT])
+  HAVE_MKDTEMP=1;            AC_SUBST([HAVE_MKDTEMP])
+  HAVE_MKOSTEMP=1;           AC_SUBST([HAVE_MKOSTEMP])
+  HAVE_MKOSTEMPS=1;          AC_SUBST([HAVE_MKOSTEMPS])
+  HAVE_MKSTEMP=1;            AC_SUBST([HAVE_MKSTEMP])
+  HAVE_MKSTEMPS=1;           AC_SUBST([HAVE_MKSTEMPS])
+  HAVE_POSIX_OPENPT=1;       AC_SUBST([HAVE_POSIX_OPENPT])
+  HAVE_PTSNAME=1;            AC_SUBST([HAVE_PTSNAME])
+  HAVE_PTSNAME_R=1;          AC_SUBST([HAVE_PTSNAME_R])
+  HAVE_QSORT_R=1;            AC_SUBST([HAVE_QSORT_R])
+  HAVE_RANDOM=1;             AC_SUBST([HAVE_RANDOM])
+  HAVE_RANDOM_H=1;           AC_SUBST([HAVE_RANDOM_H])
+  HAVE_RANDOM_R=1;           AC_SUBST([HAVE_RANDOM_R])
+  HAVE_REALPATH=1;           AC_SUBST([HAVE_REALPATH])
+  HAVE_RPMATCH=1;            AC_SUBST([HAVE_RPMATCH])
+  HAVE_SECURE_GETENV=1;      AC_SUBST([HAVE_SECURE_GETENV])
+  HAVE_SETENV=1;             AC_SUBST([HAVE_SETENV])
+  HAVE_DECL_SETENV=1;        AC_SUBST([HAVE_DECL_SETENV])
+  HAVE_STRTOD=1;             AC_SUBST([HAVE_STRTOD])
+  HAVE_STRTOLL=1;            AC_SUBST([HAVE_STRTOLL])
+  HAVE_STRTOULL=1;           AC_SUBST([HAVE_STRTOULL])
+  HAVE_STRUCT_RANDOM_DATA=1; AC_SUBST([HAVE_STRUCT_RANDOM_DATA])
+  HAVE_SYS_LOADAVG_H=0;      AC_SUBST([HAVE_SYS_LOADAVG_H])
+  HAVE_UNLOCKPT=1;           AC_SUBST([HAVE_UNLOCKPT])
+  HAVE_DECL_UNSETENV=1;      AC_SUBST([HAVE_DECL_UNSETENV])
+  REPLACE_CALLOC=0;          AC_SUBST([REPLACE_CALLOC])
+  REPLACE_CANONICALIZE_FILE_NAME=0;  AC_SUBST([REPLACE_CANONICALIZE_FILE_NAME])
+  REPLACE_MALLOC=0;          AC_SUBST([REPLACE_MALLOC])
+  REPLACE_MBTOWC=0;          AC_SUBST([REPLACE_MBTOWC])
+  REPLACE_MKSTEMP=0;         AC_SUBST([REPLACE_MKSTEMP])
+  REPLACE_PTSNAME=0;         AC_SUBST([REPLACE_PTSNAME])
+  REPLACE_PTSNAME_R=0;       AC_SUBST([REPLACE_PTSNAME_R])
+  REPLACE_PUTENV=0;          AC_SUBST([REPLACE_PUTENV])
+  REPLACE_QSORT_R=0;         AC_SUBST([REPLACE_QSORT_R])
+  REPLACE_RANDOM_R=0;        AC_SUBST([REPLACE_RANDOM_R])
+  REPLACE_REALLOC=0;         AC_SUBST([REPLACE_REALLOC])
+  REPLACE_REALPATH=0;        AC_SUBST([REPLACE_REALPATH])
+  REPLACE_SETENV=0;          AC_SUBST([REPLACE_SETENV])
+  REPLACE_STRTOD=0;          AC_SUBST([REPLACE_STRTOD])
+  REPLACE_UNSETENV=0;        AC_SUBST([REPLACE_UNSETENV])
+  REPLACE_WCTOMB=0;          AC_SUBST([REPLACE_WCTOMB])
+])
diff --git a/liblouis/gnulib/m4/string_h.m4 b/liblouis/gnulib/m4/string_h.m4
new file mode 100644
index 0000000..3d2ad22
--- /dev/null
+++ b/liblouis/gnulib/m4/string_h.m4
@@ -0,0 +1,120 @@
+# Configure a GNU-like replacement for <string.h>.
+
+# Copyright (C) 2007-2017 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 21
+
+# Written by Paul Eggert.
+
+AC_DEFUN([gl_HEADER_STRING_H],
+[
+  dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+  dnl once only, before all statements that occur in other macros.
+  AC_REQUIRE([gl_HEADER_STRING_H_BODY])
+])
+
+AC_DEFUN([gl_HEADER_STRING_H_BODY],
+[
+  AC_REQUIRE([AC_C_RESTRICT])
+  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  gl_NEXT_HEADERS([string.h])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use, and which is not
+  dnl guaranteed by C89.
+  gl_WARN_ON_USE_PREPARE([[#include <string.h>
+    ]],
+    [ffsl ffsll memmem mempcpy memrchr rawmemchr stpcpy stpncpy strchrnul
+     strdup strncat strndup strnlen strpbrk strsep strcasestr strtok_r
+     strerror_r strsignal strverscmp])
+])
+
+AC_DEFUN([gl_STRING_MODULE_INDICATOR],
+[
+  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+  dnl Define it also as a C macro, for the benefit of the unit tests.
+  gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS],
+[
+  GNULIB_FFSL=0;        AC_SUBST([GNULIB_FFSL])
+  GNULIB_FFSLL=0;       AC_SUBST([GNULIB_FFSLL])
+  GNULIB_MEMCHR=0;      AC_SUBST([GNULIB_MEMCHR])
+  GNULIB_MEMMEM=0;      AC_SUBST([GNULIB_MEMMEM])
+  GNULIB_MEMPCPY=0;     AC_SUBST([GNULIB_MEMPCPY])
+  GNULIB_MEMRCHR=0;     AC_SUBST([GNULIB_MEMRCHR])
+  GNULIB_RAWMEMCHR=0;   AC_SUBST([GNULIB_RAWMEMCHR])
+  GNULIB_STPCPY=0;      AC_SUBST([GNULIB_STPCPY])
+  GNULIB_STPNCPY=0;     AC_SUBST([GNULIB_STPNCPY])
+  GNULIB_STRCHRNUL=0;   AC_SUBST([GNULIB_STRCHRNUL])
+  GNULIB_STRDUP=0;      AC_SUBST([GNULIB_STRDUP])
+  GNULIB_STRNCAT=0;     AC_SUBST([GNULIB_STRNCAT])
+  GNULIB_STRNDUP=0;     AC_SUBST([GNULIB_STRNDUP])
+  GNULIB_STRNLEN=0;     AC_SUBST([GNULIB_STRNLEN])
+  GNULIB_STRPBRK=0;     AC_SUBST([GNULIB_STRPBRK])
+  GNULIB_STRSEP=0;      AC_SUBST([GNULIB_STRSEP])
+  GNULIB_STRSTR=0;      AC_SUBST([GNULIB_STRSTR])
+  GNULIB_STRCASESTR=0;  AC_SUBST([GNULIB_STRCASESTR])
+  GNULIB_STRTOK_R=0;    AC_SUBST([GNULIB_STRTOK_R])
+  GNULIB_MBSLEN=0;      AC_SUBST([GNULIB_MBSLEN])
+  GNULIB_MBSNLEN=0;     AC_SUBST([GNULIB_MBSNLEN])
+  GNULIB_MBSCHR=0;      AC_SUBST([GNULIB_MBSCHR])
+  GNULIB_MBSRCHR=0;     AC_SUBST([GNULIB_MBSRCHR])
+  GNULIB_MBSSTR=0;      AC_SUBST([GNULIB_MBSSTR])
+  GNULIB_MBSCASECMP=0;  AC_SUBST([GNULIB_MBSCASECMP])
+  GNULIB_MBSNCASECMP=0; AC_SUBST([GNULIB_MBSNCASECMP])
+  GNULIB_MBSPCASECMP=0; AC_SUBST([GNULIB_MBSPCASECMP])
+  GNULIB_MBSCASESTR=0;  AC_SUBST([GNULIB_MBSCASESTR])
+  GNULIB_MBSCSPN=0;     AC_SUBST([GNULIB_MBSCSPN])
+  GNULIB_MBSPBRK=0;     AC_SUBST([GNULIB_MBSPBRK])
+  GNULIB_MBSSPN=0;      AC_SUBST([GNULIB_MBSSPN])
+  GNULIB_MBSSEP=0;      AC_SUBST([GNULIB_MBSSEP])
+  GNULIB_MBSTOK_R=0;    AC_SUBST([GNULIB_MBSTOK_R])
+  GNULIB_STRERROR=0;    AC_SUBST([GNULIB_STRERROR])
+  GNULIB_STRERROR_R=0;  AC_SUBST([GNULIB_STRERROR_R])
+  GNULIB_STRSIGNAL=0;   AC_SUBST([GNULIB_STRSIGNAL])
+  GNULIB_STRVERSCMP=0;  AC_SUBST([GNULIB_STRVERSCMP])
+  HAVE_MBSLEN=0;        AC_SUBST([HAVE_MBSLEN])
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE_FFSL=1;                  AC_SUBST([HAVE_FFSL])
+  HAVE_FFSLL=1;                 AC_SUBST([HAVE_FFSLL])
+  HAVE_MEMCHR=1;                AC_SUBST([HAVE_MEMCHR])
+  HAVE_DECL_MEMMEM=1;           AC_SUBST([HAVE_DECL_MEMMEM])
+  HAVE_MEMPCPY=1;               AC_SUBST([HAVE_MEMPCPY])
+  HAVE_DECL_MEMRCHR=1;          AC_SUBST([HAVE_DECL_MEMRCHR])
+  HAVE_RAWMEMCHR=1;             AC_SUBST([HAVE_RAWMEMCHR])
+  HAVE_STPCPY=1;                AC_SUBST([HAVE_STPCPY])
+  HAVE_STPNCPY=1;               AC_SUBST([HAVE_STPNCPY])
+  HAVE_STRCHRNUL=1;             AC_SUBST([HAVE_STRCHRNUL])
+  HAVE_DECL_STRDUP=1;           AC_SUBST([HAVE_DECL_STRDUP])
+  HAVE_DECL_STRNDUP=1;          AC_SUBST([HAVE_DECL_STRNDUP])
+  HAVE_DECL_STRNLEN=1;          AC_SUBST([HAVE_DECL_STRNLEN])
+  HAVE_STRPBRK=1;               AC_SUBST([HAVE_STRPBRK])
+  HAVE_STRSEP=1;                AC_SUBST([HAVE_STRSEP])
+  HAVE_STRCASESTR=1;            AC_SUBST([HAVE_STRCASESTR])
+  HAVE_DECL_STRTOK_R=1;         AC_SUBST([HAVE_DECL_STRTOK_R])
+  HAVE_DECL_STRERROR_R=1;       AC_SUBST([HAVE_DECL_STRERROR_R])
+  HAVE_DECL_STRSIGNAL=1;        AC_SUBST([HAVE_DECL_STRSIGNAL])
+  HAVE_STRVERSCMP=1;            AC_SUBST([HAVE_STRVERSCMP])
+  REPLACE_MEMCHR=0;             AC_SUBST([REPLACE_MEMCHR])
+  REPLACE_MEMMEM=0;             AC_SUBST([REPLACE_MEMMEM])
+  REPLACE_STPNCPY=0;            AC_SUBST([REPLACE_STPNCPY])
+  REPLACE_STRDUP=0;             AC_SUBST([REPLACE_STRDUP])
+  REPLACE_STRSTR=0;             AC_SUBST([REPLACE_STRSTR])
+  REPLACE_STRCASESTR=0;         AC_SUBST([REPLACE_STRCASESTR])
+  REPLACE_STRCHRNUL=0;          AC_SUBST([REPLACE_STRCHRNUL])
+  REPLACE_STRERROR=0;           AC_SUBST([REPLACE_STRERROR])
+  REPLACE_STRERROR_R=0;         AC_SUBST([REPLACE_STRERROR_R])
+  REPLACE_STRNCAT=0;            AC_SUBST([REPLACE_STRNCAT])
+  REPLACE_STRNDUP=0;            AC_SUBST([REPLACE_STRNDUP])
+  REPLACE_STRNLEN=0;            AC_SUBST([REPLACE_STRNLEN])
+  REPLACE_STRSIGNAL=0;          AC_SUBST([REPLACE_STRSIGNAL])
+  REPLACE_STRTOK_R=0;           AC_SUBST([REPLACE_STRTOK_R])
+  UNDEFINE_STRTOK_R=0;          AC_SUBST([UNDEFINE_STRTOK_R])
+])
diff --git a/liblouis/gnulib/m4/strndup.m4 b/liblouis/gnulib/m4/strndup.m4
new file mode 100644
index 0000000..7a28f21
--- /dev/null
+++ b/liblouis/gnulib/m4/strndup.m4
@@ -0,0 +1,58 @@
+# strndup.m4 serial 22
+dnl Copyright (C) 2002-2003, 2005-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRNDUP],
+[
+  dnl Persuade glibc <string.h> to declare strndup().
+  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_CHECK_DECLS_ONCE([strndup])
+  AC_CHECK_FUNCS_ONCE([strndup])
+  if test $ac_cv_have_decl_strndup = no; then
+    HAVE_DECL_STRNDUP=0
+  fi
+
+  if test $ac_cv_func_strndup = yes; then
+    HAVE_STRNDUP=1
+    # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'.
+    AC_CACHE_CHECK([for working strndup], [gl_cv_func_strndup_works],
+      [AC_RUN_IFELSE([
+         AC_LANG_PROGRAM([[#include <string.h>
+                           #include <stdlib.h>]], [[
+#if !HAVE_DECL_STRNDUP
+  extern
+  #ifdef __cplusplus
+  "C"
+  #endif
+  char *strndup (const char *, size_t);
+#endif
+  int result;
+  char *s;
+  s = strndup ("some longer string", 15);
+  free (s);
+  s = strndup ("shorter string", 13);
+  result = s[13] != '\0';
+  free (s);
+  return result;]])],
+         [gl_cv_func_strndup_works=yes],
+         [gl_cv_func_strndup_works=no],
+         [
+changequote(,)dnl
+          case $host_os in
+            aix | aix[3-6]*) gl_cv_func_strndup_works="guessing no";;
+            *)               gl_cv_func_strndup_works="guessing yes";;
+          esac
+changequote([,])dnl
+         ])])
+    case $gl_cv_func_strndup_works in
+      *no) REPLACE_STRNDUP=1 ;;
+    esac
+  else
+    HAVE_STRNDUP=0
+  fi
+])
diff --git a/liblouis/gnulib/m4/strnlen.m4 b/liblouis/gnulib/m4/strnlen.m4
new file mode 100644
index 0000000..bf05027
--- /dev/null
+++ b/liblouis/gnulib/m4/strnlen.m4
@@ -0,0 +1,30 @@
+# strnlen.m4 serial 13
+dnl Copyright (C) 2002-2003, 2005-2007, 2009-2017 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRNLEN],
+[
+  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+
+  dnl Persuade glibc <string.h> to declare strnlen().
+  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+  AC_CHECK_DECLS_ONCE([strnlen])
+  if test $ac_cv_have_decl_strnlen = no; then
+    HAVE_DECL_STRNLEN=0
+  else
+    m4_pushdef([AC_LIBOBJ], [:])
+    dnl Note: AC_FUNC_STRNLEN does AC_LIBOBJ([strnlen]).
+    AC_FUNC_STRNLEN
+    m4_popdef([AC_LIBOBJ])
+    if test $ac_cv_func_strnlen_working = no; then
+      REPLACE_STRNLEN=1
+    fi
+  fi
+])
+
+# Prerequisites of lib/strnlen.c.
+AC_DEFUN([gl_PREREQ_STRNLEN], [:])
diff --git a/liblouis/gnulib/m4/sys_types_h.m4 b/liblouis/gnulib/m4/sys_types_h.m4
new file mode 100644
index 0000000..2eb4e9e
--- /dev/null
+++ b/liblouis/gnulib/m4/sys_types_h.m4
@@ -0,0 +1,49 @@
+# sys_types_h.m4 serial 6
+dnl Copyright (C) 2011-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_SYS_TYPES_H],
+[
+  AC_REQUIRE([gl_SYS_TYPES_H_DEFAULTS])
+  gl_NEXT_HEADERS([sys/types.h])
+
+  dnl Ensure the type pid_t gets defined.
+  AC_REQUIRE([AC_TYPE_PID_T])
+
+  dnl Ensure the type mode_t gets defined.
+  AC_REQUIRE([AC_TYPE_MODE_T])
+
+  dnl Whether to override the 'off_t' type.
+  AC_REQUIRE([gl_TYPE_OFF_T])
+])
+
+AC_DEFUN([gl_SYS_TYPES_H_DEFAULTS],
+[
+])
+
+# This works around a buggy version in autoconf <= 2.69.
+# See <https://lists.gnu.org/archive/html/autoconf/2016-08/msg00014.html>
+
+m4_version_prereq([2.70], [], [
+
+# This is taken from the following Autoconf patch:
+# http://git.sv.gnu.org/cgit/autoconf.git/commit/?id=e17a30e98
+
+m4_undefine([AC_HEADER_MAJOR])
+AC_DEFUN([AC_HEADER_MAJOR],
+[AC_CHECK_HEADERS_ONCE([sys/types.h])
+AC_CHECK_HEADER([sys/mkdev.h],
+  [AC_DEFINE([MAJOR_IN_MKDEV], [1],
+    [Define to 1 if `major', `minor', and `makedev' are declared in
+     <mkdev.h>.])])
+if test $ac_cv_header_sys_mkdev_h = no; then
+  AC_CHECK_HEADER([sys/sysmacros.h],
+    [AC_DEFINE([MAJOR_IN_SYSMACROS], [1],
+      [Define to 1 if `major', `minor', and `makedev' are declared in
+       <sysmacros.h>.])])
+fi
+])
+
+])
diff --git a/liblouis/gnulib/m4/unistd_h.m4 b/liblouis/gnulib/m4/unistd_h.m4
new file mode 100644
index 0000000..25aef19
--- /dev/null
+++ b/liblouis/gnulib/m4/unistd_h.m4
@@ -0,0 +1,190 @@
+# unistd_h.m4 serial 69
+dnl Copyright (C) 2006-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Simon Josefsson, Bruno Haible.
+
+AC_DEFUN([gl_UNISTD_H],
+[
+  dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+  dnl once only, before all statements that occur in other macros.
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+  gl_CHECK_NEXT_HEADERS([unistd.h])
+  if test $ac_cv_header_unistd_h = yes; then
+    HAVE_UNISTD_H=1
+  else
+    HAVE_UNISTD_H=0
+  fi
+  AC_SUBST([HAVE_UNISTD_H])
+
+  dnl Ensure the type pid_t gets defined.
+  AC_REQUIRE([AC_TYPE_PID_T])
+
+  dnl Determine WINDOWS_64_BIT_OFF_T.
+  AC_REQUIRE([gl_TYPE_OFF_T])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use.
+  gl_WARN_ON_USE_PREPARE([[
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+/* Some systems declare various items in the wrong headers.  */
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <fcntl.h>
+# include <stdio.h>
+# include <stdlib.h>
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+    ]], [chdir chown dup dup2 dup3 environ euidaccess faccessat fchdir fchownat
+    fdatasync fsync ftruncate getcwd getdomainname getdtablesize getgroups
+    gethostname getlogin getlogin_r getpagesize
+    getusershell setusershell endusershell
+    group_member isatty lchown link linkat lseek pipe pipe2 pread pwrite
+    readlink readlinkat rmdir sethostname sleep symlink symlinkat ttyname_r
+    unlink unlinkat usleep])
+])
+
+AC_DEFUN([gl_UNISTD_MODULE_INDICATOR],
+[
+  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+  dnl Define it also as a C macro, for the benefit of the unit tests.
+  gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_UNISTD_H_DEFAULTS],
+[
+  GNULIB_CHDIR=0;                AC_SUBST([GNULIB_CHDIR])
+  GNULIB_CHOWN=0;                AC_SUBST([GNULIB_CHOWN])
+  GNULIB_CLOSE=0;                AC_SUBST([GNULIB_CLOSE])
+  GNULIB_DUP=0;                  AC_SUBST([GNULIB_DUP])
+  GNULIB_DUP2=0;                 AC_SUBST([GNULIB_DUP2])
+  GNULIB_DUP3=0;                 AC_SUBST([GNULIB_DUP3])
+  GNULIB_ENVIRON=0;              AC_SUBST([GNULIB_ENVIRON])
+  GNULIB_EUIDACCESS=0;           AC_SUBST([GNULIB_EUIDACCESS])
+  GNULIB_FACCESSAT=0;            AC_SUBST([GNULIB_FACCESSAT])
+  GNULIB_FCHDIR=0;               AC_SUBST([GNULIB_FCHDIR])
+  GNULIB_FCHOWNAT=0;             AC_SUBST([GNULIB_FCHOWNAT])
+  GNULIB_FDATASYNC=0;            AC_SUBST([GNULIB_FDATASYNC])
+  GNULIB_FSYNC=0;                AC_SUBST([GNULIB_FSYNC])
+  GNULIB_FTRUNCATE=0;            AC_SUBST([GNULIB_FTRUNCATE])
+  GNULIB_GETCWD=0;               AC_SUBST([GNULIB_GETCWD])
+  GNULIB_GETDOMAINNAME=0;        AC_SUBST([GNULIB_GETDOMAINNAME])
+  GNULIB_GETDTABLESIZE=0;        AC_SUBST([GNULIB_GETDTABLESIZE])
+  GNULIB_GETGROUPS=0;            AC_SUBST([GNULIB_GETGROUPS])
+  GNULIB_GETHOSTNAME=0;          AC_SUBST([GNULIB_GETHOSTNAME])
+  GNULIB_GETLOGIN=0;             AC_SUBST([GNULIB_GETLOGIN])
+  GNULIB_GETLOGIN_R=0;           AC_SUBST([GNULIB_GETLOGIN_R])
+  GNULIB_GETPAGESIZE=0;          AC_SUBST([GNULIB_GETPAGESIZE])
+  GNULIB_GETUSERSHELL=0;         AC_SUBST([GNULIB_GETUSERSHELL])
+  GNULIB_GROUP_MEMBER=0;         AC_SUBST([GNULIB_GROUP_MEMBER])
+  GNULIB_ISATTY=0;               AC_SUBST([GNULIB_ISATTY])
+  GNULIB_LCHOWN=0;               AC_SUBST([GNULIB_LCHOWN])
+  GNULIB_LINK=0;                 AC_SUBST([GNULIB_LINK])
+  GNULIB_LINKAT=0;               AC_SUBST([GNULIB_LINKAT])
+  GNULIB_LSEEK=0;                AC_SUBST([GNULIB_LSEEK])
+  GNULIB_PIPE=0;                 AC_SUBST([GNULIB_PIPE])
+  GNULIB_PIPE2=0;                AC_SUBST([GNULIB_PIPE2])
+  GNULIB_PREAD=0;                AC_SUBST([GNULIB_PREAD])
+  GNULIB_PWRITE=0;               AC_SUBST([GNULIB_PWRITE])
+  GNULIB_READ=0;                 AC_SUBST([GNULIB_READ])
+  GNULIB_READLINK=0;             AC_SUBST([GNULIB_READLINK])
+  GNULIB_READLINKAT=0;           AC_SUBST([GNULIB_READLINKAT])
+  GNULIB_RMDIR=0;                AC_SUBST([GNULIB_RMDIR])
+  GNULIB_SETHOSTNAME=0;          AC_SUBST([GNULIB_SETHOSTNAME])
+  GNULIB_SLEEP=0;                AC_SUBST([GNULIB_SLEEP])
+  GNULIB_SYMLINK=0;              AC_SUBST([GNULIB_SYMLINK])
+  GNULIB_SYMLINKAT=0;            AC_SUBST([GNULIB_SYMLINKAT])
+  GNULIB_TTYNAME_R=0;            AC_SUBST([GNULIB_TTYNAME_R])
+  GNULIB_UNISTD_H_NONBLOCKING=0; AC_SUBST([GNULIB_UNISTD_H_NONBLOCKING])
+  GNULIB_UNISTD_H_SIGPIPE=0;     AC_SUBST([GNULIB_UNISTD_H_SIGPIPE])
+  GNULIB_UNLINK=0;               AC_SUBST([GNULIB_UNLINK])
+  GNULIB_UNLINKAT=0;             AC_SUBST([GNULIB_UNLINKAT])
+  GNULIB_USLEEP=0;               AC_SUBST([GNULIB_USLEEP])
+  GNULIB_WRITE=0;                AC_SUBST([GNULIB_WRITE])
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE_CHOWN=1;           AC_SUBST([HAVE_CHOWN])
+  HAVE_DUP2=1;            AC_SUBST([HAVE_DUP2])
+  HAVE_DUP3=1;            AC_SUBST([HAVE_DUP3])
+  HAVE_EUIDACCESS=1;      AC_SUBST([HAVE_EUIDACCESS])
+  HAVE_FACCESSAT=1;       AC_SUBST([HAVE_FACCESSAT])
+  HAVE_FCHDIR=1;          AC_SUBST([HAVE_FCHDIR])
+  HAVE_FCHOWNAT=1;        AC_SUBST([HAVE_FCHOWNAT])
+  HAVE_FDATASYNC=1;       AC_SUBST([HAVE_FDATASYNC])
+  HAVE_FSYNC=1;           AC_SUBST([HAVE_FSYNC])
+  HAVE_FTRUNCATE=1;       AC_SUBST([HAVE_FTRUNCATE])
+  HAVE_GETDTABLESIZE=1;   AC_SUBST([HAVE_GETDTABLESIZE])
+  HAVE_GETGROUPS=1;       AC_SUBST([HAVE_GETGROUPS])
+  HAVE_GETHOSTNAME=1;     AC_SUBST([HAVE_GETHOSTNAME])
+  HAVE_GETLOGIN=1;        AC_SUBST([HAVE_GETLOGIN])
+  HAVE_GETPAGESIZE=1;     AC_SUBST([HAVE_GETPAGESIZE])
+  HAVE_GROUP_MEMBER=1;    AC_SUBST([HAVE_GROUP_MEMBER])
+  HAVE_LCHOWN=1;          AC_SUBST([HAVE_LCHOWN])
+  HAVE_LINK=1;            AC_SUBST([HAVE_LINK])
+  HAVE_LINKAT=1;          AC_SUBST([HAVE_LINKAT])
+  HAVE_PIPE=1;            AC_SUBST([HAVE_PIPE])
+  HAVE_PIPE2=1;           AC_SUBST([HAVE_PIPE2])
+  HAVE_PREAD=1;           AC_SUBST([HAVE_PREAD])
+  HAVE_PWRITE=1;          AC_SUBST([HAVE_PWRITE])
+  HAVE_READLINK=1;        AC_SUBST([HAVE_READLINK])
+  HAVE_READLINKAT=1;      AC_SUBST([HAVE_READLINKAT])
+  HAVE_SETHOSTNAME=1;     AC_SUBST([HAVE_SETHOSTNAME])
+  HAVE_SLEEP=1;           AC_SUBST([HAVE_SLEEP])
+  HAVE_SYMLINK=1;         AC_SUBST([HAVE_SYMLINK])
+  HAVE_SYMLINKAT=1;       AC_SUBST([HAVE_SYMLINKAT])
+  HAVE_UNLINKAT=1;        AC_SUBST([HAVE_UNLINKAT])
+  HAVE_USLEEP=1;          AC_SUBST([HAVE_USLEEP])
+  HAVE_DECL_ENVIRON=1;    AC_SUBST([HAVE_DECL_ENVIRON])
+  HAVE_DECL_FCHDIR=1;     AC_SUBST([HAVE_DECL_FCHDIR])
+  HAVE_DECL_FDATASYNC=1;  AC_SUBST([HAVE_DECL_FDATASYNC])
+  HAVE_DECL_GETDOMAINNAME=1; AC_SUBST([HAVE_DECL_GETDOMAINNAME])
+  HAVE_DECL_GETLOGIN=1;   AC_SUBST([HAVE_DECL_GETLOGIN])
+  HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R])
+  HAVE_DECL_GETPAGESIZE=1; AC_SUBST([HAVE_DECL_GETPAGESIZE])
+  HAVE_DECL_GETUSERSHELL=1; AC_SUBST([HAVE_DECL_GETUSERSHELL])
+  HAVE_DECL_SETHOSTNAME=1; AC_SUBST([HAVE_DECL_SETHOSTNAME])
+  HAVE_DECL_TTYNAME_R=1;  AC_SUBST([HAVE_DECL_TTYNAME_R])
+  HAVE_OS_H=0;            AC_SUBST([HAVE_OS_H])
+  HAVE_SYS_PARAM_H=0;     AC_SUBST([HAVE_SYS_PARAM_H])
+  REPLACE_CHOWN=0;        AC_SUBST([REPLACE_CHOWN])
+  REPLACE_CLOSE=0;        AC_SUBST([REPLACE_CLOSE])
+  REPLACE_DUP=0;          AC_SUBST([REPLACE_DUP])
+  REPLACE_DUP2=0;         AC_SUBST([REPLACE_DUP2])
+  REPLACE_FCHOWNAT=0;     AC_SUBST([REPLACE_FCHOWNAT])
+  REPLACE_FTRUNCATE=0;    AC_SUBST([REPLACE_FTRUNCATE])
+  REPLACE_GETCWD=0;       AC_SUBST([REPLACE_GETCWD])
+  REPLACE_GETDOMAINNAME=0; AC_SUBST([REPLACE_GETDOMAINNAME])
+  REPLACE_GETDTABLESIZE=0; AC_SUBST([REPLACE_GETDTABLESIZE])
+  REPLACE_GETLOGIN_R=0;   AC_SUBST([REPLACE_GETLOGIN_R])
+  REPLACE_GETGROUPS=0;    AC_SUBST([REPLACE_GETGROUPS])
+  REPLACE_GETPAGESIZE=0;  AC_SUBST([REPLACE_GETPAGESIZE])
+  REPLACE_ISATTY=0;       AC_SUBST([REPLACE_ISATTY])
+  REPLACE_LCHOWN=0;       AC_SUBST([REPLACE_LCHOWN])
+  REPLACE_LINK=0;         AC_SUBST([REPLACE_LINK])
+  REPLACE_LINKAT=0;       AC_SUBST([REPLACE_LINKAT])
+  REPLACE_LSEEK=0;        AC_SUBST([REPLACE_LSEEK])
+  REPLACE_PREAD=0;        AC_SUBST([REPLACE_PREAD])
+  REPLACE_PWRITE=0;       AC_SUBST([REPLACE_PWRITE])
+  REPLACE_READ=0;         AC_SUBST([REPLACE_READ])
+  REPLACE_READLINK=0;     AC_SUBST([REPLACE_READLINK])
+  REPLACE_READLINKAT=0;   AC_SUBST([REPLACE_READLINKAT])
+  REPLACE_RMDIR=0;        AC_SUBST([REPLACE_RMDIR])
+  REPLACE_SLEEP=0;        AC_SUBST([REPLACE_SLEEP])
+  REPLACE_SYMLINK=0;      AC_SUBST([REPLACE_SYMLINK])
+  REPLACE_SYMLINKAT=0;    AC_SUBST([REPLACE_SYMLINKAT])
+  REPLACE_TTYNAME_R=0;    AC_SUBST([REPLACE_TTYNAME_R])
+  REPLACE_UNLINK=0;       AC_SUBST([REPLACE_UNLINK])
+  REPLACE_UNLINKAT=0;     AC_SUBST([REPLACE_UNLINKAT])
+  REPLACE_USLEEP=0;       AC_SUBST([REPLACE_USLEEP])
+  REPLACE_WRITE=0;        AC_SUBST([REPLACE_WRITE])
+  UNISTD_H_HAVE_WINSOCK2_H=0; AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H])
+  UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
+                           AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS])
+])
diff --git a/liblouis/gnulib/m4/warn-on-use.m4 b/liblouis/gnulib/m4/warn-on-use.m4
new file mode 100644
index 0000000..25ce737
--- /dev/null
+++ b/liblouis/gnulib/m4/warn-on-use.m4
@@ -0,0 +1,47 @@
+# warn-on-use.m4 serial 5
+dnl Copyright (C) 2010-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# gl_WARN_ON_USE_PREPARE(INCLUDES, NAMES)
+# ---------------------------------------
+# For each whitespace-separated element in the list of NAMES, define
+# HAVE_RAW_DECL_name if the function has a declaration among INCLUDES
+# even after being undefined as a macro.
+#
+# See warn-on-use.h for some hints on how to poison function names, as
+# well as ideas on poisoning global variables and macros.  NAMES may
+# include global variables, but remember that only functions work with
+# _GL_WARN_ON_USE.  Typically, INCLUDES only needs to list a single
+# header, but if the replacement header pulls in other headers because
+# some systems declare functions in the wrong header, then INCLUDES
+# should do likewise.
+#
+# It is generally safe to assume declarations for functions declared
+# in the intersection of C89 and C11 (such as printf) without
+# needing gl_WARN_ON_USE_PREPARE.
+AC_DEFUN([gl_WARN_ON_USE_PREPARE],
+[
+  m4_foreach_w([gl_decl], [$2],
+    [AH_TEMPLATE([HAVE_RAW_DECL_]AS_TR_CPP(m4_defn([gl_decl])),
+      [Define to 1 if ]m4_defn([gl_decl])[ is declared even after
+       undefining macros.])])dnl
+dnl FIXME: gl_Symbol must be used unquoted until we can assume
+dnl autoconf 2.64 or newer.
+  for gl_func in m4_flatten([$2]); do
+    AS_VAR_PUSHDEF([gl_Symbol], [gl_cv_have_raw_decl_$gl_func])dnl
+    AC_CACHE_CHECK([whether $gl_func is declared without a macro],
+      gl_Symbol,
+      [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$1],
+[@%:@undef $gl_func
+  (void) $gl_func;])],
+        [AS_VAR_SET(gl_Symbol, [yes])], [AS_VAR_SET(gl_Symbol, [no])])])
+    AS_VAR_IF(gl_Symbol, [yes],
+      [AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_RAW_DECL_$gl_func]), [1])
+       dnl shortcut - if the raw declaration exists, then set a cache
+       dnl variable to allow skipping any later AC_CHECK_DECL efforts
+       eval ac_cv_have_decl_$gl_func=yes])
+    AS_VAR_POPDEF([gl_Symbol])dnl
+  done
+])
diff --git a/liblouis/gnulib/m4/wchar_t.m4 b/liblouis/gnulib/m4/wchar_t.m4
new file mode 100644
index 0000000..11783d2
--- /dev/null
+++ b/liblouis/gnulib/m4/wchar_t.m4
@@ -0,0 +1,24 @@
+# wchar_t.m4 serial 4 (gettext-0.18.2)
+dnl Copyright (C) 2002-2003, 2008-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether <stddef.h> has the 'wchar_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WCHAR_T],
+[
+  AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <stddef.h>
+            wchar_t foo = (wchar_t)'\0';]],
+          [[]])],
+       [gt_cv_c_wchar_t=yes],
+       [gt_cv_c_wchar_t=no])])
+  if test $gt_cv_c_wchar_t = yes; then
+    AC_DEFINE([HAVE_WCHAR_T], [1], [Define if you have the 'wchar_t' type.])
+  fi
+])
diff --git a/liblouis/gnulib/m4/wint_t.m4 b/liblouis/gnulib/m4/wint_t.m4
new file mode 100644
index 0000000..d30b8bc
--- /dev/null
+++ b/liblouis/gnulib/m4/wint_t.m4
@@ -0,0 +1,74 @@
+# wint_t.m4 serial 7
+dnl Copyright (C) 2003, 2007-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether <wchar.h> has the 'wint_t' type and whether gnulib's
+dnl <wchar.h> or <wctype.h> would, if present, override 'wint_t'.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WINT_T],
+[
+  AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+   <wchar.h>.
+   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+   before <wchar.h>.  */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+            wint_t foo = (wchar_t)'\0';]],
+          [[]])],
+       [gt_cv_c_wint_t=yes],
+       [gt_cv_c_wint_t=no])])
+  if test $gt_cv_c_wint_t = yes; then
+    AC_DEFINE([HAVE_WINT_T], [1], [Define if you have the 'wint_t' type.])
+
+    dnl Determine whether gnulib's <wchar.h> or <wctype.h> would, if present,
+    dnl override 'wint_t'.
+    AC_CACHE_CHECK([whether wint_t is too small],
+      [gl_cv_type_wint_t_too_small],
+      [AC_COMPILE_IFELSE(
+           [AC_LANG_PROGRAM([[
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+   <wchar.h>.
+   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+   included before <wchar.h>.  */
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <stddef.h>
+# include <stdio.h>
+# include <time.h>
+#endif
+#include <wchar.h>
+              int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1];
+              ]])],
+           [gl_cv_type_wint_t_too_small=no],
+           [gl_cv_type_wint_t_too_small=yes])])
+    if test $gl_cv_type_wint_t_too_small = yes; then
+      GNULIB_OVERRIDES_WINT_T=1
+    else
+      GNULIB_OVERRIDES_WINT_T=0
+    fi
+  else
+    GNULIB_OVERRIDES_WINT_T=0
+  fi
+  AC_SUBST([GNULIB_OVERRIDES_WINT_T])
+])
+
+dnl Prerequisites of the 'wint_t' override.
+AC_DEFUN([gl_TYPE_WINT_T_PREREQ],
+[
+  AC_CHECK_HEADERS_ONCE([crtdefs.h])
+  if test $ac_cv_header_crtdefs_h = yes; then
+    HAVE_CRTDEFS_H=1
+  else
+    HAVE_CRTDEFS_H=0
+  fi
+  AC_SUBST([HAVE_CRTDEFS_H])
+])
diff --git a/liblouis/gnulib/malloc.c b/liblouis/gnulib/malloc.c
new file mode 100644
index 0000000..eeaf12b
--- /dev/null
+++ b/liblouis/gnulib/malloc.c
@@ -0,0 +1,56 @@
+/* malloc() function that is glibc compatible.
+
+   Copyright (C) 1997-1998, 2006-2007, 2009-2017 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
+
+/* written by Jim Meyering and Bruno Haible */
+
+#define _GL_USE_STDLIB_ALLOC 1
+#include <config.h>
+/* Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h.  */
+#ifdef malloc
+# define NEED_MALLOC_GNU 1
+# undef malloc
+/* Whereas the gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU.  */
+#elif GNULIB_MALLOC_GNU && !HAVE_MALLOC_GNU
+# define NEED_MALLOC_GNU 1
+#endif
+
+#include <stdlib.h>
+
+#include <errno.h>
+
+/* Allocate an N-byte block of memory from the heap.
+   If N is zero, allocate a 1-byte block.  */
+
+void *
+rpl_malloc (size_t n)
+{
+  void *result;
+
+#if NEED_MALLOC_GNU
+  if (n == 0)
+    n = 1;
+#endif
+
+  result = malloc (n);
+
+#if !HAVE_MALLOC_POSIX
+  if (result == NULL)
+    errno = ENOMEM;
+#endif
+
+  return result;
+}
diff --git a/liblouis/gnulib/malloca.c b/liblouis/gnulib/malloca.c
new file mode 100644
index 0000000..0bf4adc
--- /dev/null
+++ b/liblouis/gnulib/malloca.c
@@ -0,0 +1,149 @@
+/* Safe automatic memory allocation.
+   Copyright (C) 2003, 2006-2007, 2009-2017 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
+
+#define _GL_USE_STDLIB_ALLOC 1
+#include <config.h>
+
+/* Specification.  */
+#include "malloca.h"
+
+#include <stdint.h>
+
+#include "verify.h"
+
+/* The speed critical point in this file is freea() applied to an alloca()
+   result: it must be fast, to match the speed of alloca().  The speed of
+   mmalloca() and freea() in the other case are not critical, because they
+   are only invoked for big memory sizes.  */
+
+#if HAVE_ALLOCA
+
+/* Store the mmalloca() results in a hash table.  This is needed to reliably
+   distinguish a mmalloca() result and an alloca() result.
+
+   Although it is possible that the same pointer is returned by alloca() and
+   by mmalloca() at different times in the same application, it does not lead
+   to a bug in freea(), because:
+     - Before a pointer returned by alloca() can point into malloc()ed memory,
+       the function must return, and once this has happened the programmer must
+       not call freea() on it anyway.
+     - Before a pointer returned by mmalloca() can point into the stack, it
+       must be freed.  The only function that can free it is freea(), and
+       when freea() frees it, it also removes it from the hash table.  */
+
+#define MAGIC_NUMBER 0x1415fb4a
+#define MAGIC_SIZE sizeof (int)
+/* This is how the header info would look like without any alignment
+   considerations.  */
+struct preliminary_header { void *next; int magic; };
+/* But the header's size must be a multiple of sa_alignment_max.  */
+#define HEADER_SIZE \
+  (((sizeof (struct preliminary_header) + sa_alignment_max - 1) / sa_alignment_max) * sa_alignment_max)
+union header {
+  void *next;
+  struct {
+    char room[HEADER_SIZE - MAGIC_SIZE];
+    int word;
+  } magic;
+};
+verify (HEADER_SIZE == sizeof (union header));
+/* We make the hash table quite big, so that during lookups the probability
+   of empty hash buckets is quite high.  There is no need to make the hash
+   table resizable, because when the hash table gets filled so much that the
+   lookup becomes slow, it means that the application has memory leaks.  */
+#define HASH_TABLE_SIZE 257
+static void * mmalloca_results[HASH_TABLE_SIZE];
+
+#endif
+
+void *
+mmalloca (size_t n)
+{
+#if HAVE_ALLOCA
+  /* Allocate one more word, that serves as an indicator for malloc()ed
+     memory, so that freea() of an alloca() result is fast.  */
+  size_t nplus = n + HEADER_SIZE;
+
+  if (nplus >= n)
+    {
+      void *p = malloc (nplus);
+
+      if (p != NULL)
+        {
+          size_t slot;
+          union header *h = p;
+
+          p = h + 1;
+
+          /* Put a magic number into the indicator word.  */
+          h->magic.word = MAGIC_NUMBER;
+
+          /* Enter p into the hash table.  */
+          slot = (uintptr_t) p % HASH_TABLE_SIZE;
+          h->next = mmalloca_results[slot];
+          mmalloca_results[slot] = p;
+
+          return p;
+        }
+    }
+  /* Out of memory.  */
+  return NULL;
+#else
+# if !MALLOC_0_IS_NONNULL
+  if (n == 0)
+    n = 1;
+# endif
+  return malloc (n);
+#endif
+}
+
+#if HAVE_ALLOCA
+void
+freea (void *p)
+{
+  /* mmalloca() may have returned NULL.  */
+  if (p != NULL)
+    {
+      /* Attempt to quickly distinguish the mmalloca() result - which has
+         a magic indicator word - and the alloca() result - which has an
+         uninitialized indicator word.  It is for this test that sa_increment
+         additional bytes are allocated in the alloca() case.  */
+      if (((int *) p)[-1] == MAGIC_NUMBER)
+        {
+          /* Looks like a mmalloca() result.  To see whether it really is one,
+             perform a lookup in the hash table.  */
+          size_t slot = (uintptr_t) p % HASH_TABLE_SIZE;
+          void **chain = &mmalloca_results[slot];
+          for (; *chain != NULL;)
+            {
+              union header *h = p;
+              if (*chain == p)
+                {
+                  /* Found it.  Remove it from the hash table and free it.  */
+                  union header *p_begin = h - 1;
+                  *chain = p_begin->next;
+                  free (p_begin);
+                  return;
+                }
+              h = *chain;
+              chain = &h[-1].next;
+            }
+        }
+      /* At this point, we know it was not a mmalloca() result.  */
+    }
+}
+#endif
diff --git a/liblouis/gnulib/malloca.h b/liblouis/gnulib/malloca.h
new file mode 100644
index 0000000..a9078fc
--- /dev/null
+++ b/liblouis/gnulib/malloca.h
@@ -0,0 +1,128 @@
+/* Safe automatic memory allocation.
+   Copyright (C) 2003-2007, 2009-2017 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _MALLOCA_H
+#define _MALLOCA_H
+
+#include <alloca.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#include "xalloc-oversized.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* safe_alloca(N) is equivalent to alloca(N) when it is safe to call
+   alloca(N); otherwise it returns NULL.  It either returns N bytes of
+   memory allocated on the stack, that lasts until the function returns,
+   or NULL.
+   Use of safe_alloca should be avoided:
+     - inside arguments of function calls - undefined behaviour,
+     - in inline functions - the allocation may actually last until the
+       calling function returns.
+*/
+#if HAVE_ALLOCA
+/* The OS usually guarantees only one guard page at the bottom of the stack,
+   and a page size can be as small as 4096 bytes.  So we cannot safely
+   allocate anything larger than 4096 bytes.  Also care for the possibility
+   of a few compiler-allocated temporary stack slots.
+   This must be a macro, not a function.  */
+# define safe_alloca(N) ((N) < 4032 ? alloca (N) : NULL)
+#else
+# define safe_alloca(N) ((void) (N), NULL)
+#endif
+
+/* malloca(N) is a safe variant of alloca(N).  It allocates N bytes of
+   memory allocated on the stack, that must be freed using freea() before
+   the function returns.  Upon failure, it returns NULL.  */
+#if HAVE_ALLOCA
+# define malloca(N) \
+  ((N) < 4032 - sa_increment                                        \
+   ? (void *) ((char *) alloca ((N) + sa_increment) + sa_increment) \
+   : mmalloca (N))
+#else
+# define malloca(N) \
+  mmalloca (N)
+#endif
+extern void * mmalloca (size_t n);
+
+/* Free a block of memory allocated through malloca().  */
+#if HAVE_ALLOCA
+extern void freea (void *p);
+#else
+# define freea free
+#endif
+
+/* nmalloca(N,S) is an overflow-safe variant of malloca (N * S).
+   It allocates an array of N objects, each with S bytes of memory,
+   on the stack.  S must be positive and N must be nonnegative.
+   The array must be freed using freea() before the function returns.  */
+#define nmalloca(n, s) (xalloc_oversized (n, s) ? NULL : malloca ((n) * (s)))
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* ------------------- Auxiliary, non-public definitions ------------------- */
+
+/* Determine the alignment of a type at compile time.  */
+#if defined __GNUC__ || defined __IBM__ALIGNOF__
+# define sa_alignof __alignof__
+#elif defined __cplusplus
+  template <class type> struct sa_alignof_helper { char __slot1; type __slot2; };
+# define sa_alignof(type) offsetof (sa_alignof_helper<type>, __slot2)
+#elif defined __hpux
+  /* Work around a HP-UX 10.20 cc bug with enums constants defined as offsetof
+     values.  */
+# define sa_alignof(type) (sizeof (type) <= 4 ? 4 : 8)
+#elif defined _AIX
+  /* Work around an AIX 3.2.5 xlc bug with enums constants defined as offsetof
+     values.  */
+# define sa_alignof(type) (sizeof (type) <= 4 ? 4 : 8)
+#else
+# define sa_alignof(type) offsetof (struct { char __slot1; type __slot2; }, __slot2)
+#endif
+
+enum
+{
+/* The desired alignment of memory allocations is the maximum alignment
+   among all elementary types.  */
+  sa_alignment_long = sa_alignof (long),
+  sa_alignment_double = sa_alignof (double),
+#if HAVE_LONG_LONG_INT
+  sa_alignment_longlong = sa_alignof (long long),
+#endif
+  sa_alignment_longdouble = sa_alignof (long double),
+  sa_alignment_max = ((sa_alignment_long - 1) | (sa_alignment_double - 1)
+#if HAVE_LONG_LONG_INT
+                      | (sa_alignment_longlong - 1)
+#endif
+                      | (sa_alignment_longdouble - 1)
+                     ) + 1,
+/* The increment that guarantees room for a magic word must be >= sizeof (int)
+   and a multiple of sa_alignment_max.  */
+  sa_increment = ((sizeof (int) + sa_alignment_max - 1) / sa_alignment_max) * sa_alignment_max
+};
+
+#endif /* _MALLOCA_H */
diff --git a/liblouis/gnulib/malloca.valgrind b/liblouis/gnulib/malloca.valgrind
new file mode 100644
index 0000000..52f0a50
--- /dev/null
+++ b/liblouis/gnulib/malloca.valgrind
@@ -0,0 +1,7 @@
+# Suppress a valgrind message about use of uninitialized memory in freea().
+# This use is OK because it provides only a speedup.
+{
+    freea
+    Memcheck:Cond
+    fun:freea
+}
diff --git a/liblouis/gnulib/realloc.c b/liblouis/gnulib/realloc.c
new file mode 100644
index 0000000..526b487
--- /dev/null
+++ b/liblouis/gnulib/realloc.c
@@ -0,0 +1,79 @@
+/* realloc() function that is glibc compatible.
+
+   Copyright (C) 1997, 2003-2004, 2006-2007, 2009-2017 Free Software
+   Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* written by Jim Meyering and Bruno Haible */
+
+#define _GL_USE_STDLIB_ALLOC 1
+#include <config.h>
+
+/* Only the AC_FUNC_REALLOC macro defines 'realloc' already in config.h.  */
+#ifdef realloc
+# define NEED_REALLOC_GNU 1
+/* Whereas the gnulib module 'realloc-gnu' defines HAVE_REALLOC_GNU.  */
+#elif GNULIB_REALLOC_GNU && !HAVE_REALLOC_GNU
+# define NEED_REALLOC_GNU 1
+#endif
+
+/* Infer the properties of the system's malloc function.
+   The gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU.  */
+#if GNULIB_MALLOC_GNU && HAVE_MALLOC_GNU
+# define SYSTEM_MALLOC_GLIBC_COMPATIBLE 1
+#endif
+
+#include <stdlib.h>
+
+#include <errno.h>
+
+/* Change the size of an allocated block of memory P to N bytes,
+   with error checking.  If N is zero, change it to 1.  If P is NULL,
+   use malloc.  */
+
+void *
+rpl_realloc (void *p, size_t n)
+{
+  void *result;
+
+#if NEED_REALLOC_GNU
+  if (n == 0)
+    {
+      n = 1;
+
+      /* In theory realloc might fail, so don't rely on it to free.  */
+      free (p);
+      p = NULL;
+    }
+#endif
+
+  if (p == NULL)
+    {
+#if GNULIB_REALLOC_GNU && !NEED_REALLOC_GNU && !SYSTEM_MALLOC_GLIBC_COMPATIBLE
+      if (n == 0)
+        n = 1;
+#endif
+      result = malloc (n);
+    }
+  else
+    result = realloc (p, n);
+
+#if !HAVE_REALLOC_POSIX
+  if (result == NULL)
+    errno = ENOMEM;
+#endif
+
+  return result;
+}
diff --git a/liblouis/gnulib/setenv.c b/liblouis/gnulib/setenv.c
new file mode 100644
index 0000000..edc6a0a
--- /dev/null
+++ b/liblouis/gnulib/setenv.c
@@ -0,0 +1,390 @@
+/* Copyright (C) 1992, 1995-2003, 2005-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#if !_LIBC
+/* Don't use __attribute__ __nonnull__ in this compilation unit.  Otherwise gcc
+   optimizes away the name == NULL test below.  */
+# define _GL_ARG_NONNULL(params)
+
+# define _GL_USE_STDLIB_ALLOC 1
+# include <config.h>
+#endif
+
+#include <alloca.h>
+
+/* Specification.  */
+#include <stdlib.h>
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(ev) ((errno) = (ev))
+#endif
+
+#include <string.h>
+#if _LIBC || HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if !_LIBC
+# include "malloca.h"
+#endif
+
+#if _LIBC || !HAVE_SETENV
+
+#if !_LIBC
+# define __environ      environ
+#endif
+
+#if _LIBC
+/* This lock protects against simultaneous modifications of 'environ'.  */
+# include <bits/libc-lock.h>
+__libc_lock_define_initialized (static, envlock)
+# define LOCK   __libc_lock_lock (envlock)
+# define UNLOCK __libc_lock_unlock (envlock)
+#else
+# define LOCK
+# define UNLOCK
+#endif
+
+/* In the GNU C library we must keep the namespace clean.  */
+#ifdef _LIBC
+# define setenv __setenv
+# define clearenv __clearenv
+# define tfind __tfind
+# define tsearch __tsearch
+#endif
+
+/* In the GNU C library implementation we try to be more clever and
+   allow arbitrarily many changes of the environment given that the used
+   values are from a small set.  Outside glibc this will eat up all
+   memory after a while.  */
+#if defined _LIBC || (defined HAVE_SEARCH_H && defined HAVE_TSEARCH \
+                      && defined __GNUC__)
+# define USE_TSEARCH    1
+# include <search.h>
+typedef int (*compar_fn_t) (const void *, const void *);
+
+/* This is a pointer to the root of the search tree with the known
+   values.  */
+static void *known_values;
+
+# define KNOWN_VALUE(Str) \
+  ({                                                                          \
+    void *value = tfind (Str, &known_values, (compar_fn_t) strcmp);           \
+    value != NULL ? *(char **) value : NULL;                                  \
+  })
+# define STORE_VALUE(Str) \
+  tsearch (Str, &known_values, (compar_fn_t) strcmp)
+
+#else
+# undef USE_TSEARCH
+
+# define KNOWN_VALUE(Str) NULL
+# define STORE_VALUE(Str) do { } while (0)
+
+#endif
+
+
+/* If this variable is not a null pointer we allocated the current
+   environment.  */
+static char **last_environ;
+
+
+/* This function is used by 'setenv' and 'putenv'.  The difference between
+   the two functions is that for the former must create a new string which
+   is then placed in the environment, while the argument of 'putenv'
+   must be used directly.  This is all complicated by the fact that we try
+   to reuse values once generated for a 'setenv' call since we can never
+   free the strings.  */
+int
+__add_to_environ (const char *name, const char *value, const char *combined,
+                  int replace)
+{
+  char **ep;
+  size_t size;
+  const size_t namelen = strlen (name);
+  const size_t vallen = value != NULL ? strlen (value) + 1 : 0;
+
+  LOCK;
+
+  /* We have to get the pointer now that we have the lock and not earlier
+     since another thread might have created a new environment.  */
+  ep = __environ;
+
+  size = 0;
+  if (ep != NULL)
+    {
+      for (; *ep != NULL; ++ep)
+        if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=')
+          break;
+        else
+          ++size;
+    }
+
+  if (ep == NULL || *ep == NULL)
+    {
+      char **new_environ;
+#ifdef USE_TSEARCH
+      char *new_value;
+#endif
+
+      /* We allocated this space; we can extend it.  */
+      new_environ =
+        (char **) (last_environ == NULL
+                   ? malloc ((size + 2) * sizeof (char *))
+                   : realloc (last_environ, (size + 2) * sizeof (char *)));
+      if (new_environ == NULL)
+        {
+          /* It's easier to set errno to ENOMEM than to rely on the
+             'malloc-posix' and 'realloc-posix' gnulib modules.  */
+          __set_errno (ENOMEM);
+          UNLOCK;
+          return -1;
+        }
+
+      /* If the whole entry is given add it.  */
+      if (combined != NULL)
+        /* We must not add the string to the search tree since it belongs
+           to the user.  */
+        new_environ[size] = (char *) combined;
+      else
+        {
+          /* See whether the value is already known.  */
+#ifdef USE_TSEARCH
+# ifdef _LIBC
+          new_value = (char *) alloca (namelen + 1 + vallen);
+          __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
+                     value, vallen);
+# else
+          new_value = (char *) malloca (namelen + 1 + vallen);
+          if (new_value == NULL)
+            {
+              __set_errno (ENOMEM);
+              UNLOCK;
+              return -1;
+            }
+          memcpy (new_value, name, namelen);
+          new_value[namelen] = '=';
+          memcpy (&new_value[namelen + 1], value, vallen);
+# endif
+
+          new_environ[size] = KNOWN_VALUE (new_value);
+          if (new_environ[size] == NULL)
+#endif
+            {
+              new_environ[size] = (char *) malloc (namelen + 1 + vallen);
+              if (new_environ[size] == NULL)
+                {
+#if defined USE_TSEARCH && !defined _LIBC
+                  freea (new_value);
+#endif
+                  __set_errno (ENOMEM);
+                  UNLOCK;
+                  return -1;
+                }
+
+#ifdef USE_TSEARCH
+              memcpy (new_environ[size], new_value, namelen + 1 + vallen);
+#else
+              memcpy (new_environ[size], name, namelen);
+              new_environ[size][namelen] = '=';
+              memcpy (&new_environ[size][namelen + 1], value, vallen);
+#endif
+              /* And save the value now.  We cannot do this when we remove
+                 the string since then we cannot decide whether it is a
+                 user string or not.  */
+              STORE_VALUE (new_environ[size]);
+            }
+#if defined USE_TSEARCH && !defined _LIBC
+          freea (new_value);
+#endif
+        }
+
+      if (__environ != last_environ)
+        memcpy ((char *) new_environ, (char *) __environ,
+                size * sizeof (char *));
+
+      new_environ[size + 1] = NULL;
+
+      last_environ = __environ = new_environ;
+    }
+  else if (replace)
+    {
+      char *np;
+
+      /* Use the user string if given.  */
+      if (combined != NULL)
+        np = (char *) combined;
+      else
+        {
+#ifdef USE_TSEARCH
+          char *new_value;
+# ifdef _LIBC
+          new_value = alloca (namelen + 1 + vallen);
+          __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
+                     value, vallen);
+# else
+          new_value = malloca (namelen + 1 + vallen);
+          if (new_value == NULL)
+            {
+              __set_errno (ENOMEM);
+              UNLOCK;
+              return -1;
+            }
+          memcpy (new_value, name, namelen);
+          new_value[namelen] = '=';
+          memcpy (&new_value[namelen + 1], value, vallen);
+# endif
+
+          np = KNOWN_VALUE (new_value);
+          if (np == NULL)
+#endif
+            {
+              np = (char *) malloc (namelen + 1 + vallen);
+              if (np == NULL)
+                {
+#if defined USE_TSEARCH && !defined _LIBC
+                  freea (new_value);
+#endif
+                  __set_errno (ENOMEM);
+                  UNLOCK;
+                  return -1;
+                }
+
+#ifdef USE_TSEARCH
+              memcpy (np, new_value, namelen + 1 + vallen);
+#else
+              memcpy (np, name, namelen);
+              np[namelen] = '=';
+              memcpy (&np[namelen + 1], value, vallen);
+#endif
+              /* And remember the value.  */
+              STORE_VALUE (np);
+            }
+#if defined USE_TSEARCH && !defined _LIBC
+          freea (new_value);
+#endif
+        }
+
+      *ep = np;
+    }
+
+  UNLOCK;
+
+  return 0;
+}
+
+int
+setenv (const char *name, const char *value, int replace)
+{
+  if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
+    {
+      __set_errno (EINVAL);
+      return -1;
+    }
+
+  return __add_to_environ (name, value, NULL, replace);
+}
+
+/* The 'clearenv' was planned to be added to POSIX.1 but probably
+   never made it.  Nevertheless the POSIX.9 standard (POSIX bindings
+   for Fortran 77) requires this function.  */
+int
+clearenv (void)
+{
+  LOCK;
+
+  if (__environ == last_environ && __environ != NULL)
+    {
+      /* We allocated this environment so we can free it.  */
+      free (__environ);
+      last_environ = NULL;
+    }
+
+  /* Clear the environment pointer removes the whole environment.  */
+  __environ = NULL;
+
+  UNLOCK;
+
+  return 0;
+}
+
+#ifdef _LIBC
+static void
+free_mem (void)
+{
+  /* Remove all traces.  */
+  clearenv ();
+
+  /* Now remove the search tree.  */
+  __tdestroy (known_values, free);
+  known_values = NULL;
+}
+text_set_element (__libc_subfreeres, free_mem);
+
+
+# undef setenv
+# undef clearenv
+weak_alias (__setenv, setenv)
+weak_alias (__clearenv, clearenv)
+#endif
+
+#endif /* _LIBC || !HAVE_SETENV */
+
+/* The rest of this file is called into use when replacing an existing
+   but buggy setenv.  Known bugs include failure to diagnose invalid
+   name, and consuming a leading '=' from value.  */
+#if HAVE_SETENV
+
+# undef setenv
+# if !HAVE_DECL_SETENV
+extern int setenv (const char *, const char *, int);
+# endif
+# define STREQ(a, b) (strcmp (a, b) == 0)
+
+int
+rpl_setenv (const char *name, const char *value, int replace)
+{
+  int result;
+  if (!name || !*name || strchr (name, '='))
+    {
+      errno = EINVAL;
+      return -1;
+    }
+  /* Call the real setenv even if replace is 0, in case implementation
+     has underlying data to update, such as when environ changes.  */
+  result = setenv (name, value, replace);
+  if (result == 0 && replace && *value == '=')
+    {
+      char *tmp = getenv (name);
+      if (!STREQ (tmp, value))
+        {
+          int saved_errno;
+          size_t len = strlen (value);
+          tmp = malloca (len + 2);
+          /* Since leading '=' is eaten, double it up.  */
+          *tmp = '=';
+          memcpy (tmp + 1, value, len + 1);
+          result = setenv (name, tmp, replace);
+          saved_errno = errno;
+          freea (tmp);
+          errno = saved_errno;
+        }
+    }
+  return result;
+}
+
+#endif /* HAVE_SETENV */
diff --git a/liblouis/gnulib/stddef.in.h b/liblouis/gnulib/stddef.in.h
new file mode 100644
index 0000000..5b496a6
--- /dev/null
+++ b/liblouis/gnulib/stddef.in.h
@@ -0,0 +1,110 @@
+/* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues.
+
+   Copyright (C) 2009-2017 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Eric Blake.  */
+
+/*
+ * POSIX 2008 <stddef.h> for platforms that have issues.
+ * <http://www.opengroup.org/susv3xbd/stddef.h.html>
+ */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_wchar_t || defined __need_size_t  \
+  || defined __need_ptrdiff_t || defined __need_NULL \
+  || defined __need_wint_t
+/* Special invocation convention inside gcc header files.  In
+   particular, gcc provides a version of <stddef.h> that blindly
+   redefines NULL even when __need_wint_t was defined, even though
+   wint_t is not normally provided by <stddef.h>.  Hence, we must
+   remember if special invocation has ever been used to obtain wint_t,
+   in which case we need to clean up NULL yet again.  */
+
+# if !(defined _@GUARD_PREFIX@_STDDEF_H && defined _GL_STDDEF_WINT_T)
+#  ifdef __need_wint_t
+#   define _GL_STDDEF_WINT_T
+#  endif
+#  @INCLUDE_NEXT@ @NEXT_STDDEF_H@
+# endif
+
+#else
+/* Normal invocation convention.  */
+
+# ifndef _@GUARD_PREFIX@_STDDEF_H
+
+/* The include_next requires a split double-inclusion guard.  */
+
+#  @INCLUDE_NEXT@ @NEXT_STDDEF_H@
+
+/* On NetBSD 5.0, the definition of NULL lacks proper parentheses.  */
+#  if (@REPLACE_NULL@ \
+       && (!defined _@GUARD_PREFIX@_STDDEF_H || defined _GL_STDDEF_WINT_T))
+#   undef NULL
+#   ifdef __cplusplus
+   /* ISO C++ says that the macro NULL must expand to an integer constant
+      expression, hence '((void *) 0)' is not allowed in C++.  */
+#    if __GNUG__ >= 3
+    /* GNU C++ has a __null macro that behaves like an integer ('int' or
+       'long') but has the same size as a pointer.  Use that, to avoid
+       warnings.  */
+#     define NULL __null
+#    else
+#     define NULL 0L
+#    endif
+#   else
+#    define NULL ((void *) 0)
+#   endif
+#  endif
+
+#  ifndef _@GUARD_PREFIX@_STDDEF_H
+#   define _@GUARD_PREFIX@_STDDEF_H
+
+/* Some platforms lack wchar_t.  */
+#if !@HAVE_WCHAR_T@
+# define wchar_t int
+#endif
+
+/* Some platforms lack max_align_t.  The check for _GCC_MAX_ALIGN_T is
+   a hack in case the configure-time test was done with g++ even though
+   we are currently compiling with gcc.  */
+#if ! (@HAVE_MAX_ALIGN_T@ || defined _GCC_MAX_ALIGN_T)
+/* On the x86, the maximum storage alignment of double, long, etc. is 4,
+   but GCC's C11 ABI for x86 says that max_align_t has an alignment of 8,
+   and the C11 standard allows this.  Work around this problem by
+   using __alignof__ (which returns 8 for double) rather than _Alignof
+   (which returns 4), and align each union member accordingly.  */
+# ifdef __GNUC__
+#  define _GL_STDDEF_ALIGNAS(type) \
+     __attribute__ ((__aligned__ (__alignof__ (type))))
+# else
+#  define _GL_STDDEF_ALIGNAS(type) /* */
+# endif
+typedef union
+{
+  char *__p _GL_STDDEF_ALIGNAS (char *);
+  double __d _GL_STDDEF_ALIGNAS (double);
+  long double __ld _GL_STDDEF_ALIGNAS (long double);
+  long int __i _GL_STDDEF_ALIGNAS (long int);
+} max_align_t;
+#endif
+
+#  endif /* _@GUARD_PREFIX@_STDDEF_H */
+# endif /* _@GUARD_PREFIX@_STDDEF_H */
+#endif /* __need_XXX */
diff --git a/liblouis/gnulib/stdint.in.h b/liblouis/gnulib/stdint.in.h
new file mode 100644
index 0000000..5fbec34
--- /dev/null
+++ b/liblouis/gnulib/stdint.in.h
@@ -0,0 +1,726 @@
+/* Copyright (C) 2001-2002, 2004-2017 Free Software Foundation, Inc.
+   Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood.
+   This file is part of gnulib.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
+
+/*
+ * ISO C 99 <stdint.h> for platforms that lack it.
+ * <http://www.opengroup.org/susv3xbd/stdint.h.html>
+ */
+
+#ifndef _@GUARD_PREFIX@_STDINT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* When including a system file that in turn includes <inttypes.h>,
+   use the system <inttypes.h>, not our substitute.  This avoids
+   problems with (for example) VMS, whose <sys/bitypes.h> includes
+   <inttypes.h>.  */
+#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+
+/* On Android (Bionic libc), <sys/types.h> includes this file before
+   having defined 'time_t'.  Therefore in this case avoid including
+   other system header files; just include the system's <stdint.h>.
+   Ideally we should test __BIONIC__ here, but it is only defined after
+   <sys/cdefs.h> has been included; hence test __ANDROID__ instead.  */
+#if defined __ANDROID__ && defined _GL_INCLUDING_SYS_TYPES_H
+# @INCLUDE_NEXT@ @NEXT_STDINT_H@
+#else
+
+/* Get those types that are already defined in other system include
+   files, so that we can "#define int8_t signed char" below without
+   worrying about a later system include file containing a "typedef
+   signed char int8_t;" that will get messed up by our macro.  Our
+   macros should all be consistent with the system versions, except
+   for the "fast" types and macros, which we recommend against using
+   in public interfaces due to compiler differences.  */
+
+#if @HAVE_STDINT_H@
+# if defined __sgi && ! defined __c99
+   /* Bypass IRIX's <stdint.h> if in C89 mode, since it merely annoys users
+      with "This header file is to be used only for c99 mode compilations"
+      diagnostics.  */
+#  define __STDINT_H__
+# endif
+
+  /* Some pre-C++11 <stdint.h> implementations need this.  */
+# ifdef __cplusplus
+#  ifndef __STDC_CONSTANT_MACROS
+#   define __STDC_CONSTANT_MACROS 1
+#  endif
+#  ifndef __STDC_LIMIT_MACROS
+#   define __STDC_LIMIT_MACROS 1
+#  endif
+# endif
+
+  /* Other systems may have an incomplete or buggy <stdint.h>.
+     Include it before <inttypes.h>, since any "#include <stdint.h>"
+     in <inttypes.h> would reinclude us, skipping our contents because
+     _@GUARD_PREFIX@_STDINT_H is defined.
+     The include_next requires a split double-inclusion guard.  */
+# @INCLUDE_NEXT@ @NEXT_STDINT_H@
+#endif
+
+#if ! defined _@GUARD_PREFIX@_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+#define _@GUARD_PREFIX@_STDINT_H
+
+/* Get SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, INT_MIN, INT_MAX,
+   LONG_MIN, LONG_MAX, ULONG_MAX, _GL_INTEGER_WIDTH.  */
+#include <limits.h>
+
+/* Override WINT_MIN and WINT_MAX if gnulib's <wchar.h> or <wctype.h> overrides
+   wint_t.  */
+#if @GNULIB_OVERRIDES_WINT_T@
+# undef WINT_MIN
+# undef WINT_MAX
+# define WINT_MIN 0x0U
+# define WINT_MAX 0xffffffffU
+#endif
+
+#if ! @HAVE_C99_STDINT_H@
+
+/* <sys/types.h> defines some of the stdint.h types as well, on glibc,
+   IRIX 6.5, and OpenBSD 3.8 (via <machine/types.h>).
+   AIX 5.2 <sys/types.h> isn't needed and causes troubles.
+   Mac OS X 10.4.6 <sys/types.h> includes <stdint.h> (which is us), but
+   relies on the system <stdint.h> definitions, so include
+   <sys/types.h> after @NEXT_STDINT_H@.  */
+# if @HAVE_SYS_TYPES_H@ && ! defined _AIX
+#  include <sys/types.h>
+# endif
+
+# if @HAVE_INTTYPES_H@
+  /* In OpenBSD 3.8, <inttypes.h> includes <machine/types.h>, which defines
+     int{8,16,32,64}_t, uint{8,16,32,64}_t and __BIT_TYPES_DEFINED__.
+     <inttypes.h> also defines intptr_t and uintptr_t.  */
+#  include <inttypes.h>
+# elif @HAVE_SYS_INTTYPES_H@
+  /* Solaris 7 <sys/inttypes.h> has the types except the *_fast*_t types, and
+     the macros except for *_FAST*_*, INTPTR_MIN, PTRDIFF_MIN, PTRDIFF_MAX.  */
+#  include <sys/inttypes.h>
+# endif
+
+# if @HAVE_SYS_BITYPES_H@ && ! defined __BIT_TYPES_DEFINED__
+  /* Linux libc4 >= 4.6.7 and libc5 have a <sys/bitypes.h> that defines
+     int{8,16,32,64}_t and __BIT_TYPES_DEFINED__.  In libc5 >= 5.2.2 it is
+     included by <sys/types.h>.  */
+#  include <sys/bitypes.h>
+# endif
+
+# undef _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+
+/* Minimum and maximum values for an integer type under the usual assumption.
+   Return an unspecified value if BITS == 0, adding a check to pacify
+   picky compilers.  */
+
+/* These are separate macros, because if you try to merge these macros into
+   a single one, HP-UX cc rejects the resulting expression in constant
+   expressions.  */
+# define _STDINT_UNSIGNED_MIN(bits, zero) \
+    (zero)
+# define _STDINT_SIGNED_MIN(bits, zero) \
+    (~ _STDINT_MAX (1, bits, zero))
+
+# define _STDINT_MAX(signed, bits, zero) \
+    (((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 0)) - 1) * 2 + 1)
+
+#if !GNULIB_defined_stdint_types
+
+/* 7.18.1.1. Exact-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+   types have 8, 16, 32, optionally 64 bits.  */
+
+# undef int8_t
+# undef uint8_t
+typedef signed char gl_int8_t;
+typedef unsigned char gl_uint8_t;
+# define int8_t gl_int8_t
+# define uint8_t gl_uint8_t
+
+# undef int16_t
+# undef uint16_t
+typedef short int gl_int16_t;
+typedef unsigned short int gl_uint16_t;
+# define int16_t gl_int16_t
+# define uint16_t gl_uint16_t
+
+# undef int32_t
+# undef uint32_t
+typedef int gl_int32_t;
+typedef unsigned int gl_uint32_t;
+# define int32_t gl_int32_t
+# define uint32_t gl_uint32_t
+
+/* If the system defines INT64_MAX, assume int64_t works.  That way,
+   if the underlying platform defines int64_t to be a 64-bit long long
+   int, the code below won't mistakenly define it to be a 64-bit long
+   int, which would mess up C++ name mangling.  We must use #ifdef
+   rather than #if, to avoid an error with HP-UX 10.20 cc.  */
+
+# ifdef INT64_MAX
+#  define GL_INT64_T
+# else
+/* Do not undefine int64_t if gnulib is not being used with 64-bit
+   types, since otherwise it breaks platforms like Tandem/NSK.  */
+#  if LONG_MAX >> 31 >> 31 == 1
+#   undef int64_t
+typedef long int gl_int64_t;
+#   define int64_t gl_int64_t
+#   define GL_INT64_T
+#  elif defined _MSC_VER
+#   undef int64_t
+typedef __int64 gl_int64_t;
+#   define int64_t gl_int64_t
+#   define GL_INT64_T
+#  elif @HAVE_LONG_LONG_INT@
+#   undef int64_t
+typedef long long int gl_int64_t;
+#   define int64_t gl_int64_t
+#   define GL_INT64_T
+#  endif
+# endif
+
+# ifdef UINT64_MAX
+#  define GL_UINT64_T
+# else
+#  if ULONG_MAX >> 31 >> 31 >> 1 == 1
+#   undef uint64_t
+typedef unsigned long int gl_uint64_t;
+#   define uint64_t gl_uint64_t
+#   define GL_UINT64_T
+#  elif defined _MSC_VER
+#   undef uint64_t
+typedef unsigned __int64 gl_uint64_t;
+#   define uint64_t gl_uint64_t
+#   define GL_UINT64_T
+#  elif @HAVE_UNSIGNED_LONG_LONG_INT@
+#   undef uint64_t
+typedef unsigned long long int gl_uint64_t;
+#   define uint64_t gl_uint64_t
+#   define GL_UINT64_T
+#  endif
+# endif
+
+/* Avoid collision with Solaris 2.5.1 <pthread.h> etc.  */
+# define _UINT8_T
+# define _UINT32_T
+# define _UINT64_T
+
+
+/* 7.18.1.2. Minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+   types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
+   are the same as the corresponding N_t types.  */
+
+# undef int_least8_t
+# undef uint_least8_t
+# undef int_least16_t
+# undef uint_least16_t
+# undef int_least32_t
+# undef uint_least32_t
+# undef int_least64_t
+# undef uint_least64_t
+# define int_least8_t int8_t
+# define uint_least8_t uint8_t
+# define int_least16_t int16_t
+# define uint_least16_t uint16_t
+# define int_least32_t int32_t
+# define uint_least32_t uint32_t
+# ifdef GL_INT64_T
+#  define int_least64_t int64_t
+# endif
+# ifdef GL_UINT64_T
+#  define uint_least64_t uint64_t
+# endif
+
+/* 7.18.1.3. Fastest minimum-width integer types */
+
+/* Note: Other <stdint.h> substitutes may define these types differently.
+   It is not recommended to use these types in public header files. */
+
+/* Here we assume a standard architecture where the hardware integer
+   types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
+   are taken from the same list of types.  The following code normally
+   uses types consistent with glibc, as that lessens the chance of
+   incompatibility with older GNU hosts.  */
+
+# undef int_fast8_t
+# undef uint_fast8_t
+# undef int_fast16_t
+# undef uint_fast16_t
+# undef int_fast32_t
+# undef uint_fast32_t
+# undef int_fast64_t
+# undef uint_fast64_t
+typedef signed char gl_int_fast8_t;
+typedef unsigned char gl_uint_fast8_t;
+
+# ifdef __sun
+/* Define types compatible with SunOS 5.10, so that code compiled under
+   earlier SunOS versions works with code compiled under SunOS 5.10.  */
+typedef int gl_int_fast32_t;
+typedef unsigned int gl_uint_fast32_t;
+# else
+typedef long int gl_int_fast32_t;
+typedef unsigned long int gl_uint_fast32_t;
+# endif
+typedef gl_int_fast32_t gl_int_fast16_t;
+typedef gl_uint_fast32_t gl_uint_fast16_t;
+
+# define int_fast8_t gl_int_fast8_t
+# define uint_fast8_t gl_uint_fast8_t
+# define int_fast16_t gl_int_fast16_t
+# define uint_fast16_t gl_uint_fast16_t
+# define int_fast32_t gl_int_fast32_t
+# define uint_fast32_t gl_uint_fast32_t
+# ifdef GL_INT64_T
+#  define int_fast64_t int64_t
+# endif
+# ifdef GL_UINT64_T
+#  define uint_fast64_t uint64_t
+# endif
+
+/* 7.18.1.4. Integer types capable of holding object pointers */
+
+/* kLIBC's stdint.h defines _INTPTR_T_DECLARED and needs its own
+   definitions of intptr_t and uintptr_t (which use int and unsigned)
+   to avoid clashes with declarations of system functions like sbrk.  */
+# ifndef _INTPTR_T_DECLARED
+# undef intptr_t
+# undef uintptr_t
+typedef long int gl_intptr_t;
+typedef unsigned long int gl_uintptr_t;
+# define intptr_t gl_intptr_t
+# define uintptr_t gl_uintptr_t
+# endif
+
+/* 7.18.1.5. Greatest-width integer types */
+
+/* Note: These types are compiler dependent. It may be unwise to use them in
+   public header files. */
+
+/* If the system defines INTMAX_MAX, assume that intmax_t works, and
+   similarly for UINTMAX_MAX and uintmax_t.  This avoids problems with
+   assuming one type where another is used by the system.  */
+
+# ifndef INTMAX_MAX
+#  undef INTMAX_C
+#  undef intmax_t
+#  if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+typedef long long int gl_intmax_t;
+#   define intmax_t gl_intmax_t
+#  elif defined GL_INT64_T
+#   define intmax_t int64_t
+#  else
+typedef long int gl_intmax_t;
+#   define intmax_t gl_intmax_t
+#  endif
+# endif
+
+# ifndef UINTMAX_MAX
+#  undef UINTMAX_C
+#  undef uintmax_t
+#  if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+typedef unsigned long long int gl_uintmax_t;
+#   define uintmax_t gl_uintmax_t
+#  elif defined GL_UINT64_T
+#   define uintmax_t uint64_t
+#  else
+typedef unsigned long int gl_uintmax_t;
+#   define uintmax_t gl_uintmax_t
+#  endif
+# endif
+
+/* Verify that intmax_t and uintmax_t have the same size.  Too much code
+   breaks if this is not the case.  If this check fails, the reason is likely
+   to be found in the autoconf macros.  */
+typedef int _verify_intmax_size[sizeof (intmax_t) == sizeof (uintmax_t)
+                                ? 1 : -1];
+
+# define GNULIB_defined_stdint_types 1
+# endif /* !GNULIB_defined_stdint_types */
+
+/* 7.18.2. Limits of specified-width integer types */
+
+/* 7.18.2.1. Limits of exact-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+   types have 8, 16, 32, optionally 64 bits.  */
+
+# undef INT8_MIN
+# undef INT8_MAX
+# undef UINT8_MAX
+# define INT8_MIN  (~ INT8_MAX)
+# define INT8_MAX  127
+# define UINT8_MAX  255
+
+# undef INT16_MIN
+# undef INT16_MAX
+# undef UINT16_MAX
+# define INT16_MIN  (~ INT16_MAX)
+# define INT16_MAX  32767
+# define UINT16_MAX  65535
+
+# undef INT32_MIN
+# undef INT32_MAX
+# undef UINT32_MAX
+# define INT32_MIN  (~ INT32_MAX)
+# define INT32_MAX  2147483647
+# define UINT32_MAX  4294967295U
+
+# if defined GL_INT64_T && ! defined INT64_MAX
+/* Prefer (- INTMAX_C (1) << 63) over (~ INT64_MAX) because SunPRO C 5.0
+   evaluates the latter incorrectly in preprocessor expressions.  */
+#  define INT64_MIN  (- INTMAX_C (1) << 63)
+#  define INT64_MAX  INTMAX_C (9223372036854775807)
+# endif
+
+# if defined GL_UINT64_T && ! defined UINT64_MAX
+#  define UINT64_MAX  UINTMAX_C (18446744073709551615)
+# endif
+
+/* 7.18.2.2. Limits of minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+   types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
+   are the same as the corresponding N_t types.  */
+
+# undef INT_LEAST8_MIN
+# undef INT_LEAST8_MAX
+# undef UINT_LEAST8_MAX
+# define INT_LEAST8_MIN  INT8_MIN
+# define INT_LEAST8_MAX  INT8_MAX
+# define UINT_LEAST8_MAX  UINT8_MAX
+
+# undef INT_LEAST16_MIN
+# undef INT_LEAST16_MAX
+# undef UINT_LEAST16_MAX
+# define INT_LEAST16_MIN  INT16_MIN
+# define INT_LEAST16_MAX  INT16_MAX
+# define UINT_LEAST16_MAX  UINT16_MAX
+
+# undef INT_LEAST32_MIN
+# undef INT_LEAST32_MAX
+# undef UINT_LEAST32_MAX
+# define INT_LEAST32_MIN  INT32_MIN
+# define INT_LEAST32_MAX  INT32_MAX
+# define UINT_LEAST32_MAX  UINT32_MAX
+
+# undef INT_LEAST64_MIN
+# undef INT_LEAST64_MAX
+# ifdef GL_INT64_T
+#  define INT_LEAST64_MIN  INT64_MIN
+#  define INT_LEAST64_MAX  INT64_MAX
+# endif
+
+# undef UINT_LEAST64_MAX
+# ifdef GL_UINT64_T
+#  define UINT_LEAST64_MAX  UINT64_MAX
+# endif
+
+/* 7.18.2.3. Limits of fastest minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+   types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
+   are taken from the same list of types.  */
+
+# undef INT_FAST8_MIN
+# undef INT_FAST8_MAX
+# undef UINT_FAST8_MAX
+# define INT_FAST8_MIN  SCHAR_MIN
+# define INT_FAST8_MAX  SCHAR_MAX
+# define UINT_FAST8_MAX  UCHAR_MAX
+
+# undef INT_FAST16_MIN
+# undef INT_FAST16_MAX
+# undef UINT_FAST16_MAX
+# define INT_FAST16_MIN  INT_FAST32_MIN
+# define INT_FAST16_MAX  INT_FAST32_MAX
+# define UINT_FAST16_MAX  UINT_FAST32_MAX
+
+# undef INT_FAST32_MIN
+# undef INT_FAST32_MAX
+# undef UINT_FAST32_MAX
+# ifdef __sun
+#  define INT_FAST32_MIN  INT_MIN
+#  define INT_FAST32_MAX  INT_MAX
+#  define UINT_FAST32_MAX  UINT_MAX
+# else
+#  define INT_FAST32_MIN  LONG_MIN
+#  define INT_FAST32_MAX  LONG_MAX
+#  define UINT_FAST32_MAX  ULONG_MAX
+# endif
+
+# undef INT_FAST64_MIN
+# undef INT_FAST64_MAX
+# ifdef GL_INT64_T
+#  define INT_FAST64_MIN  INT64_MIN
+#  define INT_FAST64_MAX  INT64_MAX
+# endif
+
+# undef UINT_FAST64_MAX
+# ifdef GL_UINT64_T
+#  define UINT_FAST64_MAX  UINT64_MAX
+# endif
+
+/* 7.18.2.4. Limits of integer types capable of holding object pointers */
+
+# undef INTPTR_MIN
+# undef INTPTR_MAX
+# undef UINTPTR_MAX
+# define INTPTR_MIN  LONG_MIN
+# define INTPTR_MAX  LONG_MAX
+# define UINTPTR_MAX  ULONG_MAX
+
+/* 7.18.2.5. Limits of greatest-width integer types */
+
+# ifndef INTMAX_MAX
+#  undef INTMAX_MIN
+#  ifdef INT64_MAX
+#   define INTMAX_MIN  INT64_MIN
+#   define INTMAX_MAX  INT64_MAX
+#  else
+#   define INTMAX_MIN  INT32_MIN
+#   define INTMAX_MAX  INT32_MAX
+#  endif
+# endif
+
+# ifndef UINTMAX_MAX
+#  ifdef UINT64_MAX
+#   define UINTMAX_MAX  UINT64_MAX
+#  else
+#   define UINTMAX_MAX  UINT32_MAX
+#  endif
+# endif
+
+/* 7.18.3. Limits of other integer types */
+
+/* ptrdiff_t limits */
+# undef PTRDIFF_MIN
+# undef PTRDIFF_MAX
+# if @APPLE_UNIVERSAL_BUILD@
+#  ifdef _LP64
+#   define PTRDIFF_MIN  _STDINT_SIGNED_MIN (64, 0l)
+#   define PTRDIFF_MAX  _STDINT_MAX (1, 64, 0l)
+#  else
+#   define PTRDIFF_MIN  _STDINT_SIGNED_MIN (32, 0)
+#   define PTRDIFF_MAX  _STDINT_MAX (1, 32, 0)
+#  endif
+# else
+#  define PTRDIFF_MIN  \
+    _STDINT_SIGNED_MIN (@BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
+#  define PTRDIFF_MAX  \
+    _STDINT_MAX (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
+# endif
+
+/* sig_atomic_t limits */
+# undef SIG_ATOMIC_MIN
+# undef SIG_ATOMIC_MAX
+# if @HAVE_SIGNED_SIG_ATOMIC_T@
+#  define SIG_ATOMIC_MIN  \
+    _STDINT_SIGNED_MIN (@BITSIZEOF_SIG_ATOMIC_T@, 0@SIG_ATOMIC_T_SUFFIX@)
+# else
+#  define SIG_ATOMIC_MIN  \
+    _STDINT_UNSIGNED_MIN (@BITSIZEOF_SIG_ATOMIC_T@, 0@SIG_ATOMIC_T_SUFFIX@)
+# endif
+# define SIG_ATOMIC_MAX  \
+   _STDINT_MAX (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \
+                0@SIG_ATOMIC_T_SUFFIX@)
+
+
+/* size_t limit */
+# undef SIZE_MAX
+# if @APPLE_UNIVERSAL_BUILD@
+#  ifdef _LP64
+#   define SIZE_MAX  _STDINT_MAX (0, 64, 0ul)
+#  else
+#   define SIZE_MAX  _STDINT_MAX (0, 32, 0ul)
+#  endif
+# else
+#  define SIZE_MAX  _STDINT_MAX (0, @BITSIZEOF_SIZE_T@, 0@SIZE_T_SUFFIX@)
+# endif
+
+/* wchar_t limits */
+/* Get WCHAR_MIN, WCHAR_MAX.
+   This include is not on the top, above, because on OSF/1 4.0 we have a
+   sequence of nested includes
+   <wchar.h> -> <stdio.h> -> <getopt.h> -> <stdlib.h>, and the latter includes
+   <stdint.h> and assumes its types are already defined.  */
+# if @HAVE_WCHAR_H@ && ! (defined WCHAR_MIN && defined WCHAR_MAX)
+  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+     included before <wchar.h>.  */
+#  include <stddef.h>
+#  include <stdio.h>
+#  include <time.h>
+#  define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
+#  include <wchar.h>
+#  undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
+# endif
+# undef WCHAR_MIN
+# undef WCHAR_MAX
+# if @HAVE_SIGNED_WCHAR_T@
+#  define WCHAR_MIN  \
+    _STDINT_SIGNED_MIN (@BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+# else
+#  define WCHAR_MIN  \
+    _STDINT_UNSIGNED_MIN (@BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+# endif
+# define WCHAR_MAX  \
+   _STDINT_MAX (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+
+/* wint_t limits */
+# undef WINT_MIN
+# undef WINT_MAX
+# if @HAVE_SIGNED_WINT_T@
+#  define WINT_MIN  \
+    _STDINT_SIGNED_MIN (@BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+# else
+#  define WINT_MIN  \
+    _STDINT_UNSIGNED_MIN (@BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+# endif
+# define WINT_MAX  \
+   _STDINT_MAX (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+
+/* 7.18.4. Macros for integer constants */
+
+/* 7.18.4.1. Macros for minimum-width integer constants */
+/* According to ISO C 99 Technical Corrigendum 1 */
+
+/* Here we assume a standard architecture where the hardware integer
+   types have 8, 16, 32, optionally 64 bits, and int is 32 bits.  */
+
+# undef INT8_C
+# undef UINT8_C
+# define INT8_C(x) x
+# define UINT8_C(x) x
+
+# undef INT16_C
+# undef UINT16_C
+# define INT16_C(x) x
+# define UINT16_C(x) x
+
+# undef INT32_C
+# undef UINT32_C
+# define INT32_C(x) x
+# define UINT32_C(x) x ## U
+
+# undef INT64_C
+# undef UINT64_C
+# if LONG_MAX >> 31 >> 31 == 1
+#  define INT64_C(x) x##L
+# elif defined _MSC_VER
+#  define INT64_C(x) x##i64
+# elif @HAVE_LONG_LONG_INT@
+#  define INT64_C(x) x##LL
+# endif
+# if ULONG_MAX >> 31 >> 31 >> 1 == 1
+#  define UINT64_C(x) x##UL
+# elif defined _MSC_VER
+#  define UINT64_C(x) x##ui64
+# elif @HAVE_UNSIGNED_LONG_LONG_INT@
+#  define UINT64_C(x) x##ULL
+# endif
+
+/* 7.18.4.2. Macros for greatest-width integer constants */
+
+# ifndef INTMAX_C
+#  if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+#   define INTMAX_C(x)   x##LL
+#  elif defined GL_INT64_T
+#   define INTMAX_C(x)   INT64_C(x)
+#  else
+#   define INTMAX_C(x)   x##L
+#  endif
+# endif
+
+# ifndef UINTMAX_C
+#  if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+#   define UINTMAX_C(x)  x##ULL
+#  elif defined GL_UINT64_T
+#   define UINTMAX_C(x)  UINT64_C(x)
+#  else
+#   define UINTMAX_C(x)  x##UL
+#  endif
+# endif
+
+#endif /* !@HAVE_C99_STDINT_H@ */
+
+/* Macros specified by ISO/IEC TS 18661-1:2014.  */
+
+#if (!defined UINTMAX_WIDTH \
+     && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__))
+# ifdef INT8_MAX
+#  define INT8_WIDTH _GL_INTEGER_WIDTH (INT8_MIN, INT8_MAX)
+# endif
+# ifdef UINT8_MAX
+#  define UINT8_WIDTH _GL_INTEGER_WIDTH (0, UINT8_MAX)
+# endif
+# ifdef INT16_MAX
+#  define INT16_WIDTH _GL_INTEGER_WIDTH (INT16_MIN, INT16_MAX)
+# endif
+# ifdef UINT16_MAX
+#  define UINT16_WIDTH _GL_INTEGER_WIDTH (0, UINT16_MAX)
+# endif
+# ifdef INT32_MAX
+#  define INT32_WIDTH _GL_INTEGER_WIDTH (INT32_MIN, INT32_MAX)
+# endif
+# ifdef UINT32_MAX
+#  define UINT32_WIDTH _GL_INTEGER_WIDTH (0, UINT32_MAX)
+# endif
+# ifdef INT64_MAX
+#  define INT64_WIDTH _GL_INTEGER_WIDTH (INT64_MIN, INT64_MAX)
+# endif
+# ifdef UINT64_MAX
+#  define UINT64_WIDTH _GL_INTEGER_WIDTH (0, UINT64_MAX)
+# endif
+# define INT_LEAST8_WIDTH _GL_INTEGER_WIDTH (INT_LEAST8_MIN, INT_LEAST8_MAX)
+# define UINT_LEAST8_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST8_MAX)
+# define INT_LEAST16_WIDTH _GL_INTEGER_WIDTH (INT_LEAST16_MIN, INT_LEAST16_MAX)
+# define UINT_LEAST16_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST16_MAX)
+# define INT_LEAST32_WIDTH _GL_INTEGER_WIDTH (INT_LEAST32_MIN, INT_LEAST32_MAX)
+# define UINT_LEAST32_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST32_MAX)
+# define INT_LEAST64_WIDTH _GL_INTEGER_WIDTH (INT_LEAST64_MIN, INT_LEAST64_MAX)
+# define UINT_LEAST64_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST64_MAX)
+# define INT_FAST8_WIDTH _GL_INTEGER_WIDTH (INT_FAST8_MIN, INT_FAST8_MAX)
+# define UINT_FAST8_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST8_MAX)
+# define INT_FAST16_WIDTH _GL_INTEGER_WIDTH (INT_FAST16_MIN, INT_FAST16_MAX)
+# define UINT_FAST16_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST16_MAX)
+# define INT_FAST32_WIDTH _GL_INTEGER_WIDTH (INT_FAST32_MIN, INT_FAST32_MAX)
+# define UINT_FAST32_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST32_MAX)
+# define INT_FAST64_WIDTH _GL_INTEGER_WIDTH (INT_FAST64_MIN, INT_FAST64_MAX)
+# define UINT_FAST64_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST64_MAX)
+# define INTPTR_WIDTH _GL_INTEGER_WIDTH (INTPTR_MIN, INTPTR_MAX)
+# define UINTPTR_WIDTH _GL_INTEGER_WIDTH (0, UINTPTR_MAX)
+# define INTMAX_WIDTH _GL_INTEGER_WIDTH (INTMAX_MIN, INTMAX_MAX)
+# define UINTMAX_WIDTH _GL_INTEGER_WIDTH (0, UINTMAX_MAX)
+# define PTRDIFF_WIDTH _GL_INTEGER_WIDTH (PTRDIFF_MIN, PTRDIFF_MAX)
+# define SIZE_WIDTH _GL_INTEGER_WIDTH (0, SIZE_MAX)
+# define WCHAR_WIDTH _GL_INTEGER_WIDTH (WCHAR_MIN, WCHAR_MAX)
+# ifdef WINT_MAX
+#  define WINT_WIDTH _GL_INTEGER_WIDTH (WINT_MIN, WINT_MAX)
+# endif
+# ifdef SIG_ATOMIC_MAX
+#  define SIG_ATOMIC_WIDTH _GL_INTEGER_WIDTH (SIG_ATOMIC_MIN, SIG_ATOMIC_MAX)
+# endif
+#endif /* !WINT_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */
+
+#endif /* _@GUARD_PREFIX@_STDINT_H */
+#endif /* !(defined __ANDROID__ && ...) */
+#endif /* !defined _@GUARD_PREFIX@_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */
diff --git a/liblouis/gnulib/stdlib.in.h b/liblouis/gnulib/stdlib.in.h
new file mode 100644
index 0000000..b5cf9d3
--- /dev/null
+++ b/liblouis/gnulib/stdlib.in.h
@@ -0,0 +1,992 @@
+/* A GNU-like <stdlib.h>.
+
+   Copyright (C) 1995, 2001-2004, 2006-2017 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_system_stdlib_h || defined __need_malloc_and_calloc
+/* Special invocation conventions inside some gnulib header files,
+   and inside some glibc header files, respectively.  */
+
+#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
+
+#else
+/* Normal invocation convention.  */
+
+#ifndef _@GUARD_PREFIX@_STDLIB_H
+
+/* The include_next requires a split double-inclusion guard.  */
+#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
+
+#ifndef _@GUARD_PREFIX@_STDLIB_H
+#define _@GUARD_PREFIX@_STDLIB_H
+
+/* NetBSD 5.0 mis-defines NULL.  */
+#include <stddef.h>
+
+/* MirBSD 10 defines WEXITSTATUS in <sys/wait.h>, not in <stdlib.h>.  */
+#if @GNULIB_SYSTEM_POSIX@ && !defined WEXITSTATUS
+# include <sys/wait.h>
+#endif
+
+/* Solaris declares getloadavg() in <sys/loadavg.h>.  */
+#if (@GNULIB_GETLOADAVG@ || defined GNULIB_POSIXCHECK) && @HAVE_SYS_LOADAVG_H@
+# include <sys/loadavg.h>
+#endif
+
+/* Native Windows platforms declare mktemp() in <io.h>.  */
+#if 0 && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+# include <io.h>
+#endif
+
+#if @GNULIB_RANDOM_R@
+
+/* OSF/1 5.1 declares 'struct random_data' in <random.h>, which is included
+   from <stdlib.h> if _REENTRANT is defined.  Include it whenever we need
+   'struct random_data'.  */
+# if @HAVE_RANDOM_H@
+#  include <random.h>
+# endif
+
+# if !@HAVE_STRUCT_RANDOM_DATA@ || @REPLACE_RANDOM_R@ || !@HAVE_RANDOM_R@
+#  include <stdint.h>
+# endif
+
+# if !@HAVE_STRUCT_RANDOM_DATA@
+/* Define 'struct random_data'.
+   But allow multiple gnulib generated <stdlib.h> replacements to coexist.  */
+#  if !GNULIB_defined_struct_random_data
+struct random_data
+{
+  int32_t *fptr;                /* Front pointer.  */
+  int32_t *rptr;                /* Rear pointer.  */
+  int32_t *state;               /* Array of state values.  */
+  int rand_type;                /* Type of random number generator.  */
+  int rand_deg;                 /* Degree of random number generator.  */
+  int rand_sep;                 /* Distance between front and rear.  */
+  int32_t *end_ptr;             /* Pointer behind state table.  */
+};
+#   define GNULIB_defined_struct_random_data 1
+#  endif
+# endif
+#endif
+
+#if (@GNULIB_MKSTEMP@ || @GNULIB_MKSTEMPS@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+/* On Mac OS X 10.3, only <unistd.h> declares mkstemp.  */
+/* On Mac OS X 10.5, only <unistd.h> declares mkstemps.  */
+/* On Cygwin 1.7.1, only <unistd.h> declares getsubopt.  */
+/* But avoid namespace pollution on glibc systems and native Windows.  */
+# include <unistd.h>
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __pure__ was added in gcc 2.96.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE /* empty */
+#endif
+
+/* The definition of _Noreturn is copied here.  */
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+
+/* Some systems do not define EXIT_*, despite otherwise supporting C89.  */
+#ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+#endif
+/* Tandem/NSK and other platforms that define EXIT_FAILURE as -1 interfere
+   with proper operation of xargs.  */
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#elif EXIT_FAILURE != 1
+# undef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#endif
+
+
+#if @GNULIB__EXIT@
+/* Terminate the current process with the given return code, without running
+   the 'atexit' handlers.  */
+# if !@HAVE__EXIT@
+_GL_FUNCDECL_SYS (_Exit, _Noreturn void, (int status));
+# endif
+_GL_CXXALIAS_SYS (_Exit, void, (int status));
+_GL_CXXALIASWARN (_Exit);
+#elif defined GNULIB_POSIXCHECK
+# undef _Exit
+# if HAVE_RAW_DECL__EXIT
+_GL_WARN_ON_USE (_Exit, "_Exit is unportable - "
+                 "use gnulib module _Exit for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ATOLL@
+/* Parse a signed decimal integer.
+   Returns the value of the integer.  Errors are not detected.  */
+# if !@HAVE_ATOLL@
+_GL_FUNCDECL_SYS (atoll, long long, (const char *string)
+                                    _GL_ATTRIBUTE_PURE
+                                    _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (atoll, long long, (const char *string));
+_GL_CXXALIASWARN (atoll);
+#elif defined GNULIB_POSIXCHECK
+# undef atoll
+# if HAVE_RAW_DECL_ATOLL
+_GL_WARN_ON_USE (atoll, "atoll is unportable - "
+                 "use gnulib module atoll for portability");
+# endif
+#endif
+
+#if @GNULIB_CALLOC_POSIX@
+# if @REPLACE_CALLOC@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef calloc
+#   define calloc rpl_calloc
+#  endif
+_GL_FUNCDECL_RPL (calloc, void *, (size_t nmemb, size_t size));
+_GL_CXXALIAS_RPL (calloc, void *, (size_t nmemb, size_t size));
+# else
+_GL_CXXALIAS_SYS (calloc, void *, (size_t nmemb, size_t size));
+# endif
+_GL_CXXALIASWARN (calloc);
+#elif defined GNULIB_POSIXCHECK
+# undef calloc
+/* Assume calloc is always declared.  */
+_GL_WARN_ON_USE (calloc, "calloc is not POSIX compliant everywhere - "
+                 "use gnulib module calloc-posix for portability");
+#endif
+
+#if @GNULIB_CANONICALIZE_FILE_NAME@
+# if @REPLACE_CANONICALIZE_FILE_NAME@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define canonicalize_file_name rpl_canonicalize_file_name
+#  endif
+_GL_FUNCDECL_RPL (canonicalize_file_name, char *, (const char *name)
+                                                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (canonicalize_file_name, char *, (const char *name));
+# else
+#  if !@HAVE_CANONICALIZE_FILE_NAME@
+_GL_FUNCDECL_SYS (canonicalize_file_name, char *, (const char *name)
+                                                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (canonicalize_file_name, char *, (const char *name));
+# endif
+_GL_CXXALIASWARN (canonicalize_file_name);
+#elif defined GNULIB_POSIXCHECK
+# undef canonicalize_file_name
+# if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
+_GL_WARN_ON_USE (canonicalize_file_name,
+                 "canonicalize_file_name is unportable - "
+                 "use gnulib module canonicalize-lgpl for portability");
+# endif
+#endif
+
+#if @GNULIB_GETLOADAVG@
+/* Store max(NELEM,3) load average numbers in LOADAVG[].
+   The three numbers are the load average of the last 1 minute, the last 5
+   minutes, and the last 15 minutes, respectively.
+   LOADAVG is an array of NELEM numbers.  */
+# if !@HAVE_DECL_GETLOADAVG@
+_GL_FUNCDECL_SYS (getloadavg, int, (double loadavg[], int nelem)
+                                   _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (getloadavg, int, (double loadavg[], int nelem));
+_GL_CXXALIASWARN (getloadavg);
+#elif defined GNULIB_POSIXCHECK
+# undef getloadavg
+# if HAVE_RAW_DECL_GETLOADAVG
+_GL_WARN_ON_USE (getloadavg, "getloadavg is not portable - "
+                 "use gnulib module getloadavg for portability");
+# endif
+#endif
+
+#if @GNULIB_GETSUBOPT@
+/* Assuming *OPTIONP is a comma separated list of elements of the form
+   "token" or "token=value", getsubopt parses the first of these elements.
+   If the first element refers to a "token" that is member of the given
+   NULL-terminated array of tokens:
+     - It replaces the comma with a NUL byte, updates *OPTIONP to point past
+       the first option and the comma, sets *VALUEP to the value of the
+       element (or NULL if it doesn't contain an "=" sign),
+     - It returns the index of the "token" in the given array of tokens.
+   Otherwise it returns -1, and *OPTIONP and *VALUEP are undefined.
+   For more details see the POSIX:2001 specification.
+   http://www.opengroup.org/susv3xsh/getsubopt.html */
+# if !@HAVE_GETSUBOPT@
+_GL_FUNCDECL_SYS (getsubopt, int,
+                  (char **optionp, char *const *tokens, char **valuep)
+                  _GL_ARG_NONNULL ((1, 2, 3)));
+# endif
+_GL_CXXALIAS_SYS (getsubopt, int,
+                  (char **optionp, char *const *tokens, char **valuep));
+_GL_CXXALIASWARN (getsubopt);
+#elif defined GNULIB_POSIXCHECK
+# undef getsubopt
+# if HAVE_RAW_DECL_GETSUBOPT
+_GL_WARN_ON_USE (getsubopt, "getsubopt is unportable - "
+                 "use gnulib module getsubopt for portability");
+# endif
+#endif
+
+#if @GNULIB_GRANTPT@
+/* Change the ownership and access permission of the slave side of the
+   pseudo-terminal whose master side is specified by FD.  */
+# if !@HAVE_GRANTPT@
+_GL_FUNCDECL_SYS (grantpt, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (grantpt, int, (int fd));
+_GL_CXXALIASWARN (grantpt);
+#elif defined GNULIB_POSIXCHECK
+# undef grantpt
+# if HAVE_RAW_DECL_GRANTPT
+_GL_WARN_ON_USE (grantpt, "grantpt is not portable - "
+                 "use gnulib module grantpt for portability");
+# endif
+#endif
+
+/* If _GL_USE_STDLIB_ALLOC is nonzero, the including module does not
+   rely on GNU or POSIX semantics for malloc and realloc (for example,
+   by never specifying a zero size), so it does not need malloc or
+   realloc to be redefined.  */
+#if @GNULIB_MALLOC_POSIX@
+# if @REPLACE_MALLOC@
+#  if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
+        || _GL_USE_STDLIB_ALLOC)
+#   undef malloc
+#   define malloc rpl_malloc
+#  endif
+_GL_FUNCDECL_RPL (malloc, void *, (size_t size));
+_GL_CXXALIAS_RPL (malloc, void *, (size_t size));
+# else
+_GL_CXXALIAS_SYS (malloc, void *, (size_t size));
+# endif
+_GL_CXXALIASWARN (malloc);
+#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+# undef malloc
+/* Assume malloc is always declared.  */
+_GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - "
+                 "use gnulib module malloc-posix for portability");
+#endif
+
+/* Convert a multibyte character to a wide character.  */
+#if @GNULIB_MBTOWC@
+# if @REPLACE_MBTOWC@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef mbtowc
+#   define mbtowc rpl_mbtowc
+#  endif
+_GL_FUNCDECL_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+_GL_CXXALIAS_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+# else
+_GL_CXXALIAS_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+# endif
+_GL_CXXALIASWARN (mbtowc);
+#endif
+
+#if @GNULIB_MKDTEMP@
+/* Create a unique temporary directory from TEMPLATE.
+   The last six characters of TEMPLATE must be "XXXXXX";
+   they are replaced with a string that makes the directory name unique.
+   Returns TEMPLATE, or a null pointer if it cannot get a unique name.
+   The directory is created mode 700.  */
+# if !@HAVE_MKDTEMP@
+_GL_FUNCDECL_SYS (mkdtemp, char *, (char * /*template*/) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkdtemp, char *, (char * /*template*/));
+_GL_CXXALIASWARN (mkdtemp);
+#elif defined GNULIB_POSIXCHECK
+# undef mkdtemp
+# if HAVE_RAW_DECL_MKDTEMP
+_GL_WARN_ON_USE (mkdtemp, "mkdtemp is unportable - "
+                 "use gnulib module mkdtemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKOSTEMP@
+/* Create a unique temporary file from TEMPLATE.
+   The last six characters of TEMPLATE must be "XXXXXX";
+   they are replaced with a string that makes the file name unique.
+   The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+   and O_TEXT, O_BINARY (defined in "binary-io.h").
+   The file is then created, with the specified flags, ensuring it didn't exist
+   before.
+   The file is created read-write (mask at least 0600 & ~umask), but it may be
+   world-readable and world-writable (mask 0666 & ~umask), depending on the
+   implementation.
+   Returns the open file descriptor if successful, otherwise -1 and errno
+   set.  */
+# if !@HAVE_MKOSTEMP@
+_GL_FUNCDECL_SYS (mkostemp, int, (char * /*template*/, int /*flags*/)
+                                 _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkostemp, int, (char * /*template*/, int /*flags*/));
+_GL_CXXALIASWARN (mkostemp);
+#elif defined GNULIB_POSIXCHECK
+# undef mkostemp
+# if HAVE_RAW_DECL_MKOSTEMP
+_GL_WARN_ON_USE (mkostemp, "mkostemp is unportable - "
+                 "use gnulib module mkostemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKOSTEMPS@
+/* Create a unique temporary file from TEMPLATE.
+   The last six characters of TEMPLATE before a suffix of length
+   SUFFIXLEN must be "XXXXXX";
+   they are replaced with a string that makes the file name unique.
+   The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+   and O_TEXT, O_BINARY (defined in "binary-io.h").
+   The file is then created, with the specified flags, ensuring it didn't exist
+   before.
+   The file is created read-write (mask at least 0600 & ~umask), but it may be
+   world-readable and world-writable (mask 0666 & ~umask), depending on the
+   implementation.
+   Returns the open file descriptor if successful, otherwise -1 and errno
+   set.  */
+# if !@HAVE_MKOSTEMPS@
+_GL_FUNCDECL_SYS (mkostemps, int,
+                  (char * /*template*/, int /*suffixlen*/, int /*flags*/)
+                  _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkostemps, int,
+                  (char * /*template*/, int /*suffixlen*/, int /*flags*/));
+_GL_CXXALIASWARN (mkostemps);
+#elif defined GNULIB_POSIXCHECK
+# undef mkostemps
+# if HAVE_RAW_DECL_MKOSTEMPS
+_GL_WARN_ON_USE (mkostemps, "mkostemps is unportable - "
+                 "use gnulib module mkostemps for portability");
+# endif
+#endif
+
+#if @GNULIB_MKSTEMP@
+/* Create a unique temporary file from TEMPLATE.
+   The last six characters of TEMPLATE must be "XXXXXX";
+   they are replaced with a string that makes the file name unique.
+   The file is then created, ensuring it didn't exist before.
+   The file is created read-write (mask at least 0600 & ~umask), but it may be
+   world-readable and world-writable (mask 0666 & ~umask), depending on the
+   implementation.
+   Returns the open file descriptor if successful, otherwise -1 and errno
+   set.  */
+# if @REPLACE_MKSTEMP@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define mkstemp rpl_mkstemp
+#  endif
+_GL_FUNCDECL_RPL (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mkstemp, int, (char * /*template*/));
+# else
+#  if ! @HAVE_MKSTEMP@
+_GL_FUNCDECL_SYS (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (mkstemp, int, (char * /*template*/));
+# endif
+_GL_CXXALIASWARN (mkstemp);
+#elif defined GNULIB_POSIXCHECK
+# undef mkstemp
+# if HAVE_RAW_DECL_MKSTEMP
+_GL_WARN_ON_USE (mkstemp, "mkstemp is unportable - "
+                 "use gnulib module mkstemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKSTEMPS@
+/* Create a unique temporary file from TEMPLATE.
+   The last six characters of TEMPLATE prior to a suffix of length
+   SUFFIXLEN must be "XXXXXX";
+   they are replaced with a string that makes the file name unique.
+   The file is then created, ensuring it didn't exist before.
+   The file is created read-write (mask at least 0600 & ~umask), but it may be
+   world-readable and world-writable (mask 0666 & ~umask), depending on the
+   implementation.
+   Returns the open file descriptor if successful, otherwise -1 and errno
+   set.  */
+# if !@HAVE_MKSTEMPS@
+_GL_FUNCDECL_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/)
+                                 _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/));
+_GL_CXXALIASWARN (mkstemps);
+#elif defined GNULIB_POSIXCHECK
+# undef mkstemps
+# if HAVE_RAW_DECL_MKSTEMPS
+_GL_WARN_ON_USE (mkstemps, "mkstemps is unportable - "
+                 "use gnulib module mkstemps for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_OPENPT@
+/* Return an FD open to the master side of a pseudo-terminal.  Flags should
+   include O_RDWR, and may also include O_NOCTTY.  */
+# if !@HAVE_POSIX_OPENPT@
+_GL_FUNCDECL_SYS (posix_openpt, int, (int flags));
+# endif
+_GL_CXXALIAS_SYS (posix_openpt, int, (int flags));
+_GL_CXXALIASWARN (posix_openpt);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_openpt
+# if HAVE_RAW_DECL_POSIX_OPENPT
+_GL_WARN_ON_USE (posix_openpt, "posix_openpt is not portable - "
+                 "use gnulib module posix_openpt for portability");
+# endif
+#endif
+
+#if @GNULIB_PTSNAME@
+/* Return the pathname of the pseudo-terminal slave associated with
+   the master FD is open on, or NULL on errors.  */
+# if @REPLACE_PTSNAME@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef ptsname
+#   define ptsname rpl_ptsname
+#  endif
+_GL_FUNCDECL_RPL (ptsname, char *, (int fd));
+_GL_CXXALIAS_RPL (ptsname, char *, (int fd));
+# else
+#  if !@HAVE_PTSNAME@
+_GL_FUNCDECL_SYS (ptsname, char *, (int fd));
+#  endif
+_GL_CXXALIAS_SYS (ptsname, char *, (int fd));
+# endif
+_GL_CXXALIASWARN (ptsname);
+#elif defined GNULIB_POSIXCHECK
+# undef ptsname
+# if HAVE_RAW_DECL_PTSNAME
+_GL_WARN_ON_USE (ptsname, "ptsname is not portable - "
+                 "use gnulib module ptsname for portability");
+# endif
+#endif
+
+#if @GNULIB_PTSNAME_R@
+/* Set the pathname of the pseudo-terminal slave associated with
+   the master FD is open on and return 0, or set errno and return
+   non-zero on errors.  */
+# if @REPLACE_PTSNAME_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef ptsname_r
+#   define ptsname_r rpl_ptsname_r
+#  endif
+_GL_FUNCDECL_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
+_GL_CXXALIAS_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
+# else
+#  if !@HAVE_PTSNAME_R@
+_GL_FUNCDECL_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
+#  endif
+_GL_CXXALIAS_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
+# endif
+_GL_CXXALIASWARN (ptsname_r);
+#elif defined GNULIB_POSIXCHECK
+# undef ptsname_r
+# if HAVE_RAW_DECL_PTSNAME_R
+_GL_WARN_ON_USE (ptsname_r, "ptsname_r is not portable - "
+                 "use gnulib module ptsname_r for portability");
+# endif
+#endif
+
+#if @GNULIB_PUTENV@
+# if @REPLACE_PUTENV@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putenv
+#   define putenv rpl_putenv
+#  endif
+_GL_FUNCDECL_RPL (putenv, int, (char *string) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (putenv, int, (char *string));
+# else
+_GL_CXXALIAS_SYS (putenv, int, (char *string));
+# endif
+_GL_CXXALIASWARN (putenv);
+#endif
+
+#if @GNULIB_QSORT_R@
+/* Sort an array of NMEMB elements, starting at address BASE, each element
+   occupying SIZE bytes, in ascending order according to the comparison
+   function COMPARE.  */
+# if @REPLACE_QSORT_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef qsort_r
+#   define qsort_r rpl_qsort_r
+#  endif
+_GL_FUNCDECL_RPL (qsort_r, void, (void *base, size_t nmemb, size_t size,
+                                  int (*compare) (void const *, void const *,
+                                                  void *),
+                                  void *arg) _GL_ARG_NONNULL ((1, 4)));
+_GL_CXXALIAS_RPL (qsort_r, void, (void *base, size_t nmemb, size_t size,
+                                  int (*compare) (void const *, void const *,
+                                                  void *),
+                                  void *arg));
+# else
+#  if !@HAVE_QSORT_R@
+_GL_FUNCDECL_SYS (qsort_r, void, (void *base, size_t nmemb, size_t size,
+                                  int (*compare) (void const *, void const *,
+                                                  void *),
+                                  void *arg) _GL_ARG_NONNULL ((1, 4)));
+#  endif
+_GL_CXXALIAS_SYS (qsort_r, void, (void *base, size_t nmemb, size_t size,
+                                  int (*compare) (void const *, void const *,
+                                                  void *),
+                                  void *arg));
+# endif
+_GL_CXXALIASWARN (qsort_r);
+#elif defined GNULIB_POSIXCHECK
+# undef qsort_r
+# if HAVE_RAW_DECL_QSORT_R
+_GL_WARN_ON_USE (qsort_r, "qsort_r is not portable - "
+                 "use gnulib module qsort_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RANDOM_R@
+# if !@HAVE_RANDOM_R@
+#  ifndef RAND_MAX
+#   define RAND_MAX 2147483647
+#  endif
+# endif
+#endif
+
+
+#if @GNULIB_RANDOM@
+# if !@HAVE_RANDOM@
+_GL_FUNCDECL_SYS (random, long, (void));
+# endif
+_GL_CXXALIAS_SYS (random, long, (void));
+_GL_CXXALIASWARN (random);
+#elif defined GNULIB_POSIXCHECK
+# undef random
+# if HAVE_RAW_DECL_RANDOM
+_GL_WARN_ON_USE (random, "random is unportable - "
+                 "use gnulib module random for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM@
+# if !@HAVE_RANDOM@
+_GL_FUNCDECL_SYS (srandom, void, (unsigned int seed));
+# endif
+_GL_CXXALIAS_SYS (srandom, void, (unsigned int seed));
+_GL_CXXALIASWARN (srandom);
+#elif defined GNULIB_POSIXCHECK
+# undef srandom
+# if HAVE_RAW_DECL_SRANDOM
+_GL_WARN_ON_USE (srandom, "srandom is unportable - "
+                 "use gnulib module random for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM@
+# if !@HAVE_RANDOM@
+_GL_FUNCDECL_SYS (initstate, char *,
+                  (unsigned int seed, char *buf, size_t buf_size)
+                  _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (initstate, char *,
+                  (unsigned int seed, char *buf, size_t buf_size));
+_GL_CXXALIASWARN (initstate);
+#elif defined GNULIB_POSIXCHECK
+# undef initstate
+# if HAVE_RAW_DECL_INITSTATE_R
+_GL_WARN_ON_USE (initstate, "initstate is unportable - "
+                 "use gnulib module random for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM@
+# if !@HAVE_RANDOM@
+_GL_FUNCDECL_SYS (setstate, char *, (char *arg_state) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (setstate, char *, (char *arg_state));
+_GL_CXXALIASWARN (setstate);
+#elif defined GNULIB_POSIXCHECK
+# undef setstate
+# if HAVE_RAW_DECL_SETSTATE_R
+_GL_WARN_ON_USE (setstate, "setstate is unportable - "
+                 "use gnulib module random for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef random_r
+#   define random_r rpl_random_r
+#  endif
+_GL_FUNCDECL_RPL (random_r, int, (struct random_data *buf, int32_t *result)
+                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (random_r, int, (struct random_data *buf, int32_t *result));
+# else
+#  if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (random_r, int, (struct random_data *buf, int32_t *result)
+                                 _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (random_r, int, (struct random_data *buf, int32_t *result));
+# endif
+_GL_CXXALIASWARN (random_r);
+#elif defined GNULIB_POSIXCHECK
+# undef random_r
+# if HAVE_RAW_DECL_RANDOM_R
+_GL_WARN_ON_USE (random_r, "random_r is unportable - "
+                 "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef srandom_r
+#   define srandom_r rpl_srandom_r
+#  endif
+_GL_FUNCDECL_RPL (srandom_r, int,
+                  (unsigned int seed, struct random_data *rand_state)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (srandom_r, int,
+                  (unsigned int seed, struct random_data *rand_state));
+# else
+#  if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (srandom_r, int,
+                  (unsigned int seed, struct random_data *rand_state)
+                  _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (srandom_r, int,
+                  (unsigned int seed, struct random_data *rand_state));
+# endif
+_GL_CXXALIASWARN (srandom_r);
+#elif defined GNULIB_POSIXCHECK
+# undef srandom_r
+# if HAVE_RAW_DECL_SRANDOM_R
+_GL_WARN_ON_USE (srandom_r, "srandom_r is unportable - "
+                 "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef initstate_r
+#   define initstate_r rpl_initstate_r
+#  endif
+_GL_FUNCDECL_RPL (initstate_r, int,
+                  (unsigned int seed, char *buf, size_t buf_size,
+                   struct random_data *rand_state)
+                  _GL_ARG_NONNULL ((2, 4)));
+_GL_CXXALIAS_RPL (initstate_r, int,
+                  (unsigned int seed, char *buf, size_t buf_size,
+                   struct random_data *rand_state));
+# else
+#  if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (initstate_r, int,
+                  (unsigned int seed, char *buf, size_t buf_size,
+                   struct random_data *rand_state)
+                  _GL_ARG_NONNULL ((2, 4)));
+#  endif
+_GL_CXXALIAS_SYS (initstate_r, int,
+                  (unsigned int seed, char *buf, size_t buf_size,
+                   struct random_data *rand_state));
+# endif
+_GL_CXXALIASWARN (initstate_r);
+#elif defined GNULIB_POSIXCHECK
+# undef initstate_r
+# if HAVE_RAW_DECL_INITSTATE_R
+_GL_WARN_ON_USE (initstate_r, "initstate_r is unportable - "
+                 "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef setstate_r
+#   define setstate_r rpl_setstate_r
+#  endif
+_GL_FUNCDECL_RPL (setstate_r, int,
+                  (char *arg_state, struct random_data *rand_state)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (setstate_r, int,
+                  (char *arg_state, struct random_data *rand_state));
+# else
+#  if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (setstate_r, int,
+                  (char *arg_state, struct random_data *rand_state)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (setstate_r, int,
+                  (char *arg_state, struct random_data *rand_state));
+# endif
+_GL_CXXALIASWARN (setstate_r);
+#elif defined GNULIB_POSIXCHECK
+# undef setstate_r
+# if HAVE_RAW_DECL_SETSTATE_R
+_GL_WARN_ON_USE (setstate_r, "setstate_r is unportable - "
+                 "use gnulib module random_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_REALLOC_POSIX@
+# if @REPLACE_REALLOC@
+#  if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
+        || _GL_USE_STDLIB_ALLOC)
+#   undef realloc
+#   define realloc rpl_realloc
+#  endif
+_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size));
+_GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size));
+# else
+_GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size));
+# endif
+_GL_CXXALIASWARN (realloc);
+#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+# undef realloc
+/* Assume realloc is always declared.  */
+_GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - "
+                 "use gnulib module realloc-posix for portability");
+#endif
+
+#if @GNULIB_REALPATH@
+# if @REPLACE_REALPATH@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define realpath rpl_realpath
+#  endif
+_GL_FUNCDECL_RPL (realpath, char *, (const char *name, char *resolved)
+                                    _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (realpath, char *, (const char *name, char *resolved));
+# else
+#  if !@HAVE_REALPATH@
+_GL_FUNCDECL_SYS (realpath, char *, (const char *name, char *resolved)
+                                    _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (realpath, char *, (const char *name, char *resolved));
+# endif
+_GL_CXXALIASWARN (realpath);
+#elif defined GNULIB_POSIXCHECK
+# undef realpath
+# if HAVE_RAW_DECL_REALPATH
+_GL_WARN_ON_USE (realpath, "realpath is unportable - use gnulib module "
+                 "canonicalize or canonicalize-lgpl for portability");
+# endif
+#endif
+
+#if @GNULIB_RPMATCH@
+/* Test a user response to a question.
+   Return 1 if it is affirmative, 0 if it is negative, or -1 if not clear.  */
+# if !@HAVE_RPMATCH@
+_GL_FUNCDECL_SYS (rpmatch, int, (const char *response) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (rpmatch, int, (const char *response));
+_GL_CXXALIASWARN (rpmatch);
+#elif defined GNULIB_POSIXCHECK
+# undef rpmatch
+# if HAVE_RAW_DECL_RPMATCH
+_GL_WARN_ON_USE (rpmatch, "rpmatch is unportable - "
+                 "use gnulib module rpmatch for portability");
+# endif
+#endif
+
+#if @GNULIB_SECURE_GETENV@
+/* Look up NAME in the environment, returning 0 in insecure situations.  */
+# if !@HAVE_SECURE_GETENV@
+_GL_FUNCDECL_SYS (secure_getenv, char *,
+                  (char const *name) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (secure_getenv, char *, (char const *name));
+_GL_CXXALIASWARN (secure_getenv);
+#elif defined GNULIB_POSIXCHECK
+# undef secure_getenv
+# if HAVE_RAW_DECL_SECURE_GETENV
+_GL_WARN_ON_USE (secure_getenv, "secure_getenv is unportable - "
+                 "use gnulib module secure_getenv for portability");
+# endif
+#endif
+
+#if @GNULIB_SETENV@
+/* Set NAME to VALUE in the environment.
+   If REPLACE is nonzero, overwrite an existing value.  */
+# if @REPLACE_SETENV@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef setenv
+#   define setenv rpl_setenv
+#  endif
+_GL_FUNCDECL_RPL (setenv, int,
+                  (const char *name, const char *value, int replace)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (setenv, int,
+                  (const char *name, const char *value, int replace));
+# else
+#  if !@HAVE_DECL_SETENV@
+_GL_FUNCDECL_SYS (setenv, int,
+                  (const char *name, const char *value, int replace)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (setenv, int,
+                  (const char *name, const char *value, int replace));
+# endif
+# if !(@REPLACE_SETENV@ && !@HAVE_DECL_SETENV@)
+_GL_CXXALIASWARN (setenv);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef setenv
+# if HAVE_RAW_DECL_SETENV
+_GL_WARN_ON_USE (setenv, "setenv is unportable - "
+                 "use gnulib module setenv for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOD@
+ /* Parse a double from STRING, updating ENDP if appropriate.  */
+# if @REPLACE_STRTOD@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtod rpl_strtod
+#  endif
+_GL_FUNCDECL_RPL (strtod, double, (const char *str, char **endp)
+                                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtod, double, (const char *str, char **endp));
+# else
+#  if !@HAVE_STRTOD@
+_GL_FUNCDECL_SYS (strtod, double, (const char *str, char **endp)
+                                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strtod, double, (const char *str, char **endp));
+# endif
+_GL_CXXALIASWARN (strtod);
+#elif defined GNULIB_POSIXCHECK
+# undef strtod
+# if HAVE_RAW_DECL_STRTOD
+_GL_WARN_ON_USE (strtod, "strtod is unportable - "
+                 "use gnulib module strtod for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOLL@
+/* Parse a signed integer whose textual representation starts at STRING.
+   The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+   it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+   "0x").
+   If ENDPTR is not NULL, the address of the first byte after the integer is
+   stored in *ENDPTR.
+   Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set
+   to ERANGE.  */
+# if !@HAVE_STRTOLL@
+_GL_FUNCDECL_SYS (strtoll, long long,
+                  (const char *string, char **endptr, int base)
+                  _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtoll, long long,
+                  (const char *string, char **endptr, int base));
+_GL_CXXALIASWARN (strtoll);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoll
+# if HAVE_RAW_DECL_STRTOLL
+_GL_WARN_ON_USE (strtoll, "strtoll is unportable - "
+                 "use gnulib module strtoll for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOULL@
+/* Parse an unsigned integer whose textual representation starts at STRING.
+   The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+   it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+   "0x").
+   If ENDPTR is not NULL, the address of the first byte after the integer is
+   stored in *ENDPTR.
+   Upon overflow, the return value is ULLONG_MAX, and errno is set to
+   ERANGE.  */
+# if !@HAVE_STRTOULL@
+_GL_FUNCDECL_SYS (strtoull, unsigned long long,
+                  (const char *string, char **endptr, int base)
+                  _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtoull, unsigned long long,
+                  (const char *string, char **endptr, int base));
+_GL_CXXALIASWARN (strtoull);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoull
+# if HAVE_RAW_DECL_STRTOULL
+_GL_WARN_ON_USE (strtoull, "strtoull is unportable - "
+                 "use gnulib module strtoull for portability");
+# endif
+#endif
+
+#if @GNULIB_UNLOCKPT@
+/* Unlock the slave side of the pseudo-terminal whose master side is specified
+   by FD, so that it can be opened.  */
+# if !@HAVE_UNLOCKPT@
+_GL_FUNCDECL_SYS (unlockpt, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (unlockpt, int, (int fd));
+_GL_CXXALIASWARN (unlockpt);
+#elif defined GNULIB_POSIXCHECK
+# undef unlockpt
+# if HAVE_RAW_DECL_UNLOCKPT
+_GL_WARN_ON_USE (unlockpt, "unlockpt is not portable - "
+                 "use gnulib module unlockpt for portability");
+# endif
+#endif
+
+#if @GNULIB_UNSETENV@
+/* Remove the variable NAME from the environment.  */
+# if @REPLACE_UNSETENV@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef unsetenv
+#   define unsetenv rpl_unsetenv
+#  endif
+_GL_FUNCDECL_RPL (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (unsetenv, int, (const char *name));
+# else
+#  if !@HAVE_DECL_UNSETENV@
+_GL_FUNCDECL_SYS (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (unsetenv, int, (const char *name));
+# endif
+# if !(@REPLACE_UNSETENV@ && !@HAVE_DECL_UNSETENV@)
+_GL_CXXALIASWARN (unsetenv);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef unsetenv
+# if HAVE_RAW_DECL_UNSETENV
+_GL_WARN_ON_USE (unsetenv, "unsetenv is unportable - "
+                 "use gnulib module unsetenv for portability");
+# endif
+#endif
+
+/* Convert a wide character to a multibyte character.  */
+#if @GNULIB_WCTOMB@
+# if @REPLACE_WCTOMB@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef wctomb
+#   define wctomb rpl_wctomb
+#  endif
+_GL_FUNCDECL_RPL (wctomb, int, (char *s, wchar_t wc));
+_GL_CXXALIAS_RPL (wctomb, int, (char *s, wchar_t wc));
+# else
+_GL_CXXALIAS_SYS (wctomb, int, (char *s, wchar_t wc));
+# endif
+_GL_CXXALIASWARN (wctomb);
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_STDLIB_H */
+#endif /* _@GUARD_PREFIX@_STDLIB_H */
+#endif
diff --git a/liblouis/gnulib/string.in.h b/liblouis/gnulib/string.in.h
new file mode 100644
index 0000000..9a6b311
--- /dev/null
+++ b/liblouis/gnulib/string.in.h
@@ -0,0 +1,1046 @@
+/* A GNU-like <string.h>.
+
+   Copyright (C) 1995-1996, 2001-2017 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined _GL_ALREADY_INCLUDING_STRING_H
+/* Special invocation convention:
+   - On OS X/NetBSD we have a sequence of nested includes
+       <string.h> -> <strings.h> -> "string.h"
+     In this situation system _chk variants due to -D_FORTIFY_SOURCE
+     might be used after any replacements defined here.  */
+
+#@INCLUDE_NEXT@ @NEXT_STRING_H@
+
+#else
+/* Normal invocation convention.  */
+
+#ifndef _@GUARD_PREFIX@_STRING_H
+
+#define _GL_ALREADY_INCLUDING_STRING_H
+
+/* The include_next requires a split double-inclusion guard.  */
+#@INCLUDE_NEXT@ @NEXT_STRING_H@
+
+#undef _GL_ALREADY_INCLUDING_STRING_H
+
+#ifndef _@GUARD_PREFIX@_STRING_H
+#define _@GUARD_PREFIX@_STRING_H
+
+/* NetBSD 5.0 mis-defines NULL.  */
+#include <stddef.h>
+
+/* MirBSD defines mbslen as a macro.  */
+#if @GNULIB_MBSLEN@ && defined __MirBSD__
+# include <wchar.h>
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __pure__ was added in gcc 2.96.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE /* empty */
+#endif
+
+/* NetBSD 5.0 declares strsignal in <unistd.h>, not in <string.h>.  */
+/* But in any case avoid namespace pollution on glibc systems.  */
+#if (@GNULIB_STRSIGNAL@ || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \
+    && ! defined __GLIBC__
+# include <unistd.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+
+/* Find the index of the least-significant set bit.  */
+#if @GNULIB_FFSL@
+# if !@HAVE_FFSL@
+_GL_FUNCDECL_SYS (ffsl, int, (long int i));
+# endif
+_GL_CXXALIAS_SYS (ffsl, int, (long int i));
+_GL_CXXALIASWARN (ffsl);
+#elif defined GNULIB_POSIXCHECK
+# undef ffsl
+# if HAVE_RAW_DECL_FFSL
+_GL_WARN_ON_USE (ffsl, "ffsl is not portable - use the ffsl module");
+# endif
+#endif
+
+
+/* Find the index of the least-significant set bit.  */
+#if @GNULIB_FFSLL@
+# if !@HAVE_FFSLL@
+_GL_FUNCDECL_SYS (ffsll, int, (long long int i));
+# endif
+_GL_CXXALIAS_SYS (ffsll, int, (long long int i));
+_GL_CXXALIASWARN (ffsll);
+#elif defined GNULIB_POSIXCHECK
+# undef ffsll
+# if HAVE_RAW_DECL_FFSLL
+_GL_WARN_ON_USE (ffsll, "ffsll is not portable - use the ffsll module");
+# endif
+#endif
+
+
+/* Return the first instance of C within N bytes of S, or NULL.  */
+#if @GNULIB_MEMCHR@
+# if @REPLACE_MEMCHR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define memchr rpl_memchr
+#  endif
+_GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n)
+                                  _GL_ATTRIBUTE_PURE
+                                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n));
+# else
+#  if ! @HAVE_MEMCHR@
+_GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n)
+                                  _GL_ATTRIBUTE_PURE
+                                  _GL_ARG_NONNULL ((1)));
+#  endif
+  /* On some systems, this function is defined as an overloaded function:
+       extern "C" { const void * std::memchr (const void *, int, size_t); }
+       extern "C++" { void * std::memchr (void *, int, size_t); }  */
+_GL_CXXALIAS_SYS_CAST2 (memchr,
+                        void *, (void const *__s, int __c, size_t __n),
+                        void const *, (void const *__s, int __c, size_t __n));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (memchr, void *, (void *__s, int __c, size_t __n));
+_GL_CXXALIASWARN1 (memchr, void const *,
+                   (void const *__s, int __c, size_t __n));
+# else
+_GL_CXXALIASWARN (memchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef memchr
+/* Assume memchr is always declared.  */
+_GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - "
+                 "use gnulib module memchr for portability" );
+#endif
+
+/* Return the first occurrence of NEEDLE in HAYSTACK.  */
+#if @GNULIB_MEMMEM@
+# if @REPLACE_MEMMEM@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define memmem rpl_memmem
+#  endif
+_GL_FUNCDECL_RPL (memmem, void *,
+                  (void const *__haystack, size_t __haystack_len,
+                   void const *__needle, size_t __needle_len)
+                  _GL_ATTRIBUTE_PURE
+                  _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (memmem, void *,
+                  (void const *__haystack, size_t __haystack_len,
+                   void const *__needle, size_t __needle_len));
+# else
+#  if ! @HAVE_DECL_MEMMEM@
+_GL_FUNCDECL_SYS (memmem, void *,
+                  (void const *__haystack, size_t __haystack_len,
+                   void const *__needle, size_t __needle_len)
+                  _GL_ATTRIBUTE_PURE
+                  _GL_ARG_NONNULL ((1, 3)));
+#  endif
+_GL_CXXALIAS_SYS (memmem, void *,
+                  (void const *__haystack, size_t __haystack_len,
+                   void const *__needle, size_t __needle_len));
+# endif
+_GL_CXXALIASWARN (memmem);
+#elif defined GNULIB_POSIXCHECK
+# undef memmem
+# if HAVE_RAW_DECL_MEMMEM
+_GL_WARN_ON_USE (memmem, "memmem is unportable and often quadratic - "
+                 "use gnulib module memmem-simple for portability, "
+                 "and module memmem for speed" );
+# endif
+#endif
+
+/* Copy N bytes of SRC to DEST, return pointer to bytes after the
+   last written byte.  */
+#if @GNULIB_MEMPCPY@
+# if ! @HAVE_MEMPCPY@
+_GL_FUNCDECL_SYS (mempcpy, void *,
+                  (void *restrict __dest, void const *restrict __src,
+                   size_t __n)
+                  _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (mempcpy, void *,
+                  (void *restrict __dest, void const *restrict __src,
+                   size_t __n));
+_GL_CXXALIASWARN (mempcpy);
+#elif defined GNULIB_POSIXCHECK
+# undef mempcpy
+# if HAVE_RAW_DECL_MEMPCPY
+_GL_WARN_ON_USE (mempcpy, "mempcpy is unportable - "
+                 "use gnulib module mempcpy for portability");
+# endif
+#endif
+
+/* Search backwards through a block for a byte (specified as an int).  */
+#if @GNULIB_MEMRCHR@
+# if ! @HAVE_DECL_MEMRCHR@
+_GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1)));
+# endif
+  /* On some systems, this function is defined as an overloaded function:
+       extern "C++" { const void * std::memrchr (const void *, int, size_t); }
+       extern "C++" { void * std::memrchr (void *, int, size_t); }  */
+_GL_CXXALIAS_SYS_CAST2 (memrchr,
+                        void *, (void const *, int, size_t),
+                        void const *, (void const *, int, size_t));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (memrchr, void *, (void *, int, size_t));
+_GL_CXXALIASWARN1 (memrchr, void const *, (void const *, int, size_t));
+# else
+_GL_CXXALIASWARN (memrchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef memrchr
+# if HAVE_RAW_DECL_MEMRCHR
+_GL_WARN_ON_USE (memrchr, "memrchr is unportable - "
+                 "use gnulib module memrchr for portability");
+# endif
+#endif
+
+/* Find the first occurrence of C in S.  More efficient than
+   memchr(S,C,N), at the expense of undefined behavior if C does not
+   occur within N bytes.  */
+#if @GNULIB_RAWMEMCHR@
+# if ! @HAVE_RAWMEMCHR@
+_GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in)
+                                     _GL_ATTRIBUTE_PURE
+                                     _GL_ARG_NONNULL ((1)));
+# endif
+  /* On some systems, this function is defined as an overloaded function:
+       extern "C++" { const void * std::rawmemchr (const void *, int); }
+       extern "C++" { void * std::rawmemchr (void *, int); }  */
+_GL_CXXALIAS_SYS_CAST2 (rawmemchr,
+                        void *, (void const *__s, int __c_in),
+                        void const *, (void const *__s, int __c_in));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (rawmemchr, void *, (void *__s, int __c_in));
+_GL_CXXALIASWARN1 (rawmemchr, void const *, (void const *__s, int __c_in));
+# else
+_GL_CXXALIASWARN (rawmemchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef rawmemchr
+# if HAVE_RAW_DECL_RAWMEMCHR
+_GL_WARN_ON_USE (rawmemchr, "rawmemchr is unportable - "
+                 "use gnulib module rawmemchr for portability");
+# endif
+#endif
+
+/* Copy SRC to DST, returning the address of the terminating '\0' in DST.  */
+#if @GNULIB_STPCPY@
+# if ! @HAVE_STPCPY@
+_GL_FUNCDECL_SYS (stpcpy, char *,
+                  (char *restrict __dst, char const *restrict __src)
+                  _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (stpcpy, char *,
+                  (char *restrict __dst, char const *restrict __src));
+_GL_CXXALIASWARN (stpcpy);
+#elif defined GNULIB_POSIXCHECK
+# undef stpcpy
+# if HAVE_RAW_DECL_STPCPY
+_GL_WARN_ON_USE (stpcpy, "stpcpy is unportable - "
+                 "use gnulib module stpcpy for portability");
+# endif
+#endif
+
+/* Copy no more than N bytes of SRC to DST, returning a pointer past the
+   last non-NUL byte written into DST.  */
+#if @GNULIB_STPNCPY@
+# if @REPLACE_STPNCPY@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef stpncpy
+#   define stpncpy rpl_stpncpy
+#  endif
+_GL_FUNCDECL_RPL (stpncpy, char *,
+                  (char *restrict __dst, char const *restrict __src,
+                   size_t __n)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (stpncpy, char *,
+                  (char *restrict __dst, char const *restrict __src,
+                   size_t __n));
+# else
+#  if ! @HAVE_STPNCPY@
+_GL_FUNCDECL_SYS (stpncpy, char *,
+                  (char *restrict __dst, char const *restrict __src,
+                   size_t __n)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (stpncpy, char *,
+                  (char *restrict __dst, char const *restrict __src,
+                   size_t __n));
+# endif
+_GL_CXXALIASWARN (stpncpy);
+#elif defined GNULIB_POSIXCHECK
+# undef stpncpy
+# if HAVE_RAW_DECL_STPNCPY
+_GL_WARN_ON_USE (stpncpy, "stpncpy is unportable - "
+                 "use gnulib module stpncpy for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strchr() does not work with multibyte strings if the locale encoding is
+   GB18030 and the character to be searched is a digit.  */
+# undef strchr
+/* Assume strchr is always declared.  */
+_GL_WARN_ON_USE (strchr, "strchr cannot work correctly on character strings "
+                 "in some multibyte locales - "
+                 "use mbschr if you care about internationalization");
+#endif
+
+/* Find the first occurrence of C in S or the final NUL byte.  */
+#if @GNULIB_STRCHRNUL@
+# if @REPLACE_STRCHRNUL@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strchrnul rpl_strchrnul
+#  endif
+_GL_FUNCDECL_RPL (strchrnul, char *, (const char *__s, int __c_in)
+                                     _GL_ATTRIBUTE_PURE
+                                     _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strchrnul, char *,
+                  (const char *str, int ch));
+# else
+#  if ! @HAVE_STRCHRNUL@
+_GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in)
+                                     _GL_ATTRIBUTE_PURE
+                                     _GL_ARG_NONNULL ((1)));
+#  endif
+  /* On some systems, this function is defined as an overloaded function:
+       extern "C++" { const char * std::strchrnul (const char *, int); }
+       extern "C++" { char * std::strchrnul (char *, int); }  */
+_GL_CXXALIAS_SYS_CAST2 (strchrnul,
+                        char *, (char const *__s, int __c_in),
+                        char const *, (char const *__s, int __c_in));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strchrnul, char *, (char *__s, int __c_in));
+_GL_CXXALIASWARN1 (strchrnul, char const *, (char const *__s, int __c_in));
+# else
+_GL_CXXALIASWARN (strchrnul);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strchrnul
+# if HAVE_RAW_DECL_STRCHRNUL
+_GL_WARN_ON_USE (strchrnul, "strchrnul is unportable - "
+                 "use gnulib module strchrnul for portability");
+# endif
+#endif
+
+/* Duplicate S, returning an identical malloc'd string.  */
+#if @GNULIB_STRDUP@
+# if @REPLACE_STRDUP@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strdup
+#   define strdup rpl_strdup
+#  endif
+_GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strdup, char *, (char const *__s));
+# else
+#  if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
+    /* strdup exists as a function and as a macro.  Get rid of the macro.  */
+#   undef strdup
+#  endif
+#  if !(@HAVE_DECL_STRDUP@ || defined strdup)
+_GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
+# endif
+_GL_CXXALIASWARN (strdup);
+#elif defined GNULIB_POSIXCHECK
+# undef strdup
+# if HAVE_RAW_DECL_STRDUP
+_GL_WARN_ON_USE (strdup, "strdup is unportable - "
+                 "use gnulib module strdup for portability");
+# endif
+#endif
+
+/* Append no more than N characters from SRC onto DEST.  */
+#if @GNULIB_STRNCAT@
+# if @REPLACE_STRNCAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strncat
+#   define strncat rpl_strncat
+#  endif
+_GL_FUNCDECL_RPL (strncat, char *, (char *dest, const char *src, size_t n)
+                                   _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strncat, char *, (char *dest, const char *src, size_t n));
+# else
+_GL_CXXALIAS_SYS (strncat, char *, (char *dest, const char *src, size_t n));
+# endif
+_GL_CXXALIASWARN (strncat);
+#elif defined GNULIB_POSIXCHECK
+# undef strncat
+# if HAVE_RAW_DECL_STRNCAT
+_GL_WARN_ON_USE (strncat, "strncat is unportable - "
+                 "use gnulib module strncat for portability");
+# endif
+#endif
+
+/* Return a newly allocated copy of at most N bytes of STRING.  */
+#if @GNULIB_STRNDUP@
+# if @REPLACE_STRNDUP@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strndup
+#   define strndup rpl_strndup
+#  endif
+_GL_FUNCDECL_RPL (strndup, char *, (char const *__s, size_t __n)
+                                   _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strndup, char *, (char const *__s, size_t __n));
+# else
+#  if ! @HAVE_DECL_STRNDUP@
+_GL_FUNCDECL_SYS (strndup, char *, (char const *__s, size_t __n)
+                                   _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strndup, char *, (char const *__s, size_t __n));
+# endif
+_GL_CXXALIASWARN (strndup);
+#elif defined GNULIB_POSIXCHECK
+# undef strndup
+# if HAVE_RAW_DECL_STRNDUP
+_GL_WARN_ON_USE (strndup, "strndup is unportable - "
+                 "use gnulib module strndup for portability");
+# endif
+#endif
+
+/* Find the length (number of bytes) of STRING, but scan at most
+   MAXLEN bytes.  If no '\0' terminator is found in that many bytes,
+   return MAXLEN.  */
+#if @GNULIB_STRNLEN@
+# if @REPLACE_STRNLEN@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strnlen
+#   define strnlen rpl_strnlen
+#  endif
+_GL_FUNCDECL_RPL (strnlen, size_t, (char const *__s, size_t __maxlen)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strnlen, size_t, (char const *__s, size_t __maxlen));
+# else
+#  if ! @HAVE_DECL_STRNLEN@
+_GL_FUNCDECL_SYS (strnlen, size_t, (char const *__s, size_t __maxlen)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strnlen, size_t, (char const *__s, size_t __maxlen));
+# endif
+_GL_CXXALIASWARN (strnlen);
+#elif defined GNULIB_POSIXCHECK
+# undef strnlen
+# if HAVE_RAW_DECL_STRNLEN
+_GL_WARN_ON_USE (strnlen, "strnlen is unportable - "
+                 "use gnulib module strnlen for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strcspn() assumes the second argument is a list of single-byte characters.
+   Even in this simple case, it does not work with multibyte strings if the
+   locale encoding is GB18030 and one of the characters to be searched is a
+   digit.  */
+# undef strcspn
+/* Assume strcspn is always declared.  */
+_GL_WARN_ON_USE (strcspn, "strcspn cannot work correctly on character strings "
+                 "in multibyte locales - "
+                 "use mbscspn if you care about internationalization");
+#endif
+
+/* Find the first occurrence in S of any character in ACCEPT.  */
+#if @GNULIB_STRPBRK@
+# if ! @HAVE_STRPBRK@
+_GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1, 2)));
+# endif
+  /* On some systems, this function is defined as an overloaded function:
+       extern "C" { const char * strpbrk (const char *, const char *); }
+       extern "C++" { char * strpbrk (char *, const char *); }  */
+_GL_CXXALIAS_SYS_CAST2 (strpbrk,
+                        char *, (char const *__s, char const *__accept),
+                        const char *, (char const *__s, char const *__accept));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strpbrk, char *, (char *__s, char const *__accept));
+_GL_CXXALIASWARN1 (strpbrk, char const *,
+                   (char const *__s, char const *__accept));
+# else
+_GL_CXXALIASWARN (strpbrk);
+# endif
+# if defined GNULIB_POSIXCHECK
+/* strpbrk() assumes the second argument is a list of single-byte characters.
+   Even in this simple case, it does not work with multibyte strings if the
+   locale encoding is GB18030 and one of the characters to be searched is a
+   digit.  */
+#  undef strpbrk
+_GL_WARN_ON_USE (strpbrk, "strpbrk cannot work correctly on character strings "
+                 "in multibyte locales - "
+                 "use mbspbrk if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strpbrk
+# if HAVE_RAW_DECL_STRPBRK
+_GL_WARN_ON_USE (strpbrk, "strpbrk is unportable - "
+                 "use gnulib module strpbrk for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strspn() assumes the second argument is a list of single-byte characters.
+   Even in this simple case, it cannot work with multibyte strings.  */
+# undef strspn
+/* Assume strspn is always declared.  */
+_GL_WARN_ON_USE (strspn, "strspn cannot work correctly on character strings "
+                 "in multibyte locales - "
+                 "use mbsspn if you care about internationalization");
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strrchr() does not work with multibyte strings if the locale encoding is
+   GB18030 and the character to be searched is a digit.  */
+# undef strrchr
+/* Assume strrchr is always declared.  */
+_GL_WARN_ON_USE (strrchr, "strrchr cannot work correctly on character strings "
+                 "in some multibyte locales - "
+                 "use mbsrchr if you care about internationalization");
+#endif
+
+/* Search the next delimiter (char listed in DELIM) starting at *STRINGP.
+   If one is found, overwrite it with a NUL, and advance *STRINGP
+   to point to the next char after it.  Otherwise, set *STRINGP to NULL.
+   If *STRINGP was already NULL, nothing happens.
+   Return the old value of *STRINGP.
+
+   This is a variant of strtok() that is multithread-safe and supports
+   empty fields.
+
+   Caveat: It modifies the original string.
+   Caveat: These functions cannot be used on constant strings.
+   Caveat: The identity of the delimiting character is lost.
+   Caveat: It doesn't work with multibyte strings unless all of the delimiter
+           characters are ASCII characters < 0x30.
+
+   See also strtok_r().  */
+#if @GNULIB_STRSEP@
+# if ! @HAVE_STRSEP@
+_GL_FUNCDECL_SYS (strsep, char *,
+                  (char **restrict __stringp, char const *restrict __delim)
+                  _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (strsep, char *,
+                  (char **restrict __stringp, char const *restrict __delim));
+_GL_CXXALIASWARN (strsep);
+# if defined GNULIB_POSIXCHECK
+#  undef strsep
+_GL_WARN_ON_USE (strsep, "strsep cannot work correctly on character strings "
+                 "in multibyte locales - "
+                 "use mbssep if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strsep
+# if HAVE_RAW_DECL_STRSEP
+_GL_WARN_ON_USE (strsep, "strsep is unportable - "
+                 "use gnulib module strsep for portability");
+# endif
+#endif
+
+#if @GNULIB_STRSTR@
+# if @REPLACE_STRSTR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strstr rpl_strstr
+#  endif
+_GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle)
+                                  _GL_ATTRIBUTE_PURE
+                                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle));
+# else
+  /* On some systems, this function is defined as an overloaded function:
+       extern "C++" { const char * strstr (const char *, const char *); }
+       extern "C++" { char * strstr (char *, const char *); }  */
+_GL_CXXALIAS_SYS_CAST2 (strstr,
+                        char *, (const char *haystack, const char *needle),
+                        const char *, (const char *haystack, const char *needle));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strstr, char *, (char *haystack, const char *needle));
+_GL_CXXALIASWARN1 (strstr, const char *,
+                   (const char *haystack, const char *needle));
+# else
+_GL_CXXALIASWARN (strstr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+/* strstr() does not work with multibyte strings if the locale encoding is
+   different from UTF-8:
+   POSIX says that it operates on "strings", and "string" in POSIX is defined
+   as a sequence of bytes, not of characters.  */
+# undef strstr
+/* Assume strstr is always declared.  */
+_GL_WARN_ON_USE (strstr, "strstr is quadratic on many systems, and cannot "
+                 "work correctly on character strings in most "
+                 "multibyte locales - "
+                 "use mbsstr if you care about internationalization, "
+                 "or use strstr if you care about speed");
+#endif
+
+/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
+   comparison.  */
+#if @GNULIB_STRCASESTR@
+# if @REPLACE_STRCASESTR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strcasestr rpl_strcasestr
+#  endif
+_GL_FUNCDECL_RPL (strcasestr, char *,
+                  (const char *haystack, const char *needle)
+                  _GL_ATTRIBUTE_PURE
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strcasestr, char *,
+                  (const char *haystack, const char *needle));
+# else
+#  if ! @HAVE_STRCASESTR@
+_GL_FUNCDECL_SYS (strcasestr, char *,
+                  (const char *haystack, const char *needle)
+                  _GL_ATTRIBUTE_PURE
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+  /* On some systems, this function is defined as an overloaded function:
+       extern "C++" { const char * strcasestr (const char *, const char *); }
+       extern "C++" { char * strcasestr (char *, const char *); }  */
+_GL_CXXALIAS_SYS_CAST2 (strcasestr,
+                        char *, (const char *haystack, const char *needle),
+                        const char *, (const char *haystack, const char *needle));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strcasestr, char *, (char *haystack, const char *needle));
+_GL_CXXALIASWARN1 (strcasestr, const char *,
+                   (const char *haystack, const char *needle));
+# else
+_GL_CXXALIASWARN (strcasestr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+/* strcasestr() does not work with multibyte strings:
+   It is a glibc extension, and glibc implements it only for unibyte
+   locales.  */
+# undef strcasestr
+# if HAVE_RAW_DECL_STRCASESTR
+_GL_WARN_ON_USE (strcasestr, "strcasestr does work correctly on character "
+                 "strings in multibyte locales - "
+                 "use mbscasestr if you care about "
+                 "internationalization, or use c-strcasestr if you want "
+                 "a locale independent function");
+# endif
+#endif
+
+/* Parse S into tokens separated by characters in DELIM.
+   If S is NULL, the saved pointer in SAVE_PTR is used as
+   the next starting point.  For example:
+        char s[] = "-abc-=-def";
+        char *sp;
+        x = strtok_r(s, "-", &sp);      // x = "abc", sp = "=-def"
+        x = strtok_r(NULL, "-=", &sp);  // x = "def", sp = NULL
+        x = strtok_r(NULL, "=", &sp);   // x = NULL
+                // s = "abc\0-def\0"
+
+   This is a variant of strtok() that is multithread-safe.
+
+   For the POSIX documentation for this function, see:
+   http://www.opengroup.org/susv3xsh/strtok.html
+
+   Caveat: It modifies the original string.
+   Caveat: These functions cannot be used on constant strings.
+   Caveat: The identity of the delimiting character is lost.
+   Caveat: It doesn't work with multibyte strings unless all of the delimiter
+           characters are ASCII characters < 0x30.
+
+   See also strsep().  */
+#if @GNULIB_STRTOK_R@
+# if @REPLACE_STRTOK_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strtok_r
+#   define strtok_r rpl_strtok_r
+#  endif
+_GL_FUNCDECL_RPL (strtok_r, char *,
+                  (char *restrict s, char const *restrict delim,
+                   char **restrict save_ptr)
+                  _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (strtok_r, char *,
+                  (char *restrict s, char const *restrict delim,
+                   char **restrict save_ptr));
+# else
+#  if @UNDEFINE_STRTOK_R@ || defined GNULIB_POSIXCHECK
+#   undef strtok_r
+#  endif
+#  if ! @HAVE_DECL_STRTOK_R@
+_GL_FUNCDECL_SYS (strtok_r, char *,
+                  (char *restrict s, char const *restrict delim,
+                   char **restrict save_ptr)
+                  _GL_ARG_NONNULL ((2, 3)));
+#  endif
+_GL_CXXALIAS_SYS (strtok_r, char *,
+                  (char *restrict s, char const *restrict delim,
+                   char **restrict save_ptr));
+# endif
+_GL_CXXALIASWARN (strtok_r);
+# if defined GNULIB_POSIXCHECK
+_GL_WARN_ON_USE (strtok_r, "strtok_r cannot work correctly on character "
+                 "strings in multibyte locales - "
+                 "use mbstok_r if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtok_r
+# if HAVE_RAW_DECL_STRTOK_R
+_GL_WARN_ON_USE (strtok_r, "strtok_r is unportable - "
+                 "use gnulib module strtok_r for portability");
+# endif
+#endif
+
+
+/* The following functions are not specified by POSIX.  They are gnulib
+   extensions.  */
+
+#if @GNULIB_MBSLEN@
+/* Return the number of multibyte characters in the character string STRING.
+   This considers multibyte characters, unlike strlen, which counts bytes.  */
+# ifdef __MirBSD__  /* MirBSD defines mbslen as a macro.  Override it.  */
+#  undef mbslen
+# endif
+# if @HAVE_MBSLEN@  /* AIX, OSF/1, MirBSD define mbslen already in libc.  */
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define mbslen rpl_mbslen
+#  endif
+_GL_FUNCDECL_RPL (mbslen, size_t, (const char *string)
+                                  _GL_ATTRIBUTE_PURE
+                                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mbslen, size_t, (const char *string));
+# else
+_GL_FUNCDECL_SYS (mbslen, size_t, (const char *string)
+                                  _GL_ATTRIBUTE_PURE
+                                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (mbslen, size_t, (const char *string));
+# endif
+_GL_CXXALIASWARN (mbslen);
+#endif
+
+#if @GNULIB_MBSNLEN@
+/* Return the number of multibyte characters in the character string starting
+   at STRING and ending at STRING + LEN.  */
+_GL_EXTERN_C size_t mbsnlen (const char *string, size_t len)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1));
+#endif
+
+#if @GNULIB_MBSCHR@
+/* Locate the first single-byte character C in the character string STRING,
+   and return a pointer to it.  Return NULL if C is not found in STRING.
+   Unlike strchr(), this function works correctly in multibyte locales with
+   encodings such as GB18030.  */
+# if defined __hpux
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define mbschr rpl_mbschr /* avoid collision with HP-UX function */
+#  endif
+_GL_FUNCDECL_RPL (mbschr, char *, (const char *string, int c)
+                                  _GL_ATTRIBUTE_PURE
+                                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mbschr, char *, (const char *string, int c));
+# else
+_GL_FUNCDECL_SYS (mbschr, char *, (const char *string, int c)
+                                  _GL_ATTRIBUTE_PURE
+                                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (mbschr, char *, (const char *string, int c));
+# endif
+_GL_CXXALIASWARN (mbschr);
+#endif
+
+#if @GNULIB_MBSRCHR@
+/* Locate the last single-byte character C in the character string STRING,
+   and return a pointer to it.  Return NULL if C is not found in STRING.
+   Unlike strrchr(), this function works correctly in multibyte locales with
+   encodings such as GB18030.  */
+# if defined __hpux || defined __INTERIX
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define mbsrchr rpl_mbsrchr /* avoid collision with system function */
+#  endif
+_GL_FUNCDECL_RPL (mbsrchr, char *, (const char *string, int c)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mbsrchr, char *, (const char *string, int c));
+# else
+_GL_FUNCDECL_SYS (mbsrchr, char *, (const char *string, int c)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (mbsrchr, char *, (const char *string, int c));
+# endif
+_GL_CXXALIASWARN (mbsrchr);
+#endif
+
+#if @GNULIB_MBSSTR@
+/* Find the first occurrence of the character string NEEDLE in the character
+   string HAYSTACK.  Return NULL if NEEDLE is not found in HAYSTACK.
+   Unlike strstr(), this function works correctly in multibyte locales with
+   encodings different from UTF-8.  */
+_GL_EXTERN_C char * mbsstr (const char *haystack, const char *needle)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCASECMP@
+/* Compare the character strings S1 and S2, ignoring case, returning less than,
+   equal to or greater than zero if S1 is lexicographically less than, equal to
+   or greater than S2.
+   Note: This function may, in multibyte locales, return 0 for strings of
+   different lengths!
+   Unlike strcasecmp(), this function works correctly in multibyte locales.  */
+_GL_EXTERN_C int mbscasecmp (const char *s1, const char *s2)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSNCASECMP@
+/* Compare the initial segment of the character string S1 consisting of at most
+   N characters with the initial segment of the character string S2 consisting
+   of at most N characters, ignoring case, returning less than, equal to or
+   greater than zero if the initial segment of S1 is lexicographically less
+   than, equal to or greater than the initial segment of S2.
+   Note: This function may, in multibyte locales, return 0 for initial segments
+   of different lengths!
+   Unlike strncasecmp(), this function works correctly in multibyte locales.
+   But beware that N is not a byte count but a character count!  */
+_GL_EXTERN_C int mbsncasecmp (const char *s1, const char *s2, size_t n)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSPCASECMP@
+/* Compare the initial segment of the character string STRING consisting of
+   at most mbslen (PREFIX) characters with the character string PREFIX,
+   ignoring case.  If the two match, return a pointer to the first byte
+   after this prefix in STRING.  Otherwise, return NULL.
+   Note: This function may, in multibyte locales, return non-NULL if STRING
+   is of smaller length than PREFIX!
+   Unlike strncasecmp(), this function works correctly in multibyte
+   locales.  */
+_GL_EXTERN_C char * mbspcasecmp (const char *string, const char *prefix)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCASESTR@
+/* Find the first occurrence of the character string NEEDLE in the character
+   string HAYSTACK, using case-insensitive comparison.
+   Note: This function may, in multibyte locales, return success even if
+   strlen (haystack) < strlen (needle) !
+   Unlike strcasestr(), this function works correctly in multibyte locales.  */
+_GL_EXTERN_C char * mbscasestr (const char *haystack, const char *needle)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCSPN@
+/* Find the first occurrence in the character string STRING of any character
+   in the character string ACCEPT.  Return the number of bytes from the
+   beginning of the string to this occurrence, or to the end of the string
+   if none exists.
+   Unlike strcspn(), this function works correctly in multibyte locales.  */
+_GL_EXTERN_C size_t mbscspn (const char *string, const char *accept)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSPBRK@
+/* Find the first occurrence in the character string STRING of any character
+   in the character string ACCEPT.  Return the pointer to it, or NULL if none
+   exists.
+   Unlike strpbrk(), this function works correctly in multibyte locales.  */
+# if defined __hpux
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */
+#  endif
+_GL_FUNCDECL_RPL (mbspbrk, char *, (const char *string, const char *accept)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (mbspbrk, char *, (const char *string, const char *accept));
+# else
+_GL_FUNCDECL_SYS (mbspbrk, char *, (const char *string, const char *accept)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_SYS (mbspbrk, char *, (const char *string, const char *accept));
+# endif
+_GL_CXXALIASWARN (mbspbrk);
+#endif
+
+#if @GNULIB_MBSSPN@
+/* Find the first occurrence in the character string STRING of any character
+   not in the character string REJECT.  Return the number of bytes from the
+   beginning of the string to this occurrence, or to the end of the string
+   if none exists.
+   Unlike strspn(), this function works correctly in multibyte locales.  */
+_GL_EXTERN_C size_t mbsspn (const char *string, const char *reject)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSSEP@
+/* Search the next delimiter (multibyte character listed in the character
+   string DELIM) starting at the character string *STRINGP.
+   If one is found, overwrite it with a NUL, and advance *STRINGP to point
+   to the next multibyte character after it.  Otherwise, set *STRINGP to NULL.
+   If *STRINGP was already NULL, nothing happens.
+   Return the old value of *STRINGP.
+
+   This is a variant of mbstok_r() that supports empty fields.
+
+   Caveat: It modifies the original string.
+   Caveat: These functions cannot be used on constant strings.
+   Caveat: The identity of the delimiting character is lost.
+
+   See also mbstok_r().  */
+_GL_EXTERN_C char * mbssep (char **stringp, const char *delim)
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSTOK_R@
+/* Parse the character string STRING into tokens separated by characters in
+   the character string DELIM.
+   If STRING is NULL, the saved pointer in SAVE_PTR is used as
+   the next starting point.  For example:
+        char s[] = "-abc-=-def";
+        char *sp;
+        x = mbstok_r(s, "-", &sp);      // x = "abc", sp = "=-def"
+        x = mbstok_r(NULL, "-=", &sp);  // x = "def", sp = NULL
+        x = mbstok_r(NULL, "=", &sp);   // x = NULL
+                // s = "abc\0-def\0"
+
+   Caveat: It modifies the original string.
+   Caveat: These functions cannot be used on constant strings.
+   Caveat: The identity of the delimiting character is lost.
+
+   See also mbssep().  */
+_GL_EXTERN_C char * mbstok_r (char *string, const char *delim, char **save_ptr)
+     _GL_ARG_NONNULL ((2, 3));
+#endif
+
+/* Map any int, typically from errno, into an error message.  */
+#if @GNULIB_STRERROR@
+# if @REPLACE_STRERROR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strerror
+#   define strerror rpl_strerror
+#  endif
+_GL_FUNCDECL_RPL (strerror, char *, (int));
+_GL_CXXALIAS_RPL (strerror, char *, (int));
+# else
+_GL_CXXALIAS_SYS (strerror, char *, (int));
+# endif
+_GL_CXXALIASWARN (strerror);
+#elif defined GNULIB_POSIXCHECK
+# undef strerror
+/* Assume strerror is always declared.  */
+_GL_WARN_ON_USE (strerror, "strerror is unportable - "
+                 "use gnulib module strerror to guarantee non-NULL result");
+#endif
+
+/* Map any int, typically from errno, into an error message.  Multithread-safe.
+   Uses the POSIX declaration, not the glibc declaration.  */
+#if @GNULIB_STRERROR_R@
+# if @REPLACE_STRERROR_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strerror_r
+#   define strerror_r rpl_strerror_r
+#  endif
+_GL_FUNCDECL_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen)
+                                   _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen));
+# else
+#  if !@HAVE_DECL_STRERROR_R@
+_GL_FUNCDECL_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen)
+                                   _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen));
+# endif
+# if @HAVE_DECL_STRERROR_R@
+_GL_CXXALIASWARN (strerror_r);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strerror_r
+# if HAVE_RAW_DECL_STRERROR_R
+_GL_WARN_ON_USE (strerror_r, "strerror_r is unportable - "
+                 "use gnulib module strerror_r-posix for portability");
+# endif
+#endif
+
+#if @GNULIB_STRSIGNAL@
+# if @REPLACE_STRSIGNAL@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strsignal rpl_strsignal
+#  endif
+_GL_FUNCDECL_RPL (strsignal, char *, (int __sig));
+_GL_CXXALIAS_RPL (strsignal, char *, (int __sig));
+# else
+#  if ! @HAVE_DECL_STRSIGNAL@
+_GL_FUNCDECL_SYS (strsignal, char *, (int __sig));
+#  endif
+/* Need to cast, because on Cygwin 1.5.x systems, the return type is
+   'const char *'.  */
+_GL_CXXALIAS_SYS_CAST (strsignal, char *, (int __sig));
+# endif
+_GL_CXXALIASWARN (strsignal);
+#elif defined GNULIB_POSIXCHECK
+# undef strsignal
+# if HAVE_RAW_DECL_STRSIGNAL
+_GL_WARN_ON_USE (strsignal, "strsignal is unportable - "
+                 "use gnulib module strsignal for portability");
+# endif
+#endif
+
+#if @GNULIB_STRVERSCMP@
+# if !@HAVE_STRVERSCMP@
+_GL_FUNCDECL_SYS (strverscmp, int, (const char *, const char *)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (strverscmp, int, (const char *, const char *));
+_GL_CXXALIASWARN (strverscmp);
+#elif defined GNULIB_POSIXCHECK
+# undef strverscmp
+# if HAVE_RAW_DECL_STRVERSCMP
+_GL_WARN_ON_USE (strverscmp, "strverscmp is unportable - "
+                 "use gnulib module strverscmp for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_STRING_H */
+#endif /* _@GUARD_PREFIX@_STRING_H */
+#endif
diff --git a/liblouis/gnulib/strndup.c b/liblouis/gnulib/strndup.c
new file mode 100644
index 0000000..546e58c
--- /dev/null
+++ b/liblouis/gnulib/strndup.c
@@ -0,0 +1,36 @@
+/* A replacement function, for systems that lack strndup.
+
+   Copyright (C) 1996-1998, 2001-2003, 2005-2007, 2009-2017 Free Software
+   Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by the
+   Free Software Foundation; either version 3, or (at your option) any
+   later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <stdlib.h>
+
+char *
+strndup (char const *s, size_t n)
+{
+  size_t len = strnlen (s, n);
+  char *new = malloc (len + 1);
+
+  if (new == NULL)
+    return NULL;
+
+  new[len] = '\0';
+  return memcpy (new, s, len);
+}
diff --git a/liblouis/gnulib/strnlen.c b/liblouis/gnulib/strnlen.c
new file mode 100644
index 0000000..4cb1ca3
--- /dev/null
+++ b/liblouis/gnulib/strnlen.c
@@ -0,0 +1,30 @@
+/* Find the length of STRING, but scan at most MAXLEN characters.
+   Copyright (C) 2005-2007, 2009-2017 Free Software Foundation, Inc.
+   Written by Simon Josefsson.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include <string.h>
+
+/* Find the length of STRING, but scan at most MAXLEN characters.
+   If no '\0' terminator is found in that many characters, return MAXLEN.  */
+
+size_t
+strnlen (const char *string, size_t maxlen)
+{
+  const char *end = memchr (string, '\0', maxlen);
+  return end ? (size_t) (end - string) : maxlen;
+}
diff --git a/liblouis/gnulib/sys_types.in.h b/liblouis/gnulib/sys_types.in.h
new file mode 100644
index 0000000..30ebfbd
--- /dev/null
+++ b/liblouis/gnulib/sys_types.in.h
@@ -0,0 +1,53 @@
+/* Provide a more complete sys/types.h.
+
+   Copyright (C) 2011-2017 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#ifndef _@GUARD_PREFIX@_SYS_TYPES_H
+
+/* The include_next requires a split double-inclusion guard.  */
+# define _GL_INCLUDING_SYS_TYPES_H
+#@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@
+# undef _GL_INCLUDING_SYS_TYPES_H
+
+#ifndef _@GUARD_PREFIX@_SYS_TYPES_H
+#define _@GUARD_PREFIX@_SYS_TYPES_H
+
+/* Override off_t if Large File Support is requested on native Windows.  */
+#if @WINDOWS_64_BIT_OFF_T@
+/* Same as int64_t in <stdint.h>.  */
+# if defined _MSC_VER
+#  define off_t __int64
+# else
+#  define off_t long long int
+# endif
+/* Indicator, for gnulib internal purposes.  */
+# define _GL_WINDOWS_64_BIT_OFF_T 1
+#endif
+
+/* MSVC 9 defines size_t in <stddef.h>, not in <sys/types.h>.  */
+/* But avoid namespace pollution on glibc systems.  */
+#if ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) \
+    && ! defined __GLIBC__
+# include <stddef.h>
+#endif
+
+#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
+#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
diff --git a/liblouis/gnulib/unistd.c b/liblouis/gnulib/unistd.c
new file mode 100644
index 0000000..72bad1c
--- /dev/null
+++ b/liblouis/gnulib/unistd.c
@@ -0,0 +1,4 @@
+#include <config.h>
+#define _GL_UNISTD_INLINE _GL_EXTERN_INLINE
+#include "unistd.h"
+typedef int dummy;
diff --git a/liblouis/gnulib/unistd.in.h b/liblouis/gnulib/unistd.in.h
new file mode 100644
index 0000000..cb9321e
--- /dev/null
+++ b/liblouis/gnulib/unistd.in.h
@@ -0,0 +1,1590 @@
+/* Substitute for and wrapper around <unistd.h>.
+   Copyright (C) 2003-2017 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _@GUARD_PREFIX@_UNISTD_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#ifdef _GL_INCLUDING_UNISTD_H
+/* Special invocation convention:
+   - On Mac OS X 10.3.9 we have a sequence of nested includes
+     <unistd.h> -> <signal.h> -> <pthread.h> -> <unistd.h>
+     In this situation, the functions are not yet declared, therefore we cannot
+     provide the C++ aliases.  */
+
+#@INCLUDE_NEXT@ @NEXT_UNISTD_H@
+
+#else
+/* Normal invocation convention.  */
+
+/* The include_next requires a split double-inclusion guard.  */
+#if @HAVE_UNISTD_H@
+# define _GL_INCLUDING_UNISTD_H
+# @INCLUDE_NEXT@ @NEXT_UNISTD_H@
+# undef _GL_INCLUDING_UNISTD_H
+#endif
+
+/* Get all possible declarations of gethostname().  */
+#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ \
+  && !defined _GL_INCLUDING_WINSOCK2_H
+# define _GL_INCLUDING_WINSOCK2_H
+# include <winsock2.h>
+# undef _GL_INCLUDING_WINSOCK2_H
+#endif
+
+#if !defined _@GUARD_PREFIX@_UNISTD_H && !defined _GL_INCLUDING_WINSOCK2_H
+#define _@GUARD_PREFIX@_UNISTD_H
+
+/* NetBSD 5.0 mis-defines NULL.  Also get size_t.  */
+#include <stddef.h>
+
+/* mingw doesn't define the SEEK_* or *_FILENO macros in <unistd.h>.  */
+/* MSVC declares 'unlink' in <stdio.h>, not in <unistd.h>.  We must include
+   it before we  #define unlink rpl_unlink.  */
+/* Cygwin 1.7.1 declares symlinkat in <stdio.h>, not in <unistd.h>.  */
+/* But avoid namespace pollution on glibc systems.  */
+#if (!(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET) \
+     || ((@GNULIB_UNLINK@ || defined GNULIB_POSIXCHECK) \
+         && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)) \
+     || ((@GNULIB_SYMLINKAT@ || defined GNULIB_POSIXCHECK) \
+         && defined __CYGWIN__)) \
+    && ! defined __GLIBC__
+# include <stdio.h>
+#endif
+
+/* Cygwin 1.7.1 declares unlinkat in <fcntl.h>, not in <unistd.h>.  */
+/* But avoid namespace pollution on glibc systems.  */
+#if (@GNULIB_UNLINKAT@ || defined GNULIB_POSIXCHECK) && defined __CYGWIN__ \
+    && ! defined __GLIBC__
+# include <fcntl.h>
+#endif
+
+/* mingw fails to declare _exit in <unistd.h>.  */
+/* mingw, MSVC, BeOS, Haiku declare environ in <stdlib.h>, not in
+   <unistd.h>.  */
+/* Solaris declares getcwd not only in <unistd.h> but also in <stdlib.h>.  */
+/* OSF Tru64 Unix cannot see gnulib rpl_strtod when system <stdlib.h> is
+   included here.  */
+/* But avoid namespace pollution on glibc systems.  */
+#if !defined __GLIBC__ && !defined __osf__
+# define __need_system_stdlib_h
+# include <stdlib.h>
+# undef __need_system_stdlib_h
+#endif
+
+/* Native Windows platforms declare chdir, getcwd, rmdir in
+   <io.h> and/or <direct.h>, not in <unistd.h>.
+   They also declare access(), chmod(), close(), dup(), dup2(), isatty(),
+   lseek(), read(), unlink(), write() in <io.h>.  */
+#if ((@GNULIB_CHDIR@ || @GNULIB_GETCWD@ || @GNULIB_RMDIR@ \
+      || defined GNULIB_POSIXCHECK) \
+     && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__))
+# include <io.h>     /* mingw32, mingw64 */
+# include <direct.h> /* mingw64, MSVC 9 */
+#elif (@GNULIB_CLOSE@ || @GNULIB_DUP@ || @GNULIB_DUP2@ || @GNULIB_ISATTY@ \
+       || @GNULIB_LSEEK@ || @GNULIB_READ@ || @GNULIB_UNLINK@ || @GNULIB_WRITE@ \
+       || defined GNULIB_POSIXCHECK) \
+      && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+# include <io.h>
+#endif
+
+/* AIX and OSF/1 5.1 declare getdomainname in <netdb.h>, not in <unistd.h>.
+   NonStop Kernel declares gethostname in <netdb.h>, not in <unistd.h>.  */
+/* But avoid namespace pollution on glibc systems.  */
+#if ((@GNULIB_GETDOMAINNAME@ && (defined _AIX || defined __osf__)) \
+     || (@GNULIB_GETHOSTNAME@ && defined __TANDEM)) \
+    && !defined __GLIBC__
+# include <netdb.h>
+#endif
+
+/* MSVC defines off_t in <sys/types.h>.
+   May also define off_t to a 64-bit type on native Windows.  */
+#if !@HAVE_UNISTD_H@ || @WINDOWS_64_BIT_OFF_T@
+/* Get off_t.  */
+# include <sys/types.h>
+#endif
+
+#if (@GNULIB_READ@ || @GNULIB_WRITE@ \
+     || @GNULIB_READLINK@ || @GNULIB_READLINKAT@ \
+     || @GNULIB_PREAD@ || @GNULIB_PWRITE@ || defined GNULIB_POSIXCHECK)
+/* Get ssize_t.  */
+# include <sys/types.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+
+/* Get getopt(), optarg, optind, opterr, optopt.
+   But avoid namespace pollution on glibc systems.  */
+#if @GNULIB_UNISTD_H_GETOPT@ && !defined __GLIBC__ && !defined _GL_SYSTEM_GETOPT
+# include <getopt-cdefs.h>
+# include <getopt-pfx-core.h>
+#endif
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_UNISTD_INLINE
+# define _GL_UNISTD_INLINE _GL_INLINE
+#endif
+
+/* Hide some function declarations from <winsock2.h>.  */
+
+#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@
+# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef socket
+#   define socket              socket_used_without_including_sys_socket_h
+#   undef connect
+#   define connect             connect_used_without_including_sys_socket_h
+#   undef accept
+#   define accept              accept_used_without_including_sys_socket_h
+#   undef bind
+#   define bind                bind_used_without_including_sys_socket_h
+#   undef getpeername
+#   define getpeername         getpeername_used_without_including_sys_socket_h
+#   undef getsockname
+#   define getsockname         getsockname_used_without_including_sys_socket_h
+#   undef getsockopt
+#   define getsockopt          getsockopt_used_without_including_sys_socket_h
+#   undef listen
+#   define listen              listen_used_without_including_sys_socket_h
+#   undef recv
+#   define recv                recv_used_without_including_sys_socket_h
+#   undef send
+#   define send                send_used_without_including_sys_socket_h
+#   undef recvfrom
+#   define recvfrom            recvfrom_used_without_including_sys_socket_h
+#   undef sendto
+#   define sendto              sendto_used_without_including_sys_socket_h
+#   undef setsockopt
+#   define setsockopt          setsockopt_used_without_including_sys_socket_h
+#   undef shutdown
+#   define shutdown            shutdown_used_without_including_sys_socket_h
+#  else
+    _GL_WARN_ON_USE (socket,
+                     "socket() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (connect,
+                     "connect() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (accept,
+                     "accept() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (bind,
+                     "bind() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (getpeername,
+                     "getpeername() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (getsockname,
+                     "getsockname() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (getsockopt,
+                     "getsockopt() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (listen,
+                     "listen() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (recv,
+                     "recv() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (send,
+                     "send() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (recvfrom,
+                     "recvfrom() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (sendto,
+                     "sendto() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (setsockopt,
+                     "setsockopt() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (shutdown,
+                     "shutdown() used without including <sys/socket.h>");
+#  endif
+# endif
+# if !defined _@GUARD_PREFIX@_SYS_SELECT_H
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef select
+#   define select              select_used_without_including_sys_select_h
+#  else
+    _GL_WARN_ON_USE (select,
+                     "select() used without including <sys/select.h>");
+#  endif
+# endif
+#endif
+
+
+/* OS/2 EMX lacks these macros.  */
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+/* Ensure *_OK macros exist.  */
+#ifndef F_OK
+# define F_OK 0
+# define X_OK 1
+# define W_OK 2
+# define R_OK 4
+#endif
+
+
+/* Declare overridden functions.  */
+
+
+#if defined GNULIB_POSIXCHECK
+/* The access() function is a security risk.  */
+_GL_WARN_ON_USE (access, "the access function is a security risk - "
+                 "use the gnulib module faccessat instead");
+#endif
+
+
+#if @GNULIB_CHDIR@
+_GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIASWARN (chdir);
+#elif defined GNULIB_POSIXCHECK
+# undef chdir
+# if HAVE_RAW_DECL_CHDIR
+_GL_WARN_ON_USE (chown, "chdir is not always in <unistd.h> - "
+                 "use gnulib module chdir for portability");
+# endif
+#endif
+
+
+#if @GNULIB_CHOWN@
+/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
+   to GID (if GID is not -1).  Follow symbolic links.
+   Return 0 if successful, otherwise -1 and errno set.
+   See the POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/chown.html.  */
+# if @REPLACE_CHOWN@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef chown
+#   define chown rpl_chown
+#  endif
+_GL_FUNCDECL_RPL (chown, int, (const char *file, uid_t uid, gid_t gid)
+                              _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (chown, int, (const char *file, uid_t uid, gid_t gid));
+# else
+#  if !@HAVE_CHOWN@
+_GL_FUNCDECL_SYS (chown, int, (const char *file, uid_t uid, gid_t gid)
+                              _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (chown, int, (const char *file, uid_t uid, gid_t gid));
+# endif
+_GL_CXXALIASWARN (chown);
+#elif defined GNULIB_POSIXCHECK
+# undef chown
+# if HAVE_RAW_DECL_CHOWN
+_GL_WARN_ON_USE (chown, "chown fails to follow symlinks on some systems and "
+                 "doesn't treat a uid or gid of -1 on some systems - "
+                 "use gnulib module chown for portability");
+# endif
+#endif
+
+
+#if @GNULIB_CLOSE@
+# if @REPLACE_CLOSE@
+/* Automatically included by modules that need a replacement for close.  */
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef close
+#   define close rpl_close
+#  endif
+_GL_FUNCDECL_RPL (close, int, (int fd));
+_GL_CXXALIAS_RPL (close, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (close, int, (int fd));
+# endif
+_GL_CXXALIASWARN (close);
+#elif @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+# undef close
+# define close close_used_without_requesting_gnulib_module_close
+#elif defined GNULIB_POSIXCHECK
+# undef close
+/* Assume close is always declared.  */
+_GL_WARN_ON_USE (close, "close does not portably work on sockets - "
+                 "use gnulib module close for portability");
+#endif
+
+
+#if @GNULIB_DUP@
+# if @REPLACE_DUP@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define dup rpl_dup
+#  endif
+_GL_FUNCDECL_RPL (dup, int, (int oldfd));
+_GL_CXXALIAS_RPL (dup, int, (int oldfd));
+# else
+_GL_CXXALIAS_SYS (dup, int, (int oldfd));
+# endif
+_GL_CXXALIASWARN (dup);
+#elif defined GNULIB_POSIXCHECK
+# undef dup
+# if HAVE_RAW_DECL_DUP
+_GL_WARN_ON_USE (dup, "dup is unportable - "
+                 "use gnulib module dup for portability");
+# endif
+#endif
+
+
+#if @GNULIB_DUP2@
+/* Copy the file descriptor OLDFD into file descriptor NEWFD.  Do nothing if
+   NEWFD = OLDFD, otherwise close NEWFD first if it is open.
+   Return newfd if successful, otherwise -1 and errno set.
+   See the POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/dup2.html>.  */
+# if @REPLACE_DUP2@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define dup2 rpl_dup2
+#  endif
+_GL_FUNCDECL_RPL (dup2, int, (int oldfd, int newfd));
+_GL_CXXALIAS_RPL (dup2, int, (int oldfd, int newfd));
+# else
+#  if !@HAVE_DUP2@
+_GL_FUNCDECL_SYS (dup2, int, (int oldfd, int newfd));
+#  endif
+_GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
+# endif
+_GL_CXXALIASWARN (dup2);
+#elif defined GNULIB_POSIXCHECK
+# undef dup2
+# if HAVE_RAW_DECL_DUP2
+_GL_WARN_ON_USE (dup2, "dup2 is unportable - "
+                 "use gnulib module dup2 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_DUP3@
+/* Copy the file descriptor OLDFD into file descriptor NEWFD, with the
+   specified flags.
+   The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+   and O_TEXT, O_BINARY (defined in "binary-io.h").
+   Close NEWFD first if it is open.
+   Return newfd if successful, otherwise -1 and errno set.
+   See the Linux man page at
+   <http://www.kernel.org/doc/man-pages/online/pages/man2/dup3.2.html>.  */
+# if @HAVE_DUP3@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define dup3 rpl_dup3
+#  endif
+_GL_FUNCDECL_RPL (dup3, int, (int oldfd, int newfd, int flags));
+_GL_CXXALIAS_RPL (dup3, int, (int oldfd, int newfd, int flags));
+# else
+_GL_FUNCDECL_SYS (dup3, int, (int oldfd, int newfd, int flags));
+_GL_CXXALIAS_SYS (dup3, int, (int oldfd, int newfd, int flags));
+# endif
+_GL_CXXALIASWARN (dup3);
+#elif defined GNULIB_POSIXCHECK
+# undef dup3
+# if HAVE_RAW_DECL_DUP3
+_GL_WARN_ON_USE (dup3, "dup3 is unportable - "
+                 "use gnulib module dup3 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ENVIRON@
+# if !@HAVE_DECL_ENVIRON@
+/* Set of environment variables and values.  An array of strings of the form
+   "VARIABLE=VALUE", terminated with a NULL.  */
+#  if defined __APPLE__ && defined __MACH__
+#   include <TargetConditionals.h>
+#   if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR
+#    define _GL_USE_CRT_EXTERNS
+#   endif
+#  endif
+#  ifdef _GL_USE_CRT_EXTERNS
+#   include <crt_externs.h>
+#   define environ (*_NSGetEnviron ())
+#  else
+#   ifdef __cplusplus
+extern "C" {
+#   endif
+extern char **environ;
+#   ifdef __cplusplus
+}
+#   endif
+#  endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if HAVE_RAW_DECL_ENVIRON
+_GL_UNISTD_INLINE char ***
+rpl_environ (void)
+{
+  return &environ;
+}
+_GL_WARN_ON_USE (rpl_environ, "environ is unportable - "
+                 "use gnulib module environ for portability");
+#  undef environ
+#  define environ (*rpl_environ ())
+# endif
+#endif
+
+
+#if @GNULIB_EUIDACCESS@
+/* Like access(), except that it uses the effective user id and group id of
+   the current process.  */
+# if !@HAVE_EUIDACCESS@
+_GL_FUNCDECL_SYS (euidaccess, int, (const char *filename, int mode)
+                                   _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (euidaccess, int, (const char *filename, int mode));
+_GL_CXXALIASWARN (euidaccess);
+# if defined GNULIB_POSIXCHECK
+/* Like access(), this function is a security risk.  */
+_GL_WARN_ON_USE (euidaccess, "the euidaccess function is a security risk - "
+                 "use the gnulib module faccessat instead");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef euidaccess
+# if HAVE_RAW_DECL_EUIDACCESS
+_GL_WARN_ON_USE (euidaccess, "euidaccess is unportable - "
+                 "use gnulib module euidaccess for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FACCESSAT@
+# if !@HAVE_FACCESSAT@
+_GL_FUNCDECL_SYS (faccessat, int,
+                  (int fd, char const *file, int mode, int flag)
+                  _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (faccessat, int,
+                  (int fd, char const *file, int mode, int flag));
+_GL_CXXALIASWARN (faccessat);
+#elif defined GNULIB_POSIXCHECK
+# undef faccessat
+# if HAVE_RAW_DECL_FACCESSAT
+_GL_WARN_ON_USE (faccessat, "faccessat is not portable - "
+                 "use gnulib module faccessat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FCHDIR@
+/* Change the process' current working directory to the directory on which
+   the given file descriptor is open.
+   Return 0 if successful, otherwise -1 and errno set.
+   See the POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/fchdir.html>.  */
+# if ! @HAVE_FCHDIR@
+_GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/));
+
+/* Gnulib internal hooks needed to maintain the fchdir metadata.  */
+_GL_EXTERN_C int _gl_register_fd (int fd, const char *filename)
+     _GL_ARG_NONNULL ((2));
+_GL_EXTERN_C void _gl_unregister_fd (int fd);
+_GL_EXTERN_C int _gl_register_dup (int oldfd, int newfd);
+_GL_EXTERN_C const char *_gl_directory_name (int fd);
+
+# else
+#  if !@HAVE_DECL_FCHDIR@
+_GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/));
+#  endif
+# endif
+_GL_CXXALIAS_SYS (fchdir, int, (int /*fd*/));
+_GL_CXXALIASWARN (fchdir);
+#elif defined GNULIB_POSIXCHECK
+# undef fchdir
+# if HAVE_RAW_DECL_FCHDIR
+_GL_WARN_ON_USE (fchdir, "fchdir is unportable - "
+                 "use gnulib module fchdir for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FCHOWNAT@
+# if @REPLACE_FCHOWNAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fchownat
+#   define fchownat rpl_fchownat
+#  endif
+_GL_FUNCDECL_RPL (fchownat, int, (int fd, char const *file,
+                                  uid_t owner, gid_t group, int flag)
+                                 _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fchownat, int, (int fd, char const *file,
+                                  uid_t owner, gid_t group, int flag));
+# else
+#  if !@HAVE_FCHOWNAT@
+_GL_FUNCDECL_SYS (fchownat, int, (int fd, char const *file,
+                                  uid_t owner, gid_t group, int flag)
+                                 _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (fchownat, int, (int fd, char const *file,
+                                  uid_t owner, gid_t group, int flag));
+# endif
+_GL_CXXALIASWARN (fchownat);
+#elif defined GNULIB_POSIXCHECK
+# undef fchownat
+# if HAVE_RAW_DECL_FCHOWNAT
+_GL_WARN_ON_USE (fchownat, "fchownat is not portable - "
+                 "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FDATASYNC@
+/* Synchronize changes to a file.
+   Return 0 if successful, otherwise -1 and errno set.
+   See POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/fdatasync.html>.  */
+# if !@HAVE_FDATASYNC@ || !@HAVE_DECL_FDATASYNC@
+_GL_FUNCDECL_SYS (fdatasync, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (fdatasync, int, (int fd));
+_GL_CXXALIASWARN (fdatasync);
+#elif defined GNULIB_POSIXCHECK
+# undef fdatasync
+# if HAVE_RAW_DECL_FDATASYNC
+_GL_WARN_ON_USE (fdatasync, "fdatasync is unportable - "
+                 "use gnulib module fdatasync for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FSYNC@
+/* Synchronize changes, including metadata, to a file.
+   Return 0 if successful, otherwise -1 and errno set.
+   See POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html>.  */
+# if !@HAVE_FSYNC@
+_GL_FUNCDECL_SYS (fsync, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (fsync, int, (int fd));
+_GL_CXXALIASWARN (fsync);
+#elif defined GNULIB_POSIXCHECK
+# undef fsync
+# if HAVE_RAW_DECL_FSYNC
+_GL_WARN_ON_USE (fsync, "fsync is unportable - "
+                 "use gnulib module fsync for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FTRUNCATE@
+/* Change the size of the file to which FD is opened to become equal to LENGTH.
+   Return 0 if successful, otherwise -1 and errno set.
+   See the POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/ftruncate.html>.  */
+# if @REPLACE_FTRUNCATE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef ftruncate
+#   define ftruncate rpl_ftruncate
+#  endif
+_GL_FUNCDECL_RPL (ftruncate, int, (int fd, off_t length));
+_GL_CXXALIAS_RPL (ftruncate, int, (int fd, off_t length));
+# else
+#  if !@HAVE_FTRUNCATE@
+_GL_FUNCDECL_SYS (ftruncate, int, (int fd, off_t length));
+#  endif
+_GL_CXXALIAS_SYS (ftruncate, int, (int fd, off_t length));
+# endif
+_GL_CXXALIASWARN (ftruncate);
+#elif defined GNULIB_POSIXCHECK
+# undef ftruncate
+# if HAVE_RAW_DECL_FTRUNCATE
+_GL_WARN_ON_USE (ftruncate, "ftruncate is unportable - "
+                 "use gnulib module ftruncate for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETCWD@
+/* Get the name of the current working directory, and put it in SIZE bytes
+   of BUF.
+   Return BUF if successful, or NULL if the directory couldn't be determined
+   or SIZE was too small.
+   See the POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html>.
+   Additionally, the gnulib module 'getcwd' guarantees the following GNU
+   extension: If BUF is NULL, an array is allocated with 'malloc'; the array
+   is SIZE bytes long, unless SIZE == 0, in which case it is as big as
+   necessary.  */
+# if @REPLACE_GETCWD@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define getcwd rpl_getcwd
+#  endif
+_GL_FUNCDECL_RPL (getcwd, char *, (char *buf, size_t size));
+_GL_CXXALIAS_RPL (getcwd, char *, (char *buf, size_t size));
+# else
+/* Need to cast, because on mingw, the second parameter is
+                                                   int size.  */
+_GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size));
+# endif
+_GL_CXXALIASWARN (getcwd);
+#elif defined GNULIB_POSIXCHECK
+# undef getcwd
+# if HAVE_RAW_DECL_GETCWD
+_GL_WARN_ON_USE (getcwd, "getcwd is unportable - "
+                 "use gnulib module getcwd for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETDOMAINNAME@
+/* Return the NIS domain name of the machine.
+   WARNING! The NIS domain name is unrelated to the fully qualified host name
+            of the machine.  It is also unrelated to email addresses.
+   WARNING! The NIS domain name is usually the empty string or "(none)" when
+            not using NIS.
+
+   Put up to LEN bytes of the NIS domain name into NAME.
+   Null terminate it if the name is shorter than LEN.
+   If the NIS domain name is longer than LEN, set errno = EINVAL and return -1.
+   Return 0 if successful, otherwise set errno and return -1.  */
+# if @REPLACE_GETDOMAINNAME@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getdomainname
+#   define getdomainname rpl_getdomainname
+#  endif
+_GL_FUNCDECL_RPL (getdomainname, int, (char *name, size_t len)
+                                      _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (getdomainname, int, (char *name, size_t len));
+# else
+#  if !@HAVE_DECL_GETDOMAINNAME@
+_GL_FUNCDECL_SYS (getdomainname, int, (char *name, size_t len)
+                                      _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (getdomainname, int, (char *name, size_t len));
+# endif
+_GL_CXXALIASWARN (getdomainname);
+#elif defined GNULIB_POSIXCHECK
+# undef getdomainname
+# if HAVE_RAW_DECL_GETDOMAINNAME
+_GL_WARN_ON_USE (getdomainname, "getdomainname is unportable - "
+                 "use gnulib module getdomainname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETDTABLESIZE@
+/* Return the maximum number of file descriptors in the current process.
+   In POSIX, this is same as sysconf (_SC_OPEN_MAX).  */
+# if @REPLACE_GETDTABLESIZE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getdtablesize
+#   define getdtablesize rpl_getdtablesize
+#  endif
+_GL_FUNCDECL_RPL (getdtablesize, int, (void));
+_GL_CXXALIAS_RPL (getdtablesize, int, (void));
+# else
+#  if !@HAVE_GETDTABLESIZE@
+_GL_FUNCDECL_SYS (getdtablesize, int, (void));
+#  endif
+_GL_CXXALIAS_SYS (getdtablesize, int, (void));
+# endif
+_GL_CXXALIASWARN (getdtablesize);
+#elif defined GNULIB_POSIXCHECK
+# undef getdtablesize
+# if HAVE_RAW_DECL_GETDTABLESIZE
+_GL_WARN_ON_USE (getdtablesize, "getdtablesize is unportable - "
+                 "use gnulib module getdtablesize for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETGROUPS@
+/* Return the supplemental groups that the current process belongs to.
+   It is unspecified whether the effective group id is in the list.
+   If N is 0, return the group count; otherwise, N describes how many
+   entries are available in GROUPS.  Return -1 and set errno if N is
+   not 0 and not large enough.  Fails with ENOSYS on some systems.  */
+# if @REPLACE_GETGROUPS@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getgroups
+#   define getgroups rpl_getgroups
+#  endif
+_GL_FUNCDECL_RPL (getgroups, int, (int n, gid_t *groups));
+_GL_CXXALIAS_RPL (getgroups, int, (int n, gid_t *groups));
+# else
+#  if !@HAVE_GETGROUPS@
+_GL_FUNCDECL_SYS (getgroups, int, (int n, gid_t *groups));
+#  endif
+_GL_CXXALIAS_SYS (getgroups, int, (int n, gid_t *groups));
+# endif
+_GL_CXXALIASWARN (getgroups);
+#elif defined GNULIB_POSIXCHECK
+# undef getgroups
+# if HAVE_RAW_DECL_GETGROUPS
+_GL_WARN_ON_USE (getgroups, "getgroups is unportable - "
+                 "use gnulib module getgroups for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETHOSTNAME@
+/* Return the standard host name of the machine.
+   WARNING! The host name may or may not be fully qualified.
+
+   Put up to LEN bytes of the host name into NAME.
+   Null terminate it if the name is shorter than LEN.
+   If the host name is longer than LEN, set errno = EINVAL and return -1.
+   Return 0 if successful, otherwise set errno and return -1.  */
+# if @UNISTD_H_HAVE_WINSOCK2_H@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef gethostname
+#   define gethostname rpl_gethostname
+#  endif
+_GL_FUNCDECL_RPL (gethostname, int, (char *name, size_t len)
+                                    _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (gethostname, int, (char *name, size_t len));
+# else
+#  if !@HAVE_GETHOSTNAME@
+_GL_FUNCDECL_SYS (gethostname, int, (char *name, size_t len)
+                                    _GL_ARG_NONNULL ((1)));
+#  endif
+/* Need to cast, because on Solaris 10 and OSF/1 5.1 systems, the second
+   parameter is
+                                                      int len.  */
+_GL_CXXALIAS_SYS_CAST (gethostname, int, (char *name, size_t len));
+# endif
+_GL_CXXALIASWARN (gethostname);
+#elif @UNISTD_H_HAVE_WINSOCK2_H@
+# undef gethostname
+# define gethostname gethostname_used_without_requesting_gnulib_module_gethostname
+#elif defined GNULIB_POSIXCHECK
+# undef gethostname
+# if HAVE_RAW_DECL_GETHOSTNAME
+_GL_WARN_ON_USE (gethostname, "gethostname is unportable - "
+                 "use gnulib module gethostname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETLOGIN@
+/* Returns the user's login name, or NULL if it cannot be found.  Upon error,
+   returns NULL with errno set.
+
+   See <http://www.opengroup.org/susv3xsh/getlogin.html>.
+
+   Most programs don't need to use this function, because the information is
+   available through environment variables:
+     ${LOGNAME-$USER}        on Unix platforms,
+     $USERNAME               on native Windows platforms.
+ */
+# if !@HAVE_DECL_GETLOGIN@
+_GL_FUNCDECL_SYS (getlogin, char *, (void));
+# endif
+_GL_CXXALIAS_SYS (getlogin, char *, (void));
+_GL_CXXALIASWARN (getlogin);
+#elif defined GNULIB_POSIXCHECK
+# undef getlogin
+# if HAVE_RAW_DECL_GETLOGIN
+_GL_WARN_ON_USE (getlogin, "getlogin is unportable - "
+                 "use gnulib module getlogin for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETLOGIN_R@
+/* Copies the user's login name to NAME.
+   The array pointed to by NAME has room for SIZE bytes.
+
+   Returns 0 if successful.  Upon error, an error number is returned, or -1 in
+   the case that the login name cannot be found but no specific error is
+   provided (this case is hopefully rare but is left open by the POSIX spec).
+
+   See <http://www.opengroup.org/susv3xsh/getlogin.html>.
+
+   Most programs don't need to use this function, because the information is
+   available through environment variables:
+     ${LOGNAME-$USER}        on Unix platforms,
+     $USERNAME               on native Windows platforms.
+ */
+# if @REPLACE_GETLOGIN_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define getlogin_r rpl_getlogin_r
+#  endif
+_GL_FUNCDECL_RPL (getlogin_r, int, (char *name, size_t size)
+                                   _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (getlogin_r, int, (char *name, size_t size));
+# else
+#  if !@HAVE_DECL_GETLOGIN_R@
+_GL_FUNCDECL_SYS (getlogin_r, int, (char *name, size_t size)
+                                   _GL_ARG_NONNULL ((1)));
+#  endif
+/* Need to cast, because on Solaris 10 systems, the second argument is
+                                                     int size.  */
+_GL_CXXALIAS_SYS_CAST (getlogin_r, int, (char *name, size_t size));
+# endif
+_GL_CXXALIASWARN (getlogin_r);
+#elif defined GNULIB_POSIXCHECK
+# undef getlogin_r
+# if HAVE_RAW_DECL_GETLOGIN_R
+_GL_WARN_ON_USE (getlogin_r, "getlogin_r is unportable - "
+                 "use gnulib module getlogin_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETPAGESIZE@
+# if @REPLACE_GETPAGESIZE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define getpagesize rpl_getpagesize
+#  endif
+_GL_FUNCDECL_RPL (getpagesize, int, (void));
+_GL_CXXALIAS_RPL (getpagesize, int, (void));
+# else
+#  if !@HAVE_GETPAGESIZE@
+#   if !defined getpagesize
+/* This is for POSIX systems.  */
+#    if !defined _gl_getpagesize && defined _SC_PAGESIZE
+#     if ! (defined __VMS && __VMS_VER < 70000000)
+#      define _gl_getpagesize() sysconf (_SC_PAGESIZE)
+#     endif
+#    endif
+/* This is for older VMS.  */
+#    if !defined _gl_getpagesize && defined __VMS
+#     ifdef __ALPHA
+#      define _gl_getpagesize() 8192
+#     else
+#      define _gl_getpagesize() 512
+#     endif
+#    endif
+/* This is for BeOS.  */
+#    if !defined _gl_getpagesize && @HAVE_OS_H@
+#     include <OS.h>
+#     if defined B_PAGE_SIZE
+#      define _gl_getpagesize() B_PAGE_SIZE
+#     endif
+#    endif
+/* This is for AmigaOS4.0.  */
+#    if !defined _gl_getpagesize && defined __amigaos4__
+#     define _gl_getpagesize() 2048
+#    endif
+/* This is for older Unix systems.  */
+#    if !defined _gl_getpagesize && @HAVE_SYS_PARAM_H@
+#     include <sys/param.h>
+#     ifdef EXEC_PAGESIZE
+#      define _gl_getpagesize() EXEC_PAGESIZE
+#     else
+#      ifdef NBPG
+#       ifndef CLSIZE
+#        define CLSIZE 1
+#       endif
+#       define _gl_getpagesize() (NBPG * CLSIZE)
+#      else
+#       ifdef NBPC
+#        define _gl_getpagesize() NBPC
+#       endif
+#      endif
+#     endif
+#    endif
+#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#     define getpagesize() _gl_getpagesize ()
+#    else
+#     if !GNULIB_defined_getpagesize_function
+_GL_UNISTD_INLINE int
+getpagesize ()
+{
+  return _gl_getpagesize ();
+}
+#      define GNULIB_defined_getpagesize_function 1
+#     endif
+#    endif
+#   endif
+#  endif
+/* Need to cast, because on Cygwin 1.5.x systems, the return type is size_t.  */
+_GL_CXXALIAS_SYS_CAST (getpagesize, int, (void));
+# endif
+# if @HAVE_DECL_GETPAGESIZE@
+_GL_CXXALIASWARN (getpagesize);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getpagesize
+# if HAVE_RAW_DECL_GETPAGESIZE
+_GL_WARN_ON_USE (getpagesize, "getpagesize is unportable - "
+                 "use gnulib module getpagesize for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETUSERSHELL@
+/* Return the next valid login shell on the system, or NULL when the end of
+   the list has been reached.  */
+# if !@HAVE_DECL_GETUSERSHELL@
+_GL_FUNCDECL_SYS (getusershell, char *, (void));
+# endif
+_GL_CXXALIAS_SYS (getusershell, char *, (void));
+_GL_CXXALIASWARN (getusershell);
+#elif defined GNULIB_POSIXCHECK
+# undef getusershell
+# if HAVE_RAW_DECL_GETUSERSHELL
+_GL_WARN_ON_USE (getusershell, "getusershell is unportable - "
+                 "use gnulib module getusershell for portability");
+# endif
+#endif
+
+#if @GNULIB_GETUSERSHELL@
+/* Rewind to pointer that is advanced at each getusershell() call.  */
+# if !@HAVE_DECL_GETUSERSHELL@
+_GL_FUNCDECL_SYS (setusershell, void, (void));
+# endif
+_GL_CXXALIAS_SYS (setusershell, void, (void));
+_GL_CXXALIASWARN (setusershell);
+#elif defined GNULIB_POSIXCHECK
+# undef setusershell
+# if HAVE_RAW_DECL_SETUSERSHELL
+_GL_WARN_ON_USE (setusershell, "setusershell is unportable - "
+                 "use gnulib module getusershell for portability");
+# endif
+#endif
+
+#if @GNULIB_GETUSERSHELL@
+/* Free the pointer that is advanced at each getusershell() call and
+   associated resources.  */
+# if !@HAVE_DECL_GETUSERSHELL@
+_GL_FUNCDECL_SYS (endusershell, void, (void));
+# endif
+_GL_CXXALIAS_SYS (endusershell, void, (void));
+_GL_CXXALIASWARN (endusershell);
+#elif defined GNULIB_POSIXCHECK
+# undef endusershell
+# if HAVE_RAW_DECL_ENDUSERSHELL
+_GL_WARN_ON_USE (endusershell, "endusershell is unportable - "
+                 "use gnulib module getusershell for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GROUP_MEMBER@
+/* Determine whether group id is in calling user's group list.  */
+# if !@HAVE_GROUP_MEMBER@
+_GL_FUNCDECL_SYS (group_member, int, (gid_t gid));
+# endif
+_GL_CXXALIAS_SYS (group_member, int, (gid_t gid));
+_GL_CXXALIASWARN (group_member);
+#elif defined GNULIB_POSIXCHECK
+# undef group_member
+# if HAVE_RAW_DECL_GROUP_MEMBER
+_GL_WARN_ON_USE (group_member, "group_member is unportable - "
+                 "use gnulib module group-member for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ISATTY@
+# if @REPLACE_ISATTY@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef isatty
+#   define isatty rpl_isatty
+#  endif
+_GL_FUNCDECL_RPL (isatty, int, (int fd));
+_GL_CXXALIAS_RPL (isatty, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (isatty, int, (int fd));
+# endif
+_GL_CXXALIASWARN (isatty);
+#elif defined GNULIB_POSIXCHECK
+# undef isatty
+# if HAVE_RAW_DECL_ISATTY
+_GL_WARN_ON_USE (isatty, "isatty has portability problems on native Windows - "
+                 "use gnulib module isatty for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LCHOWN@
+/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
+   to GID (if GID is not -1).  Do not follow symbolic links.
+   Return 0 if successful, otherwise -1 and errno set.
+   See the POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/lchown.html>.  */
+# if @REPLACE_LCHOWN@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef lchown
+#   define lchown rpl_lchown
+#  endif
+_GL_FUNCDECL_RPL (lchown, int, (char const *file, uid_t owner, gid_t group)
+                               _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (lchown, int, (char const *file, uid_t owner, gid_t group));
+# else
+#  if !@HAVE_LCHOWN@
+_GL_FUNCDECL_SYS (lchown, int, (char const *file, uid_t owner, gid_t group)
+                               _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (lchown, int, (char const *file, uid_t owner, gid_t group));
+# endif
+_GL_CXXALIASWARN (lchown);
+#elif defined GNULIB_POSIXCHECK
+# undef lchown
+# if HAVE_RAW_DECL_LCHOWN
+_GL_WARN_ON_USE (lchown, "lchown is unportable to pre-POSIX.1-2001 systems - "
+                 "use gnulib module lchown for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LINK@
+/* Create a new hard link for an existing file.
+   Return 0 if successful, otherwise -1 and errno set.
+   See POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html>.  */
+# if @REPLACE_LINK@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define link rpl_link
+#  endif
+_GL_FUNCDECL_RPL (link, int, (const char *path1, const char *path2)
+                             _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (link, int, (const char *path1, const char *path2));
+# else
+#  if !@HAVE_LINK@
+_GL_FUNCDECL_SYS (link, int, (const char *path1, const char *path2)
+                             _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (link, int, (const char *path1, const char *path2));
+# endif
+_GL_CXXALIASWARN (link);
+#elif defined GNULIB_POSIXCHECK
+# undef link
+# if HAVE_RAW_DECL_LINK
+_GL_WARN_ON_USE (link, "link is unportable - "
+                 "use gnulib module link for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LINKAT@
+/* Create a new hard link for an existing file, relative to two
+   directories.  FLAG controls whether symlinks are followed.
+   Return 0 if successful, otherwise -1 and errno set.  */
+# if @REPLACE_LINKAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef linkat
+#   define linkat rpl_linkat
+#  endif
+_GL_FUNCDECL_RPL (linkat, int,
+                  (int fd1, const char *path1, int fd2, const char *path2,
+                   int flag)
+                  _GL_ARG_NONNULL ((2, 4)));
+_GL_CXXALIAS_RPL (linkat, int,
+                  (int fd1, const char *path1, int fd2, const char *path2,
+                   int flag));
+# else
+#  if !@HAVE_LINKAT@
+_GL_FUNCDECL_SYS (linkat, int,
+                  (int fd1, const char *path1, int fd2, const char *path2,
+                   int flag)
+                  _GL_ARG_NONNULL ((2, 4)));
+#  endif
+_GL_CXXALIAS_SYS (linkat, int,
+                  (int fd1, const char *path1, int fd2, const char *path2,
+                   int flag));
+# endif
+_GL_CXXALIASWARN (linkat);
+#elif defined GNULIB_POSIXCHECK
+# undef linkat
+# if HAVE_RAW_DECL_LINKAT
+_GL_WARN_ON_USE (linkat, "linkat is unportable - "
+                 "use gnulib module linkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LSEEK@
+/* Set the offset of FD relative to SEEK_SET, SEEK_CUR, or SEEK_END.
+   Return the new offset if successful, otherwise -1 and errno set.
+   See the POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/lseek.html>.  */
+# if @REPLACE_LSEEK@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define lseek rpl_lseek
+#  endif
+_GL_FUNCDECL_RPL (lseek, off_t, (int fd, off_t offset, int whence));
+_GL_CXXALIAS_RPL (lseek, off_t, (int fd, off_t offset, int whence));
+# else
+_GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
+# endif
+_GL_CXXALIASWARN (lseek);
+#elif defined GNULIB_POSIXCHECK
+# undef lseek
+# if HAVE_RAW_DECL_LSEEK
+_GL_WARN_ON_USE (lseek, "lseek does not fail with ESPIPE on pipes on some "
+                 "systems - use gnulib module lseek for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PIPE@
+/* Create a pipe, defaulting to O_BINARY mode.
+   Store the read-end as fd[0] and the write-end as fd[1].
+   Return 0 upon success, or -1 with errno set upon failure.  */
+# if !@HAVE_PIPE@
+_GL_FUNCDECL_SYS (pipe, int, (int fd[2]) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (pipe, int, (int fd[2]));
+_GL_CXXALIASWARN (pipe);
+#elif defined GNULIB_POSIXCHECK
+# undef pipe
+# if HAVE_RAW_DECL_PIPE
+_GL_WARN_ON_USE (pipe, "pipe is unportable - "
+                 "use gnulib module pipe-posix for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PIPE2@
+/* Create a pipe, applying the given flags when opening the read-end of the
+   pipe and the write-end of the pipe.
+   The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+   and O_TEXT, O_BINARY (defined in "binary-io.h").
+   Store the read-end as fd[0] and the write-end as fd[1].
+   Return 0 upon success, or -1 with errno set upon failure.
+   See also the Linux man page at
+   <http://www.kernel.org/doc/man-pages/online/pages/man2/pipe2.2.html>.  */
+# if @HAVE_PIPE2@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define pipe2 rpl_pipe2
+#  endif
+_GL_FUNCDECL_RPL (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (pipe2, int, (int fd[2], int flags));
+# else
+_GL_FUNCDECL_SYS (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (pipe2, int, (int fd[2], int flags));
+# endif
+_GL_CXXALIASWARN (pipe2);
+#elif defined GNULIB_POSIXCHECK
+# undef pipe2
+# if HAVE_RAW_DECL_PIPE2
+_GL_WARN_ON_USE (pipe2, "pipe2 is unportable - "
+                 "use gnulib module pipe2 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PREAD@
+/* Read at most BUFSIZE bytes from FD into BUF, starting at OFFSET.
+   Return the number of bytes placed into BUF if successful, otherwise
+   set errno and return -1.  0 indicates EOF.
+   See the POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/pread.html>.  */
+# if @REPLACE_PREAD@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef pread
+#   define pread rpl_pread
+#  endif
+_GL_FUNCDECL_RPL (pread, ssize_t,
+                  (int fd, void *buf, size_t bufsize, off_t offset)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (pread, ssize_t,
+                  (int fd, void *buf, size_t bufsize, off_t offset));
+# else
+#  if !@HAVE_PREAD@
+_GL_FUNCDECL_SYS (pread, ssize_t,
+                  (int fd, void *buf, size_t bufsize, off_t offset)
+                  _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (pread, ssize_t,
+                  (int fd, void *buf, size_t bufsize, off_t offset));
+# endif
+_GL_CXXALIASWARN (pread);
+#elif defined GNULIB_POSIXCHECK
+# undef pread
+# if HAVE_RAW_DECL_PREAD
+_GL_WARN_ON_USE (pread, "pread is unportable - "
+                 "use gnulib module pread for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PWRITE@
+/* Write at most BUFSIZE bytes from BUF into FD, starting at OFFSET.
+   Return the number of bytes written if successful, otherwise
+   set errno and return -1.  0 indicates nothing written.  See the
+   POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite.html>.  */
+# if @REPLACE_PWRITE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef pwrite
+#   define pwrite rpl_pwrite
+#  endif
+_GL_FUNCDECL_RPL (pwrite, ssize_t,
+                  (int fd, const void *buf, size_t bufsize, off_t offset)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (pwrite, ssize_t,
+                  (int fd, const void *buf, size_t bufsize, off_t offset));
+# else
+#  if !@HAVE_PWRITE@
+_GL_FUNCDECL_SYS (pwrite, ssize_t,
+                  (int fd, const void *buf, size_t bufsize, off_t offset)
+                  _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (pwrite, ssize_t,
+                  (int fd, const void *buf, size_t bufsize, off_t offset));
+# endif
+_GL_CXXALIASWARN (pwrite);
+#elif defined GNULIB_POSIXCHECK
+# undef pwrite
+# if HAVE_RAW_DECL_PWRITE
+_GL_WARN_ON_USE (pwrite, "pwrite is unportable - "
+                 "use gnulib module pwrite for portability");
+# endif
+#endif
+
+
+#if @GNULIB_READ@
+/* Read up to COUNT bytes from file descriptor FD into the buffer starting
+   at BUF.  See the POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html>.  */
+# if @REPLACE_READ@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef read
+#   define read rpl_read
+#  endif
+_GL_FUNCDECL_RPL (read, ssize_t, (int fd, void *buf, size_t count)
+                                 _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (read, ssize_t, (int fd, void *buf, size_t count));
+# else
+/* Need to cast, because on mingw, the third parameter is
+                                                          unsigned int count
+   and the return type is 'int'.  */
+_GL_CXXALIAS_SYS_CAST (read, ssize_t, (int fd, void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (read);
+#endif
+
+
+#if @GNULIB_READLINK@
+/* Read the contents of the symbolic link FILE and place the first BUFSIZE
+   bytes of it into BUF.  Return the number of bytes placed into BUF if
+   successful, otherwise -1 and errno set.
+   See the POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html>.  */
+# if @REPLACE_READLINK@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define readlink rpl_readlink
+#  endif
+_GL_FUNCDECL_RPL (readlink, ssize_t,
+                  (const char *file, char *buf, size_t bufsize)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (readlink, ssize_t,
+                  (const char *file, char *buf, size_t bufsize));
+# else
+#  if !@HAVE_READLINK@
+_GL_FUNCDECL_SYS (readlink, ssize_t,
+                  (const char *file, char *buf, size_t bufsize)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (readlink, ssize_t,
+                  (const char *file, char *buf, size_t bufsize));
+# endif
+_GL_CXXALIASWARN (readlink);
+#elif defined GNULIB_POSIXCHECK
+# undef readlink
+# if HAVE_RAW_DECL_READLINK
+_GL_WARN_ON_USE (readlink, "readlink is unportable - "
+                 "use gnulib module readlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_READLINKAT@
+# if @REPLACE_READLINKAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define readlinkat rpl_readlinkat
+#  endif
+_GL_FUNCDECL_RPL (readlinkat, ssize_t,
+                  (int fd, char const *file, char *buf, size_t len)
+                  _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (readlinkat, ssize_t,
+                  (int fd, char const *file, char *buf, size_t len));
+# else
+#  if !@HAVE_READLINKAT@
+_GL_FUNCDECL_SYS (readlinkat, ssize_t,
+                  (int fd, char const *file, char *buf, size_t len)
+                  _GL_ARG_NONNULL ((2, 3)));
+#  endif
+_GL_CXXALIAS_SYS (readlinkat, ssize_t,
+                  (int fd, char const *file, char *buf, size_t len));
+# endif
+_GL_CXXALIASWARN (readlinkat);
+#elif defined GNULIB_POSIXCHECK
+# undef readlinkat
+# if HAVE_RAW_DECL_READLINKAT
+_GL_WARN_ON_USE (readlinkat, "readlinkat is not portable - "
+                 "use gnulib module readlinkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RMDIR@
+/* Remove the directory DIR.  */
+# if @REPLACE_RMDIR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define rmdir rpl_rmdir
+#  endif
+_GL_FUNCDECL_RPL (rmdir, int, (char const *name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (rmdir, int, (char const *name));
+# else
+_GL_CXXALIAS_SYS (rmdir, int, (char const *name));
+# endif
+_GL_CXXALIASWARN (rmdir);
+#elif defined GNULIB_POSIXCHECK
+# undef rmdir
+# if HAVE_RAW_DECL_RMDIR
+_GL_WARN_ON_USE (rmdir, "rmdir is unportable - "
+                 "use gnulib module rmdir for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SETHOSTNAME@
+/* Set the host name of the machine.
+   The host name may or may not be fully qualified.
+
+   Put LEN bytes of NAME into the host name.
+   Return 0 if successful, otherwise, set errno and return -1.
+
+   Platforms with no ability to set the hostname return -1 and set
+   errno = ENOSYS.  */
+# if !@HAVE_SETHOSTNAME@ || !@HAVE_DECL_SETHOSTNAME@
+_GL_FUNCDECL_SYS (sethostname, int, (const char *name, size_t len)
+                                    _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on Solaris 11 2011-10, Mac OS X 10.5, IRIX 6.5
+   and FreeBSD 6.4 the second parameter is int.  On Solaris 11
+   2011-10, the first parameter is not const.  */
+_GL_CXXALIAS_SYS_CAST (sethostname, int, (const char *name, size_t len));
+_GL_CXXALIASWARN (sethostname);
+#elif defined GNULIB_POSIXCHECK
+# undef sethostname
+# if HAVE_RAW_DECL_SETHOSTNAME
+_GL_WARN_ON_USE (sethostname, "sethostname is unportable - "
+                 "use gnulib module sethostname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SLEEP@
+/* Pause the execution of the current thread for N seconds.
+   Returns the number of seconds left to sleep.
+   See the POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/sleep.html>.  */
+# if @REPLACE_SLEEP@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef sleep
+#   define sleep rpl_sleep
+#  endif
+_GL_FUNCDECL_RPL (sleep, unsigned int, (unsigned int n));
+_GL_CXXALIAS_RPL (sleep, unsigned int, (unsigned int n));
+# else
+#  if !@HAVE_SLEEP@
+_GL_FUNCDECL_SYS (sleep, unsigned int, (unsigned int n));
+#  endif
+_GL_CXXALIAS_SYS (sleep, unsigned int, (unsigned int n));
+# endif
+_GL_CXXALIASWARN (sleep);
+#elif defined GNULIB_POSIXCHECK
+# undef sleep
+# if HAVE_RAW_DECL_SLEEP
+_GL_WARN_ON_USE (sleep, "sleep is unportable - "
+                 "use gnulib module sleep for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SYMLINK@
+# if @REPLACE_SYMLINK@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef symlink
+#   define symlink rpl_symlink
+#  endif
+_GL_FUNCDECL_RPL (symlink, int, (char const *contents, char const *file)
+                                _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (symlink, int, (char const *contents, char const *file));
+# else
+#  if !@HAVE_SYMLINK@
+_GL_FUNCDECL_SYS (symlink, int, (char const *contents, char const *file)
+                                _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (symlink, int, (char const *contents, char const *file));
+# endif
+_GL_CXXALIASWARN (symlink);
+#elif defined GNULIB_POSIXCHECK
+# undef symlink
+# if HAVE_RAW_DECL_SYMLINK
+_GL_WARN_ON_USE (symlink, "symlink is not portable - "
+                 "use gnulib module symlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SYMLINKAT@
+# if @REPLACE_SYMLINKAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef symlinkat
+#   define symlinkat rpl_symlinkat
+#  endif
+_GL_FUNCDECL_RPL (symlinkat, int,
+                  (char const *contents, int fd, char const *file)
+                  _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (symlinkat, int,
+                  (char const *contents, int fd, char const *file));
+# else
+#  if !@HAVE_SYMLINKAT@
+_GL_FUNCDECL_SYS (symlinkat, int,
+                  (char const *contents, int fd, char const *file)
+                  _GL_ARG_NONNULL ((1, 3)));
+#  endif
+_GL_CXXALIAS_SYS (symlinkat, int,
+                  (char const *contents, int fd, char const *file));
+# endif
+_GL_CXXALIASWARN (symlinkat);
+#elif defined GNULIB_POSIXCHECK
+# undef symlinkat
+# if HAVE_RAW_DECL_SYMLINKAT
+_GL_WARN_ON_USE (symlinkat, "symlinkat is not portable - "
+                 "use gnulib module symlinkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TTYNAME_R@
+/* Store at most BUFLEN characters of the pathname of the terminal FD is
+   open on in BUF.  Return 0 on success, otherwise an error number.  */
+# if @REPLACE_TTYNAME_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef ttyname_r
+#   define ttyname_r rpl_ttyname_r
+#  endif
+_GL_FUNCDECL_RPL (ttyname_r, int,
+                  (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (ttyname_r, int,
+                  (int fd, char *buf, size_t buflen));
+# else
+#  if !@HAVE_DECL_TTYNAME_R@
+_GL_FUNCDECL_SYS (ttyname_r, int,
+                  (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (ttyname_r, int,
+                  (int fd, char *buf, size_t buflen));
+# endif
+_GL_CXXALIASWARN (ttyname_r);
+#elif defined GNULIB_POSIXCHECK
+# undef ttyname_r
+# if HAVE_RAW_DECL_TTYNAME_R
+_GL_WARN_ON_USE (ttyname_r, "ttyname_r is not portable - "
+                 "use gnulib module ttyname_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_UNLINK@
+# if @REPLACE_UNLINK@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef unlink
+#   define unlink rpl_unlink
+#  endif
+_GL_FUNCDECL_RPL (unlink, int, (char const *file) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (unlink, int, (char const *file));
+# else
+_GL_CXXALIAS_SYS (unlink, int, (char const *file));
+# endif
+_GL_CXXALIASWARN (unlink);
+#elif defined GNULIB_POSIXCHECK
+# undef unlink
+# if HAVE_RAW_DECL_UNLINK
+_GL_WARN_ON_USE (unlink, "unlink is not portable - "
+                 "use gnulib module unlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_UNLINKAT@
+# if @REPLACE_UNLINKAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef unlinkat
+#   define unlinkat rpl_unlinkat
+#  endif
+_GL_FUNCDECL_RPL (unlinkat, int, (int fd, char const *file, int flag)
+                                 _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (unlinkat, int, (int fd, char const *file, int flag));
+# else
+#  if !@HAVE_UNLINKAT@
+_GL_FUNCDECL_SYS (unlinkat, int, (int fd, char const *file, int flag)
+                                 _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (unlinkat, int, (int fd, char const *file, int flag));
+# endif
+_GL_CXXALIASWARN (unlinkat);
+#elif defined GNULIB_POSIXCHECK
+# undef unlinkat
+# if HAVE_RAW_DECL_UNLINKAT
+_GL_WARN_ON_USE (unlinkat, "unlinkat is not portable - "
+                 "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_USLEEP@
+/* Pause the execution of the current thread for N microseconds.
+   Returns 0 on completion, or -1 on range error.
+   See the POSIX:2001 specification
+   <http://www.opengroup.org/susv3xsh/usleep.html>.  */
+# if @REPLACE_USLEEP@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef usleep
+#   define usleep rpl_usleep
+#  endif
+_GL_FUNCDECL_RPL (usleep, int, (useconds_t n));
+_GL_CXXALIAS_RPL (usleep, int, (useconds_t n));
+# else
+#  if !@HAVE_USLEEP@
+_GL_FUNCDECL_SYS (usleep, int, (useconds_t n));
+#  endif
+_GL_CXXALIAS_SYS (usleep, int, (useconds_t n));
+# endif
+_GL_CXXALIASWARN (usleep);
+#elif defined GNULIB_POSIXCHECK
+# undef usleep
+# if HAVE_RAW_DECL_USLEEP
+_GL_WARN_ON_USE (usleep, "usleep is unportable - "
+                 "use gnulib module usleep for portability");
+# endif
+#endif
+
+
+#if @GNULIB_WRITE@
+/* Write up to COUNT bytes starting at BUF to file descriptor FD.
+   See the POSIX:2008 specification
+   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html>.  */
+# if @REPLACE_WRITE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef write
+#   define write rpl_write
+#  endif
+_GL_FUNCDECL_RPL (write, ssize_t, (int fd, const void *buf, size_t count)
+                                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (write, ssize_t, (int fd, const void *buf, size_t count));
+# else
+/* Need to cast, because on mingw, the third parameter is
+                                                             unsigned int count
+   and the return type is 'int'.  */
+_GL_CXXALIAS_SYS_CAST (write, ssize_t, (int fd, const void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (write);
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* _@GUARD_PREFIX@_UNISTD_H */
+#endif /* _GL_INCLUDING_UNISTD_H */
+#endif /* _@GUARD_PREFIX@_UNISTD_H */
diff --git a/liblouis/gnulib/verify.h b/liblouis/gnulib/verify.h
new file mode 100644
index 0000000..dcba9c8
--- /dev/null
+++ b/liblouis/gnulib/verify.h
@@ -0,0 +1,284 @@
+/* Compile-time assert-like macros.
+
+   Copyright (C) 2005-2006, 2009-2017 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paul Eggert, Bruno Haible, and Jim Meyering.  */
+
+#ifndef _GL_VERIFY_H
+#define _GL_VERIFY_H
+
+
+/* Define _GL_HAVE__STATIC_ASSERT to 1 if _Static_assert works as per C11.
+   This is supported by GCC 4.6.0 and later, in C mode, and its use
+   here generates easier-to-read diagnostics when verify (R) fails.
+
+   Define _GL_HAVE_STATIC_ASSERT to 1 if static_assert works as per C++11.
+   This will likely be supported by future GCC versions, in C++ mode.
+
+   Use this only with GCC.  If we were willing to slow 'configure'
+   down we could also use it with other compilers, but since this
+   affects only the quality of diagnostics, why bother?  */
+#if (4 < __GNUC__ + (6 <= __GNUC_MINOR__) \
+     && (201112L <= __STDC_VERSION__  || !defined __STRICT_ANSI__) \
+     && !defined __cplusplus)
+# define _GL_HAVE__STATIC_ASSERT 1
+#endif
+/* The condition (99 < __GNUC__) is temporary, until we know about the
+   first G++ release that supports static_assert.  */
+#if (99 < __GNUC__) && defined __cplusplus
+# define _GL_HAVE_STATIC_ASSERT 1
+#endif
+
+/* FreeBSD 9.1 <sys/cdefs.h>, included by <stddef.h> and lots of other
+   system headers, defines a conflicting _Static_assert that is no
+   better than ours; override it.  */
+#ifndef _GL_HAVE_STATIC_ASSERT
+# include <stddef.h>
+# undef _Static_assert
+#endif
+
+/* Each of these macros verifies that its argument R is nonzero.  To
+   be portable, R should be an integer constant expression.  Unlike
+   assert (R), there is no run-time overhead.
+
+   If _Static_assert works, verify (R) uses it directly.  Similarly,
+   _GL_VERIFY_TRUE works by packaging a _Static_assert inside a struct
+   that is an operand of sizeof.
+
+   The code below uses several ideas for C++ compilers, and for C
+   compilers that do not support _Static_assert:
+
+   * The first step is ((R) ? 1 : -1).  Given an expression R, of
+     integral or boolean or floating-point type, this yields an
+     expression of integral type, whose value is later verified to be
+     constant and nonnegative.
+
+   * Next this expression W is wrapped in a type
+     struct _gl_verify_type {
+       unsigned int _gl_verify_error_if_negative: W;
+     }.
+     If W is negative, this yields a compile-time error.  No compiler can
+     deal with a bit-field of negative size.
+
+     One might think that an array size check would have the same
+     effect, that is, that the type struct { unsigned int dummy[W]; }
+     would work as well.  However, inside a function, some compilers
+     (such as C++ compilers and GNU C) allow local parameters and
+     variables inside array size expressions.  With these compilers,
+     an array size check would not properly diagnose this misuse of
+     the verify macro:
+
+       void function (int n) { verify (n < 0); }
+
+   * For the verify macro, the struct _gl_verify_type will need to
+     somehow be embedded into a declaration.  To be portable, this
+     declaration must declare an object, a constant, a function, or a
+     typedef name.  If the declared entity uses the type directly,
+     such as in
+
+       struct dummy {...};
+       typedef struct {...} dummy;
+       extern struct {...} *dummy;
+       extern void dummy (struct {...} *);
+       extern struct {...} *dummy (void);
+
+     two uses of the verify macro would yield colliding declarations
+     if the entity names are not disambiguated.  A workaround is to
+     attach the current line number to the entity name:
+
+       #define _GL_CONCAT0(x, y) x##y
+       #define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
+       extern struct {...} * _GL_CONCAT (dummy, __LINE__);
+
+     But this has the problem that two invocations of verify from
+     within the same macro would collide, since the __LINE__ value
+     would be the same for both invocations.  (The GCC __COUNTER__
+     macro solves this problem, but is not portable.)
+
+     A solution is to use the sizeof operator.  It yields a number,
+     getting rid of the identity of the type.  Declarations like
+
+       extern int dummy [sizeof (struct {...})];
+       extern void dummy (int [sizeof (struct {...})]);
+       extern int (*dummy (void)) [sizeof (struct {...})];
+
+     can be repeated.
+
+   * Should the implementation use a named struct or an unnamed struct?
+     Which of the following alternatives can be used?
+
+       extern int dummy [sizeof (struct {...})];
+       extern int dummy [sizeof (struct _gl_verify_type {...})];
+       extern void dummy (int [sizeof (struct {...})]);
+       extern void dummy (int [sizeof (struct _gl_verify_type {...})]);
+       extern int (*dummy (void)) [sizeof (struct {...})];
+       extern int (*dummy (void)) [sizeof (struct _gl_verify_type {...})];
+
+     In the second and sixth case, the struct type is exported to the
+     outer scope; two such declarations therefore collide.  GCC warns
+     about the first, third, and fourth cases.  So the only remaining
+     possibility is the fifth case:
+
+       extern int (*dummy (void)) [sizeof (struct {...})];
+
+   * GCC warns about duplicate declarations of the dummy function if
+     -Wredundant-decls is used.  GCC 4.3 and later have a builtin
+     __COUNTER__ macro that can let us generate unique identifiers for
+     each dummy function, to suppress this warning.
+
+   * This implementation exploits the fact that older versions of GCC,
+     which do not support _Static_assert, also do not warn about the
+     last declaration mentioned above.
+
+   * GCC warns if -Wnested-externs is enabled and verify() is used
+     within a function body; but inside a function, you can always
+     arrange to use verify_expr() instead.
+
+   * In C++, any struct definition inside sizeof is invalid.
+     Use a template type to work around the problem.  */
+
+/* Concatenate two preprocessor tokens.  */
+#define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
+#define _GL_CONCAT0(x, y) x##y
+
+/* _GL_COUNTER is an integer, preferably one that changes each time we
+   use it.  Use __COUNTER__ if it works, falling back on __LINE__
+   otherwise.  __LINE__ isn't perfect, but it's better than a
+   constant.  */
+#if defined __COUNTER__ && __COUNTER__ != __COUNTER__
+# define _GL_COUNTER __COUNTER__
+#else
+# define _GL_COUNTER __LINE__
+#endif
+
+/* Generate a symbol with the given prefix, making it unique if
+   possible.  */
+#define _GL_GENSYM(prefix) _GL_CONCAT (prefix, _GL_COUNTER)
+
+/* Verify requirement R at compile-time, as an integer constant expression
+   that returns 1.  If R is false, fail at compile-time, preferably
+   with a diagnostic that includes the string-literal DIAGNOSTIC.  */
+
+#define _GL_VERIFY_TRUE(R, DIAGNOSTIC) \
+   (!!sizeof (_GL_VERIFY_TYPE (R, DIAGNOSTIC)))
+
+#ifdef __cplusplus
+# if !GNULIB_defined_struct__gl_verify_type
+template <int w>
+  struct _gl_verify_type {
+    unsigned int _gl_verify_error_if_negative: w;
+  };
+#  define GNULIB_defined_struct__gl_verify_type 1
+# endif
+# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
+    _gl_verify_type<(R) ? 1 : -1>
+#elif defined _GL_HAVE__STATIC_ASSERT
+# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
+    struct {                                   \
+      _Static_assert (R, DIAGNOSTIC);          \
+      int _gl_dummy;                          \
+    }
+#else
+# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
+    struct { unsigned int _gl_verify_error_if_negative: (R) ? 1 : -1; }
+#endif
+
+/* Verify requirement R at compile-time, as a declaration without a
+   trailing ';'.  If R is false, fail at compile-time, preferably
+   with a diagnostic that includes the string-literal DIAGNOSTIC.
+
+   Unfortunately, unlike C11, this implementation must appear as an
+   ordinary declaration, and cannot appear inside struct { ... }.  */
+
+#ifdef _GL_HAVE__STATIC_ASSERT
+# define _GL_VERIFY _Static_assert
+#else
+# define _GL_VERIFY(R, DIAGNOSTIC)				       \
+    extern int (*_GL_GENSYM (_gl_verify_function) (void))	       \
+      [_GL_VERIFY_TRUE (R, DIAGNOSTIC)]
+#endif
+
+/* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h.  */
+#ifdef _GL_STATIC_ASSERT_H
+# if !defined _GL_HAVE__STATIC_ASSERT && !defined _Static_assert
+#  define _Static_assert(R, DIAGNOSTIC) _GL_VERIFY (R, DIAGNOSTIC)
+# endif
+# if !defined _GL_HAVE_STATIC_ASSERT && !defined static_assert
+#  define static_assert _Static_assert /* C11 requires this #define.  */
+# endif
+#endif
+
+/* @assert.h omit start@  */
+
+/* Each of these macros verifies that its argument R is nonzero.  To
+   be portable, R should be an integer constant expression.  Unlike
+   assert (R), there is no run-time overhead.
+
+   There are two macros, since no single macro can be used in all
+   contexts in C.  verify_true (R) is for scalar contexts, including
+   integer constant expression contexts.  verify (R) is for declaration
+   contexts, e.g., the top level.  */
+
+/* Verify requirement R at compile-time, as an integer constant expression.
+   Return 1.  This is equivalent to verify_expr (R, 1).
+
+   verify_true is obsolescent; please use verify_expr instead.  */
+
+#define verify_true(R) _GL_VERIFY_TRUE (R, "verify_true (" #R ")")
+
+/* Verify requirement R at compile-time.  Return the value of the
+   expression E.  */
+
+#define verify_expr(R, E) \
+   (_GL_VERIFY_TRUE (R, "verify_expr (" #R ", " #E ")") ? (E) : (E))
+
+/* Verify requirement R at compile-time, as a declaration without a
+   trailing ';'.  */
+
+#ifdef __GNUC__
+# define verify(R) _GL_VERIFY (R, "verify (" #R ")")
+#else
+/* PGI barfs if R is long.  Play it safe.  */
+# define verify(R) _GL_VERIFY (R, "verify (...)")
+#endif
+
+#ifndef __has_builtin
+# define __has_builtin(x) 0
+#endif
+
+/* Assume that R always holds.  This lets the compiler optimize
+   accordingly.  R should not have side-effects; it may or may not be
+   evaluated.  Behavior is undefined if R is false.  */
+
+#if (__has_builtin (__builtin_unreachable) \
+     || 4 < __GNUC__ + (5 <= __GNUC_MINOR__))
+# define assume(R) ((R) ? (void) 0 : __builtin_unreachable ())
+#elif 1200 <= _MSC_VER
+# define assume(R) __assume (R)
+#elif ((defined GCC_LINT || defined lint) \
+       && (__has_builtin (__builtin_trap) \
+           || 3 < __GNUC__ + (3 < __GNUC_MINOR__ + (4 <= __GNUC_PATCHLEVEL__))))
+  /* Doing it this way helps various packages when configured with
+     --enable-gcc-warnings, which compiles with -Dlint.  It's nicer
+     when 'assume' silences warnings even with older GCCs.  */
+# define assume(R) ((R) ? (void) 0 : __builtin_trap ())
+#else
+# define assume(R) ((void) (0 && (R)))
+#endif
+
+/* @assert.h omit end@  */
+
+#endif
diff --git a/liblouis/gnulib/warn-on-use.h b/liblouis/gnulib/warn-on-use.h
new file mode 100644
index 0000000..3c0eb57
--- /dev/null
+++ b/liblouis/gnulib/warn-on-use.h
@@ -0,0 +1,109 @@
+/* A C macro for emitting warnings if a function is used.
+   Copyright (C) 2010-2017 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
+   for FUNCTION which will then trigger a compiler warning containing
+   the text of "literal string" anywhere that function is called, if
+   supported by the compiler.  If the compiler does not support this
+   feature, the macro expands to an unused extern declaration.
+
+   This macro is useful for marking a function as a potential
+   portability trap, with the intent that "literal string" include
+   instructions on the replacement function that should be used
+   instead.  However, one of the reasons that a function is a
+   portability trap is if it has the wrong signature.  Declaring
+   FUNCTION with a different signature in C is a compilation error, so
+   this macro must use the same type as any existing declaration so
+   that programs that avoid the problematic FUNCTION do not fail to
+   compile merely because they included a header that poisoned the
+   function.  But this implies that _GL_WARN_ON_USE is only safe to
+   use if FUNCTION is known to already have a declaration.  Use of
+   this macro implies that there must not be any other macro hiding
+   the declaration of FUNCTION; but undefining FUNCTION first is part
+   of the poisoning process anyway (although for symbols that are
+   provided only via a macro, the result is a compilation error rather
+   than a warning containing "literal string").  Also note that in
+   C++, it is only safe to use if FUNCTION has no overloads.
+
+   For an example, it is possible to poison 'getline' by:
+   - adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
+     [getline]) in configure.ac, which potentially defines
+     HAVE_RAW_DECL_GETLINE
+   - adding this code to a header that wraps the system <stdio.h>:
+     #undef getline
+     #if HAVE_RAW_DECL_GETLINE
+     _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
+       "not universally present; use the gnulib module getline");
+     #endif
+
+   It is not possible to directly poison global variables.  But it is
+   possible to write a wrapper accessor function, and poison that
+   (less common usage, like &environ, will cause a compilation error
+   rather than issue the nice warning, but the end result of informing
+   the developer about their portability problem is still achieved):
+   #if HAVE_RAW_DECL_ENVIRON
+   static char ***rpl_environ (void) { return &environ; }
+   _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
+   # undef environ
+   # define environ (*rpl_environ ())
+   #endif
+   */
+#ifndef _GL_WARN_ON_USE
+
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function
+# else /* Unsupported.  */
+#  define _GL_WARN_ON_USE(function, message) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+# endif
+#endif
+
+/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
+   is like _GL_WARN_ON_USE (function, "string"), except that the function is
+   declared with the given prototype, consisting of return type, parameters,
+   and attributes.
+   This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
+   not work in this case.  */
+#ifndef _GL_WARN_ON_USE_CXX
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+extern rettype function parameters_and_attributes \
+     __attribute__ ((__warning__ (msg)))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+extern rettype function parameters_and_attributes
+# else /* Unsupported.  */
+#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+# endif
+#endif
+
+/* _GL_WARN_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#ifndef _GL_WARN_EXTERN_C
+# if defined __cplusplus
+#  define _GL_WARN_EXTERN_C extern "C"
+# else
+#  define _GL_WARN_EXTERN_C extern
+# endif
+#endif
diff --git a/liblouis/gnulib/xalloc-oversized.h b/liblouis/gnulib/xalloc-oversized.h
new file mode 100644
index 0000000..ff0efc6
--- /dev/null
+++ b/liblouis/gnulib/xalloc-oversized.h
@@ -0,0 +1,60 @@
+/* xalloc-oversized.h -- memory allocation size checking
+
+   Copyright (C) 1990-2000, 2003-2004, 2006-2017 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef XALLOC_OVERSIZED_H_
+#define XALLOC_OVERSIZED_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+/* True if N * S would overflow in a size_t calculation,
+   or would generate a value larger than PTRDIFF_MAX.
+   This expands to a constant expression if N and S are both constants.
+   By gnulib convention, SIZE_MAX represents overflow in size
+   calculations, so the conservative size_t-based dividend to use here
+   is SIZE_MAX - 1.  */
+#define __xalloc_oversized(n, s) \
+  ((size_t) (PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : SIZE_MAX - 1) / (s) < (n))
+
+#if PTRDIFF_MAX < SIZE_MAX
+typedef ptrdiff_t __xalloc_count_type;
+#else
+typedef size_t __xalloc_count_type;
+#endif
+
+/* Return 1 if an array of N objects, each of size S, cannot exist
+   reliably due to size or ptrdiff_t arithmetic overflow.  S must be
+   positive and N must be nonnegative.  This is a macro, not a
+   function, so that it works correctly even when SIZE_MAX < N.  */
+
+#if 7 <= __GNUC__
+# define xalloc_oversized(n, s) \
+   __builtin_mul_overflow_p (n, s, (__xalloc_count_type) 1)
+#elif 5 <= __GNUC__ && !__STRICT_ANSI__
+# define xalloc_oversized(n, s) \
+   (__builtin_constant_p (n) && __builtin_constant_p (s) \
+    ? __xalloc_oversized (n, s) \
+    : ({ __xalloc_count_type __xalloc_count; \
+         __builtin_mul_overflow (n, s, &__xalloc_count); }))
+
+/* Other compilers use integer division; this may be slower but is
+   more portable.  */
+#else
+# define xalloc_oversized(n, s) __xalloc_oversized (n, s)
+#endif
+
+#endif /* !XALLOC_OVERSIZED_H_ */
diff --git a/liblouis/liblouis.pc.in b/liblouis/liblouis.pc.in
new file mode 100644
index 0000000..65881b9
--- /dev/null
+++ b/liblouis/liblouis.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+tablesdir=${prefix}/share/liblouis/tables
+
+Name: liblouis
+Description: a braille translator and back-translator
+Version: @VERSION@
+Requires: 
+Libs: -L${libdir} -llouis
+Cflags: -I${includedir}/liblouis
diff --git a/liblouis/liblouis/Makefile.am b/liblouis/liblouis/Makefile.am
new file mode 100644
index 0000000..bf47aeb
--- /dev/null
+++ b/liblouis/liblouis/Makefile.am
@@ -0,0 +1,54 @@
+liblouisincludedir = $(includedir)/liblouis
+
+liblouisinclude_HEADERS = \
+	internal.h
+
+# Don't include liblouis.h in dist, this will break subdir builds
+# when dist is configured with a different ucs-option than the build,
+# i.e. ucs2 dist and ucs4 build and vice versa.
+nodist_liblouisinclude_HEADERS = \
+	liblouis.h
+
+lib_LTLIBRARIES = liblouis.la
+
+AM_CPPFLAGS = 						\
+	-DTABLESDIR=\""$(datadir)"/liblouis/tables\"	\
+	-I$(top_srcdir)/gnulib				\
+	-I$(top_builddir)/gnulib
+
+liblouis_la_LIBADD = $(top_builddir)/gnulib/libgnu.la
+
+liblouis_la_LDFLAGS =	\
+	-version-info $(LIBLOUIS_CURRENT):$(LIBLOUIS_REVISION):$(LIBLOUIS_AGE) -no-undefined \
+	$(LTLIBINTL)
+
+if HAVE_LD_OUTPUT_DEF
+liblouis_la_LDFLAGS += -Wl,--output-def,liblouis-$(DLL_VERSION).def
+defexecdir = $(bindir)
+defexec_DATA = liblouis-$(DLL_VERSION).def
+DISTCLEANFILES = $(defexec_DATA)
+endif
+
+liblouis_la_SOURCES =				\
+	internal.h					\
+	compileTranslationTable.c		\
+	lou_translateString.c			\
+	lou_backTranslateString.c		\
+	commonTranslationFunctions.c		\
+	metadata.c 				\
+	pattern.c				\
+	logging.c				\
+	utils.c				\
+	maketable.c
+
+# Don't include liblouis.h in dist, this will break subdir builds
+# when dist is configured with a different ucs-option than the build,
+# i.e. ucs2 dist and ucs4 build and vice versa.
+nodist_liblouis_la_SOURCES = \
+	liblouis.h
+
+if HAVE_SOURCE_FORMATTER
+format-sources-local:
+	for file in $(SOURCES); do $(SOURCE_FORMATTER) -i $$file; done
+	$(SOURCE_FORMATTER) -i liblouis.h.in
+endif
diff --git a/liblouis/liblouis/commonTranslationFunctions.c b/liblouis/liblouis/commonTranslationFunctions.c
new file mode 100644
index 0000000..b73e286
--- /dev/null
+++ b/liblouis/liblouis/commonTranslationFunctions.c
@@ -0,0 +1,93 @@
+/* liblouis Braille Translation and Back-Translation Library
+
+   Based on the Linux screenreader BRLTTY, copyright (C) 1999-2006 by The
+   BRLTTY Team
+
+   Copyright (C) 2004, 2005, 2006 ViewPlus Technologies, Inc. www.viewplus.com
+   Copyright (C) 2004, 2005, 2006 JJB Software, Inc. www.jjb-software.com
+   Copyright (C) 2016 Mike Gray, American Printing House for the Blind
+   Copyright (C) 2016 Davy Kager, Dedicon
+
+   This file is part of liblouis.
+
+   liblouis is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation, either version 2.1 of the License, or
+   (at your option) any later version.
+
+   liblouis is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <string.h>
+#include "internal.h"
+
+static int passVariables[NUMVAR];
+
+void EXPORT_CALL
+_lou_resetPassVariables(void) {
+	memset(passVariables, 0, sizeof(passVariables[0]) * NUMVAR);
+}
+
+int EXPORT_CALL
+_lou_handlePassVariableTest(const widechar *instructions, int *IC, int *itsTrue) {
+	switch (instructions[*IC]) {
+	case pass_eq:
+		if (passVariables[instructions[*IC + 1]] != instructions[*IC + 2]) *itsTrue = 0;
+		*IC += 3;
+		return 1;
+
+	case pass_lt:
+		if (passVariables[instructions[*IC + 1]] >= instructions[*IC + 2]) *itsTrue = 0;
+		*IC += 3;
+		return 1;
+
+	case pass_gt:
+		if (passVariables[instructions[*IC + 1]] <= instructions[*IC + 2]) *itsTrue = 0;
+		*IC += 3;
+		return 1;
+
+	case pass_lteq:
+		if (passVariables[instructions[*IC + 1]] > instructions[*IC + 2]) *itsTrue = 0;
+		*IC += 3;
+		return 1;
+
+	case pass_gteq:
+		if (passVariables[instructions[*IC + 1]] < instructions[*IC + 2]) *itsTrue = 0;
+		*IC += 3;
+		return 1;
+
+	default:
+		return 0;
+	}
+}
+
+int EXPORT_CALL
+_lou_handlePassVariableAction(const widechar *instructions, int *IC) {
+	switch (instructions[*IC]) {
+	case pass_eq:
+		passVariables[instructions[*IC + 1]] = instructions[*IC + 2];
+		*IC += 3;
+		return 1;
+
+	case pass_hyphen:
+		passVariables[instructions[*IC + 1]] -= 1;
+		if (passVariables[instructions[*IC + 1]] < 0)
+			passVariables[instructions[*IC + 1]] = 0;
+		*IC += 2;
+		return 1;
+
+	case pass_plus:
+		passVariables[instructions[*IC + 1]] += 1;
+		*IC += 2;
+		return 1;
+
+	default:
+		return 0;
+	}
+}
diff --git a/liblouis/liblouis/compileTranslationTable.c b/liblouis/liblouis/compileTranslationTable.c
new file mode 100644
index 0000000..c722e8c
--- /dev/null
+++ b/liblouis/liblouis/compileTranslationTable.c
@@ -0,0 +1,4989 @@
+/* liblouis Braille Translation and Back-Translation Library
+
+   Based on the Linux screenreader BRLTTY, copyright (C) 1999-2006 by The
+   BRLTTY Team
+
+   Copyright (C) 2004, 2005, 2006 ViewPlus Technologies, Inc. www.viewplus.com
+   Copyright (C) 2004, 2005, 2006 JJB Software, Inc. www.jjb-software.com
+   Copyright (C) 2016 Mike Gray, American Printing House for the Blind
+   Copyright (C) 2016 Davy Kager, Dedicon
+
+   This file is part of liblouis.
+
+   liblouis is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation, either version 2.1 of the License, or
+   (at your option) any later version.
+
+   liblouis is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file
+ * @brief Read and compile translation tables
+ */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#include "internal.h"
+#include "config.h"
+
+#define QUOTESUB 28 /* Stand-in for double quotes in strings */
+
+/* needed to make debuggin easier */
+#ifdef DEBUG
+wchar_t wchar;
+#endif
+
+/* The following variables and functions make it possible to specify the
+ * path on which all tables for liblouis and all files for liblouisutdml,
+ * in their proper directories, will be found.
+ */
+
+static char *dataPathPtr;
+
+char *EXPORT_CALL
+lou_setDataPath(const char *path) {
+	static char dataPath[MAXSTRING];
+	dataPathPtr = NULL;
+	if (path == NULL) return NULL;
+	strcpy(dataPath, path);
+	dataPathPtr = dataPath;
+	return dataPathPtr;
+}
+
+char *EXPORT_CALL
+lou_getDataPath(void) {
+	return dataPathPtr;
+}
+
+/* End of dataPath code. */
+
+static int
+eqasc2uni(const unsigned char *a, const widechar *b, const int len) {
+	int k;
+	for (k = 0; k < len; k++)
+		if ((widechar)a[k] != b[k]) return 0;
+	return 1;
+}
+
+typedef struct CharsString {
+	widechar length;
+	widechar chars[MAXSTRING];
+} CharsString;
+
+static int errorCount;
+static int warningCount;
+
+static TranslationTableHeader *gTable;
+
+static TranslationTableOffset tableSize;
+static TranslationTableOffset tableUsed;
+
+typedef struct ChainEntry {
+	struct ChainEntry *next;
+	TranslationTableHeader *table;
+	int tableListLength;
+	char tableList[1];
+} ChainEntry;
+
+static ChainEntry *tableChain = NULL;
+
+static const char *characterClassNames[] = {
+	"space", "letter", "digit", "punctuation", "uppercase", "lowercase", "math", "sign",
+	"litdigit", NULL,
+};
+
+typedef struct CharacterClass {
+	struct CharacterClass *next;
+	TranslationTableCharacterAttributes attribute;
+	widechar length;
+	widechar name[1];
+} CharacterClass;
+
+static CharacterClass *gCharacterClasses;
+
+static TranslationTableCharacterAttributes gCharacterClassAttribute;
+
+static const char *opcodeNames[CTO_None] = {
+	"include", "locale", "undefined", "capsletter", "begcapsword", "endcapsword",
+	"begcaps", "endcaps", "begcapsphrase", "endcapsphrase", "lencapsphrase", "letsign",
+	"noletsignbefore", "noletsign", "noletsignafter", "numsign", "numericmodechars",
+	"numericnocontchars", "seqdelimiter", "seqbeforechars", "seqafterchars",
+	"seqafterpattern", "seqafterexpression", "emphclass", "emphletter", "begemphword",
+	"endemphword", "begemph", "endemph", "begemphphrase", "endemphphrase",
+	"lenemphphrase", "capsmodechars",
+	// "emphmodechars",
+	"begcomp", "compbegemph1", "compendemph1", "compbegemph2", "compendemph2",
+	"compbegemph3", "compendemph3", "compcapsign", "compbegcaps", "compendcaps",
+	"endcomp", "nocontractsign", "multind", "compdots", "comp6", "class", "after",
+	"before", "noback", "nofor", "empmatchbefore", "empmatchafter", "swapcc", "swapcd",
+	"swapdd", "space", "digit", "punctuation", "math", "sign", "letter", "uppercase",
+	"lowercase", "grouping", "uplow", "litdigit", "display", "replace", "context",
+	"correct", "pass2", "pass3", "pass4", "repeated", "repword", "capsnocont", "always",
+	"exactdots", "nocross", "syllable", "nocont", "compbrl", "literal", "largesign",
+	"word", "partword", "joinnum", "joinword", "lowword", "contraction", "sufword",
+	"prfword", "begword", "begmidword", "midword", "midendword", "endword", "prepunc",
+	"postpunc", "begnum", "midnum", "endnum", "decpoint", "hyphen",
+	// "apostrophe",
+	// "initial",
+	"nobreak", "match", "backmatch", "attribute",
+};
+
+static short gOpcodeLengths[CTO_None] = { 0 };
+
+static void
+compileError(FileInfo *nested, char *format, ...);
+
+static int
+getAChar(FileInfo *nested) {
+	/* Read a big endian, little endian or ASCII 8 file and convert it to
+	 * 16- or 32-bit unsigned integers */
+	int ch1 = 0, ch2 = 0;
+	widechar character;
+	if (nested->encoding == ascii8)
+		if (nested->status == 2) {
+			nested->status++;
+			return nested->checkencoding[1];
+		}
+	while ((ch1 = fgetc(nested->in)) != EOF) {
+		if (nested->status < 2) nested->checkencoding[nested->status] = ch1;
+		nested->status++;
+		if (nested->status == 2) {
+			if (nested->checkencoding[0] == 0xfe && nested->checkencoding[1] == 0xff)
+				nested->encoding = bigEndian;
+			else if (nested->checkencoding[0] == 0xff && nested->checkencoding[1] == 0xfe)
+				nested->encoding = littleEndian;
+			else if (nested->checkencoding[0] < 128 && nested->checkencoding[1] < 128) {
+				nested->encoding = ascii8;
+				return nested->checkencoding[0];
+			} else {
+				compileError(nested,
+						"encoding is neither big-endian, little-endian nor ASCII 8.");
+				ch1 = EOF;
+				break;
+				;
+			}
+			continue;
+		}
+		switch (nested->encoding) {
+		case noEncoding:
+			break;
+		case ascii8:
+			return ch1;
+			break;
+		case bigEndian:
+			ch2 = fgetc(nested->in);
+			if (ch2 == EOF) break;
+			character = (widechar)(ch1 << 8) | ch2;
+			return (int)character;
+			break;
+		case littleEndian:
+			ch2 = fgetc(nested->in);
+			if (ch2 == EOF) break;
+			character = (widechar)(ch2 << 8) | ch1;
+			return (int)character;
+			break;
+		}
+		if (ch1 == EOF || ch2 == EOF) break;
+	}
+	return EOF;
+}
+
+int EXPORT_CALL
+_lou_getALine(FileInfo *nested) {
+	/* Read a line of widechar's from an input file */
+	int ch;
+	int pch = 0;
+	nested->linelen = 0;
+	while ((ch = getAChar(nested)) != EOF) {
+		if (ch == 13) continue;
+		if (pch == '\\' && ch == 10) {
+			nested->linelen--;
+			pch = ch;
+			continue;
+		}
+		if (ch == 10 || nested->linelen >= MAXSTRING - 1) break;
+		nested->line[nested->linelen++] = (widechar)ch;
+		pch = ch;
+	}
+	nested->line[nested->linelen] = 0;
+	nested->linepos = 0;
+	if (ch == EOF) return 0;
+	nested->lineNumber++;
+	return 1;
+}
+
+static inline int
+atEndOfLine(FileInfo *nested) {
+	return nested->linepos >= nested->linelen;
+}
+
+static inline int
+atTokenDelimiter(FileInfo *nested) {
+	return nested->line[nested->linepos] <= 32;
+}
+
+static int
+getToken(FileInfo *nested, CharsString *result, const char *description, int *lastToken) {
+	/* Find the next string of contiguous non-whitespace characters. If this
+	 * is the last token on the line, return 2 instead of 1. */
+	while (!atEndOfLine(nested) && atTokenDelimiter(nested)) nested->linepos++;
+	result->length = 0;
+	while (!atEndOfLine(nested) && !atTokenDelimiter(nested)) {
+		int maxlen = MAXSTRING;
+		if (result->length >= maxlen) {
+			compileError(nested, "more than %d characters (bytes)", maxlen);
+			return 0;
+		} else
+			result->chars[result->length++] = nested->line[nested->linepos++];
+	}
+	if (!result->length) {
+		/* Not enough tokens */
+		if (description) compileError(nested, "%s not specified.", description);
+		return 0;
+	}
+	result->chars[result->length] = 0;
+	while (!atEndOfLine(nested) && atTokenDelimiter(nested)) nested->linepos++;
+	return (*lastToken = atEndOfLine(nested)) ? 2 : 1;
+}
+
+static void
+compileError(FileInfo *nested, char *format, ...) {
+#ifndef __SYMBIAN32__
+	char buffer[MAXSTRING];
+	va_list arguments;
+	va_start(arguments, format);
+	vsnprintf(buffer, sizeof(buffer), format, arguments);
+	va_end(arguments);
+	if (nested)
+		_lou_logMessage(LOG_ERROR, "%s:%d: error: %s", nested->fileName,
+				nested->lineNumber, buffer);
+	else
+		_lou_logMessage(LOG_ERROR, "error: %s", buffer);
+	errorCount++;
+#endif
+}
+
+static void
+compileWarning(FileInfo *nested, char *format, ...) {
+#ifndef __SYMBIAN32__
+	char buffer[MAXSTRING];
+	va_list arguments;
+	va_start(arguments, format);
+	vsnprintf(buffer, sizeof(buffer), format, arguments);
+	va_end(arguments);
+	if (nested)
+		_lou_logMessage(LOG_WARN, "%s:%d: warning: %s", nested->fileName,
+				nested->lineNumber, buffer);
+	else
+		_lou_logMessage(LOG_WARN, "warning: %s", buffer);
+	warningCount++;
+#endif
+}
+
+static int
+allocateSpaceInTable(FileInfo *nested, TranslationTableOffset *offset, int count,
+		TranslationTableHeader **table) {
+	/* allocate memory for translation table and expand previously allocated
+	 * memory if necessary */
+	int spaceNeeded = ((count + OFFSETSIZE - 1) / OFFSETSIZE) * OFFSETSIZE;
+	TranslationTableOffset size = tableUsed + spaceNeeded;
+	if (size > tableSize) {
+		TranslationTableHeader *newTable;
+		size += (size / OFFSETSIZE);
+		newTable = realloc(*table, size);
+		if (!newTable) {
+			compileError(nested, "Not enough memory for translation table.");
+			_lou_outOfMemory();
+		}
+		memset(((unsigned char *)newTable) + tableSize, 0, size - tableSize);
+		/* update references to the old table */
+		{
+			ChainEntry *entry;
+			for (entry = tableChain; entry != NULL; entry = entry->next)
+				if (entry->table == *table)
+					entry->table = (TranslationTableHeader *)newTable;
+		}
+		*table = (TranslationTableHeader *)newTable;
+		tableSize = size;
+	}
+	if (offset != NULL) {
+		*offset = (tableUsed - sizeof(**table)) / OFFSETSIZE;
+		tableUsed += spaceNeeded;
+	}
+	return 1;
+}
+
+static int
+reserveSpaceInTable(FileInfo *nested, int count, TranslationTableHeader **table) {
+	return (allocateSpaceInTable(nested, NULL, count, table));
+}
+
+static int
+allocateHeader(FileInfo *nested, TranslationTableHeader **table) {
+	/* Allocate memory for the table header and a guess on the number of
+	 * rules */
+	const TranslationTableOffset startSize = 2 * sizeof(**table);
+	if (*table) return 1;
+	tableUsed = sizeof(**table) + OFFSETSIZE; /* So no offset is ever zero */
+	if (!(*table = malloc(startSize))) {
+		compileError(nested, "Not enough memory");
+		if (*table != NULL) free(*table);
+		*table = NULL;
+		_lou_outOfMemory();
+	}
+	memset(*table, 0, startSize);
+	tableSize = startSize;
+	return 1;
+}
+
+static TranslationTableCharacter *
+compile_findCharOrDots(widechar c, int m, TranslationTableHeader *table) {
+	/* Look up a character or dot pattern. If m is 0 look up a character,
+	 * otherwise look up a dot pattern. Although the algorithms are almost
+	 * identical, different tables are needed for characters and dots because
+	 * of the possibility of conflicts. */
+	TranslationTableCharacter *character;
+	TranslationTableOffset bucket;
+	unsigned long int makeHash = (unsigned long int)c % HASHNUM;
+	if (m == 0)
+		bucket = table->characters[makeHash];
+	else
+		bucket = table->dots[makeHash];
+	while (bucket) {
+		character = (TranslationTableCharacter *)&table->ruleArea[bucket];
+		if (character->realchar == c) return character;
+		bucket = character->next;
+	}
+	return NULL;
+}
+
+static char *
+unknownDots(widechar dots);
+
+static TranslationTableCharacter *
+definedCharOrDots(FileInfo *nested, widechar c, int m, TranslationTableHeader *table) {
+	static TranslationTableCharacter noChar = {
+		.next = 0,
+		.definitionRule = 0,
+		.otherRules = 0,
+		.attributes = CTC_Space,
+		.realchar = 32,
+		.uppercase = 32,
+		.lowercase = 32,
+	};
+	static TranslationTableCharacter noDots = {
+		.next = 0,
+		.definitionRule = 0,
+		.otherRules = 0,
+		.attributes = CTC_Space,
+		.realchar = B16,
+		.uppercase = B16,
+		.lowercase = B16,
+	};
+	TranslationTableCharacter *notFound;
+	TranslationTableCharacter *charOrDots = compile_findCharOrDots(c, m, table);
+	if (charOrDots) return charOrDots;
+	if (m == 0) {
+		notFound = &noChar;
+		compileError(nested, "character %s should be defined at this point but is not",
+				_lou_showString(&c, 1));
+	} else {
+		notFound = &noDots;
+		compileError(nested, "cell %s should be defined at this point but is not",
+				unknownDots(c));
+	}
+	return notFound;
+}
+
+static TranslationTableCharacter *
+addCharOrDots(FileInfo *nested, widechar c, int m, TranslationTableHeader **table) {
+	/* See if a character or dot pattern is in the appropriate table. If not,
+	 * insert it. In either
+	 * case, return a pointer to it. */
+	TranslationTableOffset bucket;
+	TranslationTableCharacter *character;
+	TranslationTableCharacter *oldchar;
+	TranslationTableOffset offset;
+	unsigned long int makeHash;
+	if ((character = compile_findCharOrDots(c, m, *table))) return character;
+	if (!allocateSpaceInTable(nested, &offset, sizeof(*character), table)) return NULL;
+	character = (TranslationTableCharacter *)&(*table)->ruleArea[offset];
+	memset(character, 0, sizeof(*character));
+	character->realchar = c;
+	makeHash = (unsigned long int)c % HASHNUM;
+	if (m == 0)
+		bucket = (*table)->characters[makeHash];
+	else
+		bucket = (*table)->dots[makeHash];
+	if (!bucket) {
+		if (m == 0)
+			(*table)->characters[makeHash] = offset;
+		else
+			(*table)->dots[makeHash] = offset;
+	} else {
+		oldchar = (TranslationTableCharacter *)&(*table)->ruleArea[bucket];
+		while (oldchar->next)
+			oldchar = (TranslationTableCharacter *)&(*table)->ruleArea[oldchar->next];
+		oldchar->next = offset;
+	}
+	return character;
+}
+
+static CharOrDots *
+getCharOrDots(widechar c, int m, TranslationTableHeader *table) {
+	CharOrDots *cdPtr;
+	TranslationTableOffset bucket;
+	unsigned long int makeHash = (unsigned long int)c % HASHNUM;
+	if (m == 0)
+		bucket = table->charToDots[makeHash];
+	else
+		bucket = table->dotsToChar[makeHash];
+	while (bucket) {
+		cdPtr = (CharOrDots *)&table->ruleArea[bucket];
+		if (cdPtr->lookFor == c) return cdPtr;
+		bucket = cdPtr->next;
+	}
+	return NULL;
+}
+
+widechar EXPORT_CALL
+_lou_getDotsForChar(widechar c) {
+	CharOrDots *cdPtr = getCharOrDots(c, 0, gTable);
+	if (cdPtr) return cdPtr->found;
+	return B16;
+}
+
+widechar EXPORT_CALL
+_lou_getCharFromDots(widechar d) {
+	CharOrDots *cdPtr = getCharOrDots(d, 1, gTable);
+	if (cdPtr) return cdPtr->found;
+	return ' ';
+}
+
+static int
+putCharAndDots(FileInfo *nested, widechar c, widechar d, TranslationTableHeader **table) {
+	TranslationTableOffset bucket;
+	CharOrDots *cdPtr;
+	CharOrDots *oldcdPtr = NULL;
+	TranslationTableOffset offset;
+	unsigned long int makeHash;
+	if (!(cdPtr = getCharOrDots(c, 0, *table))) {
+		if (!allocateSpaceInTable(nested, &offset, sizeof(*cdPtr), table)) return 0;
+		cdPtr = (CharOrDots *)&(*table)->ruleArea[offset];
+		cdPtr->next = 0;
+		cdPtr->lookFor = c;
+		cdPtr->found = d;
+		makeHash = (unsigned long int)c % HASHNUM;
+		bucket = (*table)->charToDots[makeHash];
+		if (!bucket)
+			(*table)->charToDots[makeHash] = offset;
+		else {
+			oldcdPtr = (CharOrDots *)&(*table)->ruleArea[bucket];
+			while (oldcdPtr->next)
+				oldcdPtr = (CharOrDots *)&(*table)->ruleArea[oldcdPtr->next];
+			oldcdPtr->next = offset;
+		}
+	}
+	if (!(cdPtr = getCharOrDots(d, 1, *table))) {
+		if (!allocateSpaceInTable(nested, &offset, sizeof(*cdPtr), table)) return 0;
+		cdPtr = (CharOrDots *)&(*table)->ruleArea[offset];
+		cdPtr->next = 0;
+		cdPtr->lookFor = d;
+		cdPtr->found = c;
+		makeHash = (unsigned long int)d % HASHNUM;
+		bucket = (*table)->dotsToChar[makeHash];
+		if (!bucket)
+			(*table)->dotsToChar[makeHash] = offset;
+		else {
+			oldcdPtr = (CharOrDots *)&(*table)->ruleArea[bucket];
+			while (oldcdPtr->next)
+				oldcdPtr = (CharOrDots *)&(*table)->ruleArea[oldcdPtr->next];
+			oldcdPtr->next = offset;
+		}
+	}
+	return 1;
+}
+
+/**
+ * Print out dot numbers
+ *
+ * @return a string containing the dot numbers. The longest possible
+ * output is "\123456789ABCDEF0/"
+ */
+static char *
+unknownDots(widechar dots) {
+	static char buffer[20];
+	int k = 1;
+	buffer[0] = '\\';
+	for (int mappingPos = 0; dotMapping[mappingPos].key; mappingPos++) {
+		if (dots & dotMapping[mappingPos].key) buffer[k++] = dotMapping[mappingPos].value;
+	}
+	buffer[k++] = '/';
+	buffer[k] = 0;
+	return buffer;
+}
+
+static TranslationTableOffset gNewRuleOffset = 0;
+static TranslationTableRule *gNewRule = NULL;
+
+static int
+charactersDefined(
+		FileInfo *nested, TranslationTableRule *newRule, TranslationTableHeader *table) {
+	/* Check that all characters are defined by character-definition
+	 * opcodes */
+	int noErrors = 1;
+	int k;
+	if ((newRule->opcode >= CTO_Space && newRule->opcode <= CTO_LitDigit) ||
+			newRule->opcode == CTO_SwapDd || newRule->opcode == CTO_Replace ||
+			newRule->opcode == CTO_MultInd || newRule->opcode == CTO_Repeated ||
+			((newRule->opcode >= CTO_Context && newRule->opcode <= CTO_Pass4) &&
+					newRule->opcode != CTO_Correct) ||
+			newRule->opcode == CTO_Match)
+		return 1;
+	for (k = 0; k < newRule->charslen; k++)
+		if (!compile_findCharOrDots(newRule->charsdots[k], 0, table)) {
+			compileError(nested, "Character %s is not defined",
+					_lou_showString(&newRule->charsdots[k], 1));
+			noErrors = 0;
+		}
+	if (!(newRule->opcode == CTO_Correct || newRule->opcode == CTO_SwapCc ||
+				newRule->opcode == CTO_SwapCd)
+			// TODO: these just need to know there is a way to get from dots to a char
+			&&
+			!(newRule->opcode >= CTO_CapsLetterRule &&
+					newRule->opcode <= CTO_EndEmph10PhraseAfterRule)) {
+		for (k = newRule->charslen; k < newRule->charslen + newRule->dotslen; k++)
+			if (!compile_findCharOrDots(newRule->charsdots[k], 1, table)) {
+				compileError(nested, "Dot pattern %s is not defined.",
+						unknownDots(newRule->charsdots[k]));
+				noErrors = 0;
+			}
+	}
+	return noErrors;
+}
+
+static inline const char *
+getPartName(int actionPart) {
+	return actionPart ? "action" : "test";
+}
+
+static int
+passFindCharacters(FileInfo *nested, int actionPart, widechar *instructions, int end,
+		widechar **characters, int *length) {
+	int IC = 0;
+	int finding = !actionPart;
+
+	*characters = NULL;
+	*length = 0;
+
+	while (IC < end) {
+		widechar instruction = instructions[IC];
+
+		switch (instruction) {
+		case pass_string:
+		case pass_dots: {
+			int count = instructions[IC + 1];
+			IC += 2;
+
+			if (finding) {
+				*characters = &instructions[IC];
+				*length = count;
+				return 1;
+			}
+
+			IC += count;
+			continue;
+		}
+
+		case pass_attributes:
+			IC += 5;
+			goto NO_CHARACTERS;
+
+		case pass_swap:
+			/* swap has a range in the test part but not in the action part */
+			if (!actionPart != !finding) IC += 2;
+		/* fall through */
+
+		case pass_groupstart:
+		case pass_groupend:
+		case pass_groupreplace:
+			IC += 3;
+
+		NO_CHARACTERS : {
+			if (finding) return 1;
+			continue;
+		}
+
+		case pass_eq:
+		case pass_lt:
+		case pass_gt:
+		case pass_lteq:
+		case pass_gteq:
+			IC += 3;
+			continue;
+
+		case pass_lookback:
+			IC += 2;
+			continue;
+
+		case pass_not:
+		case pass_startReplace:
+		case pass_endReplace:
+		case pass_first:
+		case pass_last:
+		case pass_copy:
+		case pass_omit:
+		case pass_plus:
+		case pass_hyphen:
+			IC += 1;
+			continue;
+
+		case pass_endTest:
+			if (finding) goto NOT_FOUND;
+			finding = 1;
+			IC += 1;
+			continue;
+
+		default:
+			compileError(nested, "unhandled %s suboperand: \\x%02x",
+					getPartName(actionPart), instruction);
+			return 0;
+		}
+	}
+
+NOT_FOUND:
+	compileError(nested,
+			"characters, dots, attributes, or class swap not found in %s part",
+			getPartName(actionPart));
+
+	return 0;
+}
+
+/* The following functions are called by addRule to handle various cases. */
+
+static void
+addForwardRuleWithSingleChar(FileInfo *nested, TranslationTableOffset *newRuleOffset,
+		TranslationTableRule *newRule, TranslationTableHeader *table) {
+	/* direction = 0, newRule->charslen = 1 */
+	TranslationTableRule *currentRule;
+	TranslationTableOffset *currentOffsetPtr;
+	TranslationTableCharacter *character;
+	int m = 0;
+	if (newRule->opcode == CTO_CompDots || newRule->opcode == CTO_Comp6) return;
+	if (newRule->opcode >= CTO_Pass2 && newRule->opcode <= CTO_Pass4) m = 1;
+	character = definedCharOrDots(nested, newRule->charsdots[0], m, table);
+	if (m != 1 && character->attributes & CTC_Letter &&
+			(newRule->opcode == CTO_WholeWord || newRule->opcode == CTO_LargeSign)) {
+		if (table->noLetsignCount < LETSIGNSIZE)
+			table->noLetsign[table->noLetsignCount++] = newRule->charsdots[0];
+	}
+	if (newRule->opcode >= CTO_Space && newRule->opcode < CTO_UpLow)
+		character->definitionRule = *newRuleOffset;
+	currentOffsetPtr = &character->otherRules;
+	while (*currentOffsetPtr) {
+		currentRule = (TranslationTableRule *)&table->ruleArea[*currentOffsetPtr];
+		if (currentRule->charslen == 0) break;
+		if (currentRule->opcode >= CTO_Space && currentRule->opcode < CTO_UpLow)
+			if (!(newRule->opcode >= CTO_Space && newRule->opcode < CTO_UpLow)) break;
+		currentOffsetPtr = &currentRule->charsnext;
+	}
+	newRule->charsnext = *currentOffsetPtr;
+	*currentOffsetPtr = *newRuleOffset;
+}
+
+static void
+addForwardRuleWithMultipleChars(TranslationTableOffset *newRuleOffset,
+		TranslationTableRule *newRule, TranslationTableHeader *table) {
+	/* direction = 0 newRule->charslen > 1 */
+	TranslationTableRule *currentRule = NULL;
+	TranslationTableOffset *currentOffsetPtr =
+			&table->forRules[_lou_stringHash(&newRule->charsdots[0])];
+	while (*currentOffsetPtr) {
+		currentRule = (TranslationTableRule *)&table->ruleArea[*currentOffsetPtr];
+		if (newRule->charslen > currentRule->charslen) break;
+		if (newRule->charslen == currentRule->charslen)
+			if ((currentRule->opcode == CTO_Always) && (newRule->opcode != CTO_Always))
+				break;
+		currentOffsetPtr = &currentRule->charsnext;
+	}
+	newRule->charsnext = *currentOffsetPtr;
+	*currentOffsetPtr = *newRuleOffset;
+}
+
+static void
+addBackwardRuleWithSingleCell(FileInfo *nested, widechar cell,
+		TranslationTableOffset *newRuleOffset, TranslationTableRule *newRule,
+		TranslationTableHeader *table) {
+	/* direction = 1, newRule->dotslen = 1 */
+	TranslationTableRule *currentRule;
+	TranslationTableOffset *currentOffsetPtr;
+	TranslationTableCharacter *dots;
+	if (newRule->opcode == CTO_SwapCc || newRule->opcode == CTO_Repeated ||
+			(newRule->opcode == CTO_Always && newRule->charslen == 1))
+		return; /* too ambiguous */
+	dots = definedCharOrDots(nested, cell, 1, table);
+	if (newRule->opcode >= CTO_Space && newRule->opcode < CTO_UpLow)
+		dots->definitionRule = *newRuleOffset;
+	currentOffsetPtr = &dots->otherRules;
+	while (*currentOffsetPtr) {
+		currentRule = (TranslationTableRule *)&table->ruleArea[*currentOffsetPtr];
+		if (newRule->charslen > currentRule->charslen || currentRule->dotslen == 0) break;
+		if (currentRule->opcode >= CTO_Space && currentRule->opcode < CTO_UpLow)
+			if (!(newRule->opcode >= CTO_Space && newRule->opcode < CTO_UpLow)) break;
+		currentOffsetPtr = &currentRule->dotsnext;
+	}
+	newRule->dotsnext = *currentOffsetPtr;
+	*currentOffsetPtr = *newRuleOffset;
+}
+
+static void
+addBackwardRuleWithMultipleCells(widechar *cells, int count,
+		TranslationTableOffset *newRuleOffset, TranslationTableRule *newRule,
+		TranslationTableHeader *table) {
+	/* direction = 1, newRule->dotslen > 1 */
+	TranslationTableRule *currentRule = NULL;
+	TranslationTableOffset *currentOffsetPtr = &table->backRules[_lou_stringHash(cells)];
+	if (newRule->opcode == CTO_SwapCc) return;
+	while (*currentOffsetPtr) {
+		int currentLength;
+		int newLength;
+		currentRule = (TranslationTableRule *)&table->ruleArea[*currentOffsetPtr];
+		currentLength = currentRule->dotslen + currentRule->charslen;
+		newLength = count + newRule->charslen;
+		if (newLength > currentLength) break;
+		if (currentLength == newLength)
+			if ((currentRule->opcode == CTO_Always) && (newRule->opcode != CTO_Always))
+				break;
+		currentOffsetPtr = &currentRule->dotsnext;
+	}
+	newRule->dotsnext = *currentOffsetPtr;
+	*currentOffsetPtr = *newRuleOffset;
+}
+
+static int
+addForwardPassRule(TranslationTableOffset *newRuleOffset, TranslationTableRule *newRule,
+		TranslationTableHeader *table) {
+	TranslationTableOffset *currentOffsetPtr;
+	TranslationTableRule *currentRule;
+	switch (newRule->opcode) {
+	case CTO_Correct:
+		currentOffsetPtr = &table->forPassRules[0];
+		break;
+	case CTO_Context:
+		currentOffsetPtr = &table->forPassRules[1];
+		break;
+	case CTO_Pass2:
+		currentOffsetPtr = &table->forPassRules[2];
+		break;
+	case CTO_Pass3:
+		currentOffsetPtr = &table->forPassRules[3];
+		break;
+	case CTO_Pass4:
+		currentOffsetPtr = &table->forPassRules[4];
+		break;
+	default:
+		return 0;
+	}
+	while (*currentOffsetPtr) {
+		currentRule = (TranslationTableRule *)&table->ruleArea[*currentOffsetPtr];
+		if (newRule->charslen > currentRule->charslen) break;
+		currentOffsetPtr = &currentRule->charsnext;
+	}
+	newRule->charsnext = *currentOffsetPtr;
+	*currentOffsetPtr = *newRuleOffset;
+	return 1;
+}
+
+static int
+addBackwardPassRule(TranslationTableOffset *newRuleOffset, TranslationTableRule *newRule,
+		TranslationTableHeader *table) {
+	TranslationTableOffset *currentOffsetPtr;
+	TranslationTableRule *currentRule;
+	switch (newRule->opcode) {
+	case CTO_Correct:
+		currentOffsetPtr = &table->backPassRules[0];
+		break;
+	case CTO_Context:
+		currentOffsetPtr = &table->backPassRules[1];
+		break;
+	case CTO_Pass2:
+		currentOffsetPtr = &table->backPassRules[2];
+		break;
+	case CTO_Pass3:
+		currentOffsetPtr = &table->backPassRules[3];
+		break;
+	case CTO_Pass4:
+		currentOffsetPtr = &table->backPassRules[4];
+		break;
+	default:
+		return 0;
+	}
+	while (*currentOffsetPtr) {
+		currentRule = (TranslationTableRule *)&table->ruleArea[*currentOffsetPtr];
+		if (newRule->charslen > currentRule->charslen) break;
+		currentOffsetPtr = &currentRule->dotsnext;
+	}
+	newRule->dotsnext = *currentOffsetPtr;
+	*currentOffsetPtr = *newRuleOffset;
+	return 1;
+}
+
+static int
+addRule(FileInfo *nested, TranslationTableOpcode opcode, CharsString *ruleChars,
+		CharsString *ruleDots, TranslationTableCharacterAttributes after,
+		TranslationTableCharacterAttributes before, TranslationTableOffset *newRuleOffset,
+		TranslationTableRule **newRule, int noback, int nofor,
+		TranslationTableHeader **table) {
+	/* Add a rule to the table, using the hash function to find the start of
+	 * chains and chaining both the chars and dots strings */
+	int ruleSize = sizeof(TranslationTableRule) - (DEFAULTRULESIZE * CHARSIZE);
+	if (ruleChars) ruleSize += CHARSIZE * ruleChars->length;
+	if (ruleDots) ruleSize += CHARSIZE * ruleDots->length;
+	if (!allocateSpaceInTable(nested, newRuleOffset, ruleSize, table)) return 0;
+	TranslationTableRule *rule =
+			(TranslationTableRule *)&(*table)->ruleArea[*newRuleOffset];
+	*newRule = rule;
+	rule->opcode = opcode;
+	rule->after = after;
+	rule->before = before;
+	if (ruleChars)
+		memcpy(&rule->charsdots[0], &ruleChars->chars[0],
+				CHARSIZE * (rule->charslen = ruleChars->length));
+	else
+		rule->charslen = 0;
+	if (ruleDots)
+		memcpy(&rule->charsdots[rule->charslen], &ruleDots->chars[0],
+				CHARSIZE * (rule->dotslen = ruleDots->length));
+	else
+		rule->dotslen = 0;
+	if (!charactersDefined(nested, rule, *table)) return 0;
+
+	/* link new rule into table. */
+	if (opcode == CTO_SwapCc || opcode == CTO_SwapCd || opcode == CTO_SwapDd) return 1;
+	if (opcode >= CTO_Context && opcode <= CTO_Pass4)
+		if (!(opcode == CTO_Context && rule->charslen > 0)) {
+			if (!nofor)
+				if (!addForwardPassRule(newRuleOffset, rule, *table)) return 0;
+			if (!noback)
+				if (!addBackwardPassRule(newRuleOffset, rule, *table)) return 0;
+			return 1;
+		}
+	if (!nofor) {
+		if (rule->charslen == 1)
+			addForwardRuleWithSingleChar(nested, newRuleOffset, rule, *table);
+		else if (rule->charslen > 1)
+			addForwardRuleWithMultipleChars(newRuleOffset, rule, *table);
+	}
+	if (!noback) {
+		widechar *cells;
+		int count;
+
+		if (rule->opcode == CTO_Context) {
+			cells = &rule->charsdots[0];
+			count = rule->charslen;
+		} else {
+			cells = &rule->charsdots[rule->charslen];
+			count = rule->dotslen;
+		}
+
+		if (count == 1)
+			addBackwardRuleWithSingleCell(nested, *cells, newRuleOffset, rule, *table);
+		else if (count > 1)
+			addBackwardRuleWithMultipleCells(cells, count, newRuleOffset, rule, *table);
+	}
+	return 1;
+}
+
+static const CharacterClass *
+findCharacterClass(const CharsString *name, CharacterClass *characterClasses) {
+	/* Find a character class, whether predefined or user-defined */
+	const CharacterClass *class = characterClasses;
+	while (class) {
+		if ((name->length == class->length) &&
+				(memcmp(&name->chars[0], class->name, CHARSIZE * name->length) == 0))
+			return class;
+		class = class->next;
+	}
+	return NULL;
+}
+
+static CharacterClass *
+addCharacterClass(FileInfo *nested, const widechar *name, int length,
+		CharacterClass **characterClasses,
+		TranslationTableCharacterAttributes *characterClassAttribute) {
+	/* Define a character class, Whether predefined or user-defined */
+	CharacterClass *class;
+	if (*characterClassAttribute) {
+		if (!(class = malloc(sizeof(*class) + CHARSIZE * (length - 1))))
+			_lou_outOfMemory();
+		else {
+			memset(class, 0, sizeof(*class));
+			memcpy(class->name, name, CHARSIZE * (class->length = length));
+			class->attribute = *characterClassAttribute;
+			*characterClassAttribute <<= 1;
+			class->next = *characterClasses;
+			*characterClasses = class;
+			return class;
+		}
+	}
+	compileError(nested, "character class table overflow.");
+	return NULL;
+}
+
+static void
+deallocateCharacterClasses(CharacterClass **characterClasses) {
+	while (*characterClasses) {
+		CharacterClass *class = *characterClasses;
+		*characterClasses = (*characterClasses)->next;
+		if (class) free(class);
+	}
+}
+
+static int
+allocateCharacterClasses(CharacterClass **characterClasses,
+		TranslationTableCharacterAttributes *characterClassAttribute) {
+	/* Allocate memory for predifined character classes */
+	int k = 0;
+	*characterClasses = NULL;
+	*characterClassAttribute = 1;
+	while (characterClassNames[k]) {
+		widechar wname[MAXSTRING];
+		int length = (int)strlen(characterClassNames[k]);
+		int kk;
+		for (kk = 0; kk < length; kk++) wname[kk] = (widechar)characterClassNames[k][kk];
+		if (!addCharacterClass(
+					NULL, wname, length, characterClasses, characterClassAttribute)) {
+			deallocateCharacterClasses(characterClasses);
+			return 0;
+		}
+		k++;
+	}
+	return 1;
+}
+
+static TranslationTableOpcode
+getOpcode(FileInfo *nested, const CharsString *token, short opcodeLengths[]) {
+	static TranslationTableOpcode lastOpcode = 0;
+	TranslationTableOpcode opcode = lastOpcode;
+
+	do {
+		if (token->length == opcodeLengths[opcode])
+			if (eqasc2uni((unsigned char *)opcodeNames[opcode], &token->chars[0],
+						token->length)) {
+				lastOpcode = opcode;
+				return opcode;
+			}
+		opcode++;
+		if (opcode >= CTO_None) opcode = 0;
+	} while (opcode != lastOpcode);
+	compileError(nested, "opcode %s not defined.",
+			_lou_showString(&token->chars[0], token->length));
+	return CTO_None;
+}
+
+TranslationTableOpcode EXPORT_CALL
+_lou_findOpcodeNumber(const char *toFind) {
+	/* Used by tools such as lou_debug */
+	static TranslationTableOpcode lastOpcode = 0;
+	TranslationTableOpcode opcode = lastOpcode;
+	int length = (int)strlen(toFind);
+	do {
+		if (length == gOpcodeLengths[opcode] &&
+				strcasecmp(toFind, opcodeNames[opcode]) == 0) {
+			lastOpcode = opcode;
+			return opcode;
+		}
+		opcode++;
+		if (opcode >= CTO_None) opcode = 0;
+	} while (opcode != lastOpcode);
+	return CTO_None;
+}
+
+const char *EXPORT_CALL
+_lou_findOpcodeName(TranslationTableOpcode opcode) {
+	static char scratchBuf[MAXSTRING];
+	/* Used by tools such as lou_debug */
+	if (opcode < 0 || opcode >= CTO_None) {
+		sprintf(scratchBuf, "%d", opcode);
+		return scratchBuf;
+	}
+	return opcodeNames[opcode];
+}
+
+static widechar
+hexValue(FileInfo *nested, const widechar *digits, int length) {
+	int k;
+	unsigned int binaryValue = 0;
+	for (k = 0; k < length; k++) {
+		unsigned int hexDigit = 0;
+		if (digits[k] >= '0' && digits[k] <= '9')
+			hexDigit = digits[k] - '0';
+		else if (digits[k] >= 'a' && digits[k] <= 'f')
+			hexDigit = digits[k] - 'a' + 10;
+		else if (digits[k] >= 'A' && digits[k] <= 'F')
+			hexDigit = digits[k] - 'A' + 10;
+		else {
+			compileError(nested, "invalid %d-digit hexadecimal number", length);
+			return (widechar)0xffffffff;
+		}
+		binaryValue |= hexDigit << (4 * (length - 1 - k));
+	}
+	return (widechar)binaryValue;
+}
+
+#define MAXBYTES 7
+static const unsigned int first0Bit[MAXBYTES] = { 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC,
+	0XFE };
+
+static int
+parseChars(FileInfo *nested, CharsString *result, CharsString *token) {
+	int in = 0;
+	int out = 0;
+	int lastOutSize = 0;
+	int lastIn;
+	unsigned int ch = 0;
+	int numBytes = 0;
+	unsigned int utf32 = 0;
+	int k;
+	while (in < token->length) {
+		ch = token->chars[in++] & 0xff;
+		if (ch < 128) {
+			if (ch == '\\') { /* escape sequence */
+				switch (ch = token->chars[in]) {
+				case '\\':
+					break;
+				case 'e':
+					ch = 0x1b;
+					break;
+				case 'f':
+					ch = 12;
+					break;
+				case 'n':
+					ch = 10;
+					break;
+				case 'r':
+					ch = 13;
+					break;
+				case 's':
+					ch = ' ';
+					break;
+				case 't':
+					ch = 9;
+					break;
+				case 'v':
+					ch = 11;
+					break;
+				case 'w':
+					ch = ENDSEGMENT;
+					break;
+				case 34:
+					ch = QUOTESUB;
+					break;
+				case 'X':
+				case 'x':
+					if (token->length - in > 4) {
+						ch = hexValue(nested, &token->chars[in + 1], 4);
+						in += 4;
+					}
+					break;
+				case 'y':
+				case 'Y':
+					if (CHARSIZE == 2) {
+					not32:
+						compileError(nested,
+								"liblouis has not been compiled for 32-bit Unicode");
+						break;
+					}
+					if (token->length - in > 5) {
+						ch = hexValue(nested, &token->chars[in + 1], 5);
+						in += 5;
+					}
+					break;
+				case 'z':
+				case 'Z':
+					if (CHARSIZE == 2) goto not32;
+					if (token->length - in > 8) {
+						ch = hexValue(nested, &token->chars[in + 1], 8);
+						in += 8;
+					}
+					break;
+				default:
+					compileError(nested, "invalid escape sequence '\\%c'", ch);
+					break;
+				}
+				in++;
+			}
+			result->chars[out++] = (widechar)ch;
+			if (out >= MAXSTRING) {
+				result->length = out;
+				return 1;
+			}
+			continue;
+		}
+		lastOutSize = out;
+		lastIn = in;
+		for (numBytes = MAXBYTES - 1; numBytes > 0; numBytes--)
+			if (ch >= first0Bit[numBytes]) break;
+		utf32 = ch & (0XFF - first0Bit[numBytes]);
+		for (k = 0; k < numBytes; k++) {
+			if (in >= MAXSTRING) break;
+			if (token->chars[in] < 128 || (token->chars[in] & 0x0040)) {
+				compileWarning(nested, "invalid UTF-8. Assuming Latin-1.");
+				result->chars[out++] = token->chars[lastIn];
+				in = lastIn + 1;
+				continue;
+			}
+			utf32 = (utf32 << 6) + (token->chars[in++] & 0x3f);
+		}
+		if (CHARSIZE == 2 && utf32 > 0xffff) utf32 = 0xffff;
+		result->chars[out++] = (widechar)utf32;
+		if (out >= MAXSTRING) {
+			result->length = lastOutSize;
+			return 1;
+		}
+	}
+	result->length = out;
+	return 1;
+}
+
+int EXPORT_CALL
+_lou_extParseChars(const char *inString, widechar *outString) {
+	/* Parse external character strings */
+	CharsString wideIn;
+	CharsString result;
+	int k;
+	for (k = 0; inString[k] && k < MAXSTRING - 1; k++) wideIn.chars[k] = inString[k];
+	wideIn.chars[k] = 0;
+	wideIn.length = k;
+	parseChars(NULL, &result, &wideIn);
+	if (errorCount) {
+		errorCount = 0;
+		return 0;
+	}
+	for (k = 0; k < result.length; k++) outString[k] = result.chars[k];
+	return result.length;
+}
+
+static int
+parseDots(FileInfo *nested, CharsString *cells, const CharsString *token) {
+	/* get dot patterns */
+	widechar cell = 0; /* assembly place for dots */
+	int cellCount = 0;
+	int index;
+	int start = 0;
+
+	for (index = 0; index < token->length; index++) {
+		int started = index != start;
+		widechar character = token->chars[index];
+		switch (character) { /* or dots to make up Braille cell */
+			{
+				int dot;
+			case '1':
+				dot = B1;
+				goto haveDot;
+			case '2':
+				dot = B2;
+				goto haveDot;
+			case '3':
+				dot = B3;
+				goto haveDot;
+			case '4':
+				dot = B4;
+				goto haveDot;
+			case '5':
+				dot = B5;
+				goto haveDot;
+			case '6':
+				dot = B6;
+				goto haveDot;
+			case '7':
+				dot = B7;
+				goto haveDot;
+			case '8':
+				dot = B8;
+				goto haveDot;
+			case '9':
+				dot = B9;
+				goto haveDot;
+			case 'a':
+			case 'A':
+				dot = B10;
+				goto haveDot;
+			case 'b':
+			case 'B':
+				dot = B11;
+				goto haveDot;
+			case 'c':
+			case 'C':
+				dot = B12;
+				goto haveDot;
+			case 'd':
+			case 'D':
+				dot = B13;
+				goto haveDot;
+			case 'e':
+			case 'E':
+				dot = B14;
+				goto haveDot;
+			case 'f':
+			case 'F':
+				dot = B15;
+			haveDot:
+				if (started && !cell) goto invalid;
+				if (cell & dot) {
+					compileError(nested, "dot specified more than once.");
+					return 0;
+				}
+				cell |= dot;
+				break;
+			}
+		case '0': /* blank */
+			if (started) goto invalid;
+			break;
+		case '-': /* got all dots for this cell */
+			if (!started) {
+				compileError(nested, "missing cell specification.");
+				return 0;
+			}
+			cells->chars[cellCount++] = cell | B16;
+			cell = 0;
+			start = index + 1;
+			break;
+		default:
+		invalid:
+			compileError(
+					nested, "invalid dot number %s.", _lou_showString(&character, 1));
+			return 0;
+		}
+	}
+	if (index == start) {
+		compileError(nested, "missing cell specification.");
+		return 0;
+	}
+	cells->chars[cellCount++] = cell | B16; /* last cell */
+	cells->length = cellCount;
+	return 1;
+}
+
+int EXPORT_CALL
+_lou_extParseDots(const char *inString, widechar *outString) {
+	/* Parse external dot patterns */
+	CharsString wideIn;
+	CharsString result;
+	int k;
+	for (k = 0; inString[k] && k < MAXSTRING - 1; k++) wideIn.chars[k] = inString[k];
+	wideIn.chars[k] = 0;
+	wideIn.length = k;
+	parseDots(NULL, &result, &wideIn);
+	if (errorCount) {
+		errorCount = 0;
+		return 0;
+	}
+	for (k = 0; k < result.length; k++) outString[k] = result.chars[k];
+	outString[k] = 0;
+	return result.length;
+}
+
+static int
+getCharacters(FileInfo *nested, CharsString *characters, int *lastToken) {
+	/* Get ruleChars string */
+	CharsString token;
+	if (getToken(nested, &token, "characters", lastToken))
+		if (parseChars(nested, characters, &token)) return 1;
+	return 0;
+}
+
+static int
+getRuleCharsText(FileInfo *nested, CharsString *ruleChars, int *lastToken) {
+	CharsString token;
+	if (getToken(nested, &token, "Characters operand", lastToken))
+		if (parseChars(nested, ruleChars, &token)) return 1;
+	return 0;
+}
+
+static int
+getRuleDotsText(FileInfo *nested, CharsString *ruleDots, int *lastToken) {
+	CharsString token;
+	if (getToken(nested, &token, "characters", lastToken))
+		if (parseChars(nested, ruleDots, &token)) return 1;
+	return 0;
+}
+
+static int
+getRuleDotsPattern(FileInfo *nested, CharsString *ruleDots, int *lastToken) {
+	/* Interpret the dets operand */
+	CharsString token;
+	if (getToken(nested, &token, "Dots operand", lastToken)) {
+		if (token.length == 1 && token.chars[0] == '=') {
+			ruleDots->length = 0;
+			return 1;
+		}
+		if (parseDots(nested, ruleDots, &token)) return 1;
+	}
+	return 0;
+}
+
+static int
+getCharacterClass(FileInfo *nested, const CharacterClass **class,
+		CharacterClass *characterClasses, int *lastToken) {
+	CharsString token;
+	if (getToken(nested, &token, "character class name", lastToken)) {
+		if ((*class = findCharacterClass(&token, characterClasses))) return 1;
+		compileError(nested, "character class not defined.");
+	}
+	return 0;
+}
+
+typedef struct RuleName {
+	struct RuleName *next;
+	TranslationTableOffset ruleOffset;
+	widechar length;
+	widechar name[1];
+} RuleName;
+
+static int
+includeFile(FileInfo *nested, CharsString *includedFile,
+		CharacterClass **characterClasses,
+		TranslationTableCharacterAttributes *characterClassAttribute,
+		short opcodeLengths[], TranslationTableOffset *newRuleOffset,
+		TranslationTableRule **newRule, RuleName **ruleNames,
+		TranslationTableHeader **table);
+
+static struct RuleName *gRuleNames = NULL;
+
+static TranslationTableOffset
+findRuleName(const CharsString *name, RuleName *ruleNames) {
+	const struct RuleName *nameRule = ruleNames;
+	while (nameRule) {
+		if ((name->length == nameRule->length) &&
+				(memcmp(&name->chars[0], nameRule->name, CHARSIZE * name->length) == 0))
+			return nameRule->ruleOffset;
+		nameRule = nameRule->next;
+	}
+	return 0;
+}
+
+static int
+addRuleName(FileInfo *nested, CharsString *name, TranslationTableOffset *newRuleOffset,
+		RuleName **ruleNames, TranslationTableHeader *table) {
+	int k;
+	struct RuleName *nameRule;
+	if (!(nameRule = malloc(sizeof(*nameRule) + CHARSIZE * (name->length - 1)))) {
+		compileError(nested, "not enough memory");
+		_lou_outOfMemory();
+	}
+	memset(nameRule, 0, sizeof(*nameRule));
+	for (k = 0; k < name->length; k++) {
+		TranslationTableCharacter *ch =
+				definedCharOrDots(nested, name->chars[k], 0, table);
+		if (!(ch->attributes & CTC_Letter)) {
+			compileError(nested, "a name may contain only letters");
+			return 0;
+		}
+		nameRule->name[k] = name->chars[k];
+	}
+	nameRule->length = name->length;
+	nameRule->ruleOffset = *newRuleOffset;
+	nameRule->next = *ruleNames;
+	*ruleNames = nameRule;
+	return 1;
+}
+
+static void
+deallocateRuleNames(RuleName **ruleNames) {
+	while (*ruleNames) {
+		struct RuleName *nameRule = *ruleNames;
+		*ruleNames = nameRule->next;
+		if (nameRule) free(nameRule);
+	}
+}
+
+static int
+compileSwapDots(FileInfo *nested, CharsString *source, CharsString *dest,
+		TranslationTableHeader *table) {
+	int k = 0;
+	int kk = 0;
+	CharsString dotsSource;
+	CharsString dotsDest;
+	dest->length = 0;
+	dotsSource.length = 0;
+	while (k <= source->length) {
+		if (source->chars[k] != ',' && k != source->length)
+			dotsSource.chars[dotsSource.length++] = source->chars[k];
+		else {
+			if (!parseDots(nested, &dotsDest, &dotsSource)) return 0;
+			dest->chars[dest->length++] = dotsDest.length + 1;
+			for (kk = 0; kk < dotsDest.length; kk++)
+				dest->chars[dest->length++] = dotsDest.chars[kk];
+			dotsSource.length = 0;
+		}
+		k++;
+	}
+	return 1;
+}
+
+static int
+compileSwap(FileInfo *nested, TranslationTableOpcode opcode, int *lastToken,
+		TranslationTableOffset *newRuleOffset, TranslationTableRule **newRule, int noback,
+		int nofor, RuleName **ruleNames, TranslationTableHeader **table) {
+	CharsString ruleChars;
+	CharsString ruleDots;
+	CharsString name;
+	CharsString matches;
+	CharsString replacements;
+	if (!getToken(nested, &name, "name operand", lastToken)) return 0;
+	if (!getToken(nested, &matches, "matches operand", lastToken)) return 0;
+	if (!getToken(nested, &replacements, "replacements operand", lastToken)) return 0;
+	if (opcode == CTO_SwapCc || opcode == CTO_SwapCd) {
+		if (!parseChars(nested, &ruleChars, &matches)) return 0;
+	} else {
+		if (!compileSwapDots(nested, &matches, &ruleChars, *table)) return 0;
+	}
+	if (opcode == CTO_SwapCc) {
+		if (!parseChars(nested, &ruleDots, &replacements)) return 0;
+	} else {
+		if (!compileSwapDots(nested, &replacements, &ruleDots, *table)) return 0;
+	}
+	if (!addRule(nested, opcode, &ruleChars, &ruleDots, 0, 0, newRuleOffset, newRule,
+				noback, nofor, table))
+		return 0;
+	if (!addRuleName(nested, &name, newRuleOffset, ruleNames, *table)) return 0;
+	return 1;
+}
+
+static int
+getNumber(widechar *source, widechar *dest) {
+	/* Convert a string of wide character digits to an integer */
+	int k = 0;
+	*dest = 0;
+	while (source[k] >= '0' && source[k] <= '9') *dest = 10 * *dest + (source[k++] - '0');
+	return k;
+}
+
+/* Start of multipass compiler */
+
+static int
+passGetAttributes(CharsString *passLine, int *passLinepos,
+		TranslationTableCharacterAttributes *passAttributes, FileInfo *passNested) {
+	int more = 1;
+	*passAttributes = 0;
+	while (more) {
+		switch (passLine->chars[*passLinepos]) {
+		case pass_any:
+			*passAttributes = 0xffffffff;
+			break;
+		case pass_digit:
+			*passAttributes |= CTC_Digit;
+			break;
+		case pass_litDigit:
+			*passAttributes |= CTC_LitDigit;
+			break;
+		case pass_letter:
+			*passAttributes |= CTC_Letter;
+			break;
+		case pass_math:
+			*passAttributes |= CTC_Math;
+			break;
+		case pass_punctuation:
+			*passAttributes |= CTC_Punctuation;
+			break;
+		case pass_sign:
+			*passAttributes |= CTC_Sign;
+			break;
+		case pass_space:
+			*passAttributes |= CTC_Space;
+			break;
+		case pass_uppercase:
+			*passAttributes |= CTC_UpperCase;
+			break;
+		case pass_lowercase:
+			*passAttributes |= CTC_LowerCase;
+			break;
+		case pass_class1:
+			*passAttributes |= CTC_Class1;
+			break;
+		case pass_class2:
+			*passAttributes |= CTC_Class2;
+			break;
+		case pass_class3:
+			*passAttributes |= CTC_Class3;
+			break;
+		case pass_class4:
+			*passAttributes |= CTC_Class4;
+			break;
+		default:
+			more = 0;
+			break;
+		}
+		if (more) (*passLinepos)++;
+	}
+	if (!*passAttributes) {
+		compileError(passNested, "missing attribute");
+		(*passLinepos)--;
+		return 0;
+	}
+	return 1;
+}
+
+static int
+passGetEmphasis(CharsString *passLine, int *passLinepos, FileInfo *passNested) {
+	static widechar passEmphasis;
+	int more = 1;
+	(*passLinepos)++;
+	passEmphasis = 0;
+	while (more) {
+		switch (passLine->chars[*passLinepos]) {
+		case 'i':
+			passEmphasis |= italic;
+			break;
+		case 'b':
+			passEmphasis |= bold;
+			break;
+		case 'u':
+			passEmphasis |= underline;
+			break;
+		case 'c':
+			passEmphasis |= computer_braille;
+			break;
+		default:
+			more = 0;
+			break;
+		}
+		if (more) (*passLinepos)++;
+	}
+	if (!passEmphasis) {
+		compileError(passNested, "emphasis indicators expected");
+		(*passLinepos)--;
+		return 0;
+	}
+	return 1;
+}
+
+static int
+passGetDots(CharsString *passLine, int *passLinepos, CharsString *passHoldString,
+		FileInfo *passNested) {
+	CharsString collectDots;
+	collectDots.length = 0;
+	while (*passLinepos < passLine->length &&
+			(passLine->chars[*passLinepos] == '-' ||
+					(passLine->chars[*passLinepos] >= '0' &&
+							passLine->chars[*passLinepos] <= '9') ||
+					((passLine->chars[*passLinepos] | 32) >= 'a' &&
+							(passLine->chars[*passLinepos] | 32) <= 'f')))
+		collectDots.chars[collectDots.length++] = passLine->chars[(*passLinepos)++];
+	if (!parseDots(passNested, passHoldString, &collectDots)) return 0;
+	return 1;
+}
+
+static int
+passGetString(CharsString *passLine, int *passLinepos, CharsString *passHoldString,
+		FileInfo *passNested) {
+	passHoldString->length = 0;
+	while (1) {
+		if ((*passLinepos >= passLine->length) || !passLine->chars[*passLinepos]) {
+			compileError(passNested, "unterminated string");
+			return 0;
+		}
+		if (passLine->chars[*passLinepos] == 34) break;
+		if (passLine->chars[*passLinepos] == QUOTESUB)
+			passHoldString->chars[passHoldString->length++] = 34;
+		else
+			passHoldString->chars[passHoldString->length++] =
+					passLine->chars[*passLinepos];
+		(*passLinepos)++;
+	}
+	passHoldString->chars[passHoldString->length] = 0;
+	(*passLinepos)++;
+	return 1;
+}
+
+static int
+passGetNumber(CharsString *passLine, int *passLinepos, widechar *passHoldNumber) {
+	/* Convert a string of wide character digits to an integer */
+	*passHoldNumber = 0;
+	while ((*passLinepos < passLine->length) && (passLine->chars[*passLinepos] >= '0') &&
+			(passLine->chars[*passLinepos] <= '9'))
+		*passHoldNumber =
+				10 * (*passHoldNumber) + (passLine->chars[(*passLinepos)++] - '0');
+	return 1;
+}
+
+static int
+passGetVariableNumber(FileInfo *nested, CharsString *passLine, int *passLinepos,
+		widechar *passHoldNumber) {
+	if (!passGetNumber(passLine, passLinepos, passHoldNumber)) return 0;
+	if ((*passHoldNumber >= 0) && (*passHoldNumber < NUMVAR)) return 1;
+	compileError(nested, "variable number out of range");
+	return 0;
+}
+
+static int
+passGetName(CharsString *passLine, int *passLinepos, CharsString *passHoldString,
+		FileInfo *passNested, TranslationTableHeader *table) {
+	TranslationTableCharacterAttributes attr;
+	passHoldString->length = 0;
+	do {
+		attr = definedCharOrDots(passNested, passLine->chars[*passLinepos], 0,
+				table)->attributes;
+		if (passHoldString->length == 0) {
+			if (!(attr & CTC_Letter)) {
+				(*passLinepos)++;
+				continue;
+			}
+		}
+		if (!(attr & CTC_Letter)) break;
+		passHoldString->chars[passHoldString->length++] = passLine->chars[*passLinepos];
+		(*passLinepos)++;
+	} while (*passLinepos < passLine->length);
+	return 1;
+}
+
+static int
+passIsKeyword(const char *token, CharsString *passLine, int *passLinepos) {
+	int k;
+	int length = (int)strlen(token);
+	int ch = passLine->chars[*passLinepos + length + 1];
+	if (((ch | 32) >= 'a' && (ch | 32) <= 'z') || (ch >= '0' && ch <= '9')) return 0;
+	for (k = 0; k < length && passLine->chars[*passLinepos + k + 1] == (widechar)token[k];
+			k++)
+		;
+	if (k == length) {
+		*passLinepos += length + 1;
+		return 1;
+	}
+	return 0;
+}
+
+struct PassName {
+	struct PassName *next;
+	int varnum;
+	widechar length;
+	widechar name[1];
+};
+
+static struct PassName *passNames = NULL;
+
+static int
+passFindName(const CharsString *name, FileInfo *passNested,
+		TranslationTableOpcode *passOpcode) {
+	const struct PassName *curname = passNames;
+	CharsString augmentedName;
+	for (augmentedName.length = 0; augmentedName.length < name->length;
+			augmentedName.length++)
+		augmentedName.chars[augmentedName.length] = name->chars[augmentedName.length];
+	augmentedName.chars[augmentedName.length++] = *passOpcode;
+	while (curname) {
+		if ((augmentedName.length == curname->length) &&
+				(memcmp(&augmentedName.chars[0], curname->name,
+						 CHARSIZE * name->length) == 0))
+			return curname->varnum;
+		curname = curname->next;
+	}
+	compileError(passNested, "name not found");
+	return 0;
+}
+
+static int
+passAddName(CharsString *name, int var, TranslationTableOpcode *passOpcode) {
+	int k;
+	struct PassName *curname;
+	CharsString augmentedName;
+	for (augmentedName.length = 0; augmentedName.length < name->length;
+			augmentedName.length++)
+		augmentedName.chars[augmentedName.length] = name->chars[augmentedName.length];
+	augmentedName.chars[augmentedName.length++] = *passOpcode;
+	if (!(curname = malloc(sizeof(*curname) + CHARSIZE * (augmentedName.length - 1)))) {
+		_lou_outOfMemory();
+	}
+	memset(curname, 0, sizeof(*curname));
+	for (k = 0; k < augmentedName.length; k++) {
+		curname->name[k] = augmentedName.chars[k];
+	}
+	curname->length = augmentedName.length;
+	curname->varnum = var;
+	curname->next = passNames;
+	passNames = curname;
+	return 1;
+}
+
+static pass_Codes
+passGetScriptToken(CharsString *passLine, int *passLinepos, int *passPrevLinepos,
+		CharsString *passHoldString, widechar *passHoldNumber, FileInfo *passNested,
+		TranslationTableHeader *table) {
+	while (*passLinepos < passLine->length) {
+		*passPrevLinepos = *passLinepos;
+		switch (passLine->chars[*passLinepos]) {
+		case '\"':
+			(*passLinepos)++;
+			if (passGetString(passLine, passLinepos, passHoldString, passNested))
+				return pass_string;
+			return pass_invalidToken;
+		case '@':
+			(*passLinepos)++;
+			if (passGetDots(passLine, passLinepos, passHoldString, passNested))
+				return pass_dots;
+			return pass_invalidToken;
+		case '#': /* comment */
+			*passLinepos = passLine->length + 1;
+			return pass_noMoreTokens;
+		case '!':
+			if (passLine->chars[*passLinepos + 1] == '=') {
+				*passLinepos += 2;
+				return pass_noteq;
+			}
+			(*passLinepos)++;
+			return pass_not;
+		case '-':
+			(*passLinepos)++;
+			return pass_hyphen;
+		case '=':
+			(*passLinepos)++;
+			return pass_eq;
+		case '<':
+			(*passLinepos)++;
+			if (passLine->chars[*passLinepos] == '=') {
+				(*passLinepos)++;
+				return pass_lteq;
+			}
+			return pass_lt;
+		case '>':
+			(*passLinepos)++;
+			if (passLine->chars[*passLinepos] == '=') {
+				(*passLinepos)++;
+				return pass_gteq;
+			}
+			return pass_gt;
+		case '+':
+			(*passLinepos)++;
+			return pass_plus;
+		case '(':
+			(*passLinepos)++;
+			return pass_leftParen;
+		case ')':
+			(*passLinepos)++;
+			return pass_rightParen;
+		case ',':
+			(*passLinepos)++;
+			return pass_comma;
+		case '&':
+			if (passLine->chars[ *passLinepos = 1] == '&') {
+				*passLinepos += 2;
+				return pass_and;
+			}
+			return pass_invalidToken;
+		case '|':
+			if (passLine->chars[*passLinepos + 1] == '|') {
+				*passLinepos += 2;
+				return pass_or;
+			}
+			return pass_invalidToken;
+		case 'a':
+			if (passIsKeyword("ttr", passLine, passLinepos)) return pass_attributes;
+			passGetName(passLine, passLinepos, passHoldString, passNested, table);
+			return pass_nameFound;
+		case 'b':
+			if (passIsKeyword("ack", passLine, passLinepos)) return pass_lookback;
+			if (passIsKeyword("ool", passLine, passLinepos)) return pass_boolean;
+			passGetName(passLine, passLinepos, passHoldString, passNested, table);
+			return pass_nameFound;
+		case 'c':
+			if (passIsKeyword("lass", passLine, passLinepos)) return pass_class;
+			passGetName(passLine, passLinepos, passHoldString, passNested, table);
+			return pass_nameFound;
+		case 'd':
+			if (passIsKeyword("ef", passLine, passLinepos)) return pass_define;
+			passGetName(passLine, passLinepos, passHoldString, passNested, table);
+			return pass_nameFound;
+		case 'e':
+			if (passIsKeyword("mph", passLine, passLinepos)) return pass_emphasis;
+			passGetName(passLine, passLinepos, passHoldString, passNested, table);
+			return pass_nameFound;
+		case 'f':
+			if (passIsKeyword("ind", passLine, passLinepos)) return pass_search;
+			if (passIsKeyword("irst", passLine, passLinepos)) return pass_first;
+			passGetName(passLine, passLinepos, passHoldString, passNested, table);
+			return pass_nameFound;
+		case 'g':
+			if (passIsKeyword("roup", passLine, passLinepos)) return pass_group;
+			passGetName(passLine, passLinepos, passHoldString, passNested, table);
+			return pass_nameFound;
+		case 'i':
+			if (passIsKeyword("f", passLine, passLinepos)) return pass_if;
+			passGetName(passLine, passLinepos, passHoldString, passNested, table);
+			return pass_nameFound;
+		case 'l':
+			if (passIsKeyword("ast", passLine, passLinepos)) return pass_last;
+			passGetName(passLine, passLinepos, passHoldString, passNested, table);
+			return pass_nameFound;
+		case 'm':
+			if (passIsKeyword("ark", passLine, passLinepos)) return pass_mark;
+			passGetName(passLine, passLinepos, passHoldString, passNested, table);
+			return pass_nameFound;
+		case 'r':
+			if (passIsKeyword("epgroup", passLine, passLinepos)) return pass_repGroup;
+			if (passIsKeyword("epcopy", passLine, passLinepos)) return pass_copy;
+			if (passIsKeyword("epomit", passLine, passLinepos)) return pass_omit;
+			if (passIsKeyword("ep", passLine, passLinepos)) return pass_replace;
+			passGetName(passLine, passLinepos, passHoldString, passNested, table);
+			return pass_nameFound;
+		case 's':
+			if (passIsKeyword("cript", passLine, passLinepos)) return pass_script;
+			if (passIsKeyword("wap", passLine, passLinepos)) return pass_swap;
+			passGetName(passLine, passLinepos, passHoldString, passNested, table);
+			return pass_nameFound;
+		case 't':
+			if (passIsKeyword("hen", passLine, passLinepos)) return pass_then;
+			passGetName(passLine, passLinepos, passHoldString, passNested, table);
+			return pass_nameFound;
+		default:
+			if (passLine->chars[*passLinepos] <= 32) {
+				(*passLinepos)++;
+				break;
+			}
+			if (passLine->chars[*passLinepos] >= '0' &&
+					passLine->chars[*passLinepos] <= '9') {
+				passGetNumber(passLine, passLinepos, passHoldNumber);
+				return pass_numberFound;
+			} else {
+				if (!passGetName(
+							passLine, passLinepos, passHoldString, passNested, table))
+					return pass_invalidToken;
+				else
+					return pass_nameFound;
+			}
+		}
+	}
+	return pass_noMoreTokens;
+}
+
+static int
+passIsLeftParen(CharsString *passLine, int *passLinepos, int *passPrevLinepos,
+		CharsString *passHoldString, FileInfo *passNested,
+		TranslationTableHeader *table) {
+	widechar passHoldNumber;
+	pass_Codes passCode = passGetScriptToken(passLine, passLinepos, passPrevLinepos,
+			passHoldString, &passHoldNumber, passNested, table);
+	if (passCode != pass_leftParen) {
+		compileError(passNested, "'(' expected");
+		return 0;
+	}
+	return 1;
+}
+
+static int
+passIsName(CharsString *passLine, int *passLinepos, int *passPrevLinepos,
+		CharsString *passHoldString, FileInfo *passNested,
+		TranslationTableHeader *table) {
+	widechar passHoldNumber;
+	pass_Codes passCode = passGetScriptToken(passLine, passLinepos, passPrevLinepos,
+			passHoldString, &passHoldNumber, passNested, table);
+	if (passCode != pass_nameFound) {
+		compileError(passNested, "a name expected");
+		return 0;
+	}
+	return 1;
+}
+
+static int
+passIsComma(CharsString *passLine, int *passLinepos, int *passPrevLinepos,
+		CharsString *passHoldString, FileInfo *passNested,
+		TranslationTableHeader *table) {
+	widechar passHoldNumber;
+	pass_Codes passCode = passGetScriptToken(passLine, passLinepos, passPrevLinepos,
+			passHoldString, &passHoldNumber, passNested, table);
+	if (passCode != pass_comma) {
+		compileError(passNested, "',' expected");
+		return 0;
+	}
+	return 1;
+}
+
+static int
+passIsNumber(CharsString *passLine, int *passLinepos, int *passPrevLinepos,
+		CharsString *passHoldString, widechar *passHoldNumber, FileInfo *passNested,
+		TranslationTableHeader *table) {
+	pass_Codes passCode = passGetScriptToken(passLine, passLinepos, passPrevLinepos,
+			passHoldString, passHoldNumber, passNested, table);
+	if (passCode != pass_numberFound) {
+		compileError(passNested, "a number expected");
+		return 0;
+	}
+	return 1;
+}
+
+static int
+passIsRightParen(CharsString *passLine, int *passLinepos, int *passPrevLinepos,
+		CharsString *passHoldString, FileInfo *passNested,
+		TranslationTableHeader *table) {
+	widechar passHoldNumber;
+	pass_Codes passCode = passGetScriptToken(passLine, passLinepos, passPrevLinepos,
+			passHoldString, &passHoldNumber, passNested, table);
+	if (passCode != pass_rightParen) {
+		compileError(passNested, "')' expected");
+		return 0;
+	}
+	return 1;
+}
+
+static int
+passGetRange(CharsString *passLine, int *passLinepos, int *passPrevLinepos,
+		CharsString *passHoldString, FileInfo *passNested, widechar *passInstructions,
+		int *passIC, TranslationTableHeader *table) {
+	widechar passHoldNumber;
+	pass_Codes passCode = passGetScriptToken(passLine, passLinepos, passPrevLinepos,
+			passHoldString, &passHoldNumber, passNested, table);
+	if (!(passCode == pass_comma || passCode == pass_rightParen)) {
+		compileError(passNested, "invalid range");
+		return 0;
+	}
+	if (passCode == pass_rightParen) {
+		passInstructions[(*passIC)++] = 1;
+		passInstructions[(*passIC)++] = 1;
+		return 1;
+	}
+	if (!passIsNumber(passLine, passLinepos, passPrevLinepos, passHoldString,
+				&passHoldNumber, passNested, table))
+		return 0;
+	passInstructions[(*passIC)++] = passHoldNumber;
+	passCode = passGetScriptToken(passLine, passLinepos, passPrevLinepos, passHoldString,
+			&passHoldNumber, passNested, table);
+	if (!(passCode == pass_comma || passCode == pass_rightParen)) {
+		compileError(passNested, "invalid range");
+		return 0;
+	}
+	if (passCode == pass_rightParen) {
+		passInstructions[(*passIC)++] = passHoldNumber;
+		return 1;
+	}
+	if (!passIsNumber(passLine, passLinepos, passPrevLinepos, passHoldString,
+				&passHoldNumber, passNested, table))
+		return 0;
+	passInstructions[(*passIC)++] = passHoldNumber;
+	if (!passIsRightParen(passLine, passLinepos, passPrevLinepos, passHoldString,
+				passNested, table))
+		return 0;
+	return 1;
+}
+
+static int
+passInsertAttributes(CharsString *passLine, int *passLinepos, int *passPrevLinepos,
+		CharsString *passHoldString, TranslationTableCharacterAttributes *passAttributes,
+		FileInfo *passNested, widechar *passInstructions, int *passIC,
+		TranslationTableHeader *table) {
+	passInstructions[(*passIC)++] = pass_attributes;
+	passInstructions[(*passIC)++] = *passAttributes >> 16;
+	passInstructions[(*passIC)++] = *passAttributes & 0xffff;
+	if (!passGetRange(passLine, passLinepos, passPrevLinepos, passHoldString, passNested,
+				passInstructions, passIC, table))
+		return 0;
+	return 1;
+}
+
+static inline int
+wantsString(TranslationTableOpcode opcode, int actionPart, int nofor) {
+	if (opcode == CTO_Correct) return 1;
+	if (opcode != CTO_Context) return 0;
+	return !nofor == !actionPart;
+}
+
+static int
+verifyStringOrDots(FileInfo *nested, TranslationTableOpcode opcode, int isString,
+		int actionPart, int nofor) {
+	if (!wantsString(opcode, actionPart, nofor) == !isString) return 1;
+
+	compileError(nested, "%s are not allowed in the %s part of a %s translation %s rule.",
+			isString ? "strings" : "dots", getPartName(actionPart),
+			nofor ? "backward" : "forward", _lou_findOpcodeName(opcode));
+
+	return 0;
+}
+
+static int
+compilePassOpcode(FileInfo *nested, TranslationTableOpcode opcode,
+		CharacterClass *characterClasses, TranslationTableOffset *newRuleOffset,
+		TranslationTableRule **newRule, int noback, int nofor, RuleName *ruleNames,
+		TranslationTableHeader **table) {
+	static CharsString passRuleChars;
+	static CharsString passRuleDots;
+	/* Compile the operands of a pass opcode */
+	widechar passSubOp;
+	const CharacterClass *class;
+	TranslationTableOffset ruleOffset = 0;
+	TranslationTableRule *rule = NULL;
+	int k;
+	int kk = 0;
+	pass_Codes passCode;
+	int endTest = 0;
+	int isScript = 1;
+	widechar *passInstructions = passRuleDots.chars;
+	int passIC = 0; /* Instruction counter */
+	passRuleChars.length = 0;
+	FileInfo *passNested = nested;
+	TranslationTableOpcode passOpcode = opcode;
+	CharsString passHoldString;
+	widechar passHoldNumber;
+	CharsString passLine;
+	int passLinepos = 0;
+	int passPrevLinepos;
+	TranslationTableCharacterAttributes passAttributes;
+	passHoldString.length = 0;
+	for (k = nested->linepos; k < nested->linelen; k++)
+		passHoldString.chars[passHoldString.length++] = nested->line[k];
+	if (!eqasc2uni((unsigned char *)"script", passHoldString.chars, 6)) {
+		isScript = 0;
+#define SEPCHAR 0x0001
+		for (k = 0; k < passHoldString.length && passHoldString.chars[k] > 32; k++)
+			;
+		if (k < passHoldString.length)
+			passHoldString.chars[k] = SEPCHAR;
+		else {
+			compileError(passNested, "Invalid multipass operands");
+			return 0;
+		}
+	}
+	parseChars(passNested, &passLine, &passHoldString);
+	if (isScript) {
+		int more = 1;
+		passCode = passGetScriptToken(&passLine, &passLinepos, &passPrevLinepos,
+				&passHoldString, &passHoldNumber, passNested, *table);
+		if (passCode != pass_script) {
+			compileError(passNested, "Invalid multipass statement");
+			return 0;
+		}
+		/* Declaratives */
+		while (more) {
+			passCode = passGetScriptToken(&passLine, &passLinepos, &passPrevLinepos,
+					&passHoldString, &passHoldNumber, passNested, *table);
+			switch (passCode) {
+			case pass_define:
+				if (!passIsLeftParen(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				if (!passIsName(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				if (!passIsComma(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				if (!passIsNumber(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, &passHoldNumber, passNested, *table))
+					return 0;
+				if (!passIsRightParen(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				passAddName(&passHoldString, passHoldNumber, &passOpcode);
+				break;
+			case pass_if:
+				more = 0;
+				break;
+			default:
+				compileError(passNested, "invalid definition in declarative part");
+				return 0;
+			}
+		}
+		/* if part */
+		more = 1;
+		while (more) {
+			passCode = passGetScriptToken(&passLine, &passLinepos, &passPrevLinepos,
+					&passHoldString, &passHoldNumber, passNested, *table);
+			passSubOp = passCode;
+			switch (passCode) {
+			case pass_not:
+				passInstructions[passIC++] = pass_not;
+				break;
+			case pass_first:
+				passInstructions[passIC++] = pass_first;
+				break;
+			case pass_last:
+				passInstructions[passIC++] = pass_last;
+				break;
+			case pass_search:
+				passInstructions[passIC++] = pass_search;
+				break;
+			case pass_string:
+				if (!verifyStringOrDots(nested, opcode, 1, 0, nofor)) {
+					return 0;
+				}
+				passInstructions[passIC++] = pass_string;
+				goto ifDoCharsDots;
+			case pass_dots:
+				if (!verifyStringOrDots(nested, opcode, 0, 0, nofor)) {
+					return 0;
+				}
+				passInstructions[passIC++] = pass_dots;
+			ifDoCharsDots:
+				passInstructions[passIC++] = passHoldString.length;
+				for (kk = 0; kk < passHoldString.length; kk++)
+					passInstructions[passIC++] = passHoldString.chars[kk];
+				break;
+			case pass_attributes:
+				if (!passIsLeftParen(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				if (!passGetAttributes(
+							&passLine, &passLinepos, &passAttributes, passNested))
+					return 0;
+				if (!passInsertAttributes(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, &passAttributes, passNested,
+							passInstructions, &passIC, *table))
+					return 0;
+				break;
+			case pass_emphasis:
+				if (!passIsLeftParen(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				if (!passGetEmphasis(&passLine, &passLinepos, passNested)) return 0;
+				/* Right parenthis handled by subfunctiion */
+				break;
+			case pass_lookback:
+				passInstructions[passIC++] = pass_lookback;
+				passCode = passGetScriptToken(&passLine, &passLinepos, &passPrevLinepos,
+						&passHoldString, &passHoldNumber, passNested, *table);
+				if (passCode != pass_leftParen) {
+					passInstructions[passIC++] = 1;
+					passLinepos = passPrevLinepos;
+					break;
+				}
+				if (!passIsNumber(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, &passHoldNumber, passNested, *table))
+					return 0;
+				if (!passIsRightParen(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				passInstructions[passIC] = passHoldNumber;
+				break;
+			case pass_group:
+				if (!passIsLeftParen(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				break;
+			case pass_mark:
+				passInstructions[passIC++] = pass_startReplace;
+				passInstructions[passIC++] = pass_endReplace;
+				break;
+			case pass_replace:
+				passInstructions[passIC++] = pass_startReplace;
+				if (!passIsLeftParen(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				break;
+			case pass_rightParen:
+				passInstructions[passIC++] = pass_endReplace;
+				break;
+			case pass_groupstart:
+			case pass_groupend:
+				if (!passIsLeftParen(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				if (!passGetName(
+							&passLine, &passLinepos, &passHoldString, passNested, *table))
+					return 0;
+				if (!passIsRightParen(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				ruleOffset = findRuleName(&passHoldString, ruleNames);
+				if (ruleOffset)
+					rule = (TranslationTableRule *)&(*table)->ruleArea[ruleOffset];
+				if (rule && rule->opcode == CTO_Grouping) {
+					passInstructions[passIC++] = passSubOp;
+					passInstructions[passIC++] = ruleOffset >> 16;
+					passInstructions[passIC++] = ruleOffset & 0xffff;
+					break;
+				} else {
+					compileError(passNested, "%s is not a grouping name",
+							_lou_showString(
+									&passHoldString.chars[0], passHoldString.length));
+					return 0;
+				}
+				break;
+			case pass_class:
+				if (!passIsLeftParen(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				if (!passGetName(
+							&passLine, &passLinepos, &passHoldString, passNested, *table))
+					return 0;
+				if (!passIsRightParen(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				if (!(class = findCharacterClass(&passHoldString, characterClasses)))
+					return 0;
+				passAttributes = class->attribute;
+				passInsertAttributes(&passLine, &passLinepos, &passPrevLinepos,
+						&passHoldString, &passAttributes, passNested, passInstructions,
+						&passIC, *table);
+				break;
+			case pass_swap:
+				ruleOffset = findRuleName(&passHoldString, ruleNames);
+				if (!passIsLeftParen(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				if (!passGetName(
+							&passLine, &passLinepos, &passHoldString, passNested, *table))
+					return 0;
+				if (!passIsRightParen(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				ruleOffset = findRuleName(&passHoldString, ruleNames);
+				if (ruleOffset)
+					rule = (TranslationTableRule *)&(*table)->ruleArea[ruleOffset];
+				if (rule && (rule->opcode == CTO_SwapCc || rule->opcode == CTO_SwapCd ||
+									rule->opcode == CTO_SwapDd)) {
+					passInstructions[passIC++] = pass_swap;
+					passInstructions[passIC++] = ruleOffset >> 16;
+					passInstructions[passIC++] = ruleOffset & 0xffff;
+					if (!passGetRange(&passLine, &passLinepos, &passPrevLinepos,
+								&passHoldString, passNested, passInstructions, &passIC,
+								*table))
+						return 0;
+					break;
+				}
+				compileError(passNested, "%s is not a swap name.",
+						_lou_showString(&passHoldString.chars[0], passHoldString.length));
+				return 0;
+			case pass_nameFound:
+				passHoldNumber = passFindName(&passHoldString, passNested, &passOpcode);
+				passCode = passGetScriptToken(&passLine, &passLinepos, &passPrevLinepos,
+						&passHoldString, &passHoldNumber, passNested, *table);
+				if (!(passCode == pass_eq || passCode == pass_lt || passCode == pass_gt ||
+							passCode == pass_noteq || passCode == pass_lteq ||
+							passCode == pass_gteq)) {
+					compileError(nested, "invalid comparison operator in if part");
+					return 0;
+				}
+				passInstructions[passIC++] = passCode;
+				passInstructions[passIC++] = passHoldNumber;
+				if (!passIsNumber(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, &passHoldNumber, passNested, *table))
+					return 0;
+				passInstructions[passIC++] = passHoldNumber;
+				break;
+			case pass_then:
+				passInstructions[passIC++] = pass_endTest;
+				more = 0;
+				break;
+			default:
+				compileError(passNested, "invalid choice in if part");
+				return 0;
+			}
+		}
+
+		/* then part */
+		more = 1;
+		while (more) {
+			passCode = passGetScriptToken(&passLine, &passLinepos, &passPrevLinepos,
+					&passHoldString, &passHoldNumber, passNested, *table);
+			passSubOp = passCode;
+			switch (passCode) {
+			case pass_string:
+				if (!verifyStringOrDots(nested, opcode, 1, 1, nofor)) {
+					return 0;
+				}
+				passInstructions[passIC++] = pass_string;
+				goto thenDoCharsDots;
+			case pass_dots:
+				if (!verifyStringOrDots(nested, opcode, 0, 1, nofor)) {
+					return 0;
+				}
+				passInstructions[passIC++] = pass_dots;
+			thenDoCharsDots:
+				passInstructions[passIC++] = passHoldString.length;
+				for (kk = 0; kk < passHoldString.length; kk++)
+					passInstructions[passIC++] = passHoldString.chars[kk];
+				break;
+			case pass_nameFound:
+				passHoldNumber = passFindName(&passHoldString, passNested, &passOpcode);
+				passCode = passGetScriptToken(&passLine, &passLinepos, &passPrevLinepos,
+						&passHoldString, &passHoldNumber, passNested, *table);
+				if (!(passCode == pass_plus || passCode == pass_hyphen ||
+							passCode == pass_eq)) {
+					compileError(nested, "Invalid variable operator in then part");
+					return 0;
+				}
+				passInstructions[passIC++] = passCode;
+				passInstructions[passIC++] = passHoldNumber;
+				if (!passIsNumber(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, &passHoldNumber, passNested, *table))
+					return 0;
+				passInstructions[passIC++] = passHoldNumber;
+				break;
+			case pass_copy:
+				passInstructions[passIC++] = pass_copy;
+				break;
+			case pass_omit:
+				passInstructions[passIC++] = pass_omit;
+				break;
+			case pass_swap:
+				ruleOffset = findRuleName(&passHoldString, ruleNames);
+				if (!passIsLeftParen(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				if (!passGetName(
+							&passLine, &passLinepos, &passHoldString, passNested, *table))
+					return 0;
+				if (!passIsRightParen(&passLine, &passLinepos, &passPrevLinepos,
+							&passHoldString, passNested, *table))
+					return 0;
+				ruleOffset = findRuleName(&passHoldString, ruleNames);
+				if (ruleOffset)
+					rule = (TranslationTableRule *)&(*table)->ruleArea[ruleOffset];
+				if (rule && (rule->opcode == CTO_SwapCc || rule->opcode == CTO_SwapCd ||
+									rule->opcode == CTO_SwapDd)) {
+					passInstructions[passIC++] = pass_swap;
+					passInstructions[passIC++] = ruleOffset >> 16;
+					passInstructions[passIC++] = ruleOffset & 0xffff;
+					if (!passGetRange(&passLine, &passLinepos, &passPrevLinepos,
+								&passHoldString, passNested, passInstructions, &passIC,
+								*table))
+						return 0;
+					break;
+				}
+				compileError(passNested, "%s is not a swap name.",
+						_lou_showString(&passHoldString.chars[0], passHoldString.length));
+				return 0;
+			case pass_noMoreTokens:
+				more = 0;
+				break;
+			default:
+				compileError(passNested, "invalid action in then part");
+				return 0;
+			}
+		}
+	} else {
+		/* Older machine-language-like "assembler". */
+
+		/* Compile test part */
+		for (k = 0; k < passLine.length && passLine.chars[k] != SEPCHAR; k++)
+			;
+		endTest = k;
+		passLine.chars[endTest] = pass_endTest;
+		passLinepos = 0;
+		while (passLinepos <= endTest) {
+			switch ((passSubOp = passLine.chars[passLinepos])) {
+			case pass_lookback:
+				passInstructions[passIC++] = pass_lookback;
+				passLinepos++;
+				passGetNumber(&passLine, &passLinepos, &passHoldNumber);
+				if (passHoldNumber == 0) passHoldNumber = 1;
+				passInstructions[passIC++] = passHoldNumber;
+				break;
+			case pass_not:
+				passInstructions[passIC++] = pass_not;
+				passLinepos++;
+				break;
+			case pass_first:
+				passInstructions[passIC++] = pass_first;
+				passLinepos++;
+				break;
+			case pass_last:
+				passInstructions[passIC++] = pass_last;
+				passLinepos++;
+				break;
+			case pass_search:
+				passInstructions[passIC++] = pass_search;
+				passLinepos++;
+				break;
+			case pass_string:
+				if (!verifyStringOrDots(nested, opcode, 1, 0, nofor)) {
+					return 0;
+				}
+				passLinepos++;
+				passInstructions[passIC++] = pass_string;
+				passGetString(&passLine, &passLinepos, &passHoldString, passNested);
+				goto testDoCharsDots;
+			case pass_dots:
+				if (!verifyStringOrDots(nested, opcode, 0, 0, nofor)) {
+					return 0;
+				}
+				passLinepos++;
+				passInstructions[passIC++] = pass_dots;
+				passGetDots(&passLine, &passLinepos, &passHoldString, passNested);
+			testDoCharsDots:
+				if (passHoldString.length == 0) return 0;
+				passInstructions[passIC++] = passHoldString.length;
+				for (kk = 0; kk < passHoldString.length; kk++)
+					passInstructions[passIC++] = passHoldString.chars[kk];
+				break;
+			case pass_startReplace:
+				passInstructions[passIC++] = pass_startReplace;
+				passLinepos++;
+				break;
+			case pass_endReplace:
+				passInstructions[passIC++] = pass_endReplace;
+				passLinepos++;
+				break;
+			case pass_variable:
+				passLinepos++;
+				if (!passGetVariableNumber(
+							nested, &passLine, &passLinepos, &passHoldNumber))
+					return 0;
+				switch (passLine.chars[passLinepos]) {
+				case pass_eq:
+					passInstructions[passIC++] = pass_eq;
+					goto doComp;
+				case pass_lt:
+					if (passLine.chars[passLinepos + 1] == pass_eq) {
+						passLinepos++;
+						passInstructions[passIC++] = pass_lteq;
+					} else
+						passInstructions[passIC++] = pass_lt;
+					goto doComp;
+				case pass_gt:
+					if (passLine.chars[passLinepos + 1] == pass_eq) {
+						passLinepos++;
+						passInstructions[passIC++] = pass_gteq;
+					} else
+						passInstructions[passIC++] = pass_gt;
+				doComp:
+					passInstructions[passIC++] = passHoldNumber;
+					passLinepos++;
+					passGetNumber(&passLine, &passLinepos, &passHoldNumber);
+					passInstructions[passIC++] = passHoldNumber;
+					break;
+				default:
+					compileError(passNested, "incorrect comparison operator");
+					return 0;
+				}
+				break;
+			case pass_attributes:
+				passLinepos++;
+				if (!passGetAttributes(
+							&passLine, &passLinepos, &passAttributes, passNested))
+					return 0;
+			insertAttributes:
+				passInstructions[passIC++] = pass_attributes;
+				passInstructions[passIC++] = passAttributes >> 16;
+				passInstructions[passIC++] = passAttributes & 0xffff;
+			getRange:
+				if (passLine.chars[passLinepos] == pass_until) {
+					passLinepos++;
+					passInstructions[passIC++] = 1;
+					passInstructions[passIC++] = 0xffff;
+					break;
+				}
+				passGetNumber(&passLine, &passLinepos, &passHoldNumber);
+				if (passHoldNumber == 0) {
+					passHoldNumber = passInstructions[passIC++] = 1;
+					passInstructions[passIC++] = 1; /* This is not an error */
+					break;
+				}
+				passInstructions[passIC++] = passHoldNumber;
+				if (passLine.chars[passLinepos] != pass_hyphen) {
+					passInstructions[passIC++] = passHoldNumber;
+					break;
+				}
+				passLinepos++;
+				passGetNumber(&passLine, &passLinepos, &passHoldNumber);
+				if (passHoldNumber == 0) {
+					compileError(passNested, "invalid range");
+					return 0;
+				}
+				passInstructions[passIC++] = passHoldNumber;
+				break;
+			case pass_groupstart:
+			case pass_groupend:
+				passLinepos++;
+				passGetName(&passLine, &passLinepos, &passHoldString, passNested, *table);
+				ruleOffset = findRuleName(&passHoldString, ruleNames);
+				if (ruleOffset)
+					rule = (TranslationTableRule *)&(*table)->ruleArea[ruleOffset];
+				if (rule && rule->opcode == CTO_Grouping) {
+					passInstructions[passIC++] = passSubOp;
+					passInstructions[passIC++] = ruleOffset >> 16;
+					passInstructions[passIC++] = ruleOffset & 0xffff;
+					break;
+				} else {
+					compileError(passNested, "%s is not a grouping name",
+							_lou_showString(
+									&passHoldString.chars[0], passHoldString.length));
+					return 0;
+				}
+				break;
+			case pass_swap:
+				passGetName(&passLine, &passLinepos, &passHoldString, passNested, *table);
+				if ((class = findCharacterClass(&passHoldString, characterClasses))) {
+					passAttributes = class->attribute;
+					goto insertAttributes;
+				}
+				ruleOffset = findRuleName(&passHoldString, ruleNames);
+				if (ruleOffset)
+					rule = (TranslationTableRule *)&(*table)->ruleArea[ruleOffset];
+				if (rule && (rule->opcode == CTO_SwapCc || rule->opcode == CTO_SwapCd ||
+									rule->opcode == CTO_SwapDd)) {
+					passInstructions[passIC++] = pass_swap;
+					passInstructions[passIC++] = ruleOffset >> 16;
+					passInstructions[passIC++] = ruleOffset & 0xffff;
+					goto getRange;
+				}
+				compileError(passNested, "%s is neither a class name nor a swap name.",
+						_lou_showString(&passHoldString.chars[0], passHoldString.length));
+				return 0;
+			case pass_endTest:
+				passInstructions[passIC++] = pass_endTest;
+				passLinepos++;
+				break;
+			default:
+				compileError(passNested, "incorrect operator '%c ' in test part",
+						passLine.chars[passLinepos]);
+				return 0;
+			}
+
+		} /* Compile action part */
+
+		/* Compile action part */
+		while (passLinepos < passLine.length && passLine.chars[passLinepos] <= 32)
+			passLinepos++;
+		while (passLinepos < passLine.length && passLine.chars[passLinepos] > 32) {
+			switch ((passSubOp = passLine.chars[passLinepos])) {
+			case pass_string:
+				if (!verifyStringOrDots(nested, opcode, 1, 1, nofor)) {
+					return 0;
+				}
+				passLinepos++;
+				passInstructions[passIC++] = pass_string;
+				passGetString(&passLine, &passLinepos, &passHoldString, passNested);
+				goto actionDoCharsDots;
+			case pass_dots:
+				if (!verifyStringOrDots(nested, opcode, 0, 1, nofor)) {
+					return 0;
+				}
+				passLinepos++;
+				passGetDots(&passLine, &passLinepos, &passHoldString, passNested);
+				passInstructions[passIC++] = pass_dots;
+			actionDoCharsDots:
+				if (passHoldString.length == 0) return 0;
+				passInstructions[passIC++] = passHoldString.length;
+				for (kk = 0; kk < passHoldString.length; kk++)
+					passInstructions[passIC++] = passHoldString.chars[kk];
+				break;
+			case pass_variable:
+				passLinepos++;
+				if (!passGetVariableNumber(
+							nested, &passLine, &passLinepos, &passHoldNumber))
+					return 0;
+				switch (passLine.chars[passLinepos]) {
+				case pass_eq:
+					passInstructions[passIC++] = pass_eq;
+					passInstructions[passIC++] = passHoldNumber;
+					passLinepos++;
+					passGetNumber(&passLine, &passLinepos, &passHoldNumber);
+					passInstructions[passIC++] = passHoldNumber;
+					break;
+				case pass_plus:
+				case pass_hyphen:
+					passInstructions[passIC++] = passLine.chars[passLinepos++];
+					passInstructions[passIC++] = passHoldNumber;
+					break;
+				default:
+					compileError(
+							passNested, "incorrect variable operator in action part");
+					return 0;
+				}
+				break;
+			case pass_copy:
+				passInstructions[passIC++] = pass_copy;
+				passLinepos++;
+				break;
+			case pass_omit:
+				passInstructions[passIC++] = pass_omit;
+				passLinepos++;
+				break;
+			case pass_groupreplace:
+			case pass_groupstart:
+			case pass_groupend:
+				passLinepos++;
+				passGetName(&passLine, &passLinepos, &passHoldString, passNested, *table);
+				ruleOffset = findRuleName(&passHoldString, ruleNames);
+				if (ruleOffset)
+					rule = (TranslationTableRule *)&(*table)->ruleArea[ruleOffset];
+				if (rule && rule->opcode == CTO_Grouping) {
+					passInstructions[passIC++] = passSubOp;
+					passInstructions[passIC++] = ruleOffset >> 16;
+					passInstructions[passIC++] = ruleOffset & 0xffff;
+					break;
+				}
+				compileError(passNested, "%s is not a grouping name",
+						_lou_showString(&passHoldString.chars[0], passHoldString.length));
+				return 0;
+			case pass_swap:
+				passLinepos++;
+				passGetName(&passLine, &passLinepos, &passHoldString, passNested, *table);
+				ruleOffset = findRuleName(&passHoldString, ruleNames);
+				if (ruleOffset)
+					rule = (TranslationTableRule *)&(*table)->ruleArea[ruleOffset];
+				if (rule && (rule->opcode == CTO_SwapCc || rule->opcode == CTO_SwapCd ||
+									rule->opcode == CTO_SwapDd)) {
+					passInstructions[passIC++] = pass_swap;
+					passInstructions[passIC++] = ruleOffset >> 16;
+					passInstructions[passIC++] = ruleOffset & 0xffff;
+					break;
+				}
+				compileError(passNested, "%s is not a swap name.",
+						_lou_showString(&passHoldString.chars[0], passHoldString.length));
+				return 0;
+				break;
+			default:
+				compileError(passNested, "incorrect operator in action part");
+				return 0;
+			}
+		}
+	}
+
+	/* Analyze and add rule */
+	passRuleDots.length = passIC;
+
+	{
+		widechar *characters;
+		int length;
+		int found = passFindCharacters(passNested, 0, passInstructions,
+				passRuleDots.length, &characters, &length);
+
+		if (!found) return 0;
+
+		if (characters) {
+			for (k = 0; k < length; k += 1) passRuleChars.chars[k] = characters[k];
+			passRuleChars.length = k;
+		}
+	}
+
+	if (!addRule(passNested, opcode, &passRuleChars, &passRuleDots, 0, 0, newRuleOffset,
+				newRule, noback, nofor, table))
+		return 0;
+	return 1;
+}
+
+/* End of multipass compiler */
+
+static int
+compileBrailleIndicator(FileInfo *nested, char *ermsg, TranslationTableOpcode opcode,
+		TranslationTableOffset *rule, int *lastToken,
+		TranslationTableOffset *newRuleOffset, TranslationTableRule **newRule, int noback,
+		int nofor, TranslationTableHeader **table) {
+	CharsString token;
+	CharsString cells;
+	if (getToken(nested, &token, ermsg, lastToken))
+		if (parseDots(nested, &cells, &token))
+			if (!addRule(nested, opcode, NULL, &cells, 0, 0, newRuleOffset, newRule,
+						noback, nofor, table))
+				return 0;
+	*rule = *newRuleOffset;
+	return 1;
+}
+
+static int
+compileNumber(FileInfo *nested, int *lastToken) {
+	CharsString token;
+	widechar dest;
+	if (!getToken(nested, &token, "number", lastToken)) return 0;
+	getNumber(&token.chars[0], &dest);
+	if (!(dest > 0)) {
+		compileError(nested, "a nonzero positive number is required");
+		return 0;
+	}
+	return dest;
+}
+
+static int
+compileGrouping(FileInfo *nested, int *lastToken, TranslationTableOffset *newRuleOffset,
+		TranslationTableRule **newRule, int noback, int nofor, RuleName **ruleNames,
+		TranslationTableHeader **table) {
+	int k;
+	CharsString name;
+	CharsString groupChars;
+	CharsString groupDots;
+	CharsString dotsParsed;
+	TranslationTableCharacter *charsDotsPtr;
+	widechar endChar;
+	widechar endDots;
+	if (!getToken(nested, &name, "name operand", lastToken)) return 0;
+	if (!getRuleCharsText(nested, &groupChars, lastToken)) return 0;
+	if (!getToken(nested, &groupDots, "dots operand", lastToken)) return 0;
+	for (k = 0; k < groupDots.length && groupDots.chars[k] != ','; k++)
+		;
+	if (k == groupDots.length) {
+		compileError(
+				nested, "Dots operand must consist of two cells separated by a comma");
+		return 0;
+	}
+	groupDots.chars[k] = '-';
+	if (!parseDots(nested, &dotsParsed, &groupDots)) return 0;
+	if (groupChars.length != 2 || dotsParsed.length != 2) {
+		compileError(nested,
+				"two Unicode characters and two cells separated by a comma are needed.");
+		return 0;
+	}
+	charsDotsPtr = addCharOrDots(nested, groupChars.chars[0], 0, table);
+	charsDotsPtr->attributes |= CTC_Math;
+	charsDotsPtr->uppercase = charsDotsPtr->realchar;
+	charsDotsPtr->lowercase = charsDotsPtr->realchar;
+	charsDotsPtr = addCharOrDots(nested, groupChars.chars[1], 0, table);
+	charsDotsPtr->attributes |= CTC_Math;
+	charsDotsPtr->uppercase = charsDotsPtr->realchar;
+	charsDotsPtr->lowercase = charsDotsPtr->realchar;
+	charsDotsPtr = addCharOrDots(nested, dotsParsed.chars[0], 1, table);
+	charsDotsPtr->attributes |= CTC_Math;
+	charsDotsPtr->uppercase = charsDotsPtr->realchar;
+	charsDotsPtr->lowercase = charsDotsPtr->realchar;
+	charsDotsPtr = addCharOrDots(nested, dotsParsed.chars[1], 1, table);
+	charsDotsPtr->attributes |= CTC_Math;
+	charsDotsPtr->uppercase = charsDotsPtr->realchar;
+	charsDotsPtr->lowercase = charsDotsPtr->realchar;
+	if (!addRule(nested, CTO_Grouping, &groupChars, &dotsParsed, 0, 0, newRuleOffset,
+				newRule, noback, nofor, table))
+		return 0;
+	if (!addRuleName(nested, &name, newRuleOffset, ruleNames, *table)) return 0;
+	putCharAndDots(nested, groupChars.chars[0], dotsParsed.chars[0], table);
+	putCharAndDots(nested, groupChars.chars[1], dotsParsed.chars[1], table);
+	endChar = groupChars.chars[1];
+	endDots = dotsParsed.chars[1];
+	groupChars.length = dotsParsed.length = 1;
+	if (!addRule(nested, CTO_Math, &groupChars, &dotsParsed, 0, 0, newRuleOffset, newRule,
+				noback, nofor, table))
+		return 0;
+	groupChars.chars[0] = endChar;
+	dotsParsed.chars[0] = endDots;
+	if (!addRule(nested, CTO_Math, &groupChars, &dotsParsed, 0, 0, newRuleOffset, newRule,
+				noback, nofor, table))
+		return 0;
+	return 1;
+}
+
+static int
+compileUplow(FileInfo *nested, int *lastToken, TranslationTableOffset *newRuleOffset,
+		TranslationTableRule **newRule, int noback, int nofor,
+		TranslationTableHeader **table) {
+	int k;
+	TranslationTableCharacter *upperChar;
+	TranslationTableCharacter *lowerChar;
+	TranslationTableCharacter *upperCell = NULL;
+	TranslationTableCharacter *lowerCell = NULL;
+	CharsString ruleChars;
+	CharsString ruleDots;
+	CharsString upperDots;
+	CharsString lowerDots;
+	int haveLowerDots = 0;
+	TranslationTableCharacterAttributes attr;
+	if (!getRuleCharsText(nested, &ruleChars, lastToken)) return 0;
+	if (!getToken(nested, &ruleDots, "dots operand", lastToken)) return 0;
+	for (k = 0; k < ruleDots.length && ruleDots.chars[k] != ','; k++)
+		;
+	if (k == ruleDots.length) {
+		if (!parseDots(nested, &upperDots, &ruleDots)) return 0;
+		lowerDots.length = upperDots.length;
+		for (k = 0; k < upperDots.length; k++) lowerDots.chars[k] = upperDots.chars[k];
+		lowerDots.chars[k] = 0;
+	} else {
+		haveLowerDots = ruleDots.length;
+		ruleDots.length = k;
+		if (!parseDots(nested, &upperDots, &ruleDots)) return 0;
+		ruleDots.length = 0;
+		k++;
+		for (; k < haveLowerDots; k++)
+			ruleDots.chars[ruleDots.length++] = ruleDots.chars[k];
+		if (!parseDots(nested, &lowerDots, &ruleDots)) return 0;
+	}
+	if (ruleChars.length != 2 || upperDots.length < 1) {
+		compileError(nested,
+				"Exactly two Unicode characters and at least one cell are required.");
+		return 0;
+	}
+	if (haveLowerDots && lowerDots.length < 1) {
+		compileError(nested, "at least one cell is required after the comma.");
+		return 0;
+	}
+	upperChar = addCharOrDots(nested, ruleChars.chars[0], 0, table);
+	upperChar->attributes |= CTC_Letter | CTC_UpperCase;
+	upperChar->uppercase = ruleChars.chars[0];
+	upperChar->lowercase = ruleChars.chars[1];
+	lowerChar = addCharOrDots(nested, ruleChars.chars[1], 0, table);
+	lowerChar->attributes |= CTC_Letter | CTC_LowerCase;
+	lowerChar->uppercase = ruleChars.chars[0];
+	lowerChar->lowercase = ruleChars.chars[1];
+	for (k = 0; k < upperDots.length; k++)
+		if (!compile_findCharOrDots(upperDots.chars[k], 1, *table)) {
+			attr = CTC_Letter | CTC_UpperCase;
+			upperCell = addCharOrDots(nested, upperDots.chars[k], 1, table);
+			upperCell->attributes |= attr;
+			upperCell->uppercase = upperCell->realchar;
+		}
+	if (haveLowerDots) {
+		for (k = 0; k < lowerDots.length; k++)
+			if (!compile_findCharOrDots(lowerDots.chars[k], 1, *table)) {
+				attr = CTC_Letter | CTC_LowerCase;
+				lowerCell = addCharOrDots(nested, lowerDots.chars[k], 1, table);
+				if (lowerDots.length != 1) attr = CTC_Space;
+				lowerCell->attributes |= attr;
+				lowerCell->lowercase = lowerCell->realchar;
+			}
+	} else if (upperCell != NULL && upperDots.length == 1)
+		upperCell->attributes |= CTC_LowerCase;
+	if (lowerDots.length == 1)
+		putCharAndDots(nested, ruleChars.chars[1], lowerDots.chars[0], table);
+	if (upperCell != NULL) upperCell->lowercase = lowerDots.chars[0];
+	if (lowerCell != NULL) lowerCell->uppercase = upperDots.chars[0];
+	if (upperDots.length == 1)
+		putCharAndDots(nested, ruleChars.chars[0], upperDots.chars[0], table);
+	ruleChars.length = 1;
+	ruleChars.chars[2] = ruleChars.chars[0];
+	ruleChars.chars[0] = ruleChars.chars[1];
+	if (!addRule(nested, CTO_LowerCase, &ruleChars, &lowerDots, 0, 0, newRuleOffset,
+				newRule, noback, nofor, table))
+		return 0;
+	ruleChars.chars[0] = ruleChars.chars[2];
+	if (!addRule(nested, CTO_UpperCase, &ruleChars, &upperDots, 0, 0, newRuleOffset,
+				newRule, noback, nofor, table))
+		return 0;
+	return 1;
+}
+
+/* Functions for compiling hyphenation tables */
+
+typedef struct HyphenDict { /* hyphenation dictionary: finite state machine */
+	int numStates;
+	HyphenationState *states;
+} HyphenDict;
+
+#define DEFAULTSTATE 0xffff
+#define HYPHENHASHSIZE 8191
+
+typedef struct HyphenHashEntry {
+	struct HyphenHashEntry *next;
+	CharsString *key;
+	int val;
+} HyphenHashEntry;
+
+typedef struct HyphenHashTab { HyphenHashEntry *entries[HYPHENHASHSIZE]; } HyphenHashTab;
+
+/* a hash function from ASU - adapted from Gtk+ */
+static unsigned int
+hyphenStringHash(const CharsString *s) {
+	int k;
+	unsigned int h = 0, g;
+	for (k = 0; k < s->length; k++) {
+		h = (h << 4) + s->chars[k];
+		if ((g = h & 0xf0000000)) {
+			h = h ^ (g >> 24);
+			h = h ^ g;
+		}
+	}
+	return h;
+}
+
+static HyphenHashTab *
+hyphenHashNew(void) {
+	HyphenHashTab *hashTab;
+	if (!(hashTab = malloc(sizeof(HyphenHashTab)))) _lou_outOfMemory();
+	memset(hashTab, 0, sizeof(HyphenHashTab));
+	return hashTab;
+}
+
+static void
+hyphenHashFree(HyphenHashTab *hashTab) {
+	int i;
+	HyphenHashEntry *e, *next;
+	for (i = 0; i < HYPHENHASHSIZE; i++)
+		for (e = hashTab->entries[i]; e; e = next) {
+			next = e->next;
+			free(e->key);
+			free(e);
+		}
+	free(hashTab);
+}
+
+/* assumes that key is not already present! */
+static void
+hyphenHashInsert(HyphenHashTab *hashTab, const CharsString *key, int val) {
+	int i, j;
+	HyphenHashEntry *e;
+	i = hyphenStringHash(key) % HYPHENHASHSIZE;
+	if (!(e = malloc(sizeof(HyphenHashEntry)))) _lou_outOfMemory();
+	e->next = hashTab->entries[i];
+	e->key = malloc((key->length + 1) * CHARSIZE);
+	if (!e->key) _lou_outOfMemory();
+	e->key->length = key->length;
+	for (j = 0; j < key->length; j++) e->key->chars[j] = key->chars[j];
+	e->val = val;
+	hashTab->entries[i] = e;
+}
+
+/* return val if found, otherwise DEFAULTSTATE */
+static int
+hyphenHashLookup(HyphenHashTab *hashTab, const CharsString *key) {
+	int i, j;
+	HyphenHashEntry *e;
+	if (key->length == 0) return 0;
+	i = hyphenStringHash(key) % HYPHENHASHSIZE;
+	for (e = hashTab->entries[i]; e; e = e->next) {
+		if (key->length != e->key->length) continue;
+		for (j = 0; j < key->length; j++)
+			if (key->chars[j] != e->key->chars[j]) break;
+		if (j == key->length) return e->val;
+	}
+	return DEFAULTSTATE;
+}
+
+static int
+hyphenGetNewState(HyphenDict *dict, HyphenHashTab *hashTab, const CharsString *string) {
+	hyphenHashInsert(hashTab, string, dict->numStates);
+	/* predicate is true if dict->numStates is a power of two */
+	if (!(dict->numStates & (dict->numStates - 1)))
+		dict->states =
+				realloc(dict->states, (dict->numStates << 1) * sizeof(HyphenationState));
+	if (!dict->states) _lou_outOfMemory();
+	dict->states[dict->numStates].hyphenPattern = 0;
+	dict->states[dict->numStates].fallbackState = DEFAULTSTATE;
+	dict->states[dict->numStates].numTrans = 0;
+	dict->states[dict->numStates].trans.pointer = NULL;
+	return dict->numStates++;
+}
+
+/* add a transition from state1 to state2 through ch - assumes that the
+ * transition does not already exist */
+static void
+hyphenAddTrans(HyphenDict *dict, int state1, int state2, widechar ch) {
+	int numTrans;
+	numTrans = dict->states[state1].numTrans;
+	if (numTrans == 0)
+		dict->states[state1].trans.pointer = malloc(sizeof(HyphenationTrans));
+	else if (!(numTrans & (numTrans - 1)))
+		dict->states[state1].trans.pointer = realloc(dict->states[state1].trans.pointer,
+				(numTrans << 1) * sizeof(HyphenationTrans));
+	dict->states[state1].trans.pointer[numTrans].ch = ch;
+	dict->states[state1].trans.pointer[numTrans].newState = state2;
+	dict->states[state1].numTrans++;
+}
+
+static int
+compileHyphenation(FileInfo *nested, CharsString *encoding, int *lastToken,
+		TranslationTableHeader **table) {
+	CharsString hyph;
+	HyphenationTrans *holdPointer;
+	HyphenHashTab *hashTab;
+	CharsString word;
+	char pattern[MAXSTRING];
+	unsigned int stateNum = 0, lastState = 0;
+	int i, j, k = encoding->length;
+	widechar ch;
+	int found;
+	HyphenHashEntry *e;
+	HyphenDict dict;
+	TranslationTableOffset holdOffset;
+	/* Set aside enough space for hyphenation states and transitions in
+	 * translation table. Must be done before anything else */
+	reserveSpaceInTable(nested, 250000, table);
+	hashTab = hyphenHashNew();
+	dict.numStates = 1;
+	dict.states = malloc(sizeof(HyphenationState));
+	if (!dict.states) _lou_outOfMemory();
+	dict.states[0].hyphenPattern = 0;
+	dict.states[0].fallbackState = DEFAULTSTATE;
+	dict.states[0].numTrans = 0;
+	dict.states[0].trans.pointer = NULL;
+	do {
+		if (encoding->chars[0] == 'I') {
+			if (!getToken(nested, &hyph, NULL, lastToken)) continue;
+		} else {
+			/* UTF-8 */
+			if (!getToken(nested, &word, NULL, lastToken)) continue;
+			parseChars(nested, &hyph, &word);
+		}
+		if (hyph.length == 0 || hyph.chars[0] == '#' || hyph.chars[0] == '%' ||
+				hyph.chars[0] == '<')
+			continue; /* comment */
+		for (i = 0; i < hyph.length; i++)
+			definedCharOrDots(nested, hyph.chars[i], 0, *table);
+		j = 0;
+		pattern[j] = '0';
+		for (i = 0; i < hyph.length; i++) {
+			if (hyph.chars[i] >= '0' && hyph.chars[i] <= '9')
+				pattern[j] = (char)hyph.chars[i];
+			else {
+				word.chars[j] = hyph.chars[i];
+				pattern[++j] = '0';
+			}
+		}
+		word.chars[j] = 0;
+		word.length = j;
+		pattern[j + 1] = 0;
+		for (i = 0; pattern[i] == '0'; i++)
+			;
+		found = hyphenHashLookup(hashTab, &word);
+		if (found != DEFAULTSTATE)
+			stateNum = found;
+		else
+			stateNum = hyphenGetNewState(&dict, hashTab, &word);
+		k = j + 2 - i;
+		if (k > 0) {
+			allocateSpaceInTable(nested, &dict.states[stateNum].hyphenPattern, k, table);
+			memcpy(&(*table)->ruleArea[dict.states[stateNum].hyphenPattern], &pattern[i],
+					k);
+		}
+		/* now, put in the prefix transitions */
+		while (found == DEFAULTSTATE) {
+			lastState = stateNum;
+			ch = word.chars[word.length-- - 1];
+			found = hyphenHashLookup(hashTab, &word);
+			if (found != DEFAULTSTATE)
+				stateNum = found;
+			else
+				stateNum = hyphenGetNewState(&dict, hashTab, &word);
+			hyphenAddTrans(&dict, stateNum, lastState, ch);
+		}
+	} while (_lou_getALine(nested));
+	/* put in the fallback states */
+	for (i = 0; i < HYPHENHASHSIZE; i++) {
+		for (e = hashTab->entries[i]; e; e = e->next) {
+			for (j = 1; j <= e->key->length; j++) {
+				word.length = 0;
+				for (k = j; k < e->key->length; k++)
+					word.chars[word.length++] = e->key->chars[k];
+				stateNum = hyphenHashLookup(hashTab, &word);
+				if (stateNum != DEFAULTSTATE) break;
+			}
+			if (e->val) dict.states[e->val].fallbackState = stateNum;
+		}
+	}
+	hyphenHashFree(hashTab);
+	/* Transfer hyphenation information to table */
+	for (i = 0; i < dict.numStates; i++) {
+		if (dict.states[i].numTrans == 0)
+			dict.states[i].trans.offset = 0;
+		else {
+			holdPointer = dict.states[i].trans.pointer;
+			allocateSpaceInTable(nested, &dict.states[i].trans.offset,
+					dict.states[i].numTrans * sizeof(HyphenationTrans), table);
+			memcpy(&(*table)->ruleArea[dict.states[i].trans.offset], holdPointer,
+					dict.states[i].numTrans * sizeof(HyphenationTrans));
+			free(holdPointer);
+		}
+	}
+	allocateSpaceInTable(
+			nested, &holdOffset, dict.numStates * sizeof(HyphenationState), table);
+	(*table)->hyphenStatesArray = holdOffset;
+	/* Prevents segmentation fault if table is reallocated */
+	memcpy(&(*table)->ruleArea[(*table)->hyphenStatesArray], &dict.states[0],
+			dict.numStates * sizeof(HyphenationState));
+	free(dict.states);
+	return 1;
+}
+
+static int
+compileCharDef(FileInfo *nested, TranslationTableOpcode opcode,
+		TranslationTableCharacterAttributes attributes, int *lastToken,
+		TranslationTableOffset *newRuleOffset, TranslationTableRule **newRule, int noback,
+		int nofor, TranslationTableHeader **table) {
+	CharsString ruleChars;
+	CharsString ruleDots;
+	TranslationTableCharacter *character;
+	TranslationTableCharacter *cell = NULL;
+	int k;
+	if (!getRuleCharsText(nested, &ruleChars, lastToken)) return 0;
+	if (!getRuleDotsPattern(nested, &ruleDots, lastToken)) return 0;
+	if (ruleChars.length != 1) {
+		compileError(nested, "Exactly one character is required.");
+		return 0;
+	}
+	if (ruleDots.length < 1) {
+		compileError(nested, "At least one cell is required.");
+		return 0;
+	}
+	if (attributes & (CTC_UpperCase | CTC_LowerCase)) attributes |= CTC_Letter;
+	character = addCharOrDots(nested, ruleChars.chars[0], 0, table);
+	character->attributes |= attributes;
+	character->uppercase = character->lowercase = character->realchar;
+	for (k = ruleDots.length - 1; k >= 0; k -= 1) {
+		cell = compile_findCharOrDots(ruleDots.chars[k], 1, *table);
+		if (!cell) {
+			cell = addCharOrDots(nested, ruleDots.chars[k], 1, table);
+			cell->uppercase = cell->lowercase = cell->realchar;
+		}
+	}
+	if (ruleDots.length == 1) {
+		cell->attributes |= attributes;
+		putCharAndDots(nested, ruleChars.chars[0], ruleDots.chars[0], table);
+	}
+	if (!addRule(nested, opcode, &ruleChars, &ruleDots, 0, 0, newRuleOffset, newRule,
+				noback, nofor, table))
+		return 0;
+	return 1;
+}
+
+static int
+compileBeforeAfter(FileInfo *nested, int *lastToken) {
+	/* 1=before, 2=after, 0=error */
+	CharsString token;
+	CharsString tmp;
+	if (getToken(nested, &token, "last word before or after", lastToken))
+		if (parseChars(nested, &tmp, &token)) {
+			if (eqasc2uni((unsigned char *)"before", tmp.chars, 6)) return 1;
+			if (eqasc2uni((unsigned char *)"after", tmp.chars, 5)) return 2;
+		}
+	return 0;
+}
+
+static int
+compileRule(FileInfo *nested, CharacterClass **characterClasses,
+		TranslationTableCharacterAttributes *characterClassAttribute,
+		short opcodeLengths[], TranslationTableOffset *newRuleOffset,
+		TranslationTableRule **newRule, RuleName **ruleNames,
+		TranslationTableHeader **table) {
+	int lastToken = 0;
+	int ok = 1;
+	CharsString token;
+	TranslationTableOpcode opcode;
+	CharsString ruleChars;
+	CharsString ruleDots;
+	CharsString cells;
+	CharsString scratchPad;
+	CharsString emphClass;
+	TranslationTableCharacterAttributes after = 0;
+	TranslationTableCharacterAttributes before = 0;
+	TranslationTableCharacter *c = NULL;
+	widechar *patterns = NULL;
+	int k, i;
+	int noback, nofor;
+	noback = nofor = 0;
+	TranslationTableOffset tmp_offset;
+doOpcode:
+	if (!getToken(nested, &token, NULL, &lastToken)) return 1;	/* blank line */
+	if (token.chars[0] == '#' || token.chars[0] == '<') return 1; /* comment */
+	if (nested->lineNumber == 1 &&
+			(eqasc2uni((unsigned char *)"ISO", token.chars, 3) ||
+					eqasc2uni((unsigned char *)"UTF-8", token.chars, 5))) {
+		compileHyphenation(nested, &token, &lastToken, table);
+		return 1;
+	}
+	opcode = getOpcode(nested, &token, opcodeLengths);
+
+	switch (opcode) { /* Carry out operations */
+	case CTO_None:
+		break;
+	case CTO_IncludeFile: {
+		CharsString includedFile;
+		if (getToken(nested, &token, "include file name", &lastToken))
+			if (parseChars(nested, &includedFile, &token))
+				if (!includeFile(nested, &includedFile, characterClasses,
+							characterClassAttribute, opcodeLengths, newRuleOffset,
+							newRule, ruleNames, table))
+					ok = 0;
+		break;
+	}
+	case CTO_Locale:
+		break;
+	case CTO_Undefined:
+		tmp_offset = (*table)->undefined;
+		ok = compileBrailleIndicator(nested, "undefined character opcode", CTO_Undefined,
+				&tmp_offset, &lastToken, newRuleOffset, newRule, noback, nofor, table);
+		(*table)->undefined = tmp_offset;
+		break;
+
+	case CTO_Match: {
+		CharsString ptn_before, ptn_after;
+		TranslationTableOffset offset;
+		int len, mrk;
+
+		size_t patternsByteSize = sizeof(*patterns) * 27720;
+		patterns = (widechar *)malloc(patternsByteSize);
+		if (!patterns) _lou_outOfMemory();
+		memset(patterns, 0xffff, patternsByteSize);
+
+		noback = 1;
+		getCharacters(nested, &ptn_before, &lastToken);
+		getRuleCharsText(nested, &ruleChars, &lastToken);
+		getCharacters(nested, &ptn_after, &lastToken);
+		getRuleDotsPattern(nested, &ruleDots, &lastToken);
+
+		if (!addRule(nested, opcode, &ruleChars, &ruleDots, after, before, newRuleOffset,
+					newRule, noback, nofor, table))
+			ok = 0;
+
+		if (ptn_before.chars[0] == '-' && ptn_before.length == 1)
+			len = _lou_pattern_compile(
+					&ptn_before.chars[0], 0, &patterns[1], 13841, *table);
+		else
+			len = _lou_pattern_compile(
+					&ptn_before.chars[0], ptn_before.length, &patterns[1], 13841, *table);
+		if (!len) {
+			ok = 0;
+			break;
+		}
+		mrk = patterns[0] = len + 1;
+		_lou_pattern_reverse(&patterns[1]);
+
+		if (ptn_after.chars[0] == '-' && ptn_after.length == 1)
+			len = _lou_pattern_compile(
+					&ptn_after.chars[0], 0, &patterns[mrk], 13841, *table);
+		else
+			len = _lou_pattern_compile(
+					&ptn_after.chars[0], ptn_after.length, &patterns[mrk], 13841, *table);
+		if (!len) {
+			ok = 0;
+			break;
+		}
+		len += mrk;
+
+		if (!allocateSpaceInTable(nested, &offset, len * sizeof(widechar), table)) {
+			ok = 0;
+			break;
+		}
+
+		/* realloc may have moved table, so make sure newRule is still valid */
+		*newRule = (TranslationTableRule *)&(*table)->ruleArea[*newRuleOffset];
+
+		memcpy(&(*table)->ruleArea[offset], patterns, len * sizeof(widechar));
+		(*newRule)->patterns = offset;
+
+		break;
+	}
+
+	case CTO_BackMatch: {
+		CharsString ptn_before, ptn_after;
+		TranslationTableOffset offset;
+		int len, mrk;
+
+		size_t patternsByteSize = sizeof(*patterns) * 27720;
+		patterns = (widechar *)malloc(patternsByteSize);
+		if (!patterns) _lou_outOfMemory();
+		memset(patterns, 0xffff, patternsByteSize);
+
+		nofor = 1;
+		getCharacters(nested, &ptn_before, &lastToken);
+		getRuleCharsText(nested, &ruleChars, &lastToken);
+		getCharacters(nested, &ptn_after, &lastToken);
+		getRuleDotsPattern(nested, &ruleDots, &lastToken);
+
+		if (!addRule(nested, opcode, &ruleChars, &ruleDots, 0, 0, newRuleOffset, newRule,
+					noback, nofor, table))
+			ok = 0;
+
+		if (ptn_before.chars[0] == '-' && ptn_before.length == 1)
+			len = _lou_pattern_compile(
+					&ptn_before.chars[0], 0, &patterns[1], 13841, *table);
+		else
+			len = _lou_pattern_compile(
+					&ptn_before.chars[0], ptn_before.length, &patterns[1], 13841, *table);
+		if (!len) {
+			ok = 0;
+			break;
+		}
+		mrk = patterns[0] = len + 1;
+		_lou_pattern_reverse(&patterns[1]);
+
+		if (ptn_after.chars[0] == '-' && ptn_after.length == 1)
+			len = _lou_pattern_compile(
+					&ptn_after.chars[0], 0, &patterns[mrk], 13841, *table);
+		else
+			len = _lou_pattern_compile(
+					&ptn_after.chars[0], ptn_after.length, &patterns[mrk], 13841, *table);
+		if (!len) {
+			ok = 0;
+			break;
+		}
+		len += mrk;
+
+		if (!allocateSpaceInTable(nested, &offset, len * sizeof(widechar), table)) {
+			ok = 0;
+			break;
+		}
+
+		/* realloc may have moved table, so make sure newRule is still valid */
+		*newRule = (TranslationTableRule *)&(*table)->ruleArea[*newRuleOffset];
+
+		memcpy(&(*table)->ruleArea[offset], patterns, len * sizeof(widechar));
+		(*newRule)->patterns = offset;
+
+		break;
+	}
+
+	case CTO_BegCapsPhrase:
+		tmp_offset = (*table)->emphRules[capsRule][begPhraseOffset];
+		ok = compileBrailleIndicator(nested, "first word capital sign",
+				CTO_BegCapsPhraseRule, &tmp_offset, &lastToken, newRuleOffset, newRule,
+				noback, nofor, table);
+		(*table)->emphRules[capsRule][begPhraseOffset] = tmp_offset;
+		break;
+	case CTO_EndCapsPhrase:
+		switch (compileBeforeAfter(nested, &lastToken)) {
+		case 1:  // before
+			if ((*table)->emphRules[capsRule][endPhraseAfterOffset]) {
+				compileError(nested, "Capital sign after last word already defined.");
+				ok = 0;
+				break;
+			}
+			tmp_offset = (*table)->emphRules[capsRule][endPhraseBeforeOffset];
+			ok = compileBrailleIndicator(nested, "capital sign before last word",
+					CTO_EndCapsPhraseBeforeRule, &tmp_offset, &lastToken, newRuleOffset,
+					newRule, noback, nofor, table);
+			(*table)->emphRules[capsRule][endPhraseBeforeOffset] = tmp_offset;
+			break;
+		case 2:  // after
+			if ((*table)->emphRules[capsRule][endPhraseBeforeOffset]) {
+				compileError(nested, "Capital sign before last word already defined.");
+				ok = 0;
+				break;
+			}
+			tmp_offset = (*table)->emphRules[capsRule][endPhraseAfterOffset];
+			ok = compileBrailleIndicator(nested, "capital sign after last word",
+					CTO_EndCapsPhraseAfterRule, &tmp_offset, &lastToken, newRuleOffset,
+					newRule, noback, nofor, table);
+			(*table)->emphRules[capsRule][endPhraseAfterOffset] = tmp_offset;
+			break;
+		default:  // error
+			compileError(nested, "Invalid lastword indicator location.");
+			ok = 0;
+			break;
+		}
+		break;
+	case CTO_BegCaps:
+		tmp_offset = (*table)->emphRules[capsRule][begOffset];
+		ok = compileBrailleIndicator(nested, "first letter capital sign", CTO_BegCapsRule,
+				&tmp_offset, &lastToken, newRuleOffset, newRule, noback, nofor, table);
+		(*table)->emphRules[capsRule][begOffset] = tmp_offset;
+		break;
+	case CTO_EndCaps:
+		tmp_offset = (*table)->emphRules[capsRule][endOffset];
+		ok = compileBrailleIndicator(nested, "last letter capital sign", CTO_EndCapsRule,
+				&tmp_offset, &lastToken, newRuleOffset, newRule, noback, nofor, table);
+		(*table)->emphRules[capsRule][endOffset] = tmp_offset;
+		break;
+	case CTO_CapsLetter:
+		tmp_offset = (*table)->emphRules[capsRule][letterOffset];
+		ok = compileBrailleIndicator(nested, "single letter capital sign",
+				CTO_CapsLetterRule, &tmp_offset, &lastToken, newRuleOffset, newRule,
+				noback, nofor, table);
+		(*table)->emphRules[capsRule][letterOffset] = tmp_offset;
+		break;
+	case CTO_BegCapsWord:
+		tmp_offset = (*table)->emphRules[capsRule][begWordOffset];
+		ok = compileBrailleIndicator(nested, "capital word", CTO_BegCapsWordRule,
+				&tmp_offset, &lastToken, newRuleOffset, newRule, noback, nofor, table);
+		(*table)->emphRules[capsRule][begWordOffset] = tmp_offset;
+		break;
+	case CTO_EndCapsWord:
+		tmp_offset = (*table)->emphRules[capsRule][endWordOffset];
+		ok = compileBrailleIndicator(nested, "capital word stop", CTO_EndCapsWordRule,
+				&tmp_offset, &lastToken, newRuleOffset, newRule, noback, nofor, table);
+		(*table)->emphRules[capsRule][endWordOffset] = tmp_offset;
+		break;
+	case CTO_LenCapsPhrase:
+		ok = (*table)->emphRules[capsRule][lenPhraseOffset] =
+				compileNumber(nested, &lastToken);
+		break;
+
+	/* these 9 general purpose emphasis opcodes are compiled further down to more specific
+	 * internal opcodes:
+	 * - emphletter
+	 * - begemphword
+	 * - endemphword
+	 * - begemph
+	 * - endemph
+	 * - begemphphrase
+	 * - endemphphrase
+	 * - lenemphphrase
+	 */
+	case CTO_EmphClass:
+		if (getToken(nested, &token, "emphasis class", &lastToken))
+			if (parseChars(nested, &emphClass, &token)) {
+				char *s = malloc(sizeof(char) * (emphClass.length + 1));
+				for (k = 0; k < emphClass.length; k++) s[k] = (char)emphClass.chars[k];
+				s[k++] = '\0';
+				for (i = 0; (*table)->emphClasses[i]; i++)
+					if (strcmp(s, (*table)->emphClasses[i]) == 0) {
+						_lou_logMessage(LOG_WARN, "Duplicate emphasis class: %s", s);
+						warningCount++;
+						free(s);
+						return 1;
+					}
+				if (i < MAX_EMPH_CLASSES) {
+					switch (i) {
+					/* For backwards compatibility (i.e. because programs will assume the
+					 * first 3
+					 * typeform bits are `italic', `underline' and `bold') we require that
+					 * the first
+					 * 3 emphclass definitions are (in that order):
+					 *
+					 *   emphclass italic
+					 *   emphclass underline
+					 *   emphclass bold
+					 *
+					 * While it would be possible to use the emphclass opcode only for
+					 * defining
+					 * _additional_ classes (not allowing for them to be called italic,
+					 * underline or
+					 * bold), thereby reducing the amount of boilerplate, we deliberately
+					 * choose not
+					 * to do that in order to not give italic, underline and bold any
+					 * special
+					 * status. The hope is that eventually all programs will use liblouis
+					 * for
+					 * emphasis the recommended way (i.e. by looking up the supported
+					 * typeforms in
+					 * the documentation or API) so that we can drop this restriction.
+					 */
+					case 0:
+						if (strcmp(s, "italic") != 0) {
+							_lou_logMessage(LOG_ERROR,
+									"First emphasis class must be \"italic\" but got %s",
+									s);
+							errorCount++;
+							free(s);
+							return 0;
+						}
+						break;
+					case 1:
+						if (strcmp(s, "underline") != 0) {
+							_lou_logMessage(LOG_ERROR,
+									"Second emphasis class must be \"underline\" but got "
+									"%s",
+									s);
+							errorCount++;
+							free(s);
+							return 0;
+						}
+						break;
+					case 2:
+						if (strcmp(s, "bold") != 0) {
+							_lou_logMessage(LOG_ERROR,
+									"Third emphasis class must be \"bold\" but got %s",
+									s);
+							errorCount++;
+							free(s);
+							return 0;
+						}
+						break;
+					}
+					(*table)->emphClasses[i] = s;
+					(*table)->emphClasses[i + 1] = NULL;
+					ok = 1;
+					break;
+				} else {
+					_lou_logMessage(LOG_ERROR,
+							"Max number of emphasis classes (%i) reached",
+							MAX_EMPH_CLASSES);
+					errorCount++;
+					free(s);
+					ok = 0;
+					break;
+				}
+			}
+		compileError(nested, "emphclass must be followed by a valid class name.");
+		ok = 0;
+		break;
+	case CTO_EmphLetter:
+	case CTO_BegEmphWord:
+	case CTO_EndEmphWord:
+	case CTO_BegEmph:
+	case CTO_EndEmph:
+	case CTO_BegEmphPhrase:
+	case CTO_EndEmphPhrase:
+	case CTO_LenEmphPhrase:
+		ok = 0;
+		if (getToken(nested, &token, "emphasis class", &lastToken))
+			if (parseChars(nested, &emphClass, &token)) {
+				char *s = malloc(sizeof(char) * (emphClass.length + 1));
+				for (k = 0; k < emphClass.length; k++) s[k] = (char)emphClass.chars[k];
+				s[k++] = '\0';
+				for (i = 0; (*table)->emphClasses[i]; i++)
+					if (strcmp(s, (*table)->emphClasses[i]) == 0) break;
+				if (!(*table)->emphClasses[i]) {
+					_lou_logMessage(LOG_ERROR, "Emphasis class %s not declared", s);
+					errorCount++;
+					free(s);
+					break;
+				}
+				i++;  // in table->emphRules the first index is used for caps
+				if (opcode == CTO_EmphLetter) {
+					tmp_offset = (*table)->emphRules[i][letterOffset];
+					ok = compileBrailleIndicator(nested, "single letter",
+							CTO_Emph1LetterRule + letterOffset + (8 * i), &tmp_offset,
+							&lastToken, newRuleOffset, newRule, noback, nofor, table);
+					(*table)->emphRules[i][letterOffset] = tmp_offset;
+				} else if (opcode == CTO_BegEmphWord) {
+					tmp_offset = (*table)->emphRules[i][begWordOffset];
+					ok = compileBrailleIndicator(nested, "word",
+							CTO_Emph1LetterRule + begWordOffset + (8 * i), &tmp_offset,
+							&lastToken, newRuleOffset, newRule, noback, nofor, table);
+					(*table)->emphRules[i][begWordOffset] = tmp_offset;
+				} else if (opcode == CTO_EndEmphWord) {
+					tmp_offset = (*table)->emphRules[i][endWordOffset];
+					ok = compileBrailleIndicator(nested, "word stop",
+							CTO_Emph1LetterRule + endWordOffset + (8 * i), &tmp_offset,
+							&lastToken, newRuleOffset, newRule, noback, nofor, table);
+					(*table)->emphRules[i][endWordOffset] = tmp_offset;
+				} else if (opcode == CTO_BegEmph) {
+					/* fail if both begemph and any of begemphphrase or begemphword are
+					 * defined */
+					if ((*table)->emphRules[i][begWordOffset] ||
+							(*table)->emphRules[i][begPhraseOffset]) {
+						compileError(nested,
+								"Cannot define emphasis for both no context and word or "
+								"phrase context, i.e. cannot have both begemph and "
+								"begemphword or begemphphrase.");
+						ok = 0;
+						break;
+					}
+					tmp_offset = (*table)->emphRules[i][begOffset];
+					ok = compileBrailleIndicator(nested, "first letter",
+							CTO_Emph1LetterRule + begOffset + (8 * i), &tmp_offset,
+							&lastToken, newRuleOffset, newRule, noback, nofor, table);
+					(*table)->emphRules[i][begOffset] = tmp_offset;
+				} else if (opcode == CTO_EndEmph) {
+					if ((*table)->emphRules[i][endWordOffset] ||
+							(*table)->emphRules[i][endPhraseBeforeOffset] ||
+							(*table)->emphRules[i][endPhraseAfterOffset]) {
+						compileError(nested,
+								"Cannot define emphasis for both no context and word or "
+								"phrase context, i.e. cannot have both endemph and "
+								"endemphword or endemphphrase.");
+						ok = 0;
+						break;
+					}
+					tmp_offset = (*table)->emphRules[i][endOffset];
+					ok = compileBrailleIndicator(nested, "last letter",
+							CTO_Emph1LetterRule + endOffset + (8 * i), &tmp_offset,
+							&lastToken, newRuleOffset, newRule, noback, nofor, table);
+					(*table)->emphRules[i][endOffset] = tmp_offset;
+				} else if (opcode == CTO_BegEmphPhrase) {
+					tmp_offset = (*table)->emphRules[i][begPhraseOffset];
+					ok = compileBrailleIndicator(nested, "first word",
+							CTO_Emph1LetterRule + begPhraseOffset + (8 * i), &tmp_offset,
+							&lastToken, newRuleOffset, newRule, noback, nofor, table);
+					(*table)->emphRules[i][begPhraseOffset] = tmp_offset;
+				} else if (opcode == CTO_EndEmphPhrase)
+					switch (compileBeforeAfter(nested, &lastToken)) {
+					case 1:  // before
+						if ((*table)->emphRules[i][endPhraseAfterOffset]) {
+							compileError(nested, "last word after already defined.");
+							ok = 0;
+							break;
+						}
+						tmp_offset = (*table)->emphRules[i][endPhraseBeforeOffset];
+						ok = compileBrailleIndicator(nested, "last word before",
+								CTO_Emph1LetterRule + endPhraseBeforeOffset + (8 * i),
+								&tmp_offset, &lastToken, newRuleOffset, newRule, noback,
+								nofor, table);
+						(*table)->emphRules[i][endPhraseBeforeOffset] = tmp_offset;
+						break;
+					case 2:  // after
+						if ((*table)->emphRules[i][endPhraseBeforeOffset]) {
+							compileError(nested, "last word before already defined.");
+							ok = 0;
+							break;
+						}
+						tmp_offset = (*table)->emphRules[i][endPhraseAfterOffset];
+						ok = compileBrailleIndicator(nested, "last word after",
+								CTO_Emph1LetterRule + endPhraseAfterOffset + (8 * i),
+								&tmp_offset, &lastToken, newRuleOffset, newRule, noback,
+								nofor, table);
+						(*table)->emphRules[i][endPhraseAfterOffset] = tmp_offset;
+						break;
+					default:  // error
+						compileError(nested, "Invalid lastword indicator location.");
+						ok = 0;
+						break;
+					}
+				else if (opcode == CTO_LenEmphPhrase)
+					ok = (*table)->emphRules[i][lenPhraseOffset] =
+							compileNumber(nested, &lastToken);
+				free(s);
+			}
+		break;
+
+	case CTO_LetterSign:
+		tmp_offset = (*table)->letterSign;
+		ok = compileBrailleIndicator(nested, "letter sign", CTO_LetterRule, &tmp_offset,
+				&lastToken, newRuleOffset, newRule, noback, nofor, table);
+		(*table)->letterSign = tmp_offset;
+		break;
+	case CTO_NoLetsignBefore:
+		if (getRuleCharsText(nested, &ruleChars, &lastToken)) {
+			if (((*table)->noLetsignBeforeCount + ruleChars.length) > LETSIGNSIZE) {
+				compileError(nested, "More than %d characters", LETSIGNSIZE);
+				ok = 0;
+				break;
+			}
+			for (k = 0; k < ruleChars.length; k++)
+				(*table)->noLetsignBefore[(*table)->noLetsignBeforeCount++] =
+						ruleChars.chars[k];
+		}
+		break;
+	case CTO_NoLetsign:
+		if (getRuleCharsText(nested, &ruleChars, &lastToken)) {
+			if (((*table)->noLetsignCount + ruleChars.length) > LETSIGNSIZE) {
+				compileError(nested, "More than %d characters", LETSIGNSIZE);
+				ok = 0;
+				break;
+			}
+			for (k = 0; k < ruleChars.length; k++)
+				(*table)->noLetsign[(*table)->noLetsignCount++] = ruleChars.chars[k];
+		}
+		break;
+	case CTO_NoLetsignAfter:
+		if (getRuleCharsText(nested, &ruleChars, &lastToken)) {
+			if (((*table)->noLetsignAfterCount + ruleChars.length) > LETSIGNSIZE) {
+				compileError(nested, "More than %d characters", LETSIGNSIZE);
+				ok = 0;
+				break;
+			}
+			for (k = 0; k < ruleChars.length; k++)
+				(*table)->noLetsignAfter[(*table)->noLetsignAfterCount++] =
+						ruleChars.chars[k];
+		}
+		break;
+	case CTO_NumberSign:
+		tmp_offset = (*table)->numberSign;
+		ok = compileBrailleIndicator(nested, "number sign", CTO_NumberRule, &tmp_offset,
+				&lastToken, newRuleOffset, newRule, noback, nofor, table);
+		(*table)->numberSign = tmp_offset;
+		break;
+
+	case CTO_Attribute:
+
+		c = NULL;
+		ok = 1;
+		if (!getToken(nested, &ruleChars, "attribute number", &lastToken)) {
+			compileError(nested, "Expected attribute number.");
+			ok = 0;
+			break;
+		}
+
+		k = -1;
+		switch (ruleChars.chars[0]) {
+		case '0':
+			k = 0;
+			break;
+		case '1':
+			k = 1;
+			break;
+		case '2':
+			k = 2;
+			break;
+		case '3':
+			k = 3;
+			break;
+		case '4':
+			k = 4;
+			break;
+		case '5':
+			k = 5;
+			break;
+		case '6':
+			k = 6;
+			break;
+		case '7':
+			k = 7;
+			break;
+		}
+		if (k == -1) {
+			compileError(nested, "Invalid attribute number.");
+			ok = 0;
+			break;
+		}
+
+		if (getRuleCharsText(nested, &ruleChars, &lastToken)) {
+			for (i = 0; i < ruleChars.length; i++) {
+				c = compile_findCharOrDots(ruleChars.chars[i], 0, *table);
+				if (c)
+					c->attributes |= (CTC_UserDefined0 << k);
+				else {
+					compileError(nested, "Attribute character undefined");
+					ok = 0;
+					break;
+				}
+			}
+		}
+		break;
+
+	case CTO_NumericModeChars:
+
+		c = NULL;
+		ok = 1;
+		if (getRuleCharsText(nested, &ruleChars, &lastToken)) {
+			for (k = 0; k < ruleChars.length; k++) {
+				c = compile_findCharOrDots(ruleChars.chars[k], 0, *table);
+				if (c)
+					c->attributes |= CTC_NumericMode;
+				else {
+					compileError(nested, "Numeric mode character undefined");
+					ok = 0;
+					break;
+				}
+			}
+			(*table)->usesNumericMode = 1;
+		}
+		break;
+
+	case CTO_NumericNoContractChars:
+
+		c = NULL;
+		ok = 1;
+		if (getRuleCharsText(nested, &ruleChars, &lastToken)) {
+			for (k = 0; k < ruleChars.length; k++) {
+				c = compile_findCharOrDots(ruleChars.chars[k], 0, *table);
+				if (c)
+					c->attributes |= CTC_NumericNoContract;
+				else {
+					compileError(nested, "Numeric no contraction character undefined");
+					ok = 0;
+					break;
+				}
+			}
+			(*table)->usesNumericMode = 1;
+		}
+		break;
+
+	case CTO_NoContractSign:
+
+		tmp_offset = (*table)->noContractSign;
+		ok = compileBrailleIndicator(nested, "no contractions sign", CTO_NoContractRule,
+				&tmp_offset, &lastToken, newRuleOffset, newRule, noback, nofor, table);
+		(*table)->noContractSign = tmp_offset;
+		break;
+
+	case CTO_SeqDelimiter:
+
+		c = NULL;
+		ok = 1;
+		if (getRuleCharsText(nested, &ruleChars, &lastToken)) {
+			for (k = 0; k < ruleChars.length; k++) {
+				c = compile_findCharOrDots(ruleChars.chars[k], 0, *table);
+				if (c)
+					c->attributes |= CTC_SeqDelimiter;
+				else {
+					compileError(nested, "Sequence delimiter character undefined");
+					ok = 0;
+					break;
+				}
+			}
+			(*table)->usesSequences = 1;
+		}
+		break;
+
+	case CTO_SeqBeforeChars:
+
+		c = NULL;
+		ok = 1;
+		if (getRuleCharsText(nested, &ruleChars, &lastToken)) {
+			for (k = 0; k < ruleChars.length; k++) {
+				c = compile_findCharOrDots(ruleChars.chars[k], 0, *table);
+				if (c)
+					c->attributes |= CTC_SeqBefore;
+				else {
+					compileError(nested, "Sequence before character undefined");
+					ok = 0;
+					break;
+				}
+			}
+		}
+		break;
+
+	case CTO_SeqAfterChars:
+
+		c = NULL;
+		ok = 1;
+		if (getRuleCharsText(nested, &ruleChars, &lastToken)) {
+			for (k = 0; k < ruleChars.length; k++) {
+				c = compile_findCharOrDots(ruleChars.chars[k], 0, *table);
+				if (c)
+					c->attributes |= CTC_SeqAfter;
+				else {
+					compileError(nested, "Sequence after character undefined");
+					ok = 0;
+					break;
+				}
+			}
+		}
+		break;
+
+	case CTO_SeqAfterPattern:
+
+		if (getRuleCharsText(nested, &ruleChars, &lastToken)) {
+			if (((*table)->seqPatternsCount + ruleChars.length + 1) > SEQPATTERNSIZE) {
+				compileError(nested, "More than %d characters", SEQPATTERNSIZE);
+				ok = 0;
+				break;
+			}
+			for (k = 0; k < ruleChars.length; k++)
+				(*table)->seqPatterns[(*table)->seqPatternsCount++] = ruleChars.chars[k];
+			(*table)->seqPatterns[(*table)->seqPatternsCount++] = 0;
+		}
+		break;
+	case CTO_SeqAfterExpression:
+
+		if (getRuleCharsText(nested, &ruleChars, &lastToken)) {
+			for ((*table)->seqAfterExpressionLength = 0;
+					(*table)->seqAfterExpressionLength < ruleChars.length;
+					(*table)->seqAfterExpressionLength++)
+				(*table)->seqAfterExpression[(*table)->seqAfterExpressionLength] =
+						ruleChars.chars[(*table)->seqAfterExpressionLength];
+			(*table)->seqAfterExpression[(*table)->seqAfterExpressionLength] = 0;
+		}
+		break;
+
+	case CTO_CapsModeChars:
+
+		c = NULL;
+		ok = 1;
+		if (getRuleCharsText(nested, &ruleChars, &lastToken)) {
+			for (k = 0; k < ruleChars.length; k++) {
+				c = compile_findCharOrDots(ruleChars.chars[k], 0, *table);
+				if (c)
+					c->attributes |= CTC_CapsMode;
+				else {
+					compileError(nested, "Capital mode character undefined");
+					ok = 0;
+					break;
+				}
+			}
+		}
+		break;
+
+	case CTO_BegComp:
+		tmp_offset = (*table)->begComp;
+		ok = compileBrailleIndicator(nested, "begin computer braille", CTO_BegCompRule,
+				&tmp_offset, &lastToken, newRuleOffset, newRule, noback, nofor, table);
+		(*table)->begComp = tmp_offset;
+		break;
+	case CTO_EndComp:
+		tmp_offset = (*table)->endComp;
+		ok = compileBrailleIndicator(nested, "end computer braslle", CTO_EndCompRule,
+				&tmp_offset, &lastToken, newRuleOffset, newRule, noback, nofor, table);
+		(*table)->endComp = tmp_offset;
+		break;
+	case CTO_Syllable:
+		(*table)->syllables = 1;
+	case CTO_Always:
+	case CTO_NoCross:
+	case CTO_LargeSign:
+	case CTO_WholeWord:
+	case CTO_PartWord:
+	case CTO_JoinNum:
+	case CTO_JoinableWord:
+	case CTO_LowWord:
+	case CTO_SuffixableWord:
+	case CTO_PrefixableWord:
+	case CTO_BegWord:
+	case CTO_BegMidWord:
+	case CTO_MidWord:
+	case CTO_MidEndWord:
+	case CTO_EndWord:
+	case CTO_PrePunc:
+	case CTO_PostPunc:
+	case CTO_BegNum:
+	case CTO_MidNum:
+	case CTO_EndNum:
+	case CTO_Repeated:
+	case CTO_RepWord:
+		if (getRuleCharsText(nested, &ruleChars, &lastToken))
+			if (getRuleDotsPattern(nested, &ruleDots, &lastToken))
+				if (!addRule(nested, opcode, &ruleChars, &ruleDots, after, before,
+							newRuleOffset, newRule, noback, nofor, table))
+					ok = 0;
+		// if (opcode == CTO_MidNum)
+		// {
+		//   TranslationTableCharacter *c = compile_findCharOrDots(ruleChars.chars[0], 0);
+		//   if(c)
+		//     c->attributes |= CTC_NumericMode;
+		// }
+		break;
+	case CTO_CompDots:
+	case CTO_Comp6:
+		if (!getRuleCharsText(nested, &ruleChars, &lastToken)) return 0;
+		if (ruleChars.length != 1 || ruleChars.chars[0] > 255) {
+			compileError(nested, "first operand must be 1 character and < 256");
+			return 0;
+		}
+		if (!getRuleDotsPattern(nested, &ruleDots, &lastToken)) return 0;
+		if (!addRule(nested, opcode, &ruleChars, &ruleDots, after, before, newRuleOffset,
+					newRule, noback, nofor, table))
+			ok = 0;
+		(*table)->compdotsPattern[ruleChars.chars[0]] = *newRuleOffset;
+		break;
+	case CTO_ExactDots:
+		if (!getRuleCharsText(nested, &ruleChars, &lastToken)) return 0;
+		if (ruleChars.chars[0] != '@') {
+			compileError(nested, "The operand must begin with an at sign (@)");
+			return 0;
+		}
+		for (k = 1; k < ruleChars.length; k++)
+			scratchPad.chars[k - 1] = ruleChars.chars[k];
+		scratchPad.length = ruleChars.length - 1;
+		if (!parseDots(nested, &ruleDots, &scratchPad)) return 0;
+		if (!addRule(nested, opcode, &ruleChars, &ruleDots, before, after, newRuleOffset,
+					newRule, noback, nofor, table))
+			ok = 0;
+		break;
+	case CTO_CapsNoCont:
+		ruleChars.length = 1;
+		ruleChars.chars[0] = 'a';
+		if (!addRule(nested, CTO_CapsNoContRule, &ruleChars, NULL, after, before,
+					newRuleOffset, newRule, noback, nofor, table))
+			ok = 0;
+		(*table)->capsNoCont = *newRuleOffset;
+		break;
+	case CTO_Replace:
+		if (getRuleCharsText(nested, &ruleChars, &lastToken)) {
+			if (lastToken)
+				ruleDots.length = ruleDots.chars[0] = 0;
+			else {
+				getRuleDotsText(nested, &ruleDots, &lastToken);
+				if (ruleDots.chars[0] == '#')
+					ruleDots.length = ruleDots.chars[0] = 0;
+				else if (ruleDots.chars[0] == '\\' && ruleDots.chars[1] == '#')
+					memcpy(&ruleDots.chars[0], &ruleDots.chars[1],
+							ruleDots.length-- * CHARSIZE);
+			}
+		}
+		for (k = 0; k < ruleChars.length; k++)
+			addCharOrDots(nested, ruleChars.chars[k], 0, table);
+		for (k = 0; k < ruleDots.length; k++)
+			addCharOrDots(nested, ruleDots.chars[k], 0, table);
+		if (!addRule(nested, opcode, &ruleChars, &ruleDots, after, before, newRuleOffset,
+					newRule, noback, nofor, table))
+			ok = 0;
+		break;
+	case CTO_Correct:
+		(*table)->corrections = 1;
+		goto doPass;
+	case CTO_Pass2:
+		if ((*table)->numPasses < 2) (*table)->numPasses = 2;
+		goto doPass;
+	case CTO_Pass3:
+		if ((*table)->numPasses < 3) (*table)->numPasses = 3;
+		goto doPass;
+	case CTO_Pass4:
+		if ((*table)->numPasses < 4) (*table)->numPasses = 4;
+	doPass:
+	case CTO_Context:
+		if (!(nofor || noback)) {
+			compileError(nested, "%s or %s must be specified.",
+					_lou_findOpcodeName(CTO_NoFor), _lou_findOpcodeName(CTO_NoBack));
+			ok = 0;
+			break;
+		}
+		if (!compilePassOpcode(nested, opcode, *characterClasses, newRuleOffset, newRule,
+					noback, nofor, *ruleNames, table))
+			ok = 0;
+		break;
+	case CTO_Contraction:
+	case CTO_NoCont:
+	case CTO_CompBrl:
+	case CTO_Literal:
+		if (getRuleCharsText(nested, &ruleChars, &lastToken))
+			if (!addRule(nested, opcode, &ruleChars, NULL, after, before, newRuleOffset,
+						newRule, noback, nofor, table))
+				ok = 0;
+		break;
+	case CTO_MultInd: {
+		int t;
+		ruleChars.length = 0;
+		if (getToken(nested, &token, "multiple braille indicators", &lastToken) &&
+				parseDots(nested, &cells, &token)) {
+			while ((t = getToken(nested, &token, "multind opcodes", &lastToken))) {
+				opcode = getOpcode(nested, &token, opcodeLengths);
+				if (opcode >= CTO_CapsLetter && opcode < CTO_MultInd)
+					ruleChars.chars[ruleChars.length++] = (widechar)opcode;
+				else {
+					compileError(nested, "Not a braille indicator opcode.");
+					ok = 0;
+				}
+				if (t == 2) break;
+			}
+		} else
+			ok = 0;
+		if (!addRule(nested, CTO_MultInd, &ruleChars, &cells, after, before,
+					newRuleOffset, newRule, noback, nofor, table))
+			ok = 0;
+		break;
+	}
+
+	case CTO_Class: {
+		CharsString characters;
+		const CharacterClass *class;
+		if (!*characterClasses) {
+			if (!allocateCharacterClasses(characterClasses, characterClassAttribute))
+				ok = 0;
+		}
+		if (getToken(nested, &token, "character class name", &lastToken)) {
+			if ((class = findCharacterClass(&token, *characterClasses))) {
+				compileError(nested, "character class already defined.");
+			} else if ((class = addCharacterClass(nested, &token.chars[0], token.length,
+								characterClasses, characterClassAttribute))) {
+				if (getCharacters(nested, &characters, &lastToken)) {
+					int index;
+					for (index = 0; index < characters.length; ++index) {
+						TranslationTableRule *defRule;
+						TranslationTableCharacter *character = definedCharOrDots(
+								nested, characters.chars[index], 0, *table);
+						character->attributes |= class->attribute;
+						defRule = (TranslationTableRule *)&(
+								*table)->ruleArea[character->definitionRule];
+						if (defRule->dotslen == 1) {
+							character = definedCharOrDots(nested,
+									defRule->charsdots[defRule->charslen], 1, *table);
+							character->attributes |= class->attribute;
+						}
+					}
+				}
+			}
+		}
+		break;
+	}
+
+		{
+			TranslationTableCharacterAttributes *attributes;
+			const CharacterClass *class;
+		case CTO_After:
+			attributes = &after;
+			goto doClass;
+		case CTO_Before:
+			attributes = &before;
+		doClass:
+
+			if (!*characterClasses) {
+				if (!allocateCharacterClasses(characterClasses, characterClassAttribute))
+					ok = 0;
+			}
+			if (getCharacterClass(nested, &class, *characterClasses, &lastToken)) {
+				*attributes |= class->attribute;
+				goto doOpcode;
+			}
+			break;
+		}
+
+	case CTO_NoBack:
+		if (nofor) {
+			compileError(nested, "%s already specified.", _lou_findOpcodeName(CTO_NoFor));
+			ok = 0;
+			break;
+		}
+		noback = 1;
+		goto doOpcode;
+	case CTO_NoFor:
+		if (noback) {
+			compileError(
+					nested, "%s already specified.", _lou_findOpcodeName(CTO_NoBack));
+			ok = 0;
+			break;
+		}
+		nofor = 1;
+		goto doOpcode;
+
+	case CTO_EmpMatchBefore:
+		before |= CTC_EmpMatch;
+		goto doOpcode;
+	case CTO_EmpMatchAfter:
+		after |= CTC_EmpMatch;
+		goto doOpcode;
+
+	case CTO_SwapCc:
+	case CTO_SwapCd:
+	case CTO_SwapDd:
+		if (!compileSwap(nested, opcode, &lastToken, newRuleOffset, newRule, noback,
+					nofor, ruleNames, table))
+			ok = 0;
+		break;
+	case CTO_Hyphen:
+	case CTO_DecPoint:
+		//	case CTO_Apostrophe:
+		//	case CTO_Initial:
+		if (getRuleCharsText(nested, &ruleChars, &lastToken))
+			if (getRuleDotsPattern(nested, &ruleDots, &lastToken)) {
+				if (ruleChars.length != 1 || ruleDots.length < 1) {
+					compileError(nested,
+							"One Unicode character and at least one cell are required.");
+					ok = 0;
+				}
+				if (!addRule(nested, opcode, &ruleChars, &ruleDots, after, before,
+							newRuleOffset, newRule, noback, nofor, table))
+					ok = 0;
+				// if (opcode == CTO_DecPoint)
+				// {
+				//   TranslationTableCharacter *c =
+				//   compile_findCharOrDots(ruleChars.chars[0], 0);
+				//   if(c)
+				//     c->attributes |= CTC_NumericMode;
+				// }
+			}
+		break;
+	case CTO_Space:
+		compileCharDef(nested, opcode, CTC_Space, &lastToken, newRuleOffset, newRule,
+				noback, nofor, table);
+		break;
+	case CTO_Digit:
+		compileCharDef(nested, opcode, CTC_Digit, &lastToken, newRuleOffset, newRule,
+				noback, nofor, table);
+		break;
+	case CTO_LitDigit:
+		compileCharDef(nested, opcode, CTC_LitDigit, &lastToken, newRuleOffset, newRule,
+				noback, nofor, table);
+		break;
+	case CTO_Punctuation:
+		compileCharDef(nested, opcode, CTC_Punctuation, &lastToken, newRuleOffset,
+				newRule, noback, nofor, table);
+		break;
+	case CTO_Math:
+		compileCharDef(nested, opcode, CTC_Math, &lastToken, newRuleOffset, newRule,
+				noback, nofor, table);
+		break;
+	case CTO_Sign:
+		compileCharDef(nested, opcode, CTC_Sign, &lastToken, newRuleOffset, newRule,
+				noback, nofor, table);
+		break;
+	case CTO_Letter:
+		compileCharDef(nested, opcode, CTC_Letter, &lastToken, newRuleOffset, newRule,
+				noback, nofor, table);
+		break;
+	case CTO_UpperCase:
+		compileCharDef(nested, opcode, CTC_UpperCase, &lastToken, newRuleOffset, newRule,
+				noback, nofor, table);
+		break;
+	case CTO_LowerCase:
+		compileCharDef(nested, opcode, CTC_LowerCase, &lastToken, newRuleOffset, newRule,
+				noback, nofor, table);
+		break;
+	case CTO_Grouping:
+		ok = compileGrouping(nested, &lastToken, newRuleOffset, newRule, noback, nofor,
+				ruleNames, table);
+		break;
+	case CTO_UpLow:
+		ok = compileUplow(
+				nested, &lastToken, newRuleOffset, newRule, noback, nofor, table);
+		break;
+	case CTO_Display:
+		if (getRuleCharsText(nested, &ruleChars, &lastToken))
+			if (getRuleDotsPattern(nested, &ruleDots, &lastToken)) {
+				if (ruleChars.length != 1 || ruleDots.length != 1) {
+					compileError(
+							nested, "Exactly one character and one cell are required.");
+					ok = 0;
+				}
+				putCharAndDots(nested, ruleChars.chars[0], ruleDots.chars[0], table);
+			}
+		break;
+	default:
+		compileError(nested, "unimplemented opcode.");
+		ok = 0;
+		break;
+	}
+
+	if (patterns != NULL) free(patterns);
+
+	return ok;
+}
+
+int EXPORT_CALL
+lou_readCharFromFile(const char *fileName, int *mode) {
+	/* Read a character from a file, whether big-endian, little-endian or
+	 * ASCII8 */
+	int ch;
+	static FileInfo nested;
+	if (fileName == NULL) return 0;
+	if (*mode == 1) {
+		*mode = 0;
+		nested.fileName = fileName;
+		nested.encoding = noEncoding;
+		nested.status = 0;
+		nested.lineNumber = 0;
+		if (!(nested.in = fopen(nested.fileName, "r"))) {
+			_lou_logMessage(LOG_ERROR, "Cannot open file '%s'", nested.fileName);
+			*mode = 1;
+			return EOF;
+		}
+	}
+	if (nested.in == NULL) {
+		*mode = 1;
+		return EOF;
+	}
+	ch = getAChar(&nested);
+	if (ch == EOF) {
+		fclose(nested.in);
+		nested.in = NULL;
+		*mode = 1;
+	}
+	return ch;
+}
+
+static int
+compileString(const char *inString, CharacterClass **characterClasses,
+		TranslationTableCharacterAttributes *characterClassAttribute,
+		short opcodeLengths[], TranslationTableOffset *newRuleOffset,
+		TranslationTableRule **newRule, RuleName **ruleNames,
+		TranslationTableHeader **table) {
+	/* This function can be used to make changes to tables on the fly. */
+	int k;
+	FileInfo nested;
+	if (inString == NULL) return 0;
+	memset(&nested, 0, sizeof(nested));
+	nested.fileName = inString;
+	nested.encoding = noEncoding;
+	nested.lineNumber = 1;
+	nested.status = 0;
+	nested.linepos = 0;
+	for (k = 0; inString[k]; k++) nested.line[k] = inString[k];
+	nested.line[k] = 0;
+	nested.linelen = k;
+	return compileRule(&nested, characterClasses, characterClassAttribute, opcodeLengths,
+			newRuleOffset, newRule, ruleNames, table);
+}
+
+static int
+makeDoubleRule(TranslationTableOpcode opcode, TranslationTableOffset *singleRule,
+		TranslationTableOffset *doubleRule, TranslationTableOffset *newRuleOffset,
+		TranslationTableRule **newRule, int noback, int nofor,
+		TranslationTableHeader **table) {
+	CharsString dots;
+	TranslationTableRule *rule;
+	if (!*singleRule || *doubleRule) return 1;
+	rule = (TranslationTableRule *)&(*table)->ruleArea[*singleRule];
+	memcpy(dots.chars, &rule->charsdots[0], rule->dotslen * CHARSIZE);
+	memcpy(&dots.chars[rule->dotslen], &rule->charsdots[0], rule->dotslen * CHARSIZE);
+	dots.length = 2 * rule->dotslen;
+	if (!addRule(NULL, opcode, NULL, &dots, 0, 0, newRuleOffset, newRule, noback, nofor,
+				table))
+		return 0;
+	*doubleRule = *newRuleOffset;
+	return 1;
+}
+
+static int
+setDefaults(TranslationTableHeader *table) {
+	//  makeDoubleRule (CTO_FirstWordItalRule,
+	//  &table->emphRules[emph1Rule][lastWordBeforeOffset],
+	//		  &table->emphRules[emph1Rule][firstWordOffset]);
+	if (!table->emphRules[emph1Rule][lenPhraseOffset])
+		table->emphRules[emph1Rule][lenPhraseOffset] = 4;
+	//  makeDoubleRule (CTO_FirstWordUnderRule,
+	//  &table->emphRules[emph2Rule][lastWordBeforeOffset],
+	//		  &table->emphRules[emph2Rule][firstWordOffset]);
+	if (!table->emphRules[emph2Rule][lenPhraseOffset])
+		table->emphRules[emph2Rule][lenPhraseOffset] = 4;
+	//  makeDoubleRule (CTO_FirstWordBoldRule,
+	//  &table->emphRules[emph3Rule][lastWordBeforeOffset],
+	//		  &table->emphRules[emph3Rule][firstWordOffset]);
+	if (!table->emphRules[emph3Rule][lenPhraseOffset])
+		table->emphRules[emph3Rule][lenPhraseOffset] = 4;
+	if (table->numPasses == 0) table->numPasses = 1;
+	return 1;
+}
+
+/* =============== *
+ * TABLE RESOLVING *
+ * =============== *
+ *
+ * A table resolver is a function that resolves a `tableList` path against a
+ * `base` path, and returns the resolved table(s) as a list of absolute file
+ * paths.
+ *
+ * The function must have the following signature:
+ *
+ *     char ** (const char * tableList, const char * base)
+ *
+ * In general, `tableList` is a path in the broad sense. The default
+ * implementation accepts only *file* paths. But another implementation could
+ * for instance handle URI's. `base` is always a file path however.
+ *
+ * The idea is to give other programs that use liblouis the ability to define
+ * their own table resolver (in C, Java, Python, etc.) when the default
+ * resolver is not satisfying. (see also lou_registerTableResolver)
+ *
+ */
+
+/**
+ * Resolve a single (sub)table.
+ *
+ * Tries to resolve `table` against `base` if base is an absolute path. If
+ * that fails, searches `searchPath`.
+ *
+ */
+static char *
+resolveSubtable(const char *table, const char *base, const char *searchPath) {
+	char *tableFile;
+	static struct stat info;
+
+	if (table == NULL || table[0] == '\0') return NULL;
+	tableFile = (char *)malloc(MAXSTRING * sizeof(char) * 2);
+
+	//
+	// First try to resolve against base
+	//
+	if (base) {
+		int k;
+		strcpy(tableFile, base);
+		k = (int)strlen(tableFile);
+		while (k >= 0 && tableFile[k] != '/' && tableFile[k] != '\\') k--;
+		tableFile[++k] = '\0';
+		strcat(tableFile, table);
+		if (stat(tableFile, &info) == 0 && !(info.st_mode & S_IFDIR)) {
+			_lou_logMessage(LOG_DEBUG, "found table %s", tableFile);
+			return tableFile;
+		}
+	}
+
+	//
+	// It could be an absolute path, or a path relative to the current working
+	// directory
+	//
+	strcpy(tableFile, table);
+	if (stat(tableFile, &info) == 0 && !(info.st_mode & S_IFDIR)) {
+		_lou_logMessage(LOG_DEBUG, "found table %s", tableFile);
+		return tableFile;
+	}
+
+	//
+	// Then search `LOUIS_TABLEPATH`, `dataPath` and `programPath`
+	//
+	if (searchPath[0] != '\0') {
+		char *dir;
+		int last;
+		char *cp;
+		char *searchPath_copy = strdup(searchPath);
+		for (dir = searchPath_copy;; dir = cp + 1) {
+			for (cp = dir; *cp != '\0' && *cp != ','; cp++)
+				;
+			last = (*cp == '\0');
+			*cp = '\0';
+			if (dir == cp) dir = ".";
+			sprintf(tableFile, "%s%c%s", dir, DIR_SEP, table);
+			if (stat(tableFile, &info) == 0 && !(info.st_mode & S_IFDIR)) {
+				_lou_logMessage(LOG_DEBUG, "found table %s", tableFile);
+				free(searchPath_copy);
+				return tableFile;
+			}
+			if (last) break;
+			sprintf(tableFile, "%s%c%s%c%s%c%s", dir, DIR_SEP, "liblouis", DIR_SEP,
+					"tables", DIR_SEP, table);
+			if (stat(tableFile, &info) == 0 && !(info.st_mode & S_IFDIR)) {
+				_lou_logMessage(LOG_DEBUG, "found table %s", tableFile);
+				free(searchPath_copy);
+				return tableFile;
+			}
+			if (last) break;
+		}
+		free(searchPath_copy);
+	}
+	free(tableFile);
+	return NULL;
+}
+
+char *EXPORT_CALL
+_lou_getTablePath() {
+	char searchPath[MAXSTRING];
+	char *path;
+	char *cp;
+	cp = searchPath;
+	path = getenv("LOUIS_TABLEPATH");
+	if (path != NULL && path[0] != '\0') cp += sprintf(cp, ",%s", path);
+	path = lou_getDataPath();
+	if (path != NULL && path[0] != '\0')
+		cp += sprintf(cp, ",%s%c%s%c%s", path, DIR_SEP, "liblouis", DIR_SEP, "tables");
+#ifdef _WIN32
+	path = lou_getProgramPath();
+	if (path != NULL) {
+		if (path[0] != '\0')
+			cp += sprintf(cp, ",%s%s", path, "\\share\\liblouis\\tables");
+		free(path);
+	}
+#else
+	cp += sprintf(cp, ",%s", TABLESDIR);
+#endif
+	if (searchPath[0] != '\0')
+		return strdup(&searchPath[1]);
+	else
+		return strdup(".");
+}
+
+/**
+ * The default table resolver
+ *
+ * Tries to resolve tableList against base. The search path is set to
+ * `LOUIS_TABLEPATH`, `dataPath` and `programPath` (in that order).
+ *
+ * @param table A file path, may be absolute or relative. May be a list of
+ *              tables separated by comma's. In that case, the first table
+ *              is used as the base for the other subtables.
+ * @param base A file path or directory path, or NULL.
+ * @return The file paths of the resolved subtables, or NULL if the table
+ *         could not be resolved.
+ *
+ */
+char **EXPORT_CALL
+_lou_defaultTableResolver(const char *tableList, const char *base) {
+	char *searchPath;
+	char **tableFiles;
+	char *subTable;
+	char *tableList_copy;
+	char *cp;
+	int last;
+	int k;
+
+	/* Set up search path */
+	searchPath = _lou_getTablePath();
+
+	/* Count number of subtables in table list */
+	k = 0;
+	for (cp = (char *)tableList; *cp != '\0'; cp++)
+		if (*cp == ',') k++;
+	tableFiles = (char **)malloc((k + 2) * sizeof(char *));
+
+	/* Resolve subtables */
+	k = 0;
+	tableList_copy = strdup(tableList);
+	for (subTable = tableList_copy;; subTable = cp + 1) {
+		for (cp = subTable; *cp != '\0' && *cp != ','; cp++)
+			;
+		last = (*cp == '\0');
+		*cp = '\0';
+		if (!(tableFiles[k++] = resolveSubtable(subTable, base, searchPath))) {
+			char *path;
+			_lou_logMessage(LOG_ERROR, "Cannot resolve table '%s'", subTable);
+			path = getenv("LOUIS_TABLEPATH");
+			if (path != NULL && path[0] != '\0')
+				_lou_logMessage(LOG_ERROR, "LOUIS_TABLEPATH=%s", path);
+			free(searchPath);
+			free(tableList_copy);
+			free(tableFiles);
+			return NULL;
+		}
+		if (k == 1) base = subTable;
+		if (last) break;
+	}
+	free(searchPath);
+	free(tableList_copy);
+	tableFiles[k] = NULL;
+	return tableFiles;
+}
+
+static char **(EXPORT_CALL *tableResolver)(
+		const char *tableList, const char *base) = &_lou_defaultTableResolver;
+
+static char **
+copyStringArray(char **array) {
+	int len;
+	char **copy;
+	if (!array) return NULL;
+	len = 0;
+	while (array[len]) len++;
+	copy = malloc((len + 1) * sizeof(char *));
+	copy[len] = NULL;
+	while (len) {
+		len--;
+		copy[len] = strdup(array[len]);
+	}
+	return copy;
+}
+
+char **EXPORT_CALL
+_lou_resolveTable(const char *tableList, const char *base) {
+	return copyStringArray((*tableResolver)(tableList, base));
+}
+
+/**
+ * Register a new table resolver. Overrides the default resolver.
+ *
+ * @param resolver The new resolver as a function pointer.
+ *
+ */
+void EXPORT_CALL
+lou_registerTableResolver(
+		char **(EXPORT_CALL *resolver)(const char *tableList, const char *base)) {
+	tableResolver = resolver;
+}
+
+static int fileCount = 0;
+
+/**
+ * Compile a single file
+ *
+ */
+static int
+compileFile(const char *fileName, CharacterClass **characterClasses,
+		TranslationTableCharacterAttributes *characterClassAttribute,
+		short opcodeLengths[], TranslationTableOffset *newRuleOffset,
+		TranslationTableRule **newRule, RuleName **ruleNames,
+		TranslationTableHeader **table) {
+
+	FileInfo nested;
+	fileCount++;
+	nested.fileName = fileName;
+	nested.encoding = noEncoding;
+	nested.status = 0;
+	nested.lineNumber = 0;
+	if ((nested.in = fopen(nested.fileName, "rb"))) {
+		while (_lou_getALine(&nested))
+			compileRule(&nested, characterClasses, characterClassAttribute, opcodeLengths,
+					newRuleOffset, newRule, ruleNames, table);
+		fclose(nested.in);
+		return 1;
+	} else
+		_lou_logMessage(LOG_ERROR, "Cannot open table '%s'", nested.fileName);
+	errorCount++;
+	return 0;
+}
+
+/**
+ * Free a char** array
+ */
+static void
+free_tablefiles(char **tables) {
+	char **table;
+	if (!tables) return;
+	for (table = tables; *table; table++) free(*table);
+	free(tables);
+}
+
+/**
+ * Implement include opcode
+ *
+ */
+static int
+includeFile(FileInfo *nested, CharsString *includedFile,
+		CharacterClass **characterClasses,
+		TranslationTableCharacterAttributes *characterClassAttribute,
+		short opcodeLengths[], TranslationTableOffset *newRuleOffset,
+		TranslationTableRule **newRule, RuleName **ruleNames,
+		TranslationTableHeader **table) {
+	int k;
+	char includeThis[MAXSTRING];
+	char **tableFiles;
+	int rv;
+	for (k = 0; k < includedFile->length; k++)
+		includeThis[k] = (char)includedFile->chars[k];
+	includeThis[k] = 0;
+	tableFiles = _lou_resolveTable(includeThis, nested->fileName);
+	if (tableFiles == NULL) {
+		errorCount++;
+		return 0;
+	}
+	if (tableFiles[1] != NULL) {
+		errorCount++;
+		free_tablefiles(tableFiles);
+		_lou_logMessage(LOG_ERROR,
+				"Table list not supported in include statement: 'include %s'",
+				includeThis);
+		return 0;
+	}
+	rv = compileFile(*tableFiles, characterClasses, characterClassAttribute,
+			opcodeLengths, newRuleOffset, newRule, ruleNames, table);
+	free_tablefiles(tableFiles);
+	return rv;
+}
+
+/**
+ * Compile source tables into a table in memory
+ *
+ */
+static TranslationTableHeader *
+compileTranslationTable(const char *tableList, CharacterClass **characterClasses,
+		TranslationTableCharacterAttributes *characterClassAttribute,
+		short opcodeLengths[], TranslationTableOffset *newRuleOffset,
+		TranslationTableRule **newRule, RuleName **ruleNames) {
+	TranslationTableHeader *table = NULL;
+	char **tableFiles;
+	char **subTable;
+	errorCount = warningCount = fileCount = 0;
+	*characterClasses = NULL;
+	*ruleNames = NULL;
+	if (tableList == NULL) return NULL;
+	if (!opcodeLengths[0]) {
+		TranslationTableOpcode opcode;
+		for (opcode = 0; opcode < CTO_None; opcode++)
+			opcodeLengths[opcode] = (short)strlen(opcodeNames[opcode]);
+	}
+	allocateHeader(NULL, &table);
+
+	/* Initialize emphClasses array */
+	table->emphClasses[0] = NULL;
+
+	/* Compile things that are necesary for the proper operation of
+	 * liblouis or liblouisxml or liblouisutdml */
+	compileString("space \\s 0", characterClasses, characterClassAttribute, opcodeLengths,
+			newRuleOffset, newRule, ruleNames, &table);
+	compileString("noback sign \\x0000 0", characterClasses, characterClassAttribute,
+			opcodeLengths, newRuleOffset, newRule, ruleNames, &table);
+	compileString("space \\x00a0 a unbreakable space", characterClasses,
+			characterClassAttribute, opcodeLengths, newRuleOffset, newRule, ruleNames,
+			&table);
+	compileString("space \\x001b 1b escape", characterClasses, characterClassAttribute,
+			opcodeLengths, newRuleOffset, newRule, ruleNames, &table);
+	compileString("space \\xffff 123456789abcdef ENDSEGMENT", characterClasses,
+			characterClassAttribute, opcodeLengths, newRuleOffset, newRule, ruleNames,
+			&table);
+
+	/* Compile all subtables in the list */
+	if (!(tableFiles = _lou_resolveTable(tableList, NULL))) {
+		errorCount++;
+		goto cleanup;
+	}
+	for (subTable = tableFiles; *subTable; subTable++)
+		if (!compileFile(*subTable, characterClasses, characterClassAttribute,
+					opcodeLengths, newRuleOffset, newRule, ruleNames, &table))
+			goto cleanup;
+
+/* Clean up after compiling files */
+cleanup:
+	free_tablefiles(tableFiles);
+	if (*characterClasses) deallocateCharacterClasses(characterClasses);
+	if (*ruleNames) deallocateRuleNames(ruleNames);
+	if (warningCount) _lou_logMessage(LOG_WARN, "%d warnings issued", warningCount);
+	if (!errorCount) {
+		setDefaults(table);
+		table->tableSize = tableSize;
+		table->bytesUsed = tableUsed;
+	} else {
+		_lou_logMessage(LOG_ERROR, "%d errors found.", errorCount);
+		if (table) free(table);
+		table = NULL;
+	}
+	return table;
+}
+
+static ChainEntry *lastTrans = NULL;
+char *EXPORT_CALL
+_lou_getLastTableList(void) {
+	static char scratchBuf[MAXSTRING];
+	if (lastTrans == NULL) return NULL;
+	strncpy(scratchBuf, lastTrans->tableList, lastTrans->tableListLength);
+	scratchBuf[lastTrans->tableListLength] = 0;
+	return scratchBuf;
+}
+
+/* Return the emphasis classes declared in tableList. */
+char const **EXPORT_CALL
+lou_getEmphClasses(const char *tableList) {
+	const char *names[MAX_EMPH_CLASSES + 1];
+	unsigned int count = 0;
+	const TranslationTableHeader *table = lou_getTable(tableList);
+	if (!table) return NULL;
+
+	while (count < MAX_EMPH_CLASSES) {
+		char const *name = table->emphClasses[count];
+		if (!name) break;
+		names[count++] = name;
+	}
+	names[count++] = NULL;
+
+	{
+		unsigned int size = count * sizeof(names[0]);
+		char const **result = malloc(size);
+		if (!result) return NULL;
+		/* The void* cast is necessary to stop MSVC from warning about
+		 * different 'const' qualifiers (C4090). */
+		memcpy((void *)result, names, size);
+		return result;
+	}
+}
+
+/* Checks and loads tableList. */
+void *EXPORT_CALL
+lou_getTable(const char *tableList) {
+
+	/* Keep track of which tables have already been compiled */
+	int tableListLen;
+	ChainEntry *currentEntry = NULL;
+	ChainEntry *lastEntry = NULL;
+	TranslationTableHeader *newTable;
+	if (tableList == NULL || *tableList == 0) return NULL;
+	errorCount = fileCount = 0;
+	tableListLen = (int)strlen(tableList);
+	/* See if this is the last table used. */
+	if (lastTrans != NULL)
+		if (tableListLen == lastTrans->tableListLength &&
+				(memcmp(&lastTrans->tableList[0], tableList, tableListLen)) == 0)
+			return (gTable = lastTrans->table);
+	/* See if Table has already been compiled */
+	currentEntry = tableChain;
+	while (currentEntry != NULL) {
+		if (tableListLen == currentEntry->tableListLength &&
+				(memcmp(&currentEntry->tableList[0], tableList, tableListLen)) == 0) {
+			lastTrans = currentEntry;
+			return (gTable = currentEntry->table);
+		}
+		lastEntry = currentEntry;
+		currentEntry = currentEntry->next;
+	}
+	if ((newTable = compileTranslationTable(tableList, &gCharacterClasses,
+				 &gCharacterClassAttribute, gOpcodeLengths, &gNewRuleOffset, &gNewRule,
+				 &gRuleNames))) {
+		/* Add a new entry to the table chain. */
+		int entrySize = sizeof(ChainEntry) + tableListLen;
+		ChainEntry *newEntry = malloc(entrySize);
+		if (!newEntry) _lou_outOfMemory();
+		if (tableChain == NULL)
+			tableChain = newEntry;
+		else
+			lastEntry->next = newEntry;
+		newEntry->next = NULL;
+		newEntry->table = newTable;
+		newEntry->tableListLength = tableListLen;
+		memcpy(&newEntry->tableList[0], tableList, tableListLen);
+		lastTrans = newEntry;
+		return (gTable = newEntry->table);
+	}
+	_lou_logMessage(LOG_ERROR, "%s could not be found", tableList);
+	return NULL;
+}
+
+int EXPORT_CALL
+lou_checkTable(const char *tableList) {
+	if (lou_getTable(tableList)) return 1;
+	return 0;
+}
+
+formtype EXPORT_CALL
+lou_getTypeformForEmphClass(const char *tableList, const char *emphClass) {
+	int i;
+	TranslationTableHeader *table = lou_getTable(tableList);
+	if (!table) return 0;
+	for (i = 0; table->emphClasses[i]; i++)
+		if (strcmp(emphClass, table->emphClasses[i]) == 0) return italic << i;
+	return 0;
+}
+
+static unsigned char *destSpacing = NULL;
+static int sizeDestSpacing = 0;
+static formtype *typebuf = NULL;
+static unsigned int *wordBuffer = NULL;
+static unsigned int *emphasisBuffer = NULL;
+static unsigned int *transNoteBuffer = NULL;
+static int sizeTypebuf = 0;
+static widechar *passbuf1 = NULL;
+static int sizePassbuf1 = 0;
+static widechar *passbuf2 = NULL;
+static int sizePassbuf2 = 0;
+static int *posMapping1 = NULL;
+static int sizePosMapping1 = 0;
+static int *posMapping2 = NULL;
+static int sizePosMapping2 = 0;
+static int *posMapping3 = NULL;
+static int sizePosMapping3 = 0;
+void *EXPORT_CALL
+_lou_allocMem(AllocBuf buffer, int srcmax, int destmax) {
+	if (srcmax < 1024) srcmax = 1024;
+	if (destmax < 1024) destmax = 1024;
+	switch (buffer) {
+	case alloc_typebuf:
+		if (destmax > sizeTypebuf) {
+			if (typebuf != NULL) free(typebuf);
+			// TODO: should this be srcmax?
+			typebuf = malloc((destmax + 4) * sizeof(formtype));
+			if (!typebuf) _lou_outOfMemory();
+			sizeTypebuf = destmax;
+		}
+		return typebuf;
+
+	case alloc_wordBuffer:
+
+		if (wordBuffer != NULL) free(wordBuffer);
+		wordBuffer = malloc((srcmax + 4) * sizeof(unsigned int));
+		if (!wordBuffer) _lou_outOfMemory();
+		return wordBuffer;
+
+	case alloc_emphasisBuffer:
+
+		if (emphasisBuffer != NULL) free(emphasisBuffer);
+		emphasisBuffer = malloc((srcmax + 4) * sizeof(unsigned int));
+		if (!emphasisBuffer) _lou_outOfMemory();
+		return emphasisBuffer;
+
+	case alloc_transNoteBuffer:
+
+		if (transNoteBuffer != NULL) free(transNoteBuffer);
+		transNoteBuffer = malloc((srcmax + 4) * sizeof(unsigned int));
+		if (!transNoteBuffer) _lou_outOfMemory();
+		return transNoteBuffer;
+
+	case alloc_destSpacing:
+		if (destmax > sizeDestSpacing) {
+			if (destSpacing != NULL) free(destSpacing);
+			destSpacing = malloc(destmax + 4);
+			if (!destSpacing) _lou_outOfMemory();
+			sizeDestSpacing = destmax;
+		}
+		return destSpacing;
+	case alloc_passbuf1:
+		if (destmax > sizePassbuf1) {
+			if (passbuf1 != NULL) free(passbuf1);
+			passbuf1 = malloc((destmax + 4) * CHARSIZE);
+			if (!passbuf1) _lou_outOfMemory();
+			sizePassbuf1 = destmax;
+		}
+		return passbuf1;
+	case alloc_passbuf2:
+		if (destmax > sizePassbuf2) {
+			if (passbuf2 != NULL) free(passbuf2);
+			passbuf2 = malloc((destmax + 4) * CHARSIZE);
+			if (!passbuf2) _lou_outOfMemory();
+			sizePassbuf2 = destmax;
+		}
+		return passbuf2;
+	case alloc_posMapping1: {
+		int mapSize;
+		if (srcmax >= destmax)
+			mapSize = srcmax;
+		else
+			mapSize = destmax;
+		if (mapSize > sizePosMapping1) {
+			if (posMapping1 != NULL) free(posMapping1);
+			posMapping1 = malloc((mapSize + 4) * sizeof(int));
+			if (!posMapping1) _lou_outOfMemory();
+			sizePosMapping1 = mapSize;
+		}
+	}
+		return posMapping1;
+	case alloc_posMapping2: {
+		int mapSize;
+		if (srcmax >= destmax)
+			mapSize = srcmax;
+		else
+			mapSize = destmax;
+		if (mapSize > sizePosMapping2) {
+			if (posMapping2 != NULL) free(posMapping2);
+			posMapping2 = malloc((mapSize + 4) * sizeof(int));
+			if (!posMapping2) _lou_outOfMemory();
+			sizePosMapping2 = mapSize;
+		}
+	}
+		return posMapping2;
+	case alloc_posMapping3: {
+		int mapSize;
+		if (srcmax >= destmax)
+			mapSize = srcmax;
+		else
+			mapSize = destmax;
+		if (mapSize > sizePosMapping3) {
+			if (posMapping3 != NULL) free(posMapping3);
+			posMapping3 = malloc((mapSize + 4) * sizeof(int));
+			if (!posMapping3) _lou_outOfMemory();
+			sizePosMapping3 = mapSize;
+		}
+	}
+		return posMapping3;
+	default:
+		return NULL;
+	}
+}
+
+void EXPORT_CALL
+lou_free(void) {
+	ChainEntry *currentEntry;
+	ChainEntry *previousEntry;
+	lou_logEnd();
+	if (tableChain != NULL) {
+		currentEntry = tableChain;
+		while (currentEntry) {
+			int i;
+			TranslationTableHeader *t = (TranslationTableHeader *)currentEntry->table;
+			for (i = 0; t->emphClasses[i]; i++) free(t->emphClasses[i]);
+			free(t);
+			previousEntry = currentEntry;
+			currentEntry = currentEntry->next;
+			free(previousEntry);
+		}
+		tableChain = NULL;
+		lastTrans = NULL;
+	}
+	if (typebuf != NULL) free(typebuf);
+	typebuf = NULL;
+	if (wordBuffer != NULL) free(wordBuffer);
+	wordBuffer = NULL;
+	if (emphasisBuffer != NULL) free(emphasisBuffer);
+	emphasisBuffer = NULL;
+	if (transNoteBuffer != NULL) free(transNoteBuffer);
+	transNoteBuffer = NULL;
+	sizeTypebuf = 0;
+	if (destSpacing != NULL) free(destSpacing);
+	destSpacing = NULL;
+	sizeDestSpacing = 0;
+	if (passbuf1 != NULL) free(passbuf1);
+	passbuf1 = NULL;
+	sizePassbuf1 = 0;
+	if (passbuf2 != NULL) free(passbuf2);
+	passbuf2 = NULL;
+	sizePassbuf2 = 0;
+	if (posMapping1 != NULL) free(posMapping1);
+	posMapping1 = NULL;
+	sizePosMapping1 = 0;
+	if (posMapping2 != NULL) free(posMapping2);
+	posMapping2 = NULL;
+	sizePosMapping2 = 0;
+	if (posMapping3 != NULL) free(posMapping3);
+	posMapping3 = NULL;
+	sizePosMapping3 = 0;
+	gOpcodeLengths[0] = 0;
+}
+
+char *EXPORT_CALL
+lou_version(void) {
+	static char *version = PACKAGE_VERSION;
+	return version;
+}
+
+int EXPORT_CALL
+lou_charSize(void) {
+	return CHARSIZE;
+}
+
+int EXPORT_CALL
+lou_compileString(const char *tableList, const char *inString) {
+	int r;
+	TranslationTableHeader *table = lou_getTable(tableList);
+	if (!table) return 0;
+	r = compileString(inString, &gCharacterClasses, &gCharacterClassAttribute,
+			gOpcodeLengths, &gNewRuleOffset, &gNewRule, &gRuleNames, &table);
+	gTable = table;
+	return r;
+}
+
+/**
+ * This procedure provides a target for cals that serve as breakpoints
+ * for gdb.
+ */
+// char *EXPORT_CALL
+// lou_getTablePaths (void)
+// {
+//   static char paths[MAXSTRING];
+//   static char scratchBuf[MAXSTRING];
+//   char *pathList;
+//   strcpy (paths, tablePath);
+//   strcat (paths, ",");
+//   pathList = getenv ("LOUIS_TABLEPATH");
+//   if (pathList)
+//     {
+//       strcat (paths, pathList);
+//       strcat (paths, ",");
+//     }
+//   pathList = getcwd (scratchBuf, MAXSTRING);
+//   if (pathList)
+//     {
+//       strcat (paths, pathList);
+//       strcat (paths, ",");
+//     }
+//   pathList = lou_getDataPath ();
+//   if (pathList)
+//     {
+//       strcat (paths, pathList);
+//       strcat (paths, ",");
+//     }
+// #ifdef _WIN32
+//   strcpy (paths, lou_getProgramPath ());
+//   strcat (paths, "\\share\\liblouss\\tables\\");
+// #else
+//   strcpy (paths, TABLESDIR);
+// #endif
+//   return paths;
+// }
diff --git a/liblouis/liblouis/config.h b/liblouis/liblouis/config.h
new file mode 100644
index 0000000..ecc5e99
--- /dev/null
+++ b/liblouis/liblouis/config.h
@@ -0,0 +1,996 @@
+/* liblouis/config.h.  Generated from config.h.in by configure.  */
+/* liblouis/config.h.in.  Generated from configure.ac by autoheader.  */
+
+#ifndef LOUISCFG_H
+#define LOUISCFG_H
+
+/* Define to the number of bits in type 'ptrdiff_t'. */
+/* #undef BITSIZEOF_PTRDIFF_T */
+
+/* Define to the number of bits in type 'sig_atomic_t'. */
+/* #undef BITSIZEOF_SIG_ATOMIC_T */
+
+/* Define to the number of bits in type 'size_t'. */
+/* #undef BITSIZEOF_SIZE_T */
+
+/* Define to the number of bits in type 'wchar_t'. */
+/* #undef BITSIZEOF_WCHAR_T */
+
+/* Define to the number of bits in type 'wint_t'. */
+/* #undef BITSIZEOF_WINT_T */
+
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+   systems. This function is required for `alloca.c' support on those systems.
+   */
+/* #undef CRAY_STACKSEG_END */
+
+/* Define to 1 if using `alloca.c'. */
+/* #undef C_ALLOCA */
+
+/* Define to 1 if // is a file system root distinct from /. */
+/* #undef DOUBLE_SLASH_IS_DISTINCT_ROOT */
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module fscanf shall be considered present. */
+#define GNULIB_FSCANF 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module malloc-gnu shall be considered present. */
+#define GNULIB_MALLOC_GNU 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module msvc-nothrow shall be considered present. */
+#define GNULIB_MSVC_NOTHROW 1
+
+/* Define to 1 if printf and friends should be labeled with attribute
+   "__gnu_printf__" instead of "__printf__" */
+/* #undef GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU */
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module realloc-gnu shall be considered present. */
+#define GNULIB_REALLOC_GNU 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module scanf shall be considered present. */
+#define GNULIB_SCANF 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module strerror shall be considered present. */
+#define GNULIB_STRERROR 1
+
+/* Define to 1 when the gnulib module environ should be tested. */
+#define GNULIB_TEST_ENVIRON 1
+
+/* Define to 1 when the gnulib module malloc-posix should be tested. */
+#define GNULIB_TEST_MALLOC_POSIX 1
+
+/* Define to 1 when the gnulib module realloc-posix should be tested. */
+#define GNULIB_TEST_REALLOC_POSIX 1
+
+/* Define to 1 when the gnulib module setenv should be tested. */
+#define GNULIB_TEST_SETENV 1
+
+/* Define to 1 when the gnulib module strerror should be tested. */
+#define GNULIB_TEST_STRERROR 1
+
+/* Define to 1 when the gnulib module strndup should be tested. */
+#define GNULIB_TEST_STRNDUP 1
+
+/* Define to 1 when the gnulib module strnlen should be tested. */
+#define GNULIB_TEST_STRNLEN 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module unistr/u16-mbtoucr shall be considered present.
+   */
+#define GNULIB_UNISTR_U16_MBTOUCR 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module unistr/u8-uctomb shall be considered present. */
+#define GNULIB_UNISTR_U8_UCTOMB 1
+
+/* Define to 1 if you have 'alloca' after including <alloca.h>, a header that
+   may be supplied by this distribution. */
+#define HAVE_ALLOCA 1
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+ */
+#define HAVE_ALLOCA_H 1
+
+/* Define to 1 if you have the declaration of `program_invocation_name', and
+   to 0 if you don't. */
+#define HAVE_DECL_PROGRAM_INVOCATION_NAME 1
+
+/* Define to 1 if you have the declaration of `program_invocation_short_name',
+   and to 0 if you don't. */
+#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME 1
+
+/* Define to 1 if you have the declaration of `setenv', and to 0 if you don't.
+ */
+#define HAVE_DECL_SETENV 1
+
+/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you
+   don't. */
+#define HAVE_DECL_STRERROR_R 1
+
+/* Define to 1 if you have the declaration of `strndup', and to 0 if you
+   don't. */
+#define HAVE_DECL_STRNDUP 1
+
+/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
+   don't. */
+#define HAVE_DECL_STRNLEN 1
+
+/* Define to 1 if you have the declaration of `__argv', and to 0 if you don't.
+ */
+#define HAVE_DECL___ARGV 0
+
+/* Define to 1 if you have the <dirent.h> header file. */
+#define HAVE_DIRENT_H 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
+/* #undef HAVE_DOPRNT */
+
+/* Define if you have the declaration of environ. */
+#define HAVE_ENVIRON_DECL 1
+
+/* Define to 1 if you have the `getexecname' function. */
+/* #undef HAVE_GETEXECNAME */
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#define HAVE_GETOPT_H 1
+
+/* Define to 1 if you have the `getopt_long_only' function. */
+#define HAVE_GETOPT_LONG_ONLY 1
+
+/* Define to 1 if you have the `getprogname' function. */
+/* #undef HAVE_GETPROGNAME */
+
+/* Define to 1 if the compiler supports one of the keywords 'inline',
+   '__inline__', '__inline' and effectively inlines functions marked as such.
+   */
+#define HAVE_INLINE 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `yaml' library (-lyaml). */
+/* #undef HAVE_LIBYAML */
+
+/* Define to 1 if you have the <limits.h> header file. */
+#define HAVE_LIMITS_H 1
+
+/* Define to 1 if the system has the type 'long long int'. */
+#define HAVE_LONG_LONG_INT 1
+
+/* Define to 1 if your system has a GNU libc compatible 'malloc' function, and
+   to 0 otherwise. */
+#define HAVE_MALLOC_GNU 1
+
+/* Define if the 'malloc' function is POSIX compliant. */
+#define HAVE_MALLOC_POSIX 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `memset' function. */
+#define HAVE_MEMSET 1
+
+/* Define to 1 on MSVC platforms that have the "invalid parameter handler"
+   concept. */
+/* #undef HAVE_MSVC_INVALID_PARAMETER_HANDLER */
+
+/* Define to 1 if alphasort is declared even after undefining macros. */
+#define HAVE_RAW_DECL_ALPHASORT 1
+
+/* Define to 1 if atoll is declared even after undefining macros. */
+#define HAVE_RAW_DECL_ATOLL 1
+
+/* Define to 1 if canonicalize_file_name is declared even after undefining
+   macros. */
+#define HAVE_RAW_DECL_CANONICALIZE_FILE_NAME 1
+
+/* Define to 1 if chdir is declared even after undefining macros. */
+#define HAVE_RAW_DECL_CHDIR 1
+
+/* Define to 1 if chown is declared even after undefining macros. */
+#define HAVE_RAW_DECL_CHOWN 1
+
+/* Define to 1 if closedir is declared even after undefining macros. */
+#define HAVE_RAW_DECL_CLOSEDIR 1
+
+/* Define to 1 if dirfd is declared even after undefining macros. */
+#define HAVE_RAW_DECL_DIRFD 1
+
+/* Define to 1 if dprintf is declared even after undefining macros. */
+#define HAVE_RAW_DECL_DPRINTF 1
+
+/* Define to 1 if dup is declared even after undefining macros. */
+#define HAVE_RAW_DECL_DUP 1
+
+/* Define to 1 if dup2 is declared even after undefining macros. */
+#define HAVE_RAW_DECL_DUP2 1
+
+/* Define to 1 if dup3 is declared even after undefining macros. */
+#define HAVE_RAW_DECL_DUP3 1
+
+/* Define to 1 if endusershell is declared even after undefining macros. */
+#define HAVE_RAW_DECL_ENDUSERSHELL 1
+
+/* Define to 1 if environ is declared even after undefining macros. */
+#define HAVE_RAW_DECL_ENVIRON 1
+
+/* Define to 1 if euidaccess is declared even after undefining macros. */
+#define HAVE_RAW_DECL_EUIDACCESS 1
+
+/* Define to 1 if faccessat is declared even after undefining macros. */
+#define HAVE_RAW_DECL_FACCESSAT 1
+
+/* Define to 1 if fchdir is declared even after undefining macros. */
+#define HAVE_RAW_DECL_FCHDIR 1
+
+/* Define to 1 if fchownat is declared even after undefining macros. */
+#define HAVE_RAW_DECL_FCHOWNAT 1
+
+/* Define to 1 if fdatasync is declared even after undefining macros. */
+#define HAVE_RAW_DECL_FDATASYNC 1
+
+/* Define to 1 if fdopendir is declared even after undefining macros. */
+#define HAVE_RAW_DECL_FDOPENDIR 1
+
+/* Define to 1 if ffsl is declared even after undefining macros. */
+#define HAVE_RAW_DECL_FFSL 1
+
+/* Define to 1 if ffsll is declared even after undefining macros. */
+#define HAVE_RAW_DECL_FFSLL 1
+
+/* Define to 1 if fpurge is declared even after undefining macros. */
+/* #undef HAVE_RAW_DECL_FPURGE */
+
+/* Define to 1 if fseeko is declared even after undefining macros. */
+#define HAVE_RAW_DECL_FSEEKO 1
+
+/* Define to 1 if fsync is declared even after undefining macros. */
+#define HAVE_RAW_DECL_FSYNC 1
+
+/* Define to 1 if ftello is declared even after undefining macros. */
+#define HAVE_RAW_DECL_FTELLO 1
+
+/* Define to 1 if ftruncate is declared even after undefining macros. */
+#define HAVE_RAW_DECL_FTRUNCATE 1
+
+/* Define to 1 if getcwd is declared even after undefining macros. */
+#define HAVE_RAW_DECL_GETCWD 1
+
+/* Define to 1 if getdelim is declared even after undefining macros. */
+#define HAVE_RAW_DECL_GETDELIM 1
+
+/* Define to 1 if getdomainname is declared even after undefining macros. */
+#define HAVE_RAW_DECL_GETDOMAINNAME 1
+
+/* Define to 1 if getdtablesize is declared even after undefining macros. */
+#define HAVE_RAW_DECL_GETDTABLESIZE 1
+
+/* Define to 1 if getgroups is declared even after undefining macros. */
+#define HAVE_RAW_DECL_GETGROUPS 1
+
+/* Define to 1 if gethostname is declared even after undefining macros. */
+#define HAVE_RAW_DECL_GETHOSTNAME 1
+
+/* Define to 1 if getline is declared even after undefining macros. */
+#define HAVE_RAW_DECL_GETLINE 1
+
+/* Define to 1 if getloadavg is declared even after undefining macros. */
+#define HAVE_RAW_DECL_GETLOADAVG 1
+
+/* Define to 1 if getlogin is declared even after undefining macros. */
+#define HAVE_RAW_DECL_GETLOGIN 1
+
+/* Define to 1 if getlogin_r is declared even after undefining macros. */
+#define HAVE_RAW_DECL_GETLOGIN_R 1
+
+/* Define to 1 if getpagesize is declared even after undefining macros. */
+#define HAVE_RAW_DECL_GETPAGESIZE 1
+
+/* Define to 1 if gets is declared even after undefining macros. */
+/* #undef HAVE_RAW_DECL_GETS */
+
+/* Define to 1 if getsubopt is declared even after undefining macros. */
+#define HAVE_RAW_DECL_GETSUBOPT 1
+
+/* Define to 1 if getusershell is declared even after undefining macros. */
+#define HAVE_RAW_DECL_GETUSERSHELL 1
+
+/* Define to 1 if grantpt is declared even after undefining macros. */
+#define HAVE_RAW_DECL_GRANTPT 1
+
+/* Define to 1 if group_member is declared even after undefining macros. */
+#define HAVE_RAW_DECL_GROUP_MEMBER 1
+
+/* Define to 1 if initstate is declared even after undefining macros. */
+#define HAVE_RAW_DECL_INITSTATE 1
+
+/* Define to 1 if initstate_r is declared even after undefining macros. */
+#define HAVE_RAW_DECL_INITSTATE_R 1
+
+/* Define to 1 if isatty is declared even after undefining macros. */
+#define HAVE_RAW_DECL_ISATTY 1
+
+/* Define to 1 if lchown is declared even after undefining macros. */
+#define HAVE_RAW_DECL_LCHOWN 1
+
+/* Define to 1 if link is declared even after undefining macros. */
+#define HAVE_RAW_DECL_LINK 1
+
+/* Define to 1 if linkat is declared even after undefining macros. */
+#define HAVE_RAW_DECL_LINKAT 1
+
+/* Define to 1 if lseek is declared even after undefining macros. */
+#define HAVE_RAW_DECL_LSEEK 1
+
+/* Define to 1 if memmem is declared even after undefining macros. */
+#define HAVE_RAW_DECL_MEMMEM 1
+
+/* Define to 1 if mempcpy is declared even after undefining macros. */
+#define HAVE_RAW_DECL_MEMPCPY 1
+
+/* Define to 1 if memrchr is declared even after undefining macros. */
+#define HAVE_RAW_DECL_MEMRCHR 1
+
+/* Define to 1 if mkdtemp is declared even after undefining macros. */
+#define HAVE_RAW_DECL_MKDTEMP 1
+
+/* Define to 1 if mkostemp is declared even after undefining macros. */
+#define HAVE_RAW_DECL_MKOSTEMP 1
+
+/* Define to 1 if mkostemps is declared even after undefining macros. */
+#define HAVE_RAW_DECL_MKOSTEMPS 1
+
+/* Define to 1 if mkstemp is declared even after undefining macros. */
+#define HAVE_RAW_DECL_MKSTEMP 1
+
+/* Define to 1 if mkstemps is declared even after undefining macros. */
+#define HAVE_RAW_DECL_MKSTEMPS 1
+
+/* Define to 1 if opendir is declared even after undefining macros. */
+#define HAVE_RAW_DECL_OPENDIR 1
+
+/* Define to 1 if pclose is declared even after undefining macros. */
+#define HAVE_RAW_DECL_PCLOSE 1
+
+/* Define to 1 if pipe is declared even after undefining macros. */
+#define HAVE_RAW_DECL_PIPE 1
+
+/* Define to 1 if pipe2 is declared even after undefining macros. */
+#define HAVE_RAW_DECL_PIPE2 1
+
+/* Define to 1 if popen is declared even after undefining macros. */
+#define HAVE_RAW_DECL_POPEN 1
+
+/* Define to 1 if posix_openpt is declared even after undefining macros. */
+#define HAVE_RAW_DECL_POSIX_OPENPT 1
+
+/* Define to 1 if pread is declared even after undefining macros. */
+#define HAVE_RAW_DECL_PREAD 1
+
+/* Define to 1 if ptsname is declared even after undefining macros. */
+#define HAVE_RAW_DECL_PTSNAME 1
+
+/* Define to 1 if ptsname_r is declared even after undefining macros. */
+#define HAVE_RAW_DECL_PTSNAME_R 1
+
+/* Define to 1 if pwrite is declared even after undefining macros. */
+#define HAVE_RAW_DECL_PWRITE 1
+
+/* Define to 1 if qsort_r is declared even after undefining macros. */
+#define HAVE_RAW_DECL_QSORT_R 1
+
+/* Define to 1 if random is declared even after undefining macros. */
+#define HAVE_RAW_DECL_RANDOM 1
+
+/* Define to 1 if random_r is declared even after undefining macros. */
+#define HAVE_RAW_DECL_RANDOM_R 1
+
+/* Define to 1 if rawmemchr is declared even after undefining macros. */
+#define HAVE_RAW_DECL_RAWMEMCHR 1
+
+/* Define to 1 if readdir is declared even after undefining macros. */
+#define HAVE_RAW_DECL_READDIR 1
+
+/* Define to 1 if readlink is declared even after undefining macros. */
+#define HAVE_RAW_DECL_READLINK 1
+
+/* Define to 1 if readlinkat is declared even after undefining macros. */
+#define HAVE_RAW_DECL_READLINKAT 1
+
+/* Define to 1 if realpath is declared even after undefining macros. */
+#define HAVE_RAW_DECL_REALPATH 1
+
+/* Define to 1 if renameat is declared even after undefining macros. */
+#define HAVE_RAW_DECL_RENAMEAT 1
+
+/* Define to 1 if rewinddir is declared even after undefining macros. */
+#define HAVE_RAW_DECL_REWINDDIR 1
+
+/* Define to 1 if rmdir is declared even after undefining macros. */
+#define HAVE_RAW_DECL_RMDIR 1
+
+/* Define to 1 if rpmatch is declared even after undefining macros. */
+#define HAVE_RAW_DECL_RPMATCH 1
+
+/* Define to 1 if scandir is declared even after undefining macros. */
+#define HAVE_RAW_DECL_SCANDIR 1
+
+/* Define to 1 if secure_getenv is declared even after undefining macros. */
+#define HAVE_RAW_DECL_SECURE_GETENV 1
+
+/* Define to 1 if setenv is declared even after undefining macros. */
+#define HAVE_RAW_DECL_SETENV 1
+
+/* Define to 1 if sethostname is declared even after undefining macros. */
+#define HAVE_RAW_DECL_SETHOSTNAME 1
+
+/* Define to 1 if setstate is declared even after undefining macros. */
+#define HAVE_RAW_DECL_SETSTATE 1
+
+/* Define to 1 if setstate_r is declared even after undefining macros. */
+#define HAVE_RAW_DECL_SETSTATE_R 1
+
+/* Define to 1 if setusershell is declared even after undefining macros. */
+#define HAVE_RAW_DECL_SETUSERSHELL 1
+
+/* Define to 1 if sleep is declared even after undefining macros. */
+#define HAVE_RAW_DECL_SLEEP 1
+
+/* Define to 1 if snprintf is declared even after undefining macros. */
+#define HAVE_RAW_DECL_SNPRINTF 1
+
+/* Define to 1 if srandom is declared even after undefining macros. */
+#define HAVE_RAW_DECL_SRANDOM 1
+
+/* Define to 1 if srandom_r is declared even after undefining macros. */
+#define HAVE_RAW_DECL_SRANDOM_R 1
+
+/* Define to 1 if stpcpy is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STPCPY 1
+
+/* Define to 1 if stpncpy is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STPNCPY 1
+
+/* Define to 1 if strcasestr is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STRCASESTR 1
+
+/* Define to 1 if strchrnul is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STRCHRNUL 1
+
+/* Define to 1 if strdup is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STRDUP 1
+
+/* Define to 1 if strerror_r is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STRERROR_R 1
+
+/* Define to 1 if strncat is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STRNCAT 1
+
+/* Define to 1 if strndup is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STRNDUP 1
+
+/* Define to 1 if strnlen is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STRNLEN 1
+
+/* Define to 1 if strpbrk is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STRPBRK 1
+
+/* Define to 1 if strsep is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STRSEP 1
+
+/* Define to 1 if strsignal is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STRSIGNAL 1
+
+/* Define to 1 if strtod is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STRTOD 1
+
+/* Define to 1 if strtok_r is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STRTOK_R 1
+
+/* Define to 1 if strtoll is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STRTOLL 1
+
+/* Define to 1 if strtoull is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STRTOULL 1
+
+/* Define to 1 if strverscmp is declared even after undefining macros. */
+#define HAVE_RAW_DECL_STRVERSCMP 1
+
+/* Define to 1 if symlink is declared even after undefining macros. */
+#define HAVE_RAW_DECL_SYMLINK 1
+
+/* Define to 1 if symlinkat is declared even after undefining macros. */
+#define HAVE_RAW_DECL_SYMLINKAT 1
+
+/* Define to 1 if tmpfile is declared even after undefining macros. */
+#define HAVE_RAW_DECL_TMPFILE 1
+
+/* Define to 1 if ttyname_r is declared even after undefining macros. */
+#define HAVE_RAW_DECL_TTYNAME_R 1
+
+/* Define to 1 if unlink is declared even after undefining macros. */
+#define HAVE_RAW_DECL_UNLINK 1
+
+/* Define to 1 if unlinkat is declared even after undefining macros. */
+#define HAVE_RAW_DECL_UNLINKAT 1
+
+/* Define to 1 if unlockpt is declared even after undefining macros. */
+#define HAVE_RAW_DECL_UNLOCKPT 1
+
+/* Define to 1 if unsetenv is declared even after undefining macros. */
+#define HAVE_RAW_DECL_UNSETENV 1
+
+/* Define to 1 if usleep is declared even after undefining macros. */
+#define HAVE_RAW_DECL_USLEEP 1
+
+/* Define to 1 if vdprintf is declared even after undefining macros. */
+#define HAVE_RAW_DECL_VDPRINTF 1
+
+/* Define to 1 if vsnprintf is declared even after undefining macros. */
+#define HAVE_RAW_DECL_VSNPRINTF 1
+
+/* Define to 1 if _Exit is declared even after undefining macros. */
+#define HAVE_RAW_DECL__EXIT 1
+
+/* Define to 1 if your system has a GNU libc compatible 'realloc' function,
+   and to 0 otherwise. */
+#define HAVE_REALLOC_GNU 1
+
+/* Define if the 'realloc' function is POSIX compliant. */
+#define HAVE_REALLOC_POSIX 1
+
+/* Define to 1 if you have the <search.h> header file. */
+#define HAVE_SEARCH_H 1
+
+/* Define to 1 if you have the `setenv' function. */
+#define HAVE_SETENV 1
+
+/* Define to 1 if 'sig_atomic_t' is a signed integer type. */
+/* #undef HAVE_SIGNED_SIG_ATOMIC_T */
+
+/* Define to 1 if 'wchar_t' is a signed integer type. */
+/* #undef HAVE_SIGNED_WCHAR_T */
+
+/* Define to 1 if 'wint_t' is a signed integer type. */
+/* #undef HAVE_SIGNED_WINT_T */
+
+/* Define to 1 if you have the <stddef.h> header file. */
+#define HAVE_STDDEF_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strerror_r' function. */
+#define HAVE_STRERROR_R 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strndup' function. */
+#define HAVE_STRNDUP 1
+
+/* Define to 1 if you have the <sys/bitypes.h> header file. */
+/* #undef HAVE_SYS_BITYPES_H */
+
+/* Define to 1 if you have the <sys/cdefs.h> header file. */
+#define HAVE_SYS_CDEFS_H 1
+
+/* Define to 1 if you have the <sys/inttypes.h> header file. */
+/* #undef HAVE_SYS_INTTYPES_H */
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#define HAVE_SYS_SOCKET_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the `tsearch' function. */
+#define HAVE_TSEARCH 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if the system has the type 'unsigned long long int'. */
+#define HAVE_UNSIGNED_LONG_LONG_INT 1
+
+/* Define if you have a global __progname variable */
+/* #undef HAVE_VAR___PROGNAME */
+
+/* Define to 1 if you have the `vprintf' function. */
+#define HAVE_VPRINTF 1
+
+/* Define to 1 if you have the <wchar.h> header file. */
+#define HAVE_WCHAR_H 1
+
+/* Define if you have the 'wchar_t' type. */
+#define HAVE_WCHAR_T 1
+
+/* Define to 1 if you have the <winsock2.h> header file. */
+/* #undef HAVE_WINSOCK2_H */
+
+/* Define if you have the 'wint_t' type. */
+#define HAVE_WINT_T 1
+
+/* Define to 1 if the system has the type `_Bool'. */
+#define HAVE__BOOL 1
+
+/* Define to 1 if you have the `_set_invalid_parameter_handler' function. */
+/* #undef HAVE__SET_INVALID_PARAMETER_HANDLER */
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#define LT_OBJDIR ".libs/"
+
+/* If malloc(0) is != NULL, define this to 1. Otherwise define this to 0. */
+#define MALLOC_0_IS_NONNULL 1
+
+/* Use GNU style printf and scanf.  */
+#ifndef __USE_MINGW_ANSI_STDIO
+#define __USE_MINGW_ANSI_STDIO 1
+#endif
+
+/* Name of package */
+#define PACKAGE "liblouis"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "liblouis-liblouisxml@freelists.org"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "Liblouis"
+
+/* String identifying the packager of this software */
+/* #undef PACKAGE_PACKAGER */
+
+/* Packager info for bug reports (URL/e-mail/...) */
+/* #undef PACKAGE_PACKAGER_BUG_REPORTS */
+
+/* Packager-specific version information */
+/* #undef PACKAGE_PACKAGER_VERSION */
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "Liblouis 3.4.0"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "liblouis"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL "http://www.liblouis.org"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "3.4.0"
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+   'ptrdiff_t'. */
+/* #undef PTRDIFF_T_SUFFIX */
+
+/* Define to 1 if strerror(0) does not return a message implying success. */
+/* #undef REPLACE_STRERROR_0 */
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+   'sig_atomic_t'. */
+/* #undef SIG_ATOMIC_T_SUFFIX */
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+   'size_t'. */
+/* #undef SIZE_T_SUFFIX */
+
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at runtime.
+        STACK_DIRECTION > 0 => grows toward higher addresses
+        STACK_DIRECTION < 0 => grows toward lower addresses
+        STACK_DIRECTION = 0 => direction of growth unknown */
+/* #undef STACK_DIRECTION */
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if strerror_r returns char *. */
+#define STRERROR_R_CHAR_P 1
+
+/* Enable extensions on AIX 3, Interix.  */
+#ifndef _ALL_SOURCE
+#define _ALL_SOURCE 1
+#endif
+/* Enable general extensions on macOS.  */
+#ifndef _DARWIN_C_SOURCE
+#define _DARWIN_C_SOURCE 1
+#endif
+/* Enable GNU extensions on systems that have them.  */
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE 1
+#endif
+/* Enable threading extensions on Solaris.  */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+#define _POSIX_PTHREAD_SEMANTICS 1
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-5:2014.  */
+#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-1:2014.  */
+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+#define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-2:2015.  */
+#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
+#define __STDC_WANT_IEC_60559_DFP_EXT__ 1
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-4:2015.  */
+#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
+#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-3:2015.  */
+#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
+#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1
+#endif
+/* Enable extensions specified by ISO/IEC TR 24731-2:2010.  */
+#ifndef __STDC_WANT_LIB_EXT2__
+#define __STDC_WANT_LIB_EXT2__ 1
+#endif
+/* Enable extensions specified by ISO/IEC 24747:2009.  */
+#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
+#define __STDC_WANT_MATH_SPEC_FUNCS__ 1
+#endif
+/* Enable extensions on HP NonStop.  */
+#ifndef _TANDEM_SOURCE
+#define _TANDEM_SOURCE 1
+#endif
+/* Enable X/Open extensions if necessary.  HP-UX 11.11 defines
+   mbstate_t only if _XOPEN_SOURCE is defined to 500, regardless of
+   whether compiling with -Ae or -D_HPUX_SOURCE=1.  */
+#ifndef _XOPEN_SOURCE
+/* # undef _XOPEN_SOURCE */
+#endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+#define __EXTENSIONS__ 1
+#endif
+
+/* Version number of package */
+#define VERSION "3.4.0"
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+   'wchar_t'. */
+/* #undef WCHAR_T_SUFFIX */
+
+/* Define if widechars are ucs4 */
+/* #undef WIDECHARS_ARE_UCS4 */
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+   'wint_t'. */
+/* #undef WINT_T_SUFFIX */
+
+/* Disable YAML tests */
+/* #undef WITHOUT_YAML */
+
+/* Define to 1 if on MINIX. */
+/* #undef _MINIX */
+
+/* Define to 1 to make NetBSD features available. MINIX 3 needs this. */
+/* #undef _NETBSD_SOURCE */
+
+/* The _Noreturn keyword of C11.  */
+#if !(defined _Noreturn || \
+      (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__))
+#if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) || \
+     0x5110 <= __SUNPRO_C)
+#define _Noreturn __attribute__((__noreturn__))
+#elif defined _MSC_VER && 1200 <= _MSC_VER
+#define _Noreturn __declspec(noreturn)
+#else
+#define _Noreturn
+#endif
+#endif
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+   this defined. */
+/* #undef _POSIX_1_SOURCE */
+
+/* Define to 1 if you need to in order for 'stat' and other things to work. */
+/* #undef _POSIX_SOURCE */
+
+/* Define to rpl_ if the getopt replacement functions and variables should be
+   used. */
+/* #undef __GETOPT_PREFIX */
+
+/* Define to 1 if the system <stdint.h> predates C++11. */
+/* #undef __STDC_CONSTANT_MACROS */
+
+/* Define to 1 if the system <stdint.h> predates C++11. */
+/* #undef __STDC_LIMIT_MACROS */
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Please see the Gnulib manual for how to use these macros.
+
+   Suppress extern inline with HP-UX cc, as it appears to be broken; see
+   <http://lists.gnu.org/archive/html/bug-texinfo/2013-02/msg00030.html>.
+
+   Suppress extern inline with Sun C in standards-conformance mode, as it
+   mishandles inline functions that call each other.  E.g., for 'inline void f
+   (void) { } inline void g (void) { f (); }', c99 incorrectly complains
+   'reference to static identifier "f" in extern inline function'.
+   This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
+
+   Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
+   on configurations that mistakenly use 'static inline' to implement
+   functions or macros in standard C headers like <ctype.h>.  For example,
+   if isdigit is mistakenly implemented via a static inline function,
+   a program containing an extern inline function that calls isdigit
+   may not work since the C standard prohibits extern inline functions
+   from calling static functions.  This bug is known to occur on:
+
+     OS X 10.8 and earlier; see:
+     http://lists.gnu.org/archive/html/bug-gnulib/2012-12/msg00023.html
+
+     DragonFly; see
+     http://muscles.dragonflybsd.org/bulk/bleeding-edge-potential/latest-per-pkg/ah-tty-0.3.12.log
+
+     FreeBSD; see:
+     http://lists.gnu.org/archive/html/bug-gnulib/2014-07/msg00104.html
+
+   OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and
+   for clang but remains for g++; see <http://trac.macports.org/ticket/41033>.
+   Assume DragonFly and FreeBSD will be similar.  */
+#if (((defined __APPLE__ && defined __MACH__) || defined __DragonFly__ || \
+      defined __FreeBSD__) &&                                             \
+     (defined __header_inline                                             \
+          ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ &&       \
+             !defined __clang__)                                          \
+          : ((!defined _DONT_USE_CTYPE_INLINE_ &&                         \
+              (defined __GNUC__ || defined __cplusplus)) ||               \
+             (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE &&           \
+              defined __GNUC__ && !defined __cplusplus))))
+#define _GL_EXTERN_INLINE_STDHEADER_BUG
+#endif
+#if ((__GNUC__ ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__      \
+               : (199901L <= __STDC_VERSION__ && !defined __HP_cc &&       \
+                  !defined __PGI && !(defined __SUNPRO_C && __STDC__))) && \
+     !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+#define _GL_INLINE inline
+#define _GL_EXTERN_INLINE extern inline
+#define _GL_EXTERN_INLINE_IN_USE
+#elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ && \
+       !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+#if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__
+/* __gnu_inline__ suppresses a GCC 4.2 diagnostic.  */
+#define _GL_INLINE extern inline __attribute__((__gnu_inline__))
+#else
+#define _GL_INLINE extern inline
+#endif
+#define _GL_EXTERN_INLINE extern
+#define _GL_EXTERN_INLINE_IN_USE
+#else
+#define _GL_INLINE static _GL_UNUSED
+#define _GL_EXTERN_INLINE static _GL_UNUSED
+#endif
+
+/* In GCC 4.6 (inclusive) to 5.1 (exclusive),
+   suppress bogus "no previous prototype for 'FOO'"
+   and "no previous declaration for 'FOO'" diagnostics,
+   when FOO is an inline function in the header; see
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113> and
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63877>.  */
+#if __GNUC__ == 4 && 6 <= __GNUC_MINOR__
+#if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__
+#define _GL_INLINE_HEADER_CONST_PRAGMA
+#else
+#define _GL_INLINE_HEADER_CONST_PRAGMA \
+  _Pragma("GCC diagnostic ignored \"-Wsuggest-attribute=const\"")
+#endif
+#define _GL_INLINE_HEADER_BEGIN                                        \
+  _Pragma("GCC diagnostic push")                                       \
+      _Pragma("GCC diagnostic ignored \"-Wmissing-prototypes\"")       \
+          _Pragma("GCC diagnostic ignored \"-Wmissing-declarations\"") \
+              _GL_INLINE_HEADER_CONST_PRAGMA
+#define _GL_INLINE_HEADER_END _Pragma("GCC diagnostic pop")
+#else
+#define _GL_INLINE_HEADER_BEGIN
+#define _GL_INLINE_HEADER_END
+#endif
+
+/* A replacement for va_copy, if needed.  */
+#define gl_va_copy(a, b) ((a) = (b))
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
+
+/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports
+   the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of
+   earlier versions), but does not display it by setting __GNUC_STDC_INLINE__.
+   __APPLE__ && __MACH__ test for Mac OS X.
+   __APPLE_CC__ tests for the Apple compiler and its version.
+   __STDC_VERSION__ tests for the C99 mode.  */
+#if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && \
+    !defined __cplusplus && __STDC_VERSION__ >= 199901L &&           \
+    !defined __GNUC_STDC_INLINE__
+#define __GNUC_STDC_INLINE__ 1
+#endif
+
+/* Define to `int' if <sys/types.h> does not define. */
+/* #undef mode_t */
+
+/* Define to `int' if <sys/types.h> does not define. */
+/* #undef pid_t */
+
+/* Define to the equivalent of the C99 'restrict' keyword, or to
+   nothing if this is not supported.  Do not define if restrict is
+   supported directly.  */
+#define restrict __restrict
+/* Work around a bug in Sun C++: it does not support _Restrict or
+   __restrict__, even though the corresponding Sun C compiler ends up with
+   "#define restrict _Restrict" or "#define restrict __restrict__" in the
+   previous line.  Perhaps some future version of Sun C++ will work with
+   restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */
+#if defined __SUNPRO_CC && !defined __RESTRICT
+#define _Restrict
+#define __restrict__
+#endif
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* #undef size_t */
+
+/* Define as a signed type of the same size as size_t. */
+/* #undef ssize_t */
+
+/* Define as a marker that can be attached to declarations that might not
+    be used.  This helps to reduce warnings, such as from
+    GCC -Wunused-parameter.  */
+#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+#define _GL_UNUSED __attribute__((__unused__))
+#else
+#define _GL_UNUSED
+#endif
+/* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name
+   is a misnomer outside of parameter lists.  */
+#define _UNUSED_PARAMETER_ _GL_UNUSED
+
+/* gcc supports the "unused" attribute on possibly unused labels, and
+   g++ has since version 4.5.  Note to support C++ as well as C,
+   _GL_UNUSED_LABEL should be used with a trailing ;  */
+#if !defined __cplusplus || __GNUC__ > 4 || \
+    (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+#define _GL_UNUSED_LABEL _GL_UNUSED
+#else
+#define _GL_UNUSED_LABEL
+#endif
+
+/* The __pure__ attribute was added in gcc 2.96.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+#define _GL_ATTRIBUTE_PURE __attribute__((__pure__))
+#else
+#define _GL_ATTRIBUTE_PURE /* empty */
+#endif
+
+/* The __const__ attribute was added in gcc 2.95.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
+#define _GL_ATTRIBUTE_CONST __attribute__((__const__))
+#else
+#define _GL_ATTRIBUTE_CONST /* empty */
+#endif
+
+/* Define as a macro for copying va_list variables. */
+/* #undef va_copy */
+
+#endif /*LOUISCFG_H*/
diff --git a/liblouis/liblouis/internal.h b/liblouis/liblouis/internal.h
new file mode 100644
index 0000000..8d413ed
--- /dev/null
+++ b/liblouis/liblouis/internal.h
@@ -0,0 +1,790 @@
+/* liblouis Braille Translation and Back-Translation Library
+
+   Based on the Linux screenreader BRLTTY, copyright (C) 1999-2006 by The
+   BRLTTY Team
+
+   Copyright (C) 2004, 2005, 2006 ViewPlus Technologies, Inc. www.viewplus.com
+   Copyright (C) 2004, 2005, 2006 JJB Software, Inc. www.jjb-software.com
+   Copyright (C) 2016 Mike Gray, American Printing House for the Blind
+   Copyright (C) 2016 Davy Kager, Dedicon
+
+   This file is part of liblouis.
+
+   liblouis is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation, either version 2.1 of the License, or
+   (at your option) any later version.
+
+   liblouis is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file
+ * @brief Internal API of liblouis
+ */
+
+#ifndef __LOUIS_H_
+#define __LOUIS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include <stdio.h>
+#include "liblouis.h"
+
+#ifdef _WIN32
+#define PATH_SEP ';'
+#define DIR_SEP '\\'
+#else
+#define PATH_SEP ':'
+#define DIR_SEP '/'
+#endif
+
+#ifdef _MSC_VER
+#define strcasecmp _stricmp
+#endif
+
+#define NUMSWAPS 50
+#define NUMVAR 50
+#define LETSIGNSIZE 128
+#define SEQPATTERNSIZE 128
+#define CHARSIZE sizeof(widechar)
+#define DEFAULTRULESIZE 50
+#define ENDSEGMENT 0xffff
+
+/**
+ * Definitions of braille dots
+ */
+#define B1 0X01
+#define B2 0X02
+#define B3 0X04
+#define B4 0X08
+#define B5 0X10
+#define B6 0X20
+#define B7 0X40
+#define B8 0X80
+#define B9 0X100
+#define B10 0X200
+#define B11 0X400
+#define B12 0X800
+#define B13 0X1000
+#define B14 0X2000
+#define B15 0X4000
+#define B16 0X8000
+
+typedef struct intCharTupple {
+	int key;
+	char value;
+} intCharTupple;
+
+/**
+ * Mapping between braille dot and textual representation as used in dots operands
+ */
+const static intCharTupple dotMapping[] = {
+	{ B1, '1' }, { B2, '2' }, { B3, '3' }, { B4, '4' }, { B5, '5' }, { B6, '6' },
+	{ B7, '7' }, { B8, '8' }, { B9, '9' }, { B10, 'A' }, { B11, 'B' }, { B12, 'C' },
+	{ B13, 'D' }, { B14, 'E' }, { B15, 'F' }, 0,
+};
+
+/* HASHNUM must be prime */
+#define HASHNUM 1123
+
+#define MAXPASS 4
+#define MAXSTRING 2048
+
+#define MAX_EMPH_CLASSES 10  // {emph_1...emph_10} in typeforms enum (liblouis.h)
+
+typedef unsigned int TranslationTableOffset;
+#define OFFSETSIZE sizeof(TranslationTableOffset)
+
+typedef enum {
+	CTC_Space = 0x1,
+	CTC_Letter = 0x2,
+	CTC_Digit = 0x4,
+	CTC_Punctuation = 0x8,
+	CTC_UpperCase = 0x10,
+	CTC_LowerCase = 0x20,
+	CTC_Math = 0x40,
+	CTC_Sign = 0x80,
+	CTC_LitDigit = 0x100,
+	CTC_Class1 = 0x200,
+	CTC_Class2 = 0x400,
+	CTC_Class3 = 0x800,
+	CTC_Class4 = 0x1000,
+	CTC_SeqDelimiter = 0x2000,
+	CTC_SeqBefore = 0x4000,
+	CTC_SeqAfter = 0x8000,
+	CTC_UserDefined0 = 0x10000,
+	CTC_UserDefined1 = 0x20000,
+	CTC_UserDefined2 = 0x40000,
+	CTC_UserDefined3 = 0x80000,
+	CTC_UserDefined4 = 0x100000,
+	CTC_UserDefined5 = 0x200000,
+	CTC_UserDefined6 = 0x400000,
+	CTC_UserDefined7 = 0x800000,
+	CTC_CapsMode = 0x1000000,
+	CTC_NumericMode = 0x2000000,
+	CTC_NumericNoContract = 0x4000000,
+	CTC_EndOfInput = 0x8000000,  // only used by pattern matcher
+	CTC_EmpMatch = 0x10000000,   // only used in TranslationTableRule->before and
+								 // TranslationTableRule->after
+} TranslationTableCharacterAttribute;
+
+typedef enum {
+	pass_first = '`',
+	pass_last = '~',
+	pass_lookback = '_',
+	pass_string = '\"',
+	pass_dots = '@',
+	pass_omit = '?',
+	pass_startReplace = '[',
+	pass_endReplace = ']',
+	pass_startGroup = '{',
+	pass_endGroup = '}',
+	pass_variable = '#',
+	pass_not = '!',
+	pass_search = '/',
+	pass_any = 'a',
+	pass_digit = 'd',
+	pass_litDigit = 'D',
+	pass_letter = 'l',
+	pass_math = 'm',
+	pass_punctuation = 'p',
+	pass_sign = 'S',
+	pass_space = 's',
+	pass_uppercase = 'U',
+	pass_lowercase = 'u',
+	pass_class1 = 'w',
+	pass_class2 = 'x',
+	pass_class3 = 'y',
+	pass_class4 = 'z',
+	pass_attributes = '$',
+	pass_groupstart = '{',
+	pass_groupend = '}',
+	pass_groupreplace = ';',
+	pass_swap = '%',
+	pass_hyphen = '-',
+	pass_until = '.',
+	pass_eq = '=',
+	pass_lt = '<',
+	pass_gt = '>',
+	pass_endTest = 32,
+	pass_plus = '+',
+	pass_copy = '*',
+	pass_leftParen = '(',
+	pass_rightParen = ')',
+	pass_comma = ',',
+	pass_lteq = 130,
+	pass_gteq = 131,
+	pass_invalidToken = 132,
+	pass_noteq = 133,
+	pass_and = 134,
+	pass_or = 135,
+	pass_nameFound = 136,
+	pass_numberFound = 137,
+	pass_boolean = 138,
+	pass_class = 139,
+	pass_define = 140,
+	pass_emphasis = 141,
+	pass_group = 142,
+	pass_mark = 143,
+	pass_repGroup = 143,
+	pass_script = 144,
+	pass_noMoreTokens = 145,
+	pass_replace = 146,
+	pass_if = 147,
+	pass_then = 148,
+	pass_all = 255
+} pass_Codes;
+
+typedef unsigned int TranslationTableCharacterAttributes;
+
+typedef struct {
+	TranslationTableOffset next;
+	widechar lookFor;
+	widechar found;
+} CharOrDots;
+
+typedef struct {
+	TranslationTableOffset next;
+	TranslationTableOffset definitionRule;
+	TranslationTableOffset otherRules;
+	TranslationTableCharacterAttributes attributes;
+	widechar realchar;
+	widechar uppercase;
+	widechar lowercase;
+} TranslationTableCharacter;
+
+typedef enum { /* Op codes */
+	CTO_IncludeFile,
+	CTO_Locale, /* Deprecated, do not use */
+	CTO_Undefined,
+	/* Do not change the order of the following opcodes! */
+	CTO_CapsLetter,
+	CTO_BegCapsWord,
+	CTO_EndCapsWord,
+	CTO_BegCaps,
+	CTO_EndCaps,
+	CTO_BegCapsPhrase,
+	CTO_EndCapsPhrase,
+	CTO_LenCapsPhrase,
+	/* End of ordered opcodes */
+	CTO_LetterSign,
+	CTO_NoLetsignBefore,
+	CTO_NoLetsign,
+	CTO_NoLetsignAfter,
+	CTO_NumberSign,
+	CTO_NumericModeChars,
+	CTO_NumericNoContractChars,
+	CTO_SeqDelimiter,
+	CTO_SeqBeforeChars,
+	CTO_SeqAfterChars,
+	CTO_SeqAfterPattern,
+	CTO_SeqAfterExpression,
+	CTO_EmphClass,
+
+	/* Do not change the order of the following opcodes! */
+	CTO_EmphLetter,
+	CTO_BegEmphWord,
+	CTO_EndEmphWord,
+	CTO_BegEmph,
+	CTO_EndEmph,
+	CTO_BegEmphPhrase,
+	CTO_EndEmphPhrase,
+	CTO_LenEmphPhrase,
+	/* End of ordered opcodes */
+
+	CTO_CapsModeChars,
+	// CTO_EmphModeChars,
+	CTO_BegComp,
+	CTO_CompBegEmph1,
+	CTO_CompEndEmph1,
+	CTO_CompBegEmph2,
+	CTO_CompEndEmph2,
+	CTO_CompBegEmph3,
+	CTO_CompEndEmph3,
+	CTO_CompCapSign,
+	CTO_CompBegCaps,
+	CTO_CompEndCaps,
+	CTO_EndComp,
+	CTO_NoContractSign,
+	CTO_MultInd,
+	CTO_CompDots,
+	CTO_Comp6,
+	CTO_Class,  /* define a character class */
+	CTO_After,  /* only match if after character in class */
+	CTO_Before, /* only match if before character in class 30 */
+	CTO_NoBack,
+	CTO_NoFor,
+	CTO_EmpMatchBefore,
+	CTO_EmpMatchAfter,
+	CTO_SwapCc,
+	CTO_SwapCd,
+	CTO_SwapDd,
+	CTO_Space,
+	CTO_Digit,
+	CTO_Punctuation,
+	CTO_Math,
+	CTO_Sign,
+	CTO_Letter,
+	CTO_UpperCase,
+	CTO_LowerCase,
+	CTO_Grouping,
+	CTO_UpLow,
+	CTO_LitDigit,
+	CTO_Display,
+	CTO_Replace,
+	CTO_Context,
+	CTO_Correct,
+	CTO_Pass2,
+	CTO_Pass3,
+	CTO_Pass4,
+	CTO_Repeated,
+	CTO_RepWord,
+	CTO_CapsNoCont,
+	CTO_Always,
+	CTO_ExactDots,
+	CTO_NoCross,
+	CTO_Syllable,
+	CTO_NoCont,
+	CTO_CompBrl,
+	CTO_Literal,
+	CTO_LargeSign,
+	CTO_WholeWord,
+	CTO_PartWord,
+	CTO_JoinNum,
+	CTO_JoinableWord,
+	CTO_LowWord,
+	CTO_Contraction,
+	CTO_SuffixableWord, /** whole word or beginning of word */
+	CTO_PrefixableWord, /** whole word or end of word */
+	CTO_BegWord,		/** beginning of word only */
+	CTO_BegMidWord,		/** beginning or middle of word */
+	CTO_MidWord,		/** middle of word only 20 */
+	CTO_MidEndWord,		/** middle or end of word */
+	CTO_EndWord,		/** end of word only */
+	CTO_PrePunc,		/** punctuation in string at beginning of word */
+	CTO_PostPunc,		/** punctuation in string at end of word */
+	CTO_BegNum,			/** beginning of number */
+	CTO_MidNum,			/** middle of number, e.g., decimal point */
+	CTO_EndNum,			/** end of number */
+	CTO_DecPoint,
+	CTO_Hyphen,
+	// CTO_Apostrophe,
+	// CTO_Initial,
+	CTO_NoBreak,
+	CTO_Match,
+	CTO_BackMatch,
+	CTO_Attribute,
+	CTO_None,
+
+	/* More internal opcodes */
+	CTO_LetterRule,
+	CTO_NumberRule,
+	CTO_NoContractRule,
+
+	/* Start of (11 x 9) internal opcodes values that match
+	 * {"singlelettercaps"..."lenemphphrase"}
+	 * Do not change the order of the following opcodes! */
+	CTO_CapsLetterRule,
+	CTO_BegCapsWordRule,
+	CTO_EndCapsWordRule,
+	CTO_BegCapsRule,
+	CTO_EndCapsRule,
+	CTO_BegCapsPhraseRule,
+	CTO_EndCapsPhraseBeforeRule,
+	CTO_EndCapsPhraseAfterRule,
+	CTO_Emph1LetterRule,
+	CTO_BegEmph1WordRule,
+	CTO_EndEmph1WordRule,
+	CTO_BegEmph1Rule,
+	CTO_EndEmph1Rule,
+	CTO_BegEmph1PhraseRule,
+	CTO_EndEmph1PhraseBeforeRule,
+	CTO_EndEmph1PhraseAfterRule,
+	CTO_Emph2LetterRule,
+	CTO_BegEmph2WordRule,
+	CTO_EndEmph2WordRule,
+	CTO_BegEmph2Rule,
+	CTO_EndEmph2Rule,
+	CTO_BegEmph2PhraseRule,
+	CTO_EndEmph2PhraseBeforeRule,
+	CTO_EndEmph2PhraseAfterRule,
+	CTO_Emph3LetterRule,
+	CTO_BegEmph3WordRule,
+	CTO_EndEmph3WordRule,
+	CTO_BegEmph3Rule,
+	CTO_EndEmph3Rule,
+	CTO_BegEmph3PhraseRule,
+	CTO_EndEmph3PhraseBeforeRule,
+	CTO_EndEmph3PhraseAfterRule,
+	CTO_Emph4LetterRule,
+	CTO_BegEmph4WordRule,
+	CTO_EndEmph4WordRule,
+	CTO_BegEmph4Rule,
+	CTO_EndEmph4Rule,
+	CTO_BegEmph4PhraseRule,
+	CTO_EndEmph4PhraseBeforeRule,
+	CTO_EndEmph4PhraseAfterRule,
+	CTO_Emph5LetterRule,
+	CTO_BegEmph5WordRule,
+	CTO_EndEmph5WordRule,
+	CTO_BegEmph5Rule,
+	CTO_EndEmph5Rule,
+	CTO_BegEmph5PhraseRule,
+	CTO_EndEmph5PhraseBeforeRule,
+	CTO_EndEmph5PhraseAfterRule,
+	CTO_Emph6LetterRule,
+	CTO_BegEmph6WordRule,
+	CTO_EndEmph6WordRule,
+	CTO_BegEmph6Rule,
+	CTO_EndEmph6Rule,
+	CTO_BegEmph6PhraseRule,
+	CTO_EndEmph6PhraseBeforeRule,
+	CTO_EndEmph6PhraseAfterRule,
+	CTO_Emph7LetterRule,
+	CTO_BegEmph7WordRule,
+	CTO_EndEmph7WordRule,
+	CTO_BegEmph7Rule,
+	CTO_EndEmph7Rule,
+	CTO_BegEmph7PhraseRule,
+	CTO_EndEmph7PhraseBeforeRule,
+	CTO_EndEmph7PhraseAfterRule,
+	CTO_Emph8LetterRule,
+	CTO_BegEmph8WordRule,
+	CTO_EndEmph8WordRule,
+	CTO_BegEmph8Rule,
+	CTO_EndEmph8Rule,
+	CTO_BegEmph8PhraseRule,
+	CTO_EndEmph8PhraseBeforeRule,
+	CTO_EndEmph8PhraseAfterRule,
+	CTO_Emph9LetterRule,
+	CTO_BegEmph9WordRule,
+	CTO_EndEmph9WordRule,
+	CTO_BegEmph9Rule,
+	CTO_EndEmph9Rule,
+	CTO_BegEmph9PhraseRule,
+	CTO_EndEmph9PhraseBeforeRule,
+	CTO_EndEmph9PhraseAfterRule,
+	CTO_Emph10LetterRule,
+	CTO_BegEmph10WordRule,
+	CTO_EndEmph10WordRule,
+	CTO_BegEmph10Rule,
+	CTO_EndEmph10Rule,
+	CTO_BegEmph10PhraseRule,
+	CTO_EndEmph10PhraseBeforeRule,
+	CTO_EndEmph10PhraseAfterRule,
+	/* End of ordered (10 x 9) internal opcodes */
+
+	CTO_BegCompRule,
+	CTO_CompBegEmph1Rule,
+	CTO_CompEndEmph1Rule,
+	CTO_CompBegEmph2Rule,
+	CTO_CompEndEmrh2Rule,
+	CTO_CompBegEmph3Rule,
+	CTO_CompEndEmph3Rule,
+	CTO_CompCapSignRule,
+	CTO_CompBegCapsRule,
+	CTO_CompEndCapsRule,
+	CTO_EndCompRule,
+	CTO_CapsNoContRule,
+	CTO_All
+} TranslationTableOpcode;
+
+typedef struct {
+	TranslationTableOffset charsnext;			/** next chars entry */
+	TranslationTableOffset dotsnext;			/** next dots entry */
+	TranslationTableCharacterAttributes after;  /** character types which must follow */
+	TranslationTableCharacterAttributes before; /** character types which must precede */
+	TranslationTableOffset patterns;			/** before and after patterns */
+	TranslationTableOpcode opcode;		 /** rule for testing validity of replacement */
+	short charslen;						 /** length of string to be replaced */
+	short dotslen;						 /** length of replacement string */
+	widechar charsdots[DEFAULTRULESIZE]; /** find and replacement strings */
+} TranslationTableRule;
+
+typedef struct /* state transition */
+{
+	widechar ch;
+	widechar newState;
+} HyphenationTrans;
+
+typedef union {
+	HyphenationTrans *pointer;
+	TranslationTableOffset offset;
+} PointOff;
+
+typedef struct /* one state */
+{
+	PointOff trans;
+	TranslationTableOffset hyphenPattern;
+	widechar fallbackState;
+	widechar numTrans;
+} HyphenationState;
+
+/**
+ * Translation table header
+ */
+typedef struct { /* translation table */
+	int capsNoCont;
+	int numPasses;
+	int corrections;
+	int syllables;
+	int usesSequences;
+	int usesNumericMode;
+	TranslationTableOffset tableSize;
+	TranslationTableOffset bytesUsed;
+	TranslationTableOffset undefined;
+	TranslationTableOffset letterSign;
+	TranslationTableOffset numberSign;
+	TranslationTableOffset noContractSign;
+	widechar seqPatterns[SEQPATTERNSIZE];
+	char *emphClasses[MAX_EMPH_CLASSES + 1];
+	int seqPatternsCount;
+	widechar seqAfterExpression[SEQPATTERNSIZE];
+	int seqAfterExpressionLength;
+
+	/* emphRules, including caps. */
+	TranslationTableOffset emphRules[MAX_EMPH_CLASSES + 1][9];
+
+	TranslationTableOffset begComp;
+	TranslationTableOffset compBegEmph1;
+	TranslationTableOffset compEndEmph1;
+	TranslationTableOffset compBegEmph2;
+	TranslationTableOffset compEndEmph2;
+	TranslationTableOffset compBegEmph3;
+	TranslationTableOffset compEndEmph3;
+	TranslationTableOffset compCapSign;
+	TranslationTableOffset compBegCaps;
+	TranslationTableOffset compEndCaps;
+	TranslationTableOffset endComp;
+	TranslationTableOffset hyphenStatesArray;
+	widechar noLetsignBefore[LETSIGNSIZE];
+	int noLetsignBeforeCount;
+	widechar noLetsign[LETSIGNSIZE];
+	int noLetsignCount;
+	widechar noLetsignAfter[LETSIGNSIZE];
+	int noLetsignAfterCount;
+	TranslationTableOffset characters[HASHNUM]; /** Character definitions */
+	TranslationTableOffset dots[HASHNUM];		/** Dot definitions */
+	TranslationTableOffset charToDots[HASHNUM];
+	TranslationTableOffset dotsToChar[HASHNUM];
+	TranslationTableOffset compdotsPattern[256];
+	TranslationTableOffset swapDefinitions[NUMSWAPS];
+	TranslationTableOffset forPassRules[MAXPASS + 1];
+	TranslationTableOffset backPassRules[MAXPASS + 1];
+	TranslationTableOffset forRules[HASHNUM];  /** chains of forward rules */
+	TranslationTableOffset backRules[HASHNUM]; /** Chains of backward rules */
+	TranslationTableOffset ruleArea[1]; /** Space for storing all rules and values */
+} TranslationTableHeader;
+
+typedef enum {
+	alloc_typebuf,
+	alloc_wordBuffer,
+	alloc_emphasisBuffer,
+	alloc_transNoteBuffer,
+	alloc_destSpacing,
+	alloc_passbuf1,
+	alloc_passbuf2,
+	alloc_posMapping1,
+	alloc_posMapping2,
+	alloc_posMapping3
+} AllocBuf;
+
+typedef enum {
+	capsRule = 0,
+	emph1Rule = 1,
+	emph2Rule = 2,
+	emph3Rule = 3,
+	emph4Rule = 4,
+	emph5Rule = 5,
+	emph6Rule = 6,
+	emph7Rule = 7,
+	emph8Rule = 8,
+	emph9Rule = 9,
+	emph10Rule = 10
+} EmphRuleNumber;
+
+typedef enum {
+	begPhraseOffset = 0,
+	endPhraseBeforeOffset = 1,
+	endPhraseAfterOffset = 2,
+	begOffset = 3,
+	endOffset = 4,
+	letterOffset = 5,
+	begWordOffset = 6,
+	endWordOffset = 7,
+	lenPhraseOffset = 8
+} EmphCodeOffset;
+
+typedef enum { noEncoding, bigEndian, littleEndian, ascii8 } EncodingType;
+
+typedef struct {
+	const char *fileName;
+	FILE *in;
+	int lineNumber;
+	EncodingType encoding;
+	int status;
+	int linelen;
+	int linepos;
+	int checkencoding[2];
+	widechar line[MAXSTRING];
+} FileInfo;
+
+/* The following function definitions are hooks into
+ * compileTranslationTable.c. Some are used by other library modules.
+ * Others are used by tools like lou_allround.c and lou_debug.c. */
+
+/**
+ * Comma separated list of directories to search for tables.
+ */
+char *EXPORT_CALL
+_lou_getTablePath(void);
+
+/**
+ * Resolve tableList against base.
+ */
+char **EXPORT_CALL
+_lou_resolveTable(const char *tableList, const char *base);
+
+/**
+ * The default table resolver
+ */
+char **EXPORT_CALL
+_lou_defaultTableResolver(const char *tableList, const char *base);
+
+char *EXPORT_CALL
+_lou_getLastTableList(void);
+
+/**
+ * Return single-cell dot pattern corresponding to a character.
+ * TODO: move to commonTranslationFunctions.c
+ */
+widechar EXPORT_CALL
+_lou_getDotsForChar(widechar c);
+
+/**
+ * Return character corresponding to a single-cell dot pattern.
+ * TODO: move to commonTranslationFunctions.c
+ */
+widechar EXPORT_CALL
+_lou_getCharFromDots(widechar d);
+
+/**
+ * Allocate memory for internal buffers
+ *
+ * Used by lou_translateString.c and lou_backTranslateString.c ONLY
+ * to allocate memory for internal buffers.
+ * TODO: move to utils.c
+ */
+void *EXPORT_CALL
+_lou_allocMem(AllocBuf buffer, int srcmax, int destmax);
+
+/**
+ * Hash function for character strings
+ */
+int EXPORT_CALL
+_lou_stringHash(const widechar *c);
+
+/**
+ * Hash function for single characters
+ */
+int EXPORT_CALL
+_lou_charHash(widechar c);
+
+/**
+ * Return a string in the same format as the characters operand in opcodes
+ * TODO: move to utils.c
+ */
+char *EXPORT_CALL
+_lou_showString(widechar const *chars, int length);
+
+/**
+ * Return a character string in the format of the dots operand
+ * TODO: move to utils.c
+ */
+char *EXPORT_CALL
+_lou_showDots(widechar const *dots, int length);
+
+/**
+ * Return a character string where the attributes are indicated
+ * by the attribute letters used in multipass opcodes
+ * TODO: move to utils.c
+ */
+char *EXPORT_CALL
+_lou_showAttributes(TranslationTableCharacterAttributes a);
+
+/**
+ * Return number of the opcode
+ *
+ * @param toFind the opcodes
+ */
+TranslationTableOpcode EXPORT_CALL
+_lou_findOpcodeNumber(const char *tofind);
+
+/**
+ * Return the name of the opcode associated with an opcode number
+ *
+ * @param opcode an opcode
+ */
+const char *EXPORT_CALL
+_lou_findOpcodeName(TranslationTableOpcode opcode);
+
+/**
+ * Convert string to wide characters
+ *
+ * Takes a character string and produces a sequence of wide characters.
+ * Opposite of _lou_showString.
+ *
+ * @param inString the input string
+ * @param outString the output wide char sequence
+ * @return length of the widechar sequence.
+ */
+int EXPORT_CALL
+_lou_extParseChars(const char *inString, widechar *outString);
+
+/**
+ * Convert string to wide characters containing dot patterns
+ *
+ * Takes a character string and produces a sequence of wide characters
+ * containing dot patterns. Opposite of _lou_showDots.
+ * @param inString the input string
+ * @param outString the output wide char sequence
+ * @return length of the widechar sequence.
+ */
+int EXPORT_CALL
+_lou_extParseDots(const char *inString, widechar *outString);
+
+int EXPORT_CALL
+_lou_translateWithTracing(const char *tableList, const widechar *inbuf, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int *outputPos,
+		int *inputPos, int *cursorPos, int mode, const TranslationTableRule **rules,
+		int *rulesLen);
+
+int EXPORT_CALL
+_lou_backTranslateWithTracing(const char *tableList, const widechar *inbuf, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int *outputPos,
+		int *inputPos, int *cursorPos, int mode, const TranslationTableRule **rules,
+		int *rulesLen);
+
+void EXPORT_CALL
+_lou_resetPassVariables(void);
+
+int EXPORT_CALL
+_lou_handlePassVariableTest(const widechar *instructions, int *IC, int *itsTrue);
+
+int EXPORT_CALL
+_lou_handlePassVariableAction(const widechar *instructions, int *IC);
+
+int EXPORT_CALL
+_lou_pattern_compile(const widechar *input, const int input_max, widechar *expr_data,
+		const int expr_max, const TranslationTableHeader *t);
+
+void EXPORT_CALL
+_lou_pattern_reverse(widechar *expr_data);
+
+int EXPORT_CALL
+_lou_pattern_check(const widechar *input, const int input_start, const int input_minmax,
+		const int input_dir, const widechar *expr_data, const TranslationTableHeader *t);
+
+/**
+ * Read a line of widechar's from an input file
+ */
+int EXPORT_CALL
+_lou_getALine(FileInfo *info);
+
+#ifdef DEBUG
+/* Can be inserted in code to be used as a breakpoint in gdb */
+void EXPORT_CALL
+_lou_debugHook(void);
+#endif
+
+/**
+ * Print an out-of-memory message and exit
+ */
+void EXPORT_CALL
+_lou_outOfMemory(void);
+
+/**
+ * Helper for logging a widechar buffer
+ */
+void EXPORT_CALL
+_lou_logWidecharBuf(logLevels level, const char *msg, const widechar *wbuf, int wlen);
+
+void EXPORT_CALL
+_lou_logMessage(logLevels level, const char *format, ...);
+
+extern int translation_direction;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __LOUIS_H_ */
diff --git a/liblouis/liblouis/liblouis.h b/liblouis/liblouis/liblouis.h
new file mode 100644
index 0000000..5cd5676
--- /dev/null
+++ b/liblouis/liblouis/liblouis.h
@@ -0,0 +1,386 @@
+/*
+ * Manually 'generated' from liblouis.h.in by substituting
+ * @WIDECHAR_TYPE@ with 'unsigned short int'.
+ */
+
+/* liblouis Braille Translation and Back-Translation Library
+
+   Based on the Linux screenreader BRLTTY, copyright (C) 1999-2006 by The
+   BRLTTY Team
+
+   Copyright (C) 2004, 2005, 2006 ViewPlus Technologies, Inc. www.viewplus.com
+   Copyright (C) 2004, 2005, 2006 JJB Software, Inc. www.jjb-software.com
+   Copyright (C) 2016 Mike Gray, American Printing House for the Blind
+   Copyright (C) 2016 Davy Kager, Dedicon
+
+   This file is part of liblouis.
+
+   liblouis is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation, either version 2.1 of the License, or
+   (at your option) any later version.
+
+   liblouis is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file
+ * @brief Public API of liblouis
+ */
+
+#ifndef __LIBLOUIS_H_
+#define __LIBLOUIS_H_
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+// clang-format interacts badly with @foo@
+// clang-format off
+typedef unsigned short int widechar;
+// clang-format on
+typedef unsigned short formtype;
+
+#ifdef _MSC_VER
+#ifdef _EXPORTING
+#define LIBLOUIS_API __declspec(dllexport)
+#else
+#define LIBLOUIS_API __declspec(dllimport)
+#endif
+#else
+#define LIBLOUIS_API
+#endif
+
+#ifdef __EMSCRIPTEN__
+#include "emscripten.h"
+#define EXPORT_CALL EMSCRIPTEN_KEEPALIVE
+#elif defined(_WIN32)
+#define EXPORT_CALL __stdcall
+LIBLOUIS_API
+char *EXPORT_CALL
+lou_getProgramPath(void);
+#else
+#define EXPORT_CALL
+#endif
+
+typedef enum {
+	plain_text = 0x0000,
+	emph_1 = 0x0001,
+	emph_2 = 0x0002,
+	emph_3 = 0x0004,
+	emph_4 = 0x0008,
+	emph_5 = 0x0010,
+	emph_6 = 0x0020,
+	emph_7 = 0x0040,
+	emph_8 = 0x0080,
+	emph_9 = 0x0100,
+	emph_10 = 0x0200,
+	computer_braille = 0x0400,
+	no_translate = 0x0800,
+	no_contract = 0x1000,
+	// SYLLABLE_MARKER_1  0x2000,
+	// SYLLABLE_MARKER_1  0x4000
+	// CAPSEMPH  0x4000
+} typeforms;
+
+#define italic emph_1
+#define underline emph_2
+#define bold emph_3
+
+#define comp_emph_1 emph_1
+#define comp_emph_2 emph_2
+#define comp_emph_3 emph_3
+
+#define EMPH_NAME_BOLD "bold"
+#define EMPH_NAME_ITALIC "italic"
+#define EMPH_NAME_UNDERLINE "underline"
+
+typedef enum {
+	noContractions = 1,
+	compbrlAtCursor = 2,
+	dotsIO = 4,
+	comp8Dots = 8,
+	pass1Only = 16,
+	compbrlLeftCursor = 32,
+	ucBrl = 64,
+	noUndefinedDots = 128,
+	partialTrans = 256
+} translationModes;
+
+LIBLOUIS_API
+char *EXPORT_CALL
+lou_version(void);
+
+/**
+ * Return the size of widechar
+ */
+LIBLOUIS_API
+int EXPORT_CALL
+lou_charSize(void);
+
+LIBLOUIS_API
+int EXPORT_CALL
+lou_translateString(const char *tableList, const widechar *inbuf, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int mode);
+
+LIBLOUIS_API
+int EXPORT_CALL
+lou_translate(const char *tableList, const widechar *inbuf, int *inlen, widechar *outbuf,
+		int *outlen, formtype *typeform, char *spacing, int *outputPos, int *inputPos,
+		int *cursorPos, int mode);
+
+LIBLOUIS_API
+int EXPORT_CALL
+lou_translatePrehyphenated(const char *tableList, const widechar *inbuf, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int *outputPos,
+		int *inputPos, int *cursorPos, char *inputHyphens, char *outputHyphens, int mode);
+
+LIBLOUIS_API
+int EXPORT_CALL
+lou_hyphenate(
+		const char *tableList, const widechar *inbuf, int inlen, char *hyphens, int mode);
+LIBLOUIS_API
+int EXPORT_CALL
+lou_dotsToChar(
+		const char *tableList, widechar *inbuf, widechar *outbuf, int length, int mode);
+LIBLOUIS_API
+int EXPORT_CALL
+lou_charToDots(const char *tableList, const widechar *inbuf, widechar *outbuf, int length,
+		int mode);
+LIBLOUIS_API
+int EXPORT_CALL
+lou_backTranslateString(const char *tableList, const widechar *inbuf, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int mode);
+
+LIBLOUIS_API
+int EXPORT_CALL
+lou_backTranslate(const char *tableList, const widechar *inbuf, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int *outputPos,
+		int *inputPos, int *cursorPos, int mode);
+/**
+ * Print error messages to a file
+ *
+ * @deprecated As of 2.6.0, applications using liblouis should
+ * implement their own logging system.
+ */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_logPrint(const char *format, ...);
+
+/**
+ * Specify the name of the file to be used by lou_logPrint.
+ *
+ * If it is not used, this file is stderr
+ *
+ * @deprecated As of 2.6.0, applications using liblouis should
+ * implement their own logging system.
+ */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_logFile(const char *filename);
+
+/**
+ * Read a character from a file, whether big-encian, little-endian or ASCII8
+ *
+ * and return it as an integer. EOF at end of file. Mode = 1 on first
+ * call, any other value thereafter
+ */
+LIBLOUIS_API
+int EXPORT_CALL
+lou_readCharFromFile(const char *fileName, int *mode);
+
+/**
+ * Close the log file so it can be read by other functions.
+ *
+ * @deprecated As of 2.6.0, applications using liblouis should
+ * implement their own logging system.
+ */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_logEnd(void);
+
+/**
+ * Load and compile a translation table
+ *
+ * Check the table for errors. If none are found load the table into
+ * memory and return a pointer to it. If errors are found return a
+ * null pointer. It is called by lou_translateString() and
+ * lou_backTranslateString() and also by functions in liblouisutdml
+ * and by the tools.
+ */
+LIBLOUIS_API
+void *EXPORT_CALL
+lou_getTable(const char *tableList);
+
+/**
+ * Check a translation table for errors.
+ *
+ * If no errors are found it load the table into memory and returns a
+ * non-zero value. Else the return value is 0.
+ */
+LIBLOUIS_API
+int EXPORT_CALL
+lou_checkTable(const char *tableList);
+
+/**
+ * Register a new table resolver. Overrides the default resolver. */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_registerTableResolver(
+		char **(EXPORT_CALL *resolver)(const char *table, const char *base));
+
+/**
+ * Compile a table entry on the fly at run-time
+ *
+ * This function enables you to compile a table entry on the fly at
+ * run-time. The new entry is added to tableList and remains in
+ * force until lou_free() is called. If tableList has not
+ * previously been loaded it is loaded and compiled.
+ *
+ * @param inString contains the table entry to be added. It may be
+ * anything valid. Error messages will be produced if it is invalid.
+ *
+ * @return 1 on success and 0 on failure.
+ */
+LIBLOUIS_API
+int EXPORT_CALL
+lou_compileString(const char *tableList, const char *inString);
+
+/**
+ * Get the typeform bit for the named emphasis class.
+ *
+ * If the table defines the specified emphasis class the corresponding
+ * typeform is returned. Else the return value is 0.
+ */
+LIBLOUIS_API
+formtype EXPORT_CALL
+lou_getTypeformForEmphClass(const char *tableList, const char *emphClass);
+
+/**
+ * Return the emphasis class names declared in tableList as a
+ * NULL-terminated array of strings. The array is acquired with malloc()
+ * and should be released with free(). The strings must not be released,
+ * and are no longer valid after lou_free() has been called.
+ */
+LIBLOUIS_API
+char const **EXPORT_CALL
+lou_getEmphClasses(const char *tableList);
+
+/**
+ * Set the path used for searching for tables and liblouisutdml files.
+ *
+ * Overrides the installation path. */
+LIBLOUIS_API
+char *EXPORT_CALL
+lou_setDataPath(const char *path);
+
+/**
+ * Get the path set in the previous function. */
+LIBLOUIS_API
+char *EXPORT_CALL
+lou_getDataPath(void);
+
+typedef enum {
+	LOG_ALL = 0,
+	LOG_DEBUG = 10000,
+	LOG_INFO = 20000,
+	LOG_WARN = 30000,
+	LOG_ERROR = 40000,
+	LOG_FATAL = 50000,
+	LOG_OFF = 60000
+} logLevels;
+
+typedef void (*logcallback)(logLevels level, const char *message);
+
+/**
+ * Register logging callbacks
+ * Set to NULL for default callback.
+ */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_registerLogCallback(logcallback callback);
+
+/**
+ * Set the level for logging callback to be called at
+ */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_setLogLevel(logLevels level);
+
+/* =========================  BETA API ========================= */
+
+// Use the following two function with care, API is subject to change!
+
+/**
+ * Parse, analyze and index tables.
+ *
+ * This function must be called prior to lou_findTable() and
+ * lou_listTables(). Table names must be provided as a NULL-terminated
+ * array of strings. Each table should resolve to exactly one file. An
+ * error message is given when a table contains invalid or duplicate
+ * metadata fields.
+ */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_indexTables(const char **tables);
+
+/**
+ * Find the best match for a query.
+ *
+ * Returns the name of the table, or NULL when no match can be
+ * found. If lou_indexTables() has not been previously called, the
+ * table search path specified with LOUIS_TABLEPATH will be indexed
+ * first. An error message is given when the query is invalid. Freeing
+ * the memory of the returned string is the responsibility of the
+ * caller.
+ */
+LIBLOUIS_API
+char *EXPORT_CALL
+lou_findTable(const char *query);
+
+/**
+ * Read metadata from a file.
+ *
+ * Returns the value of the metadata field specified by `key' in
+ * `table', or NULL when the field does not exist. Freeing the memory
+ * of the returned string is the responsibility of the caller.
+ */
+LIBLOUIS_API
+const char *EXPORT_CALL
+lou_getTableInfo(const char *table, const char *key);
+
+/**
+ * List available tables.
+ *
+ * Returns the names of available tables as a NULL-terminated array of
+ * strings. Only tables that are discoverable, i.e. the have active
+ * metadata, are listed. If lou_indexTables() has not been previously
+ * called, the table search path specified with LOUIS_TABLEPATH will
+ * be indexed first. Freeing the memory of the returned array and
+ * strings is the responsibility of the caller.
+ */
+LIBLOUIS_API
+const char **EXPORT_CALL
+lou_listTables();
+
+/* ====================== END OF BETA API ====================== */
+
+/**
+ * Free all memory allocated by liblouis.
+ *
+ * This function should be called at the end of the application to
+ * free all memory allocated by liblouis.
+ */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_free(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __LIBLOUIS_H_ */
diff --git a/liblouis/liblouis/liblouis.h.in b/liblouis/liblouis/liblouis.h.in
new file mode 100644
index 0000000..a01f9ff
--- /dev/null
+++ b/liblouis/liblouis/liblouis.h.in
@@ -0,0 +1,381 @@
+/* liblouis Braille Translation and Back-Translation Library
+
+   Based on the Linux screenreader BRLTTY, copyright (C) 1999-2006 by The
+   BRLTTY Team
+
+   Copyright (C) 2004, 2005, 2006 ViewPlus Technologies, Inc. www.viewplus.com
+   Copyright (C) 2004, 2005, 2006 JJB Software, Inc. www.jjb-software.com
+   Copyright (C) 2016 Mike Gray, American Printing House for the Blind
+   Copyright (C) 2016 Davy Kager, Dedicon
+
+   This file is part of liblouis.
+
+   liblouis is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation, either version 2.1 of the License, or
+   (at your option) any later version.
+
+   liblouis is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file
+ * @brief Public API of liblouis
+ */
+
+#ifndef __LIBLOUIS_H_
+#define __LIBLOUIS_H_
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+// clang-format interacts badly with @foo@
+// clang-format off
+typedef @WIDECHAR_TYPE@ widechar;
+// clang-format on
+typedef unsigned short formtype;
+
+#ifdef _MSC_VER
+#ifdef _EXPORTING
+#define LIBLOUIS_API __declspec(dllexport)
+#else
+#define LIBLOUIS_API __declspec(dllimport)
+#endif
+#else
+#define LIBLOUIS_API
+#endif
+
+#ifdef __EMSCRIPTEN__
+#include "emscripten.h"
+#define EXPORT_CALL EMSCRIPTEN_KEEPALIVE
+#elif defined(_WIN32)
+#define EXPORT_CALL __stdcall
+LIBLOUIS_API
+char *EXPORT_CALL
+lou_getProgramPath(void);
+#else
+#define EXPORT_CALL
+#endif
+
+typedef enum {
+	plain_text = 0x0000,
+	emph_1 = 0x0001,
+	emph_2 = 0x0002,
+	emph_3 = 0x0004,
+	emph_4 = 0x0008,
+	emph_5 = 0x0010,
+	emph_6 = 0x0020,
+	emph_7 = 0x0040,
+	emph_8 = 0x0080,
+	emph_9 = 0x0100,
+	emph_10 = 0x0200,
+	computer_braille = 0x0400,
+	no_translate = 0x0800,
+	no_contract = 0x1000,
+	// SYLLABLE_MARKER_1  0x2000,
+	// SYLLABLE_MARKER_1  0x4000
+	// CAPSEMPH  0x4000
+} typeforms;
+
+#define italic emph_1
+#define underline emph_2
+#define bold emph_3
+
+#define comp_emph_1 emph_1
+#define comp_emph_2 emph_2
+#define comp_emph_3 emph_3
+
+#define EMPH_NAME_BOLD "bold"
+#define EMPH_NAME_ITALIC "italic"
+#define EMPH_NAME_UNDERLINE "underline"
+
+typedef enum {
+	noContractions = 1,
+	compbrlAtCursor = 2,
+	dotsIO = 4,
+	comp8Dots = 8,
+	pass1Only = 16,
+	compbrlLeftCursor = 32,
+	ucBrl = 64,
+	noUndefinedDots = 128,
+	partialTrans = 256
+} translationModes;
+
+LIBLOUIS_API
+char *EXPORT_CALL
+lou_version(void);
+
+/**
+ * Return the size of widechar
+ */
+LIBLOUIS_API
+int EXPORT_CALL
+lou_charSize(void);
+
+LIBLOUIS_API
+int EXPORT_CALL
+lou_translateString(const char *tableList, const widechar *inbuf, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int mode);
+
+LIBLOUIS_API
+int EXPORT_CALL
+lou_translate(const char *tableList, const widechar *inbuf, int *inlen, widechar *outbuf,
+		int *outlen, formtype *typeform, char *spacing, int *outputPos, int *inputPos,
+		int *cursorPos, int mode);
+
+LIBLOUIS_API
+int EXPORT_CALL
+lou_translatePrehyphenated(const char *tableList, const widechar *inbuf, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int *outputPos,
+		int *inputPos, int *cursorPos, char *inputHyphens, char *outputHyphens, int mode);
+
+LIBLOUIS_API
+int EXPORT_CALL
+lou_hyphenate(
+		const char *tableList, const widechar *inbuf, int inlen, char *hyphens, int mode);
+LIBLOUIS_API
+int EXPORT_CALL
+lou_dotsToChar(
+		const char *tableList, widechar *inbuf, widechar *outbuf, int length, int mode);
+LIBLOUIS_API
+int EXPORT_CALL
+lou_charToDots(const char *tableList, const widechar *inbuf, widechar *outbuf, int length,
+		int mode);
+LIBLOUIS_API
+int EXPORT_CALL
+lou_backTranslateString(const char *tableList, const widechar *inbuf, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int mode);
+
+LIBLOUIS_API
+int EXPORT_CALL
+lou_backTranslate(const char *tableList, const widechar *inbuf, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int *outputPos,
+		int *inputPos, int *cursorPos, int mode);
+/**
+ * Print error messages to a file
+ *
+ * @deprecated As of 2.6.0, applications using liblouis should
+ * implement their own logging system.
+ */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_logPrint(const char *format, ...);
+
+/**
+ * Specify the name of the file to be used by lou_logPrint.
+ *
+ * If it is not used, this file is stderr
+ *
+ * @deprecated As of 2.6.0, applications using liblouis should
+ * implement their own logging system.
+ */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_logFile(const char *filename);
+
+/**
+ * Read a character from a file, whether big-encian, little-endian or ASCII8
+ *
+ * and return it as an integer. EOF at end of file. Mode = 1 on first
+ * call, any other value thereafter
+ */
+LIBLOUIS_API
+int EXPORT_CALL
+lou_readCharFromFile(const char *fileName, int *mode);
+
+/**
+ * Close the log file so it can be read by other functions.
+ *
+ * @deprecated As of 2.6.0, applications using liblouis should
+ * implement their own logging system.
+ */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_logEnd(void);
+
+/**
+ * Load and compile a translation table
+ *
+ * Check the table for errors. If none are found load the table into
+ * memory and return a pointer to it. If errors are found return a
+ * null pointer. It is called by lou_translateString() and
+ * lou_backTranslateString() and also by functions in liblouisutdml
+ * and by the tools.
+ */
+LIBLOUIS_API
+void *EXPORT_CALL
+lou_getTable(const char *tableList);
+
+/**
+ * Check a translation table for errors.
+ *
+ * If no errors are found it load the table into memory and returns a
+ * non-zero value. Else the return value is 0.
+ */
+LIBLOUIS_API
+int EXPORT_CALL
+lou_checkTable(const char *tableList);
+
+/**
+ * Register a new table resolver. Overrides the default resolver. */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_registerTableResolver(
+		char **(EXPORT_CALL *resolver)(const char *table, const char *base));
+
+/**
+ * Compile a table entry on the fly at run-time
+ *
+ * This function enables you to compile a table entry on the fly at
+ * run-time. The new entry is added to tableList and remains in
+ * force until lou_free() is called. If tableList has not
+ * previously been loaded it is loaded and compiled.
+ *
+ * @param inString contains the table entry to be added. It may be
+ * anything valid. Error messages will be produced if it is invalid.
+ *
+ * @return 1 on success and 0 on failure.
+ */
+LIBLOUIS_API
+int EXPORT_CALL
+lou_compileString(const char *tableList, const char *inString);
+
+/**
+ * Get the typeform bit for the named emphasis class.
+ *
+ * If the table defines the specified emphasis class the corresponding
+ * typeform is returned. Else the return value is 0.
+ */
+LIBLOUIS_API
+formtype EXPORT_CALL
+lou_getTypeformForEmphClass(const char *tableList, const char *emphClass);
+
+/**
+ * Return the emphasis class names declared in tableList as a
+ * NULL-terminated array of strings. The array is acquired with malloc()
+ * and should be released with free(). The strings must not be released,
+ * and are no longer valid after lou_free() has been called.
+ */
+LIBLOUIS_API
+char const **EXPORT_CALL
+lou_getEmphClasses(const char *tableList);
+
+/**
+ * Set the path used for searching for tables and liblouisutdml files.
+ *
+ * Overrides the installation path. */
+LIBLOUIS_API
+char *EXPORT_CALL
+lou_setDataPath(const char *path);
+
+/**
+ * Get the path set in the previous function. */
+LIBLOUIS_API
+char *EXPORT_CALL
+lou_getDataPath(void);
+
+typedef enum {
+	LOG_ALL = 0,
+	LOG_DEBUG = 10000,
+	LOG_INFO = 20000,
+	LOG_WARN = 30000,
+	LOG_ERROR = 40000,
+	LOG_FATAL = 50000,
+	LOG_OFF = 60000
+} logLevels;
+
+typedef void (*logcallback)(logLevels level, const char *message);
+
+/**
+ * Register logging callbacks
+ * Set to NULL for default callback.
+ */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_registerLogCallback(logcallback callback);
+
+/**
+ * Set the level for logging callback to be called at
+ */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_setLogLevel(logLevels level);
+
+/* =========================  BETA API ========================= */
+
+// Use the following two function with care, API is subject to change!
+
+/**
+ * Parse, analyze and index tables.
+ *
+ * This function must be called prior to lou_findTable() and
+ * lou_listTables(). Table names must be provided as a NULL-terminated
+ * array of strings. Each table should resolve to exactly one file. An
+ * error message is given when a table contains invalid or duplicate
+ * metadata fields.
+ */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_indexTables(const char **tables);
+
+/**
+ * Find the best match for a query.
+ *
+ * Returns the name of the table, or NULL when no match can be
+ * found. If lou_indexTables() has not been previously called, the
+ * table search path specified with LOUIS_TABLEPATH will be indexed
+ * first. An error message is given when the query is invalid. Freeing
+ * the memory of the returned string is the responsibility of the
+ * caller.
+ */
+LIBLOUIS_API
+char *EXPORT_CALL
+lou_findTable(const char *query);
+
+/**
+ * Read metadata from a file.
+ *
+ * Returns the value of the metadata field specified by `key' in
+ * `table', or NULL when the field does not exist. Freeing the memory
+ * of the returned string is the responsibility of the caller.
+ */
+LIBLOUIS_API
+const char *EXPORT_CALL
+lou_getTableInfo(const char *table, const char *key);
+
+/**
+ * List available tables.
+ *
+ * Returns the names of available tables as a NULL-terminated array of
+ * strings. Only tables that are discoverable, i.e. the have active
+ * metadata, are listed. If lou_indexTables() has not been previously
+ * called, the table search path specified with LOUIS_TABLEPATH will
+ * be indexed first. Freeing the memory of the returned array and
+ * strings is the responsibility of the caller.
+ */
+LIBLOUIS_API
+const char **EXPORT_CALL
+lou_listTables();
+
+/* ====================== END OF BETA API ====================== */
+
+/**
+ * Free all memory allocated by liblouis.
+ *
+ * This function should be called at the end of the application to
+ * free all memory allocated by liblouis.
+ */
+LIBLOUIS_API
+void EXPORT_CALL
+lou_free(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __LIBLOUIS_H_ */
diff --git a/liblouis/liblouis/logging.c b/liblouis/liblouis/logging.c
new file mode 100644
index 0000000..bbffdcc
--- /dev/null
+++ b/liblouis/liblouis/logging.c
@@ -0,0 +1,160 @@
+/* liblouis Braille Translation and Back-Translation  Library
+
+   Copyright (C) 2004, 2005, 2006 ViewPlus Technologies, Inc. www.viewplus.com
+   Copyright (C) 2004, 2005, 2006 JJB Software, Inc. www.jjb-software.com
+
+   This file is part of liblouis.
+
+   liblouis is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation, either version 2.1 of the License, or
+   (at your option) any later version.
+
+   liblouis is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file
+ * @brief Logging
+ */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include "internal.h"
+
+void EXPORT_CALL
+_lou_logWidecharBuf(logLevels level, const char *msg, const widechar *wbuf, int wlen) {
+	/* When calculating output size:
+	 * Each wdiechar is represented in hex, thus needing two bytes for each
+	 * byte in the widechar (sizeof(widechar) * 2)
+	 * Allow space for the "0x%X " formatting (+ 3)
+	 * Number of characters in widechar buffer (wlen * )
+	 * Give space for additional message (+ strlen(msg))
+	 * Remember the null terminator (+ 1)
+	 */
+	int logBufSize = (wlen * ((sizeof(widechar) * 3) + 3)) + 3 + (int)strlen(msg);
+	char *logMsg = malloc(logBufSize);
+	char *p = logMsg;
+	char *formatString;
+	int i = 0;
+	if (sizeof(widechar) == 2)
+		formatString = "0x%04X ";
+	else
+		formatString = "0x%08X ";
+	for (i = 0; i < (int)strlen(msg); i++) logMsg[i] = msg[i];
+	p += strlen(msg);
+	for (i = 0; i < wlen; i++) {
+		p += sprintf(p, formatString, wbuf[i]);
+	}
+	*p = '~';
+	p++;
+	*p = ' ';
+	p++;
+	for (i = 0; i < wlen; i++) {
+		if (wbuf[i] & 0xff00)
+			*p = ' ';
+		else
+			*p = (char)wbuf[i];
+		p++;
+	}
+	*p = '\0';
+	_lou_logMessage(level, "%s", logMsg);
+	free(logMsg);
+}
+
+static void
+defaultLogCallback(logLevels level, const char *message) {
+	lou_logPrint("%s",
+			message);  // lou_logPrint takes formatting, protect against % in message
+}
+
+static logcallback logCallbackFunction = defaultLogCallback;
+void EXPORT_CALL
+lou_registerLogCallback(logcallback callback) {
+	if (callback == NULL)
+		logCallbackFunction = defaultLogCallback;
+	else
+		logCallbackFunction = callback;
+}
+
+static logLevels logLevel = LOG_INFO;
+void EXPORT_CALL
+lou_setLogLevel(logLevels level) {
+	logLevel = level;
+}
+
+void EXPORT_CALL
+_lou_logMessage(logLevels level, const char *format, ...) {
+	if (format == NULL) return;
+	if (level < logLevel) return;
+	if (logCallbackFunction != NULL) {
+#ifdef _WIN32
+		double f = 2.3;  // Needed to force VC++ runtime floating point support
+#endif
+		char *s;
+		size_t len;
+		va_list argp;
+		va_start(argp, format);
+		len = vsnprintf(0, 0, format, argp);
+		va_end(argp);
+		if ((s = malloc(len + 1)) != 0) {
+			va_start(argp, format);
+			vsnprintf(s, len + 1, format, argp);
+			va_end(argp);
+			logCallbackFunction(level, s);
+			free(s);
+		}
+	}
+}
+
+static FILE *logFile = NULL;
+static char initialLogFileName[256] = "";
+
+void EXPORT_CALL
+lou_logFile(const char *fileName) {
+	if (logFile) {
+		fclose(logFile);
+		logFile = NULL;
+	}
+	if (fileName == NULL || fileName[0] == 0) return;
+	if (initialLogFileName[0] == 0) strcpy(initialLogFileName, fileName);
+	logFile = fopen(fileName, "a");
+	if (logFile == NULL && initialLogFileName[0] != 0)
+		logFile = fopen(initialLogFileName, "a");
+	if (logFile == NULL) {
+		fprintf(stderr, "Cannot open log file %s\n", fileName);
+		logFile = stderr;
+	}
+}
+
+void EXPORT_CALL
+lou_logPrint(const char *format, ...) {
+#ifndef __SYMBIAN32__
+	va_list argp;
+	if (format == NULL) return;
+	if (logFile == NULL) logFile = fopen(initialLogFileName, "a");
+	if (logFile == NULL) logFile = stderr;
+	va_start(argp, format);
+	vfprintf(logFile, format, argp);
+	fprintf(logFile, "\n");
+	fflush(logFile);
+	va_end(argp);
+#endif
+}
+
+/* Close the log file */
+void EXPORT_CALL
+lou_logEnd(void) {
+	if (logFile != NULL && logFile != stderr) fclose(logFile);
+	logFile = NULL;
+}
diff --git a/liblouis/liblouis/lou_backTranslateString.c b/liblouis/liblouis/lou_backTranslateString.c
new file mode 100644
index 0000000..66c8b5d
--- /dev/null
+++ b/liblouis/liblouis/lou_backTranslateString.c
@@ -0,0 +1,1619 @@
+/* liblouis Braille Translation and Back-Translation Library
+
+   Based on the Linux screenreader BRLTTY, copyright (C) 1999-2006 by The
+   BRLTTY Team
+
+   Copyright (C) 2004, 2005, 2006 ViewPlus Technologies, Inc. www.viewplus.com
+   Copyright (C) 2004, 2005, 2006 JJB Software, Inc. www.jjb-software.com
+
+   This file is part of liblouis.
+
+   liblouis is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation, either version 2.1 of the License, or
+   (at your option) any later version.
+
+   liblouis is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file
+ * @brief Translate from braille
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "internal.h"
+
+static int
+backTranslateString(const TranslationTableHeader *table, int *src, int srcmax, int *dest,
+		int destmax, int mode, int currentPass, const widechar *currentInput,
+		widechar *currentOutput, char *spacebuf, int *srcMapping, int *outputPositions,
+		int *inputPositions, int *cursorPosition, int *cursorStatus,
+		const TranslationTableRule **appliedRules, int *appliedRulesCount,
+		int maxAppliedRules);
+static int
+makeCorrections(const TranslationTableHeader *table, int *src, int srcmax, int *dest,
+		int destmax, int mode, int currentPass, const widechar *currentInput,
+		widechar *currentOutput, int *srcMapping, int *outputPositions,
+		int *inputPositions, int *cursorPosition, int *cursorStatus,
+		const TranslationTableRule **appliedRules, int *appliedRulesCount,
+		int maxAppliedRules);
+static int
+translatePass(const TranslationTableHeader *table, int *src, int srcmax, int *dest,
+		int destmax, int mode, int currentPass, const widechar *currentInput,
+		widechar *currentOutput, int *srcMapping, int *outputPositions,
+		int *inputPositions, int *cursorPosition, int *cursorStatus,
+		const TranslationTableRule **appliedRules, int *appliedRulesCount,
+		int maxAppliedRules);
+static void
+passSelectRule(const TranslationTableHeader *table, int src, int srcmax, int currentPass,
+		const widechar *currentInput, TranslationTableOpcode *currentOpcode,
+		const TranslationTableRule **currentRule, int *passSrc,
+		const widechar **passInstructions, int *passIC, int *startMatch,
+		int *startReplace, int *endReplace);
+
+int EXPORT_CALL
+lou_backTranslateString(const char *tableList, const widechar *inbuf, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int modex) {
+	return lou_backTranslate(tableList, inbuf, inlen, outbuf, outlen, typeform, spacing,
+			NULL, NULL, NULL, modex);
+}
+
+int EXPORT_CALL
+lou_backTranslate(const char *tableList, const widechar *inbuf, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int *outputPos,
+		int *inputPos, int *cursorPos, int modex) {
+	return _lou_backTranslateWithTracing(tableList, inbuf, inlen, outbuf, outlen,
+			typeform, spacing, outputPos, inputPos, cursorPos, modex, NULL, NULL);
+}
+
+static int
+doPasses(widechar *outbuf, const TranslationTableHeader *table, int *src, int *srcmax,
+		int *dest, int destmax, int mode, const widechar *currentInput,
+		widechar *passbuf1, widechar *passbuf2, char *spacebuf, int *srcMapping,
+		int *outputPositions, int *inputPositions, int *cursorPosition, int *cursorStatus,
+		const TranslationTableRule **appliedRules, int *appliedRulesCount,
+		int maxAppliedRules) {
+	int currentPass;
+	widechar *currentOutput;
+	int firstPass = table->numPasses;
+	int lastPass = 1;
+
+	if (table->corrections) lastPass -= 1;
+
+	if (mode & pass1Only) {
+		_lou_logMessage(LOG_WARN, "warning: pass1Only mode has been deprecated.");
+		firstPass = 1;
+		lastPass = 1;
+	}
+
+	currentPass = firstPass;
+
+	while (1) {
+		currentOutput = (currentPass == lastPass)
+				? outbuf
+				: (currentInput == passbuf1) ? passbuf2 : passbuf1;
+
+		switch (currentPass) {
+		case 1:
+			if (!backTranslateString(table, src, *srcmax, dest, destmax, mode,
+						currentPass, currentInput, currentOutput, spacebuf, srcMapping,
+						outputPositions, inputPositions, cursorPosition, cursorStatus,
+						appliedRules, appliedRulesCount, maxAppliedRules))
+				return 0;
+			break;
+
+		case 0:
+			if (!makeCorrections(table, src, *srcmax, dest, destmax, mode, currentPass,
+						currentInput, currentOutput, srcMapping, outputPositions,
+						inputPositions, cursorPosition, cursorStatus, appliedRules,
+						appliedRulesCount, maxAppliedRules))
+				return 0;
+			break;
+
+		default:
+			if (!translatePass(table, src, *srcmax, dest, destmax, mode, currentPass,
+						currentInput, currentOutput, srcMapping, outputPositions,
+						inputPositions, cursorPosition, cursorStatus, appliedRules,
+						appliedRulesCount, maxAppliedRules))
+				return 0;
+			break;
+		}
+
+		if (currentPass == lastPass) return 1;
+
+		currentInput = currentOutput;
+		*srcmax = *dest;
+		currentPass -= 1;
+	}
+}
+
+int EXPORT_CALL
+_lou_backTranslateWithTracing(const char *tableList, const widechar *inbuf, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int *outputPos,
+		int *inputPos, int *cursorPos, int modex, const TranslationTableRule **rules,
+		int *rulesLen) {
+	int srcmax;
+	int src;
+	int dest;
+	int destmax;
+	int mode;
+	widechar *passbuf1 = NULL;
+	widechar *passbuf2 = NULL;
+	unsigned char *typebuf = NULL;
+	char *spacebuf;
+	int *srcMapping = NULL;
+	int *outputPositions;
+	int *inputPositions;
+	int cursorPosition;
+	int cursorStatus;
+	const TranslationTableRule **appliedRules;
+	int maxAppliedRules;
+	int appliedRulesCount;
+	int k;
+	int goodTrans = 1;
+	if (tableList == NULL || inbuf == NULL || inlen == NULL || outbuf == NULL ||
+			outlen == NULL)
+		return 0;
+	const TranslationTableHeader *table = lou_getTable(tableList);
+	if (table == NULL) return 0;
+	srcmax = 0;
+	while (srcmax < *inlen && inbuf[srcmax]) srcmax++;
+	destmax = *outlen;
+	typebuf = (unsigned char *)typeform;
+	spacebuf = spacing;
+	outputPositions = outputPos;
+	if (outputPos != NULL)
+		for (k = 0; k < srcmax; k++) outputPos[k] = -1;
+	inputPositions = inputPos;
+	if (cursorPos != NULL)
+		cursorPosition = *cursorPos;
+	else
+		cursorPosition = -1;
+	cursorStatus = 0;
+	mode = modex;
+	if (!(passbuf1 = _lou_allocMem(alloc_passbuf1, srcmax, destmax))) return 0;
+	if (typebuf != NULL) memset(typebuf, '0', destmax);
+	if (spacebuf != NULL) memset(spacebuf, '*', destmax);
+	for (k = 0; k < srcmax; k++)
+		if ((mode & dotsIO))
+			passbuf1[k] = inbuf[k] | 0x8000;
+		else
+			passbuf1[k] = _lou_getDotsForChar(inbuf[k]);
+	passbuf1[srcmax] = _lou_getDotsForChar(' ');
+	if (!(srcMapping = _lou_allocMem(alloc_posMapping1, srcmax, destmax))) return 0;
+	for (k = 0; k <= srcmax; k++) srcMapping[k] = k;
+	srcMapping[srcmax] = srcmax;
+	if ((!(mode & pass1Only)) && (table->numPasses > 1 || table->corrections)) {
+		if (!(passbuf2 = _lou_allocMem(alloc_passbuf2, srcmax, destmax))) return 0;
+	}
+	appliedRulesCount = 0;
+	if (rules != NULL && rulesLen != NULL) {
+		appliedRules = rules;
+		maxAppliedRules = *rulesLen;
+	} else {
+		appliedRules = NULL;
+		maxAppliedRules = 0;
+	}
+	goodTrans = doPasses(outbuf, table, &src, &srcmax, &dest, destmax, mode, passbuf1,
+			passbuf1, passbuf2, spacebuf, srcMapping, outputPositions, inputPositions,
+			&cursorPosition, &cursorStatus, appliedRules, &appliedRulesCount,
+			maxAppliedRules);
+	if (src < *inlen) *inlen = srcMapping[src];
+	*outlen = dest;
+	if (outputPos != NULL) {
+		int lastpos = 0;
+		for (k = 0; k < *inlen; k++)
+			if (outputPos[k] == -1)
+				outputPos[k] = lastpos;
+			else
+				lastpos = outputPos[k];
+	}
+	if (cursorPos != NULL) *cursorPos = cursorPosition;
+	if (rulesLen != NULL) *rulesLen = appliedRulesCount;
+	return goodTrans;
+}
+
+static TranslationTableCharacter *
+back_findCharOrDots(widechar c, int m, const TranslationTableHeader *table) {
+	/* Look up character or dot pattern in the appropriate
+	 * table. */
+	static TranslationTableCharacter noChar = { 0, 0, 0, CTC_Space, 32, 32, 32 };
+	static TranslationTableCharacter noDots = { 0, 0, 0, CTC_Space, B16, B16, B16 };
+	TranslationTableCharacter *notFound;
+	TranslationTableCharacter *character;
+	TranslationTableOffset bucket;
+	unsigned long int makeHash = (unsigned long int)c % HASHNUM;
+	if (m == 0) {
+		bucket = table->characters[makeHash];
+		notFound = &noChar;
+	} else {
+		bucket = table->dots[makeHash];
+		notFound = &noDots;
+	}
+	while (bucket) {
+		character = (TranslationTableCharacter *)&table->ruleArea[bucket];
+		if (character->realchar == c) return character;
+		bucket = character->next;
+	}
+	notFound->realchar = notFound->uppercase = notFound->lowercase = c;
+	return notFound;
+}
+
+static int
+checkAttr(const widechar c, const TranslationTableCharacterAttributes a, int m,
+		const TranslationTableHeader *table) {
+	static widechar prevc = 0;
+	static TranslationTableCharacterAttributes preva = 0;
+	if (c != prevc) {
+		preva = (back_findCharOrDots(c, m, table))->attributes;
+		prevc = c;
+	}
+	return ((preva & a) ? 1 : 0);
+}
+
+static int
+compareDots(const widechar *address1, const widechar *address2, int count) {
+	int k;
+	if (!count) return 0;
+	for (k = 0; k < count; k++)
+		if (address1[k] != address2[k]) return 0;
+	return 1;
+}
+
+static void
+back_setBefore(const TranslationTableHeader *table, int dest, widechar *currentOutput,
+		TranslationTableCharacterAttributes *beforeAttributes) {
+	widechar before = (dest == 0) ? ' ' : currentOutput[dest - 1];
+	*beforeAttributes = (back_findCharOrDots(before, 0, table))->attributes;
+}
+
+static void
+back_setAfter(int length, const TranslationTableHeader *table, int src, int srcmax,
+		const widechar *currentInput,
+		TranslationTableCharacterAttributes *afterAttributes) {
+	widechar after = (src + length < srcmax) ? currentInput[src + length] : ' ';
+	*afterAttributes = (back_findCharOrDots(after, 1, table))->attributes;
+}
+
+static int
+isBegWord(const TranslationTableHeader *table, int dest, widechar *currentOutput) {
+	/* See if this is really the beginning of a word. Look at what has
+	 * already been translated. */
+	int k;
+	if (dest == 0) return 1;
+	for (k = dest - 1; k >= 0; k--) {
+		const TranslationTableCharacter *ch =
+				back_findCharOrDots(currentOutput[k], 0, table);
+		if (ch->attributes & CTC_Space) break;
+		if (ch->attributes & (CTC_Letter | CTC_Digit | CTC_Math | CTC_Sign)) return 0;
+	}
+	return 1;
+}
+
+static int
+isEndWord(const TranslationTableHeader *table, int src, int srcmax, int mode,
+		const widechar *currentInput, int currentDotslen) {
+	if (mode & partialTrans) return 0;
+	/* See if this is really the end of a word. */
+	int k;
+	const TranslationTableCharacter *dots;
+	TranslationTableOffset testRuleOffset;
+	TranslationTableRule *testRule;
+	for (k = src + currentDotslen; k < srcmax; k++) {
+		int postpuncFound = 0;
+		int TranslationFound = 0;
+		dots = back_findCharOrDots(currentInput[k], 1, table);
+		testRuleOffset = dots->otherRules;
+		if (dots->attributes & CTC_Space) break;
+		if (dots->attributes & CTC_Letter) return 0;
+		while (testRuleOffset) {
+			testRule = (TranslationTableRule *)&table->ruleArea[testRuleOffset];
+			/* #360: Don't treat begword/midword as definite translations here
+			 * because we don't know whether they apply yet. Subsequent
+			 * input will allow us to determine whether the word continues.
+			 */
+			if (testRule->charslen > 1 && testRule->opcode != CTO_BegWord &&
+					testRule->opcode != CTO_MidWord)
+				TranslationFound = 1;
+			if (testRule->opcode == CTO_PostPunc) postpuncFound = 1;
+			if (testRule->opcode == CTO_Hyphen) return 1;
+			testRuleOffset = testRule->dotsnext;
+		}
+		if (TranslationFound && !postpuncFound) return 0;
+	}
+	return 1;
+}
+static int
+findBrailleIndicatorRule(TranslationTableOffset offset,
+		const TranslationTableHeader *table, int *currentDotslen,
+		TranslationTableOpcode *currentOpcode, const TranslationTableRule **currentRule) {
+	if (!offset) return 0;
+	*currentRule = (TranslationTableRule *)&table->ruleArea[offset];
+	*currentOpcode = (*currentRule)->opcode;
+	*currentDotslen = (*currentRule)->dotslen;
+	return 1;
+}
+
+static int
+handleMultind(const TranslationTableHeader *table, int *currentDotslen,
+		TranslationTableOpcode *currentOpcode, const TranslationTableRule **currentRule,
+		int *doingMultind, const TranslationTableRule *multindRule) {
+	/* Handle multille braille indicators */
+	int found = 0;
+	if (!*doingMultind) return 0;
+	switch (multindRule->charsdots[multindRule->charslen - *doingMultind]) {
+	case CTO_CapsLetterRule:  // FIXME: make sure this works
+		found = findBrailleIndicatorRule(table->emphRules[capsRule][letterOffset], table,
+				currentDotslen, currentOpcode, currentRule);
+		break;
+	// NOTE:  following fixme is based on the names at the time of
+	//        commit f22f91eb510cb4eef33dfb4950a297235dd2f9f1.
+	// FIXME: the next two opcodes were begcaps/endcaps,
+	//        and they were aliased to opcodes capsword/capswordstop.
+	//        However, the table attributes they use are
+	//        table->beginCapitalSign and table->endCapitalSign.
+	//        These are actually compiled with firstlettercaps/lastlettercaps.
+	//        Which to use here?
+	case CTO_BegCapsWordRule:
+		found = findBrailleIndicatorRule(table->emphRules[capsRule][begWordOffset], table,
+				currentDotslen, currentOpcode, currentRule);
+		break;
+	case CTO_EndCapsWordRule:
+		found = findBrailleIndicatorRule(table->emphRules[capsRule][endWordOffset], table,
+				currentDotslen, currentOpcode, currentRule);
+		break;
+	case CTO_LetterSign:
+		found = findBrailleIndicatorRule(
+				table->letterSign, table, currentDotslen, currentOpcode, currentRule);
+		break;
+	case CTO_NoContractSign:
+		found = findBrailleIndicatorRule(
+				table->noContractSign, table, currentDotslen, currentOpcode, currentRule);
+		break;
+	case CTO_NumberSign:
+		found = findBrailleIndicatorRule(
+				table->numberSign, table, currentDotslen, currentOpcode, currentRule);
+		break;
+	case CTO_EndEmph1PhraseBeforeRule:
+		found = findBrailleIndicatorRule(
+				table->emphRules[emph1Rule][endPhraseBeforeOffset], table, currentDotslen,
+				currentOpcode, currentRule);
+		break;
+	case CTO_BegEmph1Rule:
+		found = findBrailleIndicatorRule(table->emphRules[emph1Rule][begOffset], table,
+				currentDotslen, currentOpcode, currentRule);
+		break;
+	case CTO_EndEmph1Rule:
+		found = findBrailleIndicatorRule(table->emphRules[emph1Rule][endOffset], table,
+				currentDotslen, currentOpcode, currentRule);
+		break;
+	case CTO_EndEmph2PhraseBeforeRule:
+		found = findBrailleIndicatorRule(
+				table->emphRules[emph2Rule][endPhraseBeforeOffset], table, currentDotslen,
+				currentOpcode, currentRule);
+		break;
+	case CTO_BegEmph2Rule:
+		found = findBrailleIndicatorRule(table->emphRules[emph2Rule][begOffset], table,
+				currentDotslen, currentOpcode, currentRule);
+		break;
+	case CTO_EndEmph2Rule:
+		found = findBrailleIndicatorRule(table->emphRules[emph2Rule][endOffset], table,
+				currentDotslen, currentOpcode, currentRule);
+		break;
+	case CTO_EndEmph3PhraseBeforeRule:
+		found = findBrailleIndicatorRule(
+				table->emphRules[emph3Rule][endPhraseBeforeOffset], table, currentDotslen,
+				currentOpcode, currentRule);
+		break;
+	case CTO_BegEmph3Rule:
+		found = findBrailleIndicatorRule(table->emphRules[emph3Rule][begOffset], table,
+				currentDotslen, currentOpcode, currentRule);
+		break;
+	case CTO_EndEmph3Rule:
+		found = findBrailleIndicatorRule(table->emphRules[emph3Rule][endOffset], table,
+				currentDotslen, currentOpcode, currentRule);
+		break;
+	case CTO_BegComp:
+		found = findBrailleIndicatorRule(
+				table->begComp, table, currentDotslen, currentOpcode, currentRule);
+		break;
+	case CTO_EndComp:
+		found = findBrailleIndicatorRule(
+				table->endComp, table, currentDotslen, currentOpcode, currentRule);
+		break;
+	default:
+		found = 0;
+		break;
+	}
+	(*doingMultind)--;
+	return found;
+}
+
+static int
+back_passDoTest(const TranslationTableHeader *table, int src, int srcmax,
+		const widechar *currentInput, TranslationTableOpcode currentOpcode,
+		const TranslationTableRule *currentRule, int *passSrc,
+		const widechar **passInstructions, int *passIC, int *startMatch,
+		int *startReplace, int *endReplace);
+static int
+back_passDoAction(const TranslationTableHeader *table, int src, int srcmax, int *dest,
+		int destmax, int mode, const widechar *currentInput, widechar *currentOutput,
+		int *srcMapping, int *outputPositions, int *inputPositions, int *cursorPosition,
+		int *cursorStatus, int *nextUpper, int allUpper, int allUpperPhrase,
+		TranslationTableOpcode currentOpcode, const TranslationTableRule *currentRule,
+		int passSrc, const widechar *passInstructions, int passIC, int startMatch,
+		int startReplace, int *endReplace);
+
+static int
+findBackPassRule(const TranslationTableHeader *table, int src, int srcmax,
+		int currentPass, const widechar *currentInput,
+		TranslationTableOpcode *currentOpcode, const TranslationTableRule **currentRule,
+		int *passSrc, const widechar **passInstructions, int *passIC, int *startMatch,
+		int *startReplace, int *endReplace) {
+	TranslationTableOffset ruleOffset;
+	ruleOffset = table->backPassRules[currentPass];
+
+	while (ruleOffset) {
+		*currentRule = (TranslationTableRule *)&table->ruleArea[ruleOffset];
+		*currentOpcode = (*currentRule)->opcode;
+
+		switch (*currentOpcode) {
+		case CTO_Correct:
+			if (currentPass != 0) goto NEXT_RULE;
+			break;
+		case CTO_Context:
+			if (currentPass != 1) goto NEXT_RULE;
+			break;
+		case CTO_Pass2:
+			if (currentPass != 2) goto NEXT_RULE;
+			break;
+		case CTO_Pass3:
+			if (currentPass != 3) goto NEXT_RULE;
+			break;
+		case CTO_Pass4:
+			if (currentPass != 4) goto NEXT_RULE;
+			break;
+		default:
+			goto NEXT_RULE;
+		}
+
+		if (back_passDoTest(table, src, srcmax, currentInput, *currentOpcode,
+					*currentRule, passSrc, passInstructions, passIC, startMatch,
+					startReplace, endReplace))
+			return 1;
+
+	NEXT_RULE:
+		ruleOffset = (*currentRule)->dotsnext;
+	}
+
+	return 0;
+}
+
+static void
+back_selectRule(const TranslationTableHeader *table, int src, int srcmax, int dest,
+		int mode, const widechar *currentInput, widechar *currentOutput, int itsANumber,
+		int itsALetter, int *currentDotslen, TranslationTableOpcode *currentOpcode,
+		const TranslationTableRule **currentRule, TranslationTableOpcode previousOpcode,
+		int *doingMultind, const TranslationTableRule **multindRule,
+		TranslationTableCharacterAttributes beforeAttributes, int *passSrc,
+		const widechar **passInstructions, int *passIC, int *startMatch,
+		int *startReplace, int *endReplace) {
+	/* check for valid back-translations */
+	int length = srcmax - src;
+	TranslationTableOffset ruleOffset = 0;
+	static TranslationTableRule pseudoRule = { 0 };
+	unsigned long int makeHash = 0;
+	const TranslationTableCharacter *dots =
+			back_findCharOrDots(currentInput[src], 1, table);
+	int tryThis;
+	if (handleMultind(table, currentDotslen, currentOpcode, currentRule, doingMultind,
+				*multindRule))
+		return;
+	for (tryThis = 0; tryThis < 3; tryThis++) {
+		switch (tryThis) {
+		case 0:
+			if (length < 2 || (itsANumber && (dots->attributes & CTC_LitDigit))) break;
+			/* Hash function optimized for backward translation */
+			makeHash = (unsigned long int)dots->realchar << 8;
+			makeHash += (unsigned long int)(back_findCharOrDots(
+													currentInput[src + 1], 1, table))
+								->realchar;
+			makeHash %= HASHNUM;
+			ruleOffset = table->backRules[makeHash];
+			break;
+		case 1:
+			if (!(length >= 1)) break;
+			length = 1;
+			ruleOffset = dots->otherRules;
+			break;
+		case 2: /* No rule found */
+			*currentRule = &pseudoRule;
+			*currentOpcode = pseudoRule.opcode = CTO_None;
+			*currentDotslen = pseudoRule.dotslen = 1;
+			pseudoRule.charsdots[0] = currentInput[src];
+			pseudoRule.charslen = 0;
+			return;
+			break;
+		}
+		while (ruleOffset) {
+			const widechar *currentDots;
+			*currentRule = (TranslationTableRule *)&table->ruleArea[ruleOffset];
+			*currentOpcode = (*currentRule)->opcode;
+			if (*currentOpcode == CTO_Context) {
+				currentDots = &(*currentRule)->charsdots[0];
+				*currentDotslen = (*currentRule)->charslen;
+			} else {
+				currentDots = &(*currentRule)->charsdots[(*currentRule)->charslen];
+				*currentDotslen = (*currentRule)->dotslen;
+			}
+			if (((*currentDotslen <= length) &&
+						compareDots(&currentInput[src], currentDots, *currentDotslen))) {
+				TranslationTableCharacterAttributes afterAttributes;
+				/* check this rule */
+				back_setAfter(*currentDotslen, table, src, srcmax, currentInput,
+						&afterAttributes);
+				if ((!((*currentRule)->after & ~CTC_EmpMatch) ||
+							(beforeAttributes & (*currentRule)->after)) &&
+						(!((*currentRule)->before & ~CTC_EmpMatch) ||
+								(afterAttributes & (*currentRule)->before))) {
+					switch (*currentOpcode) { /* check validity of this Translation */
+					case CTO_Context:
+						if (back_passDoTest(table, src, srcmax, currentInput,
+									*currentOpcode, *currentRule, passSrc,
+									passInstructions, passIC, startMatch, startReplace,
+									endReplace))
+							return;
+						break;
+					case CTO_Space:
+					case CTO_Digit:
+					case CTO_Letter:
+					case CTO_UpperCase:
+					case CTO_LowerCase:
+					case CTO_Punctuation:
+					case CTO_Math:
+					case CTO_Sign:
+					case CTO_ExactDots:
+					case CTO_NoCross:
+					case CTO_Repeated:
+					case CTO_Replace:
+					case CTO_Hyphen:
+						return;
+					case CTO_LitDigit:
+						if (itsANumber) return;
+						break;
+					case CTO_CapsLetterRule:
+					case CTO_BegCapsRule:
+					case CTO_EndCapsRule:
+					case CTO_BegCapsWordRule:
+					case CTO_EndCapsWordRule:
+					case CTO_BegEmph1Rule:
+					case CTO_EndEmph1Rule:
+					case CTO_BegEmph2Rule:
+					case CTO_EndEmph2Rule:
+					case CTO_BegEmph3Rule:
+					case CTO_EndEmph3Rule:
+					case CTO_NumberRule:
+					case CTO_BegCompRule:
+					case CTO_EndCompRule:
+						return;
+					case CTO_LetterRule:
+					case CTO_NoContractRule:
+						// BF: This is just a heuristic test. During forward translation,
+						// the
+						// nocontractsign is inserted either when in numeric mode and the
+						// next
+						// character is not numeric (CTC_Digit | CTC_LitDigit |
+						// CTC_NumericMode),
+						// or when a "contraction" rule is matched and the characters are
+						// preceded and followed by space or punctuation (CTC_Space |
+						// CTC_Punctuation).
+						if (!(beforeAttributes & CTC_Letter) &&
+								(afterAttributes & (CTC_Letter | CTC_Sign)))
+							return;
+						break;
+					case CTO_MultInd:
+						*doingMultind = *currentDotslen;
+						*multindRule = *currentRule;
+						if (handleMultind(table, currentDotslen, currentOpcode,
+									currentRule, doingMultind, *multindRule))
+							return;
+						break;
+					case CTO_LargeSign:
+						return;
+					case CTO_WholeWord:
+						if (mode & partialTrans) break;
+						if (itsALetter || itsANumber) break;
+					case CTO_Contraction:
+						if ((beforeAttributes & (CTC_Space | CTC_Punctuation)) &&
+								((afterAttributes & CTC_Space) ||
+										isEndWord(table, src, srcmax, mode, currentInput,
+												*currentDotslen)))
+							return;
+						break;
+					case CTO_LowWord:
+						if (mode & partialTrans) break;
+						if ((beforeAttributes & CTC_Space) &&
+								(afterAttributes & CTC_Space) &&
+								(previousOpcode != CTO_JoinableWord))
+							return;
+						break;
+					case CTO_JoinNum:
+					case CTO_JoinableWord:
+						if ((beforeAttributes & (CTC_Space | CTC_Punctuation)) &&
+								(!(afterAttributes & CTC_Space) || mode & partialTrans))
+							return;
+						break;
+					case CTO_SuffixableWord:
+						if (beforeAttributes & (CTC_Space | CTC_Punctuation)) return;
+						break;
+					case CTO_PrefixableWord:
+						if ((beforeAttributes &
+									(CTC_Space | CTC_Letter | CTC_Punctuation)) &&
+								isEndWord(table, src, srcmax, mode, currentInput,
+										*currentDotslen))
+							return;
+						break;
+					case CTO_BegWord:
+						if ((beforeAttributes & (CTC_Space | CTC_Punctuation)) &&
+								(!isEndWord(table, src, srcmax, mode, currentInput,
+										*currentDotslen)))
+							return;
+						break;
+					case CTO_BegMidWord:
+						if ((beforeAttributes &
+									(CTC_Letter | CTC_Space | CTC_Punctuation)) &&
+								(!isEndWord(table, src, srcmax, mode, currentInput,
+										*currentDotslen)))
+							return;
+						break;
+					case CTO_PartWord:
+						if (!(beforeAttributes & CTC_LitDigit) &&
+								(beforeAttributes & CTC_Letter ||
+										!isEndWord(table, src, srcmax, mode, currentInput,
+												*currentDotslen)))
+							return;
+						break;
+					case CTO_MidWord:
+						if (beforeAttributes & CTC_Letter &&
+								!isEndWord(table, src, srcmax, mode, currentInput,
+										*currentDotslen))
+							return;
+						break;
+					case CTO_MidEndWord:
+						if ((beforeAttributes & CTC_Letter)) return;
+						break;
+					case CTO_EndWord:
+						if ((beforeAttributes & CTC_Letter) &&
+								isEndWord(table, src, srcmax, mode, currentInput,
+										*currentDotslen))
+							return;
+						break;
+					case CTO_BegNum:
+						if (beforeAttributes & (CTC_Space | CTC_Punctuation) &&
+								(afterAttributes & (CTC_LitDigit | CTC_Sign)))
+							return;
+						break;
+					case CTO_MidNum:
+						if (beforeAttributes & CTC_Digit &&
+								afterAttributes & CTC_LitDigit)
+							return;
+						break;
+					case CTO_EndNum:
+						if (itsANumber && !(afterAttributes & CTC_LitDigit)) return;
+						break;
+					case CTO_DecPoint:
+						if (afterAttributes & (CTC_Digit | CTC_LitDigit)) return;
+						break;
+					case CTO_PrePunc:
+						if (isBegWord(table, dest, currentOutput)) return;
+						break;
+
+					case CTO_PostPunc:
+						if (isEndWord(table, src, srcmax, mode, currentInput,
+									*currentDotslen))
+							return;
+						break;
+					case CTO_Always:
+						if ((beforeAttributes & CTC_LitDigit) &&
+								(afterAttributes & CTC_LitDigit) &&
+								(*currentRule)->charslen > 1)
+							break;
+						return;
+
+					case CTO_BackMatch: {
+						widechar *patterns, *pattern;
+
+						// if(dontContract || (mode & noContractions))
+						//	break;
+						// if(checkEmphasisChange(0))
+						//	break;
+
+						patterns = (widechar *)&table->ruleArea[(*currentRule)->patterns];
+
+						/* check before pattern */
+						pattern = &patterns[1];
+						if (!_lou_pattern_check(
+									currentInput, src - 1, -1, -1, pattern, table))
+							break;
+
+						/* check after pattern */
+						pattern = &patterns[patterns[0]];
+						if (!_lou_pattern_check(currentInput,
+									src + (*currentRule)->dotslen, srcmax, 1, pattern,
+									table))
+							break;
+
+						return;
+					}
+					default:
+						break;
+					}
+				}
+			} /* Done with checking this rule */
+			ruleOffset = (*currentRule)->dotsnext;
+		}
+	}
+}
+
+static int
+putchars(const widechar *chars, int count, const TranslationTableHeader *table, int *dest,
+		int destmax, widechar *currentOutput, int *nextUpper, int allUpper,
+		int allUpperPhrase) {
+	int k = 0;
+	if (!count || (*dest + count) > destmax) return 0;
+	if (*nextUpper) {
+		currentOutput[(*dest)++] = (back_findCharOrDots(chars[k++], 0, table))->uppercase;
+		*nextUpper = 0;
+	}
+	if (!allUpper && !allUpperPhrase) {
+		memcpy(&currentOutput[*dest], &chars[k], CHARSIZE * (count - k));
+		*dest += count - k;
+	} else
+		for (; k < count; k++)
+			currentOutput[(*dest)++] =
+					(back_findCharOrDots(chars[k], 0, table))->uppercase;
+	return 1;
+}
+
+static int
+back_updatePositions(const widechar *outChars, int inLength, int outLength,
+		const TranslationTableHeader *table, int src, int srcmax, int *dest, int destmax,
+		widechar *currentOutput, int *srcMapping, int *outputPositions,
+		int *inputPositions, int *cursorPosition, int *cursorStatus, int *nextUpper,
+		int allUpper, int allUpperPhrase) {
+	int k;
+	if ((*dest + outLength) > destmax || (src + inLength) > srcmax) return 0;
+	if (!*cursorStatus && *cursorPosition >= src && *cursorPosition < (src + inLength)) {
+		*cursorPosition = *dest + outLength / 2;
+		*cursorStatus = 1;
+	}
+	if (inputPositions != NULL || outputPositions != NULL) {
+		if (outLength <= inLength) {
+			for (k = 0; k < outLength; k++) {
+				if (inputPositions != NULL)
+					inputPositions[*dest + k] = srcMapping[src + k];
+				if (outputPositions != NULL)
+					outputPositions[srcMapping[src + k]] = *dest + k;
+			}
+			for (k = outLength; k < inLength; k++)
+				if (outputPositions != NULL)
+					outputPositions[srcMapping[src + k]] = *dest + outLength - 1;
+		} else {
+			for (k = 0; k < inLength; k++) {
+				if (inputPositions != NULL)
+					inputPositions[*dest + k] = srcMapping[src + k];
+				if (outputPositions != NULL)
+					outputPositions[srcMapping[src + k]] = *dest + k;
+			}
+			for (k = inLength; k < outLength; k++)
+				if (inputPositions != NULL)
+					inputPositions[*dest + k] = srcMapping[src + inLength - 1];
+		}
+	}
+	return putchars(outChars, outLength, table, dest, destmax, currentOutput, nextUpper,
+			allUpper, allUpperPhrase);
+}
+
+static int
+undefinedDots(widechar dots, int *dest, int destmax, int mode, widechar *currentOutput) {
+	if (mode & noUndefinedDots) return 1;
+	/* Print out dot numbers */
+	widechar buffer[20];
+	int k = 1;
+	buffer[0] = '\\';
+	if ((dots & B1)) buffer[k++] = '1';
+	if ((dots & B2)) buffer[k++] = '2';
+	if ((dots & B3)) buffer[k++] = '3';
+	if ((dots & B4)) buffer[k++] = '4';
+	if ((dots & B5)) buffer[k++] = '5';
+	if ((dots & B6)) buffer[k++] = '6';
+	if ((dots & B7)) buffer[k++] = '7';
+	if ((dots & B8)) buffer[k++] = '8';
+	if ((dots & B9)) buffer[k++] = '9';
+	if ((dots & B10)) buffer[k++] = 'A';
+	if ((dots & B11)) buffer[k++] = 'B';
+	if ((dots & B12)) buffer[k++] = 'C';
+	if ((dots & B13)) buffer[k++] = 'D';
+	if ((dots & B14)) buffer[k++] = 'E';
+	if ((dots & B15)) buffer[k++] = 'F';
+	buffer[k++] = '/';
+	if ((*dest + k) > destmax) return 0;
+	memcpy(&currentOutput[*dest], buffer, k * CHARSIZE);
+	*dest += k;
+	return 1;
+}
+
+static int
+putCharacter(widechar dots, const TranslationTableHeader *table, int src, int srcmax,
+		int *dest, int destmax, int mode, widechar *currentOutput, int *srcMapping,
+		int *outputPositions, int *inputPositions, int *cursorPosition, int *cursorStatus,
+		int *nextUpper, int allUpper, int allUpperPhrase) {
+	/* Output character(s) corresponding to a Unicode braille Character */
+	TranslationTableOffset offset = (back_findCharOrDots(dots, 1, table))->definitionRule;
+	if (offset) {
+		widechar c;
+		const TranslationTableRule *rule =
+				(TranslationTableRule *)&table->ruleArea[offset];
+		if (rule->charslen)
+			return back_updatePositions(&rule->charsdots[0], rule->dotslen,
+					rule->charslen, table, src, srcmax, dest, destmax, currentOutput,
+					srcMapping, outputPositions, inputPositions, cursorPosition,
+					cursorStatus, nextUpper, allUpper, allUpperPhrase);
+		c = _lou_getCharFromDots(dots);
+		return back_updatePositions(&c, 1, 1, table, src, srcmax, dest, destmax,
+				currentOutput, srcMapping, outputPositions, inputPositions,
+				cursorPosition, cursorStatus, nextUpper, allUpper, allUpperPhrase);
+	}
+	return undefinedDots(dots, dest, destmax, mode, currentOutput);
+}
+
+static int
+putCharacters(const widechar *characters, int count, const TranslationTableHeader *table,
+		int src, int srcmax, int *dest, int destmax, int mode, widechar *currentOutput,
+		int *srcMapping, int *outputPositions, int *inputPositions, int *cursorPosition,
+		int *cursorStatus, int *nextUpper, int allUpper, int allUpperPhrase) {
+	int k;
+	for (k = 0; k < count; k++)
+		if (!putCharacter(characters[k], table, src, srcmax, dest, destmax, mode,
+					currentOutput, srcMapping, outputPositions, inputPositions,
+					cursorPosition, cursorStatus, nextUpper, allUpper, allUpperPhrase))
+			return 0;
+	return 1;
+}
+
+static int
+insertSpace(const TranslationTableHeader *table, int src, int srcmax, int *dest,
+		int destmax, widechar *currentOutput, char *spacebuf, int *srcMapping,
+		int *outputPositions, int *inputPositions, int *cursorPosition, int *cursorStatus,
+		int *nextUpper, int allUpper, int allUpperPhrase) {
+	widechar c = ' ';
+	if (!back_updatePositions(&c, 1, 1, table, src, srcmax, dest, destmax, currentOutput,
+				srcMapping, outputPositions, inputPositions, cursorPosition, cursorStatus,
+				nextUpper, allUpper, allUpperPhrase))
+		return 0;
+	if (spacebuf) spacebuf[*dest - 1] = '1';
+	return 1;
+}
+
+static int
+compareChars(const widechar *address1, const widechar *address2, int count, int m,
+		const TranslationTableHeader *table) {
+	int k;
+	if (!count) return 0;
+	for (k = 0; k < count; k++)
+		if ((back_findCharOrDots(address1[k], m, table))->lowercase !=
+				(back_findCharOrDots(address2[k], m, table))->lowercase)
+			return 0;
+	return 1;
+}
+
+static int
+makeCorrections(const TranslationTableHeader *table, int *src, int srcmax, int *dest,
+		int destmax, int mode, int currentPass, const widechar *currentInput,
+		widechar *currentOutput, int *srcMapping, int *outputPositions,
+		int *inputPositions, int *cursorPosition, int *cursorStatus,
+		const TranslationTableRule **appliedRules, int *appliedRulesCount,
+		int maxAppliedRules) {
+	int nextUpper = 0;
+	int allUpper = 0;
+	int allUpperPhrase = 0;
+	if (!table->corrections) return 1;
+	*src = 0;
+	*dest = 0;
+	_lou_resetPassVariables();
+	while (*src < srcmax) {
+		TranslationTableOpcode currentOpcode;
+		const TranslationTableRule *currentRule; /* pointer to current rule in table */
+		int passSrc;
+		const widechar *passInstructions;
+		int passIC; /* Instruction counter */
+		int startMatch;
+		int startReplace;
+		int endReplace;
+		int length = srcmax - *src;
+		const TranslationTableCharacter *character =
+				back_findCharOrDots(currentInput[*src], 0, table);
+		const TranslationTableCharacter *character2;
+		int tryThis = 0;
+		if (!findBackPassRule(table, *src, srcmax, currentPass, currentInput,
+					&currentOpcode, &currentRule, &passSrc, &passInstructions, &passIC,
+					&startMatch, &startReplace, &endReplace))
+			while (tryThis < 3) {
+				TranslationTableOffset ruleOffset = 0;
+				unsigned long int makeHash = 0;
+				switch (tryThis) {
+				case 0:
+					if (!(length >= 2)) break;
+					makeHash = (unsigned long int)character->lowercase << 8;
+					character2 = back_findCharOrDots(currentInput[*src + 1], 0, table);
+					makeHash += (unsigned long int)character2->lowercase;
+					makeHash %= HASHNUM;
+					ruleOffset = table->forRules[makeHash];
+					break;
+				case 1:
+					if (!(length >= 1)) break;
+					length = 1;
+					ruleOffset = character->otherRules;
+					break;
+				case 2: /* No rule found */
+					currentOpcode = CTO_Always;
+					ruleOffset = 0;
+					break;
+				}
+				while (ruleOffset) {
+					currentRule = (TranslationTableRule *)&table->ruleArea[ruleOffset];
+					currentOpcode = currentRule->opcode;
+					int currentCharslen = currentRule->charslen;
+					if (tryThis == 1 || (currentCharslen <= length &&
+												compareChars(&currentRule->charsdots[0],
+														&currentInput[*src],
+														currentCharslen, 0, table))) {
+						if (currentOpcode == CTO_Correct &&
+								back_passDoTest(table, *src, srcmax, currentInput,
+										currentOpcode, currentRule, &passSrc,
+										&passInstructions, &passIC, &startMatch,
+										&startReplace, &endReplace)) {
+							tryThis = 4;
+							break;
+						}
+					}
+					ruleOffset = currentRule->dotsnext;
+				}
+				tryThis++;
+			}
+		switch (currentOpcode) {
+		case CTO_Always:
+			if (*dest >= destmax) goto failure;
+			srcMapping[*dest] = srcMapping[*src];
+			currentOutput[(*dest)++] = currentInput[(*src)++];
+			break;
+		case CTO_Correct:
+			if (appliedRules != NULL && *appliedRulesCount < maxAppliedRules)
+				appliedRules[(*appliedRulesCount)++] = currentRule;
+			if (!back_passDoAction(table, *src, srcmax, dest, destmax, mode, currentInput,
+						currentOutput, srcMapping, outputPositions, inputPositions,
+						cursorPosition, cursorStatus, &nextUpper, allUpper,
+						allUpperPhrase, currentOpcode, currentRule, passSrc,
+						passInstructions, passIC, startMatch, startReplace, &endReplace))
+				goto failure;
+			*src = endReplace;
+			break;
+		default:
+			break;
+		}
+	}
+failure:
+	return 1;
+}
+
+static int
+backTranslateString(const TranslationTableHeader *table, int *src, int srcmax, int *dest,
+		int destmax, int mode, int currentPass, const widechar *currentInput,
+		widechar *currentOutput, char *spacebuf, int *srcMapping, int *outputPositions,
+		int *inputPositions, int *cursorPosition, int *cursorStatus,
+		const TranslationTableRule **appliedRules, int *appliedRulesCount,
+		int maxAppliedRules) {
+	int nextUpper;
+	int allUpper;
+	int allUpperPhrase;
+	int itsANumber;
+	int itsALetter;
+	/* Back translation */
+	int srcword = 0;
+	int destword = 0; /* last word translated */
+	TranslationTableOpcode previousOpcode;
+	int doingMultind = 0;
+	const TranslationTableRule *multindRule;
+	_lou_resetPassVariables();
+	translation_direction = 0;
+	nextUpper = allUpper = allUpperPhrase = itsANumber = itsALetter = 0;
+	previousOpcode = CTO_None;
+	*src = *dest = 0;
+	while (*src < srcmax) {
+		/* the main translation loop */
+		int currentDotslen; /* length of current find string */
+		TranslationTableOpcode currentOpcode;
+		const TranslationTableRule *currentRule; /* pointer to current rule in table */
+		TranslationTableCharacterAttributes beforeAttributes;
+		int passSrc;
+		const widechar *passInstructions;
+		int passIC; /* Instruction counter */
+		int startMatch;
+		int startReplace;
+		int endReplace;
+		back_setBefore(table, *dest, currentOutput, &beforeAttributes);
+		back_selectRule(table, *src, srcmax, *dest, mode, currentInput, currentOutput,
+				itsANumber, itsALetter, &currentDotslen, &currentOpcode, &currentRule,
+				previousOpcode, &doingMultind, &multindRule, beforeAttributes, &passSrc,
+				&passInstructions, &passIC, &startMatch, &startReplace, &endReplace);
+		if (appliedRules != NULL && *appliedRulesCount < maxAppliedRules)
+			appliedRules[(*appliedRulesCount)++] = currentRule;
+		/* processing before replacement */
+		switch (currentOpcode) {
+		case CTO_Hyphen:
+			itsANumber = 0;
+			break;
+		case CTO_LargeSign:
+			if (previousOpcode == CTO_LargeSign)
+				if (!insertSpace(table, *src, srcmax, dest, destmax, currentOutput,
+							spacebuf, srcMapping, outputPositions, inputPositions,
+							cursorPosition, cursorStatus, &nextUpper, allUpper,
+							allUpperPhrase))
+					goto failure;
+			break;
+		case CTO_CapsLetterRule:
+			nextUpper = 1;
+			*src += currentDotslen;
+			continue;
+			break;
+		case CTO_BegCapsWordRule:
+			allUpper = 1;
+			*src += currentDotslen;
+			continue;
+			break;
+		case CTO_BegCapsRule:
+			allUpperPhrase = 1;
+			*src += currentDotslen;
+			continue;
+			break;
+		case CTO_EndCapsWordRule:
+			allUpper = 0;
+			*src += currentDotslen;
+			continue;
+			break;
+		case CTO_EndCapsRule:
+			allUpperPhrase = 0;
+			*src += currentDotslen;
+			continue;
+			break;
+		case CTO_LetterRule:
+		case CTO_NoContractRule:
+			itsALetter = 1;
+			itsANumber = 0;
+			*src += currentDotslen;
+			continue;
+			break;
+		case CTO_NumberRule:
+			itsANumber = 1;
+			*src += currentDotslen;
+			continue;
+			break;
+		case CTO_BegEmph1Rule:
+			*src += currentDotslen;
+			continue;
+			break;
+		case CTO_BegEmph2Rule:
+			*src += currentDotslen;
+			continue;
+			break;
+		case CTO_BegEmph3Rule:
+			*src += currentDotslen;
+			continue;
+			break;
+		case CTO_EndEmph1Rule:
+		case CTO_EndEmph2Rule:
+		case CTO_EndEmph3Rule:
+			*src += currentDotslen;
+			continue;
+			break;
+		case CTO_BegCompRule:
+			*src += currentDotslen;
+			continue;
+			break;
+		case CTO_EndCompRule:
+			*src += currentDotslen;
+			continue;
+			break;
+
+		default:
+			break;
+		}
+
+		/* replacement processing */
+		switch (currentOpcode) {
+		case CTO_Context:
+			if (!back_passDoAction(table, *src, srcmax, dest, destmax, mode, currentInput,
+						currentOutput, srcMapping, outputPositions, inputPositions,
+						cursorPosition, cursorStatus, &nextUpper, allUpper,
+						allUpperPhrase, currentOpcode, currentRule, passSrc,
+						passInstructions, passIC, startMatch, startReplace, &endReplace))
+				return 0;
+			*src = endReplace;
+			break;
+		case CTO_Replace:
+			*src += currentDotslen;
+			if (!putCharacters(&currentRule->charsdots[0], currentRule->charslen, table,
+						*src, srcmax, dest, destmax, mode, currentOutput, srcMapping,
+						outputPositions, inputPositions, cursorPosition, cursorStatus,
+						&nextUpper, allUpper, allUpperPhrase))
+				goto failure;
+			break;
+		case CTO_None:
+			if (!undefinedDots(currentInput[*src], dest, destmax, mode, currentOutput))
+				goto failure;
+			(*src)++;
+			break;
+		case CTO_BegNum:
+			itsANumber = 1;
+			goto insertChars;
+		case CTO_EndNum:
+			itsANumber = 0;
+			goto insertChars;
+		case CTO_Space:
+			itsALetter = itsANumber = allUpper = nextUpper = 0;
+			goto insertChars;
+		default:
+		insertChars:
+			if (currentRule->charslen) {
+				if (!back_updatePositions(&currentRule->charsdots[0],
+							currentRule->dotslen, currentRule->charslen, table, *src,
+							srcmax, dest, destmax, currentOutput, srcMapping,
+							outputPositions, inputPositions, cursorPosition, cursorStatus,
+							&nextUpper, allUpper, allUpperPhrase))
+					goto failure;
+				*src += currentDotslen;
+			} else {
+				int srclim = *src + currentDotslen;
+				while (1) {
+					if (!putCharacter(currentInput[*src], table, *src, srcmax, dest,
+								destmax, mode, currentOutput, srcMapping, outputPositions,
+								inputPositions, cursorPosition, cursorStatus, &nextUpper,
+								allUpper, allUpperPhrase))
+						goto failure;
+					if (++(*src) == srclim) break;
+				}
+			}
+		}
+
+		/* processing after replacement */
+		switch (currentOpcode) {
+		case CTO_JoinNum:
+		case CTO_JoinableWord:
+			if (!insertSpace(table, *src, srcmax, dest, destmax, currentOutput, spacebuf,
+						srcMapping, outputPositions, inputPositions, cursorPosition,
+						cursorStatus, &nextUpper, allUpper, allUpperPhrase))
+				goto failure;
+			break;
+		default:
+			passSelectRule(table, *src, srcmax, currentPass, currentInput, &currentOpcode,
+					&currentRule, &passSrc, &passInstructions, &passIC, &startMatch,
+					&startReplace, &endReplace);
+			if (currentOpcode == CTO_Context) {
+				back_passDoAction(table, *src, srcmax, dest, destmax, mode, currentInput,
+						currentOutput, srcMapping, outputPositions, inputPositions,
+						cursorPosition, cursorStatus, &nextUpper, allUpper,
+						allUpperPhrase, currentOpcode, currentRule, passSrc,
+						passInstructions, passIC, startMatch, startReplace, &endReplace);
+				*src = endReplace;
+			}
+			break;
+		}
+		if (((*src > 0) && checkAttr(currentInput[*src - 1], CTC_Space, 1, table) &&
+					(currentOpcode != CTO_JoinableWord))) {
+			srcword = *src;
+			destword = *dest;
+		}
+		if ((currentOpcode >= CTO_Always && currentOpcode <= CTO_None) ||
+				(currentOpcode >= CTO_Digit && currentOpcode <= CTO_LitDigit))
+			previousOpcode = currentOpcode;
+	} /* end of translation loop */
+failure:
+
+	if (destword != 0 && *src < srcmax &&
+			!checkAttr(currentInput[*src], CTC_Space, 1, table)) {
+		*src = srcword;
+		*dest = destword;
+	}
+	if (*src < srcmax) {
+		while (checkAttr(currentInput[*src], CTC_Space, 1, table))
+			if (++(*src) == srcmax) break;
+	}
+	return 1;
+} /* translation completed */
+
+/* Multipass translation */
+
+static int
+matchcurrentInput(const widechar *currentInput, int passSrc,
+		const widechar *passInstructions, int passIC) {
+	int k;
+	int kk = passSrc;
+	for (k = passIC + 2; k < passIC + 2 + passInstructions[passIC + 1]; k++)
+		if (passInstructions[k] != currentInput[kk++]) return 0;
+	return 1;
+}
+
+static int
+back_swapTest(const TranslationTableHeader *table, const widechar *currentInput,
+		int *passSrc, const widechar *passInstructions, int passIC) {
+	int curLen;
+	int curTest;
+	int curSrc = *passSrc;
+	TranslationTableOffset swapRuleOffset;
+	TranslationTableRule *swapRule;
+	swapRuleOffset = (passInstructions[passIC + 1] << 16) | passInstructions[passIC + 2];
+	swapRule = (TranslationTableRule *)&table->ruleArea[swapRuleOffset];
+	for (curLen = 0; curLen < passInstructions[passIC] + 3; curLen++) {
+		for (curTest = 0; curTest < swapRule->charslen; curTest++) {
+			if (currentInput[curSrc] == swapRule->charsdots[curTest]) break;
+		}
+		if (curTest == swapRule->charslen) return 0;
+		curSrc++;
+	}
+	if (passInstructions[passIC + 2] == passInstructions[passIC + 3]) {
+		*passSrc = curSrc;
+		return 1;
+	}
+	while (curLen < passInstructions[passIC + 4]) {
+		for (curTest = 0; curTest < swapRule->charslen; curTest++) {
+			if (currentInput[curSrc] != swapRule->charsdots[curTest]) break;
+		}
+		if (curTest < swapRule->charslen)
+			if (curTest < swapRule->charslen) {
+				*passSrc = curSrc;
+				return 1;
+			}
+		curSrc++;
+		curLen++;
+	}
+	*passSrc = curSrc;
+	return 1;
+}
+
+static int
+back_swapReplace(int startSrc, int maxLen, const TranslationTableHeader *table, int *dest,
+		int destmax, const widechar *currentInput, widechar *currentOutput,
+		int *srcMapping, const widechar *passInstructions, int passIC) {
+	TranslationTableOffset swapRuleOffset;
+	TranslationTableRule *swapRule;
+	widechar *replacements;
+	int curRep;
+	int curPos;
+	int lastPos = 0;
+	int lastRep = 0;
+	int curTest;
+	int curSrc = startSrc;
+	swapRuleOffset = (passInstructions[passIC + 1] << 16) | passInstructions[passIC + 2];
+	swapRule = (TranslationTableRule *)&table->ruleArea[swapRuleOffset];
+	replacements = &swapRule->charsdots[swapRule->charslen];
+	while (curSrc < maxLen) {
+		for (curTest = 0; curTest < swapRule->charslen; curTest++) {
+			if (currentInput[curSrc] == swapRule->charsdots[curTest]) break;
+		}
+		if (curTest == swapRule->charslen) return curSrc;
+		if (curTest >= lastRep) {
+			curPos = lastPos;
+			curRep = lastRep;
+		} else {
+			curPos = 0;
+			curRep = 0;
+		}
+		while (curPos < swapRule->dotslen) {
+			if (curRep == curTest) {
+				int k;
+				if ((*dest + replacements[curPos] - 1) >= destmax) return 0;
+				for (k = *dest + replacements[curPos] - 2; k >= *dest; --k)
+					srcMapping[k] = srcMapping[curSrc];
+				memcpy(&currentOutput[*dest], &replacements[curPos + 1],
+						(replacements[curPos] - 1) * CHARSIZE);
+				*dest += replacements[curPos] - 1;
+				lastPos = curPos;
+				lastRep = curRep;
+				break;
+			}
+			curRep++;
+			curPos += replacements[curPos];
+		}
+		curSrc++;
+	}
+	return curSrc;
+}
+
+static int
+back_passDoTest(const TranslationTableHeader *table, int src, int srcmax,
+		const widechar *currentInput, TranslationTableOpcode currentOpcode,
+		const TranslationTableRule *currentRule, int *passSrc,
+		const widechar **passInstructions, int *passIC, int *startMatch,
+		int *startReplace, int *endReplace) {
+	int k;
+	int m;
+	int not = 0;
+	TranslationTableCharacterAttributes attributes;
+	*passSrc = src;
+	*passInstructions = &currentRule->charsdots[currentRule->charslen];
+	*passIC = 0;
+	*startMatch = *passSrc;
+	*startReplace = -1;
+	if (currentOpcode == CTO_Correct)
+		m = 0;
+	else
+		m = 1;
+	while (*passIC < currentRule->dotslen) {
+		int itsTrue = 1;
+		if (*passSrc > srcmax) return 0;
+		switch ((*passInstructions)[*passIC]) {
+		case pass_first:
+			if (*passSrc != 0) itsTrue = 0;
+			(*passIC)++;
+			break;
+		case pass_last:
+			if (*passSrc != srcmax) itsTrue = 0;
+			(*passIC)++;
+			break;
+		case pass_lookback:
+			*passSrc -= (*passInstructions)[*passIC + 1];
+			if (*passSrc < 0) {
+				*passSrc = 0;
+				itsTrue = 0;
+			}
+			*passIC += 2;
+			break;
+		case pass_not:
+			not = !not;
+			(*passIC)++;
+			continue;
+		case pass_string:
+		case pass_dots:
+			itsTrue =
+					matchcurrentInput(currentInput, *passSrc, *passInstructions, *passIC);
+			*passSrc += (*passInstructions)[*passIC + 1];
+			*passIC += (*passInstructions)[*passIC + 1] + 2;
+			break;
+		case pass_startReplace:
+			*startReplace = *passSrc;
+			(*passIC)++;
+			break;
+		case pass_endReplace:
+			*endReplace = *passSrc;
+			(*passIC)++;
+			break;
+		case pass_attributes:
+			attributes = ((*passInstructions)[*passIC + 1] << 16) |
+					(*passInstructions)[*passIC + 2];
+			for (k = 0; k < (*passInstructions)[*passIC + 3]; k++) {
+				if (*passSrc >= srcmax) {
+					itsTrue = 0;
+					break;
+				}
+				if (!(back_findCharOrDots(currentInput[*passSrc], m, table)->attributes &
+							attributes)) {
+					itsTrue = 0;
+					break;
+				}
+				(*passSrc)++;
+			}
+			if (itsTrue) {
+				for (k = (*passInstructions)[*passIC + 3];
+						k < (*passInstructions)[*passIC + 4] && *passSrc < srcmax; k++) {
+					if (!(back_findCharOrDots(currentInput[*passSrc], m,
+								  table)->attributes &
+								attributes))
+						break;
+					(*passSrc)++;
+				}
+			}
+			*passIC += 5;
+			break;
+		case pass_swap:
+			itsTrue = back_swapTest(
+					table, currentInput, passSrc, *passInstructions, *passIC);
+			*passIC += 5;
+			break;
+		case pass_endTest: {
+			int endMatch;
+			(*passIC)++;
+			endMatch = *passSrc;
+			if (*startReplace == -1) {
+				*startReplace = *startMatch;
+				*endReplace = endMatch;
+			}
+			return 1;
+			break;
+		}
+		default:
+			if (_lou_handlePassVariableTest(*passInstructions, passIC, &itsTrue)) break;
+			return 0;
+		}
+		if ((!not&&!itsTrue) || (not&&itsTrue)) return 0;
+		not = 0;
+	}
+	return 1;
+}
+
+static int
+copyCharacters(int from, int to, const TranslationTableHeader *table, int src, int srcmax,
+		int *dest, int destmax, int mode, const widechar *currentInput,
+		widechar *currentOutput, int *srcMapping, int *outputPositions,
+		int *inputPositions, int *cursorPosition, int *cursorStatus, int *nextUpper,
+		int allUpper, int allUpperPhrase, TranslationTableOpcode currentOpcode) {
+	if (currentOpcode == CTO_Context) {
+		while (from < to)
+			if (!putCharacter(currentInput[from++], table, src, srcmax, dest, destmax,
+						mode, currentOutput, srcMapping, outputPositions, inputPositions,
+						cursorPosition, cursorStatus, nextUpper, allUpper,
+						allUpperPhrase))
+				return 0;
+	} else {
+		int count = to - from;
+
+		if (count > 0) {
+			if ((*dest + count) > destmax) return 0;
+
+			memmove(&srcMapping[*dest], &srcMapping[from], count * sizeof(*srcMapping));
+			memcpy(&currentOutput[*dest], &currentInput[from],
+					count * sizeof(*currentOutput));
+			*dest += count;
+		}
+	}
+
+	return 1;
+}
+
+static int
+back_passDoAction(const TranslationTableHeader *table, int src, int srcmax, int *dest,
+		int destmax, int mode, const widechar *currentInput, widechar *currentOutput,
+		int *srcMapping, int *outputPositions, int *inputPositions, int *cursorPosition,
+		int *cursorStatus, int *nextUpper, int allUpper, int allUpperPhrase,
+		TranslationTableOpcode currentOpcode, const TranslationTableRule *currentRule,
+		int passSrc, const widechar *passInstructions, int passIC, int startMatch,
+		int startReplace, int *endReplace) {
+	int k;
+
+	int srcInitial = startMatch;
+	int srcStart = startReplace;
+	int srcEnd = *endReplace;
+	int destInitial = *dest;
+	int destStart;
+
+	if (!copyCharacters(srcInitial, srcStart, table, src, srcmax, dest, destmax, mode,
+				currentInput, currentOutput, srcMapping, outputPositions, inputPositions,
+				cursorPosition, cursorStatus, nextUpper, allUpper, allUpperPhrase,
+				currentOpcode))
+		return 0;
+	destStart = *dest;
+
+	while (passIC < currentRule->dotslen) switch (passInstructions[passIC]) {
+		case pass_string:
+		case pass_dots:
+			if ((*dest + passInstructions[passIC + 1]) > destmax) return 0;
+			for (k = 0; k < passInstructions[passIC + 1]; ++k)
+				srcMapping[*dest + k] = startMatch;
+			memcpy(&currentOutput[*dest], &passInstructions[passIC + 2],
+					passInstructions[passIC + 1] * sizeof(*currentOutput));
+			*dest += passInstructions[passIC + 1];
+			passIC += passInstructions[passIC + 1] + 2;
+			break;
+		case pass_swap:
+			if (!back_swapReplace(startReplace, *endReplace - startReplace, table, dest,
+						destmax, currentInput, currentOutput, srcMapping,
+						passInstructions, passIC))
+				return 0;
+			passIC += 3;
+			break;
+		case pass_omit:
+			passIC++;
+			break;
+		case pass_copy: {
+			int count = destStart - destInitial;
+
+			if (count > 0) {
+				memmove(&currentOutput[destInitial], &currentOutput[destStart],
+						count * sizeof(*currentOutput));
+				*dest -= count;
+				destStart = destInitial;
+			}
+		}
+
+			if (!copyCharacters(srcStart, srcEnd, table, src, srcmax, dest, destmax, mode,
+						currentInput, currentOutput, srcMapping, outputPositions,
+						inputPositions, cursorPosition, cursorStatus, nextUpper, allUpper,
+						allUpperPhrase, currentOpcode))
+				return 0;
+			*endReplace = passSrc;
+			passIC++;
+			break;
+		default:
+			if (_lou_handlePassVariableAction(passInstructions, &passIC)) break;
+			return 0;
+		}
+	return 1;
+}
+
+static void
+passSelectRule(const TranslationTableHeader *table, int src, int srcmax, int currentPass,
+		const widechar *currentInput, TranslationTableOpcode *currentOpcode,
+		const TranslationTableRule **currentRule, int *passSrc,
+		const widechar **passInstructions, int *passIC, int *startMatch,
+		int *startReplace, int *endReplace) {
+	if (!findBackPassRule(table, src, srcmax, currentPass, currentInput, currentOpcode,
+				currentRule, passSrc, passInstructions, passIC, startMatch, startReplace,
+				endReplace)) {
+		*currentOpcode = CTO_Always;
+	}
+}
+
+static int
+translatePass(const TranslationTableHeader *table, int *src, int srcmax, int *dest,
+		int destmax, int mode, int currentPass, const widechar *currentInput,
+		widechar *currentOutput, int *srcMapping, int *outputPositions,
+		int *inputPositions, int *cursorPosition, int *cursorStatus,
+		const TranslationTableRule **appliedRules, int *appliedRulesCount,
+		int maxAppliedRules) {
+	int nextUpper = 0;
+	int allUpper = 0;
+	int allUpperPhrase = 0;
+	*src = *dest = 0;
+	_lou_resetPassVariables();
+	while (*src < srcmax) { /* the main multipass translation loop */
+		TranslationTableOpcode currentOpcode;
+		const TranslationTableRule *currentRule; /* pointer to current rule in table */
+		int passSrc;
+		const widechar *passInstructions;
+		int passIC; /* Instruction counter */
+		int startMatch;
+		int startReplace;
+		int endReplace;
+		passSelectRule(table, *src, srcmax, currentPass, currentInput, &currentOpcode,
+				&currentRule, &passSrc, &passInstructions, &passIC, &startMatch,
+				&startReplace, &endReplace);
+		switch (currentOpcode) {
+		case CTO_Pass2:
+		case CTO_Pass3:
+		case CTO_Pass4:
+			if (appliedRules != NULL && *appliedRulesCount < maxAppliedRules)
+				appliedRules[(*appliedRulesCount)++] = currentRule;
+			if (!back_passDoAction(table, *src, srcmax, dest, destmax, mode, currentInput,
+						currentOutput, srcMapping, outputPositions, inputPositions,
+						cursorPosition, cursorStatus, &nextUpper, allUpper,
+						allUpperPhrase, currentOpcode, currentRule, passSrc,
+						passInstructions, passIC, startMatch, startReplace, &endReplace))
+				goto failure;
+			*src = endReplace;
+			break;
+		case CTO_Always:
+			if ((*dest + 1) > destmax) goto failure;
+			srcMapping[*dest] = srcMapping[*src];
+			currentOutput[(*dest)++] = currentInput[(*src)++];
+			break;
+		default:
+			goto failure;
+		}
+	}
+	srcMapping[*dest] = srcMapping[*src];
+failure:
+	if (*src < srcmax) {
+		while (checkAttr(currentInput[*src], CTC_Space, 1, table))
+			if (++(*src) == srcmax) break;
+	}
+	return 1;
+}
diff --git a/liblouis/liblouis/lou_translateString.c b/liblouis/liblouis/lou_translateString.c
new file mode 100644
index 0000000..77a629a
--- /dev/null
+++ b/liblouis/liblouis/lou_translateString.c
@@ -0,0 +1,3793 @@
+/* liblouis Braille Translation and Back-Translation Library
+
+   Based on the Linux screenreader BRLTTY, copyright (C) 1999-2006 by The
+   BRLTTY Team
+
+   Copyright (C) 2004, 2005, 2006 ViewPlus Technologies, Inc. www.viewplus.com
+   Copyright (C) 2004, 2005, 2006 JJB Software, Inc. www.jjb-software.com
+   Copyright (C) 2016 Mike Gray, American Printing House for the Blind
+   Copyright (C) 2016 Davy Kager, Dedicon
+
+   This file is part of liblouis.
+
+   liblouis is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation, either version 2.1 of the License, or
+   (at your option) any later version.
+
+   liblouis is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file
+ * @brief Translate to braille
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "internal.h"
+
+/* additional bits in typebuf */
+#define SYLLABLE_MARKER_1 0x2000
+#define SYLLABLE_MARKER_2 0x4000
+#define CAPSEMPH 0x8000
+
+#define EMPHASIS 0x3fff  // all typeform bits that can be used
+
+/* bits for wordBuffer */
+#define WORD_CHAR 0x00000001
+#define WORD_RESET 0x00000002
+#define WORD_STOP 0x00000004
+#define WORD_WHOLE 0x00000008
+#define LAST_WORD_AFTER 0x01000000
+
+/* bits for emphasisBuffer */
+#define CAPS_BEGIN 0x00000010
+#define CAPS_END 0x00000020
+#define CAPS_WORD 0x00000040
+#define CAPS_SYMBOL 0x00000080
+#define CAPS_EMPHASIS 0x000000f0
+#define EMPHASIS_BEGIN 0x00000100
+#define EMPHASIS_END 0x00000200
+#define EMPHASIS_WORD 0x00000400
+#define EMPHASIS_SYMBOL 0x00000800
+#define EMPHASIS_MASK 0x00000f00
+#define COMPBRL_BEGIN 0x10000000
+#define COMPBRL_END 0x20000000
+
+/* bits for transNoteBuffer */
+#define TRANSNOTE_BEGIN 0x00000001
+#define TRANSNOTE_END 0x00000002
+#define TRANSNOTE_WORD 0x00000004
+#define TRANSNOTE_SYMBOL 0x00000008
+#define TRANSNOTE_MASK 0x0000000f
+
+typedef struct {
+	const widechar *chars;
+	int length;
+} InString;
+
+typedef struct {
+	widechar *chars;
+	int maxlength;
+	int length;
+} OutString;
+
+static int
+putCharacter(widechar c, const TranslationTableHeader *table, int *pos, int mode,
+		InString input, OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, const TranslationTableRule **transRule,
+		int *cursorPosition, int *cursorStatus, int compbrlStart, int compbrlEnd);
+static int
+passDoTest(const TranslationTableHeader *table, int pos, InString input, int transOpcode,
+		const TranslationTableRule *transRule, int *passCharDots,
+		const widechar **passInstructions, int *passIC, int *startMatch,
+		int *startReplace, int *endReplace, int *endMatch,
+		TranslationTableRule **groupingRule, widechar *groupingOp);
+static int
+passDoAction(const TranslationTableHeader *table, int *pos, int mode, InString *input,
+		OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, int transOpcode,
+		const TranslationTableRule **transRule, int passCharDots,
+		const widechar *passInstructions, int *passIC, int startMatch, int startReplace,
+		int *endReplace, int endMatch, int *cursorPosition, int *cursorStatus,
+		int compbrlStart, int compbrlEnd, TranslationTableRule *groupingRule,
+		widechar groupingOp);
+
+static const TranslationTableRule **appliedRules;
+static int maxAppliedRules;
+static int appliedRulesCount;
+
+static TranslationTableCharacter *
+findCharOrDots(widechar c, int m, const TranslationTableHeader *table) {
+	/* Look up character or dot pattern in the appropriate
+	 * table. */
+	static TranslationTableCharacter noChar = { 0, 0, 0, CTC_Space, 32, 32, 32 };
+	static TranslationTableCharacter noDots = { 0, 0, 0, CTC_Space, B16, B16, B16 };
+	TranslationTableCharacter *notFound;
+	TranslationTableCharacter *character;
+	TranslationTableOffset bucket;
+	unsigned long int makeHash = (unsigned long int)c % HASHNUM;
+	if (m == 0) {
+		bucket = table->characters[makeHash];
+		notFound = &noChar;
+	} else {
+		bucket = table->dots[makeHash];
+		notFound = &noDots;
+	}
+	while (bucket) {
+		character = (TranslationTableCharacter *)&table->ruleArea[bucket];
+		if (character->realchar == c) return character;
+		bucket = character->next;
+	}
+	notFound->realchar = notFound->uppercase = notFound->lowercase = c;
+	return notFound;
+}
+
+static int
+checkAttr(const widechar c, const TranslationTableCharacterAttributes a, int m,
+		const TranslationTableHeader *table) {
+	static widechar prevc = 0;
+	static TranslationTableCharacterAttributes preva = 0;
+	if (c != prevc) {
+		preva = (findCharOrDots(c, m, table))->attributes;
+		prevc = c;
+	}
+	return ((preva & a) ? 1 : 0);
+}
+
+static int
+checkAttr_safe(InString input, int pos, const TranslationTableCharacterAttributes a,
+		int m, const TranslationTableHeader *table) {
+	return ((pos < input.length) ? checkAttr(input.chars[pos], a, m, table) : 0);
+}
+
+static int
+findForPassRule(const TranslationTableHeader *table, int pos, int currentPass,
+		InString input, int *transOpcode, const TranslationTableRule **transRule,
+		int *transCharslen, int *passCharDots, widechar const **passInstructions,
+		int *passIC, int *startMatch, int *startReplace, int *endReplace, int *endMatch,
+		TranslationTableRule **groupingRule, widechar *groupingOp) {
+	int save_transCharslen = *transCharslen;
+	const TranslationTableRule *save_transRule = *transRule;
+	TranslationTableOpcode save_transOpcode = *transOpcode;
+	TranslationTableOffset ruleOffset;
+	ruleOffset = table->forPassRules[currentPass];
+	*transCharslen = 0;
+	while (ruleOffset) {
+		*transRule = (TranslationTableRule *)&table->ruleArea[ruleOffset];
+		*transOpcode = (*transRule)->opcode;
+		if (passDoTest(table, pos, input, *transOpcode, *transRule, passCharDots,
+					passInstructions, passIC, startMatch, startReplace, endReplace,
+					endMatch, groupingRule, groupingOp))
+			return 1;
+		ruleOffset = (*transRule)->charsnext;
+	}
+	*transCharslen = save_transCharslen;
+	*transRule = save_transRule;
+	*transOpcode = save_transOpcode;
+	return 0;
+}
+
+static int
+compareChars(const widechar *address1, const widechar *address2, int count, int m,
+		const TranslationTableHeader *table) {
+	int k;
+	if (!count) return 0;
+	for (k = 0; k < count; k++)
+		if ((findCharOrDots(address1[k], m, table))->lowercase !=
+				(findCharOrDots(address2[k], m, table))->lowercase)
+			return 0;
+	return 1;
+}
+
+static int
+makeCorrections(const TranslationTableHeader *table, int mode, InString *input,
+		OutString *output, int *posMapping, formtype *typebuf,
+		unsigned int *emphasisBuffer, unsigned int *transNoteBuffer, int *realInlen,
+		int *posIncremented, int *cursorPosition, int *cursorStatus, int compbrlStart,
+		int compbrlEnd) {
+	int pos;
+	int transOpcode;
+	const TranslationTableRule *transRule;
+	int transCharslen;
+	int passCharDots;
+	const widechar *passInstructions;
+	int passIC; /* Instruction counter */
+	int startMatch;
+	int startReplace;
+	int endReplace;
+	int endMatch;
+	TranslationTableRule *groupingRule;
+	widechar groupingOp;
+	if (!table->corrections) return 1;
+	pos = 0;
+	output->length = 0;
+	*posIncremented = 1;
+	_lou_resetPassVariables();
+	while (pos < input->length) {
+		int length = input->length - pos;
+		const TranslationTableCharacter *character =
+				findCharOrDots(input->chars[pos], 0, table);
+		const TranslationTableCharacter *character2;
+		int tryThis = 0;
+		if (!findForPassRule(table, pos, 0, *input, &transOpcode, &transRule,
+					&transCharslen, &passCharDots, &passInstructions, &passIC,
+					&startMatch, &startReplace, &endReplace, &endMatch, &groupingRule,
+					&groupingOp))
+			while (tryThis < 3) {
+				TranslationTableOffset ruleOffset = 0;
+				unsigned long int makeHash = 0;
+				switch (tryThis) {
+				case 0:
+					if (!(length >= 2)) break;
+					makeHash = (unsigned long int)character->lowercase << 8;
+					character2 = findCharOrDots(input->chars[pos + 1], 0, table);
+					makeHash += (unsigned long int)character2->lowercase;
+					makeHash %= HASHNUM;
+					ruleOffset = table->forRules[makeHash];
+					break;
+				case 1:
+					if (!(length >= 1)) break;
+					length = 1;
+					ruleOffset = character->otherRules;
+					break;
+				case 2: /* No rule found */
+					transOpcode = CTO_Always;
+					ruleOffset = 0;
+					break;
+				}
+				while (ruleOffset) {
+					transRule = (TranslationTableRule *)&table->ruleArea[ruleOffset];
+					transOpcode = transRule->opcode;
+					transCharslen = transRule->charslen;
+					if (tryThis == 1 || (transCharslen <= length &&
+												compareChars(&transRule->charsdots[0],
+														&input->chars[pos], transCharslen,
+														0, table))) {
+						if (*posIncremented && transOpcode == CTO_Correct &&
+								passDoTest(table, pos, *input, transOpcode, transRule,
+										&passCharDots, &passInstructions, &passIC,
+										&startMatch, &startReplace, &endReplace,
+										&endMatch, &groupingRule, &groupingOp)) {
+							tryThis = 4;
+							break;
+						}
+					}
+					ruleOffset = transRule->charsnext;
+				}
+				tryThis++;
+			}
+		*posIncremented = 1;
+
+		switch (transOpcode) {
+		case CTO_Always:
+			if (output->length >= output->maxlength) goto failure;
+			posMapping[output->length] = pos;
+			output->chars[output->length++] = input->chars[pos++];
+			break;
+		case CTO_Correct:
+			if (appliedRules != NULL && appliedRulesCount < maxAppliedRules)
+				appliedRules[appliedRulesCount++] = transRule;
+			if (!passDoAction(table, &pos, mode, input, output, posMapping,
+						emphasisBuffer, transNoteBuffer, transOpcode, &transRule,
+						passCharDots, passInstructions, &passIC, startMatch, startReplace,
+						&endReplace, endMatch, cursorPosition, cursorStatus, compbrlStart,
+						compbrlEnd, groupingRule, groupingOp))
+				goto failure;
+			if (endReplace == pos) *posIncremented = 0;
+			pos = endReplace;
+			break;
+		default:
+			break;
+		}
+	}
+
+	{  // We have to transform typebuf accordingly
+		int k;
+		formtype *typebuf_temp;
+		if ((typebuf_temp = malloc(output->length * sizeof(formtype))) == NULL)
+			_lou_outOfMemory();
+		for (k = 0; k < output->length; k++)
+			// posMapping will never be < 0 but in theory it could
+			if (posMapping[k] < 0)
+				typebuf_temp[k] = typebuf[0];  // prepend to next
+			else if (posMapping[k] >= input->length)
+				typebuf_temp[k] = typebuf[input->length - 1];  // append to previous
+			else
+				typebuf_temp[k] = typebuf[posMapping[k]];
+		memcpy(typebuf, typebuf_temp, output->length * sizeof(formtype));
+		free(typebuf_temp);
+	}
+
+failure:
+	*realInlen = pos;
+	return 1;
+}
+
+static int
+matchCurrentInput(InString input, int pos, const widechar *passInstructions, int passIC) {
+	int k;
+	int kk = pos;
+	for (k = passIC + 2; k < passIC + 2 + passInstructions[passIC + 1]; k++)
+		if (input.chars[kk] == ENDSEGMENT || passInstructions[k] != input.chars[kk++])
+			return 0;
+	return 1;
+}
+
+static int
+swapTest(int swapIC, int *pos, const TranslationTableHeader *table, InString input,
+		const widechar *passInstructions) {
+	int p = *pos;
+	TranslationTableOffset swapRuleOffset;
+	TranslationTableRule *swapRule;
+	swapRuleOffset = (passInstructions[swapIC + 1] << 16) | passInstructions[swapIC + 2];
+	swapRule = (TranslationTableRule *)&table->ruleArea[swapRuleOffset];
+	while (p - *pos < passInstructions[swapIC + 3]) {
+		int test;
+		if (swapRule->opcode == CTO_SwapDd) {
+			for (test = 1; test < swapRule->charslen; test += 2) {
+				if (input.chars[p] == swapRule->charsdots[test]) break;
+			}
+		} else {
+			for (test = 0; test < swapRule->charslen; test++) {
+				if (input.chars[p] == swapRule->charsdots[test]) break;
+			}
+		}
+		if (test >= swapRule->charslen) return 0;
+		p++;
+	}
+	if (passInstructions[swapIC + 3] == passInstructions[swapIC + 4]) {
+		*pos = p;
+		return 1;
+	}
+	while (p - *pos < passInstructions[swapIC + 4]) {
+		int test;
+		if (swapRule->opcode == CTO_SwapDd) {
+			for (test = 1; test < swapRule->charslen; test += 2) {
+				if (input.chars[p] == swapRule->charsdots[test]) break;
+			}
+		} else {
+			for (test = 0; test < swapRule->charslen; test++) {
+				if (input.chars[p] == swapRule->charsdots[test]) break;
+			}
+		}
+		if (test >= swapRule->charslen) {
+			*pos = p;
+			return 1;
+		}
+		p++;
+	}
+	*pos = p;
+	return 1;
+}
+
+static int
+swapReplace(int start, int end, const TranslationTableHeader *table, InString input,
+		OutString *output, int *posMapping, const widechar *passInstructions,
+		int passIC) {
+	TranslationTableOffset swapRuleOffset;
+	TranslationTableRule *swapRule;
+	widechar *replacements;
+	int p;
+	swapRuleOffset = (passInstructions[passIC + 1] << 16) | passInstructions[passIC + 2];
+	swapRule = (TranslationTableRule *)&table->ruleArea[swapRuleOffset];
+	replacements = &swapRule->charsdots[swapRule->charslen];
+	for (p = start; p < end; p++) {
+		int rep;
+		int test;
+		int k;
+		for (test = 0; test < swapRule->charslen; test++)
+			if (input.chars[p] == swapRule->charsdots[test]) break;
+		if (test == swapRule->charslen) continue;
+		k = 0;
+		for (rep = 0; rep < test; rep++)
+			if (swapRule->opcode == CTO_SwapCc)
+				k++;
+			else
+				k += replacements[k];
+		if (swapRule->opcode == CTO_SwapCc) {
+			if ((output->length + 1) > output->maxlength) return 0;
+			posMapping[output->length] = p;
+			output->chars[output->length++] = replacements[k];
+		} else {
+			int l = replacements[k] - 1;
+			int d = output->length + l;
+			if (d > output->maxlength) return 0;
+			while (--d >= output->length) posMapping[d] = p;
+			memcpy(&output->chars[output->length], &replacements[k + 1],
+					l * sizeof(*output->chars));
+			output->length += l;
+		}
+	}
+	return 1;
+}
+
+static int
+replaceGrouping(const TranslationTableHeader *table, InString input, OutString *output,
+		int *posMapping, int transOpcode, int passCharDots,
+		const widechar *passInstructions, int passIC, int startReplace,
+		TranslationTableRule *groupingRule, widechar groupingOp) {
+	widechar startCharDots = groupingRule->charsdots[2 * passCharDots];
+	widechar endCharDots = groupingRule->charsdots[2 * passCharDots + 1];
+	widechar *curin = (widechar *)input.chars;
+	int p;
+	int level = 0;
+	TranslationTableOffset replaceOffset =
+			passInstructions[passIC + 1] << 16 | (passInstructions[passIC + 2] & 0xff);
+	TranslationTableRule *replaceRule =
+			(TranslationTableRule *)&table->ruleArea[replaceOffset];
+	widechar replaceStart = replaceRule->charsdots[2 * passCharDots];
+	widechar replaceEnd = replaceRule->charsdots[2 * passCharDots + 1];
+	if (groupingOp == pass_groupstart) {
+		curin[startReplace] = replaceStart;
+		for (p = startReplace + 1; p < input.length; p++) {
+			if (input.chars[p] == startCharDots) level--;
+			if (input.chars[p] == endCharDots) level++;
+			if (level == 1) break;
+		}
+		if (p == input.length) return 0;
+		curin[p] = replaceEnd;
+	} else {
+		if (transOpcode == CTO_Context) {
+			startCharDots = groupingRule->charsdots[2];
+			endCharDots = groupingRule->charsdots[3];
+			replaceStart = replaceRule->charsdots[2];
+			replaceEnd = replaceRule->charsdots[3];
+		}
+		output->chars[output->length] = replaceEnd;
+		for (p = output->length - 1; p >= 0; p--) {
+			if (output->chars[p] == endCharDots) level--;
+			if (output->chars[p] == startCharDots) level++;
+			if (level == 1) break;
+		}
+		if (p < 0) return 0;
+		output->chars[p] = replaceStart;
+		output->length++;
+	}
+	return 1;
+}
+
+static int
+removeGrouping(InString *input, OutString *output, int *posMapping, int passCharDots,
+		int startReplace, int endReplace, TranslationTableRule *groupingRule,
+		widechar groupingOp) {
+	widechar startCharDots = groupingRule->charsdots[2 * passCharDots];
+	widechar endCharDots = groupingRule->charsdots[2 * passCharDots + 1];
+	widechar *curin = (widechar *)input->chars;
+	int p;
+	int level = 0;
+	if (groupingOp == pass_groupstart) {
+		for (p = startReplace + 1; p < input->length; p++) {
+			if (input->chars[p] == startCharDots) level--;
+			if (input->chars[p] == endCharDots) level++;
+			if (level == 1) break;
+		}
+		if (p == input->length) return 0;
+		p++;
+		for (; p < input->length; p++) curin[p - 1] = curin[p];
+		input->length--;
+	} else {
+		for (p = output->length - 1; p >= 0; p--) {
+			if (output->chars[p] == endCharDots) level--;
+			if (output->chars[p] == startCharDots) level++;
+			if (level == 1) break;
+		}
+		if (p < 0) return 0;
+		p++;
+		for (; p < output->length; p++) output->chars[p - 1] = output->chars[p];
+		output->length--;
+	}
+	return 1;
+}
+
+static int
+doPassSearch(const TranslationTableHeader *table, InString input,
+		const TranslationTableRule *transRule, int passCharDots, int pos,
+		const widechar *passInstructions, int passIC, int *searchIC, int *searchPos,
+		TranslationTableRule *groupingRule, widechar groupingOp) {
+	int level = 0;
+	int k, kk;
+	int not = 0;
+	TranslationTableOffset ruleOffset;
+	TranslationTableRule *rule;
+	TranslationTableCharacterAttributes attributes;
+	while (pos < input.length) {
+		*searchIC = passIC + 1;
+		*searchPos = pos;
+		while (*searchIC < transRule->dotslen) {
+			int itsTrue = 1;
+			if (*searchPos > input.length) return 0;
+			switch (passInstructions[*searchIC]) {
+			case pass_lookback:
+				*searchPos -= passInstructions[*searchIC + 1];
+				if (*searchPos < 0) {
+					*searchPos = 0;
+					itsTrue = 0;
+				}
+				*searchIC += 2;
+				break;
+			case pass_not:
+				not = !not;
+				(*searchIC)++;
+				continue;
+			case pass_string:
+			case pass_dots:
+				kk = *searchPos;
+				for (k = *searchIC + 2;
+						k < *searchIC + 2 + passInstructions[*searchIC + 1]; k++)
+					if (input.chars[kk] == ENDSEGMENT ||
+							passInstructions[k] != input.chars[kk++]) {
+						itsTrue = 0;
+						break;
+					}
+				*searchPos += passInstructions[*searchIC + 1];
+				*searchIC += passInstructions[*searchIC + 1] + 2;
+				break;
+			case pass_startReplace:
+				(*searchIC)++;
+				break;
+			case pass_endReplace:
+				(*searchIC)++;
+				break;
+			case pass_attributes:
+				attributes = (passInstructions[*searchIC + 1] << 16) |
+						passInstructions[*searchIC + 2];
+				for (k = 0; k < passInstructions[*searchIC + 3]; k++) {
+					if (input.chars[*searchPos] == ENDSEGMENT)
+						itsTrue = 0;
+					else
+						itsTrue = ((findCharOrDots(input.chars[(*searchPos)++],
+											passCharDots,
+											table)->attributes &
+										   attributes)
+										? 1
+										: 0);
+					if (!itsTrue) break;
+				}
+				if (itsTrue) {
+					for (k = passInstructions[*searchIC + 3];
+							k < passInstructions[*searchIC + 4]; k++) {
+						if (input.chars[*searchPos] == ENDSEGMENT) {
+							itsTrue = 0;
+							break;
+						}
+						if (!(findCharOrDots(input.chars[*searchPos], passCharDots,
+									  table)->attributes &
+									attributes))
+							break;
+						(*searchPos)++;
+					}
+				}
+				*searchIC += 5;
+				break;
+			case pass_groupstart:
+			case pass_groupend:
+				ruleOffset = (passInstructions[*searchIC + 1] << 16) |
+						passInstructions[*searchIC + 2];
+				rule = (TranslationTableRule *)&table->ruleArea[ruleOffset];
+				if (passInstructions[*searchIC] == pass_groupstart)
+					itsTrue =
+							(input.chars[*searchPos] == rule->charsdots[2 * passCharDots])
+							? 1
+							: 0;
+				else
+					itsTrue = (input.chars[*searchPos] ==
+									  rule->charsdots[2 * passCharDots + 1])
+							? 1
+							: 0;
+				if (groupingRule != NULL && groupingOp == pass_groupstart &&
+						rule == groupingRule) {
+					if (input.chars[*searchPos] == rule->charsdots[2 * passCharDots])
+						level--;
+					else if (input.chars[*searchPos] ==
+							rule->charsdots[2 * passCharDots + 1])
+						level++;
+				}
+				(*searchPos)++;
+				*searchIC += 3;
+				break;
+			case pass_swap:
+				itsTrue = swapTest(*searchIC, searchPos, table, input, passInstructions);
+				*searchIC += 5;
+				break;
+			case pass_endTest:
+				if (itsTrue) {
+					if ((groupingRule && level == 1) || !groupingRule) return 1;
+				}
+				*searchIC = transRule->dotslen;
+				break;
+			default:
+				if (_lou_handlePassVariableTest(passInstructions, searchIC, &itsTrue))
+					break;
+				break;
+			}
+			if ((!not&&!itsTrue) || (not&&itsTrue)) break;
+			not = 0;
+		}
+		pos++;
+	}
+	return 0;
+}
+
+static int
+passDoTest(const TranslationTableHeader *table, int pos, InString input, int transOpcode,
+		const TranslationTableRule *transRule, int *passCharDots,
+		widechar const **passInstructions, int *passIC, int *startMatch,
+		int *startReplace, int *endReplace, int *endMatch,
+		TranslationTableRule **groupingRule, widechar *groupingOp) {
+	int searchIC, searchPos;
+	int k;
+	int not = 0;
+	TranslationTableOffset ruleOffset = 0;
+	TranslationTableRule *rule = NULL;
+	TranslationTableCharacterAttributes attributes = 0;
+	*groupingRule = NULL;
+	*startMatch = *endMatch = pos;
+	*passInstructions = &transRule->charsdots[transRule->charslen];
+	*passIC = 0;
+	*startReplace = *endReplace = -1;
+	if (transOpcode == CTO_Context || transOpcode == CTO_Correct)
+		*passCharDots = 0;
+	else
+		*passCharDots = 1;
+	while (*passIC < transRule->dotslen) {
+		int itsTrue = 1;
+		if (pos > input.length) return 0;
+		switch ((*passInstructions)[*passIC]) {
+		case pass_first:
+			if (pos != 0) itsTrue = 0;
+			(*passIC)++;
+			break;
+		case pass_last:
+			if (pos != input.length) itsTrue = 0;
+			(*passIC)++;
+			break;
+		case pass_lookback:
+			pos -= (*passInstructions)[*passIC + 1];
+			if (pos < 0) {
+				searchPos = 0;
+				itsTrue = 0;
+			}
+			*passIC += 2;
+			break;
+		case pass_not:
+			not = !not;
+			(*passIC)++;
+			continue;
+		case pass_string:
+		case pass_dots:
+			itsTrue = matchCurrentInput(input, pos, *passInstructions, *passIC);
+			pos += (*passInstructions)[*passIC + 1];
+			*passIC += (*passInstructions)[*passIC + 1] + 2;
+			break;
+		case pass_startReplace:
+			*startReplace = pos;
+			(*passIC)++;
+			break;
+		case pass_endReplace:
+			*endReplace = pos;
+			(*passIC)++;
+			break;
+		case pass_attributes:
+			attributes = ((*passInstructions)[*passIC + 1] << 16) |
+					(*passInstructions)[*passIC + 2];
+			for (k = 0; k < (*passInstructions)[*passIC + 3]; k++) {
+				if (pos >= input.length) {
+					itsTrue = 0;
+					break;
+				}
+				if (input.chars[pos] == ENDSEGMENT) {
+					itsTrue = 0;
+					break;
+				}
+				if (!(findCharOrDots(input.chars[pos], *passCharDots, table)->attributes &
+							attributes)) {
+					itsTrue = 0;
+					break;
+				}
+				pos += 1;
+			}
+			if (itsTrue) {
+				for (k = (*passInstructions)[*passIC + 3];
+						k < (*passInstructions)[*passIC + 4] && pos < input.length; k++) {
+					if (input.chars[pos] == ENDSEGMENT) {
+						itsTrue = 0;
+						break;
+					}
+					if (!(findCharOrDots(input.chars[pos], *passCharDots,
+								  table)->attributes &
+								attributes)) {
+						break;
+					}
+					pos += 1;
+				}
+			}
+			*passIC += 5;
+			break;
+		case pass_groupstart:
+		case pass_groupend:
+			ruleOffset = ((*passInstructions)[*passIC + 1] << 16) |
+					(*passInstructions)[*passIC + 2];
+			rule = (TranslationTableRule *)&table->ruleArea[ruleOffset];
+			if (*passIC == 0 ||
+					(*passIC > 0 &&
+							(*passInstructions)[*passIC - 1] == pass_startReplace)) {
+				*groupingRule = rule;
+				*groupingOp = (*passInstructions)[*passIC];
+			}
+			if ((*passInstructions)[*passIC] == pass_groupstart)
+				itsTrue =
+						(input.chars[pos] == rule->charsdots[2 * *passCharDots]) ? 1 : 0;
+			else
+				itsTrue = (input.chars[pos] == rule->charsdots[2 * *passCharDots + 1])
+						? 1
+						: 0;
+			pos++;
+			*passIC += 3;
+			break;
+		case pass_swap:
+			itsTrue = swapTest(*passIC, &pos, table, input, *passInstructions);
+			*passIC += 5;
+			break;
+		case pass_search:
+			itsTrue = doPassSearch(table, input, transRule, *passCharDots, pos,
+					*passInstructions, *passIC, &searchIC, &searchPos, *groupingRule,
+					*groupingOp);
+			if ((!not&&!itsTrue) || (not&&itsTrue)) return 0;
+			*passIC = searchIC;
+			pos = searchPos;
+		case pass_endTest:
+			(*passIC)++;
+			*endMatch = pos;
+			if (*startReplace == -1) {
+				*startReplace = *startMatch;
+				*endReplace = *endMatch;
+			}
+			return 1;
+			break;
+		default:
+			if (_lou_handlePassVariableTest(*passInstructions, passIC, &itsTrue)) break;
+			return 0;
+		}
+		if ((!not&&!itsTrue) || (not&&itsTrue)) return 0;
+		not = 0;
+	}
+	return 0;
+}
+
+static int
+copyCharacters(int from, int to, const TranslationTableHeader *table, int *pos, int mode,
+		InString input, OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, int transOpcode,
+		const TranslationTableRule **transRule, int *cursorPosition, int *cursorStatus,
+		int compbrlStart, int compbrlEnd) {
+	if (transOpcode == CTO_Context) {
+		while (from < to)
+			if (!putCharacter(input.chars[from++], table, pos, mode, input, output,
+						posMapping, emphasisBuffer, transNoteBuffer, transRule,
+						cursorPosition, cursorStatus, compbrlStart, compbrlEnd))
+				return 0;
+	} else {
+		if (to > from) {
+			if ((output->length + to - from) > output->maxlength) return 0;
+			while (to > from) {
+				posMapping[output->length] = from;
+				output->chars[output->length] = input.chars[from];
+				output->length++;
+				from++;
+			}
+		}
+	}
+
+	return 1;
+}
+
+static int
+passDoAction(const TranslationTableHeader *table, int *pos, int mode, InString *input,
+		OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, int transOpcode,
+		const TranslationTableRule **transRule, int passCharDots,
+		const widechar *passInstructions, int *passIC, int startMatch, int startReplace,
+		int *endReplace, int endMatch, int *cursorPosition, int *cursorStatus,
+		int compbrlStart, int compbrlEnd, TranslationTableRule *groupingRule,
+		widechar groupingOp) {
+	int k;
+	TranslationTableOffset ruleOffset = 0;
+	TranslationTableRule *rule = NULL;
+	int destStartMatch = output->length;
+	int destStartReplace;
+	int origEndReplace = *endReplace;
+
+	if (!copyCharacters(startMatch, startReplace, table, pos, mode, *input, output,
+				posMapping, emphasisBuffer, transNoteBuffer, transOpcode, transRule,
+				cursorPosition, cursorStatus, compbrlStart, compbrlEnd))
+		return 0;
+	destStartReplace = output->length;
+
+	while (*passIC < (*transRule)->dotslen) switch (passInstructions[*passIC]) {
+		case pass_string:
+		case pass_dots:
+			if ((output->length + passInstructions[*passIC + 1]) > output->maxlength)
+				return 0;
+			for (k = 0; k < passInstructions[*passIC + 1]; ++k)
+				posMapping[output->length + k] = startReplace;
+			memcpy(&output->chars[output->length], &passInstructions[*passIC + 2],
+					passInstructions[*passIC + 1] * CHARSIZE);
+			output->length += passInstructions[*passIC + 1];
+			*passIC += passInstructions[*passIC + 1] + 2;
+			break;
+		case pass_groupstart:
+			ruleOffset =
+					(passInstructions[*passIC + 1] << 16) | passInstructions[*passIC + 2];
+			rule = (TranslationTableRule *)&table->ruleArea[ruleOffset];
+			posMapping[output->length] = startMatch;
+			output->chars[output->length++] = rule->charsdots[2 * passCharDots];
+			*passIC += 3;
+			break;
+		case pass_groupend:
+			ruleOffset =
+					(passInstructions[*passIC + 1] << 16) | passInstructions[*passIC + 2];
+			rule = (TranslationTableRule *)&table->ruleArea[ruleOffset];
+			posMapping[output->length] = startMatch;
+			output->chars[output->length++] = rule->charsdots[2 * passCharDots + 1];
+			*passIC += 3;
+			break;
+		case pass_swap:
+			if (!swapReplace(startReplace, *endReplace, table, *input, output, posMapping,
+						passInstructions, *passIC))
+				return 0;
+			*passIC += 3;
+			break;
+		case pass_groupreplace:
+			if (!groupingRule ||
+					!replaceGrouping(table, *input, output, posMapping, transOpcode,
+							passCharDots, passInstructions, *passIC, startReplace,
+							groupingRule, groupingOp))
+				return 0;
+			*passIC += 3;
+			break;
+		case pass_omit:
+			if (groupingRule)
+				removeGrouping(input, output, posMapping, passCharDots, startReplace,
+						*endReplace, groupingRule, groupingOp);
+			(*passIC)++;
+			break;
+		case pass_copy: {
+			int count = destStartReplace - destStartMatch;
+			if (count > 0) {
+				memmove(&output->chars[destStartMatch], &output->chars[destStartReplace],
+						count * sizeof(*output->chars));
+				output->length -= count;
+				destStartReplace = destStartMatch;
+			}
+		}
+
+			if (!copyCharacters(startReplace, origEndReplace, table, pos, mode, *input,
+						output, posMapping, emphasisBuffer, transNoteBuffer, transOpcode,
+						transRule, cursorPosition, cursorStatus, compbrlStart,
+						compbrlEnd))
+				return 0;
+			*endReplace = endMatch;
+			(*passIC)++;
+			break;
+		default:
+			if (_lou_handlePassVariableAction(passInstructions, passIC)) break;
+			return 0;
+		}
+	return 1;
+}
+
+static void
+passSelectRule(const TranslationTableHeader *table, int pos, int currentPass,
+		InString input, int *transOpcode, const TranslationTableRule **transRule,
+		int *transCharslen, int *passCharDots, widechar const **passInstructions,
+		int *passIC, int *startMatch, int *startReplace, int *endReplace, int *endMatch,
+		TranslationTableRule **groupingRule, widechar *groupingOp) {
+	if (!findForPassRule(table, pos, currentPass, input, transOpcode, transRule,
+				transCharslen, passCharDots, passInstructions, passIC, startMatch,
+				startReplace, endReplace, endMatch, groupingRule, groupingOp)) {
+		*transOpcode = CTO_Always;
+	}
+}
+
+static int
+translatePass(const TranslationTableHeader *table, int mode, int currentPass,
+		InString *input, OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, int *posIncremented, int *cursorPosition,
+		int *cursorStatus, int compbrlStart, int compbrlEnd) {
+	int pos;
+	int transOpcode;
+	int prevTransOpcode;
+	const TranslationTableRule *transRule;
+	int transCharslen;
+	int passCharDots;
+	const widechar *passInstructions;
+	int passIC; /* Instruction counter */
+	int startMatch;
+	int startReplace;
+	int endReplace;
+	int endMatch;
+	TranslationTableRule *groupingRule;
+	widechar groupingOp;
+	prevTransOpcode = CTO_None;
+	pos = output->length = 0;
+	*posIncremented = 1;
+	_lou_resetPassVariables();
+	while (pos < input->length) { /* the main multipass translation loop */
+		passSelectRule(table, pos, currentPass, *input, &transOpcode, &transRule,
+				&transCharslen, &passCharDots, &passInstructions, &passIC, &startMatch,
+				&startReplace, &endReplace, &endMatch, &groupingRule, &groupingOp);
+		*posIncremented = 1;
+		switch (transOpcode) {
+		case CTO_Context:
+		case CTO_Pass2:
+		case CTO_Pass3:
+		case CTO_Pass4:
+			if (appliedRules != NULL && appliedRulesCount < maxAppliedRules)
+				appliedRules[appliedRulesCount++] = transRule;
+			if (!passDoAction(table, &pos, mode, input, output, posMapping,
+						emphasisBuffer, transNoteBuffer, transOpcode, &transRule,
+						passCharDots, passInstructions, &passIC, startMatch, startReplace,
+						&endReplace, endMatch, cursorPosition, cursorStatus, compbrlStart,
+						compbrlEnd, groupingRule, groupingOp))
+				goto failure;
+			if (endReplace == pos) *posIncremented = 0;
+			pos = endReplace;
+			break;
+		case CTO_Always:
+			if ((output->length + 1) > output->maxlength) goto failure;
+			posMapping[output->length] = pos;
+			output->chars[output->length++] = input->chars[pos++];
+			break;
+		default:
+			goto failure;
+		}
+	}
+	posMapping[output->length] = pos;
+failure:
+	if (pos < input->length) {
+		while (checkAttr(input->chars[pos], CTC_Space, 1, table))
+			if (++pos == input->length) break;
+	}
+	return 1;
+}
+
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+
+static int
+translateString(const TranslationTableHeader *table, int mode, int currentPass,
+		InString *input, OutString *output, int *posMapping, formtype *typebuf,
+		unsigned char *srcSpacing, unsigned char *destSpacing, unsigned int *wordBuffer,
+		unsigned int *emphasisBuffer, unsigned int *transNoteBuffer, int haveEmphasis,
+		int *realInlen, int *posIncremented, int *cursorPosition, int *cursorStatus,
+		int compbrlStart, int compbrlEnd);
+
+int EXPORT_CALL
+lou_translateString(const char *tableList, const widechar *inbufx, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int mode) {
+	return lou_translate(tableList, inbufx, inlen, outbuf, outlen, typeform, spacing,
+			NULL, NULL, NULL, mode);
+}
+
+int EXPORT_CALL
+lou_translate(const char *tableList, const widechar *inbufx, int *inlen, widechar *outbuf,
+		int *outlen, formtype *typeform, char *spacing, int *outputPos, int *inputPos,
+		int *cursorPos, int mode) {
+	return _lou_translateWithTracing(tableList, inbufx, inlen, outbuf, outlen, typeform,
+			spacing, outputPos, inputPos, cursorPos, mode, NULL, NULL);
+}
+
+int EXPORT_CALL
+_lou_translateWithTracing(const char *tableList, const widechar *inbufx, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int *outputPos,
+		int *inputPos, int *cursorPos, int mode, const TranslationTableRule **rules,
+		int *rulesLen) {
+	// int i;
+	// for(i = 0; i < *inlen; i++)
+	// {
+	// 	outbuf[i] = inbufx[i];
+	// 	if(inputPos)
+	// 		inputPos[i] = i;
+	// 	if(outputPos)
+	// 		outputPos[i] = i;
+	// }
+	// *inlen = i;
+	// *outlen = i;
+	// return 1;
+	const TranslationTableHeader *table;
+	InString input;
+	OutString output;
+	widechar *passbuf1;
+	widechar *passbuf2;
+	// posMapping contains position mapping info between the initial input and the output
+	// of the current pass. It is 1 longer than the output. The values are monotonically
+	// increasing and can range between -1 and the output length. At the end the position
+	// info is passed to the user as an inputPos and outputPos array. inputPos has the
+	// length of the final output and has values ranging from 0 to outlen-1. outputPos has
+	// the length of the initial input and has values ranging from 0 to inlen-1.
+	int *posMapping;
+	int *posMapping1;
+	int *posMapping2;
+	int *posMapping3;
+	formtype *typebuf;
+	unsigned char *srcSpacing;
+	unsigned char *destSpacing;
+	unsigned int *wordBuffer;
+	unsigned int *emphasisBuffer;
+	unsigned int *transNoteBuffer;
+	int cursorPosition;
+	int cursorStatus;
+	int haveEmphasis;
+	int compbrlStart;
+	int compbrlEnd;
+	int k;
+	int goodTrans = 1;
+	int realInlen;
+	int posIncremented;
+	if (tableList == NULL || inbufx == NULL || inlen == NULL || outbuf == NULL ||
+			outlen == NULL)
+		return 0;
+	_lou_logMessage(
+			LOG_ALL, "Performing translation: tableList=%s, inlen=%d", tableList, *inlen);
+	_lou_logWidecharBuf(LOG_ALL, "Inbuf=", inbufx, *inlen);
+
+	table = lou_getTable(tableList);
+	if (table == NULL || *inlen < 0 || *outlen < 0) return 0;
+	k = 0;
+	while (k < *inlen && inbufx[k]) k++;
+	input = (InString){ inbufx, k };
+	haveEmphasis = 0;
+	if (!(typebuf = _lou_allocMem(alloc_typebuf, input.length, *outlen))) return 0;
+	if (typeform != NULL) {
+		for (k = 0; k < input.length; k++) {
+			typebuf[k] = typeform[k];
+			if (typebuf[k] & EMPHASIS) haveEmphasis = 1;
+		}
+	} else
+		memset(typebuf, 0, input.length * sizeof(formtype));
+
+	if ((wordBuffer = _lou_allocMem(alloc_wordBuffer, input.length, *outlen)))
+		memset(wordBuffer, 0, (input.length + 4) * sizeof(unsigned int));
+	else
+		return 0;
+	if ((emphasisBuffer = _lou_allocMem(alloc_emphasisBuffer, input.length, *outlen)))
+		memset(emphasisBuffer, 0, (input.length + 4) * sizeof(unsigned int));
+	else
+		return 0;
+	if ((transNoteBuffer = _lou_allocMem(alloc_transNoteBuffer, input.length, *outlen)))
+		memset(transNoteBuffer, 0, (input.length + 4) * sizeof(unsigned int));
+	else
+		return 0;
+
+	if (!(spacing == NULL || *spacing == 'X'))
+		srcSpacing = (unsigned char *)spacing;
+	else
+		srcSpacing = NULL;
+	if (outputPos != NULL)
+		for (k = 0; k < input.length; k++) outputPos[k] = -1;
+	if (cursorPos != NULL && *cursorPos >= 0) {
+		cursorStatus = 0;
+		cursorPosition = *cursorPos;
+		if ((mode & (compbrlAtCursor | compbrlLeftCursor))) {
+			compbrlStart = cursorPosition;
+			if (checkAttr(input.chars[compbrlStart], CTC_Space, 0, table))
+				compbrlEnd = compbrlStart + 1;
+			else {
+				while (compbrlStart >= 0 &&
+						!checkAttr(input.chars[compbrlStart], CTC_Space, 0, table))
+					compbrlStart--;
+				compbrlStart++;
+				compbrlEnd = cursorPosition;
+				if (!(mode & compbrlLeftCursor))
+					while (compbrlEnd < input.length &&
+							!checkAttr(input.chars[compbrlEnd], CTC_Space, 0, table))
+						compbrlEnd++;
+			}
+		}
+	} else {
+		cursorPosition = -1;
+		cursorStatus = 1; /* so it won't check cursor position */
+	}
+	// FIXME: reallocate passbuf and posMapping buffers in between passes because the
+	// intermediary strings may be longer than the in- and outputs.
+	if (!(passbuf1 = _lou_allocMem(alloc_passbuf1, input.length, *outlen))) return 0;
+	if (!(posMapping1 = _lou_allocMem(alloc_posMapping1, input.length, *outlen)))
+		return 0;
+	if ((!(mode & pass1Only)) && (table->numPasses > 1 || table->corrections)) {
+		if (!(passbuf2 = _lou_allocMem(alloc_passbuf2, input.length, *outlen))) return 0;
+		if (!(posMapping2 = _lou_allocMem(alloc_posMapping2, input.length, *outlen)))
+			return 0;
+		if (!(posMapping3 = _lou_allocMem(alloc_posMapping3, input.length, *outlen)))
+			return 0;
+	}
+	if (srcSpacing != NULL) {
+		if (!(destSpacing = _lou_allocMem(alloc_destSpacing, input.length, *outlen)))
+			goodTrans = 0;
+		else
+			memset(destSpacing, '*', *outlen);
+	} else
+		destSpacing = NULL;
+	appliedRulesCount = 0;
+	if (rules != NULL && rulesLen != NULL) {
+		appliedRules = rules;
+		maxAppliedRules = *rulesLen;
+	} else {
+		appliedRules = NULL;
+		maxAppliedRules = 0;
+	}
+	output = (OutString){ passbuf1, *outlen };
+	posMapping = posMapping1;
+	if ((mode & pass1Only)) {
+		goodTrans = translateString(table, mode, 1, &input, &output, posMapping, typebuf,
+				srcSpacing, destSpacing, wordBuffer, emphasisBuffer, transNoteBuffer,
+				haveEmphasis, &realInlen, &posIncremented, &cursorPosition, &cursorStatus,
+				compbrlStart, compbrlEnd);
+		posMapping[output.length] = input.length;
+	} else {
+		int currentPass = table->corrections ? 0 : 1;
+		int *passPosMapping = posMapping;
+		while (1) {
+			switch (currentPass) {
+			case 0:
+				goodTrans = makeCorrections(table, mode, &input, &output, passPosMapping,
+						typebuf, emphasisBuffer, transNoteBuffer, &realInlen,
+						&posIncremented, &cursorPosition, &cursorStatus, compbrlStart,
+						compbrlEnd);
+				break;
+			case 1: {
+				// if table->corrections, realInlen is set by makeCorrections
+				int *pRealInlen;
+				pRealInlen = table->corrections ? NULL : &realInlen;
+				goodTrans = translateString(table, mode, currentPass, &input, &output,
+						passPosMapping, typebuf, srcSpacing, destSpacing, wordBuffer,
+						emphasisBuffer, transNoteBuffer, haveEmphasis, pRealInlen,
+						&posIncremented, &cursorPosition, &cursorStatus, compbrlStart,
+						compbrlEnd);
+				break;
+			}
+			default:
+				goodTrans = translatePass(table, mode, currentPass, &input, &output,
+						passPosMapping, emphasisBuffer, transNoteBuffer, &posIncremented,
+						&cursorPosition, &cursorStatus, compbrlStart, compbrlEnd);
+				break;
+			}
+			passPosMapping[output.length] = input.length;
+			if (passPosMapping == posMapping) {
+				passPosMapping = posMapping2;
+			} else {
+				int *prevPosMapping = posMapping3;
+				memcpy((int *)prevPosMapping, posMapping,
+						(output.length + 1) * sizeof(int));
+				for (k = 0; k <= output.length; k++)
+					if (passPosMapping[k] < 0)
+						posMapping[k] = prevPosMapping[0];
+					else
+						posMapping[k] = prevPosMapping[passPosMapping[k]];
+			}
+			currentPass++;
+			if (currentPass <= table->numPasses && goodTrans) {
+				widechar *tmp = passbuf1;
+				passbuf1 = passbuf2;
+				passbuf2 = tmp;
+				input = (InString){ output.chars, output.length };
+				output = (OutString){ passbuf1, *outlen };
+				continue;
+			}
+			break;
+		}
+	}
+	if (goodTrans) {
+		for (k = 0; k < output.length; k++) {
+			if (typeform != NULL) {
+				if ((output.chars[k] & (B7 | B8)))
+					typeform[k] = '8';
+				else
+					typeform[k] = '0';
+			}
+			if ((mode & dotsIO)) {
+				if ((mode & ucBrl))
+					outbuf[k] = ((output.chars[k] & 0xff) | 0x2800);
+				else
+					outbuf[k] = output.chars[k];
+			} else
+				outbuf[k] = _lou_getCharFromDots(output.chars[k]);
+		}
+		*inlen = realInlen;
+		*outlen = output.length;
+		// Compute inputPos and outputPos from posMapping. The value at the last index of
+		// posMapping is currectly not used.
+		if (inputPos != NULL) {
+			for (k = 0; k < *outlen; k++)
+				if (posMapping[k] < 0)
+					inputPos[k] = 0;
+				else if (posMapping[k] > *inlen - 1)
+					inputPos[k] = *inlen - 1;
+				else
+					inputPos[k] = posMapping[k];
+		}
+		if (outputPos != NULL) {
+			int inpos = -1;
+			int outpos = -1;
+			for (k = 0; k < *outlen; k++)
+				if (posMapping[k] > inpos) {
+					while (inpos < posMapping[k]) {
+						if (inpos >= 0 && inpos < *inlen)
+							outputPos[inpos] = outpos < 0 ? 0 : outpos;
+						inpos++;
+					}
+					outpos = k;
+				}
+			while (inpos < *inlen) outputPos[inpos++] = outpos;
+		}
+	}
+	if (destSpacing != NULL) {
+		memcpy(srcSpacing, destSpacing, input.length);
+		srcSpacing[input.length] = 0;
+	}
+	if (cursorPos != NULL && *cursorPos != -1) {
+		if (outputPos != NULL)
+			*cursorPos = outputPos[*cursorPos];
+		else
+			*cursorPos = cursorPosition;
+	}
+	if (rulesLen != NULL) *rulesLen = appliedRulesCount;
+	_lou_logMessage(LOG_ALL, "Translation complete: outlen=%d", *outlen);
+	_lou_logWidecharBuf(LOG_ALL, "Outbuf=", (const widechar *)outbuf, *outlen);
+
+	return goodTrans;
+}
+
+int EXPORT_CALL
+lou_translatePrehyphenated(const char *tableList, const widechar *inbufx, int *inlen,
+		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int *outputPos,
+		int *inputPos, int *cursorPos, char *inputHyphens, char *outputHyphens,
+		int mode) {
+	int rv = 1;
+	int *alloc_inputPos = NULL;
+	if (inputHyphens != NULL) {
+		if (outputHyphens == NULL) return 0;
+		if (inputPos == NULL) {
+			if ((alloc_inputPos = malloc(*outlen * sizeof(int))) == NULL)
+				_lou_outOfMemory();
+			inputPos = alloc_inputPos;
+		}
+	}
+	if (lou_translate(tableList, inbufx, inlen, outbuf, outlen, typeform, spacing,
+				outputPos, inputPos, cursorPos, mode)) {
+		if (inputHyphens != NULL) {
+			int inpos = 0;
+			int outpos;
+			for (outpos = 0; outpos < *outlen; outpos++) {
+				int new_inpos = inputPos[outpos];
+				if (new_inpos < inpos) {
+					rv = 0;
+					break;
+				}
+				if (new_inpos > inpos)
+					outputHyphens[outpos] = inputHyphens[new_inpos];
+				else
+					outputHyphens[outpos] = '0';
+				inpos = new_inpos;
+			}
+		}
+	}
+	if (alloc_inputPos != NULL) free(alloc_inputPos);
+	return rv;
+}
+
+static int
+hyphenate(const widechar *word, int wordSize, char *hyphens,
+		const TranslationTableHeader *table) {
+	widechar *prepWord;
+	int i, k, limit;
+	int stateNum;
+	widechar ch;
+	HyphenationState *statesArray =
+			(HyphenationState *)&table->ruleArea[table->hyphenStatesArray];
+	HyphenationState *currentState;
+	HyphenationTrans *transitionsArray;
+	char *hyphenPattern;
+	int patternOffset;
+	if (!table->hyphenStatesArray || (wordSize + 3) > MAXSTRING) return 0;
+	prepWord = (widechar *)calloc(wordSize + 3, sizeof(widechar));
+	/* prepWord is of the format ".hello."
+	 * hyphens is the length of the word "hello" "00000" */
+	prepWord[0] = '.';
+	for (i = 0; i < wordSize; i++) {
+		prepWord[i + 1] = (findCharOrDots(word[i], 0, table))->lowercase;
+		hyphens[i] = '0';
+	}
+	prepWord[wordSize + 1] = '.';
+
+	/* now, run the finite state machine */
+	stateNum = 0;
+
+	// we need to walk all of ".hello."
+	for (i = 0; i < wordSize + 2; i++) {
+		ch = prepWord[i];
+		while (1) {
+			if (stateNum == 0xffff) {
+				stateNum = 0;
+				goto nextLetter;
+			}
+			currentState = &statesArray[stateNum];
+			if (currentState->trans.offset) {
+				transitionsArray =
+						(HyphenationTrans *)&table->ruleArea[currentState->trans.offset];
+				for (k = 0; k < currentState->numTrans; k++) {
+					if (transitionsArray[k].ch == ch) {
+						stateNum = transitionsArray[k].newState;
+						goto stateFound;
+					}
+				}
+			}
+			stateNum = currentState->fallbackState;
+		}
+	stateFound:
+		currentState = &statesArray[stateNum];
+		if (currentState->hyphenPattern) {
+			hyphenPattern = (char *)&table->ruleArea[currentState->hyphenPattern];
+			patternOffset = i + 1 - (int)strlen(hyphenPattern);
+
+			/* Need to ensure that we don't overrun hyphens,
+			 * in some cases hyphenPattern is longer than the remaining letters,
+			 * and if we write out all of it we would have overshot our buffer. */
+			limit = MIN((int)strlen(hyphenPattern), wordSize - patternOffset);
+			for (k = 0; k < limit; k++) {
+				if (hyphens[patternOffset + k] < hyphenPattern[k])
+					hyphens[patternOffset + k] = hyphenPattern[k];
+			}
+		}
+	nextLetter:;
+	}
+	hyphens[wordSize] = 0;
+	free(prepWord);
+	return 1;
+}
+
+static int
+doCompTrans(int start, int end, const TranslationTableHeader *table, int *pos, int mode,
+		InString input, OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, const TranslationTableRule **transRule,
+		int *cursorPosition, int *cursorStatus, int compbrlStart, int compbrlEnd);
+
+static int
+for_updatePositions(const widechar *outChars, int inLength, int outLength, int shift,
+		const TranslationTableHeader *table, int *pos, int mode, InString input,
+		OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, const TranslationTableRule **transRule,
+		int *cursorPosition, int *cursorStatus, int compbrlStart, int compbrlEnd) {
+	int k;
+	if ((output->length + outLength) > output->maxlength ||
+			(*pos + inLength) > input.length)
+		return 0;
+	memcpy(&output->chars[output->length], outChars, outLength * CHARSIZE);
+	if (!*cursorStatus) {
+		if ((mode & (compbrlAtCursor | compbrlLeftCursor))) {
+			if (*pos >= compbrlStart) {
+				*cursorStatus = 2;
+				return doCompTrans(compbrlStart, compbrlEnd, table, pos, mode, input,
+						output, posMapping, emphasisBuffer, transNoteBuffer, transRule,
+						cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+			}
+		} else if (*cursorPosition >= *pos && *cursorPosition < (*pos + inLength)) {
+			*cursorPosition = output->length;
+			*cursorStatus = 1;
+		} else if (input.chars[*cursorPosition] == 0 &&
+				*cursorPosition == (*pos + inLength)) {
+			*cursorPosition = output->length + outLength / 2 + 1;
+			*cursorStatus = 1;
+		}
+	} else if (*cursorStatus == 2 && *cursorPosition == *pos)
+		*cursorPosition = output->length;
+	if (outLength <= inLength) {
+		for (k = 0; k < outLength; k++) posMapping[output->length + k] = *pos + shift;
+	} else {
+		for (k = 0; k < inLength; k++) posMapping[output->length + k] = *pos + shift;
+		for (k = inLength; k < outLength; k++)
+			posMapping[output->length + k] = *pos + shift;
+	}
+	output->length += outLength;
+	return 1;
+}
+
+static int
+syllableBreak(
+		const TranslationTableHeader *table, int pos, InString input, int transCharslen) {
+	int wordStart = 0;
+	int wordEnd = 0;
+	int wordSize = 0;
+	int k = 0;
+	char *hyphens = NULL;
+	for (wordStart = pos; wordStart >= 0; wordStart--)
+		if (!((findCharOrDots(input.chars[wordStart], 0, table))->attributes &
+					CTC_Letter)) {
+			wordStart++;
+			break;
+		}
+	if (wordStart < 0) wordStart = 0;
+	for (wordEnd = pos; wordEnd < input.length; wordEnd++)
+		if (!((findCharOrDots(input.chars[wordEnd], 0, table))->attributes &
+					CTC_Letter)) {
+			wordEnd--;
+			break;
+		}
+	if (wordEnd == input.length) wordEnd--;
+	/* At this stage wordStart is the 0 based index of the first letter in the word,
+	 * wordEnd is the 0 based index of the last letter in the word.
+	 * example: "hello" wordstart=0, wordEnd=4. */
+	wordSize = wordEnd - wordStart + 1;
+	hyphens = (char *)calloc(wordSize + 1, sizeof(char));
+	if (!hyphenate(&input.chars[wordStart], wordSize, hyphens, table)) {
+		free(hyphens);
+		return 0;
+	}
+	for (k = pos - wordStart + 1; k < (pos - wordStart + transCharslen); k++)
+		if (hyphens[k] & 1) {
+			free(hyphens);
+			return 1;
+		}
+	free(hyphens);
+	return 0;
+}
+
+static void
+setBefore(const TranslationTableHeader *table, int pos, InString input,
+		TranslationTableCharacterAttributes *beforeAttributes) {
+	widechar before;
+	if (pos >= 2 && input.chars[pos - 1] == ENDSEGMENT)
+		before = input.chars[pos - 2];
+	else
+		before = (pos == 0) ? ' ' : input.chars[pos - 1];
+	*beforeAttributes = (findCharOrDots(before, 0, table))->attributes;
+}
+
+static void
+setAfter(int length, const TranslationTableHeader *table, int pos, InString input,
+		TranslationTableCharacterAttributes *afterAttributes) {
+	widechar after;
+	if ((pos + length + 2) < input.length && input.chars[pos + 1] == ENDSEGMENT)
+		after = input.chars[pos + 2];
+	else
+		after = (pos + length < input.length) ? input.chars[pos + length] : ' ';
+	*afterAttributes = (findCharOrDots(after, 0, table))->attributes;
+}
+
+static int
+brailleIndicatorDefined(TranslationTableOffset offset,
+		const TranslationTableHeader *table, const TranslationTableRule **indicRule) {
+	if (!offset) return 0;
+	*indicRule = (TranslationTableRule *)&table->ruleArea[offset];
+	return 1;
+}
+
+static int
+validMatch(const TranslationTableHeader *table, int pos, InString input,
+		formtype *typebuf, const TranslationTableRule *transRule, int transCharslen) {
+	/* Analyze the typeform parameter and also check for capitalization */
+	TranslationTableCharacter *inputChar;
+	TranslationTableCharacter *ruleChar;
+	TranslationTableCharacterAttributes prevAttr = 0;
+	int k;
+	int kk = 0;
+	if (!transCharslen) return 0;
+	for (k = pos; k < pos + transCharslen; k++) {
+		if (input.chars[k] == ENDSEGMENT) {
+			if (k == pos && transCharslen == 1)
+				return 1;
+			else
+				return 0;
+		}
+		inputChar = findCharOrDots(input.chars[k], 0, table);
+		if (k == pos) prevAttr = inputChar->attributes;
+		ruleChar = findCharOrDots(transRule->charsdots[kk++], 0, table);
+		if ((inputChar->lowercase != ruleChar->lowercase)) return 0;
+		if (typebuf != NULL && (typebuf[pos] & CAPSEMPH) == 0 &&
+				(typebuf[k] | typebuf[pos]) != typebuf[pos])
+			return 0;
+		if (inputChar->attributes != CTC_Letter) {
+			if (k != (pos + 1) && (prevAttr & CTC_Letter) &&
+					(inputChar->attributes & CTC_Letter) &&
+					((inputChar->attributes &
+							 (CTC_LowerCase | CTC_UpperCase | CTC_Letter)) !=
+							(prevAttr & (CTC_LowerCase | CTC_UpperCase | CTC_Letter))))
+				return 0;
+		}
+		prevAttr = inputChar->attributes;
+	}
+	return 1;
+}
+
+static int
+doCompEmph(const TranslationTableHeader *table, int *pos, int mode, InString input,
+		OutString *output, int *posMapping, formtype *typebuf,
+		unsigned int *emphasisBuffer, unsigned int *transNoteBuffer,
+		const TranslationTableRule **transRule, int *cursorPosition, int *cursorStatus,
+		int compbrlStart, int compbrlEnd) {
+	int endEmph;
+	for (endEmph = *pos; (typebuf[endEmph] & computer_braille) && endEmph <= input.length;
+			endEmph++)
+		;
+	return doCompTrans(*pos, endEmph, table, pos, mode, input, output, posMapping,
+			emphasisBuffer, transNoteBuffer, transRule, cursorPosition, cursorStatus,
+			compbrlStart, compbrlEnd);
+}
+
+static int
+insertBrailleIndicators(int finish, const TranslationTableHeader *table, int *pos,
+		int mode, InString input, OutString *output, int *posMapping, formtype *typebuf,
+		int haveEmphasis, unsigned int *emphasisBuffer, unsigned int *transNoteBuffer,
+		int transOpcode, int prevTransOpcode, const TranslationTableRule **transRule,
+		int *cursorPosition, int *cursorStatus, int compbrlStart, int compbrlEnd,
+		TranslationTableCharacterAttributes beforeAttributes, int *prevType, int *curType,
+		int *prevTypeform, int prevPos) {
+	/* Insert braille indicators such as letter, number, etc. */
+	typedef enum {
+		checkNothing,
+		checkBeginTypeform,
+		checkEndTypeform,
+		checkNumber,
+		checkLetter
+	} checkThis;
+	checkThis checkWhat = checkNothing;
+	int ok = 0;
+	int k;
+	{
+		if (*pos == prevPos && !finish) return 1;
+		if (*pos != prevPos) {
+			if (haveEmphasis && (typebuf[*pos] & EMPHASIS) != *prevTypeform) {
+				*prevType = *prevTypeform & EMPHASIS;
+				*curType = typebuf[*pos] & EMPHASIS;
+				checkWhat = checkEndTypeform;
+			} else if (!finish)
+				checkWhat = checkNothing;
+			else
+				checkWhat = checkNumber;
+		}
+		if (finish == 1) checkWhat = checkNumber;
+	}
+	do {
+		const TranslationTableRule *indicRule;
+		ok = 0;
+		switch (checkWhat) {
+		case checkNothing:
+			ok = 0;
+			break;
+		case checkBeginTypeform:
+			if (haveEmphasis) {
+				ok = 0;
+				*curType = 0;
+			}
+			if (*curType == plain_text) {
+				if (!finish)
+					checkWhat = checkNothing;
+				else
+					checkWhat = checkNumber;
+			}
+			break;
+		case checkEndTypeform:
+			if (haveEmphasis) {
+				ok = 0;
+				*prevType = plain_text;
+			}
+			if (*prevType == plain_text) {
+				checkWhat = checkBeginTypeform;
+				*prevTypeform = typebuf[*pos] & EMPHASIS;
+			}
+			break;
+		case checkNumber:
+			if (brailleIndicatorDefined(table->numberSign, table, &indicRule) &&
+					checkAttr_safe(input, *pos, CTC_Digit, 0, table) &&
+					(prevTransOpcode == CTO_ExactDots ||
+							!(beforeAttributes & CTC_Digit)) &&
+					prevTransOpcode != CTO_MidNum) {
+				ok = !table->usesNumericMode;
+				checkWhat = checkNothing;
+			} else
+				checkWhat = checkLetter;
+			break;
+		case checkLetter:
+			if (!brailleIndicatorDefined(table->letterSign, table, &indicRule)) {
+				ok = 0;
+				checkWhat = checkNothing;
+				break;
+			}
+			if (transOpcode == CTO_Contraction) {
+				ok = 1;
+				checkWhat = checkNothing;
+				break;
+			}
+			if ((checkAttr_safe(input, *pos, CTC_Letter, 0, table) &&
+						!(beforeAttributes & CTC_Letter)) &&
+					(!checkAttr_safe(input, *pos + 1, CTC_Letter, 0, table) ||
+							(beforeAttributes & CTC_Digit))) {
+				ok = 1;
+				if (*pos > 0)
+					for (k = 0; k < table->noLetsignBeforeCount; k++)
+						if (input.chars[*pos - 1] == table->noLetsignBefore[k]) {
+							ok = 0;
+							break;
+						}
+				for (k = 0; k < table->noLetsignCount; k++)
+					if (input.chars[*pos] == table->noLetsign[k]) {
+						ok = 0;
+						break;
+					}
+				if ((*pos + 1) < input.length)
+					for (k = 0; k < table->noLetsignAfterCount; k++)
+						if (input.chars[*pos + 1] == table->noLetsignAfter[k]) {
+							ok = 0;
+							break;
+						}
+			}
+			checkWhat = checkNothing;
+			break;
+
+		default:
+			ok = 0;
+			checkWhat = checkNothing;
+			break;
+		}
+		if (ok && indicRule != NULL) {
+			if (!for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen, 0,
+						table, pos, mode, input, output, posMapping, emphasisBuffer,
+						transNoteBuffer, transRule, cursorPosition, cursorStatus,
+						compbrlStart, compbrlEnd))
+				return 0;
+			if (*cursorStatus == 2) checkWhat = checkNothing;
+		}
+	} while (checkWhat != checkNothing);
+	return 1;
+}
+
+static int
+onlyLettersBehind(const TranslationTableHeader *table, int pos, InString input,
+		TranslationTableCharacterAttributes beforeAttributes) {
+	/* Actually, spaces, then letters */
+	int k;
+	if (!(beforeAttributes & CTC_Space)) return 0;
+	for (k = pos - 2; k >= 0; k--) {
+		TranslationTableCharacterAttributes attr =
+				(findCharOrDots(input.chars[k], 0, table))->attributes;
+		if ((attr & CTC_Space)) continue;
+		if ((attr & CTC_Letter))
+			return 1;
+		else
+			return 0;
+	}
+	return 1;
+}
+
+static int
+onlyLettersAhead(const TranslationTableHeader *table, int pos, InString input,
+		int transCharslen, TranslationTableCharacterAttributes afterAttributes) {
+	/* Actullly, spaces, then letters */
+	int k;
+	if (!(afterAttributes & CTC_Space)) return 0;
+	for (k = pos + transCharslen + 1; k < input.length; k++) {
+		TranslationTableCharacterAttributes attr =
+				(findCharOrDots(input.chars[k], 0, table))->attributes;
+		if ((attr & CTC_Space)) continue;
+		if ((attr & (CTC_Letter | CTC_LitDigit)))
+			return 1;
+		else
+			return 0;
+	}
+	return 0;
+}
+
+static int
+noCompbrlAhead(const TranslationTableHeader *table, int pos, int mode, InString input,
+		int transOpcode, int transCharslen, int cursorPosition) {
+	int start = pos + transCharslen;
+	int end;
+	int p;
+	if (start >= input.length) return 1;
+	while (start < input.length && checkAttr(input.chars[start], CTC_Space, 0, table))
+		start++;
+	if (start == input.length ||
+			(transOpcode == CTO_JoinableWord &&
+					(!checkAttr(input.chars[start], CTC_Letter | CTC_Digit, 0, table) ||
+							!checkAttr(input.chars[start - 1], CTC_Space, 0, table))))
+		return 1;
+	end = start;
+	while (end < input.length && !checkAttr(input.chars[end], CTC_Space, 0, table)) end++;
+	if ((mode & (compbrlAtCursor | compbrlLeftCursor)) && cursorPosition >= start &&
+			cursorPosition < end)
+		return 0;
+	/* Look ahead for rules with CTO_CompBrl */
+	for (p = start; p < end; p++) {
+		int length = input.length - p;
+		int tryThis;
+		const TranslationTableCharacter *character1;
+		const TranslationTableCharacter *character2;
+		int k;
+		character1 = findCharOrDots(input.chars[p], 0, table);
+		for (tryThis = 0; tryThis < 2; tryThis++) {
+			TranslationTableOffset ruleOffset = 0;
+			TranslationTableRule *testRule;
+			unsigned long int makeHash = 0;
+			switch (tryThis) {
+			case 0:
+				if (!(length >= 2)) break;
+				/* Hash function optimized for forward translation */
+				makeHash = (unsigned long int)character1->lowercase << 8;
+				character2 = findCharOrDots(input.chars[p + 1], 0, table);
+				makeHash += (unsigned long int)character2->lowercase;
+				makeHash %= HASHNUM;
+				ruleOffset = table->forRules[makeHash];
+				break;
+			case 1:
+				if (!(length >= 1)) break;
+				length = 1;
+				ruleOffset = character1->otherRules;
+				break;
+			}
+			while (ruleOffset) {
+				testRule = (TranslationTableRule *)&table->ruleArea[ruleOffset];
+				for (k = 0; k < testRule->charslen; k++) {
+					character1 = findCharOrDots(testRule->charsdots[k], 0, table);
+					character2 = findCharOrDots(input.chars[p + k], 0, table);
+					if (character1->lowercase != character2->lowercase) break;
+				}
+				if (tryThis == 1 || k == testRule->charslen) {
+					if (testRule->opcode == CTO_CompBrl ||
+							testRule->opcode == CTO_Literal)
+						return 0;
+				}
+				ruleOffset = testRule->charsnext;
+			}
+		}
+	}
+	return 1;
+}
+
+static int
+isRepeatedWord(const TranslationTableHeader *table, int pos, InString input,
+		int transCharslen, const widechar **repwordStart, int *repwordLength) {
+	int start;
+	if (pos == 0 || !checkAttr(input.chars[pos - 1], CTC_Letter, 0, table)) return 0;
+	if ((pos + transCharslen) >= input.length ||
+			!checkAttr(input.chars[pos + transCharslen], CTC_Letter, 0, table))
+		return 0;
+	for (start = pos - 2;
+			start >= 0 && checkAttr(input.chars[start], CTC_Letter, 0, table); start--)
+		;
+	start++;
+	*repwordStart = &input.chars[start];
+	*repwordLength = pos - start;
+	if (compareChars(*repwordStart, &input.chars[pos + transCharslen], *repwordLength, 0,
+				table))
+		return 1;
+	return 0;
+}
+
+static int
+checkEmphasisChange(const int skip, int pos, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, const TranslationTableRule *transRule) {
+	int i;
+	for (i = pos + (skip + 1); i < pos + transRule->charslen; i++)
+		if (emphasisBuffer[i] || transNoteBuffer[i]) return 1;
+	return 0;
+}
+
+static int
+inSequence(const TranslationTableHeader *table, int pos, InString input,
+		const TranslationTableRule *transRule) {
+	int i, j, s, match;
+	// TODO: all caps words
+	// const TranslationTableCharacter *c = NULL;
+
+	/* check before sequence */
+	for (i = pos - 1; i >= 0; i--) {
+		if (checkAttr(input.chars[i], CTC_SeqBefore, 0, table)) continue;
+		if (!(checkAttr(input.chars[i], CTC_Space | CTC_SeqDelimiter, 0, table)))
+			return 0;
+		break;
+	}
+
+	/* check after sequence */
+	for (i = pos + transRule->charslen; i < input.length; i++) {
+		/* check sequence after patterns */
+		if (table->seqPatternsCount) {
+			match = 0;
+			for (j = i, s = 0; j <= input.length && s < table->seqPatternsCount;
+					j++, s++) {
+				/* matching */
+				if (match == 1) {
+					if (table->seqPatterns[s]) {
+						if (input.chars[j] == table->seqPatterns[s])
+							match = 1;
+						else {
+							match = -1;
+							j = i - 1;
+						}
+					}
+
+					/* found match */
+					else {
+						/* pattern at end of input */
+						if (j >= input.length) return 1;
+
+						i = j;
+						break;
+					}
+				}
+
+				/* looking for match */
+				else if (match == 0) {
+					if (table->seqPatterns[s]) {
+						if (input.chars[j] == table->seqPatterns[s])
+							match = 1;
+						else {
+							match = -1;
+							j = i - 1;
+						}
+					}
+				}
+
+				/* next pattarn */
+				else if (match == -1) {
+					if (!table->seqPatterns[s]) {
+						match = 0;
+						j = i - 1;
+					}
+				}
+			}
+		}
+
+		if (checkAttr(input.chars[i], CTC_SeqAfter, 0, table)) continue;
+		if (!(checkAttr(input.chars[i], CTC_Space | CTC_SeqDelimiter, 0, table)))
+			return 0;
+		break;
+	}
+
+	return 1;
+}
+
+static void
+for_selectRule(const TranslationTableHeader *table, int pos, OutString output, int mode,
+		InString input, formtype *typebuf, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, int *transOpcode, int prevTransOpcode,
+		const TranslationTableRule **transRule, int *transCharslen, int *passCharDots,
+		widechar const **passInstructions, int *passIC, int *startMatch,
+		int *startReplace, int *endReplace, int *endMatch, int posIncremented,
+		int cursorPosition, const widechar **repwordStart, int *repwordLength,
+		int dontContract, int compbrlStart, int compbrlEnd,
+		TranslationTableCharacterAttributes beforeAttributes,
+		TranslationTableCharacter **curCharDef, TranslationTableRule **groupingRule,
+		widechar *groupingOp) {
+	/* check for valid Translations. Return value is in transRule. */
+	static TranslationTableRule pseudoRule = { 0 };
+	int length = input.length - pos;
+	int tryThis;
+	const TranslationTableCharacter *character2;
+	int k;
+	TranslationTableOffset ruleOffset = 0;
+	*curCharDef = findCharOrDots(input.chars[pos], 0, table);
+	for (tryThis = 0; tryThis < 3; tryThis++) {
+		unsigned long int makeHash = 0;
+		switch (tryThis) {
+		case 0:
+			if (!(length >= 2)) break;
+			/* Hash function optimized for forward translation */
+			makeHash = (unsigned long int)(*curCharDef)->lowercase << 8;
+			character2 = findCharOrDots(input.chars[pos + 1], 0, table);
+			makeHash += (unsigned long int)character2->lowercase;
+			makeHash %= HASHNUM;
+			ruleOffset = table->forRules[makeHash];
+			break;
+		case 1:
+			if (!(length >= 1)) break;
+			length = 1;
+			ruleOffset = (*curCharDef)->otherRules;
+			break;
+		case 2: /* No rule found */
+			*transRule = &pseudoRule;
+			*transOpcode = pseudoRule.opcode = CTO_None;
+			*transCharslen = pseudoRule.charslen = 1;
+			pseudoRule.charsdots[0] = input.chars[pos];
+			pseudoRule.dotslen = 0;
+			return;
+			break;
+		}
+		while (ruleOffset) {
+			*transRule = (TranslationTableRule *)&table->ruleArea[ruleOffset];
+			*transOpcode = (*transRule)->opcode;
+			*transCharslen = (*transRule)->charslen;
+			if (tryThis == 1 ||
+					((*transCharslen <= length) && validMatch(table, pos, input, typebuf,
+														   *transRule, *transCharslen))) {
+				TranslationTableCharacterAttributes afterAttributes;
+				/* check before emphasis match */
+				if ((*transRule)->before & CTC_EmpMatch) {
+					if (emphasisBuffer[pos] || transNoteBuffer[pos]) break;
+				}
+
+				/* check after emphasis match */
+				if ((*transRule)->after & CTC_EmpMatch) {
+					if (emphasisBuffer[pos + *transCharslen] ||
+							transNoteBuffer[pos + *transCharslen])
+						break;
+				}
+
+				/* check this rule */
+				setAfter(*transCharslen, table, pos, input, &afterAttributes);
+				if ((!((*transRule)->after & ~CTC_EmpMatch) ||
+							(beforeAttributes & (*transRule)->after)) &&
+						(!((*transRule)->before & ~CTC_EmpMatch) ||
+								(afterAttributes & (*transRule)->before)))
+					switch (*transOpcode) { /* check validity of this Translation */
+					case CTO_Space:
+					case CTO_Letter:
+					case CTO_UpperCase:
+					case CTO_LowerCase:
+					case CTO_Digit:
+					case CTO_LitDigit:
+					case CTO_Punctuation:
+					case CTO_Math:
+					case CTO_Sign:
+					case CTO_Hyphen:
+					case CTO_Replace:
+					case CTO_CompBrl:
+					case CTO_Literal:
+						return;
+					case CTO_Repeated:
+						if ((mode & (compbrlAtCursor | compbrlLeftCursor)) &&
+								pos >= compbrlStart && pos <= compbrlEnd)
+							break;
+						return;
+					case CTO_RepWord:
+						if (dontContract || (mode & noContractions)) break;
+						if (isRepeatedWord(table, pos, input, *transCharslen,
+									repwordStart, repwordLength))
+							return;
+						break;
+					case CTO_NoCont:
+						if (dontContract || (mode & noContractions)) break;
+						return;
+					case CTO_Syllable:
+						*transOpcode = CTO_Always;
+					case CTO_Always:
+						if (checkEmphasisChange(
+									0, pos, emphasisBuffer, transNoteBuffer, *transRule))
+							break;
+						if (dontContract || (mode & noContractions)) break;
+						return;
+					case CTO_ExactDots:
+						return;
+					case CTO_NoCross:
+						if (dontContract || (mode & noContractions)) break;
+						if (syllableBreak(table, pos, input, *transCharslen)) break;
+						return;
+					case CTO_Context:
+						if (!posIncremented ||
+								!passDoTest(table, pos, input, *transOpcode, *transRule,
+										passCharDots, passInstructions, passIC,
+										startMatch, startReplace, endReplace, endMatch,
+										groupingRule, groupingOp))
+							break;
+						return;
+					case CTO_LargeSign:
+						if (dontContract || (mode & noContractions)) break;
+						if (!((beforeAttributes & (CTC_Space | CTC_Punctuation)) ||
+									onlyLettersBehind(
+											table, pos, input, beforeAttributes)) ||
+								!((afterAttributes & CTC_Space) ||
+										prevTransOpcode == CTO_LargeSign) ||
+								(afterAttributes & CTC_Letter) ||
+								!noCompbrlAhead(table, pos, mode, input, *transOpcode,
+										*transCharslen, cursorPosition))
+							*transOpcode = CTO_Always;
+						return;
+					case CTO_WholeWord:
+						if (dontContract || (mode & noContractions)) break;
+						if (checkEmphasisChange(
+									0, pos, emphasisBuffer, transNoteBuffer, *transRule))
+							break;
+					case CTO_Contraction:
+						if (table->usesSequences) {
+							if (inSequence(table, pos, input, *transRule)) return;
+						} else {
+							if ((beforeAttributes & (CTC_Space | CTC_Punctuation)) &&
+									(afterAttributes & (CTC_Space | CTC_Punctuation)))
+								return;
+						}
+						break;
+					case CTO_PartWord:
+						if (dontContract || (mode & noContractions)) break;
+						if ((beforeAttributes & CTC_Letter) ||
+								(afterAttributes & CTC_Letter))
+							return;
+						break;
+					case CTO_JoinNum:
+						if (dontContract || (mode & noContractions)) break;
+						if ((beforeAttributes & (CTC_Space | CTC_Punctuation)) &&
+								(afterAttributes & CTC_Space) &&
+								(output.length + (*transRule)->dotslen <
+										output.maxlength)) {
+							int p = pos + *transCharslen + 1;
+							while (p < input.length) {
+								if (!checkAttr(input.chars[p], CTC_Space, 0, table)) {
+									if (checkAttr(input.chars[p], CTC_Digit, 0, table))
+										return;
+									break;
+								}
+								p++;
+							}
+						}
+						break;
+					case CTO_LowWord:
+						if (dontContract || (mode & noContractions)) break;
+						if ((beforeAttributes & CTC_Space) &&
+								(afterAttributes & CTC_Space) &&
+								(prevTransOpcode != CTO_JoinableWord))
+							return;
+						break;
+					case CTO_JoinableWord:
+						if (dontContract || (mode & noContractions)) break;
+						if (beforeAttributes & (CTC_Space | CTC_Punctuation) &&
+								onlyLettersAhead(table, pos, input, *transCharslen,
+										afterAttributes) &&
+								noCompbrlAhead(table, pos, mode, input, *transOpcode,
+										*transCharslen, cursorPosition))
+							return;
+						break;
+					case CTO_SuffixableWord:
+						if (dontContract || (mode & noContractions)) break;
+						if ((beforeAttributes & (CTC_Space | CTC_Punctuation)) &&
+								(afterAttributes &
+										(CTC_Space | CTC_Letter | CTC_Punctuation)))
+							return;
+						break;
+					case CTO_PrefixableWord:
+						if (dontContract || (mode & noContractions)) break;
+						if ((beforeAttributes &
+									(CTC_Space | CTC_Letter | CTC_Punctuation)) &&
+								(afterAttributes & (CTC_Space | CTC_Punctuation)))
+							return;
+						break;
+					case CTO_BegWord:
+						if (dontContract || (mode & noContractions)) break;
+						if ((beforeAttributes & (CTC_Space | CTC_Punctuation)) &&
+								(afterAttributes & CTC_Letter))
+							return;
+						break;
+					case CTO_BegMidWord:
+						if (dontContract || (mode & noContractions)) break;
+						if ((beforeAttributes &
+									(CTC_Letter | CTC_Space | CTC_Punctuation)) &&
+								(afterAttributes & CTC_Letter))
+							return;
+						break;
+					case CTO_MidWord:
+						if (dontContract || (mode & noContractions)) break;
+						if (beforeAttributes & CTC_Letter && afterAttributes & CTC_Letter)
+							return;
+						break;
+					case CTO_MidEndWord:
+						if (dontContract || (mode & noContractions)) break;
+						if (beforeAttributes & CTC_Letter &&
+								afterAttributes &
+										(CTC_Letter | CTC_Space | CTC_Punctuation))
+							return;
+						break;
+					case CTO_EndWord:
+						if (dontContract || (mode & noContractions)) break;
+						if (beforeAttributes & CTC_Letter &&
+								afterAttributes & (CTC_Space | CTC_Punctuation))
+							return;
+						break;
+					case CTO_BegNum:
+						if (beforeAttributes & (CTC_Space | CTC_Punctuation) &&
+								afterAttributes & CTC_Digit)
+							return;
+						break;
+					case CTO_MidNum:
+						if (prevTransOpcode != CTO_ExactDots &&
+								beforeAttributes & CTC_Digit &&
+								afterAttributes & CTC_Digit)
+							return;
+						break;
+					case CTO_EndNum:
+						if (beforeAttributes & CTC_Digit &&
+								prevTransOpcode != CTO_ExactDots)
+							return;
+						break;
+					case CTO_DecPoint:
+						if (!(afterAttributes & CTC_Digit)) break;
+						if (beforeAttributes & CTC_Digit) *transOpcode = CTO_MidNum;
+						return;
+					case CTO_PrePunc:
+						if (!checkAttr(input.chars[pos], CTC_Punctuation, 0, table) ||
+								(pos > 0 && checkAttr(input.chars[pos - 1], CTC_Letter, 0,
+													table)))
+							break;
+						for (k = pos + *transCharslen; k < input.length; k++) {
+							if (checkAttr(input.chars[k], (CTC_Letter | CTC_Digit), 0,
+										table))
+								return;
+							if (checkAttr(input.chars[k], CTC_Space, 0, table)) break;
+						}
+						break;
+					case CTO_PostPunc:
+						if (!checkAttr(input.chars[pos], CTC_Punctuation, 0, table) ||
+								(pos < (input.length - 1) &&
+										checkAttr(input.chars[pos + 1], CTC_Letter, 0,
+												table)))
+							break;
+						for (k = pos; k >= 0; k--) {
+							if (checkAttr(input.chars[k], (CTC_Letter | CTC_Digit), 0,
+										table))
+								return;
+							if (checkAttr(input.chars[k], CTC_Space, 0, table)) break;
+						}
+						break;
+
+					case CTO_Match: {
+						widechar *patterns, *pattern;
+
+						if (dontContract || (mode & noContractions)) break;
+						if (checkEmphasisChange(
+									0, pos, emphasisBuffer, transNoteBuffer, *transRule))
+							break;
+
+						patterns = (widechar *)&table->ruleArea[(*transRule)->patterns];
+
+						/* check before pattern */
+						pattern = &patterns[1];
+						if (!_lou_pattern_check(
+									input.chars, pos - 1, -1, -1, pattern, table))
+							break;
+
+						/* check after pattern */
+						pattern = &patterns[patterns[0]];
+						if (!_lou_pattern_check(input.chars, pos + (*transRule)->charslen,
+									input.length, 1, pattern, table))
+							break;
+
+						return;
+					}
+
+					default:
+						break;
+					}
+			}
+			/* Done with checking this rule */
+			ruleOffset = (*transRule)->charsnext;
+		}
+	}
+}
+
+static int
+undefinedCharacter(widechar c, const TranslationTableHeader *table, int *pos, int mode,
+		InString input, OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, const TranslationTableRule **transRule,
+		int *cursorPosition, int *cursorStatus, int compbrlStart, int compbrlEnd) {
+	/* Display an undefined character in the output buffer */
+	int k;
+	char *display;
+	widechar displayDots[20];
+	if (table->undefined) {
+		TranslationTableRule *rule =
+				(TranslationTableRule *)&table->ruleArea[table->undefined];
+		if (!for_updatePositions(&rule->charsdots[rule->charslen], rule->charslen,
+					rule->dotslen, 0, table, pos, mode, input, output, posMapping,
+					emphasisBuffer, transNoteBuffer, transRule, cursorPosition,
+					cursorStatus, compbrlStart, compbrlEnd))
+			return 0;
+		return 1;
+	}
+	display = _lou_showString(&c, 1);
+	for (k = 0; k < (int)strlen(display); k++)
+		displayDots[k] = _lou_getDotsForChar(display[k]);
+	if (!for_updatePositions(displayDots, 1, (int)strlen(display), 0, table, pos, mode,
+				input, output, posMapping, emphasisBuffer, transNoteBuffer, transRule,
+				cursorPosition, cursorStatus, compbrlStart, compbrlEnd))
+		return 0;
+	return 1;
+}
+
+static int
+putCharacter(widechar character, const TranslationTableHeader *table, int *pos, int mode,
+		InString input, OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, const TranslationTableRule **transRule,
+		int *cursorPosition, int *cursorStatus, int compbrlStart, int compbrlEnd) {
+	/* Insert the dots equivalent of a character into the output buffer */
+	const TranslationTableRule *rule = NULL;
+	TranslationTableCharacter *chardef = NULL;
+	TranslationTableOffset offset;
+	widechar d;
+	if (*cursorStatus == 2) return 1;
+	chardef = (findCharOrDots(character, 0, table));
+	if ((chardef->attributes & CTC_Letter) && (chardef->attributes & CTC_UpperCase))
+		chardef = findCharOrDots(chardef->lowercase, 0, table);
+	// TODO: for_selectRule and this function screw up Digit and LitDigit
+	// NOTE: removed Litdigit from tables.
+	// if(!chardef->otherRules)
+	offset = chardef->definitionRule;
+	// else
+	//{
+	//	offset = chardef->otherRules;
+	//	rule = (TranslationTableRule *)&table->ruleArea[offset];
+	//	while(rule->charsnext && rule->charsnext != chardef->definitionRule)
+	//	{
+	//		rule = (TranslationTableRule *)&table->ruleArea[offset];
+	//		if(rule->charsnext)
+	//			offset = rule->charsnext;
+	//	}
+	//}
+	if (offset) {
+		rule = (TranslationTableRule *)&table->ruleArea[offset];
+		if (rule->dotslen)
+			return for_updatePositions(&rule->charsdots[1], 1, rule->dotslen, 0, table,
+					pos, mode, input, output, posMapping, emphasisBuffer, transNoteBuffer,
+					transRule, cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+		d = _lou_getDotsForChar(character);
+		return for_updatePositions(&d, 1, 1, 0, table, pos, mode, input, output,
+				posMapping, emphasisBuffer, transNoteBuffer, transRule, cursorPosition,
+				cursorStatus, compbrlStart, compbrlEnd);
+	}
+	return undefinedCharacter(character, table, pos, mode, input, output, posMapping,
+			emphasisBuffer, transNoteBuffer, transRule, cursorPosition, cursorStatus,
+			compbrlStart, compbrlEnd);
+}
+
+static int
+putCharacters(const widechar *characters, int count, const TranslationTableHeader *table,
+		int *pos, int mode, InString input, OutString *output, int *posMapping,
+		unsigned int *emphasisBuffer, unsigned int *transNoteBuffer,
+		const TranslationTableRule **transRule, int *cursorPosition, int *cursorStatus,
+		int compbrlStart, int compbrlEnd) {
+	/* Insert the dot equivalents of a series of characters in the output
+	 * buffer */
+	int k;
+	for (k = 0; k < count; k++)
+		if (!putCharacter(characters[k], table, pos, mode, input, output, posMapping,
+					emphasisBuffer, transNoteBuffer, transRule, cursorPosition,
+					cursorStatus, compbrlStart, compbrlEnd))
+			return 0;
+	return 1;
+}
+
+static int
+doCompbrl(const TranslationTableHeader *table, int *pos, int mode, InString input,
+		OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, const TranslationTableRule **transRule,
+		int *cursorPosition, int *cursorStatus, int destword, int srcword,
+		int compbrlStart, int compbrlEnd) {
+	/* Handle strings containing substrings defined by the compbrl opcode */
+	int stringStart, stringEnd;
+	if (checkAttr(input.chars[*pos], CTC_Space, 0, table)) return 1;
+	if (destword) {
+		*pos = srcword;
+		output->length = destword;
+	} else {
+		*pos = 0;
+		output->length = 0;
+	}
+	for (stringStart = *pos; stringStart >= 0; stringStart--)
+		if (checkAttr(input.chars[stringStart], CTC_Space, 0, table)) break;
+	stringStart++;
+	for (stringEnd = *pos; stringEnd < input.length; stringEnd++)
+		if (checkAttr(input.chars[stringEnd], CTC_Space, 0, table)) break;
+	return doCompTrans(stringStart, stringEnd, table, pos, mode, input, output,
+			posMapping, emphasisBuffer, transNoteBuffer, transRule, cursorPosition,
+			cursorStatus, compbrlStart, compbrlEnd);
+}
+
+static int
+putCompChar(widechar character, const TranslationTableHeader *table, int *pos, int mode,
+		InString input, OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, const TranslationTableRule **transRule,
+		int *cursorPosition, int *cursorStatus, int compbrlStart, int compbrlEnd) {
+	/* Insert the dots equivalent of a character into the output buffer */
+	widechar d;
+	TranslationTableOffset offset = (findCharOrDots(character, 0, table))->definitionRule;
+	if (offset) {
+		const TranslationTableRule *rule =
+				(TranslationTableRule *)&table->ruleArea[offset];
+		if (rule->dotslen)
+			return for_updatePositions(&rule->charsdots[1], 1, rule->dotslen, 0, table,
+					pos, mode, input, output, posMapping, emphasisBuffer, transNoteBuffer,
+					transRule, cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+		d = _lou_getDotsForChar(character);
+		return for_updatePositions(&d, 1, 1, 0, table, pos, mode, input, output,
+				posMapping, emphasisBuffer, transNoteBuffer, transRule, cursorPosition,
+				cursorStatus, compbrlStart, compbrlEnd);
+	}
+	return undefinedCharacter(character, table, pos, mode, input, output, posMapping,
+			emphasisBuffer, transNoteBuffer, transRule, cursorPosition, cursorStatus,
+			compbrlStart, compbrlEnd);
+}
+
+static int
+doCompTrans(int start, int end, const TranslationTableHeader *table, int *pos, int mode,
+		InString input, OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, const TranslationTableRule **transRule,
+		int *cursorPosition, int *cursorStatus, int compbrlStart, int compbrlEnd) {
+	const TranslationTableRule *indicRule;
+	int k;
+	int haveEndsegment = 0;
+	if (*cursorStatus != 2 && brailleIndicatorDefined(table->begComp, table, &indicRule))
+		if (!for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen, 0,
+					table, pos, mode, input, output, posMapping, emphasisBuffer,
+					transNoteBuffer, transRule, cursorPosition, cursorStatus,
+					compbrlStart, compbrlEnd))
+			return 0;
+	for (k = start; k < end; k++) {
+		TranslationTableOffset compdots = 0;
+		/* HACK: computer braille is one-to-one so it
+		 * can't have any emphasis indicators.
+		 * A better solution is to treat computer braille as its own mode. */
+		emphasisBuffer[k] = 0;
+		transNoteBuffer[k] = 0;
+		if (input.chars[k] == ENDSEGMENT) {
+			haveEndsegment = 1;
+			continue;
+		}
+		*pos = k;
+		if (input.chars[k] < 256) compdots = table->compdotsPattern[input.chars[k]];
+		if (compdots != 0) {
+			*transRule = (TranslationTableRule *)&table->ruleArea[compdots];
+			if (!for_updatePositions(&(*transRule)->charsdots[(*transRule)->charslen],
+						(*transRule)->charslen, (*transRule)->dotslen, 0, table, pos,
+						mode, input, output, posMapping, emphasisBuffer, transNoteBuffer,
+						transRule, cursorPosition, cursorStatus, compbrlStart,
+						compbrlEnd))
+				return 0;
+		} else if (!putCompChar(input.chars[k], table, pos, mode, input, output,
+						   posMapping, emphasisBuffer, transNoteBuffer, transRule,
+						   cursorPosition, cursorStatus, compbrlStart, compbrlEnd))
+			return 0;
+	}
+	if (*cursorStatus != 2 && brailleIndicatorDefined(table->endComp, table, &indicRule))
+		if (!for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen, 0,
+					table, pos, mode, input, output, posMapping, emphasisBuffer,
+					transNoteBuffer, transRule, cursorPosition, cursorStatus,
+					compbrlStart, compbrlEnd))
+			return 0;
+	*pos = end;
+	if (haveEndsegment) {
+		widechar endSegment = ENDSEGMENT;
+		if (!for_updatePositions(&endSegment, 0, 1, 0, table, pos, mode, input, output,
+					posMapping, emphasisBuffer, transNoteBuffer, transRule,
+					cursorPosition, cursorStatus, compbrlStart, compbrlEnd))
+			return 0;
+	}
+	return 1;
+}
+
+static int
+doNocont(const TranslationTableHeader *table, int *pos, OutString *output, int mode,
+		InString input, int destword, int srcword, int *dontContract) {
+	/* Handle strings containing substrings defined by the nocont opcode */
+	if (checkAttr(input.chars[*pos], CTC_Space, 0, table) || *dontContract ||
+			(mode & noContractions))
+		return 1;
+	if (destword) {
+		*pos = srcword;
+		output->length = destword;
+	} else {
+		*pos = 0;
+		output->length = 0;
+	}
+	*dontContract = 1;
+	return 1;
+}
+
+static int
+markSyllables(const TranslationTableHeader *table, InString input, formtype *typebuf,
+		int *transOpcode, const TranslationTableRule **transRule, int *transCharslen) {
+	int pos;
+	int k;
+	int currentMark = 0;
+	int const syllable_marks[] = { SYLLABLE_MARKER_1, SYLLABLE_MARKER_2 };
+	int syllable_mark_selector = 0;
+
+	if (typebuf == NULL || !table->syllables) return 1;
+	pos = 0;
+	while (pos < input.length) { /* the main multipass translation loop */
+		int length = input.length - pos;
+		const TranslationTableCharacter *character =
+				findCharOrDots(input.chars[pos], 0, table);
+		const TranslationTableCharacter *character2;
+		int tryThis = 0;
+		while (tryThis < 3) {
+			TranslationTableOffset ruleOffset = 0;
+			unsigned long int makeHash = 0;
+			switch (tryThis) {
+			case 0:
+				if (!(length >= 2)) break;
+				makeHash = (unsigned long int)character->lowercase << 8;
+				// memory overflow when pos == input.length - 1
+				character2 = findCharOrDots(input.chars[pos + 1], 0, table);
+				makeHash += (unsigned long int)character2->lowercase;
+				makeHash %= HASHNUM;
+				ruleOffset = table->forRules[makeHash];
+				break;
+			case 1:
+				if (!(length >= 1)) break;
+				length = 1;
+				ruleOffset = character->otherRules;
+				break;
+			case 2: /* No rule found */
+				*transOpcode = CTO_Always;
+				ruleOffset = 0;
+				break;
+			}
+			while (ruleOffset) {
+				*transRule = (TranslationTableRule *)&table->ruleArea[ruleOffset];
+				*transOpcode = (*transRule)->opcode;
+				*transCharslen = (*transRule)->charslen;
+				if (tryThis == 1 ||
+						(*transCharslen <= length &&
+								compareChars(&(*transRule)->charsdots[0],
+										&input.chars[pos], *transCharslen, 0, table))) {
+					if (*transOpcode == CTO_Syllable) {
+						tryThis = 4;
+						break;
+					}
+				}
+				ruleOffset = (*transRule)->charsnext;
+			}
+			tryThis++;
+		}
+		switch (*transOpcode) {
+		case CTO_Always:
+			if (pos >= input.length) return 0;
+			typebuf[pos++] |= currentMark;
+			break;
+		case CTO_Syllable:
+			/* cycle between SYLLABLE_MARKER_1 and SYLLABLE_MARKER_2 so
+			 * we can distinguinsh two consequtive syllables */
+			currentMark = syllable_marks[syllable_mark_selector];
+			syllable_mark_selector = (syllable_mark_selector + 1) % 2;
+
+			if ((pos + *transCharslen) > input.length) return 0;
+			for (k = 0; k < *transCharslen; k++) typebuf[pos++] |= currentMark;
+			break;
+		default:
+			break;
+		}
+	}
+	return 1;
+}
+
+static void
+resolveEmphasisWords(unsigned int *buffer, const unsigned int bit_begin,
+		const unsigned int bit_end, const unsigned int bit_word,
+		const unsigned int bit_symbol, InString input, unsigned int *wordBuffer) {
+	int in_word = 0, in_emp = 0, word_start = -1, word_whole = 0, word_stop;
+	int i;
+
+	for (i = 0; i < input.length; i++) {
+		// TODO: give each emphasis its own whole word bit?
+		/* clear out previous whole word markings */
+		wordBuffer[i] &= ~WORD_WHOLE;
+
+		/* check if at beginning of emphasis */
+		if (!in_emp)
+			if (buffer[i] & bit_begin) {
+				in_emp = 1;
+				buffer[i] &= ~bit_begin;
+
+				/* emphasis started inside word */
+				if (in_word) {
+					word_start = i;
+					word_whole = 0;
+				}
+
+				/* emphasis started on space */
+				if (!(wordBuffer[i] & WORD_CHAR)) word_start = -1;
+			}
+
+		/* check if at end of emphasis */
+		if (in_emp)
+			if (buffer[i] & bit_end) {
+				in_emp = 0;
+				buffer[i] &= ~bit_end;
+
+				if (in_word && word_start >= 0) {
+					/* check if emphasis ended inside a word */
+					word_stop = bit_end | bit_word;
+					if (wordBuffer[i] & WORD_CHAR)
+						word_whole = 0;
+					else
+						word_stop = 0;
+
+					/* if whole word is one symbol,
+					 * turn it into a symbol */
+					if (bit_symbol && word_start + 1 == i)
+						buffer[word_start] |= bit_symbol;
+					else {
+						buffer[word_start] |= bit_word;
+						buffer[i] |= word_stop;
+					}
+					wordBuffer[word_start] |= word_whole;
+				}
+			}
+
+		/* check if at beginning of word */
+		if (!in_word)
+			if (wordBuffer[i] & WORD_CHAR) {
+				in_word = 1;
+				if (in_emp) {
+					word_whole = WORD_WHOLE;
+					word_start = i;
+				}
+			}
+
+		/* check if at end of word */
+		if (in_word)
+			if (!(wordBuffer[i] & WORD_CHAR)) {
+				/* made it through whole word */
+				if (in_emp && word_start >= 0) {
+					/* if word is one symbol,
+					 * turn it into a symbol */
+					if (bit_symbol && word_start + 1 == i)
+						buffer[word_start] |= bit_symbol;
+					else
+						buffer[word_start] |= bit_word;
+					wordBuffer[word_start] |= word_whole;
+				}
+
+				in_word = 0;
+				word_whole = 0;
+				word_start = -1;
+			}
+	}
+
+	/* clean up end */
+	if (in_emp) {
+		buffer[i] &= ~bit_end;
+
+		if (in_word)
+			if (word_start >= 0) {
+				/* if word is one symbol,
+				 * turn it into a symbol */
+				if (bit_symbol && word_start + 1 == i)
+					buffer[word_start] |= bit_symbol;
+				else
+					buffer[word_start] |= bit_word;
+				wordBuffer[word_start] |= word_whole;
+			}
+	}
+}
+
+static void
+convertToPassage(const int pass_start, const int pass_end, const int word_start,
+		unsigned int *buffer, const EmphRuleNumber emphRule, const unsigned int bit_begin,
+		const unsigned int bit_end, const unsigned int bit_word,
+		const unsigned int bit_symbol, const TranslationTableHeader *table,
+		unsigned int *wordBuffer) {
+	int i;
+	const TranslationTableRule *indicRule;
+
+	for (i = pass_start; i <= pass_end; i++)
+		if (wordBuffer[i] & WORD_WHOLE) {
+			buffer[i] &= ~(bit_symbol | bit_word);
+			wordBuffer[i] &= ~WORD_WHOLE;
+		}
+
+	buffer[pass_start] |= bit_begin;
+	if (brailleIndicatorDefined(
+				table->emphRules[emphRule][endOffset], table, &indicRule) ||
+			brailleIndicatorDefined(
+					table->emphRules[emphRule][endPhraseAfterOffset], table, &indicRule))
+		buffer[pass_end] |= bit_end;
+	else if (brailleIndicatorDefined(table->emphRules[emphRule][endPhraseBeforeOffset],
+					 table, &indicRule))
+		buffer[word_start] |= bit_end;
+}
+
+static void
+resolveEmphasisPassages(unsigned int *buffer, const EmphRuleNumber emphRule,
+		const unsigned int bit_begin, const unsigned int bit_end,
+		const unsigned int bit_word, const unsigned int bit_symbol,
+		const TranslationTableHeader *table, InString input, unsigned int *wordBuffer) {
+	unsigned int word_cnt = 0;
+	int pass_start = -1, pass_end = -1, word_start = -1, in_word = 0, in_pass = 0;
+	int i;
+
+	for (i = 0; i < input.length; i++) {
+		/* check if at beginning of word */
+		if (!in_word)
+			if (wordBuffer[i] & WORD_CHAR) {
+				in_word = 1;
+				if (wordBuffer[i] & WORD_WHOLE) {
+					if (!in_pass) {
+						in_pass = 1;
+						pass_start = i;
+						pass_end = -1;
+						word_cnt = 1;
+					} else
+						word_cnt++;
+					word_start = i;
+					continue;
+				} else if (in_pass) {
+					if (word_cnt >= table->emphRules[emphRule][lenPhraseOffset])
+						if (pass_end >= 0) {
+							convertToPassage(pass_start, pass_end, word_start, buffer,
+									emphRule, bit_begin, bit_end, bit_word, bit_symbol,
+									table, wordBuffer);
+						}
+					in_pass = 0;
+				}
+			}
+
+		/* check if at end of word */
+		if (in_word)
+			if (!(wordBuffer[i] & WORD_CHAR)) {
+				in_word = 0;
+				if (in_pass) pass_end = i;
+			}
+
+		if (in_pass)
+			if (buffer[i] & bit_begin || buffer[i] & bit_end || buffer[i] & bit_word ||
+					buffer[i] & bit_symbol) {
+				if (word_cnt >= table->emphRules[emphRule][lenPhraseOffset])
+					if (pass_end >= 0) {
+						convertToPassage(pass_start, pass_end, word_start, buffer,
+								emphRule, bit_begin, bit_end, bit_word, bit_symbol, table,
+								wordBuffer);
+					}
+				in_pass = 0;
+			}
+	}
+
+	if (in_pass) {
+		if (word_cnt >= table->emphRules[emphRule][lenPhraseOffset]) {
+			if (pass_end >= 0) {
+				if (in_word) {
+					convertToPassage(pass_start, i, word_start, buffer, emphRule,
+							bit_begin, bit_end, bit_word, bit_symbol, table, wordBuffer);
+				} else {
+					convertToPassage(pass_start, pass_end, word_start, buffer, emphRule,
+							bit_begin, bit_end, bit_word, bit_symbol, table, wordBuffer);
+				}
+			}
+		}
+	}
+}
+
+static void
+resolveEmphasisSingleSymbols(unsigned int *buffer, const unsigned int bit_begin,
+		const unsigned int bit_end, const unsigned int bit_symbol, InString input) {
+	int i;
+
+	for (i = 0; i < input.length; i++) {
+		if (buffer[i] & bit_begin)
+			if (buffer[i + 1] & bit_end) {
+				buffer[i] &= ~bit_begin;
+				buffer[i + 1] &= ~bit_end;
+				buffer[i] |= bit_symbol;
+			}
+	}
+}
+
+static void
+resolveEmphasisAllCapsSymbols(unsigned int *buffer, formtype *typebuf, InString input) {
+	/* Marks every caps letter with CAPS_SYMBOL.
+	 * Used in the special case where capsnocont has been defined and capsword has not
+	 * been defined. */
+
+	const unsigned int bit_begin = CAPS_BEGIN;
+	const unsigned int bit_end = CAPS_END;
+	const unsigned int bit_symbol = CAPS_SYMBOL;
+
+	int inEmphasis = 0, i;
+
+	for (i = 0; i < input.length; i++) {
+		if (buffer[i] & bit_end) {
+			inEmphasis = 0;
+			buffer[i] &= ~bit_end;
+		} else {
+			if (buffer[i] & bit_begin) {
+				buffer[i] &= ~bit_begin;
+				inEmphasis = 1;
+			}
+			if (inEmphasis) {
+				if (typebuf[i] & CAPSEMPH)
+					/* Only mark if actually a capital letter (don't mark spaces or
+					 * punctuation). */
+					buffer[i] |= bit_symbol;
+			} /* In emphasis */
+		}	 /* Not bit_end */
+	}
+}
+
+static void
+resolveEmphasisResets(unsigned int *buffer, const unsigned int bit_begin,
+		const unsigned int bit_end, const unsigned int bit_word,
+		const unsigned int bit_symbol, const TranslationTableHeader *table,
+		InString input, unsigned int *wordBuffer) {
+	int in_word = 0, in_pass = 0, word_start = -1, word_reset = 0, orig_reset = -1,
+		letter_cnt = 0;
+	int i, j;
+
+	for (i = 0; i < input.length; i++) {
+		if (in_pass)
+			if (buffer[i] & bit_end) in_pass = 0;
+
+		if (!in_pass) {
+			if (buffer[i] & bit_begin)
+				in_pass = 1;
+			else {
+				if (!in_word) {
+					if (buffer[i] & bit_word) {
+						/* deal with case when reset
+						 * was at beginning of word */
+						if (wordBuffer[i] & WORD_RESET ||
+								!checkAttr(input.chars[i], CTC_Letter, 0, table)) {
+							/* not just one reset by itself */
+							if (wordBuffer[i + 1] & WORD_CHAR) {
+								buffer[i + 1] |= bit_word;
+								if (wordBuffer[i] & WORD_WHOLE)
+									wordBuffer[i + 1] |= WORD_WHOLE;
+							}
+							buffer[i] &= ~bit_word;
+							wordBuffer[i] &= ~WORD_WHOLE;
+
+							/* if reset is a letter, make it a symbol */
+							if (checkAttr(input.chars[i], CTC_Letter, 0, table))
+								buffer[i] |= bit_symbol;
+
+							continue;
+						}
+
+						in_word = 1;
+						word_start = i;
+						letter_cnt = 0;
+						word_reset = 0;
+					}
+
+					/* it is possible for a character to have been
+					 * marked as a symbol when it should not be one */
+					else if (buffer[i] & bit_symbol) {
+						if (wordBuffer[i] & WORD_RESET ||
+								!checkAttr(input.chars[i], CTC_Letter, 0, table))
+							buffer[i] &= ~bit_symbol;
+					}
+				}
+
+				if (in_word) {
+
+					/* at end of word */
+					if (!(wordBuffer[i] & WORD_CHAR) ||
+							(buffer[i] & bit_word && buffer[i] & bit_end)) {
+						in_word = 0;
+
+						/* check if symbol */
+						if (bit_symbol && letter_cnt == 1) {
+							buffer[word_start] |= bit_symbol;
+							buffer[word_start] &= ~bit_word;
+							wordBuffer[word_start] &= ~WORD_WHOLE;
+							buffer[i] &= ~(bit_end | bit_word);
+						}
+
+						/* if word ended on a reset or last char was a reset,
+						 * get rid of end bits */
+						if (word_reset || wordBuffer[i] & WORD_RESET ||
+								!checkAttr(input.chars[i], CTC_Letter, 0, table))
+							buffer[i] &= ~(bit_end | bit_word);
+
+						/* if word ended when it began, get rid of all bits */
+						if (i == word_start) {
+							wordBuffer[word_start] &= ~WORD_WHOLE;
+							buffer[i] &= ~(bit_end | bit_word);
+						}
+						orig_reset = -1;
+					} else {
+						/* hit reset */
+						if (wordBuffer[i] & WORD_RESET ||
+								!checkAttr(input.chars[i], CTC_Letter, 0, table)) {
+							if (!checkAttr(input.chars[i], CTC_Letter, 0, table)) {
+								if (checkAttr(input.chars[i], CTC_CapsMode, 0, table)) {
+									/* chars marked as not resetting */
+									orig_reset = i;
+									continue;
+								} else if (orig_reset >= 0) {
+									/* invalid no reset sequence */
+									for (j = orig_reset; j < i; j++)
+										buffer[j] &= ~bit_word;
+									// word_reset = 1;
+									orig_reset = -1;
+								}
+							}
+
+							/* check if symbol is not already resetting */
+							if (bit_symbol && letter_cnt == 1) {
+								buffer[word_start] |= bit_symbol;
+								buffer[word_start] &= ~bit_word;
+								wordBuffer[word_start] &= ~WORD_WHOLE;
+								// buffer[i] &= ~(bit_end | WORD_STOP);
+							}
+
+							/* if reset is a letter, make it the new word_start */
+							if (checkAttr(input.chars[i], CTC_Letter, 0, table)) {
+								word_reset = 0;
+								word_start = i;
+								letter_cnt = 1;
+								buffer[i] |= bit_word;
+							} else
+								word_reset = 1;
+
+							continue;
+						}
+
+						if (word_reset) {
+							word_reset = 0;
+							word_start = i;
+							letter_cnt = 0;
+							buffer[i] |= bit_word;
+						}
+
+						letter_cnt++;
+					}
+				}
+			}
+		}
+	}
+
+	/* clean up end */
+	if (in_word) {
+		/* check if symbol */
+		if (bit_symbol && letter_cnt == 1) {
+			buffer[word_start] |= bit_symbol;
+			buffer[word_start] &= ~bit_word;
+			wordBuffer[word_start] &= ~WORD_WHOLE;
+			buffer[i] &= ~(bit_end | bit_word);
+		}
+
+		if (word_reset) buffer[i] &= ~(bit_end | bit_word);
+	}
+}
+
+static void
+markEmphases(const TranslationTableHeader *table, InString input, formtype *typebuf,
+		unsigned int *wordBuffer, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, int haveEmphasis, int *cursorPosition,
+		int *cursorStatus, int compbrlStart, int compbrlEnd) {
+	/* Relies on the order of typeforms emph_1..emph_10. */
+	int caps_start = -1, last_caps = -1, caps_cnt = 0;
+	int emph_start[10] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
+	int i, j;
+
+	for (i = 0; i < input.length; i++) {
+		if (!checkAttr(input.chars[i], CTC_Space, 0, table)) {
+			wordBuffer[i] |= WORD_CHAR;
+		} else if (caps_cnt > 0) {
+			last_caps = i;
+			caps_cnt = 0;
+		}
+
+		if (checkAttr(input.chars[i], CTC_UpperCase, 0, table)) {
+			if (caps_start < 0) caps_start = i;
+			caps_cnt++;
+		} else if (caps_start >= 0) {
+			/* caps should keep going until this */
+			if (checkAttr(input.chars[i], CTC_Letter, 0, table) &&
+					checkAttr(input.chars[i], CTC_LowerCase, 0, table)) {
+				emphasisBuffer[caps_start] |= CAPS_BEGIN;
+				if (caps_cnt > 0)
+					emphasisBuffer[i] |= CAPS_END;
+				else
+					emphasisBuffer[last_caps] |= CAPS_END;
+				caps_start = -1;
+				last_caps = -1;
+				caps_cnt = 0;
+			}
+		}
+
+		if (!haveEmphasis) continue;
+
+		for (j = 0; j < 10; j++) {
+			if (typebuf[i] & (italic << j)) {
+				if (emph_start[j] < 0) emph_start[j] = i;
+			} else if (emph_start[j] >= 0) {
+				if (j < 5) {
+					emphasisBuffer[emph_start[j]] |= EMPHASIS_BEGIN << (j * 4);
+					emphasisBuffer[i] |= EMPHASIS_END << (j * 4);
+				} else {
+					transNoteBuffer[emph_start[j]] |= TRANSNOTE_BEGIN << ((j - 5) * 4);
+					transNoteBuffer[i] |= TRANSNOTE_END << ((j - 5) * 4);
+				}
+				emph_start[j] = -1;
+			}
+		}
+	}
+
+	/* clean up input.length */
+	if (caps_start >= 0) {
+		emphasisBuffer[caps_start] |= CAPS_BEGIN;
+		if (caps_cnt > 0)
+			emphasisBuffer[input.length] |= CAPS_END;
+		else
+			emphasisBuffer[last_caps] |= CAPS_END;
+	}
+
+	if (haveEmphasis) {
+		for (j = 0; j < 10; j++) {
+			if (emph_start[j] >= 0) {
+				if (j < 5) {
+					emphasisBuffer[emph_start[j]] |= EMPHASIS_BEGIN << (j * 4);
+					emphasisBuffer[input.length] |= EMPHASIS_END << (j * 4);
+				} else {
+					transNoteBuffer[emph_start[j]] |= TRANSNOTE_BEGIN << ((j - 5) * 4);
+					transNoteBuffer[input.length] |= TRANSNOTE_END << ((j - 5) * 4);
+				}
+			}
+		}
+	}
+
+	/* Handle capsnocont */
+	if (table->capsNoCont) {
+		int inCaps = 0;
+		for (i = 0; i < input.length; i++) {
+			if (emphasisBuffer[i] & CAPS_END) {
+				inCaps = 0;
+			} else {
+				if ((emphasisBuffer[i] & CAPS_BEGIN) &&
+						!(emphasisBuffer[i + 1] & CAPS_END))
+					inCaps = 1;
+				if (inCaps) typebuf[i] |= no_contract;
+			}
+		}
+	}
+
+	if (table->emphRules[capsRule][begWordOffset]) {
+		resolveEmphasisWords(emphasisBuffer, CAPS_BEGIN, CAPS_END, CAPS_WORD, CAPS_SYMBOL,
+				input, wordBuffer);
+		if (table->emphRules[capsRule][lenPhraseOffset])
+			resolveEmphasisPassages(emphasisBuffer, capsRule, CAPS_BEGIN, CAPS_END,
+					CAPS_WORD, CAPS_SYMBOL, table, input, wordBuffer);
+		resolveEmphasisResets(emphasisBuffer, CAPS_BEGIN, CAPS_END, CAPS_WORD,
+				CAPS_SYMBOL, table, input, wordBuffer);
+	} else if (table->emphRules[capsRule][letterOffset]) {
+		if (table->capsNoCont) /* capsnocont and no capsword */
+			resolveEmphasisAllCapsSymbols(emphasisBuffer, typebuf, input);
+		else
+			resolveEmphasisSingleSymbols(
+					emphasisBuffer, CAPS_BEGIN, CAPS_END, CAPS_SYMBOL, input);
+	}
+
+	if (!haveEmphasis) return;
+
+	for (j = 0; j < 5; j++) {
+		if (table->emphRules[emph1Rule + j][begWordOffset]) {
+			resolveEmphasisWords(emphasisBuffer, EMPHASIS_BEGIN << (j * 4),
+					EMPHASIS_END << (j * 4), EMPHASIS_WORD << (j * 4),
+					EMPHASIS_SYMBOL << (j * 4), input, wordBuffer);
+			if (table->emphRules[emph1Rule + j][lenPhraseOffset])
+				resolveEmphasisPassages(emphasisBuffer, emph1Rule + j,
+						EMPHASIS_BEGIN << (j * 4), EMPHASIS_END << (j * 4),
+						EMPHASIS_WORD << (j * 4), EMPHASIS_SYMBOL << (j * 4), table,
+						input, wordBuffer);
+		} else if (table->emphRules[emph1Rule + j][letterOffset])
+			resolveEmphasisSingleSymbols(emphasisBuffer, EMPHASIS_BEGIN << (j * 4),
+					EMPHASIS_END << (j * 4), EMPHASIS_SYMBOL << (j * 4), input);
+	}
+	for (j = 0; j < 5; j++) {
+		if (table->emphRules[emph6Rule + j][begWordOffset]) {
+			resolveEmphasisWords(transNoteBuffer, TRANSNOTE_BEGIN << (j * 4),
+					TRANSNOTE_END << (j * 4), TRANSNOTE_WORD << (j * 4),
+					TRANSNOTE_SYMBOL << (j * 4), input, wordBuffer);
+			if (table->emphRules[emph6Rule + j][lenPhraseOffset])
+				resolveEmphasisPassages(transNoteBuffer, j + 6,
+						TRANSNOTE_BEGIN << (j * 4), TRANSNOTE_END << (j * 4),
+						TRANSNOTE_WORD << (j * 4), TRANSNOTE_SYMBOL << (j * 4), table,
+						input, wordBuffer);
+		} else if (table->emphRules[emph6Rule + j][letterOffset])
+			resolveEmphasisSingleSymbols(transNoteBuffer, TRANSNOTE_BEGIN << (j * 4),
+					TRANSNOTE_END << (j * 4), TRANSNOTE_SYMBOL << (j * 4), input);
+	}
+}
+
+static void
+insertEmphasisSymbol(unsigned int *buffer, const int at, const EmphRuleNumber emphRule,
+		const unsigned int bit_symbol, const TranslationTableHeader *table, int *pos,
+		int mode, InString input, OutString *output, int *posMapping,
+		unsigned int *emphasisBuffer, unsigned int *transNoteBuffer,
+		const TranslationTableRule **transRule, int *cursorPosition, int *cursorStatus,
+		int compbrlStart, int compbrlEnd) {
+	if (buffer[at] & bit_symbol) {
+		const TranslationTableRule *indicRule;
+		if (brailleIndicatorDefined(
+					table->emphRules[emphRule][letterOffset], table, &indicRule))
+			for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen, 0, table,
+					pos, mode, input, output, posMapping, emphasisBuffer, transNoteBuffer,
+					transRule, cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+	}
+}
+
+static void
+insertEmphasisBegin(unsigned int *buffer, const int at, const EmphRuleNumber emphRule,
+		const unsigned int bit_begin, const unsigned int bit_end,
+		const unsigned int bit_word, const TranslationTableHeader *table, int *pos,
+		int mode, InString input, OutString *output, int *posMapping,
+		unsigned int *emphasisBuffer, unsigned int *transNoteBuffer,
+		const TranslationTableRule **transRule, int *cursorPosition, int *cursorStatus,
+		int compbrlStart, int compbrlEnd) {
+	const TranslationTableRule *indicRule;
+	if (buffer[at] & bit_begin) {
+		if (brailleIndicatorDefined(
+					table->emphRules[emphRule][begPhraseOffset], table, &indicRule))
+			for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen, 0, table,
+					pos, mode, input, output, posMapping, emphasisBuffer, transNoteBuffer,
+					transRule, cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+		else if (brailleIndicatorDefined(
+						 table->emphRules[emphRule][begOffset], table, &indicRule))
+			for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen, 0, table,
+					pos, mode, input, output, posMapping, emphasisBuffer, transNoteBuffer,
+					transRule, cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+	}
+
+	if (buffer[at] & bit_word
+			// && !(buffer[at] & bit_begin)
+			&& !(buffer[at] & bit_end)) {
+		if (brailleIndicatorDefined(
+					table->emphRules[emphRule][begWordOffset], table, &indicRule))
+			for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen, 0, table,
+					pos, mode, input, output, posMapping, emphasisBuffer, transNoteBuffer,
+					transRule, cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+	}
+}
+
+static void
+insertEmphasisEnd(unsigned int *buffer, const int at, const EmphRuleNumber emphRule,
+		const unsigned int bit_end, const unsigned int bit_word,
+		const TranslationTableHeader *table, int *pos, int mode, InString input,
+		OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, const TranslationTableRule **transRule,
+		int *cursorPosition, int *cursorStatus, int compbrlStart, int compbrlEnd) {
+	if (buffer[at] & bit_end) {
+		const TranslationTableRule *indicRule;
+		if (buffer[at] & bit_word) {
+			if (brailleIndicatorDefined(
+						table->emphRules[emphRule][endWordOffset], table, &indicRule))
+				for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen, -1,
+						table, pos, mode, input, output, posMapping, emphasisBuffer,
+						transNoteBuffer, transRule, cursorPosition, cursorStatus,
+						compbrlStart, compbrlEnd);
+		} else {
+			if (brailleIndicatorDefined(
+						table->emphRules[emphRule][endOffset], table, &indicRule))
+				for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen, -1,
+						table, pos, mode, input, output, posMapping, emphasisBuffer,
+						transNoteBuffer, transRule, cursorPosition, cursorStatus,
+						compbrlStart, compbrlEnd);
+			else if (brailleIndicatorDefined(
+							 table->emphRules[emphRule][endPhraseAfterOffset], table,
+							 &indicRule))
+				for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen, -1,
+						table, pos, mode, input, output, posMapping, emphasisBuffer,
+						transNoteBuffer, transRule, cursorPosition, cursorStatus,
+						compbrlStart, compbrlEnd);
+			else if (brailleIndicatorDefined(
+							 table->emphRules[emphRule][endPhraseBeforeOffset], table,
+							 &indicRule))
+				for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen, 0,
+						table, pos, mode, input, output, posMapping, emphasisBuffer,
+						transNoteBuffer, transRule, cursorPosition, cursorStatus,
+						compbrlStart, compbrlEnd);
+		}
+	}
+}
+
+static int
+endCount(unsigned int *buffer, const int at, const unsigned int bit_end,
+		const unsigned int bit_begin, const unsigned int bit_word) {
+	int i, cnt = 1;
+	if (!(buffer[at] & bit_end)) return 0;
+	for (i = at - 1; i >= 0; i--)
+		if (buffer[i] & bit_begin || buffer[i] & bit_word)
+			break;
+		else
+			cnt++;
+	return cnt;
+}
+
+static int
+beginCount(unsigned int *buffer, const int at, const unsigned int bit_end,
+		const unsigned int bit_begin, const unsigned int bit_word,
+		const TranslationTableHeader *table, InString input) {
+	if (buffer[at] & bit_begin) {
+		int i, cnt = 1;
+		for (i = at + 1; i < input.length; i++)
+			if (buffer[i] & bit_end)
+				break;
+			else
+				cnt++;
+		return cnt;
+	} else if (buffer[at] & bit_word) {
+		int i, cnt = 1;
+		for (i = at + 1; i < input.length; i++)
+			if (buffer[i] & bit_end) break;
+			// TODO: WORD_RESET?
+			else if (checkAttr(input.chars[i], CTC_SeqDelimiter | CTC_Space, 0, table))
+				break;
+			else
+				cnt++;
+		return cnt;
+	}
+	return 0;
+}
+
+static void
+insertEmphasesAt(const int at, const TranslationTableHeader *table, int *pos, int mode,
+		InString input, OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, int haveEmphasis, int transOpcode,
+		const TranslationTableRule **transRule, int *cursorPosition, int *cursorStatus,
+		int compbrlStart, int compbrlEnd) {
+	int type_counts[10];
+	int i, j, min, max;
+
+	/* simple case */
+	if (!haveEmphasis) {
+		/* insert graded 1 mode indicator */
+		if (transOpcode == CTO_Contraction) {
+			const TranslationTableRule *indicRule;
+			if (brailleIndicatorDefined(table->noContractSign, table, &indicRule))
+				for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen, 0,
+						table, pos, mode, input, output, posMapping, emphasisBuffer,
+						transNoteBuffer, transRule, cursorPosition, cursorStatus,
+						compbrlStart, compbrlEnd);
+		}
+
+		if (emphasisBuffer[at] & CAPS_EMPHASIS) {
+			insertEmphasisEnd(emphasisBuffer, at, capsRule, CAPS_END, CAPS_WORD, table,
+					pos, mode, input, output, posMapping, emphasisBuffer, transNoteBuffer,
+					transRule, cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+			insertEmphasisBegin(emphasisBuffer, at, capsRule, CAPS_BEGIN, CAPS_END,
+					CAPS_WORD, table, pos, mode, input, output, posMapping,
+					emphasisBuffer, transNoteBuffer, transRule, cursorPosition,
+					cursorStatus, compbrlStart, compbrlEnd);
+			insertEmphasisSymbol(emphasisBuffer, at, capsRule, CAPS_SYMBOL, table, pos,
+					mode, input, output, posMapping, emphasisBuffer, transNoteBuffer,
+					transRule, cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+		}
+		return;
+	}
+
+	/* The order of inserting the end symbols must be the reverse
+	 * of the insertions of the begin symbols so that they will
+	 * nest properly when multiple emphases start and end at
+	 * the same place */
+	// TODO: ordering with partial word using bit_word and bit_end
+
+	if (emphasisBuffer[at] & CAPS_EMPHASIS)
+		insertEmphasisEnd(emphasisBuffer, at, capsRule, CAPS_END, CAPS_WORD, table, pos,
+				mode, input, output, posMapping, emphasisBuffer, transNoteBuffer,
+				transRule, cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+
+	/* end bits */
+	for (i = 0; i < 10; i++)
+		if (i < 5)
+			type_counts[i] = endCount(emphasisBuffer, at, EMPHASIS_END << (i * 4),
+					EMPHASIS_BEGIN << (i * 4), EMPHASIS_WORD << (i * 4));
+		else
+			type_counts[i] = endCount(transNoteBuffer, at, TRANSNOTE_END << ((i - 5) * 4),
+					TRANSNOTE_BEGIN << ((i - 5) * 4), TRANSNOTE_WORD << ((i - 5) * 4));
+
+	for (i = 0; i < 10; i++) {
+		min = -1;
+		for (j = 0; j < 10; j++)
+			if (type_counts[j] > 0)
+				if (min < 0 || type_counts[j] < type_counts[min]) min = j;
+		if (min < 0) break;
+		type_counts[min] = 0;
+		if (min < 5)
+			insertEmphasisEnd(emphasisBuffer, at, emph1Rule + min,
+					EMPHASIS_END << (min * 4), EMPHASIS_WORD << (min * 4), table, pos,
+					mode, input, output, posMapping, emphasisBuffer, transNoteBuffer,
+					transRule, cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+		else
+			insertEmphasisEnd(transNoteBuffer, at, emph1Rule + min,
+					TRANSNOTE_END << ((min - 5) * 4), TRANSNOTE_WORD << ((min - 5) * 4),
+					table, pos, mode, input, output, posMapping, emphasisBuffer,
+					transNoteBuffer, transRule, cursorPosition, cursorStatus,
+					compbrlStart, compbrlEnd);
+	}
+
+	/* begin and word bits */
+	for (i = 0; i < 10; i++)
+		if (i < 5)
+			type_counts[i] = beginCount(emphasisBuffer, at, EMPHASIS_END << (i * 4),
+					EMPHASIS_BEGIN << (i * 4), EMPHASIS_WORD << (i * 4), table, input);
+		else
+			type_counts[i] = beginCount(transNoteBuffer, at,
+					TRANSNOTE_END << ((i - 5) * 4), TRANSNOTE_BEGIN << ((i - 5) * 4),
+					TRANSNOTE_WORD << ((i - 5) * 4), table, input);
+
+	for (i = 9; i >= 0; i--) {
+		max = 9;
+		for (j = 9; j >= 0; j--)
+			if (type_counts[max] < type_counts[j]) max = j;
+		if (!type_counts[max]) break;
+		type_counts[max] = 0;
+		if (max >= 5)
+			insertEmphasisBegin(transNoteBuffer, at, emph1Rule + max,
+					TRANSNOTE_BEGIN << ((max - 5) * 4), TRANSNOTE_END << ((max - 5) * 4),
+					TRANSNOTE_WORD << ((max - 5) * 4), table, pos, mode, input, output,
+					posMapping, emphasisBuffer, transNoteBuffer, transRule,
+					cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+		else
+			insertEmphasisBegin(emphasisBuffer, at, emph1Rule + max,
+					EMPHASIS_BEGIN << (max * 4), EMPHASIS_END << (max * 4),
+					EMPHASIS_WORD << (max * 4), table, pos, mode, input, output,
+					posMapping, emphasisBuffer, transNoteBuffer, transRule,
+					cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+	}
+
+	/* symbol bits */
+	for (i = 4; i >= 0; i--)
+		if (transNoteBuffer[at] & (TRANSNOTE_MASK << (i * 4)))
+			insertEmphasisSymbol(transNoteBuffer, at, emph6Rule + i,
+					TRANSNOTE_SYMBOL << (i * 4), table, pos, mode, input, output,
+					posMapping, emphasisBuffer, transNoteBuffer, transRule,
+					cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+	for (i = 4; i >= 0; i--)
+		if (emphasisBuffer[at] & (EMPHASIS_MASK << (i * 4)))
+			insertEmphasisSymbol(emphasisBuffer, at, emph1Rule + i,
+					EMPHASIS_SYMBOL << (i * 4), table, pos, mode, input, output,
+					posMapping, emphasisBuffer, transNoteBuffer, transRule,
+					cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+
+	/* insert graded 1 mode indicator */
+	if (transOpcode == CTO_Contraction) {
+		const TranslationTableRule *indicRule;
+		if (brailleIndicatorDefined(table->noContractSign, table, &indicRule))
+			for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen, 0, table,
+					pos, mode, input, output, posMapping, emphasisBuffer, transNoteBuffer,
+					transRule, cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+	}
+
+	/* insert capitalization last so it will be closest to word */
+	if (emphasisBuffer[at] & CAPS_EMPHASIS) {
+		insertEmphasisBegin(emphasisBuffer, at, capsRule, CAPS_BEGIN, CAPS_END, CAPS_WORD,
+				table, pos, mode, input, output, posMapping, emphasisBuffer,
+				transNoteBuffer, transRule, cursorPosition, cursorStatus, compbrlStart,
+				compbrlEnd);
+		insertEmphasisSymbol(emphasisBuffer, at, capsRule, CAPS_SYMBOL, table, pos, mode,
+				input, output, posMapping, emphasisBuffer, transNoteBuffer, transRule,
+				cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+	}
+}
+
+static void
+insertEmphases(const TranslationTableHeader *table, int *pos, int mode, InString input,
+		OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, int haveEmphasis, int transOpcode,
+		const TranslationTableRule **transRule, int *cursorPosition, int *cursorStatus,
+		int *pre_src, int compbrlStart, int compbrlEnd) {
+	int at;
+
+	for (at = *pre_src; at <= *pos; at++)
+		insertEmphasesAt(at, table, pos, mode, input, output, posMapping, emphasisBuffer,
+				transNoteBuffer, haveEmphasis, transOpcode, transRule, cursorPosition,
+				cursorStatus, compbrlStart, compbrlEnd);
+
+	*pre_src = *pos + 1;
+}
+
+static void
+checkNumericMode(const TranslationTableHeader *table, int *pos, int mode, InString input,
+		OutString *output, int *posMapping, unsigned int *emphasisBuffer,
+		unsigned int *transNoteBuffer, const TranslationTableRule **transRule,
+		int *cursorPosition, int *cursorStatus, int *dontContract, int compbrlStart,
+		int compbrlEnd, int *numericMode) {
+	int i;
+	const TranslationTableRule *indicRule;
+	if (!brailleIndicatorDefined(table->numberSign, table, &indicRule)) return;
+
+	/* not in numeric mode */
+	if (!*numericMode) {
+		if (checkAttr(input.chars[*pos], CTC_Digit | CTC_LitDigit, 0, table)) {
+			*numericMode = 1;
+			*dontContract = 1;
+			for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen, 0, table,
+					pos, mode, input, output, posMapping, emphasisBuffer, transNoteBuffer,
+					transRule, cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+		} else if (checkAttr(input.chars[*pos], CTC_NumericMode, 0, table)) {
+			for (i = *pos + 1; i < input.length; i++) {
+				if (checkAttr(input.chars[i], CTC_Digit | CTC_LitDigit, 0, table)) {
+					*numericMode = 1;
+					for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen,
+							0, table, pos, mode, input, output, posMapping,
+							emphasisBuffer, transNoteBuffer, transRule, cursorPosition,
+							cursorStatus, compbrlStart, compbrlEnd);
+					break;
+				} else if (!checkAttr(input.chars[i], CTC_NumericMode, 0, table))
+					break;
+			}
+		}
+	}
+
+	/* in numeric mode */
+	else {
+		if (!checkAttr(input.chars[*pos], CTC_Digit | CTC_LitDigit | CTC_NumericMode, 0,
+					table)) {
+			*numericMode = 0;
+			if (brailleIndicatorDefined(table->noContractSign, table, &indicRule))
+				if (checkAttr(input.chars[*pos], CTC_NumericNoContract, 0, table))
+					for_updatePositions(&indicRule->charsdots[0], 0, indicRule->dotslen,
+							0, table, pos, mode, input, output, posMapping,
+							emphasisBuffer, transNoteBuffer, transRule, cursorPosition,
+							cursorStatus, compbrlStart, compbrlEnd);
+		}
+	}
+}
+
+static int
+translateString(const TranslationTableHeader *table, int mode, int currentPass,
+		InString *input, OutString *output, int *posMapping, formtype *typebuf,
+		unsigned char *srcSpacing, unsigned char *destSpacing, unsigned int *wordBuffer,
+		unsigned int *emphasisBuffer, unsigned int *transNoteBuffer, int haveEmphasis,
+		int *realInlen, int *posIncremented, int *cursorPosition, int *cursorStatus,
+		int compbrlStart, int compbrlEnd) {
+	int pos;
+	int transOpcode;
+	int prevTransOpcode;
+	const TranslationTableRule *transRule;
+	int transCharslen;
+	int passCharDots;
+	const widechar *passInstructions;
+	int passIC; /* Instruction counter */
+	int startMatch;
+	int startReplace;
+	int endReplace;
+	int endMatch;
+	TranslationTableRule *groupingRule;
+	widechar groupingOp;
+	int numericMode;
+	int dontContract;
+	int destword;
+	int srcword;
+	int pre_src;
+	TranslationTableCharacter *curCharDef;
+	const widechar *repwordStart;
+	int repwordLength;
+	int curType;
+	int prevType;
+	int prevTypeform;
+	int prevPos;
+	/* Main translation routine */
+	int k;
+	translation_direction = 1;
+	markSyllables(table, *input, typebuf, &transOpcode, &transRule, &transCharslen);
+	numericMode = 0;
+	srcword = 0;
+	destword = 0; /* last word translated */
+	dontContract = 0;
+	prevTransOpcode = CTO_None;
+	prevType = curType = prevTypeform = plain_text;
+	prevPos = -1;
+	pos = output->length = 0;
+	*posIncremented = 1;
+	pre_src = 0;
+	_lou_resetPassVariables();
+	if (typebuf && table->emphRules[capsRule][letterOffset])
+		for (k = 0; k < input->length; k++)
+			if (checkAttr(input->chars[k], CTC_UpperCase, 0, table))
+				typebuf[k] |= CAPSEMPH;
+
+	markEmphases(table, *input, typebuf, wordBuffer, emphasisBuffer, transNoteBuffer,
+			haveEmphasis, cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+
+	while (pos < input->length) { /* the main translation loop */
+		TranslationTableCharacterAttributes beforeAttributes;
+		setBefore(table, pos, *input, &beforeAttributes);
+		if (!insertBrailleIndicators(0, table, &pos, mode, *input, output, posMapping,
+					typebuf, haveEmphasis, emphasisBuffer, transNoteBuffer, transOpcode,
+					prevTransOpcode, &transRule, cursorPosition, cursorStatus,
+					compbrlStart, compbrlEnd, beforeAttributes, &prevType, &curType,
+					&prevTypeform, prevPos))
+			goto failure;
+		if (pos >= input->length) break;
+
+		// insertEmphases();
+		if (!dontContract) dontContract = typebuf[pos] & no_contract;
+		if (typebuf[pos] & no_translate) {
+			widechar c = _lou_getDotsForChar(input->chars[pos]);
+			if (input->chars[pos] < 32 || input->chars[pos] > 126) goto failure;
+			if (!for_updatePositions(&c, 1, 1, 0, table, &pos, mode, *input, output,
+						posMapping, emphasisBuffer, transNoteBuffer, &transRule,
+						cursorPosition, cursorStatus, compbrlStart, compbrlEnd))
+				goto failure;
+			pos++;
+			/* because we don't call insertEmphasis */
+			pre_src = pos;
+			continue;
+		}
+		for_selectRule(table, pos, *output, mode, *input, typebuf, emphasisBuffer,
+				transNoteBuffer, &transOpcode, prevTransOpcode, &transRule,
+				&transCharslen, &passCharDots, &passInstructions, &passIC, &startMatch,
+				&startReplace, &endReplace, &endMatch, *posIncremented, *cursorPosition,
+				&repwordStart, &repwordLength, dontContract, compbrlStart, compbrlEnd,
+				beforeAttributes, &curCharDef, &groupingRule, &groupingOp);
+
+		if (transOpcode != CTO_Context)
+			if (appliedRules != NULL && appliedRulesCount < maxAppliedRules)
+				appliedRules[appliedRulesCount++] = transRule;
+		*posIncremented = 1;
+		prevPos = pos;
+		switch (transOpcode) /* Rules that pre-empt context and swap */
+		{
+		case CTO_CompBrl:
+		case CTO_Literal:
+			if (!doCompbrl(table, &pos, mode, *input, output, posMapping, emphasisBuffer,
+						transNoteBuffer, &transRule, cursorPosition, cursorStatus,
+						destword, srcword, compbrlStart, compbrlEnd))
+				goto failure;
+			continue;
+		default:
+			break;
+		}
+		if (!insertBrailleIndicators(1, table, &pos, mode, *input, output, posMapping,
+					typebuf, haveEmphasis, emphasisBuffer, transNoteBuffer, transOpcode,
+					prevTransOpcode, &transRule, cursorPosition, cursorStatus,
+					compbrlStart, compbrlEnd, beforeAttributes, &prevType, &curType,
+					&prevTypeform, prevPos))
+			goto failure;
+
+		//		if(transOpcode == CTO_Contraction)
+		//		if(brailleIndicatorDefined(table->noContractSign))
+		//		if(!for_updatePositions(
+		//			&indicRule->charsdots[0], 0, indicRule->dotslen, 0))
+		//			goto failure;
+		insertEmphases(table, &pos, mode, *input, output, posMapping, emphasisBuffer,
+				transNoteBuffer, haveEmphasis, transOpcode, &transRule, cursorPosition,
+				cursorStatus, &pre_src, compbrlStart, compbrlEnd);
+		if (table->usesNumericMode)
+			checkNumericMode(table, &pos, mode, *input, output, posMapping,
+					emphasisBuffer, transNoteBuffer, &transRule, cursorPosition,
+					cursorStatus, &dontContract, compbrlStart, compbrlEnd, &numericMode);
+
+		if (transOpcode == CTO_Context ||
+				findForPassRule(table, pos, currentPass, *input, &transOpcode, &transRule,
+						&transCharslen, &passCharDots, &passInstructions, &passIC,
+						&startMatch, &startReplace, &endReplace, &endMatch, &groupingRule,
+						&groupingOp))
+			switch (transOpcode) {
+			case CTO_Context:
+				if (appliedRules != NULL && appliedRulesCount < maxAppliedRules)
+					appliedRules[appliedRulesCount++] = transRule;
+				if (!passDoAction(table, &pos, mode, input, output, posMapping,
+							emphasisBuffer, transNoteBuffer, transOpcode, &transRule,
+							passCharDots, passInstructions, &passIC, startMatch,
+							startReplace, &endReplace, endMatch, cursorPosition,
+							cursorStatus, compbrlStart, compbrlEnd, groupingRule,
+							groupingOp))
+					goto failure;
+				if (endReplace == pos) *posIncremented = 0;
+				pos = endReplace;
+				continue;
+			default:
+				break;
+			}
+
+		/* Processing before replacement */
+
+		/* check if leaving no contraction (grade 1) mode */
+		if (checkAttr(input->chars[pos], CTC_SeqDelimiter | CTC_Space, 0, table))
+			dontContract = 0;
+
+		switch (transOpcode) {
+		case CTO_EndNum:
+			if (table->letterSign && checkAttr(input->chars[pos], CTC_Letter, 0, table))
+				output->length--;
+			break;
+		case CTO_Repeated:
+		case CTO_Space:
+			dontContract = 0;
+			break;
+		case CTO_LargeSign:
+			if (prevTransOpcode == CTO_LargeSign) {
+				int hasEndSegment = 0;
+				while (output->length > 0 && checkAttr(output->chars[output->length - 1],
+													 CTC_Space, 1, table)) {
+					if (output->chars[output->length - 1] == ENDSEGMENT) {
+						hasEndSegment = 1;
+					}
+					output->length--;
+				}
+				if (hasEndSegment != 0) {
+					output->chars[output->length] = 0xffff;
+					output->length++;
+				}
+			}
+			break;
+		case CTO_DecPoint:
+			if (!table->usesNumericMode && table->numberSign) {
+				TranslationTableRule *numRule =
+						(TranslationTableRule *)&table->ruleArea[table->numberSign];
+				if (!for_updatePositions(&numRule->charsdots[numRule->charslen],
+							numRule->charslen, numRule->dotslen, 0, table, &pos, mode,
+							*input, output, posMapping, emphasisBuffer, transNoteBuffer,
+							&transRule, cursorPosition, cursorStatus, compbrlStart,
+							compbrlEnd))
+					goto failure;
+			}
+			transOpcode = CTO_MidNum;
+			break;
+		case CTO_NoCont:
+			if (!dontContract)
+				doNocont(table, &pos, output, mode, *input, destword, srcword,
+						&dontContract);
+			continue;
+		default:
+			break;
+		} /* end of action */
+
+		/* replacement processing */
+		switch (transOpcode) {
+		case CTO_Replace:
+			pos += transCharslen;
+			if (!putCharacters(&transRule->charsdots[transCharslen], transRule->dotslen,
+						table, &pos, mode, *input, output, posMapping, emphasisBuffer,
+						transNoteBuffer, &transRule, cursorPosition, cursorStatus,
+						compbrlStart, compbrlEnd))
+				goto failure;
+			break;
+		case CTO_None:
+			if (!undefinedCharacter(input->chars[pos], table, &pos, mode, *input, output,
+						posMapping, emphasisBuffer, transNoteBuffer, &transRule,
+						cursorPosition, cursorStatus, compbrlStart, compbrlEnd))
+				goto failure;
+			pos++;
+			break;
+		case CTO_UpperCase:
+			/* Only needs special handling if not within compbrl and
+			 * the table defines a capital sign. */
+			if (!(mode & (compbrlAtCursor | compbrlLeftCursor) && pos >= compbrlStart &&
+						pos <= compbrlEnd) &&
+					(transRule->dotslen == 1 &&
+							table->emphRules[capsRule][letterOffset])) {
+				putCharacter(curCharDef->lowercase, table, &pos, mode, *input, output,
+						posMapping, emphasisBuffer, transNoteBuffer, &transRule,
+						cursorPosition, cursorStatus, compbrlStart, compbrlEnd);
+				pos++;
+				break;
+			}
+		//		case CTO_Contraction:
+		//
+		//			if(brailleIndicatorDefined(table->noContractSign))
+		//			if(!for_updatePositions(
+		//				&indicRule->charsdots[0], 0, indicRule->dotslen, 0))
+		//				goto failure;
+
+		default:
+			if (*cursorStatus == 2)
+				*cursorStatus = 1;
+			else {
+				if (transRule->dotslen) {
+					if (!for_updatePositions(&transRule->charsdots[transCharslen],
+								transCharslen, transRule->dotslen, 0, table, &pos, mode,
+								*input, output, posMapping, emphasisBuffer,
+								transNoteBuffer, &transRule, cursorPosition, cursorStatus,
+								compbrlStart, compbrlEnd))
+						goto failure;
+				} else {
+					for (k = 0; k < transCharslen; k++) {
+						if (!putCharacter(input->chars[pos], table, &pos, mode, *input,
+									output, posMapping, emphasisBuffer, transNoteBuffer,
+									&transRule, cursorPosition, cursorStatus,
+									compbrlStart, compbrlEnd))
+							goto failure;
+						pos++;
+					}
+				}
+				if (*cursorStatus == 2)
+					*cursorStatus = 1;
+				else if (transRule->dotslen)
+					pos += transCharslen;
+			}
+			break;
+		}
+
+		/* processing after replacement */
+		switch (transOpcode) {
+		case CTO_Repeated: {
+			/* Skip repeated characters. */
+			int srclim = input->length - transCharslen;
+			if (mode & (compbrlAtCursor | compbrlLeftCursor) && compbrlStart < srclim)
+				/* Don't skip characters from compbrlStart onwards. */
+				srclim = compbrlStart - 1;
+			while ((pos <= srclim) &&
+					compareChars(&transRule->charsdots[0], &input->chars[pos],
+							transCharslen, 0, table)) {
+				/* Map skipped input positions to the previous output position. */
+				/* if (posMapping.outputPositions != NULL) { */
+				/* 	int tcc; */
+				/* 	for (tcc = 0; tcc < transCharslen; tcc++) */
+				/* 		posMapping.outputPositions[posMapping.prev[pos + tcc]] = */
+				/* 				output->length - 1; */
+				/* } */
+				if (!*cursorStatus && pos <= *cursorPosition &&
+						*cursorPosition < pos + transCharslen) {
+					*cursorStatus = 1;
+					*cursorPosition = output->length - 1;
+				}
+				pos += transCharslen;
+			}
+			break;
+		}
+		case CTO_RepWord: {
+			/* Skip repeated characters. */
+			int srclim = input->length - transCharslen;
+			if (mode & (compbrlAtCursor | compbrlLeftCursor) && compbrlStart < srclim)
+				/* Don't skip characters from compbrlStart onwards. */
+				srclim = compbrlStart - 1;
+			while ((pos <= srclim) && compareChars(repwordStart, &input->chars[pos],
+											  repwordLength, 0, table)) {
+				/* Map skipped input positions to the previous output position. */
+				/* if (posMapping.outputPositions != NULL) { */
+				/* 	int tcc; */
+				/* 	for (tcc = 0; tcc < transCharslen; tcc++) */
+				/* 		posMapping.outputPositions[posMapping.prev[pos + tcc]] = */
+				/* 				output->length - 1; */
+				/* } */
+				if (!*cursorStatus && pos <= *cursorPosition &&
+						*cursorPosition < pos + transCharslen) {
+					*cursorStatus = 1;
+					*cursorPosition = output->length - 1;
+				}
+				pos += repwordLength + transCharslen;
+			}
+			pos -= transCharslen;
+			break;
+		}
+		case CTO_JoinNum:
+		case CTO_JoinableWord:
+			while (pos < input->length &&
+					checkAttr(input->chars[pos], CTC_Space, 0, table) &&
+					input->chars[pos] != ENDSEGMENT)
+				pos++;
+			break;
+		default:
+			break;
+		}
+		if (((pos > 0) && checkAttr(input->chars[pos - 1], CTC_Space, 0, table) &&
+					(transOpcode != CTO_JoinableWord))) {
+			srcword = pos;
+			destword = output->length;
+		}
+		if (srcSpacing != NULL && srcSpacing[pos] >= '0' && srcSpacing[pos] <= '9')
+			destSpacing[output->length] = srcSpacing[pos];
+		if ((transOpcode >= CTO_Always && transOpcode <= CTO_None) ||
+				(transOpcode >= CTO_Digit && transOpcode <= CTO_LitDigit))
+			prevTransOpcode = transOpcode;
+	}
+
+	transOpcode = CTO_Space;
+	insertEmphases(table, &pos, mode, *input, output, posMapping, emphasisBuffer,
+			transNoteBuffer, haveEmphasis, transOpcode, &transRule, cursorPosition,
+			cursorStatus, &pre_src, compbrlStart, compbrlEnd);
+
+failure:
+	if (destword != 0 && pos < input->length &&
+			!checkAttr(input->chars[pos], CTC_Space, 0, table)) {
+		pos = srcword;
+		output->length = destword;
+	}
+	if (pos < input->length) {
+		while (checkAttr(input->chars[pos], CTC_Space, 0, table))
+			if (++pos == input->length) break;
+	}
+	if (realInlen) *realInlen = pos;
+	return 1;
+} /* first pass translation completed */
+
+int EXPORT_CALL
+lou_hyphenate(const char *tableList, const widechar *inbuf, int inlen, char *hyphens,
+		int mode) {
+#define HYPHSTRING 100
+	const TranslationTableHeader *table;
+	widechar workingBuffer[HYPHSTRING];
+	int k, kk;
+	int wordStart;
+	int wordEnd;
+	table = lou_getTable(tableList);
+	if (table == NULL || inbuf == NULL || hyphens == NULL ||
+			table->hyphenStatesArray == 0 || inlen >= HYPHSTRING)
+		return 0;
+	if (mode != 0) {
+		k = inlen;
+		kk = HYPHSTRING;
+		if (!lou_backTranslate(tableList, inbuf, &k, &workingBuffer[0], &kk, NULL, NULL,
+					NULL, NULL, NULL, 0))
+			return 0;
+	} else {
+		memcpy(&workingBuffer[0], inbuf, CHARSIZE * inlen);
+		kk = inlen;
+	}
+	for (wordStart = 0; wordStart < kk; wordStart++)
+		if (((findCharOrDots(workingBuffer[wordStart], 0, table))->attributes &
+					CTC_Letter))
+			break;
+	if (wordStart == kk) return 0;
+	for (wordEnd = kk - 1; wordEnd >= 0; wordEnd--)
+		if (((findCharOrDots(workingBuffer[wordEnd], 0, table))->attributes & CTC_Letter))
+			break;
+	for (k = wordStart; k <= wordEnd; k++) {
+		TranslationTableCharacter *c = findCharOrDots(workingBuffer[k], 0, table);
+		if (!(c->attributes & CTC_Letter)) return 0;
+	}
+	if (!hyphenate(&workingBuffer[wordStart], wordEnd - wordStart + 1,
+				&hyphens[wordStart], table))
+		return 0;
+	for (k = 0; k <= wordStart; k++) hyphens[k] = '0';
+	if (mode != 0) {
+		widechar workingBuffer2[HYPHSTRING];
+		int outputPos[HYPHSTRING];
+		char hyphens2[HYPHSTRING];
+		kk = wordEnd - wordStart + 1;
+		k = HYPHSTRING;
+		if (!lou_translate(tableList, &workingBuffer[wordStart], &kk, &workingBuffer2[0],
+					&k, NULL, NULL, &outputPos[0], NULL, NULL, 0))
+			return 0;
+		for (kk = 0; kk < k; kk++) {
+			int hyphPos = outputPos[kk];
+			if (hyphPos > k || hyphPos < 0) break;
+			if (hyphens[wordStart + kk] & 1)
+				hyphens2[hyphPos] = '1';
+			else
+				hyphens2[hyphPos] = '0';
+		}
+		for (kk = wordStart; kk < wordStart + k; kk++)
+			if (hyphens2[kk] == '0') hyphens[kk] = hyphens2[kk];
+	}
+	for (k = 0; k < inlen; k++)
+		if (hyphens[k] & 1)
+			hyphens[k] = '1';
+		else
+			hyphens[k] = '0';
+	hyphens[inlen] = 0;
+	return 1;
+}
+
+int EXPORT_CALL
+lou_dotsToChar(
+		const char *tableList, widechar *inbuf, widechar *outbuf, int length, int mode) {
+	const TranslationTableHeader *table;
+	int k;
+	widechar dots;
+	if (tableList == NULL || inbuf == NULL || outbuf == NULL) return 0;
+
+	table = lou_getTable(tableList);
+	if (table == NULL || length <= 0) return 0;
+	for (k = 0; k < length; k++) {
+		dots = inbuf[k];
+		if (!(dots & B16) && (dots & 0xff00) == 0x2800) /* Unicode braille */
+			dots = (dots & 0x00ff) | B16;
+		outbuf[k] = _lou_getCharFromDots(dots);
+	}
+	return 1;
+}
+
+int EXPORT_CALL
+lou_charToDots(const char *tableList, const widechar *inbuf, widechar *outbuf, int length,
+		int mode) {
+	const TranslationTableHeader *table;
+	int k;
+	if (tableList == NULL || inbuf == NULL || outbuf == NULL) return 0;
+
+	table = lou_getTable(tableList);
+	if (table == NULL || length <= 0) return 0;
+	for (k = 0; k < length; k++)
+		if ((mode & ucBrl))
+			outbuf[k] = ((_lou_getDotsForChar(inbuf[k]) & 0xff) | 0x2800);
+		else
+			outbuf[k] = _lou_getDotsForChar(inbuf[k]);
+	return 1;
+}
diff --git a/liblouis/liblouis/maketable.c b/liblouis/liblouis/maketable.c
new file mode 100644
index 0000000..f4ebbef
--- /dev/null
+++ b/liblouis/liblouis/maketable.c
@@ -0,0 +1,449 @@
+/* liblouis Braille Translation and Back-Translation Library
+
+   Copyright (C) 2017 Bert Frees
+
+   This file is part of liblouis.
+
+   liblouis is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation, either version 2.1 of the License, or
+   (at your option) any later version.
+
+   liblouis is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "internal.h"
+
+static const TranslationTableHeader *table;
+
+extern void
+loadTable(const char *tableList) {
+	table = lou_getTable(tableList);
+}
+
+extern int
+hyphenationEnabled() {
+	return table->hyphenStatesArray;
+}
+
+extern int
+isLetter(widechar c) {
+	static unsigned long int hash;
+	static TranslationTableOffset offset;
+	static TranslationTableCharacter *character;
+	hash = (unsigned long int)c % HASHNUM;
+	offset = table->characters[hash];
+	while (offset) {
+		character = (TranslationTableCharacter *)&table->ruleArea[offset];
+		if (character->realchar == c) return character->attributes & CTC_Letter;
+		offset = character->next;
+	}
+	return 0;
+}
+
+extern widechar
+toLowercase(widechar c) {
+	static unsigned long int hash;
+	static TranslationTableOffset offset;
+	static TranslationTableCharacter *character;
+	hash = (unsigned long int)c % HASHNUM;
+	offset = table->characters[hash];
+	while (offset) {
+		character = (TranslationTableCharacter *)&table->ruleArea[offset];
+		if (character->realchar == c) return character->lowercase;
+		offset = character->next;
+	}
+	return c;
+}
+
+extern void
+toDotPattern(widechar *braille, char *pattern) {
+	int length;
+	widechar *dots;
+	int i;
+	for (length = 0; braille[length]; length++)
+		;
+	dots = (widechar *)malloc((length + 1) * sizeof(widechar));
+	for (i = 0; i < length; i++) dots[i] = _lou_getDotsForChar(braille[i]);
+	strcpy(pattern, _lou_showDots(dots, length));
+	free(dots);
+}
+
+extern int
+printRule(TranslationTableRule *rule, widechar *rule_string) {
+	int k, l;
+	switch (rule->opcode) {
+	case CTO_Context:
+	case CTO_Correct:
+	case CTO_SwapCd:
+	case CTO_SwapDd:
+	case CTO_Pass2:
+	case CTO_Pass3:
+	case CTO_Pass4:
+		return 0;
+	default:
+		l = 0;
+		const char *opcode = _lou_findOpcodeName(rule->opcode);
+		for (k = 0; k < strlen(opcode); k++) rule_string[l++] = opcode[k];
+		rule_string[l++] = ' ';
+		for (k = 0; k < rule->charslen; k++) rule_string[l++] = rule->charsdots[k];
+		rule_string[l++] = ' ';
+		for (k = 0; k < rule->dotslen; k++)
+			rule_string[l++] = _lou_getCharFromDots(rule->charsdots[rule->charslen + k]);
+		rule_string[l++] = '\0';
+		return 1;
+	}
+}
+
+#define DEBUG 0
+
+#if DEBUG
+#define debug(fmt, ...)                                                     \
+	do {                                                                    \
+		if (DEBUG) printf("%*s" fmt "\n", debug_indent, "", ##__VA_ARGS__); \
+	} while (0)
+#else
+#define debug(fmt, ...)
+#endif
+
+static int
+find_matching_rules(widechar *text, int text_len, widechar *braille, int braille_len,
+		char *data, int clear_data) {
+	unsigned long int hash;
+	TranslationTableOffset offset;
+	TranslationTableRule *rule;
+	TranslationTableCharacter *character;
+	char *data_save;
+	int hash_len, k;
+#if DEBUG
+	static int initial_text_len = 0;
+	int debug_indent = 0;
+	if (data[-1] == '^') {
+		initial_text_len = text_len;
+		for (k = 0; k < text_len; k++) printf("%c", text[k]);
+		printf(" <=> ");
+		for (k = 0; k < braille_len; k++) printf("%c", braille[k]);
+		printf("\n");
+	} else
+		debug_indent = initial_text_len - text_len;
+#endif
+
+	/* finish */
+	if (text_len == 0 && braille_len == 0) {
+		data[-1] = '$';
+		return 1;
+	}
+
+	/* save data */
+	data_save = (char *)malloc(text_len * sizeof(char));
+	memcpy(data_save, data, text_len);
+
+	for (k = 0; k < text_len; k++)
+		if (data[k] == ')')
+			data[k] = '>';
+		else if (clear_data)
+			data[k] = '-';
+	debug("%s", data);
+
+	/* iterate over rules */
+	for (hash_len = 2; hash_len >= 1; hash_len--) {
+		offset = 0;
+		switch (hash_len) {
+		case 2:
+			if (text_len < 2) break;
+			hash = (unsigned long int)toLowercase(text[0]) << 8;
+			hash += (unsigned long int)toLowercase(text[1]);
+			hash %= HASHNUM;
+			offset = table->forRules[hash];
+			break;
+		case 1:
+			hash = (unsigned long int)text[0] % HASHNUM;
+			offset = table->characters[hash];
+			while (offset) {
+				character = (TranslationTableCharacter *)&table->ruleArea[offset];
+				if (character->realchar == text[0]) {
+					offset = character->otherRules;
+					break;
+				} else
+					offset = character->next;
+			}
+		}
+		while (offset) {
+			rule = (TranslationTableRule *)&table->ruleArea[offset];
+#if DEBUG
+			widechar print_string[128];
+			printRule(rule, print_string);
+			printf("%*s=> ", debug_indent, "");
+			for (k = 0; print_string[k]; k++) printf("%c", print_string[k]);
+			printf("\n");
+#endif
+
+			/* select rule */
+			if (rule->charslen == 0 || rule->dotslen == 0) goto next_rule;
+			if (rule->charslen > text_len) goto next_rule;
+			switch (rule->opcode) {
+			case CTO_WholeWord:
+				if (data[-1] == '^' && rule->charslen == text_len) break;
+				goto next_rule;
+			case CTO_SuffixableWord:
+				if (data[-1] == '^') break;
+				goto next_rule;
+			case CTO_PrefixableWord:
+				if (rule->charslen == text_len) break;
+				goto next_rule;
+			case CTO_BegWord:
+				if (data[-1] == '^' && rule->charslen < text_len) break;
+				goto next_rule;
+			case CTO_BegMidWord:
+				if (rule->charslen < text_len) break;
+				goto next_rule;
+			case CTO_MidWord:
+				if (data[-1] != '^' && rule->charslen < text_len) break;
+				goto next_rule;
+			case CTO_MidEndWord:
+				if (data[-1] != '^') break;
+				goto next_rule;
+			case CTO_EndWord:
+				if (data[-1] != '^' && rule->charslen == text_len) break;
+				goto next_rule;
+			case CTO_NoCross:
+				break;
+			case CTO_Letter:
+			case CTO_UpperCase:
+			case CTO_LowerCase:
+			case CTO_Punctuation:
+			case CTO_Always:
+				break;
+			default:
+				goto next_rule;
+			}
+			for (k = 0; k < rule->charslen; k++)
+				if (rule->charsdots[k] != text[k]) goto next_rule;
+			debug("** rule selected **");
+
+			/* inhibit rule */
+			if (rule->dotslen > braille_len ||
+					rule->charslen == text_len && rule->dotslen < braille_len ||
+					rule->dotslen == braille_len && rule->charslen < text_len)
+				goto inhibit;
+			for (k = 0; k < rule->dotslen; k++)
+				if (_lou_getCharFromDots(rule->charsdots[rule->charslen + k]) !=
+						braille[k])
+					goto inhibit;
+
+			/* don't let this rule be inhibited by an earlier rule */
+			int inhibit_all = 0;
+			if (rule->opcode == CTO_NoCross)
+				for (k = 0; k < rule->charslen - 1; k++)
+					if (data[k + 1] == '>')
+						if (data[-1] == 'x')
+							inhibit_all = 1;
+						else
+							goto next_rule;
+
+			/* fill data */
+			switch (rule->opcode) {
+			case CTO_NoCross:  // deferred: see success
+				break;
+			default:
+				k = 0;
+				while (k < rule->charslen - 1) {
+					if (data[k + 1] == '>') {
+						data[k++] = '1';
+						memset(&data[k], '-', text_len - k);
+					} else
+						data[k++] = 'x';
+				}
+			}
+			if (data[rule->charslen] == '>' || data[rule->charslen] == ')') {
+				data[rule->charslen - 1] = '1';
+				memset(&data[rule->charslen], '-', text_len - rule->charslen);
+			} else
+				data[rule->charslen - 1] = 'x';
+			debug("%s", data);
+
+			/* recur */
+			if (find_matching_rules(&text[rule->charslen], text_len - rule->charslen,
+						&braille[rule->dotslen], braille_len - rule->dotslen,
+						&data[rule->charslen], inhibit_all))
+				goto success;
+
+		inhibit:
+			debug("** rule inhibited **");
+			switch (rule->opcode) {
+			case CTO_NoCross:
+				if (rule->charslen < 2) goto abort;
+				/* inhibited by earlier rule */
+				for (k = 0; k < rule->charslen - 1; k++)
+					if (data[k + 1] == '>' && data[-1] != 'x') goto next_rule;
+				data[rule->charslen - 1] = ')';
+				debug("%s", data);
+				goto next_rule;
+			default:
+				goto abort;
+			}
+
+		success:
+			/* fill data (deferred) */
+			if (inhibit_all) data[-1] = '1';
+			switch (rule->opcode) {
+			case CTO_NoCross:
+				memset(data, '0', rule->charslen - 1);
+				debug("%s", data);
+			}
+			free(data_save);
+			return 1;
+
+		next_rule:
+			offset = rule->charsnext;
+		}
+	}
+
+abort:
+	/* restore data */
+	memcpy(data, data_save, text_len);
+	free(data_save);
+	debug("** abort **");
+	return 0;
+}
+
+/*
+ * - begin with all -
+ * - set cursor position right before the word
+ * - put a ^
+ * - match rules
+ *   - when a rule has been selected
+ *     - if the braille does not match: try inhibiting the rule
+ *       - if it's a nocross rule (longer than a single character)
+ *         - if there's a > within or right after the rule and there's no x right before
+ *           the rule
+ *           - already inhibited
+ *         - else: put a ) at the position right after the rule
+ *       - else: abort this match
+ *     - else (the braille does match)
+ *       - if it's a nocross rule
+ *         - if there's a > within or right after the rule
+ *           - if there's a x at the position right before the rule
+ *             - put a 1 at that position
+ *             - reset all >
+ *           - else
+ *             - continue with next matched rule
+ *         - put a 0 at each position within the rule
+ *       - else
+ *         - for each position within the rule
+ *           - if there's a > at the next position
+ *             - put a 1
+ *             - reset all >
+ *           - else put a x
+ *       - move cursor to the position right after the rule
+ *       - put a $ if we're at the end of the word
+ *       - change all ) to >
+ *       - else if there's a > or a ) at the next position
+ *         - put a 1
+ *         - reset all >
+ *         - match rules at the new cursor position
+ *           - if match was aborted
+ *             - revert changes
+ *             - try inhibiting the last rule
+ *             - go back to the position before the rule
+ *             - continue with next matched rule
+ *       - else put a x
+ */
+extern int
+suggestChunks(widechar *text, widechar *braille, char *hyphen_string) {
+	int text_len, braille_len;
+	for (text_len = 0; text[text_len]; text_len++)
+		;
+	for (braille_len = 0; braille[braille_len]; braille_len++)
+		;
+	if (text_len == 0 || braille_len == 0) return 0;
+	hyphen_string[0] = '^';
+	hyphen_string[text_len + 1] = '\0';
+	memset(&hyphen_string[1], '-', text_len);
+	return find_matching_rules(
+			text, text_len, braille, braille_len, &hyphen_string[1], 0);
+}
+
+extern void
+findRelevantRules(widechar *text, widechar **rules_str) {
+	int text_len, rules_len;
+	unsigned long int hash;
+	TranslationTableOffset offset;
+	TranslationTableCharacter *character;
+	TranslationTableRule *rule;
+	TranslationTableRule **rules;
+	int hash_len, k, l, m, n;
+	for (text_len = 0; text[text_len]; text_len++)
+		;
+	for (rules_len = 0; rules_str[rules_len]; rules_len++)
+		;
+	rules = (TranslationTableRule **)malloc(
+			(rules_len + 1) * sizeof(TranslationTableRule *));
+	m = n = 0;
+	while (text[n]) {
+		for (hash_len = 2; hash_len >= 1; hash_len--) {
+			offset = 0;
+			switch (hash_len) {
+			case 2:
+				if (text_len - n < 2) break;
+				hash = (unsigned long int)toLowercase(text[n]) << 8;
+				hash += (unsigned long int)toLowercase(text[n + 1]);
+				hash %= HASHNUM;
+				offset = table->forRules[hash];
+				break;
+			case 1:
+				hash = (unsigned long int)text[n] % HASHNUM;
+				offset = table->characters[hash];
+				while (offset) {
+					character = (TranslationTableCharacter *)&table->ruleArea[offset];
+					if (character->realchar == text[0]) {
+						offset = character->otherRules;
+						break;
+					} else
+						offset = character->next;
+				}
+			}
+			while (offset) {
+				rule = (TranslationTableRule *)&table->ruleArea[offset];
+				switch (rule->opcode) {
+				case CTO_Always:
+				case CTO_WholeWord:
+				case CTO_SuffixableWord:
+				case CTO_PrefixableWord:
+				case CTO_BegWord:
+				case CTO_BegMidWord:
+				case CTO_MidWord:
+				case CTO_MidEndWord:
+				case CTO_EndWord:
+				case CTO_NoCross:
+					break;
+				default:
+					goto next_rule;
+				}
+				if (rule->charslen == 0 || rule->dotslen == 0 ||
+						rule->charslen > text_len - n)
+					goto next_rule;
+				for (k = 0; k < rule->charslen; k++)
+					if (rule->charsdots[k] != text[n + k]) goto next_rule;
+				rules[m++] = rule;
+				if (m == rules_len) goto finish;
+			next_rule:
+				offset = rule->charsnext;
+			}
+		}
+		n++;
+	}
+finish:
+	rules_str[m--] = NULL;
+	for (; m >= 0; m--) printRule(rules[m], rules_str[m]);
+	free(rules);
+}
diff --git a/liblouis/liblouis/metadata.c b/liblouis/liblouis/metadata.c
new file mode 100644
index 0000000..43a3a1e
--- /dev/null
+++ b/liblouis/liblouis/metadata.c
@@ -0,0 +1,659 @@
+/* liblouis Braille Translation and Back-Translation Library
+
+   Copyright (C) 2015 Bert Frees <bertfrees@gmail.com>
+
+   This file is part of liblouis.
+
+   liblouis is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation, either version 2.1 of the License, or
+   (at your option) any later version.
+
+   liblouis is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file
+ * @brief Find translation tables
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#ifdef _MSC_VER
+#include <windows.h>
+#else
+#include <dirent.h>
+#endif
+#include <sys/stat.h>
+#include "internal.h"
+#include "config.h"
+
+/* =============================== LIST =================================== */
+
+typedef struct List {
+	void *head;
+	void (*free)(void *);
+	struct List *tail;
+} List;
+
+/**
+ * Returns a list with the element `x' added to `list'. Returns a sorted list
+ * if `cmp' is not NULL and if `list' is also sorted. New elements replace
+ * existing ones if they are equal according to `cmp'. If `cmp' is NULL,
+ * elements are simply prepended to the list. The function `dup' is used to
+ * duplicate elements before they are added to the list. The `free' function
+ * is used to free elements when they are removed from the list. The returned
+ * list must be freed by the caller.
+ */
+static List *
+list_conj(List *list, void *x, int (*cmp)(void *, void *), void *(*dup)(void *),
+		void (*free)(void *)) {
+	if (!list) {
+		list = malloc(sizeof(List));
+		list->head = dup ? dup(x) : x;
+		list->free = free;
+		list->tail = NULL;
+		return list;
+	} else if (!cmp) {
+		List *l = malloc(sizeof(List));
+		l->head = dup ? dup(x) : x;
+		l->free = free;
+		l->tail = list;
+		return l;
+	} else {
+		List *l1 = list;
+		List *l2 = NULL;
+		while (l1) {
+			int c = cmp(l1->head, x);
+			if (c > 0)
+				break;
+			else if (c < 0) {
+				l2 = l1;
+				l1 = l2->tail;
+			} else {
+				if (x != l1->head && !dup && free) free(x);
+				return list;
+			}
+		}
+		List *l3 = malloc(sizeof(List));
+		l3->head = dup ? dup(x) : x;
+		l3->free = free;
+		l3->tail = l1;
+		if (!l2)
+			list = l3;
+		else
+			l2->tail = l3;
+		return list;
+	}
+}
+
+/**
+ * Free an instance of type List.
+ */
+static void
+list_free(List *list) {
+	if (list) {
+		if (list->free) list->free(list->head);
+		list_free(list->tail);
+		free(list);
+	}
+}
+
+/**
+ * Sort a list based on a comparison function.
+ */
+static List *
+list_sort(List *list, int (*cmp)(void *, void *)) {
+	List *newList = NULL;
+	List *l;
+	for (l = list; l; l = l->tail) {
+		newList = list_conj(newList, l->head, cmp, NULL, l->free);
+		l->free = NULL;
+	}
+	list_free(list);
+	return newList;
+}
+
+/**
+ * Get the size of a list.
+ */
+static int
+list_size(List *list) {
+	int len = 0;
+	List *l;
+	for (l = list; l; l = l->tail) len++;
+	return len;
+}
+
+/**
+ * Convert a list into a NULL terminated array.
+ */
+static void **
+list_toArray(List *list, void *(*dup)(void *)) {
+	void **array;
+	List *l;
+	int i;
+	array = malloc((1 + list_size(list)) * sizeof(void *));
+	i = 0;
+	for (l = list; l; l = l->tail) array[i++] = dup ? dup(l->head) : l->head;
+	array[i] = NULL;
+	return array;
+}
+
+/* ============================== FEATURE ================================= */
+
+typedef struct {
+	char *key;
+	char *val;
+} Feature;
+
+typedef struct {
+	Feature feature;
+	int importance;
+} FeatureWithImportance;
+
+typedef struct {
+	char *name;
+	List *features;
+} TableMeta;
+
+/**
+ * Create an instance of type Feature.
+ * The `key' and `val' strings are duplicated. Leaving out the `val'
+ * argument results in a value of "yes".
+ */
+static Feature
+feature_new(const char *key, const char *val) {
+	static char *YES = "yes";
+	Feature f;
+	f.key = strdup(key);
+	f.val = strdup(val ? val : YES);
+	return f;
+}
+
+/**
+ * Free an instance of type Feature
+ */
+static void
+feature_free(Feature *f) {
+	if (f) {
+		free(f->key);
+		free(f->val);
+		free(f);
+	}
+}
+
+/* ======================================================================== */
+
+/**
+ * Sort features based on their keys.
+ */
+static int
+cmpKeys(Feature *f1, Feature *f2) {
+	return strcmp(f1->key, f2->key);
+}
+
+/**
+ * Compute the match quotient of the features in a query against the features in a table's
+ * metadata.
+ *
+ * The features are assumed to be sorted and to have no duplicate
+ * keys. The query's features must be of type FeatureWithImportance.
+ * How a feature contributes to the match quotient depends on its
+ * importance, on whether the feature is undefined, defined with the
+ * same value (positive match), or defined with a different value
+ * (negative match), and on the `fuzzy' argument. If the `fuzzy'
+ * argument evaluates to true, negative matches and undefined features
+ * get a lower penalty.
+ */
+static int
+matchFeatureLists(const List *query, const List *tableFeatures, int fuzzy) {
+	static int POS_MATCH = 10;
+	static int NEG_MATCH = -100;
+	static int UNDEFINED = -20;
+	static int EXTRA = -1;
+	static int POS_MATCH_FUZZY = 10;
+	static int NEG_MATCH_FUZZY = -25;
+	static int UNDEFINED_FUZZY = -5;
+	static int EXTRA_FUZZY = -1;
+	int posMatch, negMatch, undefined, extra;
+	if (!fuzzy) {
+		posMatch = POS_MATCH;
+		negMatch = NEG_MATCH;
+		undefined = UNDEFINED;
+		extra = EXTRA;
+	} else {
+		posMatch = POS_MATCH_FUZZY;
+		negMatch = NEG_MATCH_FUZZY;
+		undefined = UNDEFINED_FUZZY;
+		extra = EXTRA_FUZZY;
+	}
+	int quotient = 0;
+	const List *l1 = query;
+	const List *l2 = tableFeatures;
+	while (1) {
+		if (!l1) {
+			if (!l2) break;
+			quotient += extra;
+			l2 = l2->tail;
+		} else if (!l2) {
+			quotient += undefined;
+			l1 = l1->tail;
+		} else {
+			int cmp = cmpKeys(l1->head, l2->head);
+			if (cmp < 0) {
+				quotient += undefined;
+				l1 = l1->tail;
+			} else if (cmp > 0) {
+				quotient += extra;
+				l2 = l2->tail;
+			} else {
+				if (strcmp(((Feature *)l1->head)->val, ((Feature *)l2->head)->val) == 0)
+					quotient += posMatch;
+				else
+					quotient += negMatch;
+				l1 = l1->tail;
+				l2 = l2->tail;
+			}
+		}
+	}
+	return quotient;
+}
+
+/**
+ * Return true if a character matches [0-9A-Za-z_-]
+ */
+static int
+isIdentChar(char c) {
+	return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
+			c == '-' || c == '_';
+}
+
+/**
+ * Return true if a character matches [\s\t]
+ */
+static int
+isSpace(char c) {
+	return c == ' ' || c == '\t';
+}
+
+/**
+ * Parse a table query into a list of features. Features defined first get a
+ * higher importance.
+ */
+static List *
+parseQuery(const char *query) {
+	List *features = NULL;
+	const char *key = NULL;
+	const char *val = NULL;
+	size_t keySize = 0;
+	size_t valSize = 0;
+	const char *c;
+	int pos = 0;
+	while (1) {
+		c = &query[pos++];
+		if (isSpace(*c) || (*c == '\n') | (*c == '\0')) {
+			if (key) {
+				char *k = malloc(keySize + 1);
+				k[keySize] = '\0';
+				memcpy(k, key, keySize);
+				char *v = NULL;
+				if (val) {
+					v = malloc(valSize + 1);
+					v[valSize] = '\0';
+					memcpy(v, val, valSize);
+				}
+				FeatureWithImportance f = { feature_new(k, v), 0 };
+				_lou_logMessage(LOG_DEBUG, "Query has feature '%s:%s'", f.feature.key,
+						f.feature.val);
+				features = list_conj(features, memcpy(malloc(sizeof(f)), &f, sizeof(f)),
+						NULL, NULL, (void (*)(void *))feature_free);
+				free(k);
+				free(v);
+				key = val = NULL;
+				keySize = valSize = 0;
+			}
+			if (*c == '\0') break;
+		} else if (*c == ':') {
+			if (!key || val)
+				goto compile_error;
+			else {
+				c = &query[pos++];
+				if (isIdentChar(*c)) {
+					val = c;
+					valSize = 1;
+				} else
+					goto compile_error;
+			}
+		} else if (isIdentChar(*c)) {
+			if (val)
+				valSize++;
+			else if (key)
+				keySize++;
+			else {
+				key = c;
+				keySize = 1;
+			}
+		} else
+			goto compile_error;
+	}
+	int k = 1;
+	List *l;
+	for (l = features; l; l = l->tail) {
+		FeatureWithImportance *f = l->head;
+		f->importance = k++;
+	}
+	return list_sort(features, (int (*)(void *, void *))cmpKeys);
+compile_error:
+	_lou_logMessage(LOG_ERROR, "Unexpected character '%c' at position %d", c, pos);
+	list_free(features);
+	return NULL;
+}
+
+/**
+ * Convert a widechar string to a normal string.
+ */
+static char *
+widestrToStr(const widechar *str, size_t n) {
+	char *result = malloc((1 + n) * sizeof(char));
+	size_t k;
+	for (k = 0; k < n; k++) result[k] = (char)str[k];
+	result[k] = '\0';
+	return result;
+}
+
+/**
+ * Extract a list of features from a table.
+ */
+static List *
+analyzeTable(const char *table, int activeOnly) {
+	static char fileName[MAXSTRING];
+	char **resolved;
+	List *features = NULL;
+	FileInfo info;
+	int k;
+	resolved = _lou_resolveTable(table, NULL);
+	if (resolved == NULL) {
+		_lou_logMessage(LOG_ERROR, "Cannot resolve table '%s'", table);
+		return NULL;
+	}
+	sprintf(fileName, "%s", *resolved);
+	k = 0;
+	for (k = 0; resolved[k]; k++) free(resolved[k]);
+	free(resolved);
+	if (k > 1) {
+		_lou_logMessage(LOG_ERROR, "Table '%s' resolves to more than one file", table);
+		return NULL;
+	}
+	info.fileName = fileName;
+	info.encoding = noEncoding;
+	info.status = 0;
+	info.lineNumber = 0;
+	if ((info.in = fopen(info.fileName, "rb"))) {
+		while (_lou_getALine(&info)) {
+			if (info.linelen == 0)
+				;
+			else if (info.line[0] == '#') {
+				if (info.linelen >= 2 &&
+						(info.line[1] == '+' || (!activeOnly && info.line[1] == '-'))) {
+					int active = (info.line[1] == '+');
+					widechar *key = NULL;
+					widechar *val = NULL;
+					size_t keySize = 0;
+					size_t valSize = 0;
+					info.linepos = 2;
+					if (info.linepos < info.linelen &&
+							isIdentChar((char)info.line[info.linepos])) {
+						key = &info.line[info.linepos];
+						keySize = 1;
+						info.linepos++;
+						while (info.linepos < info.linelen &&
+								isIdentChar((char)info.line[info.linepos])) {
+							keySize++;
+							info.linepos++;
+						}
+						if (info.linepos < info.linelen &&
+								info.line[info.linepos] == ':') {
+							info.linepos++;
+							while (info.linepos < info.linelen &&
+									isSpace((char)info.line[info.linepos]))
+								info.linepos++;
+							if (info.linepos < info.linelen &&
+									(!active ||
+											isIdentChar((char)info.line[info.linepos]))) {
+								val = &info.line[info.linepos];
+								valSize = 1;
+								info.linepos++;
+								while (info.linepos < info.linelen &&
+										(!active ||
+												isIdentChar(
+														(char)info.line[info.linepos]))) {
+									valSize++;
+									info.linepos++;
+								}
+							} else
+								goto compile_error;
+						}
+						if (info.linepos == info.linelen) {
+							char *k = widestrToStr(key, keySize);
+							char *v = val ? widestrToStr(val, valSize) : NULL;
+							if (!active) {
+								// normalize space
+								int i = 0;
+								int j = 0;
+								int space = 1;
+								while (v[i]) {
+									if (isSpace(v[i])) {
+										if (!space) {
+											v[j++] = ' ';
+											space = 1;
+										}
+									} else {
+										v[j++] = v[i];
+										space = 0;
+									}
+									i++;
+								}
+								if (j > 0 && v[j - 1] == ' ') j--;
+								v[j] = '\0';
+							}
+							Feature f = feature_new(k, v);
+							_lou_logMessage(
+									LOG_DEBUG, "Table has feature '%s:%s'", f.key, f.val);
+							features = list_conj(features,
+									memcpy(malloc(sizeof(f)), &f, sizeof(f)), NULL, NULL,
+									(void (*)(void *))feature_free);
+							free(k);
+							free(v);
+						} else
+							goto compile_error;
+					} else
+						goto compile_error;
+				}
+			} else
+				break;
+		}
+		fclose(info.in);
+	} else
+		_lou_logMessage(LOG_ERROR, "Cannot open table '%s'", info.fileName);
+	return list_sort(features, (int (*)(void *, void *))cmpKeys);
+compile_error:
+	if (info.linepos < info.linelen)
+		_lou_logMessage(LOG_ERROR, "Unexpected character '%c' on line %d, column %d",
+				info.line[info.linepos], info.lineNumber, info.linepos);
+	else
+		_lou_logMessage(LOG_ERROR, "Unexpected newline on line %d", info.lineNumber);
+	list_free(features);
+	return NULL;
+}
+
+static List *tableIndex = NULL;
+
+void EXPORT_CALL
+lou_indexTables(const char **tables) {
+	const char **table;
+	list_free(tableIndex);
+	tableIndex = NULL;
+	for (table = tables; *table; table++) {
+		_lou_logMessage(LOG_DEBUG, "Analyzing table %s", *table);
+		List *features = analyzeTable(*table, 1);
+		if (features) {
+			TableMeta m = { strdup(*table), features };
+			tableIndex = list_conj(tableIndex, memcpy(malloc(sizeof(m)), &m, sizeof(m)),
+					NULL, NULL, free);
+		}
+	}
+	if (!tableIndex) _lou_logMessage(LOG_WARN, "No tables were indexed");
+}
+
+/**
+ * Returns the list of files found in a single directory.
+ */
+#ifdef _MSC_VER
+static List *
+listDir(List *list, char *dirName) {
+	static char glob[MAXSTRING];
+	static char fileName[MAXSTRING];
+	WIN32_FIND_DATA ffd;
+	HANDLE hFind;
+	sprintf(glob, "%s%c%c", dirName, DIR_SEP, '*');
+	hFind = FindFirstFileA(glob, &ffd);
+	if (hFind == INVALID_HANDLE_VALUE) {
+		_lou_logMessage(LOG_WARN, "%s is not a directory", dirName);
+	} else {
+		do {
+			if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+				sprintf(fileName, "%s%c%s", dirName, DIR_SEP, ffd.cFileName);
+				list = list_conj(list, strdup(fileName), NULL, NULL, free);
+			}
+		} while (FindNextFileA(hFind, &ffd));
+		FindClose(hFind);
+	}
+	return list;
+}
+#else  /* !_MSC_VER */
+static List *
+listDir(List *list, char *dirName) {
+	static char fileName[MAXSTRING];
+	struct stat info;
+	DIR *dir;
+	struct dirent *file;
+	if ((dir = opendir(dirName))) {
+		while ((file = readdir(dir))) {
+			sprintf(fileName, "%s%c%s", dirName, DIR_SEP, file->d_name);
+			if (stat(fileName, &info) == 0 && !(info.st_mode & S_IFDIR)) {
+				list = list_conj(list, strdup(fileName), NULL, NULL, free);
+			}
+		}
+		closedir(dir);
+	} else {
+		_lou_logMessage(LOG_WARN, "%s is not a directory", dirName);
+	}
+	return list;
+}
+#endif /* !_MSC_VER */
+
+/**
+ * Returns the list of files found on searchPath, where searchPath is a
+ * comma-separated list of directories.
+ */
+static List *
+listFiles(char *searchPath) {
+	List *list = NULL;
+	char *dirName;
+	int pos = 0;
+	int n;
+	while (1) {
+		for (n = 0; searchPath[pos + n] != '\0' && searchPath[pos + n] != ','; n++)
+			;
+		dirName = malloc(n + 1);
+		dirName[n] = '\0';
+		memcpy(dirName, &searchPath[pos], n);
+		list = listDir(list, dirName);
+		free(dirName);
+		pos += n;
+		if (searchPath[pos] == '\0')
+			break;
+		else
+			pos++;
+	}
+	return list;
+}
+
+static void
+indexTablePath() {
+	char *searchPath;
+	List *tables;
+	const char **tablesArray;
+	_lou_logMessage(
+			LOG_WARN, "Tables have not been indexed yet. Indexing LOUIS_TABLEPATH.");
+	searchPath = _lou_getTablePath();
+	tables = listFiles(searchPath);
+	tablesArray = (const char **)list_toArray(tables, NULL);
+	lou_indexTables(tablesArray);
+	free(searchPath);
+	list_free(tables);
+	free((char **)tablesArray);
+}
+
+char *EXPORT_CALL
+lou_findTable(const char *query) {
+	if (!tableIndex) indexTablePath();
+	List *queryFeatures = parseQuery(query);
+	int bestQuotient = 0;
+	char *bestMatch = NULL;
+	List *l;
+	for (l = tableIndex; l; l = l->tail) {
+		TableMeta *table = l->head;
+		int q = matchFeatureLists(queryFeatures, table->features, 0);
+		if (q > bestQuotient) {
+			bestQuotient = q;
+			bestMatch = strdup(table->name);
+		}
+	}
+	if (bestMatch) {
+		_lou_logMessage(LOG_INFO, "Best match: %s (%d)", bestMatch, bestQuotient);
+		return bestMatch;
+	} else {
+		_lou_logMessage(LOG_INFO, "No table could be found for query '%s'", query);
+		return NULL;
+	}
+}
+
+const char *EXPORT_CALL
+lou_getTableInfo(const char *table, const char *key) {
+	const char *value = NULL;
+	List *features = analyzeTable(table, 0);
+	List *l;
+	for (l = features; l; l = l->tail) {
+		Feature *f = l->head;
+		if (strcmp(f->key, key) == 0) {
+			value = strdup(f->val);
+			list_free(features);
+			break;
+		}
+	}
+	return value;
+}
+
+const char **EXPORT_CALL
+lou_listTables() {
+	const char **tablesArray;
+	List *tables = NULL;
+	List *l;
+	if (!tableIndex) indexTablePath();
+	for (l = tableIndex; l; l = l->tail) {
+		TableMeta *table = l->head;
+		tables = list_conj(
+				tables, strdup(table->name), (int (*)(void *, void *))strcmp, NULL, NULL);
+	}
+	tablesArray = (const char **)list_toArray(tables, NULL);
+	list_free(tables);
+	return tablesArray;
+}
diff --git a/liblouis/liblouis/pattern.c b/liblouis/liblouis/pattern.c
new file mode 100644
index 0000000..c89f052
--- /dev/null
+++ b/liblouis/liblouis/pattern.c
@@ -0,0 +1,1648 @@
+/* liblouis Braille Translation and Back-Translation Library
+
+   Copyright (C) 2016 Mike Gray, American Printing House for the Blind
+
+   This file is part of liblouis.
+
+   liblouis is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation, either version 2.1 of the License, or
+   (at your option) any later version.
+
+   liblouis is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "internal.h"
+
+//#define CHECK_OUTPUT_DEFINED
+
+/////
+
+static const TranslationTableHeader *table;
+
+// TODO: these functions are static and copied serveral times
+
+int translation_direction = 1;
+
+static TranslationTableCharacter *
+back_findCharOrDots(widechar c, int m) {
+	/* Look up character or dot pattern in the appropriate
+	 * table. */
+	static TranslationTableCharacter noChar = { 0, 0, 0, CTC_Space, 32, 32, 32 };
+	static TranslationTableCharacter noDots = { 0, 0, 0, CTC_Space, B16, B16, B16 };
+	TranslationTableCharacter *notFound;
+	TranslationTableCharacter *character;
+	TranslationTableOffset bucket;
+	unsigned long int makeHash = (unsigned long int)c % HASHNUM;
+	if (m == 0) {
+		bucket = table->characters[makeHash];
+		notFound = &noChar;
+	} else {
+		bucket = table->dots[makeHash];
+		notFound = &noDots;
+	}
+	while (bucket) {
+		character = (TranslationTableCharacter *)&table->ruleArea[bucket];
+		if (character->realchar == c) return character;
+		bucket = character->next;
+	}
+	notFound->realchar = notFound->uppercase = notFound->lowercase = c;
+	return notFound;
+}
+
+static TranslationTableCharacter *
+findCharOrDots(widechar c, int m) {
+	/* Look up character or dot pattern in the appropriate
+	 * table. */
+	static TranslationTableCharacter noChar = { 0, 0, 0, CTC_Space, 32, 32, 32 };
+	static TranslationTableCharacter noDots = { 0, 0, 0, CTC_Space, B16, B16, B16 };
+	TranslationTableCharacter *notFound;
+	TranslationTableCharacter *character;
+	TranslationTableOffset bucket;
+	unsigned long int makeHash = (unsigned long int)c % HASHNUM;
+	if (m == 0) {
+		bucket = table->characters[makeHash];
+		notFound = &noChar;
+	} else {
+		bucket = table->dots[makeHash];
+		notFound = &noDots;
+	}
+	while (bucket) {
+		character = (TranslationTableCharacter *)&table->ruleArea[bucket];
+		if (character->realchar == c) return character;
+		bucket = character->next;
+	}
+	notFound->realchar = notFound->uppercase = notFound->lowercase = c;
+	return notFound;
+}
+
+static int
+checkAttr(const widechar c, const TranslationTableCharacterAttributes a, int m) {
+	static widechar prevc = 0;
+	static TranslationTableCharacterAttributes preva = 0;
+	if (c != prevc) {
+		if (translation_direction)
+			preva = (findCharOrDots(c, 0))->attributes;
+		else
+			preva = (back_findCharOrDots(c, 1))->attributes;
+		prevc = c;
+	}
+	return ((preva & a) ? 1 : 0);
+}
+
+/////
+
+enum pattern_type {
+	PTN_ERROR,
+
+	PTN_START,
+	PTN_GROUP,
+	PTN_NOT,
+
+	PTN_ONE_MORE,
+	PTN_ZERO_MORE,
+	PTN_OPTIONAL,
+
+	PTN_ALTERNATE,
+
+	PTN_ANY,
+	PTN_ATTRIBUTES,
+	PTN_CHARS,
+	PTN_HOOK,
+	PTN_END_OF_INPUT,
+
+	PTN_END = 0xffff,
+};
+
+#define EXPR_TYPE_IN(at, buffer) (buffer[(at) + 0])
+#define EXPR_PRV_IN(at, buffer) (buffer[(at) + 1])
+#define EXPR_NXT_IN(at, buffer) (buffer[(at) + 2])
+#define EXPR_DATA_0_IN(at, buffer) (buffer[(at) + 3])
+#define EXPR_DATA_1_IN(at, buffer) (buffer[(at) + 4])
+#define EXPR_DATA_2_IN(at, buffer) (buffer[(at) + 5])
+#define EXPR_DATA_IN(at, buffer) ((widechar *)&buffer[(at) + 3])
+#define EXPR_CONST_DATA_IN(at, buffer) ((const widechar *)&buffer[(at) + 3])
+
+#define EXPR_TYPE(at) EXPR_TYPE_IN((at), expr_data)
+#define EXPR_PRV(at) EXPR_PRV_IN((at), expr_data)
+#define EXPR_NXT(at) EXPR_NXT_IN((at), expr_data)
+#define EXPR_DATA_0(at) EXPR_DATA_0_IN((at), expr_data)
+#define EXPR_DATA_1(at) EXPR_DATA_1_IN((at), expr_data)
+#define EXPR_DATA_2(at) EXPR_DATA_2_IN((at), expr_data)
+#define EXPR_DATA(at) EXPR_DATA_IN((at), expr_data)
+#define EXPR_CONST_DATA(at) EXPR_CONST_DATA_IN((at), expr_data)
+
+#ifdef CHECK_OUTPUT_DEFINED
+
+#ifndef DEBUG
+#define DEBUG
+
+#endif
+
+#define START 0
+#define CALL 1
+#define RETURN 2
+#define SHOW 3
+
+#define CHECK_OUTPUT(type, ret, line, msg)                                      \
+	{                                                                           \
+		do_output(type, ret, line, input[*input_crs], input_minmax, *input_crs, \
+				input_dir, expr_data, expr_crs, not, loop_crs, loop_cnts, msg); \
+	}
+
+#else
+
+#define CHECK_OUTPUT(type, ret, line, msg) \
+	{ ; }
+
+#endif
+
+struct expression {
+	widechar type;
+	widechar prv;
+	widechar nxt;
+	widechar data[1];
+};
+
+/* gdb won't know what this is unless it is actually used */
+#ifdef DEBUG
+static struct expression *expr_debug;
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+
+static char spaces[] = "..............................";
+static int space = 30;
+
+static void
+pattern_output_expression(const widechar *expr_data, int expr_crs) {
+	int i;
+
+	if (expr_crs == PTN_END) return;
+
+	while (EXPR_TYPE(expr_crs) != PTN_END) {
+		printf("%s%d", &spaces[space], expr_crs);
+		if (expr_crs < 100) printf(" ");
+		if (expr_crs < 10) printf(" ");
+		for (i = 0; i < 13 - (30 - space); i++) printf(" ");
+
+		switch (EXPR_TYPE(expr_crs)) {
+		case PTN_START:
+
+			printf("START\t%d\t%d\n", EXPR_PRV(expr_crs), EXPR_NXT(expr_crs));
+			break;
+
+		case PTN_GROUP:
+
+			printf("(    \t%d\t%d\t-> %d\n", EXPR_PRV(expr_crs), EXPR_NXT(expr_crs),
+					EXPR_DATA_0(expr_crs));
+			space--;
+			if (space < 0) space = 0;
+			pattern_output_expression(expr_data, EXPR_DATA_0(expr_crs));
+			space++;
+			if (space > 30) space = 30;
+			break;
+
+		case PTN_NOT:
+
+			printf("!    \t%d\t%d\t-> %d\n", EXPR_PRV(expr_crs), EXPR_NXT(expr_crs),
+					EXPR_DATA_0(expr_crs));
+			space--;
+			if (space < 0) space = 0;
+			pattern_output_expression(expr_data, EXPR_DATA_0(expr_crs));
+			space++;
+			if (space > 30) space = 30;
+			break;
+
+		case PTN_ONE_MORE:
+
+			printf("+    \t%d\t%d\t-> %d\t#%d\n", EXPR_PRV(expr_crs), EXPR_NXT(expr_crs),
+					EXPR_DATA_0(expr_crs), EXPR_DATA_1(expr_crs));
+			space--;
+			if (space < 0) space = 0;
+			pattern_output_expression(expr_data, EXPR_DATA_0(expr_crs));
+			space++;
+			if (space > 30) space = 30;
+			break;
+
+		case PTN_ZERO_MORE:
+
+			printf("*    \t%d\t%d\t-> %d\t#%d\n", EXPR_PRV(expr_crs), EXPR_NXT(expr_crs),
+					EXPR_DATA_0(expr_crs), EXPR_DATA_1(expr_crs));
+			space--;
+			if (space < 0) space = 0;
+			pattern_output_expression(expr_data, EXPR_DATA_0(expr_crs));
+			space++;
+			if (space > 30) space = 30;
+			break;
+
+		case PTN_OPTIONAL:
+
+			printf("?    \t%d\t%d\t-> %d\n", EXPR_PRV(expr_crs), EXPR_NXT(expr_crs),
+					EXPR_DATA_0(expr_crs));
+			space--;
+			if (space < 0) space = 0;
+			pattern_output_expression(expr_data, EXPR_DATA_0(expr_crs));
+			space++;
+			if (space > 30) space = 30;
+			break;
+
+		case PTN_ALTERNATE:
+
+			printf("|    \t%d\t%d\t-> %d\t-> %d\n", EXPR_PRV(expr_crs),
+					EXPR_NXT(expr_crs), EXPR_DATA_0(expr_crs), EXPR_DATA_1(expr_crs));
+			space--;
+			if (space < 0) space = 0;
+			pattern_output_expression(expr_data, EXPR_DATA_0(expr_crs));
+			pattern_output_expression(expr_data, EXPR_DATA_1(expr_crs));
+			space++;
+			if (space > 30) space = 30;
+			break;
+
+		case PTN_ANY:
+
+			printf(".    \t%d\t%d\n", EXPR_PRV(expr_crs), EXPR_NXT(expr_crs));
+			break;
+
+		case PTN_ATTRIBUTES:
+
+			printf("%%    \t%d\t%d\t", EXPR_PRV(expr_crs), EXPR_NXT(expr_crs));
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined0 >> 16)) printf("0");
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined1 >> 16)) printf("1");
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined2 >> 16)) printf("2");
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined3 >> 16)) printf("3");
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined4 >> 16)) printf("4");
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined5 >> 16)) printf("5");
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined6 >> 16)) printf("6");
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined7 >> 16)) printf("7");
+			if (EXPR_DATA_0(expr_crs) & (CTC_EndOfInput >> 16)) printf("^");
+			if (EXPR_DATA_1(expr_crs) & CTC_Space) printf("_");
+			if (EXPR_DATA_1(expr_crs) & CTC_Digit) printf("#");
+			if (EXPR_DATA_1(expr_crs) & CTC_Letter) printf("a");
+			if (EXPR_DATA_1(expr_crs) & CTC_UpperCase) printf("u");
+			if (EXPR_DATA_1(expr_crs) & CTC_LowerCase) printf("l");
+			if (EXPR_DATA_1(expr_crs) & CTC_Punctuation) printf(".");
+			if (EXPR_DATA_1(expr_crs) & CTC_Sign) printf("$");
+			if (EXPR_DATA_1(expr_crs) & CTC_SeqDelimiter) printf("~");
+			if (EXPR_DATA_1(expr_crs) & CTC_SeqBefore) printf("<");
+			if (EXPR_DATA_1(expr_crs) & CTC_SeqAfter) printf(">");
+			puts("");
+			break;
+
+		case PTN_CHARS:
+
+			printf("[]   \t%d\t%d\t", EXPR_PRV(expr_crs), EXPR_NXT(expr_crs));
+			for (i = 0; i < EXPR_DATA_0(expr_crs); i++)
+				printf("%c", EXPR_CONST_DATA(expr_crs)[i + 1]);
+			puts("");
+			break;
+
+		case PTN_HOOK:
+
+			printf("@    \t%d\t%d\t", EXPR_PRV(expr_crs), EXPR_NXT(expr_crs));
+			for (i = 0; i < EXPR_DATA_0(expr_crs); i++)
+				printf("%c", EXPR_CONST_DATA(expr_crs)[i + 1]);
+			puts("");
+			break;
+
+		case PTN_END_OF_INPUT:
+
+			printf("^    \t%d\t%d\n", EXPR_PRV(expr_crs), EXPR_NXT(expr_crs));
+			break;
+
+		default:
+
+			printf("%d?    \t%d\t%d\n", EXPR_TYPE(expr_crs), EXPR_PRV(expr_crs),
+					EXPR_NXT(expr_crs));
+			break;
+		}
+
+		expr_crs = EXPR_NXT(expr_crs);
+	}
+
+	printf("%s%d", &spaces[space], expr_crs);
+	if (expr_crs < 100) printf(" ");
+	if (expr_crs < 10) printf(" ");
+	for (i = 0; i < 13 - (30 - space); i++) printf(" ");
+	printf("END\t%d\t%d\n", EXPR_PRV(expr_crs), EXPR_NXT(expr_crs));
+	fflush(stdout);
+	return;
+}
+
+static void
+pattern_output(const widechar *expr_data) {
+	printf("%d    \tlength\n", expr_data[0]);
+	printf("%d    \tloops\n", expr_data[1]);
+	if (expr_data[0] > 0 && expr_data[0] != PTN_END)
+		pattern_output_expression(expr_data, 2);
+}
+
+static void
+pattern_print_expression(const widechar *expr_data, int expr_crs) {
+	int i;
+
+	if (expr_crs == PTN_END) return;
+
+	while (EXPR_TYPE(expr_crs) != PTN_END) {
+		switch (EXPR_TYPE(expr_crs)) {
+		case PTN_START:
+			break;
+
+		case PTN_GROUP:
+
+			printf(" (");
+			pattern_print_expression(expr_data, EXPR_DATA_0(expr_crs));
+			printf(") ");
+			break;
+
+		case PTN_NOT:
+
+			printf("!");
+			pattern_print_expression(expr_data, EXPR_DATA_0(expr_crs));
+			break;
+
+		case PTN_ONE_MORE:
+
+			pattern_print_expression(expr_data, EXPR_DATA_0(expr_crs));
+			printf("+");
+			break;
+
+		case PTN_ZERO_MORE:
+
+			pattern_print_expression(expr_data, EXPR_DATA_0(expr_crs));
+			printf("*");
+			break;
+
+		case PTN_OPTIONAL:
+
+			pattern_print_expression(expr_data, EXPR_DATA_0(expr_crs));
+			printf("?");
+			break;
+
+		case PTN_ALTERNATE:
+
+			pattern_print_expression(expr_data, EXPR_DATA_0(expr_crs));
+			printf(" | ");
+			pattern_print_expression(expr_data, EXPR_DATA_1(expr_crs));
+			break;
+
+		case PTN_ANY:
+
+			printf(".");
+			break;
+
+		case PTN_ATTRIBUTES:
+
+			printf("%%[");
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined0 >> 16)) printf("0");
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined1 >> 16)) printf("1");
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined2 >> 16)) printf("2");
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined3 >> 16)) printf("3");
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined4 >> 16)) printf("4");
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined5 >> 16)) printf("5");
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined6 >> 16)) printf("6");
+			if (EXPR_DATA_0(expr_crs) & (CTC_UserDefined7 >> 16)) printf("7");
+			if (EXPR_DATA_0(expr_crs) & (CTC_EndOfInput >> 16)) printf("^");
+			if (EXPR_DATA_1(expr_crs) & CTC_Space) printf("_");
+			if (EXPR_DATA_1(expr_crs) & CTC_Digit) printf("#");
+			if (EXPR_DATA_1(expr_crs) & CTC_Letter) printf("a");
+			if (EXPR_DATA_1(expr_crs) & CTC_UpperCase) printf("u");
+			if (EXPR_DATA_1(expr_crs) & CTC_LowerCase) printf("l");
+			if (EXPR_DATA_1(expr_crs) & CTC_Punctuation) printf(".");
+			if (EXPR_DATA_1(expr_crs) & CTC_Sign) printf("$");
+			if (EXPR_DATA_1(expr_crs) & CTC_SeqDelimiter) printf("~");
+			if (EXPR_DATA_1(expr_crs) & CTC_SeqBefore) printf("<");
+			if (EXPR_DATA_1(expr_crs) & CTC_SeqAfter) printf(">");
+			printf("]");
+			break;
+
+		case PTN_CHARS:
+
+			if (EXPR_DATA_0(expr_crs) == 1)
+				printf("%c", EXPR_DATA_1(expr_crs));
+			else {
+				printf("[");
+				for (i = 0; i < EXPR_DATA_0(expr_crs); i++)
+					printf("%c", EXPR_CONST_DATA(expr_crs)[i + 1]);
+				printf("]");
+			}
+			break;
+
+		case PTN_HOOK:
+
+			printf("@[");
+			for (i = 0; i < EXPR_DATA_0(expr_crs); i++)
+				printf("%c", EXPR_CONST_DATA(expr_crs)[i + 1]);
+			printf("]");
+			break;
+
+		case PTN_END_OF_INPUT:
+
+			printf("^");
+			break;
+
+			// default:  printf("%d?\n", EXPR_TYPE(expr_crs));  break;
+		}
+
+		expr_crs = EXPR_NXT(expr_crs);
+	}
+
+	return;
+}
+
+static void
+pattern_print(const widechar *expr_data) {
+	if (expr_data[0] > 0 && expr_data[0] != PTN_END)
+		pattern_print_expression(expr_data, 2);
+	puts("");
+}
+
+#ifdef CHECK_OUTPUT_DEFINED
+
+static void
+do_padd(const int value) {
+	if (value < 100000) printf(" ");
+	if (value < 10000) printf(" ");
+	if (value < 1000) printf(" ");
+	if (value < 100) printf(" ");
+	if (value < 10) printf(" ");
+}
+
+static void
+do_pad(const int value) {
+	if (value < 100) printf(" ");
+	if (value < 10) printf(" ");
+}
+
+static void
+do_output(const int type, const int ret, const int line,
+
+		const int input, const int input_minmax, const int input_crs, const int input_dir,
+		const widechar *expr_data, const int expr_crs, const int not, const int loop_crs,
+		const int *loop_cnts,
+
+		const char *msg) {
+	switch (type) {
+	case START:
+
+		space--;
+		if (space < 0) space = 0;
+		printf("|%s()  ", &spaces[space]);
+		break;
+
+	case CALL:
+
+		printf("|%s>   ", &spaces[space]);
+		break;
+
+	case RETURN:
+
+		printf("|%s<%d  ", &spaces[space], ret);
+		space++;
+		if (space > 31) space = 31;
+		break;
+
+	case SHOW:
+
+		printf("|%s    ", &spaces[space]);
+		break;
+	}
+
+	printf("%d ", line);
+	do_padd(line);
+
+	switch (expr_data[expr_crs]) {
+	case PTN_ERROR:
+		printf("# ");
+		break;
+	case PTN_START:
+		printf("> ");
+		break;
+	case PTN_END_OF_INPUT:
+		printf("^ ");
+		break;
+	case PTN_ALTERNATE:
+		printf("| ");
+		break;
+	case PTN_OPTIONAL:
+		printf("? ");
+		break;
+	case PTN_ONE_MORE:
+		printf("+ ");
+		break;
+	case PTN_ZERO_MORE:
+		printf("* ");
+		break;
+	case PTN_NOT:
+		printf("! ");
+		break;
+	case PTN_GROUP:
+		printf("( ");
+		break;
+	case PTN_ANY:
+		printf(". ");
+		break;
+	case PTN_ATTRIBUTES:
+		printf("%% ");
+		break;
+	case PTN_CHARS:
+		printf("[ ");
+		break;
+	case PTN_HOOK:
+		printf("@ ");
+		break;
+	case PTN_END:
+		printf("< ");
+		break;
+	default:
+		printf("  ");
+		break;
+	}
+	printf("%d ", expr_crs);
+	do_padd(expr_crs);
+
+	if (input > 31 && input < 127)
+		printf("%c ", input);
+	else
+		printf("_ ");
+
+	if (input_crs * input_dir >= input_minmax * input_dir)
+		printf("#   ");
+	else {
+		printf("%d ", input_crs);
+		do_pad(input_crs);
+	}
+
+	if (input_dir > 0)
+		printf("<");
+	else
+		printf(">");
+	printf("%d ", input_minmax);
+	do_pad(input_minmax);
+
+	if (not)
+		printf("!   ");
+	else
+		printf("    ");
+
+	if (loop_crs) {
+		printf("%d ", loop_crs);
+		do_pad(loop_crs);
+		printf("%d ", loop_cnts[EXPR_DATA_1(loop_crs)]);
+		do_pad(loop_cnts[EXPR_DATA_1(loop_crs)]);
+	} else
+		printf("-   -   ");
+	if (EXPR_TYPE(expr_crs) == PTN_ONE_MORE || EXPR_TYPE(expr_crs) == PTN_ZERO_MORE) {
+		printf("%d ", loop_cnts[EXPR_DATA_1(expr_crs)]);
+		do_pad(loop_cnts[EXPR_DATA_1(expr_crs)]);
+	} else
+		printf("-   ");
+
+	if (msg) printf("%s", msg);
+	puts("");
+}
+
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+
+static int
+pattern_compile_1(const widechar *input, const int input_max, int *input_crs,
+		widechar *expr_data, const int expr_max, widechar *expr_crs, widechar *loop_cnts);
+
+static int
+pattern_compile_expression(const widechar *input, const int input_max, int *input_crs,
+		widechar *expr_data, const int expr_max, widechar *expr_crs,
+		widechar *loop_cnts) {
+	widechar *data;
+	int expr_start, expr_end, expr_sub, expr_crs_prv;
+	int input_end;
+	int attrs0, attrs1;
+	int set, esc, nest, i;
+
+	switch (input[*input_crs]) {
+	case '(':
+
+		if (*expr_crs + 10 >= expr_max) return 0;
+
+		(*input_crs)++;
+		if (*input_crs >= input_max) return 0;
+
+		/* find closing parenthesis */
+		nest = esc = 0;
+		for (input_end = *input_crs; input_end < input_max; input_end++) {
+			if (input[input_end] == '\\' && !esc) {
+				esc = 1;
+				continue;
+			}
+
+			if (input[input_end] == '(' && !esc)
+				nest++;
+			else if (input[input_end] == ')' && !esc) {
+				if (nest)
+					nest--;
+				else
+					break;
+			}
+
+			esc = 0;
+		}
+		if (input_end >= input_max) return 0;
+
+		EXPR_TYPE(*expr_crs) = PTN_GROUP;
+
+		/* compile sub expressions */
+		expr_crs_prv = *expr_crs;
+		*expr_crs += 4;
+		EXPR_DATA_0(expr_crs_prv) = *expr_crs;
+		expr_sub = *expr_crs;
+		EXPR_TYPE(expr_sub) = PTN_ERROR;
+		EXPR_PRV(expr_sub) = PTN_END;
+		EXPR_NXT(expr_sub) = PTN_END;
+		if (!pattern_compile_1(input, input_end, input_crs, expr_data, expr_max, expr_crs,
+					loop_cnts))
+			return 0;
+		(*input_crs)++;
+
+		/* reset end expression */
+		expr_end = *expr_crs;
+		EXPR_NXT(expr_end) = expr_crs_prv;
+
+		return *expr_crs += 3;
+
+	case '!':
+
+		if (*expr_crs + 10 >= expr_max) return 0;
+
+		(*input_crs)++;
+		EXPR_TYPE(*expr_crs) = PTN_NOT;
+		expr_crs_prv = *expr_crs;
+		*expr_crs += 4;
+		EXPR_DATA_0(expr_crs_prv) = *expr_crs;
+
+		/* create start expression */
+		expr_start = *expr_crs;
+		EXPR_TYPE(expr_start) = PTN_START;
+		EXPR_PRV(expr_start) = PTN_END;
+		*expr_crs += 3;
+		EXPR_NXT(expr_start) = *expr_crs;
+
+		/* compile sub expression */
+		expr_sub = *expr_crs;
+		EXPR_TYPE(expr_sub) = PTN_ERROR;
+		EXPR_PRV(expr_sub) = expr_start;
+		EXPR_NXT(expr_sub) = PTN_END;
+
+		if (!pattern_compile_expression(input, input_max, input_crs, expr_data, expr_max,
+					expr_crs, loop_cnts))
+			return 0;
+
+		EXPR_NXT(expr_sub) = *expr_crs;
+
+		/* create end expression */
+		expr_end = *expr_crs;
+		EXPR_TYPE(expr_end) = PTN_END;
+		EXPR_PRV(expr_end) = expr_sub;
+		EXPR_NXT(expr_end) = expr_crs_prv;
+
+		return *expr_crs += 3;
+
+	case '+':
+
+		if (*expr_crs + 4 >= expr_max) return 0;
+		EXPR_TYPE(*expr_crs) = PTN_ONE_MORE;
+		EXPR_DATA_1(*expr_crs) = (*loop_cnts)++;
+		(*input_crs)++;
+		return *expr_crs += 5;
+
+	case '*':
+
+		if (*expr_crs + 4 >= expr_max) return 0;
+		EXPR_TYPE(*expr_crs) = PTN_ZERO_MORE;
+		EXPR_DATA_1(*expr_crs) = (*loop_cnts)++;
+		(*input_crs)++;
+		return *expr_crs += 5;
+
+	case '?':
+
+		if (*expr_crs + 4 >= expr_max) return 0;
+		EXPR_TYPE(*expr_crs) = PTN_OPTIONAL;
+		(*input_crs)++;
+		return *expr_crs += 4;
+
+	case '|':
+
+		if (*expr_crs + 5 >= expr_max) return 0;
+		EXPR_TYPE(*expr_crs) = PTN_ALTERNATE;
+		(*input_crs)++;
+		return *expr_crs += 5;
+
+	case '.':
+
+		if (*expr_crs + 3 >= expr_max) return 0;
+		EXPR_TYPE(*expr_crs) = PTN_ANY;
+		(*input_crs)++;
+		return *expr_crs += 3;
+
+	case '%':
+
+		if (*expr_crs + 5 >= expr_max) return 0;
+
+		(*input_crs)++;
+		if (*input_crs >= input_max) return 0;
+
+		/* find closing bracket */
+		if (input[*input_crs] == '[') {
+			set = 1;
+			(*input_crs)++;
+			for (input_end = *input_crs; input_end < input_max; input_end++)
+				if (input[input_end] == ']') break;
+			if (input_end >= input_max) return 0;
+		} else {
+			set = 0;
+			input_end = *input_crs + 1;
+		}
+
+		EXPR_TYPE(*expr_crs) = PTN_ATTRIBUTES;
+
+		attrs0 = attrs1 = 0;
+		for (; (*input_crs) < input_end; (*input_crs)++) {
+			switch (input[*input_crs]) {
+			case '_':
+				attrs0 |= CTC_Space;
+				break;
+			case '#':
+				attrs0 |= CTC_Digit;
+				break;
+			case 'a':
+				attrs0 |= CTC_Letter;
+				break;
+			case 'u':
+				attrs0 |= CTC_UpperCase;
+				break;
+			case 'l':
+				attrs0 |= CTC_LowerCase;
+				break;
+			case '.':
+				attrs0 |= CTC_Punctuation;
+				break;
+			case '$':
+				attrs0 |= CTC_Sign;
+				break;
+			case '~':
+				attrs0 |= CTC_SeqDelimiter;
+				break;
+			case '<':
+				attrs0 |= CTC_SeqBefore;
+				break;
+			case '>':
+				attrs0 |= CTC_SeqAfter;
+				break;
+
+			case '0':
+				attrs1 |= (CTC_UserDefined0 >> 16);
+				break;
+			case '1':
+				attrs1 |= (CTC_UserDefined1 >> 16);
+				break;
+			case '2':
+				attrs1 |= (CTC_UserDefined2 >> 16);
+				break;
+			case '3':
+				attrs1 |= (CTC_UserDefined3 >> 16);
+				break;
+			case '4':
+				attrs1 |= (CTC_UserDefined4 >> 16);
+				break;
+			case '5':
+				attrs1 |= (CTC_UserDefined5 >> 16);
+				break;
+			case '6':
+				attrs1 |= (CTC_UserDefined6 >> 16);
+				break;
+			case '7':
+				attrs1 |= (CTC_UserDefined7 >> 16);
+				break;
+			case '^':
+				attrs1 |= (CTC_EndOfInput >> 16);
+				break;
+
+			default:
+				return 0;
+			}
+		}
+		EXPR_DATA_0(*expr_crs) = attrs1;
+		EXPR_DATA_1(*expr_crs) = attrs0;
+
+		if (set) (*input_crs)++;
+		return *expr_crs += 5;
+
+	case '[':
+
+		(*input_crs)++;
+		if (*input_crs >= input_max) return 0;
+
+		/* find closing bracket */
+		esc = 0;
+		for (input_end = *input_crs; input_end < input_max; input_end++) {
+			if (input[input_end] == '\\' && !esc) {
+				esc = 1;
+				continue;
+			}
+
+			if (input[input_end] == ']' && !esc) break;
+			esc = 0;
+		}
+		if (input_end >= input_max) return 0;
+
+		if (*expr_crs + 4 + (input_end - *input_crs) >= expr_max) return 0;
+
+		EXPR_TYPE(*expr_crs) = PTN_CHARS;
+
+		esc = 0;
+		data = EXPR_DATA(*expr_crs);
+		for (i = 1; *input_crs < input_end; (*input_crs)++) {
+			if (input[*input_crs] == '\\' && !esc) {
+				esc = 1;
+				continue;
+			}
+
+			esc = 0;
+			data[i++] = (widechar)input[*input_crs];
+		}
+		data[0] = i - 1;
+		(*input_crs)++;
+		return *expr_crs += 4 + data[0];
+
+	case '@':
+
+		(*input_crs)++;
+		if (*input_crs >= input_max) return 0;
+
+		/* find closing bracket */
+		if (input[*input_crs] == '[') {
+			set = 1;
+			(*input_crs)++;
+			for (input_end = *input_crs; input_end < input_max; input_end++)
+				if (input[input_end] == ']') break;
+			if (input_end >= input_max) return 0;
+		} else {
+			set = 0;
+			input_end = *input_crs + 1;
+		}
+
+		if (*expr_crs + 4 + (input_end - *input_crs) >= expr_max) return 0;
+
+		EXPR_TYPE(*expr_crs) = PTN_HOOK;
+
+		esc = 0;
+		data = EXPR_DATA(*expr_crs);
+		for (i = 1; *input_crs < input_end; (*input_crs)++) {
+			if (input[*input_crs] == '\\' && !esc) {
+				esc = 1;
+				continue;
+			}
+
+			esc = 0;
+			data[i++] = (widechar)input[*input_crs];
+		}
+		data[0] = i - 1;
+		if (set) (*input_crs)++;
+		return *expr_crs += 4 + data[0];
+
+	case '^':
+	case '$':
+
+		if (*expr_crs + 3 >= expr_max) return 0;
+		EXPR_TYPE(*expr_crs) = PTN_END_OF_INPUT;
+		(*input_crs)++;
+		return *expr_crs += 3;
+
+	case '\\':
+
+		(*input_crs)++;
+		if (*input_crs >= input_max) return 0;
+
+	default:
+
+		if (*expr_crs + 5 >= expr_max) return 0;
+		EXPR_TYPE(*expr_crs) = PTN_CHARS;
+		EXPR_DATA_0(*expr_crs) = 1;
+		EXPR_DATA_1(*expr_crs) = (widechar)input[*input_crs];
+		(*input_crs)++;
+		return *expr_crs += 5;
+	}
+}
+
+static int
+pattern_insert_alternate(const widechar *input, const int input_max, int *input_crs,
+		widechar *expr_data, const int expr_max, widechar *expr_crs, widechar *loop_cnts,
+		int expr_insert) {
+	int expr_group, expr_alt, expr_end;
+
+	if (EXPR_TYPE(*expr_crs) == PTN_START) return 0;
+
+	if (*expr_crs + 12 >= expr_max) return 0;
+
+	/* setup alternate expression */
+	expr_alt = *expr_crs;
+	EXPR_TYPE(expr_alt) = PTN_ALTERNATE;
+	EXPR_PRV(expr_alt) = PTN_END;
+	EXPR_NXT(expr_alt) = PTN_END;
+	*expr_crs += 5;
+
+	/* setup group expression */
+	expr_group = *expr_crs;
+	EXPR_TYPE(expr_group) = PTN_GROUP;
+	EXPR_PRV(expr_group) = PTN_END;
+	EXPR_NXT(expr_group) = PTN_END;
+	*expr_crs += 4;
+	EXPR_DATA_0(expr_group) = *expr_crs;
+
+	EXPR_TYPE(*expr_crs) = PTN_ERROR;
+	EXPR_PRV(*expr_crs) = PTN_END;
+	EXPR_NXT(*expr_crs) = PTN_END;
+	if (!pattern_compile_1(
+				input, input_max, input_crs, expr_data, expr_max, expr_crs, loop_cnts))
+		return 0;
+	expr_end = *expr_crs;
+	EXPR_NXT(expr_end) = expr_group;
+
+	/* setup last end expression */
+	if (*expr_crs + 3 >= expr_max) return 0;
+	*expr_crs += 3;
+	EXPR_TYPE(*expr_crs) = PTN_END;
+	EXPR_NXT(*expr_crs) = PTN_END;
+
+	/* replace insert expression with group expression using last end expression */
+	EXPR_NXT(EXPR_PRV(expr_insert)) = expr_group;
+	EXPR_PRV(expr_group) = EXPR_PRV(expr_insert);
+
+	EXPR_NXT(expr_group) = *expr_crs;
+	EXPR_PRV(*expr_crs) = expr_group;
+
+	/* link alternate and insert expressions before group end expression */
+	EXPR_NXT(EXPR_PRV(expr_end)) = expr_alt;
+	EXPR_PRV(expr_alt) = EXPR_PRV(expr_end);
+
+	EXPR_NXT(expr_alt) = expr_insert;
+	EXPR_PRV(expr_insert) = expr_alt;
+
+	EXPR_NXT(expr_insert) = expr_end;
+	EXPR_PRV(expr_end) = expr_insert;
+
+	return *expr_crs;
+}
+
+/* Compile all expression sequences, resolving character sets, attributes,
+ * groups, nots, and hooks.  Note that unlike the other compile functions, on
+ * returning the expr_crs is set to the last end expression, not after it.
+ */
+static int
+pattern_compile_1(const widechar *input, const int input_max, int *input_crs,
+		widechar *expr_data, const int expr_max, widechar *expr_crs,
+		widechar *loop_cnts) {
+	int expr_crs_prv;
+
+	if (*expr_crs + 6 >= expr_max) return 0;
+
+	expr_crs_prv = *expr_crs;
+
+	/* setup start expression */
+	EXPR_TYPE(*expr_crs) = PTN_START;
+	EXPR_PRV(*expr_crs) = PTN_END;
+	*expr_crs += 3;
+	EXPR_NXT(expr_crs_prv) = *expr_crs;
+
+	/* setup end expression */
+	EXPR_TYPE(*expr_crs) = PTN_END;
+	EXPR_PRV(*expr_crs) = expr_crs_prv;
+	EXPR_NXT(*expr_crs) = PTN_END;
+
+	while (*input_crs < input_max) {
+		expr_crs_prv = *expr_crs;
+		if (!pattern_compile_expression(input, input_max, input_crs, expr_data, expr_max,
+					expr_crs, loop_cnts))
+			return 0;
+
+		/* setup end expression */
+		if (*expr_crs + 3 >= expr_max) return 0;
+		EXPR_NXT(expr_crs_prv) = *expr_crs;
+		EXPR_TYPE(*expr_crs) = PTN_END;
+		EXPR_PRV(*expr_crs) = expr_crs_prv;
+		EXPR_NXT(*expr_crs) = PTN_END;
+
+		/* insert seqafterexpression before attributes of seqafterchars */
+		// if(EXPR_TYPE(expr_crs_prv) == PTN_ATTRIBUTES)
+		// if(EXPR_DATA_1(expr_crs_prv) & CTC_SeqAfter)
+		// {
+		// 	i = 0;
+		// 	pattern_insert_alternate(table->seqAfterExpression,
+		// 		table->seqAfterExpressionLength, &i, expr_data, expr_max,
+		// 		expr_crs, loop_cnts, expr_crs_prv);
+		// }
+	}
+
+	return *expr_crs;
+}
+
+/* Resolve optional and loop expressions.
+ */
+static int
+pattern_compile_2(
+		widechar *expr_data, int expr_at, const int expr_max, widechar *expr_crs) {
+	int expr_start, expr_end, expr_prv, expr_sub;
+
+	while (EXPR_TYPE(expr_at) != PTN_END) {
+		if (EXPR_TYPE(expr_at) == PTN_GROUP || EXPR_TYPE(expr_at) == PTN_NOT) {
+			if (!pattern_compile_2(expr_data, EXPR_DATA_0(expr_at), expr_max, expr_crs))
+				return 0;
+		}
+
+		if (EXPR_TYPE(expr_at) == PTN_ZERO_MORE || EXPR_TYPE(expr_at) == PTN_ONE_MORE ||
+				EXPR_TYPE(expr_at) == PTN_OPTIONAL) {
+			if (*expr_crs + 6 >= expr_max) return 0;
+
+			/* get previous expressions, there must
+			 * be at least something and a PTN_START */
+			expr_sub = EXPR_PRV(expr_at);
+			if (EXPR_TYPE(expr_sub) == PTN_START) return 0;
+			expr_prv = EXPR_PRV(expr_sub);
+
+			/* create start expression */
+			expr_start = *expr_crs;
+			EXPR_TYPE(expr_start) = PTN_START;
+			EXPR_PRV(expr_start) = PTN_END;
+			EXPR_NXT(expr_start) = expr_sub;
+			*expr_crs += 3;
+
+			/* create end expression */
+			expr_end = *expr_crs;
+			EXPR_TYPE(expr_end) = PTN_END;
+			EXPR_PRV(expr_end) = expr_sub;
+			EXPR_NXT(expr_end) = expr_at;
+			*expr_crs += 3;
+
+			/* relink previous expression before sub expression */
+			EXPR_DATA_0(expr_at) = expr_start;
+			EXPR_NXT(expr_prv) = expr_at;
+			EXPR_PRV(expr_at) = expr_prv;
+
+			/* relink sub expression to start and end */
+			EXPR_PRV(expr_sub) = expr_start;
+			EXPR_NXT(expr_sub) = expr_end;
+		}
+
+		expr_at = EXPR_NXT(expr_at);
+	}
+
+	return 1;
+}
+
+/* Resolves alternative expressions.
+ */
+static int
+pattern_compile_3(
+		widechar *expr_data, int expr_at, const int expr_max, widechar *expr_crs) {
+	int expr_mrk, expr_start, expr_end, expr_sub_start, expr_sub_end;
+
+	while (EXPR_TYPE(expr_at) != PTN_END) {
+		if (EXPR_TYPE(expr_at) == PTN_GROUP || EXPR_TYPE(expr_at) == PTN_NOT ||
+				EXPR_TYPE(expr_at) == PTN_OPTIONAL ||
+				EXPR_TYPE(expr_at) == PTN_ZERO_MORE ||
+				EXPR_TYPE(expr_at) == PTN_ONE_MORE) {
+			if (!pattern_compile_3(expr_data, EXPR_DATA_0(expr_at), expr_max, expr_crs))
+				return 0;
+		}
+
+		if (EXPR_TYPE(expr_at) == PTN_ALTERNATE) {
+			if (*expr_crs + 12 >= expr_max) return 0;
+
+			/* get previous start expression,
+			 * can include alternate expressions */
+			expr_mrk = EXPR_PRV(expr_at);
+			if (EXPR_TYPE(expr_mrk) == PTN_START) return 0;
+			expr_sub_end = expr_mrk;
+			while (EXPR_TYPE(expr_mrk) != PTN_START) expr_mrk = EXPR_PRV(expr_mrk);
+			expr_sub_start = EXPR_NXT(expr_mrk);
+
+			/* create first start expression */
+			expr_start = *expr_crs;
+			EXPR_TYPE(expr_start) = PTN_START;
+			EXPR_PRV(expr_start) = PTN_END;
+			EXPR_NXT(expr_start) = expr_sub_start;
+			*expr_crs += 3;
+
+			/* create first end expression */
+			expr_end = *expr_crs;
+			EXPR_TYPE(expr_end) = PTN_END;
+			EXPR_PRV(expr_end) = expr_sub_end;
+			EXPR_NXT(expr_end) = expr_at;
+			*expr_crs += 3;
+
+			/* relink previous expression before sub expression */
+			EXPR_DATA_0(expr_at) = expr_start;
+			EXPR_NXT(expr_mrk) = expr_at;
+			EXPR_PRV(expr_at) = expr_mrk;
+
+			/* relink sub expression to start and end */
+			EXPR_PRV(expr_sub_start) = expr_start;
+			EXPR_NXT(expr_sub_end) = expr_end;
+
+			/* get following PTN_END or PTN_ALTERNATE expression */
+			expr_mrk = EXPR_NXT(expr_at);
+			if (EXPR_TYPE(expr_mrk) == PTN_END || EXPR_TYPE(expr_mrk) == PTN_ALTERNATE)
+				return 0;
+			expr_sub_start = expr_mrk;
+			while (EXPR_TYPE(expr_mrk) != PTN_END && EXPR_TYPE(expr_mrk) != PTN_ALTERNATE)
+				expr_mrk = EXPR_NXT(expr_mrk);
+			expr_sub_end = EXPR_PRV(expr_mrk);
+
+			/* create first start expression */
+			expr_start = *expr_crs;
+			EXPR_TYPE(expr_start) = PTN_START;
+			EXPR_PRV(expr_start) = PTN_END;
+			EXPR_NXT(expr_start) = expr_sub_start;
+			*expr_crs += 3;
+
+			/* create first end expression */
+			expr_end = *expr_crs;
+			EXPR_TYPE(expr_end) = PTN_END;
+			EXPR_PRV(expr_end) = expr_sub_end;
+			EXPR_NXT(expr_end) = expr_at;
+			*expr_crs += 3;
+
+			/* relink following expression before sub expression */
+			EXPR_DATA_1(expr_at) = expr_start;
+			EXPR_PRV(expr_mrk) = expr_at;
+			EXPR_NXT(expr_at) = expr_mrk;
+
+			/* relink sub expression to start and end */
+			EXPR_PRV(expr_sub_start) = expr_start;
+			EXPR_NXT(expr_sub_end) = expr_end;
+
+			/* check expressions were after alternate and got moved into
+			 * a sub expression, previous expressions already checked */
+			if (!pattern_compile_3(expr_data, EXPR_DATA_1(expr_at), expr_max, expr_crs))
+				return 0;
+		}
+
+		expr_at = EXPR_NXT(expr_at);
+	}
+
+	return 1;
+}
+
+int EXPORT_CALL
+_lou_pattern_compile(const widechar *input, const int input_max, widechar *expr_data,
+		const int expr_max, const TranslationTableHeader *t) {
+	int input_crs;
+
+	table = t;
+	input_crs = 0;
+	expr_data[0] = 2;
+	expr_data[1] = 0;
+
+	if (!pattern_compile_1(input, input_max, &input_crs, expr_data, expr_max,
+				&expr_data[0], &expr_data[1]))
+		return 0;
+
+	/* shift past the last end */
+	expr_data[0] += 3;
+
+	if (!pattern_compile_2(expr_data, 2, expr_max, &expr_data[0])) return 0;
+
+	if (!pattern_compile_3(expr_data, 2, expr_max, &expr_data[0])) return 0;
+
+	return expr_data[0];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+static void
+pattern_reverse_expression(widechar *expr_data, const int expr_start);
+
+static void
+pattern_reverse_branch(widechar *expr_data, const int expr_at) {
+	widechar expr_swap;
+
+	switch (EXPR_TYPE(expr_at)) {
+	case PTN_ALTERNATE:
+
+		pattern_reverse_expression(expr_data, EXPR_DATA_0(expr_at));
+		expr_swap = EXPR_DATA_0(expr_at);
+		EXPR_DATA_0(expr_at) = EXPR_DATA_1(expr_at);
+		EXPR_DATA_1(expr_at) = expr_swap;
+
+	case PTN_GROUP:
+	case PTN_NOT:
+	case PTN_ONE_MORE:
+	case PTN_ZERO_MORE:
+	case PTN_OPTIONAL:
+
+		pattern_reverse_expression(expr_data, EXPR_DATA_0(expr_at));
+	}
+}
+
+static void
+pattern_reverse_expression(widechar *expr_data, const int expr_start) {
+	widechar expr_end, expr_crs, expr_prv;
+
+	expr_end = EXPR_NXT(expr_start);
+
+	/* empty expression */
+	if (EXPR_TYPE(expr_end) == PTN_END) return;
+
+	/* find end expression */
+	while (EXPR_TYPE(expr_end) != PTN_END) expr_end = EXPR_NXT(expr_end);
+
+	expr_crs = EXPR_PRV(expr_end);
+	expr_prv = EXPR_PRV(expr_crs);
+
+	/* relink expression before end expression */
+	EXPR_NXT(expr_start) = expr_crs;
+	EXPR_PRV(expr_crs) = expr_start;
+	EXPR_NXT(expr_crs) = expr_prv;
+
+	/* reverse any branching expressions */
+	pattern_reverse_branch(expr_data, expr_crs);
+
+	while (expr_prv != expr_start) {
+		/* shift current expression */
+		expr_crs = expr_prv;
+		expr_prv = EXPR_PRV(expr_prv);
+
+		/* reverse any branching expressions */
+		pattern_reverse_branch(expr_data, expr_crs);
+
+		/* relink current expression */
+		EXPR_PRV(expr_crs) = EXPR_NXT(expr_crs);
+		EXPR_NXT(expr_crs) = expr_prv;
+	}
+
+	/* relink expression after start expression */
+	EXPR_PRV(expr_crs) = EXPR_NXT(expr_crs);
+	EXPR_NXT(expr_crs) = expr_end;
+	EXPR_PRV(expr_end) = expr_crs;
+}
+
+void EXPORT_CALL
+_lou_pattern_reverse(widechar *expr_data) {
+	pattern_reverse_expression(expr_data, 2);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+static int
+pattern_check_chars(const widechar input_char, const widechar *expr_data) {
+	int expr_cnt, i;
+
+	expr_cnt = expr_data[0] + 1;
+
+	for (i = 1; i < expr_cnt; i++)
+		if (input_char == expr_data[i]) break;
+
+	if (i == expr_cnt) return 0;
+	return 1;
+}
+
+static int
+pattern_check_attrs(const widechar input_char, const widechar *expr_data) {
+	int attrs;
+
+	attrs = ((expr_data[0] << 16) | expr_data[1]) & ~(CTC_EndOfInput | CTC_EmpMatch);
+	if (!checkAttr(input_char, attrs, 0)) return 0;
+	return 1;
+}
+
+static int
+pattern_check_expression(const widechar *const input, int *input_crs,
+		const int input_minmax, const int input_dir, const widechar *const expr_data,
+		int (*hook)(const widechar input, const int data_len), widechar *hook_data,
+		const int hook_max, int expr_crs, int not, int loop_crs, int *loop_cnts) {
+	int input_crs_prv, input_start, attrs, ret, i;
+	const widechar *data;
+
+	data = NULL;
+
+	/* save input_crs to know if loop consumed input */
+	input_start = *input_crs;
+
+	CHECK_OUTPUT(START, 0, __LINE__, "check start")
+
+	while (!(EXPR_TYPE(expr_crs) == PTN_END && EXPR_TYPE(expr_crs) == PTN_END)) {
+		/* end of input expression */
+		if (EXPR_TYPE(expr_crs) == PTN_END_OF_INPUT) {
+			if (*input_crs * input_dir >= input_minmax * input_dir) {
+				if (not)
+					CHECK_OUTPUT(RETURN, 0, __LINE__,
+							"end of input failed:  no input and not ")
+				else
+					CHECK_OUTPUT(RETURN, 1, __LINE__, "end of input passed:  no input")
+				return !not;
+			} else {
+				if (not)
+					CHECK_OUTPUT(
+							RETURN, 1, __LINE__, "end of input passed:  input and not")
+				else
+					CHECK_OUTPUT(RETURN, 0, __LINE__, "end of input failed:  input")
+				return not;
+			}
+		}
+
+		/* no more input */
+		if (*input_crs * input_dir >= input_minmax * input_dir) {
+			switch (EXPR_TYPE(expr_crs)) {
+			case PTN_ATTRIBUTES:
+
+				attrs = (EXPR_DATA_0(expr_crs) << 16);
+				if (attrs & CTC_EndOfInput) {
+					if (not) {
+						CHECK_OUTPUT(RETURN, 0, __LINE__,
+								"attributes failed:  end of input attribute:  not")
+						return 0;
+					}
+					CHECK_OUTPUT(RETURN, 1, __LINE__,
+							"attributes passed:  end of input attribute")
+					return 1;
+				}
+				CHECK_OUTPUT(RETURN, 0, __LINE__,
+						"attributes failed:  no end of input attribute")
+				return 0;
+
+			case PTN_ANY:
+			case PTN_CHARS:
+
+				CHECK_OUTPUT(RETURN, 0, __LINE__, "chars failed:  no input")
+				return 0;
+			}
+
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "no input")
+		}
+
+		switch (EXPR_TYPE(expr_crs)) {
+
+		case PTN_START:
+
+			expr_crs = EXPR_NXT(expr_crs);
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "start next")
+			break;
+
+		case PTN_GROUP:
+
+			expr_crs = EXPR_DATA_0(expr_crs);
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "group next")
+			break;
+
+		case PTN_NOT:
+
+			not = !not;
+			expr_crs = EXPR_DATA_0(expr_crs);
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "not next")
+			break;
+
+		case PTN_ONE_MORE:
+
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "loop+ start")
+
+		case PTN_ZERO_MORE:
+
+			/* check if loop already started */
+			if (expr_crs == loop_crs) {
+				loop_cnts[EXPR_DATA_1(loop_crs)]++;
+				CHECK_OUTPUT(SHOW, 0, __LINE__, "loop again")
+			} else {
+				/* check if loop nested, wasn't running but has a count */
+				if (loop_cnts[EXPR_DATA_1(expr_crs)]) {
+					CHECK_OUTPUT(SHOW, 0, __LINE__, "loop already running")
+					goto loop_next;
+				}
+
+				/* start loop */
+				loop_crs = expr_crs;
+				loop_cnts[EXPR_DATA_1(loop_crs)] = 1;
+				CHECK_OUTPUT(SHOW, 0, __LINE__, "loop start")
+			}
+
+			/* start loop expression */
+			input_crs_prv = *input_crs;
+			ret = pattern_check_expression(input, input_crs, input_minmax, input_dir,
+					expr_data, hook, hook_data, hook_max, EXPR_DATA_0(expr_crs), not,
+					loop_crs, loop_cnts);
+			if (ret) {
+				CHECK_OUTPUT(RETURN, 1, __LINE__, "loop passed")
+				return 1;
+			}
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "loop failed")
+			*input_crs = input_crs_prv;
+
+			/* check loop count */
+			loop_cnts[EXPR_DATA_1(loop_crs)]--;
+			if (EXPR_TYPE(expr_crs) == PTN_ONE_MORE) {
+				if (loop_cnts[EXPR_DATA_1(loop_crs)] < 1) {
+					CHECK_OUTPUT(RETURN, 0, __LINE__, "loop+ failed")
+					return 0;
+				} else
+					CHECK_OUTPUT(SHOW, 0, __LINE__, "loop+ passed")
+			}
+
+		/* continue after loop */
+		loop_next:
+			expr_crs = EXPR_NXT(expr_crs);
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "loop next")
+			break;
+
+		case PTN_OPTIONAL:
+
+			/* save current state */
+			input_crs_prv = *input_crs;
+
+			/* start optional expression */
+			CHECK_OUTPUT(CALL, 0, __LINE__, "option start")
+			if (pattern_check_expression(input, input_crs, input_minmax, input_dir,
+						expr_data, hook, hook_data, hook_max, EXPR_DATA_0(expr_crs), not,
+						loop_crs, loop_cnts)) {
+				CHECK_OUTPUT(RETURN, 1, __LINE__, "option passed")
+				return 1;
+			}
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "option failed")
+
+			/* continue after optional expression */
+			*input_crs = input_crs_prv;
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "no option start")
+			expr_crs = EXPR_NXT(expr_crs);
+			break;
+
+		case PTN_ALTERNATE:
+
+			/* save current state */
+			input_crs_prv = *input_crs;
+
+			/* start first expression */
+			CHECK_OUTPUT(CALL, 0, __LINE__, "or 1 start")
+			if (pattern_check_expression(input, input_crs, input_minmax, input_dir,
+						expr_data, hook, hook_data, hook_max, EXPR_DATA_0(expr_crs), not,
+						loop_crs, loop_cnts)) {
+				CHECK_OUTPUT(RETURN, 1, __LINE__, "or 1 passed")
+				return 1;
+			}
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "or 1 failed")
+
+			/* start second expression (no need to push) */
+			*input_crs = input_crs_prv;
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "or 2 start")
+			expr_crs = EXPR_DATA_1(expr_crs);
+			break;
+
+		case PTN_ANY:
+
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "any")
+			*input_crs += input_dir;
+			expr_crs = EXPR_NXT(expr_crs);
+			break;
+
+		case PTN_ATTRIBUTES:
+
+			ret = pattern_check_attrs(input[*input_crs], EXPR_CONST_DATA(expr_crs));
+			if (ret && not) {
+				CHECK_OUTPUT(RETURN, 0, __LINE__, "attributes failed:  not");
+				return 0;
+			}
+			if (!ret && !not) {
+				CHECK_OUTPUT(RETURN, 0, __LINE__, "attributes failed");
+				return 0;
+			}
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "attributes passed")
+			*input_crs += input_dir;
+			expr_crs = EXPR_NXT(expr_crs);
+			break;
+
+		case PTN_CHARS:
+
+			ret = pattern_check_chars(input[*input_crs], EXPR_CONST_DATA(expr_crs));
+			if (ret && not) {
+				CHECK_OUTPUT(RETURN, 0, __LINE__, "chars failed:  not");
+				return 0;
+			}
+			if (!ret && !not) {
+				CHECK_OUTPUT(RETURN, 0, __LINE__, "chars failed");
+				return 0;
+			}
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "chars passed")
+			*input_crs += input_dir;
+			expr_crs = EXPR_NXT(expr_crs);
+			break;
+
+		case PTN_HOOK:
+
+			if (hook == NULL) {
+				CHECK_OUTPUT(RETURN, 0, __LINE__, "hook failed:  NULL");
+				return 0;
+			}
+
+			/* copy expression data */
+			data = EXPR_CONST_DATA(expr_crs);
+			for (i = 0; i < data[0]; i++) hook_data[i] = data[i + 1];
+
+			/* call hook function */
+			ret = hook(input[*input_crs], data[0]);
+			if (ret && not) {
+				CHECK_OUTPUT(RETURN, 0, __LINE__, "hook failed:  not");
+				return 0;
+			}
+			if (!ret && !not) {
+				CHECK_OUTPUT(RETURN, 0, __LINE__, "hook failed");
+				return 0;
+			}
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "hook passed")
+			*input_crs += input_dir;
+			expr_crs = EXPR_NXT(expr_crs);
+			break;
+
+		case PTN_END:
+			break;
+
+		default:
+
+			CHECK_OUTPUT(RETURN, 0, __LINE__, "unknown opcode")
+			return 0;
+		}
+
+		/* check end expression  */
+		while (EXPR_TYPE(expr_crs) == PTN_END) {
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "end")
+
+			/* check for end of expressions */
+			if (EXPR_NXT(expr_crs) == PTN_END) break;
+
+			expr_crs = EXPR_NXT(expr_crs);
+
+			/* returning loop */
+			if (EXPR_TYPE(expr_crs) == PTN_ZERO_MORE ||
+					EXPR_TYPE(expr_crs) == PTN_ONE_MORE) {
+				CHECK_OUTPUT(SHOW, 0, __LINE__, "end loop")
+
+				/* check that loop consumed input */
+				if (*input_crs == input_start) {
+					CHECK_OUTPUT(RETURN, 0, __LINE__, "loop failed:  did not consume")
+					return 0;
+				}
+
+				/* loops do not continue to the next expression */
+				break;
+			}
+
+			/* returning not */
+			if (EXPR_TYPE(expr_crs) == PTN_NOT) not = !not;
+
+			expr_crs = EXPR_NXT(expr_crs);
+
+			CHECK_OUTPUT(SHOW, 0, __LINE__, "end next")
+		}
+
+		CHECK_OUTPUT(SHOW, 0, __LINE__, "check next")
+	}
+
+	CHECK_OUTPUT(RETURN, 1, __LINE__, "check passed:  end of expression");
+	return 1;
+}
+
+static int
+pattern_check_hook(const widechar *input, const int input_start, const int input_minmax,
+		const int input_dir, const widechar *expr_data,
+		int (*hook)(const widechar input, const int data_len), widechar *hook_data,
+		const int hook_max) {
+	int input_crs, ret, *loop_cnts;
+
+	input_crs = input_start;
+	loop_cnts = malloc(expr_data[1] * sizeof(int));
+	memset(loop_cnts, 0, expr_data[1] * sizeof(int));
+	ret = pattern_check_expression(input, &input_crs, input_minmax, input_dir, expr_data,
+			hook, hook_data, hook_max, 2, 0, 0, loop_cnts);
+	free(loop_cnts);
+	return ret;
+}
+
+int EXPORT_CALL
+_lou_pattern_check(const widechar *input, const int input_start, const int input_minmax,
+		const int input_dir, const widechar *expr_data, const TranslationTableHeader *t) {
+#ifdef CHECK_OUTPUT_DEFINED
+	pattern_output(expr_data);
+#endif
+	table = t;
+	return pattern_check_hook(
+			input, input_start, input_minmax, input_dir, expr_data, NULL, NULL, 0);
+}
+
+////////////////////////////////////////////////////////////////////////////////
diff --git a/liblouis/liblouis/utils.c b/liblouis/liblouis/utils.c
new file mode 100644
index 0000000..dc52629
--- /dev/null
+++ b/liblouis/liblouis/utils.c
@@ -0,0 +1,240 @@
+/* liblouis Braille Translation and Back-Translation Library
+
+   Based on the Linux screenreader BRLTTY, copyright (C) 1999-2006 by The
+   BRLTTY Team
+
+   Copyright (C) 2004, 2005, 2006 ViewPlus Technologies, Inc. www.viewplus.com
+   Copyright (C) 2004, 2005, 2006 JJB Software, Inc. www.jjb-software.com
+   Copyright (C) 2016 Mike Gray, American Printing House for the Blind
+   Copyright (C) 2016 Davy Kager, Dedicon
+
+   This file is part of liblouis.
+
+   liblouis is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation, either version 2.1 of the License, or
+   (at your option) any later version.
+
+   liblouis is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file
+ * @brief Common utility functions
+ */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#include "internal.h"
+#include "config.h"
+
+/* Contributed by Michel Such <michel.such@free.fr> */
+#ifdef _WIN32
+
+/* Adapted from BRLTTY code (see sys_progs_wihdows.h) */
+
+#include <shlobj.h>
+
+static void *
+reallocWrapper(void *address, size_t size) {
+	if (!(address = realloc(address, size)) && size) _lou_outOfMemory();
+	return address;
+}
+
+static char *
+strdupWrapper(const char *string) {
+	char *address = strdup(string);
+	if (!address) _lou_outOfMemory();
+	return address;
+}
+
+char *EXPORT_CALL
+lou_getProgramPath(void) {
+	char *path = NULL;
+	HMODULE handle;
+
+	if ((handle = GetModuleHandle(NULL))) {
+		DWORD size = 0X80;
+		char *buffer = NULL;
+
+		while (1) {
+			buffer = reallocWrapper(buffer, size <<= 1);
+
+			{
+				// As the "UNICODE" Windows define may have been set at compilation,
+				// This call must be specifically GetModuleFilenameA as further code
+				// expects it to be single byte chars.
+				DWORD length = GetModuleFileNameA(handle, buffer, size);
+
+				if (!length) {
+					printf("GetModuleFileName\n");
+					exit(3);
+				}
+
+				if (length < size) {
+					buffer[length] = 0;
+					path = strdupWrapper(buffer);
+
+					while (length > 0)
+						if (path[--length] == '\\') break;
+
+					strncpy(path, path, length + 1);
+					path[length + 1] = '\0';
+					break;
+				}
+			}
+		}
+
+		free(buffer);
+	} else {
+		printf("GetModuleHandle\n");
+		exit(3);
+	}
+
+	return path;
+}
+#endif
+/* End of MS contribution */
+
+int EXPORT_CALL
+_lou_stringHash(const widechar *c) {
+	/* hash function for strings */
+	unsigned long int makeHash =
+			(((unsigned long int)c[0] << 8) + (unsigned long int)c[1]) % HASHNUM;
+	return (int)makeHash;
+}
+
+int EXPORT_CALL
+_lou_charHash(widechar c) {
+	unsigned long int makeHash = (unsigned long int)c % HASHNUM;
+	return (int)makeHash;
+}
+
+char *EXPORT_CALL
+_lou_showString(widechar const *chars, int length) {
+	/* Translate a string of characters to the encoding used in character
+	 * operands */
+	int charPos;
+	int bufPos = 0;
+	static char scratchBuf[MAXSTRING];
+	scratchBuf[bufPos++] = '\'';
+	for (charPos = 0; charPos < length && bufPos < (MAXSTRING - 2); charPos++) {
+		if (chars[charPos] >= 32 && chars[charPos] < 127)
+			scratchBuf[bufPos++] = (char)chars[charPos];
+		else {
+			char hexbuf[20];
+			int hexLength;
+			char escapeLetter;
+
+			int leadingZeros;
+			int hexPos;
+			hexLength = sprintf(hexbuf, "%x", chars[charPos]);
+			switch (hexLength) {
+			case 1:
+			case 2:
+			case 3:
+			case 4:
+				escapeLetter = 'x';
+				leadingZeros = 4 - hexLength;
+				break;
+			case 5:
+				escapeLetter = 'y';
+				leadingZeros = 0;
+				break;
+			case 6:
+			case 7:
+			case 8:
+				escapeLetter = 'z';
+				leadingZeros = 8 - hexLength;
+				break;
+			default:
+				escapeLetter = '?';
+				leadingZeros = 0;
+				break;
+			}
+			if ((bufPos + leadingZeros + hexLength + 4) >= (MAXSTRING - 2)) break;
+			scratchBuf[bufPos++] = '\\';
+			scratchBuf[bufPos++] = escapeLetter;
+			for (hexPos = 0; hexPos < leadingZeros; hexPos++) scratchBuf[bufPos++] = '0';
+			for (hexPos = 0; hexPos < hexLength; hexPos++)
+				scratchBuf[bufPos++] = hexbuf[hexPos];
+		}
+	}
+	scratchBuf[bufPos++] = '\'';
+	scratchBuf[bufPos] = 0;
+	return scratchBuf;
+}
+
+/**
+ * Translate a sequence of dots to the encoding used in dots operands.
+ */
+char *EXPORT_CALL
+_lou_showDots(widechar const *dots, int length) {
+	int bufPos = 0;
+	static char scratchBuf[MAXSTRING];
+	for (int dotsPos = 0; dotsPos < length && bufPos < (MAXSTRING - 1); dotsPos++) {
+		for (int mappingPos = 0; dotMapping[mappingPos].key; mappingPos++) {
+			if ((dots[dotsPos] & dotMapping[mappingPos].key) &&
+					(bufPos < (MAXSTRING - 1)))
+				scratchBuf[bufPos++] = dotMapping[mappingPos].value;
+		}
+		if ((dots[dotsPos] == B16) && (bufPos < (MAXSTRING - 1)))
+			scratchBuf[bufPos++] = '0';
+		if ((dotsPos != length - 1) && (bufPos < (MAXSTRING - 1)))
+			scratchBuf[bufPos++] = '-';
+	}
+	scratchBuf[bufPos] = 0;
+	return scratchBuf;
+}
+
+/**
+ * Mapping between character attribute and textual representation
+ */
+const static intCharTupple attributeMapping[] = {
+	{ CTC_Space, 's' }, { CTC_Letter, 'l' }, { CTC_Digit, 'd' }, { CTC_Punctuation, 'p' },
+	{ CTC_UpperCase, 'U' }, { CTC_LowerCase, 'u' }, { CTC_Math, 'm' }, { CTC_Sign, 'S' },
+	{ CTC_LitDigit, 'D' }, { CTC_Class1, 'w' }, { CTC_Class2, 'x' }, { CTC_Class3, 'y' },
+	{ CTC_Class4, 'z' }, 0,
+};
+
+/**
+ * Show attributes using the letters used after the $ in multipass
+ * opcodes.
+ */
+char *EXPORT_CALL
+_lou_showAttributes(TranslationTableCharacterAttributes a) {
+	int bufPos = 0;
+	static char scratchBuf[MAXSTRING];
+	for (int mappingPos = 0; attributeMapping[mappingPos].key; mappingPos++) {
+		if ((a & attributeMapping[mappingPos].key) && bufPos < (MAXSTRING - 1))
+			scratchBuf[bufPos++] = attributeMapping[mappingPos].value;
+	}
+	scratchBuf[bufPos] = 0;
+	return scratchBuf;
+}
+
+void EXPORT_CALL
+_lou_outOfMemory(void) {
+	_lou_logMessage(LOG_FATAL, "liblouis: Insufficient memory\n");
+	exit(3);
+}
+
+#ifdef DEBUG
+void EXPORT_CALL
+_lou_debugHook(void) {
+	char *hook = "debug hook";
+	printf("%s\n", hook);
+}
+#endif
diff --git a/liblouis/libyaml_mingw.patch b/liblouis/libyaml_mingw.patch
new file mode 100644
index 0000000..f86f26c
--- /dev/null
+++ b/liblouis/libyaml_mingw.patch
@@ -0,0 +1,26 @@
+diff --git a/include/yaml.h b/include/yaml.h
+index 5a04d36..c6e8b71 100644
+--- a/include/yaml.h
++++ b/include/yaml.h
+@@ -26,7 +26,9 @@ extern "C" {
+ 
+ /** The public API declaration. */
+ 
+-#ifdef _WIN32
++#if defined(__MINGW32__)
++#   define  YAML_DECLARE(type)  type
++#elif defined(WIN32)
+ #   if defined(YAML_DECLARE_STATIC)
+ #       define  YAML_DECLARE(type)  type
+ #   elif defined(YAML_DECLARE_EXPORT)
+diff --git a/yaml-0.1.pc.in b/yaml-0.1.pc.in
+index c566abf..70c8008 100644
+--- a/yaml-0.1.pc.in
++++ b/yaml-0.1.pc.in
+@@ -6,5 +6,5 @@ libdir=@libdir@
+ Name: LibYAML
+ Description: Library to parse and emit YAML
+ Version: @PACKAGE_VERSION@
+-Cflags:
++Cflags: -I${includedir}
+ Libs: -L${libdir} -lyaml
diff --git a/liblouis/man/Makefile.am b/liblouis/man/Makefile.am
new file mode 100644
index 0000000..14cd263
--- /dev/null
+++ b/liblouis/man/Makefile.am
@@ -0,0 +1,68 @@
+# Only build man pages if configure found the HELP2MAN tool
+if HAVE_HELP2MAN
+man_MANS =					\
+	lou_allround.1				\
+	lou_checkhyphens.1			\
+	lou_checktable.1			\
+	lou_debug.1				\
+	lou_translate.1				\
+	lou_trace.1				\
+	lou_checkyaml.1				\
+	lou_tableinfo.1
+endif
+
+CLEANFILES = $(man_MANS)
+
+# The man pages depend on the --help strings and the version number.
+common_mandeps = $(top_srcdir)/configure.ac
+
+# We are not distributing the man pages otherwise we would need rules
+# such as below. The user will have to install help2man if they want
+# man pages.
+# lou_allround.1: $(top_srcdir)/tools/lou_allround.c $(common_mandeps)
+# 	 cd ../liblouis && $(MAKE) $(AM_MAKEFLAGS) liblouis.la
+# 	 cd ../gnulib && $(MAKE) $(AM_MAKEFLAGS) libgnu.la
+# 	 cd ../tools && $(MAKE) $(AM_MAKEFLAGS) lou_allround$(EXEEXT)
+# 	$(HELP2MAN) ../tools/lou_allround$(EXEEXT) --info-page=$(PACKAGE) --output=$@
+
+# Depend on the source, not the binary; we don't need to regenerate the
+# binary when any source file changes, only the main one.
+lou_allround.1: $(top_srcdir)/tools/lou_allround.c $(common_mandeps)
+	$(HELP2MAN) ../tools/lou_allround$(EXEEXT) --info-page=$(PACKAGE) \
+	--name="Test every capability of the liblouis library" \
+	--output=$@
+
+lou_checkhyphens.1: $(top_srcdir)/tools/lou_checkhyphens.c $(common_mandeps)
+	$(HELP2MAN) ../tools/lou_checkhyphens$(EXEEXT) --info-page=$(PACKAGE) \
+	--name="Check the accuracy of hyphenation in liblouis Braille translation tables" \
+	--output=$@
+
+lou_checktable.1: $(top_srcdir)/tools/lou_checktable.c $(common_mandeps)
+	$(HELP2MAN) ../tools/lou_checktable$(EXEEXT) --info-page=$(PACKAGE) \
+	--name="Test a liblouis Braille translation table" \
+	--output=$@
+
+lou_debug.1: $(top_srcdir)/tools/lou_debug.c $(common_mandeps)
+	$(HELP2MAN) ../tools/lou_debug$(EXEEXT) --info-page=$(PACKAGE) \
+	--name="A debugger for liblouis Braille translation tables" \
+	--output=$@
+
+lou_translate.1: $(top_srcdir)/tools/lou_translate.c $(common_mandeps)
+	$(HELP2MAN) ../tools/lou_translate$(EXEEXT) --info-page=$(PACKAGE) \
+	--name="A Braille translator for large scale testing of liblouis Braille translation tables" \
+	--output=$@
+
+lou_trace.1: $(top_srcdir)/tools/lou_trace.c $(common_mandeps)
+	$(HELP2MAN) ../tools/lou_trace$(EXEEXT) --info-page=$(PACKAGE) \
+	--name="A tool to list all the rules that were used for a Braille translation" \
+	--output=$@
+
+lou_checkyaml.1: $(top_srcdir)/tools/lou_checkyaml.c $(common_mandeps)
+	$(HELP2MAN) ../tools/lou_checkyaml$(EXEEXT) --info-page=$(PACKAGE) \
+	--name="A tool to check Braille tests defined in a YAML file" \
+	--output=$@
+
+lou_tableinfo.1: $(top_srcdir)/tools/lou_tableinfo.c $(common_mandeps)
+	$(HELP2MAN) ../tools/lou_tableinfo$(EXEEXT) --info-page=$(PACKAGE) \
+	--name="A tool to query meta data from a liblouis Braille translation table" \
+	--output=$@
diff --git a/liblouis/python/Makefile.am b/liblouis/python/Makefile.am
new file mode 100644
index 0000000..e076110
--- /dev/null
+++ b/liblouis/python/Makefile.am
@@ -0,0 +1,4 @@
+SUBDIRS = louis
+
+EXTRA_DIST = setup.py README
+
diff --git a/liblouis/python/README b/liblouis/python/README
new file mode 100644
index 0000000..abcb7d2
--- /dev/null
+++ b/liblouis/python/README
@@ -0,0 +1,16 @@
+Liblouis Python ctypes bindings
+
+These bindings allow you to use liblouis from within Python. The
+package is called "louis". See the documentation included in the
+module for usage instructions.
+
+These bindings use ctypes to access the liblouis shared library. The
+liblouis shared library needs to be located in the library search
+path. In most cases, if liblouis has been installed in a standard
+location on your system, this is already the case and the bindings
+will work without any additional steps.
+
+A standard distutils setup.py script is provided for installation
+tasks. To install this package for system wide use, run (as root):
+
+  python setup.py install
diff --git a/liblouis/python/examples/dtbook2brldtbook.xsl b/liblouis/python/examples/dtbook2brldtbook.xsl
new file mode 100644
index 0000000..7c644e3
--- /dev/null
+++ b/liblouis/python/examples/dtbook2brldtbook.xsl
@@ -0,0 +1,51 @@
+<?xml version='1.0'?>
+
+<!-- liblouis Braille Translation and Back-Translation Library -->
+
+<!-- Copyright (C) 2010 Swiss Library for the Blind, Visually Impaired and Print Disabled -->
+
+<!-- Copying and distribution of this file, with or without modification, -->
+<!-- are permitted in any medium without royalty provided the copyright -->
+<!-- notice and this notice are preserved. This file is offered as-is, -->
+<!-- without any warranty. -->
+
+<xsl:stylesheet 
+   version='1.0'
+   xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
+   xmlns:dtb="http://www.daisy.org/z3986/2005/dtbook/"	
+   xmlns:louis="http://liblouis.org/liblouis"
+   exclude-result-prefixes="dtb">
+  
+  <xsl:output omit-xml-declaration="no" encoding="UTF-8" method="xml"
+	      indent="yes" media-type="text/xml"/>
+
+  <xsl:param name="translation_table">de-ch-g2.ctb</xsl:param>
+
+  <xsl:template match="dtb:em">
+    <xsl:apply-templates mode="italic"/>
+  </xsl:template>
+
+  <xsl:template match="dtb:strong">
+    <xsl:apply-templates mode="bold"/>
+  </xsl:template>
+
+  <xsl:template match="text()">
+    <xsl:value-of select='louis:translate(string(),string($translation_table))'/>
+  </xsl:template>
+  
+  <xsl:template match="text()" mode="italic">
+    <xsl:value-of select='louis:translate(string(),string($translation_table),"italic")'/>
+  </xsl:template>
+  
+  <xsl:template match="text()" mode="bold">
+    <xsl:value-of select='louis:translate(string(),string($translation_table),"bold")'/>
+  </xsl:template>
+  
+  <xsl:template match="@*|node()">
+    <xsl:copy>
+      <xsl:apply-templates select="@*|node()"/>
+    </xsl:copy>
+  </xsl:template>
+  
+</xsl:stylesheet>
+
diff --git a/liblouis/python/examples/liblouisxslt.py b/liblouis/python/examples/liblouisxslt.py
new file mode 100755
index 0000000..2f1267b
--- /dev/null
+++ b/liblouis/python/examples/liblouisxslt.py
@@ -0,0 +1,70 @@
+#! /usr/bin/python -u
+#
+# liblouis Braille Translation and Back-Translation Library
+
+# Copyright (C) 2010 Swiss Library for the Blind, Visually Impaired and Print Disabled
+
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved. This file is offered as-is,
+# without any warranty.
+
+# This is a very simple example on how to extend libxslt to be able to
+# invoke liblouis from xslt. See also the accompanying
+# dtbook2brldtbook.xsl in the same directory which simpy copies a dtbook
+# xml and translates all the text node into Braille.
+
+import louis
+import libxml2
+import libxslt
+import sys
+import getopt
+from optparse import OptionParser
+
+nodeName = None
+
+emphasisMap = {
+    'plain_text' : louis.plain_text, 
+    'italic' : louis.italic, 
+    'underline' : louis.underline, 
+    'bold' : louis.bold, 
+    'computer_braille' : louis.computer_braille}
+
+def translate(ctx, str, translation_table, emphasis=None):
+    global nodeName
+    
+    try:
+        pctxt = libxslt.xpathParserContext(_obj=ctx)
+        ctxt = pctxt.context()
+        tctxt = ctxt.transformContext()
+        nodeName = tctxt.insertNode().name
+    except:
+        pass
+
+    typeform = len(str)*[emphasisMap[emphasis]] if emphasis else None
+    braille = louis.translate([translation_table], str.decode('utf-8'), typeform=typeform)[0]
+    return braille.encode('utf-8')
+
+def xsltProcess(styleFile, inputFile, outputFile):
+    """Transform an xml inputFile to an outputFile using the given styleFile"""
+    styledoc = libxml2.parseFile(styleFile)
+    style = libxslt.parseStylesheetDoc(styledoc)
+    doc = libxml2.parseFile(inputFile)
+    result = style.applyStylesheet(doc, None)
+    style.saveResultToFilename(outputFile, result, 0)
+    style.freeStylesheet()
+    doc.freeDoc()
+    result.freeDoc()
+
+libxslt.registerExtModuleFunction("translate", "http://liblouis.org/liblouis", translate)
+
+def main():
+    usage = "Usage: %prog [options] styleFile inputFile outputFile"
+    parser = OptionParser(usage)
+    (options, args) = parser.parse_args()
+    if len(args) != 3:
+        parser.error("incorrect number of arguments")
+    xsltProcess(args[0], args[1], args[2])
+
+if __name__ == "__main__":
+    main()
diff --git a/liblouis/python/louis/Makefile.am b/liblouis/python/louis/Makefile.am
new file mode 100644
index 0000000..fd02120
--- /dev/null
+++ b/liblouis/python/louis/Makefile.am
@@ -0,0 +1,8 @@
+EXTRA_DIST = __init__.py.in
+CLEANFILES = __init__.py __init__.pyc
+
+all:
+	source ../../liblouis/liblouis.la ; \
+	sed "s/###LIBLOUIS_SONAME###/$$dlname/" \
+		< $(srcdir)/__init__.py.in \
+		> __init__.py
diff --git a/liblouis/python/louis/__init__.py.in b/liblouis/python/louis/__init__.py.in
new file mode 100644
index 0000000..99ed32d
--- /dev/null
+++ b/liblouis/python/louis/__init__.py.in
@@ -0,0 +1,367 @@
+# Liblouis Python ctypes bindings
+#
+# Copyright (C) 2009, 2010 James Teh <jamie@jantrid.net>
+#
+# This file is part of liblouis.
+# 
+# liblouis is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published
+# by the Free Software Foundation, either version 2.1 of the License, or
+# (at your option) any later version.
+# 
+# liblouis is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
+# 
+
+"""Liblouis Python ctypes bindings
+These bindings allow you to use the liblouis braille translator and back-translator library from within Python.
+This documentation is only a Python helper.
+Please see the liblouis documentation for more information.
+
+Most of these functions take a C{tableList} argument which specifies
+a list of translation tables to use. Please see the liblouis documentation
+concerning the C{tableList} parameter to the C{lou_translateString}
+function for information about how liblouis searches for these tables.
+
+@author: Michael Curran <mick@kulgan.net>
+@author: James Teh <jamie@jantrid.net>
+@author: Eitan Isaacson <eitan@ascender.com>
+@author: Michael Whapples <mwhapples@aim.com>
+@author: Davy Kager <mail@davykager.nl>
+"""
+
+from ctypes import *
+import struct
+import atexit
+import sys
+
+# Some general utility functions
+def _createTablesString(tablesList):
+    """Creates a tables string for liblouis calls"""
+    return b",".join([x.encode("ASCII") if isinstance(x, str) else bytes(x) for x in tablesList])
+
+def _createTypeformbuf(length, typeform=None):
+    """Creates a typeform buffer for liblouis calls"""
+    return (c_ushort*length)(*typeform) if typeform else (c_ushort*length)()
+
+createStr = None
+if sys.version_info[0] == 2:
+    createStr = lambda x: unicode(x)
+else:
+    createStr = lambda x: str(x)
+
+#{ Module Configuration
+#: Specifies the number by which the input length should be multiplied
+#: to calculate the maximum output length.
+#: @type: int
+# This default will handle the case where every input character is
+# undefined in the translation table.
+outlenMultiplier = 4 + sizeof(c_wchar) * 2
+#}
+
+try:
+    # Native win32
+    _loader = windll
+except NameError:
+    # Unix/Cygwin
+    _loader = cdll
+liblouis = _loader["###LIBLOUIS_SONAME###"]
+
+atexit.register(liblouis.lou_free)
+
+liblouis.lou_version.restype = c_char_p
+
+liblouis.lou_charSize.restype = c_int
+
+liblouis.lou_translateString.argtypes = (
+    c_char_p, c_wchar_p, POINTER(c_int), c_wchar_p, 
+         POINTER(c_int), POINTER(c_ushort), POINTER(c_char), c_int)
+
+liblouis.lou_translate.argtypes = (
+    c_char_p, c_wchar_p, POINTER(c_int), c_wchar_p, 
+         POINTER(c_int), POINTER(c_ushort), POINTER(c_char), 
+         POINTER(c_int), POINTER(c_int), POINTER(c_int), c_int)
+
+liblouis.lou_backTranslateString.argtypes = (
+         c_char_p, c_wchar_p, POINTER(c_int), c_wchar_p,
+         POINTER(c_int), POINTER(c_ushort), POINTER(c_char), c_int)
+
+liblouis.lou_backTranslate.argtypes = (
+         c_char_p, c_wchar_p, POINTER(c_int), c_wchar_p, POINTER(c_int),
+         POINTER(c_ushort), POINTER(c_char), POINTER(c_int), POINTER(c_int),
+         POINTER(c_int), c_int)
+
+liblouis.lou_hyphenate.argtypes = (
+         c_char_p, c_wchar_p, c_int, POINTER(c_char), c_int)
+
+liblouis.lou_checkTable.argtypes = (c_char_p,)
+
+liblouis.lou_compileString.argtypes = (c_char_p, c_char_p)
+
+liblouis.lou_getTypeformForEmphClass.argtypes = (c_char_p, c_char_p)
+
+def version():
+    """Obtain version information for liblouis.
+    @return: The version of liblouis, plus other information, such as
+        the release date and perhaps notable changes.
+    @rtype: str
+    """
+    return liblouis.lou_version().decode("ASCII")
+
+def charSize():
+    """Obtain charSize information for liblouis.
+    @return: The size of the widechar with which liblouis was compiled.
+    @rtype: int
+    """
+    return liblouis.lou_charSize()
+
+def translate(tableList, inbuf, typeform=None, cursorPos=0, mode=0):
+    """Translate a string of characters, providing position information.
+    @param tableList: A list of translation tables.
+    @type tableList: list of str
+    @param inbuf: The string to translate.
+    @type inbuf: str
+    @param typeform: A list of typeform constants indicating the typeform for each position in inbuf,
+        C{None} for no typeform information.
+    @type typeform: list of int
+    @param cursorPos: The position of the cursor in inbuf.
+    @type cursorPos: int
+    @param mode: The translation mode; add multiple values for a combined mode.
+    @type mode: int
+    @return: A tuple of: the translated string,
+        a list of input positions for each position in the output,
+        a list of output positions for each position in the input, and
+        the position of the cursor in the output.
+    @rtype: (str, list of int, list of int, int)
+    @raise RuntimeError: If a complete translation could not be done.
+    @see: lou_translate in the liblouis documentation
+    """
+    tablesString = _createTablesString(tableList)
+    inbuf = createStr(inbuf)
+    inlen = c_int(len(inbuf))
+    outlen = c_int(inlen.value*outlenMultiplier)
+    outbuf = create_unicode_buffer(outlen.value)
+    typeformbuf = None
+    if typeform:
+        typeformbuf = _createTypeformbuf(outlen.value, typeform)
+    inPos = (c_int*outlen.value)()
+    outPos = (c_int*inlen.value)()
+    cursorPos = c_int(cursorPos)
+    if not liblouis.lou_translate(tablesString, inbuf, byref(inlen), 
+                                  outbuf, byref(outlen), typeformbuf, 
+                                  None, outPos, inPos, byref(cursorPos), mode):
+        raise RuntimeError("Can't translate: tables %s, inbuf %s, typeform %s, cursorPos %s, mode %s"%(tableList, inbuf, typeform, cursorPos, mode))
+    if isinstance(typeform, list):
+        typeform[:] = list(typeformbuf)
+    return outbuf.value, inPos[:outlen.value], outPos[:inlen.value], cursorPos.value
+
+def translateString(tableList, inbuf, typeform=None, mode=0):
+    """Translate a string of characters.
+    @param tableList: A list of translation tables.
+    @type tableList: list of str
+    @param inbuf: The string to translate.
+    @type inbuf: str
+    @param typeform: A list of typeform constants indicating the typeform for each position in inbuf,
+        C{None} for no typeform information.
+    @type typeform: list of int
+    @param mode: The translation mode; add multiple values for a combined mode.
+    @type mode: int
+    @return: The translated string.
+    @rtype: str
+    @raise RuntimeError: If a complete translation could not be done.
+    @see: lou_translateString in the liblouis documentation
+    """
+    tablesString = _createTablesString(tableList)
+    inbuf = createStr(inbuf)
+    inlen = c_int(len(inbuf))
+    outlen = c_int(inlen.value*outlenMultiplier)
+    outbuf = create_unicode_buffer(outlen.value)
+    typeformbuf = None
+    if typeform:
+        typeformbuf = _createTypeformbuf(outlen.value, typeform)
+    if not liblouis.lou_translateString(tablesString, inbuf, byref(inlen), 
+                                        outbuf, byref(outlen), typeformbuf, 
+                                        None, mode):
+        raise RuntimeError("Can't translate: tables %s, inbuf %s, typeform %s, mode %s"%(tableList, inbuf, typeform, mode))
+    if isinstance(typeform, list):
+        typeform[:] = list(typeformbuf)
+    return outbuf.value
+
+def backTranslate(tableList, inbuf, typeform=None, cursorPos=0, mode=0):
+    """Back translates a string of characters, providing position information.
+    @param tableList: A list of translation tables.
+    @type tableList: list of str
+    @param inbuf: Braille to back translate.
+    @type inbuf: str
+    @param typeform: List where typeform constants will be placed.
+    @type typeform: list
+    @param cursorPos: Position of cursor.
+    @type cursorPos: int
+    @param mode: Translation mode.
+    @type mode: int
+    @return: A tuple: A string of the back translation,
+        a list of input positions for each position in the output,
+        a list of the output positions for each position in the input and
+        the position of the cursor in the output.
+    @rtype: (str, list of int, list of int, int)
+    @raise RuntimeError: If a complete back translation could not be done.
+    @see: lou_backTranslate in the liblouis documentation.
+    """
+    tablesString = _createTablesString(tableList)
+    inbuf = createStr(inbuf)
+    inlen = c_int(len(inbuf))
+    outlen = c_int(inlen.value * outlenMultiplier)
+    outbuf = create_unicode_buffer(outlen.value)
+    typeformbuf = None
+    if isinstance(typeform, list):
+        typeformbuf = _createTypeformbuf(outlen.value)
+    inPos = (c_int*outlen.value)()
+    outPos = (c_int*inlen.value)()
+    cursorPos = c_int(cursorPos)
+    if not liblouis.lou_backTranslate(tablesString, inbuf, byref(inlen),
+                    outbuf, byref(outlen), typeformbuf, None,
+                    outPos, inPos, byref(cursorPos), mode):
+        raise RuntimeError("Can't back translate: tables %s, inbuf %s, typeform %s, cursorPos %d, mode %d"%(tableList, inbuf, typeform, cursorPos, mode))
+    if isinstance(typeform, list):
+        typeform[:] = list(typeformbuf)
+    return outbuf.value, inPos[:outlen.value], outPos[:inlen.value], cursorPos.value
+
+def backTranslateString(tableList, inbuf, typeform=None, mode=0):
+    """Back translate from Braille.
+    @param tableList: A list of translation tables.
+    @type tableList: list of str
+    @param inbuf: The Braille to back translate.
+    @type inbuf: str
+    @param typeform: List for typeform constants to be put in.
+        If you don't want typeform data then give None
+    @type typeform: list
+    @param mode: The translation mode
+    @type mode: int
+    @return: The back translation of inbuf.
+    @rtype: str
+    @raise RuntimeError: If a complete back translation could not be done.
+    @see: lou_backTranslateString in the liblouis documentation.
+    """
+    tablesString = _createTablesString(tableList)
+    inbuf = createStr(inbuf)
+    inlen = c_int(len(inbuf))
+    outlen = c_int(inlen.value * outlenMultiplier)
+    outbuf = create_unicode_buffer(outlen.value)
+    typeformbuf = None
+    if isinstance(typeform, list):
+        typeformbuf = _createTypeformbuf(outlen.value)
+    if not liblouis.lou_backTranslateString(tablesString, inbuf, byref(inlen), outbuf,
+                    byref(outlen), typeformbuf, None, mode):
+        raise RuntimeError("Can't back translate: tables %s, inbuf %s, mode %d"%(tableList, inbuf, mode))
+    if isinstance(typeform, list):
+        typeform[:] = list(typeformbuf)
+    return outbuf.value
+
+def hyphenate(tableList, inbuf, mode=0):
+    """Get information for hyphenation.
+    @param tableList: A list of translation tables and hyphenation
+        dictionaries.
+    @type tableList: list of str
+    @param inbuf: The text to get hyphenation information about.
+        This should be a single word and leading/trailing whitespace
+        and punctuation is ignored.
+    @type inbuf: str
+    @param mode: Lets liblouis know if inbuf is plain text or Braille.
+        Set to 0 for text and anyother value for Braille.
+    @type mode: int
+    @return: A string with '1' at the beginning of every syllable
+        and '0' elsewhere.
+    @rtype: str
+    @raise RuntimeError: If hyphenation data could not be produced.
+    @see: lou_hyphenate in the liblouis documentation.
+    """
+    tablesString = _createTablesString(tableList)
+    inbuf = createStr(inbuf)
+    inlen = c_int(len(inbuf))
+    hyphen_string = create_string_buffer(inlen.value + 1) 
+    if not liblouis.lou_hyphenate(tablesString, inbuf, inlen, hyphen_string, mode):
+        raise RuntimeError("Can't hyphenate: tables %s, inbuf %s, mode %d"%(tableList, inbuf, mode))
+    return hyphen_string.value.decode("ASCII")
+
+def checkTable(tableList):
+    """Check if the specified tables can be found and compiled.
+        This can be used to check if a list of tables contains errors
+        before sending it to other liblouis functions
+        that accept a list of tables.
+    @param tableList: A list of translation tables.
+    @type tableList: list of str
+    @raise RuntimeError: If compilation failed.
+    @see: lou_checkTable in the liblouis documentation
+    """
+    tablesString = _createTablesString(tableList)
+    if not liblouis.lou_checkTable(tablesString):
+        raise RuntimeError("Can't compile: tables %s"%tableList)
+
+def compileString(tableList, inString):
+    """Compile a table entry on the fly at run-time.
+    @param tableList: A list of translation tables.
+    @type tableList: list of str
+    @param inString: The table entry to be added.
+    @type inString: str
+    @raise RuntimeError: If compilation of the entry failed.
+    @see: lou_compileString in the liblouis documentation
+    """
+    tablesString = _createTablesString(tableList)
+    inBytes = inString.encode("ASCII") if isinstance(inString, str) else bytes(inString)
+    if not liblouis.lou_compileString(tablesString, inString):
+        raise RuntimeError("Can't compile entry: tables %s, inString %s"%(tableList, inString))
+
+def getTypeformForEmphClass(tableList, emphClass):
+    """Get the typeform bit for the named emphasis class.
+    @param tableList: A list of translation tables.
+    @type tableList: list of str
+    @param emphClass: An emphasis class name.
+    @type emphClass: str
+    @see: lou_getTypeformForEmphClass in the liblouis documentation
+    """
+    tablesString = _createTablesString(tableList)
+    return liblouis.lou_getTypeformForEmphClass(tablesString, emphClass)
+
+#{ Typeforms
+plain_text = 0x0000
+italic = 0x0001       # emph_1
+underline = 0x0002    # emph_2
+bold = 0x0004         # emph_3
+emph_4 = 0x0008
+emph_5 = 0x0010
+emph_6 = 0x0020
+emph_7 = 0x0040
+emph_8 = 0x0080
+emph_9 = 0x0100
+emph_10 = 0x0200
+computer_braille = 0x0400
+no_translate = 0x0800
+no_contract = 0x1000
+#}
+
+#{ Translation modes
+noContractions = 1
+compbrlAtCursor = 2
+dotsIO = 4
+comp8Dots = 8
+pass1Only = 16
+compbrlLeftCursor = 32
+ucBrl = 64
+noUndefinedDots = 128
+partialTrans = 256
+#}
+
+if charSize() == 2 and sys.maxunicode != 65535:
+    raise Exception("mismatch in Unicode width: liblouis is 2 and python isn't")
+elif charSize() == 4 and sys.maxunicode != 1114111:
+    raise Exception("mismatch in Unicode width: liblouis is 4 and python isn't")
+
+if __name__ == '__main__':
+    # Just some common tests.
+    print(version())
+    print(translate([b'../tables/en-us-g2.ctb'], 'Hello world!', cursorPos=5))
diff --git a/liblouis/python/setup.py.in b/liblouis/python/setup.py.in
new file mode 100644
index 0000000..09d5e04
--- /dev/null
+++ b/liblouis/python/setup.py.in
@@ -0,0 +1,41 @@
+# Liblouis Python ctypes bindings
+#
+# Copyright (C) 2009 Eitan Isaacson <eitan@ascender.com>
+# Copyright (C) 2010 James Teh <jamie@jantrid.net>
+#
+# This file is part of liblouis.
+# 
+# liblouis is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published
+# by the Free Software Foundation, either version 2.1 of the License, or
+# (at your option) any later version.
+# 
+# liblouis is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
+# 
+
+r"""Python bindings for liblouis
+"""
+
+from distutils.core import setup
+
+classifiers = [
+    'Development Status :: 4 - Beta',
+    'Intended Audience :: Developers',
+    'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)',
+    'Programming Language :: Python',
+    'Topic :: Text Processing :: Linguistic',
+    ]
+
+setup(name="louis",
+      description=__doc__,
+      download_url = "https://github.com/liblouis/liblouis",
+      license="LGPLv2.1+",
+      classifiers=classifiers,
+      version='@VERSION@',
+      packages=["louis"])
diff --git a/liblouis/tables/Cz-Cz-g1.utb b/liblouis/tables/Cz-Cz-g1.utb
new file mode 100644
index 0000000..6c342c9
--- /dev/null
+++ b/liblouis/tables/Cz-Cz-g1.utb
@@ -0,0 +1,250 @@
+# liblouis: Czech Grade 1 Braille Table
+#
+#  Copyright (C) 2004-2008 ViewPlus Technologies, Inc. www.viewplus.com
+#  Copyright (C) 2004-2006 JJB Software, Inc. www.jjb-software.com
+#  Copyright (C) 2012 Mesar Hameed <mesar.hameed@gmail.com>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+# Created & maintained by Leon Ungier <Leon.Ungier@ViewPlus.com>.
+
+include text_nabcc.dis
+
+# ----------- define all chars --------------------------------------
+
+space \t 0 tab						#  9
+space \x000A 0
+space \x000D 0
+space \s 0 blank					# 32
+punctuation ! 235				exclamation sign 						x0021
+punctuation " 2356			double quote								x0022
+sign # 3456							number sign									x0023
+sign $ 3456-1246				dollar sign									x0024
+sign % 3456-1234				percent sign								x0025
+sign & 3456-12346				ampersand										z0026
+punctuation ' 4					apostrophe									x0027
+punctuation ( 236				left parenthesis						x0028
+punctuation ) 356				right parenthesis						x0029
+sign * 35								asterisk										x002A
+math + 256							plus												002B
+punctuation , 2					coma												002C
+punctuation - 36				hyphen-minus								002D
+punctuation . 3					point												002E
+math / 12456						solidus											002F
+
+include digits6Dots.uti
+
+punctuation : 25				colon								x003A
+punctuation ; 23				semicolon						x003B
+punctuation < 126				less-than sign			x003C
+math = 123456						equal sign					x003D
+math > 345							greater-than sign		x003E
+punctuation ? 26				question mark				x003F
+sign @ 3456-12456				commercial at				x0040
+
+include latinLetterDef6Dots.uti
+
+punctuation [ 6-236			left square bracket		x005B
+sign \\ 3456-1256				reverse solidus				x005C
+punctuation ] 6-356			right square bracket	x005D
+sign ^ 45								circumflex accent			x005E
+sign _ 6-36							low line							x005F
+sign ` 45-4							grave accent					x0060
+
+# a - z								# 97 - 122							x0061-x007A
+
+punctuation { 45-236		left curly bracket		x007B
+sign | 456							vertical line					x007C
+punctuation } 45-356		right curly bracket		x007D
+math ~ 5								tilde									x007E
+sign \x0080 15-136-1235-135										x0080
+
+space \X00A0 0		no-break space																x00A0
+sign ¢ 4-14				cent sign																			x00A2
+sign £ 45-123			pound sign																		x00A3
+sign ¤ 45-15			currency sign																	x00A4
+sign ¥ 45-13456		yen	sign																			x00A5
+sign § 346				section sign																	x00A7
+sign © 2356-6-14-2356		copyright																x00A9
+# punctuation « 45-2356		left-pointing double angle quotation 		x00AB
+punctuation « 236				left-pointing double angle quotation 		x00AB
+punctuation \x00AD 36 soft hyphen
+sign ° 4-356			degree sign																		x00B0
+sign ² 4-6-126		superscript 2 sign														x00B2
+sign ³ 4-6-146		superscript 3 sign														x00B3
+sign µ 46-134			micro sign																		x00B5
+sign ¶ 4-1234-345 pilcrow sign (paragraph)											x00B6
+sign ¹ 1-27				superscript 1 sign														x00B9
+# punctuation » 2356-12		right-pointing double angle quotation		x00BB
+punctuation » 356			right-pointing double angle quotation			x00BB
+math ¼ 6-16-34-1456		vulgar fraction one quarter								x00BC
+math ½ 6-16-34-126		vulgar fraction one half									x00BD
+math ¾ 6-126-34-1456	vulgar fraction 3 quarters								x00BE
+
+
+
+uplow \x00C0\x00E0 12356	letter a with grave							x00C0 / 00E0
+uplow \x00C1\x00E1 16			letter a with acute									x00E1
+uplow \x00C2\x00E2 16					letter a with circumflex						x00E2
+uplow \x00C3\x00E3 126		letter a with tilde											x00E3
+uplow Ää 345				A with diaeresis											x00C4 / 00E4
+uplow Åå 16					A with ring above											x00C5 / 00E5
+uplow \x00C6\x00E6 6-345	ae															x00C6
+uplow Çç 12346							letter c with cedilla					x00C7 / 00E7
+uplow Èè 2346								e with grave									x00C8 / 00E8
+uplow \x00C9\x00E9 345			e with acute									x00E9
+uplow \x00CA\x00EA 126			e with circumflex							x00EA
+uplow \x00CB\x00EB 1246		e with diaeresis								x00EB
+uplow \x00CD\x00ED 34			i with acute										x00ED
+uplow \x00CE\x00EE 146		i with circumflex								x00EE
+uplow \x00CF\x00EF 12456	i with diaeresis								x00CF / 00EF
+
+uplow	\x00D3\x00F3	246		O with acute										x00D3 / 00F3
+uplow \x00D4\x00F4 1456		o with circumflex												x00F4
+uplow \x00D5\x00F5 246		o with tilde														x00F5
+uplow Öö 246							O with diaeresis								x00D6 / 00F6
+math × 236				multiplication sign											x00D7
+uplow \x00D8\x00F8 246		o with stroke										x00D8 / 00F8
+
+math ÷ 256				division sign										x00F7
+
+uplow \x00DA\x00FA 346				u with acute							x00DA / 00FA
+uplow \x00DB\x00FB 156				u with circumflex					x00FB
+uplow \x00DC\x00FC 1256				u with diaeresis					x00FC
+uplow \x00DD\x00FD 12346			y with acute							x00DD / 00FD
+
+# the letter a with ogonek -----------------------------------
+uplow \x0104\x0105 16
+
+# the letter c with acute
+uplow \x0106\x0107 146
+
+uplow \x010C\x010D 146					C with caron
+uplow \x010E\x010F 1456					D with caron
+
+
+# the letter e with ogonek
+uplow \x0118\x0119 156
+
+uplow \x011A\x011B 126					E with caron
+
+# the letter l with stroke
+uplow \x0141\x0142 126
+
+# the letter n with acute
+uplow \x0143\x0144 1456
+uplow \x0147\x0148 1246					N with caron
+
+uplow \x0158\x0159 2456					R with caron
+
+# the letter s	with acute
+uplow \x015A\x015B 246
+
+uplow \x0160\x0161 156						S with caron
+uplow \x0164\x0165 1256						T with caron
+uplow \x016C\x016D 23456						U with breve
+uplow \x016E\x016F 23456					U with ring above
+
+
+# the letter z	with acute
+uplow \x0179\x017A 2346
+
+# the letter z with dot above
+uplow \x017B\x017C 12346
+
+uplow \x017D\x017E 2346						Z with caron
+
+punctuation	\x2010 36		 # 8208			hyphen
+punctuation	\x2011 36		 # 8209			non-breaking hyphen
+punctuation	\x2013 36		 # 8211			smart minus sign
+punctuation	\x2018 3		 # 8216			smart single left quotation mark
+punctuation	\x2019 3		 # 8217			smart single right quotation mark
+
+punctuation	\x201C 236	 # 8220			smart opening double quote
+punctuation	\x201D 356	 # 8221			smart closing double quote
+punctuation	\x201E 236	 # 8222			smart double low quotation mark
+punctuation	\x201F 356	 # 8223			smart double high reverse quotation mark
+punctuation  \x2026 3-3-3 # 8230		smart ellipsis
+noback sign \X25CF 35	 	 # 9679			black circle
+
+# ------------------------------------------------------
+
+
+capsletter 6				# single capital letter indicator
+begcapsword 6-6			# a block of consecutive capital letters indicator
+
+
+numsign 3456		#	number sign, just one operand
+midnum , 3
+midnum . 2
+midnum + 235
+midnum - 36
+midnum / 256
+midnum : 25
+midnum = 2356
+
+# endnum # 56-3456
+
+prepunc " 236
+postpunc " 356
+
+prepunc ' 6-236
+postpunc ' 356-3
+postpunc '' 356
+postpunc ''' 356-3-356
+
+repeated *** 16-16-16
+
+prepunc `` 236
+prepunc ` 6-236
+
+repeated --- 36-36-36
+
+repeated ::: 25-25-25
+
+repeated ~~~ 4-156-4-156-4-156
+always \s-\s 36-36
+always \s-\scom 36-36-14-135-134
+always ... 3-3-3
+always .\s.\s. 3-3-3 . . .
+
+always \s­\s 36-36
+
+# special character sequences
+literal :// URLs
+literal www.
+
+literal .com
+literal .edu
+literal .gov
+literal .mil
+literal .net
+literal .org
+
+literal .doc
+literal .htm
+literal .html
+literal .tex
+literal .txt
+
+literal .gif
+literal .jpg
+literal .png
+literal .wav
+
+literal .tar
+literal .zip
diff --git a/liblouis/tables/Es-Es-G0.utb b/liblouis/tables/Es-Es-G0.utb
new file mode 100644
index 0000000..71c94ab
--- /dev/null
+++ b/liblouis/tables/Es-Es-G0.utb
@@ -0,0 +1,209 @@
+# liblouis: Computer Spanish 8 dots Braille table
+#
+#  Copyright (C) 2012 by José Enrique Fernández del Campo and Juan Carlos Buño Suárez <quetzatl@eresmas.net>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 3 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+# -----------------------------------------------------------------------------
+
+# Uncontracted Computer Spanish Table
+# Autor José Enrique Fernández del Campo <jefdelcampo@gmail.com> and Juan Carlos Buño Suárez <quetzatl@eresmas.net>
+# -----------------------------------------------------------------------------
+
+
+space \s 0      			# blank 32
+space \t 9              # tab 9
+space \x001B 1b         # escape
+space \x000A 0          # lf
+space \x000D 0          # cr
+space \X00A0 0          # Espacio de no separación
+
+# all except 0 are the same, so define 0 here to take higher presidence
+# Also define ó (lowercase o acute) not to clash with the definition of 0 in original include.
+digit 0 34678				cero
+uplow \x00d3\x00f3 3467,346     o con acento
+include digits6DotsPlusDot6.uti
+
+include latinLetterDef8Dots.uti
+
+uplow \x00c7\x00e7 1234678,123468		c cedilla
+uplow \x00c1\x00e1 123567,12356     a con acento
+uplow \x00c9\x00e9 23467,2346		e con acento
+uplow \x00cd\x00ed 347,34     i con acento
+uplow \x00da\x00fa 234567,23456     u con acento
+uplow \x00c0\x00e0 1235678,123568		a grave
+uplow \x00c8\x00e8 234678,23468			e grave
+uplow \x00cc\x00ec 345,348     i grave
+uplow \x00d2\x00f2 2458,3468     o grave
+uplow \x00d9\x00f9 2345678,234568		u grave
+uplow \x00c2\x00e2 178,18				a con circunflejo
+uplow \x00ca\x00ea 1578,158			e con circunflejo
+uplow \x00ce\x00ee 2478,248			i con circunflejo
+uplow \x00d4\x00f4 13578,1358			o con circunflejo
+uplow \x00db\x00fb 13678,1368			u con circunflejo
+uplow \x00c4\x00e4 34578,3458       a con diéresis
+uplow \x00cb\x00eb 124678,12468			e con diéresis
+uplow \x00cf\x00ef 1245678,258		i con diéresis
+uplow \x00d6\x00f6 24678,2468         o con diéresis
+uplow \x00dc\x00fc 125678,12568			u con diéresis
+uplow \x00dd\x00fd 1567,2348     ye con acento agudo
+uplow \x009F\x00FF 367,67     ye con diéresis
+
+uplow \X00c6\X00e6 38,1348     ae
+uplow \X0152\X0153 1468,1238     oe
+uplow \x008C\x009C 1468,1238     oe
+uplow \x00C3\x00E3 3567,168     a con tilde
+uplow \x00D5\x00F5 12458,4567     o con tilde
+uplow \x00D1\x00F1 124567,124568 letra eñe
+
+punctuation , 2			coma
+punctuation ; 23		punto y coma
+punctuation : 25		dos puntos
+punctuation - 36		guión
+punctuation . 3		punto
+punctuation ? 26		cerrar interrogación
+punctuation ! 2357		cerrar admiración
+punctuation \X0022 56 	comillas
+punctuation \X201c 14568 	abrir comillas
+punctuation \X201d 12348 	cerrar comillas
+punctuation ( 1268		abre paréntesis
+punctuation ) 3457		cierra paréntesis
+punctuation ' 4			apóstrofo
+punctuation \x00ab 238		comillas angulares izquierda
+punctuation \x00bb 567		comillas angulares derecha
+punctuation [ 2367		abre corchetes
+punctuation ] 3568	 	cierra corchetes
+punctuation { 46			abre llave
+punctuation } 35			cierra llave
+
+sign * 256						asterisco
+sign \\ 123456						barra invertida
+sign @ 5					arroba
+sign % 456					por ciento
+sign _ 6								subrayado
+sign # 3456					signo de número
+sign \x0060 58					acento grave
+sign ^ 45					circunflejo
+sign \X007E   57     #126 ~    tilde
+sign \X007C 4568   # barra vertical
+sign \X007F 7   # borrar
+sign \x00a1 23578   # abrir admiración
+sign \X00A6 478   # barra vertical cortada
+sign \X00A7 167   # sección
+sign \X00A8 268   # diéresis
+sign \X00A9 23567   # copyright
+sign \X00AC 257   # guión opcional
+sign \X20AC 12358   # euros
+sign \X00AD 2358   # soft hyphen
+sign \X00AE 2368   # registrado
+sign \X00AF 24568   # macron
+sign \X00B1 12467   # más-menos
+sign \X00B5 13468   # my
+sign \X00B6 14567   # párrafo
+sign \X00B7 14678   # punto centrado
+sign \X00B9 237   # Super uno
+sign \X00BA 5678   # ordinal masculino
+sign \x00AA 23568  # ordinal femenino 
+sign \X00BF 267   # abrir interrogación
+sign \X00C5 12368   #*a mayúscula con círculo superescrito
+
+sign \X00D0 13458   # letra eth mayúscula
+sign \X00D7 1678   # multiplicado por
+sign \X00D8 34567   # Alfa
+sign \X00DE 123458   # Thorn
+sign \X00DF 128   # Beta
+sign \X00E5 15678   # a con círculo superescrito
+sign \X00F0 235678   # letra eth
+sign \X00F7 2578   # dividido por
+sign \X00F8 457   # latin small letter o with stroke
+sign \X00FE 1568   # thorn
+sign \x00A8 268			diéresis
+
+math + 235				más
+math = 2356				igual
+math \x00d7 1678					multiplicado por
+math < 236				menor que
+math > 356				mayor que
+math / 3478						barra oblicua
+math \x00F7 2578		dividido por
+
+sign \x00a9 23567							copyright
+sign \x00b0 8						grado
+sign & 12346					ampersand
+sign \x00a2 12678						centavo
+sign \x00a4 2567						
+sign \x00a3 2378						libra
+sign \x00a7 167					sección
+sign \x0024 123467						dólar
+sign \x00a5 145678					yen
+sign \x00b9 237						super 1
+sign \x00b2 47					al cuadrado
+sign \x00b3 568					al cubo
+sign \x00bc 1467			un cuarto
+sign \x00bd 468			un medio
+sign \x00be 48		tres cuartos
+
+sign \x0081 358		sin nombre
+sign \x0082 37		por
+sign \X201a 37		por
+sign \X0083 1248		signo
+sign \X0192 1248		signo
+sign \X0084 78		signo
+sign \X201e 78		signo
+sign \X0085 1267		elipsis
+sign \X2026 1267		elipsis
+sign \X0086 28		sin nombre
+sign \X2020 28		sin nombre
+sign \X0087 23458		sin nombre
+sign \X2021 23458		sin nombre
+sign \X0088 458		sin nombre
+sign \X02c6 23458		sin nombre
+sign \X0089 45678		sin nombre
+sign \X2030 45678		sin nombre
+sign \X008a 1234568		sh mayúscula
+sign \X0160 1234568		sh mayúscula
+sign \X008b 1258		
+sign \X2039 1258		
+sign \X008d 357		sin nombre
+sign \X008e 148		sin nombre
+sign \X017d 148		sin nombre
+sign \X008f 58		
+sign \X0090 68		sin 	nombre
+sign \X2018 4		apóstrofo
+sign \X2019 4		apóstrofo
+sign \X0095 1458		signo
+sign \X2022 1458		signo
+sign \X0096 368		guión
+sign \X2013 368		guión
+sign \X0097 3678		guión
+sign \X2014 3678		guión
+sign \X0098 134568		tilde
+sign \X02dc 134568		tilde
+sign \X0099 2467		marca registrada
+sign \X2122 2467		marca registrada
+sign \X009a 34568		signo
+sign \X203a 34568		signo
+sign \X0161 12567		sh
+sign \X009d 25678		
+sign \X009e 2568		
+sign \X017e 2568		
+sign \X009f 367		
+sign \X0178 367		
+sign \x00b4 467     acento agudo
+sign \x00B8 135678     z con caron
+
+noback sign \x25CF 256 black circle
diff --git a/liblouis/tables/Es-Es-g1.utb b/liblouis/tables/Es-Es-g1.utb
new file mode 100644
index 0000000..de92c3a
--- /dev/null
+++ b/liblouis/tables/Es-Es-g1.utb
@@ -0,0 +1,154 @@
+# Spanish Grade 1 Braille Table
+#
+#  Copyright (C) 2004-2008 ViewPlus Technologies, Inc. www.viewplus.com
+#  Copyright (C) 2004-2006 JJB Software, Inc. www.jjb-software.com
+#  Copyright (C) 2012 Mesar Hameed <mesar.hameed@gmail.com>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+# Created June 9, 2005 by Leon Ungier <Leon.Ungier@ViewPlus.com>.
+
+locale Spain
+
+include text_nabcc.dis
+
+#--------------------- All chars definitions ------------------------------
+replace \x0097
+space \x000a 0
+space \t 0 tab            #  9
+space \s 0 blank					# 32
+punctuation ! 235					# 33
+punctuation " 236					# 34
+sign # 3456								# 35
+sign $ 256								# 36
+sign % 456								# 37
+sign & 123456							# 38
+punctuation ' 5						# 39 apostrophe
+punctuation ( 126					# 40
+punctuation ) 345					# 41
+sign * 35									# 42
+math + 235								# 43
+punctuation , 2						# 44
+punctuation - 36					# 45
+punctuation . 3						# 46
+math / 34									# 47
+include digits6Dots.uti
+punctuation : 25				colon													x003A
+punctuation ; 23				semicolon											x003B
+math < 56								less-than sign								x003C
+math = 2356							equal sign										x003D
+math > 45								greater-than sign							x003E
+punctuation ? 26				question mark									x003F
+sign @ 4								commercial at									x0040
+
+include latinLetterDef6Dots.uti
+
+punctuation [ 12356		left square bracket			x005B
+sign \\ 2							reverse solidus					x005C
+punctuation ] 23456		right square bracket		x005D
+sign ^ 5							circumflex accent				x005E
+sign _ 6							low line								x005F
+sign ` 45							grave accent						x0060
+
+# a - z								# 97 - 122							x0061 - x007A
+
+punctuation { 246			left curly bracket			x007B
+sign | 46							vertical line						x007C
+punctuation } 12456		right curly bracket			x007D
+sign ~ 256						tilde										x007E
+sign \x0080 15-136-1235-135										x0080
+
+space \X00A0 0				# no-break space													x00A0
+sign ¢ 4-14						cent sign																	x00A2
+sign £ 45-123					pound sign																x00A3
+sign ¤ 45-15					currency sign															x00A4
+sign ¥ 45-13456				yen	sign																	x00A5
+sign § 346						paragraph	sign														x00A7
+sign © 6-14-135-1234-13456-1235-24-1245-125-2345		copyright		x00A9
+punctuation « 45-2356		left-pointing double quotation mark			x00AB
+sign ° 4-356					degree sign																x00B0
+sign ² 4-6-126				superscript 2 sign												x00B2
+sign ³ 4-6-146				superscript 3 sign												x00B3
+sign \x00B5 46-134		# 181				µ micro sign									x00B5
+sign \x00B6 346				#						¶ pilcrow sign								x00B6
+sign ¹ 4-6-16					superscript 1 sign												x00B9
+punctuation » 2356-12		right-pointing double quotation mark		x00BB
+sign ¼ 6-16-34-1456		vulgar fraction one quarter								x00BC
+sign ½ 6-16-34-126		vulgar fraction one half									x00BD
+sign ¾ 6-126-34-1456					vulgar fraction 3 quarters				x00BE
+
+uplow \x00C0\x00E0 12356			a with grave						x00C0 / 00E0
+uplow Áá 12356								A with acute						x00C1 / 00E1
+uplow Ââ 16										a with circumflex				x00C2 / 00E2
+uplow \x00C3\x00E3 345				a with tilde						x00C3 / 00E3
+uplow Ää 345									A with diaeresis				x00C4 / 00E4
+uplow Åå 16										A with ring above				x00C5 / 00C4
+uplow \x00C6\x00E6 345				ae											x00C6 / 00E6
+uplow Çç 12346								letter c with cedilla		x00C7 / 00E7
+uplow Éé 2346									E with acute						x00C9 / 00E9
+uplow \x00CA\x00EA 126				e with circumflex				x00CA / 00EA
+uplow Íí 34										i with acute						x00CD / 00ED
+uplow \x00D1\x00F1 12456			N with tilde						x00D1 / 00F1
+uplow Óó 346									o with acute						x00D3 / 00F3
+uplow Ôô 1456									o with circumflex				x00D4 / 00F4
+uplow \x00D5\x00F5 246				o with tilde						x00D5 / 00F5
+uplow Öö 246									O with diaeresis				x00D6 / 00F6
+math × 236										multiplication sign			x00D7
+uplow \x00D8\x00F8 246				o with stroke						x00D8 //00F8
+#	uplow Úú 46-23456							U with acute						x00DA / 00FA
+uplow Úú 23456								U with acute						x00DA / 00FA
+#	uplow Üü 46-1256							U with diaeresis				x00DC / 00FC
+uplow Üü 1256									U with diaeresis				x00DC / 00FC
+math ÷ 256										division sign						x00F7
+
+punctuation	\x2010 46						# 8208			hyphen
+punctuation	\x2011 46						# 8209			non-breaking hyphen
+math	\x2013 36									# 8211			smart minus sign
+punctuation	\x2018 3						# 8216			smart single left quotation mark
+punctuation	\x2019 3						# 8217			smart single right quotation mark
+
+punctuation	\x201C 236					# 8220			smart opening double quote
+punctuation	\x201D 356					# 8221			smart closing double quote
+punctuation	\x201E 236					# 8222			smart double low quotation mark
+punctuation	\x201F 356					# 8223			double high reverse quotation mark
+
+punctuation \x2026 256-256-256	# 8230	smart ellipsis
+
+noback sign \x25CF 35 					# 9679 			black circle
+
+#-------------- end defintions ------------------------------------------
+
+capsletter 46
+begcapsword 46-46
+
+numsign 3456
+midnum , 2
+midnum . 3
+midnum + 235
+midnum - 36
+midnum / 256
+midnum : 25
+midnum = 2356
+
+endnum # 56-3456
+
+repeated ... 3-3-3		points de suite
+repeated --- 36-36-36
+repeated ___ 6-6-6
+
+always \s--\s 36-36	tiret
+
diff --git a/liblouis/tables/Fr-Ca-g2.ctb b/liblouis/tables/Fr-Ca-g2.ctb
new file mode 100644
index 0000000..e1eefc4
--- /dev/null
+++ b/liblouis/tables/Fr-Ca-g2.ctb
@@ -0,0 +1,1792 @@
+# liblouis: Canadian French grade 2 Table
+
+# Copyright (C) 1995-2004 by The BRLTTY Team
+# Copyright (C) 2012 Nicolas Pitre <nico@cam.org>
+
+# This file is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with this file; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# liblouis  comes with ABSOLUTELY NO WARRANTY.
+
+# Auteur:
+#
+#	Nicolas Pitre <nico@cam.org>
+#
+# Référence:
+#
+#	Index de l'abrégé orthographique français étendu, lecture et écriture
+#	Révision 1993
+#	Service de production Braille, Institut Nazareth et Louis-Braille
+#	Longueuil (Québec)
+
+# Contracted Unified French Table
+# --------------------------------
+
+include fr-ca-g1.utb
+
+###
+### 1. Assemblages de lettres représentés par un seul symbole,
+###    et finales représentées par deux ou trois symboles;
+###
+
+letsign 6
+
+class voy aeiouyéàèùâêîôûëïüAEIOUYÉÀÈÙÂÊËïü
+class con bcçdfghjklmnpqrstvwxzBCÇDFGHJKLMNPQRSTVWXZ
+class bmp bmpBMP
+
+endword able 45
+always ai 34
+endword ait 146
+before con always an 2
+endword ant 1456
+before con always ar 4
+endword ar 4
+endword ation 16
+always au 13
+
+always bl 45
+before voy always br 23
+
+always ch 12356
+before voy always cl 146
+before con begword com 36
+before con always con 25
+before voy always cr 25
+
+before con begword dis 256
+before voy always dr 1456
+
+endword elle 456
+before con always em 345
+before con always en 26
+endword en 26
+endword ent 126
+before con midword er 236
+endword er 236
+begword es 156
+endword es 156
+word eu 15-136
+always eu 5
+before con always eur 46
+endword eur 46
+before con always ex 1346
+endword ez 1356
+
+before voy always fl 126
+before voy always fr 16
+
+before voy always gl 345
+always gn 2356
+before voy always gr 12456
+
+always ien 256
+always ieu 6
+before bmp begword im 246
+always in 35
+always ion 3456
+endword ition 246
+
+before voy after voy always ll 456
+
+always oi 23456
+before con always om 2456
+endword om 2456
+before con always on 346
+endword on 346
+before con always or 56
+endword or 56
+always ou 1256
+before con always our 12346
+endword our 12346
+
+before voy always pl 1246
+before voy always pr 235
+before con always pro 235
+
+always qu 12345
+endword que 12345
+
+before con begword re 3
+
+before voy after voy always ss 2346
+
+before voy always tr 356
+before con begword trans 356
+before voy after voy always tt 2456
+
+before con always ui 23
+
+endword ablement 45-134
+endword bilité 12-123-2345
+endword bilités 12-123-2345-234
+endword ellement 456-134
+endword logie 123-1245
+endword quement 12345-134
+endword quements 12345-134-234
+endword tement 2345-134
+endword tements 2345-134-234
+endword ttement 2345-2345-134
+endword ttements 2345-2345-134-234
+endword vement 1236-134
+endword vements 1236-134-234
+
+before con always ain 1-35
+endword ain 1-35
+before con always oin 135-35
+endword oin 135-35
+
+before con begword recom 3-36
+before con begword redis 3-256
+before con begword retrans 3-356
+before con begword incom 35-36
+before con begword indis 35-256
+before con begword intrans 35-356
+begword ines 35-156
+
+prfword tient 2345-256-2345
+prfword vient 1236-256-2345
+endword ient 24-126
+word balbutient 12-1-123-12-136-2345-24-126
+word initient 35-24-2345-24-126
+word dévient 145-123456-1236-24-126
+word envient 1235-26-1236-24-126
+
+sufword bleu 45-15-136
+before con always brui 12-1235-23
+endword clait 14-123-146
+before voy always concr 14-346-25
+endword drant 145-1235-1456
+always drô 145-1235-1456
+endword en? 15-1345-26
+always ien. 24-26-256
+before voy always propr 235-135-235
+before con begword ren 1235-26
+always ssè 234-234-2346
+word (en 236-15-1345
+word (la 236-123-1
+
+###
+### 2. Mots représentés par un seul symbole
+###
+
+word a 1
+word à 12356
+word ai 34
+word au 13
+word aux 13-1346
+word bien 12
+word biens 12-234
+word ce 14
+word celui 36
+word cet 146
+word dans 1456
+word de 145
+word dès 256
+word du 236
+word elle 1356
+word elles 1356-234
+word en 26
+word est 156
+word et 23456
+word été 2356
+word étés 2356-234
+word faire 124
+word grand 12456
+word grands 12456-234
+word il 24
+word ils 24-234
+word je 245
+word la 3
+word le 123
+word les 345
+word lui 3456
+word mais 1346
+word me 134
+word même 126
+word mêmes 126-234
+word ne 1345
+word nous 135
+word on 346
+word ou 1256
+word par 1234
+word plus 1246
+word pour 12346
+word puis 235
+word que 12345
+word qui 1245
+word quoi 123456
+word rien 1235
+word riens 1235-234
+word sans 2346
+word se 234
+word si 35
+word son 246
+word sons 246-234
+word sous 356
+word sur 125
+word te 2345
+word tous 2456
+word tout 16
+word un 136
+word uns 136-234
+word vous 1236
+word y 13456
+
+begword c' 14-3
+begword d' 145-3
+begword j' 245-3
+begword l' 123-3
+begword m' 134-3
+begword n' 1345-3
+begword s' 234-3
+begword t' 2345-3
+
+###
+### 3. Mots représentés par deux ou plusieurs symboles
+###
+
+word absolu		1-12
+word absolus		1-12-234
+word absolue		1-12-15
+word absolues		1-12-156
+word absolument		1-12-134
+word action		1-3456
+word actions		1-3456-234
+word actionnaire	1-3456-1235
+word actionnaires	1-3456-1235-234
+word affaire		1-124-124
+word affaires		1-124-124-234
+word afin		1-124
+word ailleurs		34-136
+word ainsi		1-24
+word alors		1-123
+word amour		1-134
+word amours		1-134-234
+word amoureuse		1-134-234-15
+word amoureuses		1-134-234-156
+word amoureusement	1-134-234-134
+word amoureux		1-134-1346
+word apparemment	1-1234-134
+word apparence		1-1234-14
+word apparences		1-1234-14-234
+word apparent		1-1234
+word apparents		1-1234-234
+word apparente		1-1234-15
+word apparentes		1-1234-156
+word après		1-235
+word assez		1-1356
+word atentif		1-2345-124
+word atentifs		1-2345-124-234
+word attention		1-2345
+word attentions		1-2345-234
+word attentive		1-2345-1236
+word attentives		1-2345-1236-234
+word attentivement	1-2345-1236-134
+word aucun		13-14
+word aucune		13-1345
+word aucunement		13-1345-134
+word auparavant		13-1234
+word auprès		13-235
+word auquel		13-12345-123
+word aussi		13-234
+word aussitôt		13-2345
+word autour		13-1235
+word autre		13-356
+word autres		13-356-234
+word autrefois		13-124
+word autrement		13-356-134
+word auxquelles		13-1346-12345-123-123-234
+word auxquels		13-1346-12345-123-234
+word avance		1-1236-14
+word avances		1-1236-14-234
+word avancement		1-1236-14-134
+word avant		1-1236
+word avantage		1-1236-1245
+word avantages		1-1236-1245-234
+word avantageuse	1-1236-1245-234-15
+word avantageuses	1-1236-1245-234-156
+word avantageusement	1-1236-1245-234-134
+word avantageux		1-1236-1245-1346
+word avec		1-14
+word avoir		1-1235
+word avoirs		1-1235-234
+word ayant		1-13456
+
+word beaucoup		12-14
+word besogne		12-2356
+word besognes		12-2356-234
+word besogneuse		12-2356-234-15
+word besogneuses		12-2356-234-156
+word besogneux		12-2356-1346
+word besoin		12-35
+word besoins		12-35-234
+word bête		12-126
+word bêtes		12-126-234
+word bêtement		12-126-134
+word bienfaisance	12-124-14
+word bienfaisances	12-124-14-234
+word bienfait		12-124
+word bienfaits		12-124-234
+word bienfaiteur	12-124-46
+word bienfaiteurs	12-124-46-234
+word bientôt		12-2345
+word bienveillance	12-1236-14
+word bienveillances	12-1236-14-234
+word bienveillant	12-1236
+word bienveillants	12-1236-234
+word bienveillante	12-1236-15
+word bienveillantes	12-1236-156
+word bizarre		12-1356
+word bizarres		12-1356-234
+word bizarrement	12-1356-134
+word bonheur		12-125
+word bonheurs		12-125-234
+word bonjour		12-245
+word bonjours		12-245-234
+word bonne		12-1345
+word bonnes		12-1345-234
+word bonnement		12-1345-134
+word bonté		12-135
+word bontés		12-135-234
+word boulevard		12-145
+word boulevards		12-145-234
+word braille		23-123
+word branchage		23-12356-1245
+word branchages		23-12356-1245-234
+word branche		23-12356
+word branches		23-12356-234
+word branchement	23-12356-134
+word branchements	23-12356-134-234
+word brave		23-1236
+word braves		23-1236-234
+word bravement		23-1236-134
+word bruit		23-2345
+word bruits		23-2345-234
+word brusque		23-12345
+word brusques		23-12345-234
+word brusquement	23-12345-134
+word budget		12-1245
+word budgets		12-1245-234
+word budgétaire		12-1245-1235
+word budgétaires	12-1245-1235-234
+
+word caractère		14-2346
+word caractères		14-2346-234
+word caractéristique	14-123456-12345
+word caractéristiques	14-123456-12345-234
+word ceci		14-14
+word cela		14-1
+word celle		14-123
+word celles		14-123-234
+word celui-ci		36-36-14-24
+word celui-là		36-36-123-12356
+word cependant		14-1234
+word certain		14-35
+word certains		14-35-234
+word certaine		14-1345
+word certaines		14-1345-234
+word certainement	14-1345-134
+word certes		14-236
+word certitude		14-236-145
+word certitudes		14-236-145-234
+word ces		14-234
+word cette		14-2345
+word ceux		14-1346
+word chacun		12356-14
+word chacune		12356-1345
+word chagrin		12356-12456
+word chagrins		12356-12456-234
+word chaleur		12356-123
+word chaleurs		12356-123-234
+word chaleureuse	12356-123-234-15
+word chaleureuses	12356-123-234-156
+word chaleureusement	12356-123-234-134
+word chaleureux		12356-123-1346
+word champ		12356-1234
+word champs		12356-1234-234
+word change		12356-1245
+word changes		12356-1245-234
+word changement		12356-1245-134
+word changeur		12356-1245-46
+word changeurs		12356-1245-46-234
+word chaque		12356-12345
+word charitable		12356-2345-45
+word charitables		12356-2345-45-234
+word charitablement	12356-2345-45-134
+word charité		12356-2345
+word charités		12356-2345-234
+word chaud		12356-145
+word chauds		12356-145-234
+word chaude		12356-145-15
+word chaudes		12356-145-156
+word chaudement		12356-145-134
+word chemin		12356-134
+word chemins		12356-134-234
+word chère		12356-2346
+word chères		12356-2346-234
+word chèrement		12356-2346-134
+word chez		12356-1356
+word chiffrage		12356-124-1245
+word chiffrages		12356-124-1245-234
+word chiffre		12356-124
+word chiffres		12356-124-234
+word choeur		12356-1235
+word choeurs		12356-1235-234
+word choix		12356-1346
+word chose		12356-234
+word choses		12356-234-234
+word circonstance	14-25-14
+word circonstances	14-25-14-234
+word circonstanciel	14-25-14-123
+word circonstanciels	14-25-14-123-234
+word circonstancielle	14-25-14-123-123
+word circonstancielles	14-25-14-123-123-234
+word civil		14-1236
+word civils		14-1236-234
+word civile		14-1236-15
+word civiles		14-1236-156
+word civilement		14-1236-134
+word civilisation	14-1236-16
+word civilisations	14-1236-16-234
+word civilité		14-1236-2345
+word civilités		14-1236-2345-234
+word coeur		14-1235
+word coeurs		14-1235-234
+word combien		14-12
+word comme		14-134
+word commencement	36-134
+word commencements	36-134-234
+word comment		14-26
+word commentaire	14-26-1235
+word commentaires	14-26-1235-234
+word commentateur	14-26-46
+word commentateurs	14-26-46-234
+word commun		36-1345
+word communs		36-1345-234
+word commune		36-1345-15
+word communes		36-1345-156
+word communal		36-1345-123
+word communale		36-1345-123-15
+word communales		36-1345-123-156
+word communautaire	36-1345-2345-1235
+word communautaires	36-1345-2345-1235-234
+word communauté		36-1345-2345
+word communautés		36-1345-2345-234
+word communaux		36-1345-1346
+word communément	36-1345-134
+word communion		36-1345-3456
+word communions		36-1345-3456-234
+word complément		36-1246-134
+word compléments	36-1246-134-234
+word complémentaire	36-1246-134-1235
+word complémentaires	36-1246-134-1235-234
+word complet		36-1246
+word complets		36-1246-234
+word complète		36-2345
+word complètes		36-2345-234
+word complètement	36-2345-134
+word conclusion		25-14
+word conclusions	25-14-234
+word condition		25-145
+word conditions		25-145-234
+word conditionnel	25-145-123
+word conditionnels	25-145-123-234
+word conditionnelle	25-145-123-123
+word conditionnelles	25-145-123-123-234
+word conditionnellement	25-145-123-134
+word confiance		25-124-14
+word confiant		25-124
+word congrès		25-12456
+word connaissance	25-1345-14
+word connaissances	25-1345-14-234
+word connaître		25-1345
+word consciemment	25-234-134
+word conscience		25-234-14
+word consciences	25-234-14-234
+word consciencieuse	25-234-14-234-15
+word consciencieuses	25-234-14-234-156
+word consciencieusement	25-234-14-234-134
+word consciencieux	25-234-14-1346
+word conscient		25-234
+word conscients		25-234-234
+word consciente		25-234-15
+word conscientes	25-234-156
+word conséquemment	14-12345-134
+word conséquence	14-12345-14
+word conséquences	14-12345-14-234
+word conséquent		14-12345
+word conséquents	14-12345-234
+word conséquente	14-12345-15
+word conséquentes	14-12345-156
+word considérable	14-145
+word considérables	14-145-234
+word considérablement	14-145-134
+word considération	14-145-16
+word considérations	14-145-16-234
+word contraire		14-356
+word contraires		14-356-234
+word contrairement	14-356-134
+word conversation	25-1236
+word conversations	25-1236-234
+word côté		14-1456
+word côtés		14-1456-234
+word couple		14-1246
+word couples		14-1246-234
+word courage		14-1245
+word courageuse		14-1245-234-15
+word courageuses		14-1245-234-156
+word courageusement	14-1245-234-134
+word courageux		14-1245-1346
+
+word danger		145-1245
+word dangers		145-1245-234
+word dangeureuse	145-1245-234-15
+word dangeureuses	145-1245-234-156
+word dangeureusement	145-1245-234-134
+word dangeureux		145-1245-1346
+word davantage		145-1
+word debout		145-12
+word dedans		145-145
+word degré		145-12456
+word degrés		145-12456-234
+word dehors		145-125
+word déjà		145-245
+word demain		145-134
+word depuis		145-1234
+word dernier		145-1345
+word derniers		145-1345-234
+word dernière		145-1235
+word dernières		145-1235-234
+word dernièrement	145-1235-134
+word derrière		145-236
+word derrières		145-236-234
+word des		145-234
+word désormais		145-34
+word desquels		145-234-12345-123-234
+word desquelles		145-234-12345-123-123-234
+word destin		145-35
+word destins		145-35-234
+word destinataire	145-35-1235
+word destinataires	145-35-1235-234
+word destination	145-35-16
+word destinations	145-35-16-234
+word devant		145-1236
+word devants		145-1236-234
+word différemment	145-345-134
+word différence		145-26-14
+word différences	145-26-14-234
+word différent		145-26
+word différents		145-26-234
+word différente		145-26-15
+word différentes	145-26-156
+word difficile		145-124
+word difficiles		145-124-234
+word difficilement	145-124-134
+word difficulté		145-124-2345
+word difficultés	145-124-2345-234
+word digne		145-2356
+word dignes		145-2356-234
+word dignement		145-2356-134
+word dignitaire		145-2356-2345-1235
+word dignitaires	145-2356-2345-1235-234
+word dignité		145-2356-2345
+word discours		256-14
+word dispositif		256-1234-124
+word dispositifs	256-1234-124-234
+word disposition	256-1234
+word dispositions	256-1234-234
+word distance		256-2345-14
+word distances		256-2345-14-234
+word distant		256-2345
+word distants		256-2345-234
+word distante		256-2345-15
+word distantes		256-2345-156
+word donc		145-14
+word dont		145-2345
+word douleur		145-123
+word douleurs		145-123-234
+word douloureuse	145-123-234-15
+word douloureuses	145-123-234-156
+word douloureusement	145-123-234-134
+word douloureux		145-123-1346
+word doute		145-1256
+word doutes		145-1256-234
+word duquel		145-12345-123
+
+word effectif		15-124-124
+word effectifs		15-124-124-234
+word effective		15-124-1236
+word effectives		15-124-1236-234
+word effectivement	15-124-1236-134
+word effet		15-124
+word effets		15-124-234
+word égal		123456-1245
+word égale		123456-1245-15
+word égales		123456-1245-156
+word également		123456-1245-134
+word égalitaire		123456-1245-2345-1235
+word égalitaires	123456-1245-2345-1235-234
+word égalité		123456-1245-2345
+word égalités		123456-1245-2345-234
+word égaux		123456-1245-1346
+word élément		123456-123
+word éléments		123456-123-234
+word élémentaire	123456-123-1235
+word élémentaires	123456-123-1235-234
+word encore		26-14
+word endroit		26-145
+word endroits		26-145-234
+word énergie		123456-1345
+word énergies		123456-1345-234
+word énergique		123456-1345-12345
+word énergiques		123456-1345-12345-234
+word énergiquement	123456-1345-12345-134
+word enfin		26-124
+word ennui		26-1345
+word ennuis		26-1345-234
+word ennuyeuse		26-1345-234-15
+word ennuyeuses		26-1345-234-156
+word ennuyeux		26-1345-1346
+word enquête		26-12345
+word enquêtes		26-12345-234
+word enquêteur		26-12345-46
+word enquêteurs		26-12345-46-234
+word enquêteuse		26-12345-234-15
+word enquêteuses	26-12345-234-156
+word ensemble		26-345
+word ensembles		26-345-234
+word ensuite		26-234
+word entier		26-2345
+word entiers		26-2345-234
+word entière		26-1235
+word entières		26-1235-234
+word entièrement	26-1235-134
+word environ		26-1236
+word espèce		156-1234
+word espèces		156-1234-234
+word espérance		156-1235-14
+word espérances		156-1235-14-234
+word espoir		156-1235
+word espoirs		156-1235-234
+word esprit		15-235
+word esprits		15-235-234
+word essentiel		156-123
+word essentiels		156-123-234
+word essentielle	156-123-123
+word essentielles	156-123-123-234
+word essentiellement	156-123-134
+word étant		123456-2345
+word être		126-356
+word êtres		126-356-234
+word événement		123456-1236
+word événements		123456-1236-234
+word éventualité	123456-1236-123-2345
+word éventualités	123456-1236-123-2345-234
+word éventuel		123456-1236-123
+word éventuels		123456-1236-123-234
+word éventuelle		123456-1236-123-123
+word éventuelles	123456-1236-123-123-234
+word éventuellement	123456-1236-123-134
+word excellemment	1346-123-134
+word excellence		1346-123-14
+word excellences	1346-123-14-234
+word excellent		1346-123
+word excellents		1346-123-234
+word excellente		1346-123-15
+word excellentes	1346-123-156
+word excès		1346-14
+word excessif		1346-14-124
+word excessifs		1346-14-124-234
+word excessive		1346-14-1236
+word excessives		1346-14-1236-234
+word excessivement	1346-14-1236-134
+word exercice		1346-236
+word exercices		1346-236-234
+word expérience		1346-1234
+word expériences	1346-1234-234
+word expérimental	1346-1234-123
+word expérimentale	1346-1234-123-15
+word expérimentales	1346-1234-123-156
+word expérimentallement	1346-1234-123-134
+word expérimentateur	1346-1234-46
+word expérimentateurs	1346-1234-46-234
+word expérimentation	1346-1234-16
+word expérimentations	1346-1234-16-234
+word expérimentaux	1346-1234-1346
+word explicable		1346-1246-45
+word explicables	1346-1246-45-234
+word explicatif		1346-1246-124
+word explicatifs	1346-1246-124-234
+word explication	1346-1246
+word explications	1346-1246-234
+word explicative	1346-1246-1236
+word explicatives	1346-1246-1236-234
+word expressif		1346-235-124
+word expressifs		1346-235-124-234
+word expression		1346-235
+word expressions	1346-235-234
+word expressive		1346-235-1236
+word expressives	1346-235-1236-234
+word expressivement	1346-235-1236-134
+word extérieur		1346-2345
+word extérieurs		1346-2345-234
+word extérieure		1346-2345-15
+word extérieures	1346-2345-156
+word extérieurement	1346-2345-134
+word extrême		1346-356
+word extrêmes		1346-356-234
+word extrêmement	1346-356-134
+word extrémité		1346-356-2345
+word extrémités		1346-356-2345-234
+
+word facile		124-14
+word faciles		124-14-234
+word facilement		124-14-134
+word facilité		124-14-2345
+word facilités		124-14-2345-234
+word faubourg		124-12
+word faubourgs		124-12-234
+word faut		124-2345
+word faute		124-2345-15
+word fautes		124-2345-15-234
+word fautif		124-2345-124
+word fautifs		124-2345-124-234
+word fautive		124-2345-1236
+word fautives		124-2345-1236-234
+word faveur		124-1236
+word faveurs		124-1236-234
+word favorable		124-1236-45
+word favorables		124-1236-45-234
+word favorablement	124-1236-45-134
+word féminin		124-134-35
+word féminins		124-134-35-234
+word féminine		124-134-1345
+word féminines		124-134-1345-234
+word femme		124-134
+word femmes		124-134-234
+word fête		124-126
+word fêtes		124-126-234
+word fidèle		124-145
+word fidèles		124-145-234
+word fidèlement		124-145-134
+word fidélité		124-145-2345
+word fidélités		124-145-2345-234
+word figuratif		124-1245-124
+word figuratifs		124-1245-124-234
+word figuration		124-1245-16
+word figurations	124-1245-16-234
+word figurative		124-1245-1236
+word figuratives	124-1245-1236-234
+word figure		124-1245
+word figures		124-1245-234
+word fille		124-123
+word filles		124-123-234
+word fils		124-234
+word fonction		124-346
+word fonctions		124-346-234
+word fonctionnaire	124-346-1235
+word fonctionnaires	124-346-1235-234
+word fonctionnel	124-346-123
+word fonctionnels	124-346-123-234
+word fonctionnelle	124-346-123-123
+word fonctionnelles	124-346-123-123-234
+word fonctionnement	124-346-134
+word fonctionnements	124-346-134-234
+word force		124-135
+word forces		124-135-234
+word forcément		124-135-134
+word fortune		124-1345
+word fortunes		124-1345-234
+word fraternel		124-1235-123
+word fraternels		124-1235-123-234
+word fraternelle	124-1235-123-123
+word fraternelles	124-1235-123-123-234
+word fraternellement	124-1235-123-134
+word fraternisation	124-1235-16
+word fraternisations	124-1235-16-234
+word fraternité		124-1235-2345
+word fraternités	124-1235-2345-234
+word fréquemment	124-12345-134
+word fréquence		124-12345-14
+word fréquences		124-12345-14-234
+word fréquent		124-12345
+word fréquents		124-12345-234
+word fréquente		124-12345-15
+word fréquentes		124-12345-156
+word fréquentation	124-12345-16
+word fréquentations	124-12345-16-234
+word frère		124-1235
+word frères		124-1235-234
+
+word garde		1245-145
+word gardes		1245-145-234
+word général		1245-1345
+word générale		1245-1345-15
+word générales		1245-1345-156
+word généralement	1245-1345-134
+word généralisation	1245-1345-16
+word généralisations	1245-1345-16-234
+word généralité		1245-1345-2345
+word généralités	1245-1345-2345-234
+word généraux		1245-1345-1346
+word généreuse		1245-234-15
+word généreuses		1245-234-156
+word généreusement	1245-234-134
+word généreux		1245-1346
+word générosité		1245-234-2345
+word générosités	1245-234-2345-234
+word gloire		1245-1235
+word gloires		1245-1235-234
+word glorieuse		1245-1235-234-15
+word glorieuses		1245-1235-234-156
+word glorieusement	1245-1235-234-134
+word glorieux		1245-1235-1346
+word gouvernement	1245-1236
+word gouvernements	1245-1236-234
+word gouvernemental	1245-1236-123
+word gouvernementale	1245-1236-123-15
+word gouvernementales	1245-1236-123-156
+word gouvernementaux	1245-1236-1346
+word gouverneur		1245-1236-46
+word gouverneurs	1245-1236-46-234
+word grâce		12456-14
+word grâces		12456-14-234
+word gracieuse		12456-14-234-15
+word gracieuses		12456-14-234-156
+word gracieusement	12456-14-234-134
+word gracieux		12456-14-1346
+word grande		12456-145
+word grandes		12456-145-234
+word grandement		12456-145-134
+word grandeur		12456-46
+word grandeurs		12456-46-234
+word grave		12456-1236
+word graves		12456-1236-234
+word gravement		12456-1236-134
+word gravitation	12456-1236-2345-16
+word gravitations	12456-1236-2345-16-234
+word gravité		12456-1236-2345
+word gravités		12456-1236-2345-234
+word groupe		12456-1234
+word groupes		12456-1234-234
+word groupement		12456-1234-134
+word groupements	12456-1234-134-234
+word guère		1245-2346
+word guerre		1245-236
+word guerres		1245-236-234
+
+word habitude		125-12
+word habitudes		125-12-234
+word habituel		125-12-123
+word habituels		125-12-123-234
+word habituelle		125-12-123-123
+word habituelles	125-12-123-123-234
+word habituellement	125-12-123-134
+word hasard		125-145
+word hasards		125-145-234
+word hasardeuse		125-145-234-15
+word hasardeuses	125-145-234-156
+word hasardeux		125-145-1346
+word hélas		125-123
+word heure		125-1235
+word heures		125-1235-234
+word heureuse		125-234-15
+word heureuses		125-234-156
+word heureusement	125-234-134
+word heureux		125-1346
+word hier		125-236
+word histoire		125-2345
+word histoires		125-2345-234
+word historique		125-2345-12345
+word historiques	125-2345-12345-234
+word historiquement	125-2345-12345-134
+word hiver		125-1236
+word hivers		125-1236-234
+word hivernal		125-1236-123
+word hivernaux		125-1236-1346
+word hommage		125-1245
+word hommages		125-1245-234
+word homme		125-134
+word hommes		125-134-234
+word honnête		125-126
+word honnêtes		125-126-234
+word honnêtement	125-126-134
+word honnêteté		125-126-2345
+word honnêtetés		125-126-2345-234
+word honneur		125-1345
+word honneurs		125-1345-234
+word honorabilité	125-1345-12-123-2345
+word honorabilités	125-1345-12-123-2345-234
+word honorable		125-1345-45
+word honorables		125-1345-45-234
+word honorablement	125-1345-45-134
+word honoraire		125-1345-1235
+word honoraires		125-1345-1235-234
+word horaire		125-1235-1235
+word horaires		125-1235-1235-234
+word horizon		125-1356
+word horizons		125-1356-234
+word horizontal		125-1356-123
+word horizontale	125-1356-123-15
+word horizontales	125-1356-123-156
+word horizontalement	125-1356-123-134
+word horizontalité	125-1356-123-2345
+word horizontalités	125-1356-123-2345-234
+word horizontaux	125-1356-1346
+word hypothèse		125-1234
+word hypothèses		125-1234-234
+word hypothétique	125-1234-12345
+word hypothétiques	125-1234-12345-234
+word hypothétiquement	125-1234-12345-134
+word humain		125-134-35
+word humains		125-134-35-234
+word humaine		125-134-1345
+word humaines		125-134-1345-234
+word humainement	125-134-1345-134
+word humanitaire	125-134-1345-2345-1235
+word humanitaires	125-134-1345-2345-1235-234
+word humanité		125-134-1345-2345
+word humanités		125-134-1345-2345-234
+
+word idéal		24-145-123
+word idéale		24-145-123-15
+word idéales		24-145-123-156
+word idéalement		24-145-123-134
+word idéaux		24-145-1346
+word idée		24-145
+word idées		24-145-234
+word image		24-1245
+word images		24-1245-234
+word imaginable		24-1245-45
+word imaginables	24-1245-45-234
+word imaginaire		24-1245-1235
+word imaginaires	24-1245-1235-234
+word imagination	24-1245-16
+word immédiat		24-134
+word immédiats		24-134-234
+word immédiate		24-134-15
+word immédiates		24-134-156
+word immédiatement	24-134-134
+word impression		246-235
+word impressions	246-235-234
+word impressionnable	246-235-45
+word impressionnables	246-235-45-234
+word inférieur		35-124
+word inférieurs		35-124-234
+word inférieure		35-124-15
+word inférieures	35-124-156
+word inférieurement	35-124-134
+word infériorité	35-124-2345
+word infériorités	35-124-2345-234
+word inquiet		35-12345
+word inquiets		35-12345-234
+word inquiète		35-2346
+word inquiètes		35-2346-234
+word inquiétude		35-12345-145
+word inquiétudes	35-12345-145-234
+word intelligemment	35-1245-134
+word intelligence	35-1245-14
+word intelligent	35-1245
+word intelligents	35-1245-234
+word intelligente	35-1245-15
+word intelligentes	35-1245-156
+word intérieur		35-2345
+word intérieurs		35-2345-234
+word intérieure		35-2345-15
+word intérieures	35-2345-156
+word intérieurement	35-2345-134
+
+word jadis		245-145
+word jamais		245-134
+word jeune		245-1345
+word jeunes		245-1345-234
+word jour		245-1235
+word jours		245-1235-234
+word journal		245-1235-123
+word journaux		245-1235-1346
+word joyeuse		245-234-15
+word joyeuses		245-234-156
+word joyeusement	245-234-134
+word joyeux		245-1346
+word juge		245-1245
+word juges		245-1245-234
+word jugement		245-1245-134
+word jugements		245-1245-134-234
+word jusque		245-12345
+word juste		245-2345
+word justes		245-2345-234
+word justement		245-2345-134
+word justice		245-14
+
+word laquelle		123-123-123
+word lecture		123-1235
+word lectures		123-1235-234
+word lequel		123-123
+word lesquelles		123-123-123-234
+word lesquels		123-123-234
+word lettre		123-356
+word lettres		123-356-234
+word libéral		123-12-123
+word libérale		123-12-123-15
+word libérales		123-12-123-156
+word libéralement	123-12-123-134
+word libéralité		123-12-123-2345
+word libéralités	123-12-123-2345-234
+word libérateur		123-12-46
+word libérateurs	123-12-46-234
+word libération		123-12-16
+word libérations	123-12-16-234
+word libéraux		123-12-1346
+word liberté		123-12-2345
+word libertés		123-12-2345-234
+word libre		123-12
+word libres		123-12-234
+word librement		123-12-134
+word ligne		123-2356
+word lignes		123-2356-234
+word livre		123-1236
+word livres		123-1236-234
+word logique		123-1245-12345
+word logiques		123-1245-12345-234
+word logiquement	123-1245-12345-134
+word loin		123-1345
+word loins		123-1345-234
+word lointain		123-1345-35
+word lointains		123-1345-35-234
+word lointaine		123-1345-1345
+word lointaines		123-1345-1345-234
+word longtemps		123-2345
+word lorsque		123-12345
+word lourd		123-145
+word lourds		123-145-234
+word lourde		123-145-15
+word lourdes		123-145-156
+word lourdement		123-145-134
+word lourdeur		123-145-46
+word lourdeurs		123-145-46-234
+word lumière		123-134
+word lumières		123-134-234
+word lumineuse		123-134-234-15
+word lumineuses		123-134-234-156
+word lumineusement	123-134-234-134
+word lumineux		123-134-1346
+word luminosité		123-134-234-2345
+word luminosités	123-134-234-2345-234
+
+word madame		134-145
+word mademoiselle	134-134
+word magnificence	134-2356-14
+word magnificences	134-2356-14-234
+word magnifique		134-2356
+word magnifiques	134-2356-234
+word magnifiquement	134-2356-134
+word maintenant		134-2345
+word malgré		134-12456
+word malheur		134-125
+word malheurs		134-125-234
+word malheureuse	134-125-234-15
+word malheureuses	134-125-234-156
+word malheureusement	134-125-234-134
+word malheureux		134-125-1346
+word manière		134-1345
+word manières		134-1345-234
+word mauvais		134-1236
+word mauvaise		134-1236-15
+word mauvaises		134-1236-156
+word meilleur		134-123
+word meilleurs		134-123-234
+word meilleure		134-123-15
+word meilleures		134-123-156
+word merci		134-14
+word mère		134-2346
+word mères		134-2346-234
+word mes		134-234
+word mesdames		134-145-234
+word mesdemoiselles	134-134-234
+word messieurs		134-1235-234
+word mettre		134-356
+word mieux		134-1346
+word mission		134-3456
+word missions		134-3456-234
+word missionnaire	134-3456-1235
+word missionnaires	134-3456-1235-234
+word mobile		134-12
+word mobiles		134-12-234
+word mobilisation	134-12-16
+word mobilisations	134-12-16-234
+word mobilité		134-12-2345
+word mobilités		134-12-2345-234
+word moins		134-35
+word moment		134-26
+word moments		134-26-234
+word momentanément	134-26-134
+word monsieur		134-1235
+word multiple		134-1246
+word multiples		134-1246-234
+word multiplicateur	134-1246-46
+word multiplicateurs	134-1246-46-234
+word multiplication	134-1246-16
+word multiplications	134-1246-16-234
+word multiplicité	134-1246-2345
+word multiplicités	134-1246-2345-234
+word musique		134-12345
+word musiques		134-12345-234
+word mystère		134-13456
+word mystères		134-13456-234
+word mystérieuse	134-13456-234-15
+word mystérieuses	134-13456-234-156
+word mystérieusement	134-13456-234-134
+word mystérieux		134-13456-1346
+
+word naguère		1345-1245
+word nation		1345-16
+word nations		1345-16-234
+word national		1345-16-123
+word nationale		1345-16-123-15
+word nationales		1345-16-123-156
+word nationalité	1345-16-123-2345
+word nationalités	1345-16-123-2345-234
+word nationaux		1345-16-1346
+word nature		1345-2345
+word natures		1345-2345-234
+word naturel		1345-2345-123
+word naturels		1345-2345-123-234
+word naturelle		1345-2345-123-123
+word naturelles		1345-2345-123-123-234
+word naturellement	1345-2345-123-134
+word néanmoins		1345-134
+word nécessaire		1345-14
+word nécessaires	1345-14-234
+word nécessairement	1345-14-134
+word nécessité		1345-14-2345
+word nécessités		1345-14-2345-234
+word nécessiteuse	1345-14-2345-234-15
+word nécessiteuses	1345-14-2345-234-156
+word nécessiteux	1345-14-2345-1346
+word nombre		1345-12
+word nombres		1345-12-234
+word nombreuse		1345-12-234-15
+word nombreuses		1345-12-234-156
+word nombreux		1345-12-1346
+word nos		1345-234
+word notre		1345-356
+word nôtre		1345-1456
+word nôtres		1345-1456-234
+word nouveau		1345-1236
+word nouveaux		1345-1236-1346
+word nouveauté		1345-1236-2345
+word nouveautés		1345-1236-2345-234
+word nouvel		1345-123
+word nouvelle		1345-123-123
+word nouvelles		1345-123-123-234
+word nouvellement	1345-123-134
+
+word objectif		135-245-124
+word objectifs		135-245-124-234
+word objection		135-245-3456
+word objections		135-245-3456-234
+word objective		135-245-1236
+word objectives		135-245-1236-234
+word objectivement	135-245-1236-134
+word objectivité	135-245-1236-2345
+word objectivités	135-245-1236-2345-234
+word objet		135-245
+word objets		135-245-234
+word observateur	135-12-46
+word observateurs	135-12-46-234
+word observation	135-12
+word observations	135-12-234
+word occasion		135-14
+word occasions		135-14-234
+word occasionnel	135-14-123
+word occasionnels	135-14-123-234
+word occasionnelle	135-14-123-123
+word occasionnelles	135-14-123-123-234
+word occasionnellement	135-14-123-134
+word oeuvre		246-1236
+word oeuvres		246-1236-234
+word office		135-124
+word offices		135-124-234
+word officiel		135-124-123
+word officiels		135-124-123-234
+word officielle		135-124-123-123
+word officielles		135-124-123-123-234
+word officiellement	135-124-123-134
+word officieuse		135-124-234-15
+word officieuses	135-124-234-156
+word officieusement	135-124-234-134
+word officieux		135-124-1346
+word opinion		135-1234
+word opinions		135-1234-234
+word ordinaire		56-145
+word ordinaires		56-145-234
+word ordinairement	56-145-134
+word originaire		135-1245-1235
+word originaires	135-1245-1235-234
+word originairement	135-1245-1235-134
+word original		135-1245-123
+word originale		135-1245-123-15
+word originales		135-1245-123-156
+word originalement	135-1245-123-134
+word originalité	135-1245-123-2345
+word originalités	135-1245-123-2345-234
+word originaux		135-1245-1346
+word origine		135-1245
+word origines		135-1245-234
+word outrage		1256-356-1245
+word outrages		1256-356-1245-234
+word outrageuse		1256-356-1245-234-15
+word outrageuses	1256-356-1245-234-156
+word outrageusement	1256-356-1245-234-134
+word outrageux		1256-356-1245-1346
+word outre		1256-356
+word ouvrage		1256-1245
+word ouvrages		1256-1245-234
+word ouvrier		1256-1236
+word ouvriers		1256-1236-234
+word ouvrière		1256-2346
+word ouvrières		1256-2346-234
+
+word parfois		1234-124
+word parmi		1234-134
+word parole		1234-1235
+word paroles		1234-1235-234
+word particularité	1234-1235-123-2345
+word particularités	1234-1235-123-2345-234
+word particulier	1234-123
+word particuliers	1234-123-234
+word particulière	1234-123-1235
+word particulières	1234-123-1235-234
+word particulièrement	1234-123-1235-134
+word partout		1234-1
+word pas		1234-234
+word pauvre		1234-1236
+word pauvres		1234-1236-234
+word pauvrement		1234-1236-134
+word pauvreté		1234-1236-2345
+word pauvretés		1234-1236-2345-234
+word pendant		1234-145
+word pensée		1234-26
+word pensées		1234-26-234
+word pensif		1234-26-124
+word pensifs		1234-26-124-234
+word pensive		1234-26-1236
+word pensives		1234-26-1236-234
+word pensivement	1234-26-1236-134
+word père		1234-2346
+word pères		1234-2346-234
+word personnage		1234-1345-1245
+word personnages	1234-1345-1245-234
+word personnalité	1234-1345-123-2345
+word personnalités	1234-1345-123-2345-234
+word personne		1234-1345
+word personnes		1234-1345-234
+word personnel		1234-1345-123
+word personnels		1234-1345-123-234
+word personnelle	1234-1345-123-123
+word personnelles	1234-1345-123-123-234
+word personnellement	1234-1345-123-134
+word petit		1234-15
+word petits		1234-15-234
+word petite		1234-15-15
+word petites		1234-15-156
+word peuple		1234-1246
+word peuples		1234-1246-234
+word peuplement		1234-1246-134
+word peuplements	1234-1246-134-234
+word place		1246-14
+word places		1246-14-234
+word placement		1246-14-134
+word placements		1246-14-134-234
+word plaisir		1246-1235
+word plaisirs		1246-1235-234
+word plusieurs		1246-234
+word plutôt		1246-2345
+word point		1234-2345
+word points		1234-2345-234
+word pointe		1234-2345-15
+word pointes		1234-2345-15-234
+word populaire		1234-1234-1235
+word populaires		1234-1234-1235-234
+word populairement	1234-1234-1235-134
+word popularité		1234-1234-1235-2345
+word popularités	1234-1234-1235-2345-234
+word population		1234-1234
+word populations	1234-1234-234
+word populeuse		1234-1234-234-15
+word populeuses		1234-1234-234-156
+word populeux		1234-1234-1346
+word possibilité	1234-12-2345
+word possibilités	1234-12-2345-234
+word possible		1234-12
+word possibles		1234-12-234
+word pourquoi		1234-23456
+word pourtant		1234-135
+word praticable		235-2345-45
+word praticables	235-2345-45-234
+word pratique		235-2345
+word pratiques		235-2345-234
+word pratiquement	235-2345-134
+word premier		235-134
+word premiers		235-134-234
+word première		235-1235
+word premières		235-1235-234
+word premièrement	235-1235-134
+word près		235-234
+word presque		235-12345
+word preuve		235-1236
+word preuves		235-1236-234
+word primitif		235-134-124
+word primitifs		235-134-124-234
+word primitive		235-134-1236
+word primitives		235-134-1236-234
+word primitivement	235-134-1236-134
+word principal		235-14-123
+word principale		235-14-123-15
+word principales	235-14-123-156
+word principalement	235-14-123-134
+word principaux		235-14-1346
+word principe		235-14
+word principes		235-14-234
+word prix		235-1346
+word probabilité	235-12-2345
+word probabilités	235-12-2345-234
+word probable		235-12
+word probables		235-12-234
+word probablement	235-12-134
+word prochain		235-12356
+word prochains		235-12356-234
+word prochaine		235-1345
+word prochaines		235-1345-234
+word prochainement	235-1345-134
+word producteur		235-145-46
+word producteurs	235-145-46-234
+word productif		235-145-124
+word productifs		235-145-124-234
+word production		235-145-3456
+word productions	235-145-3456-234
+word productive		235-145-1236
+word productives	235-145-1236-234
+word productivement	235-145-1236-134
+word productivité	235-145-1236-2345
+word productivités	235-145-1236-2345-234
+word produit		235-145
+word produits		235-145-234
+word profit		235-124
+word profits		235-124-234
+word profitable		235-124-45
+word profitables	235-124-45-234
+word profiteur		235-124-46
+word profiteurs		235-124-46-234
+word profiteuse		235-124-234-15
+word profiteuses	235-124-234-156
+word progrès		235-12456
+word progressif		235-12456-124
+word progressifs	235-12456-124-234
+word progression	235-12456-3456
+word progressions	235-12456-3456-234
+word progressive	235-12456-1236
+word progressives	235-12456-1236-234
+word progressivement	235-12456-1236-134
+word projecteur		235-245-46
+word projecteurs	235-245-46-234
+word projection		235-245-3456
+word projections	235-245-3456-234
+word projet		235-245
+word projets		235-245-234
+word proportion		235-1234
+word proportions	235-1234-234
+word proportionnalité	235-1234-123-2345
+word proportionnalités	235-1234-123-2345-234
+word proportionnel	235-1234-123
+word proportionnels	235-1234-123-234
+word proportionnelle	235-1234-123-123
+word proportionnelles	235-1234-123-123-234
+word proportionnellement 235-1234-123-134
+word proposition	235-246
+word propositions	235-246-234
+word puisque		1234-12345
+word puissance		1234-14
+word puissances		1234-14-234
+
+word qualitatif		12345-123-2345-124
+word qualitatifs	12345-123-2345-124-234
+word qualitative	12345-123-2345-1236
+word qualitatives	12345-123-2345-1236-234
+word qualitativement	12345-123-2345-1236-134
+word qualité		12345-123-2345
+word qualités		12345-123-2345-234
+word quand		12345-145
+word quant		12345-2345
+word quantitatif	12345-2345-2345-124
+word quantitatifs	12345-2345-2345-124-234
+word quantitative	12345-2345-2345-1236
+word quantitatives	12345-2345-2345-1236-234
+word quantitativement	12345-2345-2345-1236-134
+word quantité		12345-2345-2345
+word quantités		12345-2345-2345-234
+word quel		12345-123
+word quels		12345-123-234
+word quelle		12345-123-123
+word quelles		12345-123-123-234
+word quelconque		12345-14
+word quelconques	12345-14-234
+word quelque		12345-12345
+word quelques		12345-12345-234
+word quelquefois	12345-124
+word question		12345-3456
+word questions		12345-3456-234
+word questionnaire	12345-3456-1235
+word questionnaires	12345-3456-1235-234
+word quiconque		12345-346
+word quoique		12345-15
+
+word raison		1235-346
+word raisons		1235-346-234
+word raisonnable	1235-346-45
+word raisonnables	1235-346-45-234
+word raisonnablement	1235-346-45-134
+word raisonnement	1235-346-134
+word raisonnements	1235-346-134-234
+word rapport		1235-1234
+word rapports		1235-1234-234
+word rapporteur		1235-1234-46
+word rapporteurs	1235-1234-46-234
+word rare		1235-1235
+word rares		1235-1235-234
+word rarement		1235-1235-134
+word rareté		1235-1235-2345
+word raretés		1235-1235-2345-234
+word réalisable		1235-123-45
+word réalisables	1235-123-45-234
+word réalisateur	1235-123-46
+word réalisateurs	1235-123-46-234
+word réalisation	1235-123-16
+word réalisations	1235-123-16-234
+word réalité		1235-123-2345
+word réalités		1235-123-2345-234
+word réel		1235-123
+word réels		1235-123-234
+word réelle		1235-123-123
+word réelles		1235-123-123-234
+word réellement		1235-123-134
+word réflexion		1235-124
+word réflexions		1235-124-234
+word regard		1235-1245
+word regards		1235-1245-234
+word regret		1235-12456
+word regrets		1235-12456-234
+word regrettable	1235-12456-45
+word regrettables	1235-12456-45-234
+word relatif		1235-2345-124
+word relatifs		1235-2345-124-234
+word relation		1235-2345
+word relations		1235-2345-234
+word relative		1235-2345-1236
+word relatives		1235-2345-1236-234
+word relativement	1235-2345-1236-134
+word relativité		1235-2345-1236-2345
+word relativités	1235-2345-1236-2345-234
+word remarquable	1235-12345-45
+word remarquables	1235-12345-45-234
+word remarquablement	1235-12345-45-134
+word remarque		1235-12345
+word remarques		1235-12345-234
+word remerciement	1235-134
+word remerciements	1235-134-234
+word renseignement	1235-26
+word renseignements	1235-26-234
+word rêve		1235-126
+word rêves		1235-126-234
+word rêveur		1235-126-46
+word rêveurs		1235-126-46-234
+word rêveuse		1235-126-234-15
+word rêveuses		1235-126-234-156
+word rêveusement	1235-126-234-134
+word rôle		1235-1456
+word rôles		1235-1456-234
+word route		1235-1256
+word routes		1235-1256-234
+word rythme		1235-13456
+word rythmes		1235-13456-234
+word rythmique		1235-13456-12345
+word rythmiques		1235-13456-12345-234
+word rythmiquement	1235-13456-12345-134
+
+word séculaire		234-14-1235
+word séculaires		234-14-1235-234
+word séculairement	234-14-1235-134
+word seigneur		234-2356
+word seigneurs		234-2356-234
+word semblable		234-12
+word semblables		234-12-234
+word semblablement	234-12-134
+word sentiment		234-2345-134
+word sentiments		234-2345-134-234
+word sentimental	234-2345-134-123
+word sentimentale	234-2345-134-123-15
+word sentimentales	234-2345-134-123-156
+word sentimentalement	234-2345-134-123-134
+word sentimentalité	234-2345-134-123-2345
+word sentimentalités	234-2345-134-123-2345-234
+word sentimentaux	234-2345-134-1346
+word ses		234-234
+word seul		234-123
+word seuls		234-123-234
+word seule		234-123-15
+word seules		234-123-156
+word seulement		234-123-134
+word siècle		234-14
+word siècles		234-14-234
+word simple		234-1246
+word simples		234-1246-234
+word simplement		234-1246-134
+word simplicité		234-1246-2345
+word simplicités	234-1246-2345-234
+word simplification	234-1246-16
+word simplifications	234-1246-16-234
+word soeur		234-1235
+word soeurs		234-1235-234
+word soin		234-35
+word soins		234-35-234
+word solitaire		234-123-1235
+word solitaires		234-123-1235-234
+word solitairement	234-123-1235-134
+word solitude		234-123-145
+word solitudes		234-123-145-234
+word sommaire		234-2456-1235
+word sommaires		234-2456-1235-234
+word sommairement	234-2456-1235-134
+word somme		234-2456
+word sommes		234-2456-234
+word sont		234-2345
+word sorte		234-135
+word sortes		234-135-234
+word soudain		234-145
+word soudains		234-145-234
+word soudaine		234-1345
+word soudaines		234-1345-234
+word soudainement	234-1345-134
+word soudaineté		234-1345-2345
+word soudainetés	234-1345-2345-234
+word souffrance		234-124-14
+word souffrances	234-124-14-234
+word souffrant		234-124
+word souffrants		234-124-234
+word souffrante		234-124-15
+word souffrantes	234-124-156
+word souvent		234-1236
+word subjectif		234-245-124
+word subjectifs		234-245-124-234
+word subjective		234-245-1236
+word subjectives	234-245-1236-234
+word subjectivement	234-245-1236-134
+word subjectivité	234-245-1236-2345
+word subjectivités	234-245-1236-2345-234
+word sujet		234-245
+word sujets		234-245-234
+word sujétion		234-245-3456
+word sujétions		234-245-3456-234
+word supérieur		234-1234
+word supérieurs		234-1234-234
+word supérieure		234-1234-15
+word supérieures	234-1234-156
+word supérieurement	234-1234-134
+word supériorité	234-1234-2345
+word supériorités	234-1234-2345-234
+word surtout		234-2345
+word systématique	234-13456-12345
+word systématiques	234-13456-12345-234
+word systématiquement	234-13456-12345-134
+word système		234-13456
+word systèmes		234-13456-234
+
+word tel		2345-123
+word tels		2345-123-234
+word telle		2345-123-123
+word telles		2345-123-123-234
+word tellement		2345-123-134
+word temporaire		2345-1234-1235
+word temporaires	2345-1234-1235-234
+word temporairement	2345-1234-1235-134
+word temporel		2345-1234-123
+word temporels		2345-1234-123-234
+word temporelle		2345-1234-123-123
+word temporelles	2345-1234-123-123-234
+word temps		2345-1234
+word tenir		2345-1345
+word terre		2345-1235
+word terres		2345-1235-234
+word tes		2345-234
+word tête		2345-126
+word têtes		2345-126-234
+word théorie		2345-125
+word théories		2345-125-234
+word théorique		2345-125-12345
+word théoriques		2345-125-12345-234
+word théoriquement	2345-125-12345-134
+word titre		2345-356
+word titres		2345-356-234
+word toujours		2345-245
+word toute		2345-2345
+word toutes		2345-2345-234
+word toutefois		2345-124
+word tragique		356-1245
+word tragiques		356-1245-234
+word tragiquement	356-1245-134
+word trajet		356-245
+word trajets		356-245-234
+word tranquille		356-12345
+word tranquilles	356-12345-234
+word tranquillement	356-12345-134
+word tranquillité	356-12345-2345
+word tranquillités	356-12345-2345-234
+word travail		356-123
+word travailleur	356-123-46
+word travailleurs	356-123-46-234
+word travailleuse	356-123-234-15
+word travailleuses	356-123-234-156
+word travaux		356-1346
+word travers		356-1236
+word très		356-234
+word trop		356-1234
+word type		2345-13456
+word types		2345-13456-234
+word typique		2345-13456-12345
+word typiques		2345-13456-12345-234
+word typiquement	2345-13456-12345-134
+
+word une		136-1345
+word unes		136-1345-234
+word unique		136-12345
+word uniques		136-12345-234
+word uniquement		136-12345-134
+word unitaire		136-1345-2345-1235
+word unitaires		136-1345-2345-1235-234
+word unité		136-1345-2345
+word unités		136-1345-2345-234
+word univers		136-1236
+word universalité	136-1236-123-2345
+word universalités	136-1236-123-2345-234
+word universel		136-1236-123
+word universels		136-1236-123-234
+word universelle	136-1236-123-123
+word universelles	136-1236-123-123-234
+word universellement	136-1236-123-134
+word universitaire	136-1236-2345-1235
+word universitaires	136-1236-2345-1235-234
+word université		136-1236-2345
+word universités	136-1236-2345-234
+word usage		136-1245
+word usages		136-1245-234
+word utile		136-123
+word utiles		136-123-234
+word utilement		136-123-134
+word utilisable		136-123-45
+word utilisables	136-123-45-234
+word utilisateur	136-123-46
+word utilisateurs	136-123-46-234
+word utilisation	136-123-16
+word utilisations	136-123-16-234
+word utilitaire		136-123-2345-1235
+word utilitaires	136-123-2345-1235-234
+word utilité		136-123-2345
+word utilités		136-123-2345-234
+
+word valeur		1236-46
+word valeurs		1236-46-234
+word venir		1236-1345
+word véritable		1236-1235
+word véritables		1236-1235-234
+word véritablement	1236-1235-134
+word vérité		1236-123456
+word vérités		1236-123456-234
+word vieux		1236-1346
+word vif		1236-124
+word vifs		1236-124-234
+word vive		1236-1236
+word vives		1236-1236-234
+word vivement		1236-1236-134
+word voici		1236-14
+word voilà		1236-123
+word volontaire		1236-135-1235
+word volontaires	1236-135-1235-234
+word volontairement	1236-135-1235-134
+word volonté		1236-135
+word volontés		1236-135-234
+word volontiers		1236-346
+word vos		1236-234
+word votre		1236-356
+word vôtre		1236-1456
+word vôtres		1236-1456-234
+word voyage		1236-1245
+word voyages		1236-1245-234
+word voyageur		1236-1245-46
+word voyageurs		1236-1245-46-234
+word voyageuse		1236-1245-234-15
+word voyageuses		1236-1245-234-156
+word vraiment		1236-134
+
+###
+### 4. Locutions
+###
+
+word à\scause 12356-456-14
+word à\smesure 12356-456-134
+word à\speine 12356-456-1234
+word à\speu\sprès 12356-456-1234-456-235
+word à\sprésent 12356-456-235
+word à\stravers 12356-456-356
+word au\scontraire 13-456-14
+word au-dessous 13-36-1256
+word au-dessus 13-36-145
+word aujourd'hui 13-3-125
+word autant\sque 13-456-12345
+word autre\schose 13-456-12356
+word autre\spart 13-456-1234
+word c'est-à-dire 14-3-15-36-12356-36-145
+word d'abord 145-3-1
+word de\ssuite 145-456-234
+word en\smesure 26-456-134
+word en\sréalité 26-456-1235
+word et\scétera 15-456-14
+word la\splupart 123-456-1246
+word non\sseulement 1345-456-234
+word parce\sque 1234-456-12345
+word par\sconséquent 1234-456-14
+word par-dessous 1234-36-1256
+word par-dessus 1234-36-145
+word par\sexemple 1234-456-15
+word par\ssuite 1234-456-234
+word peu\sà\speu 1234-456-12356-456-1234
+word peut-être 1234-36-126
+word plus\stard 1246-456-2345
+word plus\stôt 1246-456-1456
+word pour\sainsi\sdire 1234-456-1-456-145
+word quelque\schose 12345-456-12356
+word quelque\spart 12345-456-1234
+word quelque\stemps 12345-456-2345
+word sans\scesse 234-456-14
+word sans\sdoute 234-456-145
+word tandis\sque 2345-456-12345
+word tour\sà\stour 2345-456-12356-456-2345
+word tout\sà\scoup 16-456-12356-456-14
+word tout\sà\sfait 16-456-12356-456-124
+word très\sbien 356-456-12
+word vis-à-vis 1236-36-12356-36-1236
+
+sufword jusqu' 245-12345-3
+sufword lorsqu' 123-12345-3
+sufword parce\squ' 1234-456-12345-3
+
diff --git a/liblouis/tables/Fr-Fr-g2.ctb b/liblouis/tables/Fr-Fr-g2.ctb
new file mode 100644
index 0000000..92ef9ae
--- /dev/null
+++ b/liblouis/tables/Fr-Fr-g2.ctb
@@ -0,0 +1,1796 @@
+# liblouis: French Grade 2 Table
+
+# Copyright (C) 1995-2004 by The BRLTTY Team
+# Copyright (C) 2012 Nicolas Pitre <nico@cam.org>
+
+# This file is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with this file; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# liblouis  comes with ABSOLUTELY NO WARRANTY.
+
+# Auteur:
+#
+#	Nicolas Pitre <nico@cam.org>
+#
+# Référence:
+#
+#	Index de l'abrégé orthographique français étendu, lecture et écriture
+#	Révision 1993
+#	Service de production Braille, Institut Nazareth et Louis-Braille
+#	Longueuil (Québec)
+
+# Contracted Unified French Table
+# --------------------------------
+
+include fr-fr-g1.utb
+
+###
+### 1. Assemblages de lettres représentés par un seul symbole,
+###    et finales représentées par deux ou trois symboles;
+###
+
+punctuation ' 6		so the line below compiles
+letsign 6
+
+sign ^ 4					so the line: "before con always ar 4" compiles
+sign ~ 5
+
+class voy aeiouyéàèùâêîôûëïüAEIOUYÉÀÈÙÂÊËïü
+class con bcçdfghjklmnpqrstvwxzBCÇDFGHJKLMNPQRSTVWXZ
+class bmp bmpBMP
+
+endword able 45
+always ai 34
+endword ait 146
+before con always an 2
+endword ant 1456
+before con always ar 4
+endword ar 4
+endword ation 16
+always au 13
+
+always bl 45
+before voy always br 23
+
+always ch 12356
+before voy always cl 146
+before con begword com 36
+before con always con 25
+before voy always cr 25
+
+before con begword dis 256
+before voy always dr 1456
+
+endword elle 456
+before con always em 345
+before con always en 26
+endword en 26
+endword ent 126
+before con midword er 236
+endword er 236
+begword es 156
+endword es 156
+word eu 15-136
+always eu 5
+before con always eur 46
+endword eur 46
+before con always ex 1346
+endword ez 1356
+
+before voy always fl 126
+before voy always fr 16
+
+before voy always gl 345
+always gn 2356
+before voy always gr 12456
+
+always ien 256
+always ieu 6
+before bmp begword im 246
+always in 35
+always ion 3456
+endword ition 246
+
+before voy after voy always ll 456
+
+always oi 23456
+before con always om 2456
+endword om 2456
+before con always on 346
+endword on 346
+before con always or 56
+endword or 56
+always ou 1256
+before con always our 12346
+endword our 12346
+
+before voy always pl 1246
+before voy always pr 235
+before con always pro 235
+
+always qu 12345
+endword que 12345
+
+before con begword re 3
+
+before voy after voy always ss 2346
+
+before voy always tr 356
+before con begword trans 356
+before voy after voy always tt 2456
+
+before con always ui 23
+
+endword ablement 45-134
+endword bilité 12-123-2345
+endword bilités 12-123-2345-234
+endword ellement 456-134
+endword logie 123-1245
+endword quement 12345-134
+endword quements 12345-134-234
+endword tement 2345-134
+endword tements 2345-134-234
+endword ttement 2345-2345-134
+endword ttements 2345-2345-134-234
+endword vement 1236-134
+endword vements 1236-134-234
+
+before con always ain 1-35
+endword ain 1-35
+before con always oin 135-35
+endword oin 135-35
+
+before con begword recom 3-36
+before con begword redis 3-256
+before con begword retrans 3-356
+before con begword incom 35-36
+before con begword indis 35-256
+before con begword intrans 35-356
+begword ines 35-156
+
+prfword tient 2345-256-2345
+prfword vient 1236-256-2345
+endword ient 24-126
+word balbutient 12-1-123-12-136-2345-24-126
+word initient 35-24-2345-24-126
+word dévient 145-123456-1236-24-126
+word envient 1235-26-1236-24-126
+
+sufword bleu 45-15-136
+before con always brui 12-1235-23
+endword clait 14-123-146
+before voy always concr 14-346-25
+endword drant 145-1235-1456
+always drô 145-1235-1456
+endword en? 15-1345-26
+always ien. 24-26-256
+before voy always propr 235-135-235
+before con begword ren 1235-26
+always ssè 234-234-2346
+word (en 236-15-1345
+word (la 236-123-1
+
+###
+### 2. Mots représentés par un seul symbole
+###
+
+word a 1
+word à 12356
+word ai 34
+word au 13
+word aux 13-1346
+word bien 12
+word biens 12-234
+word ce 14
+word celui 36
+word cet 146
+word dans 1456
+word de 145
+word dès 256
+word du 236
+word elle 1356
+word elles 1356-234
+word en 26
+word est 156
+word et 23456
+word été 2356
+word étés 2356-234
+word faire 124
+word grand 12456
+word grands 12456-234
+word il 24
+word ils 24-234
+word je 245
+word la 3
+word le 123
+word les 345
+word lui 3456
+word mais 1346
+word me 134
+word même 126
+word mêmes 126-234
+word ne 1345
+word nous 135
+word on 346
+word ou 1256
+word par 1234
+word plus 1246
+word pour 12346
+word puis 235
+word que 12345
+word qui 1245
+word quoi 123456
+word rien 1235
+word riens 1235-234
+word sans 2346
+word se 234
+word si 35
+word son 246
+word sons 246-234
+word sous 356
+word sur 125
+word te 2345
+word tous 2456
+word tout 16
+word un 136
+word uns 136-234
+word vous 1236
+word y 13456
+
+begword c' 14-3
+begword d' 145-3
+begword j' 245-3
+begword l' 123-3
+begword m' 134-3
+begword n' 1345-3
+begword s' 234-3
+begword t' 2345-3
+
+###
+### 3. Mots représentés par deux ou plusieurs symboles
+###
+
+word absolu		1-12
+word absolus		1-12-234
+word absolue		1-12-15
+word absolues		1-12-156
+word absolument		1-12-134
+word action		1-3456
+word actions		1-3456-234
+word actionnaire	1-3456-1235
+word actionnaires	1-3456-1235-234
+word affaire		1-124-124
+word affaires		1-124-124-234
+word afin		1-124
+word ailleurs		34-136
+word ainsi		1-24
+word alors		1-123
+word amour		1-134
+word amours		1-134-234
+word amoureuse		1-134-234-15
+word amoureuses		1-134-234-156
+word amoureusement	1-134-234-134
+word amoureux		1-134-1346
+word apparemment	1-1234-134
+word apparence		1-1234-14
+word apparences		1-1234-14-234
+word apparent		1-1234
+word apparents		1-1234-234
+word apparente		1-1234-15
+word apparentes		1-1234-156
+word après		1-235
+word assez		1-1356
+word atentif		1-2345-124
+word atentifs		1-2345-124-234
+word attention		1-2345
+word attentions		1-2345-234
+word attentive		1-2345-1236
+word attentives		1-2345-1236-234
+word attentivement	1-2345-1236-134
+word aucun		13-14
+word aucune		13-1345
+word aucunement		13-1345-134
+word auparavant		13-1234
+word auprès		13-235
+word auquel		13-12345-123
+word aussi		13-234
+word aussitôt		13-2345
+word autour		13-1235
+word autre		13-356
+word autres		13-356-234
+word autrefois		13-124
+word autrement		13-356-134
+word auxquelles		13-1346-12345-123-123-234
+word auxquels		13-1346-12345-123-234
+word avance		1-1236-14
+word avances		1-1236-14-234
+word avancement		1-1236-14-134
+word avant		1-1236
+word avantage		1-1236-1245
+word avantages		1-1236-1245-234
+word avantageuse	1-1236-1245-234-15
+word avantageuses	1-1236-1245-234-156
+word avantageusement	1-1236-1245-234-134
+word avantageux		1-1236-1245-1346
+word avec		1-14
+word avoir		1-1235
+word avoirs		1-1235-234
+word ayant		1-13456
+
+word beaucoup		12-14
+word besogne		12-2356
+word besognes		12-2356-234
+word besogneuse		12-2356-234-15
+word besogneuses		12-2356-234-156
+word besogneux		12-2356-1346
+word besoin		12-35
+word besoins		12-35-234
+word bête		12-126
+word bêtes		12-126-234
+word bêtement		12-126-134
+word bienfaisance	12-124-14
+word bienfaisances	12-124-14-234
+word bienfait		12-124
+word bienfaits		12-124-234
+word bienfaiteur	12-124-46
+word bienfaiteurs	12-124-46-234
+word bientôt		12-2345
+word bienveillance	12-1236-14
+word bienveillances	12-1236-14-234
+word bienveillant	12-1236
+word bienveillants	12-1236-234
+word bienveillante	12-1236-15
+word bienveillantes	12-1236-156
+word bizarre		12-1356
+word bizarres		12-1356-234
+word bizarrement	12-1356-134
+word bonheur		12-125
+word bonheurs		12-125-234
+word bonjour		12-245
+word bonjours		12-245-234
+word bonne		12-1345
+word bonnes		12-1345-234
+word bonnement		12-1345-134
+word bonté		12-135
+word bontés		12-135-234
+word boulevard		12-145
+word boulevards		12-145-234
+word braille		23-123
+word branchage		23-12356-1245
+word branchages		23-12356-1245-234
+word branche		23-12356
+word branches		23-12356-234
+word branchement	23-12356-134
+word branchements	23-12356-134-234
+word brave		23-1236
+word braves		23-1236-234
+word bravement		23-1236-134
+word bruit		23-2345
+word bruits		23-2345-234
+word brusque		23-12345
+word brusques		23-12345-234
+word brusquement	23-12345-134
+word budget		12-1245
+word budgets		12-1245-234
+word budgétaire		12-1245-1235
+word budgétaires	12-1245-1235-234
+
+word caractère		14-2346
+word caractères		14-2346-234
+word caractéristique	14-123456-12345
+word caractéristiques	14-123456-12345-234
+word ceci		14-14
+word cela		14-1
+word celle		14-123
+word celles		14-123-234
+word celui-ci		36-36-14-24
+word celui-là		36-36-123-12356
+word cependant		14-1234
+word certain		14-35
+word certains		14-35-234
+word certaine		14-1345
+word certaines		14-1345-234
+word certainement	14-1345-134
+word certes		14-236
+word certitude		14-236-145
+word certitudes		14-236-145-234
+word ces		14-234
+word cette		14-2345
+word ceux		14-1346
+word chacun		12356-14
+word chacune		12356-1345
+word chagrin		12356-12456
+word chagrins		12356-12456-234
+word chaleur		12356-123
+word chaleurs		12356-123-234
+word chaleureuse	12356-123-234-15
+word chaleureuses	12356-123-234-156
+word chaleureusement	12356-123-234-134
+word chaleureux		12356-123-1346
+word champ		12356-1234
+word champs		12356-1234-234
+word change		12356-1245
+word changes		12356-1245-234
+word changement		12356-1245-134
+word changeur		12356-1245-46
+word changeurs		12356-1245-46-234
+word chaque		12356-12345
+word charitable		12356-2345-45
+word charitables		12356-2345-45-234
+word charitablement	12356-2345-45-134
+word charité		12356-2345
+word charités		12356-2345-234
+word chaud		12356-145
+word chauds		12356-145-234
+word chaude		12356-145-15
+word chaudes		12356-145-156
+word chaudement		12356-145-134
+word chemin		12356-134
+word chemins		12356-134-234
+word chère		12356-2346
+word chères		12356-2346-234
+word chèrement		12356-2346-134
+word chez		12356-1356
+word chiffrage		12356-124-1245
+word chiffrages		12356-124-1245-234
+word chiffre		12356-124
+word chiffres		12356-124-234
+word choeur		12356-1235
+word choeurs		12356-1235-234
+word choix		12356-1346
+word chose		12356-234
+word choses		12356-234-234
+word circonstance	14-25-14
+word circonstances	14-25-14-234
+word circonstanciel	14-25-14-123
+word circonstanciels	14-25-14-123-234
+word circonstancielle	14-25-14-123-123
+word circonstancielles	14-25-14-123-123-234
+word civil		14-1236
+word civils		14-1236-234
+word civile		14-1236-15
+word civiles		14-1236-156
+word civilement		14-1236-134
+word civilisation	14-1236-16
+word civilisations	14-1236-16-234
+word civilité		14-1236-2345
+word civilités		14-1236-2345-234
+word coeur		14-1235
+word coeurs		14-1235-234
+word combien		14-12
+word comme		14-134
+word commencement	36-134
+word commencements	36-134-234
+word comment		14-26
+word commentaire	14-26-1235
+word commentaires	14-26-1235-234
+word commentateur	14-26-46
+word commentateurs	14-26-46-234
+word commun		36-1345
+word communs		36-1345-234
+word commune		36-1345-15
+word communes		36-1345-156
+word communal		36-1345-123
+word communale		36-1345-123-15
+word communales		36-1345-123-156
+word communautaire	36-1345-2345-1235
+word communautaires	36-1345-2345-1235-234
+word communauté		36-1345-2345
+word communautés		36-1345-2345-234
+word communaux		36-1345-1346
+word communément	36-1345-134
+word communion		36-1345-3456
+word communions		36-1345-3456-234
+word complément		36-1246-134
+word compléments	36-1246-134-234
+word complémentaire	36-1246-134-1235
+word complémentaires	36-1246-134-1235-234
+word complet		36-1246
+word complets		36-1246-234
+word complète		36-2345
+word complètes		36-2345-234
+word complètement	36-2345-134
+word conclusion		25-14
+word conclusions	25-14-234
+word condition		25-145
+word conditions		25-145-234
+word conditionnel	25-145-123
+word conditionnels	25-145-123-234
+word conditionnelle	25-145-123-123
+word conditionnelles	25-145-123-123-234
+word conditionnellement	25-145-123-134
+word confiance		25-124-14
+word confiant		25-124
+word congrès		25-12456
+word connaissance	25-1345-14
+word connaissances	25-1345-14-234
+word connaître		25-1345
+word consciemment	25-234-134
+word conscience		25-234-14
+word consciences	25-234-14-234
+word consciencieuse	25-234-14-234-15
+word consciencieuses	25-234-14-234-156
+word consciencieusement	25-234-14-234-134
+word consciencieux	25-234-14-1346
+word conscient		25-234
+word conscients		25-234-234
+word consciente		25-234-15
+word conscientes	25-234-156
+word conséquemment	14-12345-134
+word conséquence	14-12345-14
+word conséquences	14-12345-14-234
+word conséquent		14-12345
+word conséquents	14-12345-234
+word conséquente	14-12345-15
+word conséquentes	14-12345-156
+word considérable	14-145
+word considérables	14-145-234
+word considérablement	14-145-134
+word considération	14-145-16
+word considérations	14-145-16-234
+word contraire		14-356
+word contraires		14-356-234
+word contrairement	14-356-134
+word conversation	25-1236
+word conversations	25-1236-234
+word côté		14-1456
+word côtés		14-1456-234
+word couple		14-1246
+word couples		14-1246-234
+word courage		14-1245
+word courageuse		14-1245-234-15
+word courageuses		14-1245-234-156
+word courageusement	14-1245-234-134
+word courageux		14-1245-1346
+
+word danger		145-1245
+word dangers		145-1245-234
+word dangeureuse	145-1245-234-15
+word dangeureuses	145-1245-234-156
+word dangeureusement	145-1245-234-134
+word dangeureux		145-1245-1346
+word davantage		145-1
+word debout		145-12
+word dedans		145-145
+word degré		145-12456
+word degrés		145-12456-234
+word dehors		145-125
+word déjà		145-245
+word demain		145-134
+word depuis		145-1234
+word dernier		145-1345
+word derniers		145-1345-234
+word dernière		145-1235
+word dernières		145-1235-234
+word dernièrement	145-1235-134
+word derrière		145-236
+word derrières		145-236-234
+word des		145-234
+word désormais		145-34
+word desquels		145-234-12345-123-234
+word desquelles		145-234-12345-123-123-234
+word destin		145-35
+word destins		145-35-234
+word destinataire	145-35-1235
+word destinataires	145-35-1235-234
+word destination	145-35-16
+word destinations	145-35-16-234
+word devant		145-1236
+word devants		145-1236-234
+word différemment	145-345-134
+word différence		145-26-14
+word différences	145-26-14-234
+word différent		145-26
+word différents		145-26-234
+word différente		145-26-15
+word différentes	145-26-156
+word difficile		145-124
+word difficiles		145-124-234
+word difficilement	145-124-134
+word difficulté		145-124-2345
+word difficultés	145-124-2345-234
+word digne		145-2356
+word dignes		145-2356-234
+word dignement		145-2356-134
+word dignitaire		145-2356-2345-1235
+word dignitaires	145-2356-2345-1235-234
+word dignité		145-2356-2345
+word discours		256-14
+word dispositif		256-1234-124
+word dispositifs	256-1234-124-234
+word disposition	256-1234
+word dispositions	256-1234-234
+word distance		256-2345-14
+word distances		256-2345-14-234
+word distant		256-2345
+word distants		256-2345-234
+word distante		256-2345-15
+word distantes		256-2345-156
+word donc		145-14
+word dont		145-2345
+word douleur		145-123
+word douleurs		145-123-234
+word douloureuse	145-123-234-15
+word douloureuses	145-123-234-156
+word douloureusement	145-123-234-134
+word douloureux		145-123-1346
+word doute		145-1256
+word doutes		145-1256-234
+word duquel		145-12345-123
+
+word effectif		15-124-124
+word effectifs		15-124-124-234
+word effective		15-124-1236
+word effectives		15-124-1236-234
+word effectivement	15-124-1236-134
+word effet		15-124
+word effets		15-124-234
+word égal		123456-1245
+word égale		123456-1245-15
+word égales		123456-1245-156
+word également		123456-1245-134
+word égalitaire		123456-1245-2345-1235
+word égalitaires	123456-1245-2345-1235-234
+word égalité		123456-1245-2345
+word égalités		123456-1245-2345-234
+word égaux		123456-1245-1346
+word élément		123456-123
+word éléments		123456-123-234
+word élémentaire	123456-123-1235
+word élémentaires	123456-123-1235-234
+word encore		26-14
+word endroit		26-145
+word endroits		26-145-234
+word énergie		123456-1345
+word énergies		123456-1345-234
+word énergique		123456-1345-12345
+word énergiques		123456-1345-12345-234
+word énergiquement	123456-1345-12345-134
+word enfin		26-124
+word ennui		26-1345
+word ennuis		26-1345-234
+word ennuyeuse		26-1345-234-15
+word ennuyeuses		26-1345-234-156
+word ennuyeux		26-1345-1346
+word enquête		26-12345
+word enquêtes		26-12345-234
+word enquêteur		26-12345-46
+word enquêteurs		26-12345-46-234
+word enquêteuse		26-12345-234-15
+word enquêteuses	26-12345-234-156
+word ensemble		26-345
+word ensembles		26-345-234
+word ensuite		26-234
+word entier		26-2345
+word entiers		26-2345-234
+word entière		26-1235
+word entières		26-1235-234
+word entièrement	26-1235-134
+word environ		26-1236
+word espèce		156-1234
+word espèces		156-1234-234
+word espérance		156-1235-14
+word espérances		156-1235-14-234
+word espoir		156-1235
+word espoirs		156-1235-234
+word esprit		15-235
+word esprits		15-235-234
+word essentiel		156-123
+word essentiels		156-123-234
+word essentielle	156-123-123
+word essentielles	156-123-123-234
+word essentiellement	156-123-134
+word étant		123456-2345
+word être		126-356
+word êtres		126-356-234
+word événement		123456-1236
+word événements		123456-1236-234
+word éventualité	123456-1236-123-2345
+word éventualités	123456-1236-123-2345-234
+word éventuel		123456-1236-123
+word éventuels		123456-1236-123-234
+word éventuelle		123456-1236-123-123
+word éventuelles	123456-1236-123-123-234
+word éventuellement	123456-1236-123-134
+word excellemment	1346-123-134
+word excellence		1346-123-14
+word excellences	1346-123-14-234
+word excellent		1346-123
+word excellents		1346-123-234
+word excellente		1346-123-15
+word excellentes	1346-123-156
+word excès		1346-14
+word excessif		1346-14-124
+word excessifs		1346-14-124-234
+word excessive		1346-14-1236
+word excessives		1346-14-1236-234
+word excessivement	1346-14-1236-134
+word exercice		1346-236
+word exercices		1346-236-234
+word expérience		1346-1234
+word expériences	1346-1234-234
+word expérimental	1346-1234-123
+word expérimentale	1346-1234-123-15
+word expérimentales	1346-1234-123-156
+word expérimentallement	1346-1234-123-134
+word expérimentateur	1346-1234-46
+word expérimentateurs	1346-1234-46-234
+word expérimentation	1346-1234-16
+word expérimentations	1346-1234-16-234
+word expérimentaux	1346-1234-1346
+word explicable		1346-1246-45
+word explicables	1346-1246-45-234
+word explicatif		1346-1246-124
+word explicatifs	1346-1246-124-234
+word explication	1346-1246
+word explications	1346-1246-234
+word explicative	1346-1246-1236
+word explicatives	1346-1246-1236-234
+word expressif		1346-235-124
+word expressifs		1346-235-124-234
+word expression		1346-235
+word expressions	1346-235-234
+word expressive		1346-235-1236
+word expressives	1346-235-1236-234
+word expressivement	1346-235-1236-134
+word extérieur		1346-2345
+word extérieurs		1346-2345-234
+word extérieure		1346-2345-15
+word extérieures	1346-2345-156
+word extérieurement	1346-2345-134
+word extrême		1346-356
+word extrêmes		1346-356-234
+word extrêmement	1346-356-134
+word extrémité		1346-356-2345
+word extrémités		1346-356-2345-234
+
+word facile		124-14
+word faciles		124-14-234
+word facilement		124-14-134
+word facilité		124-14-2345
+word facilités		124-14-2345-234
+word faubourg		124-12
+word faubourgs		124-12-234
+word faut		124-2345
+word faute		124-2345-15
+word fautes		124-2345-15-234
+word fautif		124-2345-124
+word fautifs		124-2345-124-234
+word fautive		124-2345-1236
+word fautives		124-2345-1236-234
+word faveur		124-1236
+word faveurs		124-1236-234
+word favorable		124-1236-45
+word favorables		124-1236-45-234
+word favorablement	124-1236-45-134
+word féminin		124-134-35
+word féminins		124-134-35-234
+word féminine		124-134-1345
+word féminines		124-134-1345-234
+word femme		124-134
+word femmes		124-134-234
+word fête		124-126
+word fêtes		124-126-234
+word fidèle		124-145
+word fidèles		124-145-234
+word fidèlement		124-145-134
+word fidélité		124-145-2345
+word fidélités		124-145-2345-234
+word figuratif		124-1245-124
+word figuratifs		124-1245-124-234
+word figuration		124-1245-16
+word figurations	124-1245-16-234
+word figurative		124-1245-1236
+word figuratives	124-1245-1236-234
+word figure		124-1245
+word figures		124-1245-234
+word fille		124-123
+word filles		124-123-234
+word fils		124-234
+word fonction		124-346
+word fonctions		124-346-234
+word fonctionnaire	124-346-1235
+word fonctionnaires	124-346-1235-234
+word fonctionnel	124-346-123
+word fonctionnels	124-346-123-234
+word fonctionnelle	124-346-123-123
+word fonctionnelles	124-346-123-123-234
+word fonctionnement	124-346-134
+word fonctionnements	124-346-134-234
+word force		124-135
+word forces		124-135-234
+word forcément		124-135-134
+word fortune		124-1345
+word fortunes		124-1345-234
+word fraternel		124-1235-123
+word fraternels		124-1235-123-234
+word fraternelle	124-1235-123-123
+word fraternelles	124-1235-123-123-234
+word fraternellement	124-1235-123-134
+word fraternisation	124-1235-16
+word fraternisations	124-1235-16-234
+word fraternité		124-1235-2345
+word fraternités	124-1235-2345-234
+word fréquemment	124-12345-134
+word fréquence		124-12345-14
+word fréquences		124-12345-14-234
+word fréquent		124-12345
+word fréquents		124-12345-234
+word fréquente		124-12345-15
+word fréquentes		124-12345-156
+word fréquentation	124-12345-16
+word fréquentations	124-12345-16-234
+word frère		124-1235
+word frères		124-1235-234
+
+word garde		1245-145
+word gardes		1245-145-234
+word général		1245-1345
+word générale		1245-1345-15
+word générales		1245-1345-156
+word généralement	1245-1345-134
+word généralisation	1245-1345-16
+word généralisations	1245-1345-16-234
+word généralité		1245-1345-2345
+word généralités	1245-1345-2345-234
+word généraux		1245-1345-1346
+word généreuse		1245-234-15
+word généreuses		1245-234-156
+word généreusement	1245-234-134
+word généreux		1245-1346
+word générosité		1245-234-2345
+word générosités	1245-234-2345-234
+word gloire		1245-1235
+word gloires		1245-1235-234
+word glorieuse		1245-1235-234-15
+word glorieuses		1245-1235-234-156
+word glorieusement	1245-1235-234-134
+word glorieux		1245-1235-1346
+word gouvernement	1245-1236
+word gouvernements	1245-1236-234
+word gouvernemental	1245-1236-123
+word gouvernementale	1245-1236-123-15
+word gouvernementales	1245-1236-123-156
+word gouvernementaux	1245-1236-1346
+word gouverneur		1245-1236-46
+word gouverneurs	1245-1236-46-234
+word grâce		12456-14
+word grâces		12456-14-234
+word gracieuse		12456-14-234-15
+word gracieuses		12456-14-234-156
+word gracieusement	12456-14-234-134
+word gracieux		12456-14-1346
+word grande		12456-145
+word grandes		12456-145-234
+word grandement		12456-145-134
+word grandeur		12456-46
+word grandeurs		12456-46-234
+word grave		12456-1236
+word graves		12456-1236-234
+word gravement		12456-1236-134
+word gravitation	12456-1236-2345-16
+word gravitations	12456-1236-2345-16-234
+word gravité		12456-1236-2345
+word gravités		12456-1236-2345-234
+word groupe		12456-1234
+word groupes		12456-1234-234
+word groupement		12456-1234-134
+word groupements	12456-1234-134-234
+word guère		1245-2346
+word guerre		1245-236
+word guerres		1245-236-234
+
+word habitude		125-12
+word habitudes		125-12-234
+word habituel		125-12-123
+word habituels		125-12-123-234
+word habituelle		125-12-123-123
+word habituelles	125-12-123-123-234
+word habituellement	125-12-123-134
+word hasard		125-145
+word hasards		125-145-234
+word hasardeuse		125-145-234-15
+word hasardeuses	125-145-234-156
+word hasardeux		125-145-1346
+word hélas		125-123
+word heure		125-1235
+word heures		125-1235-234
+word heureuse		125-234-15
+word heureuses		125-234-156
+word heureusement	125-234-134
+word heureux		125-1346
+word hier		125-236
+word histoire		125-2345
+word histoires		125-2345-234
+word historique		125-2345-12345
+word historiques	125-2345-12345-234
+word historiquement	125-2345-12345-134
+word hiver		125-1236
+word hivers		125-1236-234
+word hivernal		125-1236-123
+word hivernaux		125-1236-1346
+word hommage		125-1245
+word hommages		125-1245-234
+word homme		125-134
+word hommes		125-134-234
+word honnête		125-126
+word honnêtes		125-126-234
+word honnêtement	125-126-134
+word honnêteté		125-126-2345
+word honnêtetés		125-126-2345-234
+word honneur		125-1345
+word honneurs		125-1345-234
+word honorabilité	125-1345-12-123-2345
+word honorabilités	125-1345-12-123-2345-234
+word honorable		125-1345-45
+word honorables		125-1345-45-234
+word honorablement	125-1345-45-134
+word honoraire		125-1345-1235
+word honoraires		125-1345-1235-234
+word horaire		125-1235-1235
+word horaires		125-1235-1235-234
+word horizon		125-1356
+word horizons		125-1356-234
+word horizontal		125-1356-123
+word horizontale	125-1356-123-15
+word horizontales	125-1356-123-156
+word horizontalement	125-1356-123-134
+word horizontalité	125-1356-123-2345
+word horizontalités	125-1356-123-2345-234
+word horizontaux	125-1356-1346
+word hypothèse		125-1234
+word hypothèses		125-1234-234
+word hypothétique	125-1234-12345
+word hypothétiques	125-1234-12345-234
+word hypothétiquement	125-1234-12345-134
+word humain		125-134-35
+word humains		125-134-35-234
+word humaine		125-134-1345
+word humaines		125-134-1345-234
+word humainement	125-134-1345-134
+word humanitaire	125-134-1345-2345-1235
+word humanitaires	125-134-1345-2345-1235-234
+word humanité		125-134-1345-2345
+word humanités		125-134-1345-2345-234
+
+word idéal		24-145-123
+word idéale		24-145-123-15
+word idéales		24-145-123-156
+word idéalement		24-145-123-134
+word idéaux		24-145-1346
+word idée		24-145
+word idées		24-145-234
+word image		24-1245
+word images		24-1245-234
+word imaginable		24-1245-45
+word imaginables	24-1245-45-234
+word imaginaire		24-1245-1235
+word imaginaires	24-1245-1235-234
+word imagination	24-1245-16
+word immédiat		24-134
+word immédiats		24-134-234
+word immédiate		24-134-15
+word immédiates		24-134-156
+word immédiatement	24-134-134
+word impression		246-235
+word impressions	246-235-234
+word impressionnable	246-235-45
+word impressionnables	246-235-45-234
+word inférieur		35-124
+word inférieurs		35-124-234
+word inférieure		35-124-15
+word inférieures	35-124-156
+word inférieurement	35-124-134
+word infériorité	35-124-2345
+word infériorités	35-124-2345-234
+word inquiet		35-12345
+word inquiets		35-12345-234
+word inquiète		35-2346
+word inquiètes		35-2346-234
+word inquiétude		35-12345-145
+word inquiétudes	35-12345-145-234
+word intelligemment	35-1245-134
+word intelligence	35-1245-14
+word intelligent	35-1245
+word intelligents	35-1245-234
+word intelligente	35-1245-15
+word intelligentes	35-1245-156
+word intérieur		35-2345
+word intérieurs		35-2345-234
+word intérieure		35-2345-15
+word intérieures	35-2345-156
+word intérieurement	35-2345-134
+
+word jadis		245-145
+word jamais		245-134
+word jeune		245-1345
+word jeunes		245-1345-234
+word jour		245-1235
+word jours		245-1235-234
+word journal		245-1235-123
+word journaux		245-1235-1346
+word joyeuse		245-234-15
+word joyeuses		245-234-156
+word joyeusement	245-234-134
+word joyeux		245-1346
+word juge		245-1245
+word juges		245-1245-234
+word jugement		245-1245-134
+word jugements		245-1245-134-234
+word jusque		245-12345
+word juste		245-2345
+word justes		245-2345-234
+word justement		245-2345-134
+word justice		245-14
+
+word laquelle		123-123-123
+word lecture		123-1235
+word lectures		123-1235-234
+word lequel		123-123
+word lesquelles		123-123-123-234
+word lesquels		123-123-234
+word lettre		123-356
+word lettres		123-356-234
+word libéral		123-12-123
+word libérale		123-12-123-15
+word libérales		123-12-123-156
+word libéralement	123-12-123-134
+word libéralité		123-12-123-2345
+word libéralités	123-12-123-2345-234
+word libérateur		123-12-46
+word libérateurs	123-12-46-234
+word libération		123-12-16
+word libérations	123-12-16-234
+word libéraux		123-12-1346
+word liberté		123-12-2345
+word libertés		123-12-2345-234
+word libre		123-12
+word libres		123-12-234
+word librement		123-12-134
+word ligne		123-2356
+word lignes		123-2356-234
+word livre		123-1236
+word livres		123-1236-234
+word logique		123-1245-12345
+word logiques		123-1245-12345-234
+word logiquement	123-1245-12345-134
+word loin		123-1345
+word loins		123-1345-234
+word lointain		123-1345-35
+word lointains		123-1345-35-234
+word lointaine		123-1345-1345
+word lointaines		123-1345-1345-234
+word longtemps		123-2345
+word lorsque		123-12345
+word lourd		123-145
+word lourds		123-145-234
+word lourde		123-145-15
+word lourdes		123-145-156
+word lourdement		123-145-134
+word lourdeur		123-145-46
+word lourdeurs		123-145-46-234
+word lumière		123-134
+word lumières		123-134-234
+word lumineuse		123-134-234-15
+word lumineuses		123-134-234-156
+word lumineusement	123-134-234-134
+word lumineux		123-134-1346
+word luminosité		123-134-234-2345
+word luminosités	123-134-234-2345-234
+
+word madame		134-145
+word mademoiselle	134-134
+word magnificence	134-2356-14
+word magnificences	134-2356-14-234
+word magnifique		134-2356
+word magnifiques	134-2356-234
+word magnifiquement	134-2356-134
+word maintenant		134-2345
+word malgré		134-12456
+word malheur		134-125
+word malheurs		134-125-234
+word malheureuse	134-125-234-15
+word malheureuses	134-125-234-156
+word malheureusement	134-125-234-134
+word malheureux		134-125-1346
+word manière		134-1345
+word manières		134-1345-234
+word mauvais		134-1236
+word mauvaise		134-1236-15
+word mauvaises		134-1236-156
+word meilleur		134-123
+word meilleurs		134-123-234
+word meilleure		134-123-15
+word meilleures		134-123-156
+word merci		134-14
+word mère		134-2346
+word mères		134-2346-234
+word mes		134-234
+word mesdames		134-145-234
+word mesdemoiselles	134-134-234
+word messieurs		134-1235-234
+word mettre		134-356
+word mieux		134-1346
+word mission		134-3456
+word missions		134-3456-234
+word missionnaire	134-3456-1235
+word missionnaires	134-3456-1235-234
+word mobile		134-12
+word mobiles		134-12-234
+word mobilisation	134-12-16
+word mobilisations	134-12-16-234
+word mobilité		134-12-2345
+word mobilités		134-12-2345-234
+word moins		134-35
+word moment		134-26
+word moments		134-26-234
+word momentanément	134-26-134
+word monsieur		134-1235
+word multiple		134-1246
+word multiples		134-1246-234
+word multiplicateur	134-1246-46
+word multiplicateurs	134-1246-46-234
+word multiplication	134-1246-16
+word multiplications	134-1246-16-234
+word multiplicité	134-1246-2345
+word multiplicités	134-1246-2345-234
+word musique		134-12345
+word musiques		134-12345-234
+word mystère		134-13456
+word mystères		134-13456-234
+word mystérieuse	134-13456-234-15
+word mystérieuses	134-13456-234-156
+word mystérieusement	134-13456-234-134
+word mystérieux		134-13456-1346
+
+word naguère		1345-1245
+word nation		1345-16
+word nations		1345-16-234
+word national		1345-16-123
+word nationale		1345-16-123-15
+word nationales		1345-16-123-156
+word nationalité	1345-16-123-2345
+word nationalités	1345-16-123-2345-234
+word nationaux		1345-16-1346
+word nature		1345-2345
+word natures		1345-2345-234
+word naturel		1345-2345-123
+word naturels		1345-2345-123-234
+word naturelle		1345-2345-123-123
+word naturelles		1345-2345-123-123-234
+word naturellement	1345-2345-123-134
+word néanmoins		1345-134
+word nécessaire		1345-14
+word nécessaires	1345-14-234
+word nécessairement	1345-14-134
+word nécessité		1345-14-2345
+word nécessités		1345-14-2345-234
+word nécessiteuse	1345-14-2345-234-15
+word nécessiteuses	1345-14-2345-234-156
+word nécessiteux	1345-14-2345-1346
+word nombre		1345-12
+word nombres		1345-12-234
+word nombreuse		1345-12-234-15
+word nombreuses		1345-12-234-156
+word nombreux		1345-12-1346
+word nos		1345-234
+word notre		1345-356
+word nôtre		1345-1456
+word nôtres		1345-1456-234
+word nouveau		1345-1236
+word nouveaux		1345-1236-1346
+word nouveauté		1345-1236-2345
+word nouveautés		1345-1236-2345-234
+word nouvel		1345-123
+word nouvelle		1345-123-123
+word nouvelles		1345-123-123-234
+word nouvellement	1345-123-134
+
+word objectif		135-245-124
+word objectifs		135-245-124-234
+word objection		135-245-3456
+word objections		135-245-3456-234
+word objective		135-245-1236
+word objectives		135-245-1236-234
+word objectivement	135-245-1236-134
+word objectivité	135-245-1236-2345
+word objectivités	135-245-1236-2345-234
+word objet		135-245
+word objets		135-245-234
+word observateur	135-12-46
+word observateurs	135-12-46-234
+word observation	135-12
+word observations	135-12-234
+word occasion		135-14
+word occasions		135-14-234
+word occasionnel	135-14-123
+word occasionnels	135-14-123-234
+word occasionnelle	135-14-123-123
+word occasionnelles	135-14-123-123-234
+word occasionnellement	135-14-123-134
+word oeuvre		246-1236
+word oeuvres		246-1236-234
+word office		135-124
+word offices		135-124-234
+word officiel		135-124-123
+word officiels		135-124-123-234
+word officielle		135-124-123-123
+word officielles		135-124-123-123-234
+word officiellement	135-124-123-134
+word officieuse		135-124-234-15
+word officieuses	135-124-234-156
+word officieusement	135-124-234-134
+word officieux		135-124-1346
+word opinion		135-1234
+word opinions		135-1234-234
+word ordinaire		56-145
+word ordinaires		56-145-234
+word ordinairement	56-145-134
+word originaire		135-1245-1235
+word originaires	135-1245-1235-234
+word originairement	135-1245-1235-134
+word original		135-1245-123
+word originale		135-1245-123-15
+word originales		135-1245-123-156
+word originalement	135-1245-123-134
+word originalité	135-1245-123-2345
+word originalités	135-1245-123-2345-234
+word originaux		135-1245-1346
+word origine		135-1245
+word origines		135-1245-234
+word outrage		1256-356-1245
+word outrages		1256-356-1245-234
+word outrageuse		1256-356-1245-234-15
+word outrageuses	1256-356-1245-234-156
+word outrageusement	1256-356-1245-234-134
+word outrageux		1256-356-1245-1346
+word outre		1256-356
+word ouvrage		1256-1245
+word ouvrages		1256-1245-234
+word ouvrier		1256-1236
+word ouvriers		1256-1236-234
+word ouvrière		1256-2346
+word ouvrières		1256-2346-234
+
+word parfois		1234-124
+word parmi		1234-134
+word parole		1234-1235
+word paroles		1234-1235-234
+word particularité	1234-1235-123-2345
+word particularités	1234-1235-123-2345-234
+word particulier	1234-123
+word particuliers	1234-123-234
+word particulière	1234-123-1235
+word particulières	1234-123-1235-234
+word particulièrement	1234-123-1235-134
+word partout		1234-1
+word pas		1234-234
+word pauvre		1234-1236
+word pauvres		1234-1236-234
+word pauvrement		1234-1236-134
+word pauvreté		1234-1236-2345
+word pauvretés		1234-1236-2345-234
+word pendant		1234-145
+word pensée		1234-26
+word pensées		1234-26-234
+word pensif		1234-26-124
+word pensifs		1234-26-124-234
+word pensive		1234-26-1236
+word pensives		1234-26-1236-234
+word pensivement	1234-26-1236-134
+word père		1234-2346
+word pères		1234-2346-234
+word personnage		1234-1345-1245
+word personnages	1234-1345-1245-234
+word personnalité	1234-1345-123-2345
+word personnalités	1234-1345-123-2345-234
+word personne		1234-1345
+word personnes		1234-1345-234
+word personnel		1234-1345-123
+word personnels		1234-1345-123-234
+word personnelle	1234-1345-123-123
+word personnelles	1234-1345-123-123-234
+word personnellement	1234-1345-123-134
+word petit		1234-15
+word petits		1234-15-234
+word petite		1234-15-15
+word petites		1234-15-156
+word peuple		1234-1246
+word peuples		1234-1246-234
+word peuplement		1234-1246-134
+word peuplements	1234-1246-134-234
+word place		1246-14
+word places		1246-14-234
+word placement		1246-14-134
+word placements		1246-14-134-234
+word plaisir		1246-1235
+word plaisirs		1246-1235-234
+word plusieurs		1246-234
+word plutôt		1246-2345
+word point		1234-2345
+word points		1234-2345-234
+word pointe		1234-2345-15
+word pointes		1234-2345-15-234
+word populaire		1234-1234-1235
+word populaires		1234-1234-1235-234
+word populairement	1234-1234-1235-134
+word popularité		1234-1234-1235-2345
+word popularités	1234-1234-1235-2345-234
+word population		1234-1234
+word populations	1234-1234-234
+word populeuse		1234-1234-234-15
+word populeuses		1234-1234-234-156
+word populeux		1234-1234-1346
+word possibilité	1234-12-2345
+word possibilités	1234-12-2345-234
+word possible		1234-12
+word possibles		1234-12-234
+word pourquoi		1234-23456
+word pourtant		1234-135
+word praticable		235-2345-45
+word praticables	235-2345-45-234
+word pratique		235-2345
+word pratiques		235-2345-234
+word pratiquement	235-2345-134
+word premier		235-134
+word premiers		235-134-234
+word première		235-1235
+word premières		235-1235-234
+word premièrement	235-1235-134
+word près		235-234
+word presque		235-12345
+word preuve		235-1236
+word preuves		235-1236-234
+word primitif		235-134-124
+word primitifs		235-134-124-234
+word primitive		235-134-1236
+word primitives		235-134-1236-234
+word primitivement	235-134-1236-134
+word principal		235-14-123
+word principale		235-14-123-15
+word principales	235-14-123-156
+word principalement	235-14-123-134
+word principaux		235-14-1346
+word principe		235-14
+word principes		235-14-234
+word prix		235-1346
+word probabilité	235-12-2345
+word probabilités	235-12-2345-234
+word probable		235-12
+word probables		235-12-234
+word probablement	235-12-134
+word prochain		235-12356
+word prochains		235-12356-234
+word prochaine		235-1345
+word prochaines		235-1345-234
+word prochainement	235-1345-134
+word producteur		235-145-46
+word producteurs	235-145-46-234
+word productif		235-145-124
+word productifs		235-145-124-234
+word production		235-145-3456
+word productions	235-145-3456-234
+word productive		235-145-1236
+word productives	235-145-1236-234
+word productivement	235-145-1236-134
+word productivité	235-145-1236-2345
+word productivités	235-145-1236-2345-234
+word produit		235-145
+word produits		235-145-234
+word profit		235-124
+word profits		235-124-234
+word profitable		235-124-45
+word profitables	235-124-45-234
+word profiteur		235-124-46
+word profiteurs		235-124-46-234
+word profiteuse		235-124-234-15
+word profiteuses	235-124-234-156
+word progrès		235-12456
+word progressif		235-12456-124
+word progressifs	235-12456-124-234
+word progression	235-12456-3456
+word progressions	235-12456-3456-234
+word progressive	235-12456-1236
+word progressives	235-12456-1236-234
+word progressivement	235-12456-1236-134
+word projecteur		235-245-46
+word projecteurs	235-245-46-234
+word projection		235-245-3456
+word projections	235-245-3456-234
+word projet		235-245
+word projets		235-245-234
+word proportion		235-1234
+word proportions	235-1234-234
+word proportionnalité	235-1234-123-2345
+word proportionnalités	235-1234-123-2345-234
+word proportionnel	235-1234-123
+word proportionnels	235-1234-123-234
+word proportionnelle	235-1234-123-123
+word proportionnelles	235-1234-123-123-234
+word proportionnellement 235-1234-123-134
+word proposition	235-246
+word propositions	235-246-234
+word puisque		1234-12345
+word puissance		1234-14
+word puissances		1234-14-234
+
+word qualitatif		12345-123-2345-124
+word qualitatifs	12345-123-2345-124-234
+word qualitative	12345-123-2345-1236
+word qualitatives	12345-123-2345-1236-234
+word qualitativement	12345-123-2345-1236-134
+word qualité		12345-123-2345
+word qualités		12345-123-2345-234
+word quand		12345-145
+word quant		12345-2345
+word quantitatif	12345-2345-2345-124
+word quantitatifs	12345-2345-2345-124-234
+word quantitative	12345-2345-2345-1236
+word quantitatives	12345-2345-2345-1236-234
+word quantitativement	12345-2345-2345-1236-134
+word quantité		12345-2345-2345
+word quantités		12345-2345-2345-234
+word quel		12345-123
+word quels		12345-123-234
+word quelle		12345-123-123
+word quelles		12345-123-123-234
+word quelconque		12345-14
+word quelconques	12345-14-234
+word quelque		12345-12345
+word quelques		12345-12345-234
+word quelquefois	12345-124
+word question		12345-3456
+word questions		12345-3456-234
+word questionnaire	12345-3456-1235
+word questionnaires	12345-3456-1235-234
+word quiconque		12345-346
+word quoique		12345-15
+
+word raison		1235-346
+word raisons		1235-346-234
+word raisonnable	1235-346-45
+word raisonnables	1235-346-45-234
+word raisonnablement	1235-346-45-134
+word raisonnement	1235-346-134
+word raisonnements	1235-346-134-234
+word rapport		1235-1234
+word rapports		1235-1234-234
+word rapporteur		1235-1234-46
+word rapporteurs	1235-1234-46-234
+word rare		1235-1235
+word rares		1235-1235-234
+word rarement		1235-1235-134
+word rareté		1235-1235-2345
+word raretés		1235-1235-2345-234
+word réalisable		1235-123-45
+word réalisables	1235-123-45-234
+word réalisateur	1235-123-46
+word réalisateurs	1235-123-46-234
+word réalisation	1235-123-16
+word réalisations	1235-123-16-234
+word réalité		1235-123-2345
+word réalités		1235-123-2345-234
+word réel		1235-123
+word réels		1235-123-234
+word réelle		1235-123-123
+word réelles		1235-123-123-234
+word réellement		1235-123-134
+word réflexion		1235-124
+word réflexions		1235-124-234
+word regard		1235-1245
+word regards		1235-1245-234
+word regret		1235-12456
+word regrets		1235-12456-234
+word regrettable	1235-12456-45
+word regrettables	1235-12456-45-234
+word relatif		1235-2345-124
+word relatifs		1235-2345-124-234
+word relation		1235-2345
+word relations		1235-2345-234
+word relative		1235-2345-1236
+word relatives		1235-2345-1236-234
+word relativement	1235-2345-1236-134
+word relativité		1235-2345-1236-2345
+word relativités	1235-2345-1236-2345-234
+word remarquable	1235-12345-45
+word remarquables	1235-12345-45-234
+word remarquablement	1235-12345-45-134
+word remarque		1235-12345
+word remarques		1235-12345-234
+word remerciement	1235-134
+word remerciements	1235-134-234
+word renseignement	1235-26
+word renseignements	1235-26-234
+word rêve		1235-126
+word rêves		1235-126-234
+word rêveur		1235-126-46
+word rêveurs		1235-126-46-234
+word rêveuse		1235-126-234-15
+word rêveuses		1235-126-234-156
+word rêveusement	1235-126-234-134
+word rôle		1235-1456
+word rôles		1235-1456-234
+word route		1235-1256
+word routes		1235-1256-234
+word rythme		1235-13456
+word rythmes		1235-13456-234
+word rythmique		1235-13456-12345
+word rythmiques		1235-13456-12345-234
+word rythmiquement	1235-13456-12345-134
+
+word séculaire		234-14-1235
+word séculaires		234-14-1235-234
+word séculairement	234-14-1235-134
+word seigneur		234-2356
+word seigneurs		234-2356-234
+word semblable		234-12
+word semblables		234-12-234
+word semblablement	234-12-134
+word sentiment		234-2345-134
+word sentiments		234-2345-134-234
+word sentimental	234-2345-134-123
+word sentimentale	234-2345-134-123-15
+word sentimentales	234-2345-134-123-156
+word sentimentalement	234-2345-134-123-134
+word sentimentalité	234-2345-134-123-2345
+word sentimentalités	234-2345-134-123-2345-234
+word sentimentaux	234-2345-134-1346
+word ses		234-234
+word seul		234-123
+word seuls		234-123-234
+word seule		234-123-15
+word seules		234-123-156
+word seulement		234-123-134
+word siècle		234-14
+word siècles		234-14-234
+word simple		234-1246
+word simples		234-1246-234
+word simplement		234-1246-134
+word simplicité		234-1246-2345
+word simplicités	234-1246-2345-234
+word simplification	234-1246-16
+word simplifications	234-1246-16-234
+word soeur		234-1235
+word soeurs		234-1235-234
+word soin		234-35
+word soins		234-35-234
+word solitaire		234-123-1235
+word solitaires		234-123-1235-234
+word solitairement	234-123-1235-134
+word solitude		234-123-145
+word solitudes		234-123-145-234
+word sommaire		234-2456-1235
+word sommaires		234-2456-1235-234
+word sommairement	234-2456-1235-134
+word somme		234-2456
+word sommes		234-2456-234
+word sont		234-2345
+word sorte		234-135
+word sortes		234-135-234
+word soudain		234-145
+word soudains		234-145-234
+word soudaine		234-1345
+word soudaines		234-1345-234
+word soudainement	234-1345-134
+word soudaineté		234-1345-2345
+word soudainetés	234-1345-2345-234
+word souffrance		234-124-14
+word souffrances	234-124-14-234
+word souffrant		234-124
+word souffrants		234-124-234
+word souffrante		234-124-15
+word souffrantes	234-124-156
+word souvent		234-1236
+word subjectif		234-245-124
+word subjectifs		234-245-124-234
+word subjective		234-245-1236
+word subjectives	234-245-1236-234
+word subjectivement	234-245-1236-134
+word subjectivité	234-245-1236-2345
+word subjectivités	234-245-1236-2345-234
+word sujet		234-245
+word sujets		234-245-234
+word sujétion		234-245-3456
+word sujétions		234-245-3456-234
+word supérieur		234-1234
+word supérieurs		234-1234-234
+word supérieure		234-1234-15
+word supérieures	234-1234-156
+word supérieurement	234-1234-134
+word supériorité	234-1234-2345
+word supériorités	234-1234-2345-234
+word surtout		234-2345
+word systématique	234-13456-12345
+word systématiques	234-13456-12345-234
+word systématiquement	234-13456-12345-134
+word système		234-13456
+word systèmes		234-13456-234
+
+word tel		2345-123
+word tels		2345-123-234
+word telle		2345-123-123
+word telles		2345-123-123-234
+word tellement		2345-123-134
+word temporaire		2345-1234-1235
+word temporaires	2345-1234-1235-234
+word temporairement	2345-1234-1235-134
+word temporel		2345-1234-123
+word temporels		2345-1234-123-234
+word temporelle		2345-1234-123-123
+word temporelles	2345-1234-123-123-234
+word temps		2345-1234
+word tenir		2345-1345
+word terre		2345-1235
+word terres		2345-1235-234
+word tes		2345-234
+word tête		2345-126
+word têtes		2345-126-234
+word théorie		2345-125
+word théories		2345-125-234
+word théorique		2345-125-12345
+word théoriques		2345-125-12345-234
+word théoriquement	2345-125-12345-134
+word titre		2345-356
+word titres		2345-356-234
+word toujours		2345-245
+word toute		2345-2345
+word toutes		2345-2345-234
+word toutefois		2345-124
+word tragique		356-1245
+word tragiques		356-1245-234
+word tragiquement	356-1245-134
+word trajet		356-245
+word trajets		356-245-234
+word tranquille		356-12345
+word tranquilles	356-12345-234
+word tranquillement	356-12345-134
+word tranquillité	356-12345-2345
+word tranquillités	356-12345-2345-234
+word travail		356-123
+word travailleur	356-123-46
+word travailleurs	356-123-46-234
+word travailleuse	356-123-234-15
+word travailleuses	356-123-234-156
+word travaux		356-1346
+word travers		356-1236
+word très		356-234
+word trop		356-1234
+word type		2345-13456
+word types		2345-13456-234
+word typique		2345-13456-12345
+word typiques		2345-13456-12345-234
+word typiquement	2345-13456-12345-134
+
+word une		136-1345
+word unes		136-1345-234
+word unique		136-12345
+word uniques		136-12345-234
+word uniquement		136-12345-134
+word unitaire		136-1345-2345-1235
+word unitaires		136-1345-2345-1235-234
+word unité		136-1345-2345
+word unités		136-1345-2345-234
+word univers		136-1236
+word universalité	136-1236-123-2345
+word universalités	136-1236-123-2345-234
+word universel		136-1236-123
+word universels		136-1236-123-234
+word universelle	136-1236-123-123
+word universelles	136-1236-123-123-234
+word universellement	136-1236-123-134
+word universitaire	136-1236-2345-1235
+word universitaires	136-1236-2345-1235-234
+word université		136-1236-2345
+word universités	136-1236-2345-234
+word usage		136-1245
+word usages		136-1245-234
+word utile		136-123
+word utiles		136-123-234
+word utilement		136-123-134
+word utilisable		136-123-45
+word utilisables	136-123-45-234
+word utilisateur	136-123-46
+word utilisateurs	136-123-46-234
+word utilisation	136-123-16
+word utilisations	136-123-16-234
+word utilitaire		136-123-2345-1235
+word utilitaires	136-123-2345-1235-234
+word utilité		136-123-2345
+word utilités		136-123-2345-234
+
+word valeur		1236-46
+word valeurs		1236-46-234
+word venir		1236-1345
+word véritable		1236-1235
+word véritables		1236-1235-234
+word véritablement	1236-1235-134
+word vérité		1236-123456
+word vérités		1236-123456-234
+word vieux		1236-1346
+word vif		1236-124
+word vifs		1236-124-234
+word vive		1236-1236
+word vives		1236-1236-234
+word vivement		1236-1236-134
+word voici		1236-14
+word voilà		1236-123
+word volontaire		1236-135-1235
+word volontaires	1236-135-1235-234
+word volontairement	1236-135-1235-134
+word volonté		1236-135
+word volontés		1236-135-234
+word volontiers		1236-346
+word vos		1236-234
+word votre		1236-356
+word vôtre		1236-1456
+word vôtres		1236-1456-234
+word voyage		1236-1245
+word voyages		1236-1245-234
+word voyageur		1236-1245-46
+word voyageurs		1236-1245-46-234
+word voyageuse		1236-1245-234-15
+word voyageuses		1236-1245-234-156
+word vraiment		1236-134
+
+###
+### 4. Locutions
+###
+
+word à\scause 12356-456-14
+word à\smesure 12356-456-134
+word à\speine 12356-456-1234
+word à\speu\sprès 12356-456-1234-456-235
+word à\sprésent 12356-456-235
+word à\stravers 12356-456-356
+word au\scontraire 13-456-14
+word au-dessous 13-36-1256
+word au-dessus 13-36-145
+word aujourd'hui 13-3-125
+word autant\sque 13-456-12345
+word autre\schose 13-456-12356
+word autre\spart 13-456-1234
+word c'est-à-dire 14-3-15-36-12356-36-145
+word d'abord 145-3-1
+word de\ssuite 145-456-234
+word en\smesure 26-456-134
+word en\sréalité 26-456-1235
+word et\scétera 15-456-14
+word la\splupart 123-456-1246
+word non\sseulement 1345-456-234
+word parce\sque 1234-456-12345
+word par\sconséquent 1234-456-14
+word par-dessous 1234-36-1256
+word par-dessus 1234-36-145
+word par\sexemple 1234-456-15
+word par\ssuite 1234-456-234
+word peu\sà\speu 1234-456-12356-456-1234
+word peut-être 1234-36-126
+word plus\stard 1246-456-2345
+word plus\stôt 1246-456-1456
+word pour\sainsi\sdire 1234-456-1-456-145
+word quelque\schose 12345-456-12356
+word quelque\spart 12345-456-1234
+word quelque\stemps 12345-456-2345
+word sans\scesse 234-456-14
+word sans\sdoute 234-456-145
+word tandis\sque 2345-456-12345
+word tour\sà\stour 2345-456-12356-456-2345
+word tout\sà\scoup 16-456-12356-456-14
+word tout\sà\sfait 16-456-12356-456-124
+word très\sbien 356-456-12
+word vis-à-vis 1236-36-12356-36-1236
+
+sufword jusqu' 245-12345-3
+sufword lorsqu' 123-12345-3
+sufword parce\squ' 1234-456-12345-3
+
diff --git a/liblouis/tables/IPA.utb b/liblouis/tables/IPA.utb
new file mode 100644
index 0000000..b5b171a
--- /dev/null
+++ b/liblouis/tables/IPA.utb
@@ -0,0 +1,272 @@
+# liblouis: International Phonetic Alphabet
+
+# Copyright (C) 2016 Ludovic Oger <oger.ludovic@gmail.com>
+
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+
+# This table contains braille codes for International Phonetic Alphabet (2005)
+
+
+# --------REFERENCES--------
+#   - IPA Braille: An Updated Tactile Representation of the International Phonetic Alphabet
+#     Print Edition
+#     Edited by Robert Englebretson, Ph.D.
+#     Produced by CNIB
+#     For the International Council on English Braille - 2008
+#     <http://www.iceb.org/icebipa.htm>
+#     (this reference document is reprinted in 'World Braille Usage - Third Edition - 2013 - Copyright (C) 1954, 1990 UNESCO')
+#
+#   - "IPA Chart, http://www.internationalphoneticassociation.org/content/ipa-chart,
+#      available under a Creative Commons Attribution-Sharealike 3.0 Unported License.
+#      Copyright (C) 2015 International Phonetic Association."
+
+
+#--------NOTES--------
+#
+# Some lines are commented:
+#   - Characters include in latinLetterDef6Dots.uti table (a, b, c...)
+#   - possible conflicts with some local braille codes:
+#       - French braille: β (beta), θ (theta), ç (c cedilla), χ (chi), | (vertical line), . (full stop (point))
+#       - ... (other braille code?)
+#   - Tricky character compositions, see end of 'Tones and Word Accents'
+#   - 'Phonetic and Phonemic Enclosures'
+#
+# Some IPA unicode characters are not present in the reference document so there is no braille equivalent.
+#   Example: \X02D4 for 'MODIFIER LETTER UP TACK',
+#            see <http://unicode.org/cldr/utility/list-unicodeset.jsp?a=\p{subhead=Miscellaneous%20phonetic%20modifiers}>
+
+
+# Last updated on March 17, 2017
+
+
+#-----------------------------------
+# Lines order follows the Englebretson's reference document.
+
+#--------PULMONIC CONSONANTS--------
+# UNICODE DOTS          # GLYPH - TYPOGRAPHIC DESC. - ARTICULATORY DESC.
+# sign \X0070 1234      # p - lowercase p - voiceless bilabial plosive
+# sign \X0062 12        # b - lowercase b - voiced bilabial plosive
+# sign \X0074 2345      # t - lowercase t - voiceless alveolar plosive
+# sign \X0064 145       # d - lowercase d - voiced alveolar plosive
+sign \X0288 256-2345    # ʈ - right-tail t - voiceless retroflex plosive
+sign \X0256 256-145     # ɖ - right-tail d - voiced retroflex plosive
+# sign \X0063 14        # c - lowercase c - voiceless palatal plosive
+sign \X025F 35-245      # ɟ - barred dotless j - voiced palatal plosive
+# sign \X006B 13        # k - lowercase k - voiceless velar plosive
+sign \X0261 1245        # ɡ - lowercase script g - voiced velar plosive
+# sign \X0067 1245      # g - lowercase g - voiced velar plosive (alternate glyph)
+# sign \X0071 12345     # q - lowercase q - voiceless uvular plosive
+sign \X0262 35-1245     # ɢ - small capital g - voiced uvular plosive
+sign \X0294 23          # ʔ - glottal stop - glottal plosive
+# sign \X006D 134       # m - lowercase m - voiced bilabial nasal
+sign \X0271 235-134     # ɱ - left-tail m (at right) - voiced labiodental nasal
+# sign \X006E 1345      # n - lowercase n - voiced alveolar nasal
+sign \X0273 256-1345    # ɳ - right-tail n - voiced retroflex nasal
+sign \X0272 123456      # ɲ - left-tail n (at left) - voiced palatal nasal
+sign \X014B 1246        # ŋ - eng - voiced velar nasal
+sign \X0274 35-1345     # ɴ - small capital n - voiced uvular nasal
+sign \X0299 35-12       # ʙ - small capital b - voiced bilabial trill
+# sign \X0072 1235      # r - lowercase r - voiced alveolar trill
+sign \X0280 35-1235     # ʀ - small capital r - voiced uvular trill
+sign \X2C71 235-1236    #  (UTF-16) - right-hook v - labiodental flap
+sign \XF25F 235-1236    #  (UTF-16) - right-hook v - labiodental flap
+sign \X027E 235-1235    # ɾ - fish-hook r - voiced alveolar tap
+sign \X027D 256-1235    # ɽ - right-tail r - voiced retroflex flap
+sign \X0278 46-124      # ɸ - 'phi' (latin small letter phi) - voiceless bilabial fricative (IPA Extensions here, greek phi is \X03D5)
+# sign \X03B2 46-12     # β - beta - voiced bilabial fricative
+# sign \X0066 124       # f - lowercase f - voiceless labiodental fricative
+# sign \X0076 1236      # v - lowercase v - voiced labiodental fricative
+# sign \X03B8 46-1456   # θ - theta - voiceless dental fricative
+sign \X00F0 12456       # ð - edh - voiced dental fricative
+# sign \X0073 234       # s - lowercase s - voiceless alveolar fricative
+# sign \X007A 1356      # z - lowercase z - voiced alveolar fricative
+sign \X0283 156         # ʃ - esh - voiceless postalveolar fricative
+sign \X0292 2346        # ʒ - ezh - voiced postalveolar fricative
+sign \X0282 256-234     # ʂ - right-tail s (at left) - voiceless retroflex fricative
+sign \X0290 256-1356    # ʐ - right-tail z - voiced retroflex fricative
+# sign \X00E7 235-14    # ç - c cedilla - voiceless palatal fricative
+sign \X029D 236-245     # ʝ - curly-tail j - voiced palatal fricative
+# sign \X0078 1346      # x - lowercase x - voiceless velar fricative
+sign \X0263 46-1245     # ɣ - 'gamma' (latin small letter gamma) - voiced velar fricative (IPA Extensions here, greek gamma is \X03B3)
+# sign \X03C7 46-12346  # χ - chi - voiceless uvular fricative
+sign \X0281 35-3456     # ʁ - inverted small capital r - voiced uvular fricative
+sign \X0127 235-125     # ħ - barred h - voiceless pharyngeal fricative
+sign \X0295 235-23      # ʕ - reversed glottal stop - voiced pharyngeal fricative or approximant
+# sign \X0068 125       # h - lowercase h - voiceless glottal fricative
+sign \X0266 236-125     # ɦ - hooktop h - voiced glottal fricative
+sign \X026C 236-123     # ɬ - belted l - voiceless alveolar lateral fricative
+sign \X026E 123-5-2346  # ɮ - l-ezh ligature - voiced alveolar lateral fricative
+sign \X028B 236-1236    # ʋ - script v - voiced labiodental approximant
+sign \X0279 3456        # ɹ - turned r - voiced alveolar approximant
+sign \X027B 256-3456    # ɻ - turned r, right tail - voiced retroflex approximant
+# sign \X006A 245       # j - lowercase j - voiced palatal approximant
+sign \X0270 236-134     # ɰ - turned m, right leg - voiced velar approximant
+# sign \X006C 123       # l - lowercase l - voiced alveolar lateral approximant
+sign \X026D 256-123     # ɭ - right-tail l - voiced retroflex lateral approximant
+sign \X028E 236-13456   # ʎ - turned y - voiced palatal lateral approximant
+sign \X029F 35-123      # ʟ - small capital l - voiced velar lateral approximant
+
+
+#--------NON-PULMONIC CONSONANTS--------
+# UNICODE DOTS          # GLYPH - TYPOGRAPHIC DESC. - ARTICULATORY DESC.
+sign \X0253 236-12      # ɓ - hooktop b - voiced bilabial implosive
+sign \X0257 236-145     # ɗ - hooktop d - voiced dental/alveolar implosive
+sign \X0284 236-35-245  # ʄ - hooktop barred dotless j - voiced palatal implosive
+sign \X0260 236-1245    # ɠ - hooktop g - voiced velar implosive
+sign \X029B 236-35-1245 # ʛ - hooktop small capital g - voiced uvular implosive
+sign \X0298 12346-1234  # ʘ - bull's eye - bilabial click
+sign \X01C0 12346-1456  # ǀ - pipe - dental click
+sign \X01C3 12346-2345  # ǃ - exclamation point - (post-)alveolar click
+sign \X01C2 12346-156   # ǂ - double-barred pipe - palatoalveolar click
+sign \X01C1 12346-123   # ǁ - double pipe - alveolar lateral click
+
+
+#--------OTHER PULMONIC CONSONANTS--------
+# UNICODE DOTS          # GLYPH - TYPOGRAPHIC DESC. - ARTICULATORY DESC.
+sign \X028D 235-2456    # ʍ - turned w - voiceless labial-velar fricative
+# sign \X0077 2456      # w - lowercase w - voiced labial-velar approximant
+sign \X0265 256-125     # ɥ - turned h - voiced labial-palatal approximant
+sign \X029C 35-125      # ʜ - small capital h - voiceless epiglottal fricative
+sign \X02A1 236-23      # ʡ - barred glottal stop - epiglottal plosive
+sign \X02A2 35-23       # ʢ - barred reversed glottal stop - voiced epiglottal fricative
+sign \X0267 236-1246    # ɧ - hooktop heng - simultaneous voiceless postalveolar and velar fricative
+sign \X027A 236-3456    # ɺ - turned long-leg r - voiced alveolar lateral flap
+sign \X0255 236-14      # ɕ - curly-tail c - voiceless alveolopalatal fricative
+sign \X0291 236-1356    # ʑ - curly-tail z - voiced alveolopalatal fricative
+sign \X026B 235-123     # ɫ - lowercase l with tilde - velarized voiced alveolar lateral approximant
+
+
+#--------VOWELS--------
+# UNICODE DOTS          # GLYPH - TYPOGRAPHIC DESC. - ARTICULATORY DESC.
+# sign \X0069 24        # i - lowercase i - close front unrounded vowel
+# sign \X0065 15        # e - lowercase e - close-mid front unrounded vowel
+sign \X025B 345         # ɛ - 'epsilon' (latin small letter open e) - open-mid front unrounded vowel (IPA Extensions here, greek epsilon is \X03B5)
+# sign \X0061 1         # a - lowercase a - open front unrounded vowel
+sign \X0251 16          # ɑ - script a - open back unrounded vowel
+sign \X0254 126         # ɔ - open o - open-mid back rounded vowel
+# sign \X006F 135       # o - lowercase o - close-mid back rounded vowel
+# sign \X0075 136       # u - lowercase u - close back rounded vowel
+# sign \X0079 13456     # y - lowercase y - close front rounded vowel
+sign \X00F8 1256        # ø - slashed o - close-mid front rounded vowel
+sign \X0153 246         # œ - lowercase o-e ligature - open-mid front rounded vowel
+sign \X0276 35-246      # ɶ - small capital o-e ligature - open front rounded vowel
+sign \X0252 235-16      # ɒ - turned script a - open back rounded vowel
+sign \X028C 346         # ʌ - turned v (caret) - open-mid back unrounded vowel
+sign \X0264 235-135     # ɤ - ram's horns - close-mid back unrounded vowel
+sign \X026F 235-136     # ɯ - turned m - close back unrounded vowel
+sign \X0268 356-24      # ɨ - barred i - close central unrounded vowel
+sign \X0289 356-136     # ʉ - barred u - close central rounded vowel
+sign \X026A 34          # ɪ - small capital i - near-close near-front unrounded vowel
+sign \X028F 35-13456    # ʏ - small capital y - near-close near-front rounded vowel
+sign \X028A 12356       # ʊ - 'upsilon' (latin small letter upsilon) - near-close near-back rounded vowel (IPA Extensions here, greek upsilon is \X03C5)
+sign \X0259 26          # ə - schwa - mid central vowel
+sign \X0275 356-135     # ɵ - barred o - close-mid central rounded vowel
+sign \X0250 235-1       # ɐ - turned a - near-open central vowel
+sign \X00E6 146         # æ - ash - near-open front unrounded vowel
+sign \X025C 235-345     # ɜ - reversed epsilon - open-mid central unrounded vowel
+sign \X025A 26-5-1235   # ɚ - right-hook schwa - r-colored mid central vowel
+sign \X025E 236-345     # ɞ - closed reversed epsilon - open-mid central rounded vowel
+sign \X0258 235-15      # ɘ - reversed e - close-mid central unrounded vowel
+
+
+#--------DIACRITICS--------
+# UNICODE DOTS          # GLYPH - TYPOGRAPHIC DESC. - ARTICULATORY DESC.
+sign \X02BC 5-3         # ʼ - apostrophe - ejective
+sign \X0325 6-1246      # ̥  - ring below - voiceless
+sign \X030A 4-1246      # ̊  - ring above - voiceless
+sign \X032C 6-236       # ̬  - wedge below - voiced
+sign \X02B0 4-125       # ʰ - superscript h - aspirated
+sign \X0324 6-25        # ̤  - umlaut below - breathy voiced
+sign \X0330 6-12456     # ̰  - tilde below - creaky voiced
+sign \X033C 6-12346     # ̼  - seagull below - linguolabial
+sign \X032A 6-1456      # ̪  - bridge below - dental
+sign \X033A 6-235-1456  # ̺  - inverted bridge below - apical
+sign \X033B 6-2356      # ̻  - square below - laminal
+sign \X0339 6-135       # ̹  - right half-ring below - more rounded
+sign \X031C 6-246       # ̜  - left half-ring below - less rounded
+sign \X031F 6-346       # ̟  - plus below - advanced
+sign \X0320 6-36        # ̠  - minus below - retracted
+sign \X0308 4-25        # ̈  - umlaut above - centralized
+sign \X033D 4-1346      # ̽  - over-cross above - mid-centralized
+sign \X0318 6-156       # ̘  - advancing sign below - advanced tongue root
+sign \X0319 6-234       # ̙  - retracting sign below - retracted tongue root
+sign \X02DE 5-1235      # ˞  - right hook - rhoticity
+sign \X02B7 4-2456      # ʷ - superscript w - labialized
+sign \X02B2 4-245       # ʲ - superscript j - palatalized
+sign \X02E0 4-46-1245   # ˠ - superscript gamma - velarized
+sign \X02E4 4-235-23    # ˤ - superscript reversed glottal stop - pharyngealized
+sign \X0303 4-12456     # ̃  - tilde above - nasalized
+sign \X207F 4-1345      # ⁿ - superscript n - nasal release
+sign \X02E1 4-123       # ˡ - superscript l - lateral release
+sign \X031A 4-145       # ̚  - corner above - no audible release
+sign \X0334 5-12456     # ̴  - superimposed tilde - velarized or pharyngealized
+sign \X031D 6-345       # ̝  - raising sign below - raised
+sign \X031E 6-126       # ̞  - lowering sign below - lowered
+sign \X0329 6-23        # ̩  - vertical line below - syllabic
+sign \X032F 6-23456     # ̯  - arch below - non-syllabic
+sign \X0361 5           # ͡  - top tie bar - affricate or double articulation
+
+
+#--------SUPRASEGMENTALS--------
+# UNICODE DOTS          # GLYPH - TYPOGRAPHIC DESC. - ARTICULATORY DESC.
+sign \X02C8 456-12      # ˈ - vertical stroke (superior) - (primary) stress
+sign \X02CC 456-23      # ˌ - vertical stroke (inferior) - secondary stress
+sign \X02D0 25          # ː - length mark - long
+sign \X02D1 5-2         # ˑ - half-length mark - half-long
+sign \X0306 4-12356     # ̆  - breve above - extra-short
+# sign \X002E 3         # . - full stop - syllable break
+# sign \X007C 456-1256  # | - vertical line - minor (foot) group
+sign \X2016 456-123456  # ‖ - double vertical line - major (intonation) group
+sign \X203F 456-123     # ‿ - bottom tie bar - linking (absence of a break)
+
+
+#--------TONES AND WORD ACCENTS--------
+# UNICODE DOTS          # GLYPH - TYPOGRAPHIC DESC. - ARTICULATORY DESC.
+sign \X030B 4-6-34      # ̋  - double acute accent above - extra high level tone
+sign \X0301 4-34        # ́  - acute accent above - high level tone
+sign \X0304 4-14        # ̄  - macron above - mid level tone
+sign \X0300 4-16        # ̀  - grave accent above - low level tone
+sign \X030F 4-6-16      # ̏  - double grave accent above - extra low level tone
+sign \X030C 4-236       # ̌  - wedge above - rising contour tone
+sign \X0302 4-146       # ̂  - circumflex above - falling contour tone
+sign \X1DC4 4-24        #  (UTF-16) - macron-acute above - high -rising contour tone
+sign \X1DC5 4-35        #  (UTF-16) - grave-macron above - low-rising contour tone
+sign \X1DC8 4-256       #  (UTF-16) - grave-acute- grave above - rising-falling contour tone
+sign \X2193 456-2346    # ↓ - down arrow - downstep
+sign \XF19D 456-2346    # ↓ - down arrow - downstep
+sign \X2191 456-1246    # ↑ - up arrow - upstep
+sign \XF19C 456-1246    # ↑ - up arrow - upstep
+sign \X2197 456-145     # ↗ - upward diagonal arrow - global rise
+sign \X2198 456-356     # ↘ - downward diagonal arrow - global fall
+sign \X02E5 456-4-14    # ˥ - extra-high (55) tone bar - extra high level tone
+sign \X02E6 456-14      # ˦ - high (44) tone bar - high level tone
+sign \X02E7 456-25      # ˧ - mid (33) tone bar - mid level tone
+sign \X02E8 456-36      # ˨ - low (22) tone bar - low level tone
+sign \X02E9 456-6-36    # ˩ - extra-low (11) tone bar - extra low level tone
+#   The following lines seems tricky (https://en.wikipedia.org/wiki/Tone_letter)
+#   sign \X02E9 + \X02E5 456-34 # ˩˥ - rising (15) tone bar - rising contour tone
+#   sign \X02E9 + \X02E7 456-35 # ˩˧ - low-rising (13) tone bar - low-rising contour tone
+#   sign \X02E7 + \X02E5 456-24 # ˧˥ - high-rising (35) tone bar - high-rising contour tone
+#   sign \X02E5 + \X02E9 456-16 # ˥˩ - falling (51) tone bar - falling contour tone
+#   sign \X02E8 + \X02E5 + \X02E8 456-256 # ˨˥˨ - rising-falling (151) tone bar - rising-falling contour tone
+
+
+#--------PHONETIC AND PHONEMIC ENCLOSURES--------
+# sign \X005B 45-12356  # [ - left square bracket - begin phonetic transcription
+# sign \X005D 45-23456  # ] - right square bracket - end phonetic transcription
+# sign \X002F 45-34     # / - slash - begin/end phonemic transcription
diff --git a/liblouis/tables/Lv-Lv-g1.utb b/liblouis/tables/Lv-Lv-g1.utb
new file mode 100644
index 0000000..2a11b6f
--- /dev/null
+++ b/liblouis/tables/Lv-Lv-g1.utb
@@ -0,0 +1,267 @@
+# liblouis: Latvian Grade 1 Braille Table
+#
+#  Copyright (C) 2004-2008 ViewPlus Technologies, Inc. www.viewplus.com
+#  Copyright (C) 2004-2006 JJB Software, Inc. www.jjb-software.com
+#  Copyright (C) 2012 Mesar Hameed <mesar.hameed@gmail.com>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+# Created & maintained by Leon Ungier <Leon.Ungier@ViewPlus.com>.
+
+include text_nabcc.dis
+
+# ----------- define all chars --------------------------------------
+
+space \t 0 tab						#  9
+space \x000A 0
+space \x000D 0
+space \s 0 blank					# 32
+punctuation ! 235				exclamation sign 						x0021
+punctuation " 356				double quote								x0022
+sign # 3456							number sign									x0023
+sign $ 4-256						dollar sign									x0024
+sign % 25-1234					percent sign								x0025
+sign & 4-12346					ampersand										z0026
+punctuation ' 3					apostrophe									x0027
+punctuation ( 2356			left parenthesis						x0028
+punctuation ) 2356			right parenthesis						x0029
+sign * 35-35						asterisk										x002A
+math + 56-235						plus												002B
+punctuation , 2					coma												002C
+punctuation - 36			hyphen-minus								002D
+punctuation . 256				point												002E
+math / 34								solidus											002F
+
+include digits6Dots.uti
+
+punctuation : 25				colon								x003A
+punctuation ; 23				semicolon						x003B
+punctuation < 126				less-than sign			x003C
+math = 123456						equal sign					x003D
+math > 345							greater-than sign		x003E
+punctuation ? 26				question mark				x003F
+sign @ 3456-12456				commercial at				x0040
+
+uplow \x0100\x0101 16			letter A with macron
+uplow \x010C\x010D 146		letter C with caron
+uplow \x0112\x0113 156		letter E with macron
+uplow \x0122\x0123 12456	letter g with cedilla
+uplow \x012A\x012B 246		letter I with macron
+uplow \x0136\x0137 136		letter K with cedilla
+uplow \x013B\x013C 1236		letter L with cedilla
+uplow \x0145\x0146 13456	Letter N with cedilla
+uplow \x014C\x014D 1356		letter O with macron
+uplow \x0156\x0157 16-12346	letter T with cedilla
+uplow \x0160\x0161 2346			letter S with caron
+uplow \x016A\x016B 346			letter U with macron
+uplow \x017D\x017E 3456			letter Z with caron
+
+# define the dot combinations that are different from the default.
+# placed before the include to take precedence.
+uplow Uu 34									letter U *** Different from other langs ***
+uplow Vv 2456								letter V *** Different from other langs ***
+uplow Zz 345								letter Z *** Different from other langs ***
+include latinLetterDef6Dots.uti
+
+punctuation [ 6-2356		left square bracket		x005B
+sign \\ 3456-1256				reverse solidus				x005C
+punctuation ] 356-3			right square bracket	x005D
+sign ^ 45								circumflex accent			x005E
+sign _ 6-36							low line							x005F
+sign ` 45-4							grave accent					x0060
+
+# a - z								# 97 - 122							x0061-x007A
+
+punctuation { 45-236		left curly bracket		x007B
+sign | 456							vertical line					x007C
+punctuation } 45-356		right curly bracket		x007D
+math ~ 5								tilde									x007E
+sign \x0080 15-136-1235-135										x0080
+
+space \X00A0 0		no-break space																x00A0
+sign ¢ 4-14				cent sign																			x00A2
+sign £ 45-123			pound sign																		x00A3
+sign ¤ 45-15			currency sign																	x00A4
+sign ¥ 45-13456		yen	sign																			x00A5
+sign § 346				section sign																	x00A7
+sign © 2356-6-14-2356		copyright																x00A9
+punctuation « 236		left-pointing double angle quotation 		x00AB
+punctuation \x00AD 36 soft hyphen
+sign ° 4-356			degree sign																		x00B0
+sign ² 4-6-126		superscript 2 sign														x00B2
+sign ³ 4-6-146		superscript 3 sign														x00B3
+sign µ 46-134			micro sign																		x00B5
+sign ¶ 4-1234-345 pilcrow sign (paragraph)											x00B6
+sign ¹ 1-27				superscript 1 sign														x00B9
+punctuation » 356		right-pointing double angle quotation		x00BB
+math ¼ 6-16-34-1456		vulgar fraction one quarter								x00BC
+math ½ 6-16-34-126		vulgar fraction one half									x00BD
+math ¾ 6-126-34-1456	vulgar fraction 3 quarters								x00BE
+
+
+
+uplow \x00C0\x00E0 12356	letter a with grave							x00C0 / 00E0
+uplow \x00C1\x00E1 16			letter a with acute									x00E1
+uplow \x00C2\x00E2 16					letter a with circumflex						x00E2
+uplow \x00C3\x00E3 126		letter a with tilde											x00E3
+uplow Ää 345				A with diaeresis											x00C4 / 00E4
+uplow Åå 16					A with ring above											x00C5 / 00E5
+uplow \x00C6\x00E6 6-345	ae															x00C6
+uplow Çç 12346							letter c with cedilla					x00C7 / 00E7
+uplow Èè 2346								e with grave									x00C8 / 00E8
+uplow \x00C9\x00E9 345			e with acute									x00E9
+uplow \x00CA\x00EA 126			e with circumflex							x00EA
+uplow \x00CB\x00EB 1246		e with diaeresis								x00EB
+uplow \x00CD\x00ED 34			i with acute										x00ED
+uplow \x00CE\x00EE 146		i with circumflex								x00EE
+uplow \x00CF\x00EF 12456	i with diaeresis								x00CF / 00EF
+
+uplow	\x00D3\x00F3	246		O with acute										x00D3 / 00F3
+uplow \x00D4\x00F4 1456		o with circumflex												x00F4
+uplow \x00D5\x00F5 246		o with tilde														x00F5
+uplow Öö 246							O with diaeresis								x00D6 / 00F6
+math × 236				multiplication sign											x00D7
+uplow \x00D8\x00F8 246		o with stroke										x00D8 / 00F8
+
+math ÷ 256				division sign										x00F7
+
+uplow \x00DA\x00FA 346				u with acute							x00DA / 00FA
+uplow \x00DB\x00FB 156				u with circumflex					x00FB
+uplow \x00DC\x00FC 1256				u with diaeresis					x00FC
+uplow \x00DD\x00FD 12346			y with acute							x00DD / 00FD
+
+noback sign \X25CF 35-35			black circle
+
+# the letter a with ogonek -----------------------------------
+uplow \x0104\x0105 16
+
+# the letter c with acute
+uplow \x0106\x0107 146
+
+uplow \x010C\x010D 146					C with caron
+uplow \x010E\x010F 1456					D with caron
+
+
+# the letter e with ogonek
+uplow \x0118\x0119 156
+
+uplow \x011A\x011B 126					E with caron
+
+# the letter l with stroke
+uplow \x0141\x0142 126
+
+# the letter n with acute
+uplow \x0143\x0144 1456
+uplow \x0147\x0148 1246					N with caron
+
+uplow \x0158\x0159 2456					R with caron
+
+# the letter s	with acute
+uplow \x015A\x015B 246
+
+uplow \x0164\x0165 1256						T with caron
+uplow \x016C\x016D 23456						U with breve
+uplow \x016E\x016F 23456					U with ring above
+
+
+# the letter z	with acute
+uplow \x0179\x017A 2346
+
+# the letter z with dot above
+uplow \x017B\x017C 12346
+
+
+punctuation	\x2010 36		 # 8208			hyphen
+punctuation	\x2011 36		 # 8209			non-breaking hyphen
+punctuation	\x2013 36		 # 8211			smart minus sign
+punctuation	\x2018 3		 # 8216			smart single left quotation mark
+punctuation	\x2019 3		 # 8217			smart single right quotation mark
+
+punctuation	\x201C 236	 # 8220			smart opening double quote
+punctuation	\x201D 356	 # 8221			smart closing double quote
+punctuation	\x201E 236	 # 8222			smart double low quotation mark
+punctuation	\x201F 356	 # 8223			smart double high reverse quotation mark
+punctuation  \x2026 3-3-3 # 8230		smart ellipsis
+
+# ------------------------------------------------------
+
+
+capsletter 46				# single capital letter indicator
+begcapsword 6-6			# a block of consecutive capital letters indicator
+
+
+numsign 3456		#	number sign, just one operand
+midnum , 6
+midnum . 256
+midnum + 235
+midnum - 36
+midnum / 256
+midnum : 25
+midnum = 2356
+
+# endnum # 56-3456
+
+prepunc " 236
+postpunc " 356
+
+prepunc ' 6-236
+postpunc ' 356-3
+postpunc '' 356
+postpunc ''' 356-3-356
+
+repeated *** 16-16-16
+
+prepunc `` 236
+prepunc ` 6-236
+
+
+repeated --- 36-36-36
+
+repeated ::: 25-25-25
+
+repeated ~~~ 156-156-156
+always \s-\s 36-36
+always \s-\scom 36-36-14-135-134
+always ... 3-3-3
+always .\s.\s. 3-3-3 . . .
+
+always \s­\s 36-36
+
+# special character sequences
+literal :// URLs
+literal www.
+
+literal .com
+literal .edu
+literal .gov
+literal .mil
+literal .net
+literal .org
+
+literal .doc
+literal .htm
+literal .html
+literal .tex
+literal .txt
+
+literal .gif
+literal .jpg
+literal .png
+literal .wav
+
+literal .tar
+literal .zip
diff --git a/liblouis/tables/Makefile.am b/liblouis/tables/Makefile.am
new file mode 100644
index 0000000..60540cc
--- /dev/null
+++ b/liblouis/tables/Makefile.am
@@ -0,0 +1,383 @@
+# generate the list of tables as follows:
+# $ ls | grep -v Makefile | grep -v README | grep -v maketablelist.sh | grep -v '.*~$' | sort -df | sed -e 's/$/ \\/' -e 's/^/	/' -e '$s/\\$//'
+table_files = \
+	afr-za-g1.ctb \
+	ar-ar-g1.utb \
+	ar-fa.utb \
+	ar.tbl \
+	as-in-g1.utb \
+	as.tbl \
+	awa.tbl \
+	aw-in-g1.utb \
+	be-in-g1.utb \
+	bengali.cti \
+	bg.ctb \
+	bg.tbl \
+	bh.ctb \
+	bh.tbl \
+	bn.tbl \
+	bo.ctb \
+	bo.tbl \
+	boxes.ctb \
+	braille-patterns.cti \
+	bra.tbl \
+	br-in-g1.utb \
+	ca-chardefs.cti \
+	ca-g1.ctb \
+	ca.tbl \
+	chardefs.cti \
+	chr-us-g1.ctb \
+	ckb-chardefs.cti \
+	ckb-g1.ctb \
+	ckb.tbl \
+	ckb-translation.cti \
+	compress.cti \
+	controlchars.cti \
+	corrections.cti \
+	countries.cti \
+	cs-chardefs.cti \
+	cs-g1.ctb \
+	cs.tbl \
+	cs-translation.cti \
+	cy-cy-g1.utb \
+	cy-cy-g2.ctb \
+	cy.tbl \
+	Cz-Cz-g1.utb \
+	da-dk-6miscChars.cti \
+	da-dk.dis \
+	da-dk-g08.ctb \
+	da-dk-g16.ctb \
+	da-dk-g16-lit.ctb \
+	da-dk-g18.ctb \
+	da-dk-g26.ctb \
+	da-dk-g26l.ctb \
+	da-dk-g26-lit.ctb \
+	da-dk-g26l-lit.ctb \
+	da-dk-g28.ctb \
+	da-dk-g28l.ctb \
+	da-dk-octobraille.dis \
+	da-lt.ctb \
+	da.tbl \
+	de-ch-accents.cti \
+	de-chardefs6.cti \
+	de-chardefs8.cti \
+	de-chess.ctb \
+	de-ch-g0.utb \
+	de-ch-g1.ctb \
+	de-ch-g2.ctb \
+	de_CH.tbl \
+	de-de-accents.cti \
+	de-de-comp8.ctb \
+	de-de.dis \
+	de-de-g0.utb \
+	de-de-g1.ctb \
+	de-de-g2.ctb \
+	de_DE.tbl \
+	de-eurobrl6.dis \
+	de-eurobrl6u.dis \
+	de-g0-core.uti \
+	de-g1-core.cti \
+	de-g2-core.cti \
+	de.tbl \
+	devanagari.cti \
+	digits6DotsPlusDot6.uti \
+	digits6Dots.uti \
+	digits8Dots.uti \
+	dra.ctb \
+	dra.tbl \
+	el.ctb \
+	el.tbl \
+	en_AS.tbl \
+	en_CA.ctb \
+	en_CA.tbl \
+	en-chess.ctb \
+	en-gb-comp8.ctb \
+	en-gb-g1.utb \
+	en-GB-g2.ctb \
+	en_GB.tbl \
+	en-in-g1.ctb \
+	en.tbl \
+	en-ueb-chardefs.uti \
+	en-ueb-g1.ctb \
+	en-ueb-g2.ctb \
+	en-ueb-math.ctb \
+	en-us-brf.dis \
+	en-us-comp6.ctb \
+	en-us-comp8.ctb \
+	en_US-comp8-ext.tbl \
+	en-us-comp8-ext.utb \
+	en-us-compbrl.ctb \
+	en-us-g1.ctb \
+	en-us-g2.ctb \
+	en-us-interline.ctb \
+	en-us-mathtext.ctb \
+	en_US.tbl \
+	eo-g1.ctb \
+	eo-g1-x-system.ctb \
+	eo.tbl \
+	es-chardefs.cti \
+	Es-Es-G0.utb \
+	Es-Es-g1.utb \
+	es-g1.ctb \
+	es-new.dis \
+	es-old.dis \
+	es.tbl \
+	es-translation.cti \
+	et.ctb \
+	et-g0.utb \
+	ethio-g1.ctb \
+	et.tbl \
+	eurodefs.cti \
+	fa-ir-comp8.ctb \
+	fa-ir-g1.utb \
+	fi1.ctb \
+	fi2.ctb \
+	fi-fi-8dot.ctb \
+	fi-fi.ctb \
+	fi.tbl \
+	fi.utb \
+	fr-2007.ctb \
+	fr-bfu-comp68.cti \
+	fr-bfu-comp6.utb \
+	fr-bfu-comp8.utb \
+	fr-bfu-g2.ctb \
+	fr-ca-g1.utb \
+	Fr-Ca-g2.ctb \
+	fr_CA.tbl \
+	fr-fr-g1.utb \
+	Fr-Fr-g2.ctb \
+	fr_FR.tbl \
+	fr.tbl \
+	ga-g1.utb \
+	ga-g2.ctb \
+	ga.tbl \
+	gd.ctb \
+	gd.tbl \
+	gez.tbl \
+	gon.ctb \
+	gon.tbl \
+	gr-bb.ctb \
+	gr-pl-comp8.uti \
+	gu-in-g1.utb \
+	gujarati.cti \
+	gurumuki.cti \
+	gu.tbl \
+	haw-us-g1.ctb \
+	he.ctb \
+	he.tbl \
+	hi-in-g1.utb \
+	hi.tbl \
+	hr-chardefs.cti \
+	hr-comp8.tbl \
+	hr-comp8.utb \
+	hr-digits.uti \
+	hr-g1.ctb \
+	hr-g1.tbl \
+	hr-translation.cti \
+	hu-backtranslate-correction.dis \
+	hu-chardefs.cti \
+	hu-exceptionwords.cti \
+	hu-hu-comp8.ctb \
+	hu-hu-g1.ctb \
+	hu-hu-g2.ctb \
+	hu-hu-g2_exceptions.cti \
+	hu.tbl \
+	hy.ctb \
+	hyph_brl_da_dk.dic \
+	hyph_cs_CZ.dic \
+	hyph_da_DK.dic \
+	hyph_de_DE.dic \
+	hyph_en_US.dic \
+	hyph_eo.dic \
+	hyph_es_ES.dic \
+	hyph_fr_FR.dic \
+	hyph_hu_HU.dic \
+	hyph_it_IT.dic \
+	hyph_nb_NO.dic \
+	hyph_nl_NL.dic \
+	hyph_nn_NO.dic \
+	hyph_pl_PL.dic \
+	hyph_pt_PT.dic \
+	hyph_ru.dic \
+	hyph_sv_SE.dic \
+	hy.tbl \
+	IPA.utb \
+	is-chardefs6.cti \
+	is-chardefs8.cti \
+	is.ctb \
+	is.tbl \
+	it-it-comp6.utb \
+	it-it-comp8.utb \
+	it.tbl \
+	iu-ca-g1.ctb \
+	ka-in-g1.utb \
+	kannada.cti \
+	kha.tbl \
+	kh-in-g1.utb \
+	kn.tbl \
+	ko-2006.cti \
+	ko-2006-g1.ctb \
+	ko-2006-g2.ctb \
+	ko-chars.cti \
+	ko.cti \
+	ko-g1.ctb \
+	ko-g1-rules.cti \
+	ko-g2.ctb \
+	ko-g2-rules.cti \
+	kok.ctb \
+	kok.tbl \
+	kru.ctb \
+	kru.tbl \
+	ks-in-g1.utb \
+	latinLetterDef6Dots.uti \
+	latinLetterDef8Dots.uti \
+	litdigits6DotsPlusDot6.uti \
+	litdigits6Dots.uti \
+	loweredDigits6Dots.uti \
+	loweredDigits8Dots.uti \
+	lt.ctb \
+	lt.tbl \
+	lt-6dot.utb \
+	lt-6dot.tbl \
+	Lv-Lv-g1.utb \
+	lv.tbl \
+	malayalam.cti \
+	mao-nz-g1.ctb \
+	marburg.ctb \
+	marburg_edit.ctb \
+	marburg_single_cell_defs.cti \
+	marburg_unicode_defs.cti \
+	ml-in-g1.utb \
+	ml.tbl \
+	mn-in-g1.utb \
+	mni.tbl \
+	mn-MN.utb \
+	mr-in-g1.utb \
+	mr.tbl \
+	mt.ctb \
+	mt.tbl \
+	mun.ctb \
+	mun.tbl \
+	mwr.ctb \
+	mwr.tbl \
+	ne.ctb \
+	nemeth.ctb \
+	nemethdefs.cti \
+	nemeth_edit.ctb \
+	ne.tbl \
+	nl-BE.dis \
+	nl-BE-g0.utb \
+	nl_BE.tbl \
+	nl-chardefs.uti \
+	nl-g0.uti \
+	nl-NL-g0.utb \
+	nl_NL.tbl \
+	nl.tbl \
+	no-no-8dot-fallback-6dot-g0.utb \
+	no-no-8dot.utb \
+	no-no-braillo-047-01.dis \
+	no-no-chardefs6.uti \
+	no-no-comp8.ctb \
+	no-no.dis \
+	no-no-g0.utb \
+	no-no-g1.ctb \
+	no-no-g2.ctb \
+	no-no-g3.ctb \
+	no-no-generic.ctb \
+	no-no-generic.dis \
+	no-no-latinLetterDef6Dots_diacritics.uti \
+	no.tbl \
+	np-in-g1.utb \
+	or-in-g1.utb \
+	oriya.cti \
+	or.tbl \
+	pa.tbl \
+	pi.ctb \
+	pi.tbl \
+	pl-pl-comp8.ctb \
+	Pl-Pl-g1.utb \
+	pl.tbl \
+	printables.cti \
+	pt-pt-comp8.ctb \
+	pt-pt-g1.utb \
+	pt-pt-g2.ctb \
+	pt.tbl \
+	pu-in-g1.utb \
+	ro.ctb \
+	ro.tbl \
+	ru-chardefs.cti \
+	ru-compbrl.ctb \
+	ru.ctb \
+	ru-letters.dis \
+	ru-litbrl.ctb \
+	ru-ru.dis \
+	ru-ru-g1.utb \
+	ru.tbl \
+	sa-in-g1.utb \
+	sa.tbl \
+	sd.tbl \
+	se-se.ctb \
+	se-se.dis \
+	Se-Se-g1.utb \
+	si-in-g1.utb \
+	sin.cti \
+	sin.utb \
+	sk-chardefs.cti \
+	sk-g1.ctb \
+	sk-sk-g1.utb \
+	sk-sk.utb \
+	sk.tbl \
+	sk-translation.cti \
+	sl-si-comp8.ctb \
+	sl-si-g1.utb \
+	sl.tbl \
+	sot-za-g1.ctb \
+	spaces.ctb \
+	sr-chardefs.cti \
+	sr-g1.ctb \
+	sr.tbl \
+	sv-1989.ctb \
+	sv-1996.ctb \
+	sv.tbl \
+	ta.ctb \
+	tamil.cti \
+	ta-ta-g1.ctb \
+	ta.tbl \
+	te-in-g1.utb \
+	telugu.cti \
+	te.tbl \
+	text_nabcc.dis \
+	tr.ctb \
+	tr-g1.ctb \
+	tr.tbl \
+	tsn-za-g1.ctb \
+	UEBC-g1.utb \
+	UEBC-g2.ctb \
+	ukchardefs.cti \
+	ukmaths.ctb \
+	ukmaths_edit.ctb \
+	ukmaths_single_cell_defs.cti \
+	ukmaths_unicode_defs.cti \
+	unicode-braille.utb \
+	unicodedefs.cti \
+	unicode.dis \
+	uni-text.dis \
+	ur-pk-g1.utb \
+	ur-pk-g2.ctb \
+	us-table.dis \
+	vi.ctb \
+	vi-g1.ctb \
+	vi.tbl \
+	wiskunde-chardefs.cti \
+	wiskunde.ctb \
+	wiskunde-translation.cti \
+	zh-chn.ctb \
+	zh_CHN.tbl \
+	zh-hk.ctb \
+	zh_HK.tbl \
+	zh-tw.ctb \
+	zh_TW.tbl 
+
+tablesdir = $(datadir)/liblouis/tables
+tables_DATA = $(table_files)
+EXTRA_DIST = $(table_files)
diff --git a/liblouis/tables/Pl-Pl-g1.utb b/liblouis/tables/Pl-Pl-g1.utb
new file mode 100644
index 0000000..9f71061
--- /dev/null
+++ b/liblouis/tables/Pl-Pl-g1.utb
@@ -0,0 +1,238 @@
+# liblouis: Polish Grade 1 Braille Table
+#
+#  Copyright (C) 2004-2008 ViewPlus Technologies, Inc. www.viewplus.com
+#  Copyright (C) 2004-2006 JJB Software, Inc. www.jjb-software.com
+#  Copyright (C) 2012 Mesar Hameed <mesar.hameed@gmail.com>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+# Created & maintained by Leon Ungier <Leon.Ungier@ViewPlus.com>.
+
+include text_nabcc.dis
+
+# ----------- define all chars --------------------------------------
+
+space \t 0 tab						#  9
+space \x000A 0
+space \x000D 0
+space \s 0 blank					# 32
+punctuation ! 235			exclamation sign   						x0021
+punctuation " 356			double quote									x0022
+sign # 3456						number sign										x0023
+sign $ 256						dollar sign										x0024
+sign % 4-356					percent sign									x0025
+sign & 456-12346			ampersand											z0026
+punctuation ' 3				apostrophe										x0027
+punctuation ( 2356			left parenthesis						x0028
+punctuation ) 2356			right parenthesis						x0029
+sign * 35-35						asterisk										x002A
+math + 235							plus												002B
+punctuation , 2					coma												002C
+punctuation - 36				hyphen-minus								002D
+punctuation . 3					point												002E
+math / 456-34						solidus											002F
+
+include digits6Dots.uti
+
+punctuation : 25				colon								x003A
+punctuation ; 23				semicolon						x003B
+punctuation < 5-13			less-than sign			x003C
+math = 2356			equal sign					x003D
+math > 46-2			greater-than sign		x003E
+punctuation ? 26				question mark				x003F
+sign @ 4-1			commercial at				x0040
+
+include latinLetterDef6Dots.uti
+
+punctuation [ 12356		left square bracket						x005B
+sign \\ 2				reverse solidus								x005C
+punctuation ] 23456		right square bracket					x005D
+sign ^ 5				circumflex accent							x005E
+sign _ 46				low line											x005F
+sign ` 4				grave accent									x0060
+
+# a - z								# 97 - 122								x0061-x007A
+
+punctuation { 246				left curly bracket					x007B
+sign | 56					vertical line								x007C
+punctuation } 12456			right curly bracket					x007D
+math ~ 256				tilde												x007E
+sign \x0080 15-136-1235-135										x0080
+
+space \X00A0 0		no-break space																x00A0
+sign ¢ 4-14				cent sign																			x00A2
+sign £ 45-123			pound sign																		x00A3
+sign ¤ 45-15			currency sign																	x00A4
+sign ¥ 45-13456		yen	sign																			x00A5
+sign § 346				section sign																	x00A7
+sign © 2356-6-14-2356		copyright																x00A9
+punctuation « 236				left-pointing double angle quotation 		x00AB
+punctuation \x00AD 36 soft hyphen
+sign ° 4-356			degree sign																		x00B0
+sign ² 4-6-126		superscript 2 sign														x00B2
+sign ³ 4-6-146		superscript 3 sign														x00B3
+sign µ 46-134			micro sign																		x00B5
+sign ¶ 4-1234-345 pilcrow sign (paragraph)											x00B6
+sign ¹ 1-27				superscript 1 sign														x00B9
+punctuation » 356			right-pointing double angle quotation		x00BB
+math ¼ 6-16-34-1456		vulgar fraction one quarter								x00BC
+math ½ 6-16-34-126		vulgar fraction one half									x00BD
+math ¾ 6-126-34-1456	vulgar fraction 3 quarters								x00BE
+
+uplow \x00C0\x00E0 12356	letter a with grave							x00C0 / 00E0
+uplow \x00C1\x00E1 12356			letter a with acute									x00E1
+uplow \x00C2\x00E2 16					letter a with circumflex						x00E2
+uplow \x00C3\x00E3 126		letter a with tilde											x00E3
+uplow Ää 345				A with diaeresis											x00C4 / 00E4
+uplow Åå 16					A with ring above											x00C5 / 00E5
+uplow \x00C6\x00E6 6-345	ae															x00C6
+uplow Çç 12346			letter c with cedilla									x00C7 / 00E7
+uplow Èè 2346				e with grave													x00C8 / 00E8
+uplow \x00C9\x00E9 123456		e with acute													x00E9
+uplow \x00CA\x00EA 126			e with circumflex											x00EA
+uplow \x00CB\x00EB 1246		e with diaeresis												x00EB
+uplow \x00CD\x00ED 34			i with acute													x00ED
+uplow \x00CE\x00EE 146		i with circumflex											x00EE
+uplow \x00CF\x00EF 12456	i with diaeresis								x00CF / 00EF
+
+uplow	\x00D3\x00F3	346 O with acute											x00D3 / 00F3
+uplow \x00D4\x00F4 1456	o with circumflex													x00F4
+uplow \x00D5\x00F5 246		o with tilde														x00F5
+uplow Öö 246						O with diaeresis									x00D6 / 00F6
+math × 236				multiplication sign											x00D7
+uplow \x00D8\x00F8 246		o with stroke										x00D8 / 00F8
+
+math ÷ 256				division sign										x00F7
+
+uplow \x00DA\x00FA 23456			u with acute							x00DA / 00FA
+uplow \x00DB\x00FB 156				u with circumflex					x00FB
+uplow \x00DC\x00FC 1256				u with diaeresis					x00FC
+uplow \x00DD\x00FD 12346			y with acute							x00DD / 00FD
+
+# the letter a with ogonek -----------------------------------
+uplow \x0104\x0105 16
+
+# the letter c with acute
+uplow \x0106\x0107 146
+
+# the letter e with ogonek
+uplow \x0118\x0119 156
+
+# the letter l with stroke
+uplow \x0141\x0142 126
+
+# the letter n with acute
+uplow \x0143\x0144 1456
+
+# the letter s	with acute
+# always	\x015A	246																	x015A
+# always	\x015B	246
+uplow \x015A\x015B 246
+
+# the letter z	with acute
+# always	\x0179	2346																x0179
+# always	\x017A	2346
+uplow \x0179\x017A 2346
+
+# the letter z with dot above
+# always	\x017B	12346																x017B
+# always	\x017C	12346																x017C
+uplow \x017B\x017C 12346
+
+punctuation	\x2010 36		 # 8208			hyphen
+punctuation	\x2011 36		 # 8209			non-breaking hyphen
+punctuation	\x2013 36		 # 8211			smart minus sign
+punctuation	\x2018 3		 # 8216			smart single left quotation mark
+punctuation	\x2019 3		 # 8217			smart single right quotation mark
+
+punctuation	\x201C 236	 # 8220			smart opening double quote
+punctuation	\x201D 356	 # 8221			smart closing double quote
+punctuation	\x201E 236	 # 8222			smart double low quotation mark
+punctuation	\x201F 356	 # 8223			smart double high reverse quotation mark
+punctuation  \x2026 3-3-3 # 8230		smart ellipsis
+
+noback sign \X25CF 35-35	# 9679 black circle
+
+# ------------------------------------------------------
+
+
+capsletter 46			# single capital letter indicator
+begcapsword 4-6			# a block of consecutive capital letters indicator
+
+numsign 3456		#	number sign, just one operand
+midnum , 3
+midnum . 2
+midnum + 235
+midnum - 36
+midnum / 256
+midnum : 25
+midnum = 2356
+
+endnum # 56-3456
+
+prepunc " 236
+postpunc " 356
+
+prepunc ' 6-236
+postpunc ' 356-3
+postpunc '' 356
+postpunc ''' 356-3-356
+
+repeated *** 16-16-16
+
+prepunc `` 236
+prepunc ` 6-236
+
+
+repeated --- 36-36-36
+
+repeated ___ 46-46-46
+
+repeated ::: 25-25-25
+repeated === 46-13-46-13-46-13
+repeated ~~~ 4-156-4-156-4-156
+always \s-\s 36-36
+always \s-\scom 36-36-14-135-134
+always ... 3-3-3
+always .\s.\s. 3-3-3 . . .
+
+always \s­\s 36-36
+
+# special character sequences
+literal :// URLs
+literal www.
+
+literal .com
+literal .edu
+literal .gov
+literal .mil
+literal .net
+literal .org
+
+literal .doc
+literal .htm
+literal .html
+literal .tex
+literal .txt
+
+literal .gif
+literal .jpg
+literal .png
+literal .wav
+
+literal .tar
+literal .zip
diff --git a/liblouis/tables/README b/liblouis/tables/README
new file mode 100644
index 0000000..a96b876
--- /dev/null
+++ b/liblouis/tables/README
@@ -0,0 +1,6 @@
+Most of the liblouis tables in this subdirectory were supplied by
+ViewPlus Technologies, Inc.
+
+The hyphenation tables are the ones used in TeX and OpenOffice.
+
+
diff --git a/liblouis/tables/Se-Se-g1.utb b/liblouis/tables/Se-Se-g1.utb
new file mode 100644
index 0000000..226f95f
--- /dev/null
+++ b/liblouis/tables/Se-Se-g1.utb
@@ -0,0 +1,146 @@
+# liblouis: Swedish Grade 1 Braille Table
+#
+#  Copyright (C) 2004-2008 ViewPlus Technologies, Inc. www.viewplus.com
+#  Copyright (C) 2004-2006 JJB Software, Inc. www.jjb-software.com
+#  Copyright (C) 2012 Mesar Hameed <mesar.hameed@gmail.com>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+# Created by Leon Ungier <Leon.Ungier@ViewPlus.com>.
+
+locale Sweden
+
+include se-se.dis
+
+# ----------- define all chars --------------------------------------
+
+space \t 0 tab						#  9
+space \x000A 0
+space \x000D 0
+space \s 0 blank					# 32
+
+punctuation ! 235			exclamation mark		x0021
+punctuation " 56			double quote				x0022
+sign # 45-3456				number sign					x0023
+sign $ 4-234					dollar							x0024
+sign % 46-356					percent							x0025
+sign & 5-346					ampersand						x0026
+punctuation ' 5				apostrophe					x0027
+punctuation ( 236			left parenthesis		x0028
+punctuation ) 356			right parenthesis		x0029
+sign * 35							asterisk						x002A
+math + 256						plus								x002B
+punctuation , 2				coma								x002C
+punctuation - 36			hyphen-minus				x002D
+punctuation . 3				point								x002E
+math / 34							solidus							x002F
+
+include digits6Dots.uti
+
+punctuation : 25			colon								x003A
+punctuation ; 23			semicolon						x003B
+math < 246-3					less-than sign			x003C
+math = 2356						equal sign					x003D
+math > 135-2					greater-than sign		x003E
+punctuation ? 26			question mark				x003F
+sign @ 45-12356				commercial at				x0040
+
+include latinLetterDef6Dots.uti
+
+punctuation [ 12356	left square bracket		x005B
+sign \\ 45-34				reverse solidus				x005C
+punctuation ] 23456	right square bracket	x005D
+sign ^ 4						circumflex accent			x005E
+sign _ 6						low line							x005F
+sign ` 46						grave accent					x0060
+
+# a - z								# 97 - 122					x0061-x007A
+
+punctuation { 6-236	left curly bracket		x007B
+sign | 456					vertical line					x007C
+punctuation } 6-356	right curly bracket		x007D
+math ~ 45-2					tilde									x007E
+space \X00A0 0			no-break space				x00A0
+sign ¢ 4-14					cent sign							x00A2
+sign £ 45-123				pound sign						x00A3
+sign ¤ 45-15				currency sign					x00A4
+sign ¥ 45-13456			yen										x00A5
+sign § 346					paragraph							x00A7
+
+sign © 6-14-135-1234-13456-1235-24-1245-125-2345		copyright		x00A9
+punctuation « 45-2356	left pointing double angle								x00AB
+
+sign ° 4-356					degree sign									x00B0
+sign ² 4-6-126				superscript 2								x00B2
+sign ³ 4-6-146				superscript 3								x00B3
+sign ¹ 4-6-16					superscript 1								x00B9
+punctuation » 2356-12	right pointing double angle	x00BB
+math ¼ 6-16-34-1456		vulgar fraction 1 quarter		x00BC
+math ½ 6-16-34-126		vulgar fraction one half		x00BD
+math ¾ 6-126-34-1456	vulgar fraction 3 quarters	x00BE
+
+uplow \x00C0\x00E0 12356			A with grave				x00C0
+uplow Ää 345							a with diaeresis		x00C4
+uplow Åå 16										A with ring above		x00C5
+uplow \x00C8\x00E8	2346			E with grave above	x00C8
+uplow Éé 123456								E with acute above	x00C9
+
+uplow Öö 246																			x00D6
+math × 1346						multiplication sign					x00D7
+
+uplow Üü 1256-1256						U with diaeresis		x00DC
+
+math ÷ 34							division sign								x00F7
+
+punctuation	\x2010 46		 # 8208			hyphen
+punctuation	\x2011 46		 # 8209			non-breaking hyphen
+punctuation	\x2013 36		 # 8211			smart minus sign
+punctuation	\x2018 5		 # 8216			smart single left quotation mark
+punctuation	\x2019 5		 # 8217			smart single right quotation mark
+
+punctuation	\x201C 56		# 8220			smart opening double quote
+punctuation	\x201D 56		# 8221			smart closing double quote
+punctuation	\x201E 56		# 8222			smart double low quotation mark
+punctuation	\x201F 56		# 8223			smart double high reverse quotation mark
+
+punctuation \x2026 3-3-3 # 8230			smart ellipsis
+
+sign \x20AC 15-136-1235-135					Euro sign
+noback sign \X25CF 35	# 9679 black circle
+
+# -----------------------
+
+capsletter 6
+begcapsword 6-6			# uncomment if you don't want capitalization
+
+sign \x00B7 3456			# so the line below compile
+numsign 3456
+midnum , 2
+midnum . 3
+midnum + 256
+midnum - 36
+midnum / 34
+midnum : 25
+
+endnum # 56-3456
+
+repeated ... 3-3-3		ellipsis
+repeated --- 36-36-36
+repeated ___ 6-6-6
+
+always \s--\s 36-36	tiret
+
diff --git a/liblouis/tables/UEBC-g1.utb b/liblouis/tables/UEBC-g1.utb
new file mode 100644
index 0000000..7de33de
--- /dev/null
+++ b/liblouis/tables/UEBC-g1.utb
@@ -0,0 +1,322 @@
+# liblouis: Unified English Braille Grade 1 Table
+#
+# Based on the braille contraction modules in BRLTTY
+#
+# Copyright (C) 1995-2004 by The BRLTTY Team.
+# Copyright (C) 2004 ViewPlus Technologies, Inc., www.viewplustech.com
+# Copyright (C) 2004 Computers to Help People, Inc., www.chpi.org
+
+# This file is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with this file; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# liblouis  comes with ABSOLUTELY NO WARRANTY.
+
+include text_nabcc.dis All display opcodes
+
+include ukchardefs.cti All character definition opcodes
+
+
+# Braille indicators
+numsign 3456  number sign, just a dots operand
+multind 56-6 letsign capsletter
+letsign 56
+capsletter 6
+begcapsword 6-6
+#begphasecaps 6-6-6
+endcapsword 6-3
+emphclass italic
+emphclass underline
+emphclass bold
+begemph italic 46-2356
+endemph italic 46-3
+begemph bold 45-2356
+endemph bold 45-3
+#begnocont 56-56-56
+#endnocont 56-3
+
+# the decimal digits
+include litdigits6Dots.uti
+
+# Letters are defined in chardefs.cti
+
+
+#single letter words
+largesign a 1
+largesign A 1
+word I 24
+word o 135
+word O 135
+
+# punctuation
+prepunc " 236
+postpunc " 356
+always " 6-2356
+prepunc ' 6-236
+postpunc ' 6-356
+postpunc '' 356
+postpunc ''' 356-3-356
+
+always ' 3
+endword 'd 3-145
+word 'em 3-15-134 
+endword 'll 3-123-123
+endword 'm 3-134
+endword 're 3-1235-15
+endword 's 3-234
+endword 't 3-2345
+word 'tis 3-2345-24-234
+word 'twas 3-2345-2456-1-234
+endword 've 3-1236-15
+always , 2
+midnum . 256
+decpoint . 256
+always . 256
+always ; 23
+always : 25
+always ! 235
+always # 456-1456
+midnum / 34-3456
+always / 456-34
+always ? 236
+always % 46-356
+always ^ 4-26
+always ~ 4-35
+always & 4-12346
+midnum * 5-236-3456
+always * 5-35
+repeated *** 5-35-5-35-5-35
+always ( 5-126
+always ) 5-345
+always [ 46-126
+always ] 46-345
+always { 456-126
+always } 456-345
+always -com =
+endword -to = pointed-to resource
+endword -by = used-by
+always _ 46-36
+prepunc `` 236
+prepunc ` 6-236
+always ` 46-16
+always @ 4-1
+always \\ 456-16
+always | 456-1256
+repeated --- 6-36-6-36-6-36
+
+repeated ___ 46-36-46-36-46-36
+
+
+repeated ::: 25-25-25
+
+repeated === 5-2356-5-2356-5-2356
+repeated ~~~ 4-35-4-35-4-35
+always \s-\s 6-36
+always \s-\scom 6-36-14-135-134
+always ... 256-256-256
+always .\s.\s. 256-256-256 . . .
+always  \x2026 256-256-256 # 8230			MS Word smart ellipsis
+
+# the hyphen
+# always ­ 36
+repeated ­­­ 36-36-36
+always \s­\s 36-36
+
+# accented letters
+
+uplow \x00C0\x00E0 1				# a with grave
+uplow \x00C1\x00E1 1				# a with acute
+uplow \x00C2\x00E2 1				# a with circumflex
+uplow \x00C3\x00E3 1				# a with tilde
+uplow \x00C4\x00E4 1				# a with dieresis
+uplow \x00C5\x00E5 1				# a with ring above
+uplow \x00C6\x00E6 1				# letter ae
+uplow \x00C7\x00E7 14				# c with cedilla
+uplow \x00C8\x00E8 15				# e with grave
+uplow \x00C9\x00E9 15				# e with acute
+uplow \x00CA\x00EA 15				# e with circumflex
+uplow \x00CB\x00EB 15				# e with dieresis
+uplow \x00CC\x00EC 24				# i with grave above
+uplow \x00CD\x00ED 24				# i with acute above
+uplow \x00CE\x00EE 24				# i with circumflex
+uplow \x00CF\x00EF 24				# i with dieresis
+uplow \x00D0\x00F0 15				# letter eth
+uplow \x00D1\x00F1 1345			# n with tilde
+uplow \x00D2\x00F2 135			# o with grave above
+uplow \x00D3\x00F3 135			# o with acute above
+uplow \x00D4\x00F4 135			# o with circumflex
+uplow \x00D5\x00F5 135			# o with tilde
+uplow \x00D6\x00F6 135			# o with dieresis
+# \x00D7	× multiplication sign	----------------------
+uplow \x00D8\x00F8 135			# o with stroke
+uplow \x00D9\x00F9 136			# u with grave above
+uplow \x00DA\x00FA 136			# u with acute above
+uplow \x00DB\x00FB 136			# u with circumflex above
+uplow \x00DC\x00FC 136				# u with dieeresis
+uplow \x00DD\x00FD 13456		# y with acute above
+uplow \x00DE\x00FE 2345			# letter thorn
+letter \x00DF 2346		# small sharp s
+uplow \x0174\x0175 2456 w with circumflex
+uplow \x0176\x0177 13456 # y with circumflex
+uplow \x0178\x00ff 13456 # y with diaeresis
+uplow \x1ef2\x1ef3 13456 # y with grave
+
+largesign \x00C0 45-16-1      [C0] upper a grave
+largesign \x00E0   45-16-1      [E0] lower a grave
+
+largesign \x00C1 45-34-1      [C1] upper a acute
+largesign \x00E1   45-34-1      [E1] lower a acute
+
+largesign \x00C2 45-146-1      [C2] upper a circumflex
+largesign \x00E2   45-146-1      [E2] lower a circumflex
+
+largesign \x00C3 45-12456-1      [C3] upper a tilde
+largesign \x00E3   45-12456-1      [E3] lower a tilde
+
+largesign \x00C4 45-25-1      [C4] upper a dieresis
+largesign \x00E4   45-25-1      [E4] lower a dieresis
+
+largesign \x00C5 45-1246-1      [C5] upper a ring
+largesign \x00E5   45-1246-1      [E5] lower a ring
+
+largesign \x00C6 1-45-235-15     [C6] upper ae
+largesign \x00E6   1-45-235-15			[E6] lower ae
+
+largesign \x00C7 45-12346-14     [C7] upper c cedilla
+largesign \x00E7   45-12346-14     [E7] lower c cedilla
+
+largesign \x00C8 45-16-15     [C8] upper e grave
+largesign \x00E8   45-16-15     [E8] lower e grave
+
+largesign \x00C9 45-34-15     [C9] upper e acute
+largesign \x00E9   45-34-15     [E9] lower e acute
+
+largesign \x00CA 45-146-15     [CA] upper e circumflex
+largesign \x00EA   45-146-15     [EA] lower e circumflex
+
+largesign \x00CB 45-25-15     [CB] upper e dieresis
+largesign \x00EB   45-25-15     [EB] lower e dieresis
+
+largesign \x00CC 45-16-24     [CC] upper i grave
+largesign \x00EC   45-16-24     [EC] lower i grave
+
+largesign \x00CD 45-34-24     [CD] upper i acute
+largesign \x00ED   45-34-24     [ED] lower i acute
+
+largesign \x00CE 45-146-24     [CE] upper i circumflex
+largesign \x00EE   45-146-24     [EE] lower i circumflex
+
+largesign \x00CF 45-25-24     [CF] upper i dieresis
+largesign \x00EF   45-25-24     [EF] lower i dieresis
+
+#largesign \x00D0 4-15     [D0] upper eth
+#largesign \x00F0   4-15     [F0] lower eth
+
+largesign \x00D1 45-12456-1345   [D1] upper n tilde
+largesign \x00F1   45-12456-1345   [F1] lower n tilde
+
+largesign \x00D2 45-16-135    [D2] upper o grave
+largesign \x00F2   45-16-135    [F2] lower o grave
+
+largesign \x00D3 45-34-135    [D3] upper o acute
+largesign \x00F3   45-34-135    [F3] lower o acute
+
+largesign \x00D4 45-146-135    [D4] upper o circumflex
+largesign \x00F4   45-146-135    [F4] lower o circumflex
+
+largesign \x00D5 45-12456-135    [D5] upper o tilde
+largesign \x00F5   45-12456-135    [F5] lower o tilde
+
+largesign \x00D6 45-25-135    [D6] upper o dieresis
+largesign \x00F6   45-25-135			[F6] lower o dieresis
+
+#largesign \x00D8 4-135    [D8] upper o slash
+#largesign \x00f8   4-135    [F8] lower o slash
+
+largesign \x00D9 45-16-136    [D9] upper u grave
+largesign \x00F9   45-16-136    [F9] lower u grave
+
+largesign \x00DA 45-25-136    [DA] upper u acute
+largesign \x00FA   45-25-136    [FA] lower u acute
+
+largesign \x00DB 45-146-136    [DB] upper u circumflex
+largesign \x00FB   45-146-136    [FB] lower u circumflex
+
+largesign \x00DC 45-25-136    [DC] upper u dieresis
+largesign \x00FC   45-25-136    [FC] lower u dieresis
+
+largesign \x00DD 45-34-13456  [DD] upper y acute
+largesign \x00FD   45-34-13456  [FD] lower y acute
+
+#largesign \x00DE 4-2345   [DE] upper t horn
+#largesign \x00FE   4-2345   [FE] lower t horn
+
+largesign \x00DF 234-234 (DF) lower ss
+
+largesign \x0174 45-146-2456 lower w circumflex
+largesign \x0175 45-146-2456 upper w circumflex
+
+largesign \x0176 45-146-13456 upper y circumflex
+largesign \x0177 45-146-13456 lower y circumflex
+
+largesign \x0178 45-26-13456 upper y dieresis
+largesign \x00FF 45-25-13456 lower y dieresis
+
+#largesign \x1EF2 4-16-13456 upper y with grave
+#largesign \x1EF3 45-16-13456 lower y with grave
+
+# always	\x2010 36		 # 8208			hyphen
+hyphen 	\x2010 36		 # 8208			hyphen
+
+# always	\x2011 46		 # 8209			non-breaking hyphen
+punctuation \x2011 36		 # 8209			non-breaking hyphen
+
+always	\x2013 5-36		 # 8211		smart minus sign
+
+
+always	\x201C 45-236	 # 8220			smart opening double quote
+always	\x201D 45-356	 # 8221			smart closing double quote
+always	\x201E 236	 # 8222			smart double low quotation mark
+always	\x201F 356	 # 8223			smart double high reverse quotation mark
+
+# mathematical symbols
+decpoint . 256
+always < 4-126
+always = 5-2356
+midnum = 5-2356-3456
+always > 4-345
+always + 5-235
+midnum + 5-235-3456
+midnum - 36-3456
+always - 36
+always × 5-236
+midnum × 5-236-3456
+midnum ÷ 5-34-3456 division sign
+always ÷ 5-34
+
+
+
+# other special characters
+always © 45-14 copyright
+sign ™ 45-2345 trademark
+sign ® 45-1235 registered
+always ¶ 45-1234 paragraph
+always § 45-234 section
+always ° 45-245 degrees
+always £ 4-123 pounds
+always $ 4-234
+always ¢ 4-14 cents
+sign € 4-15	euro
+always € 4-15	euro
+always ¥ 4-13456 yen
+always µ 46-134 mu
+
diff --git a/liblouis/tables/UEBC-g2.ctb b/liblouis/tables/UEBC-g2.ctb
new file mode 100644
index 0000000..50a2045
--- /dev/null
+++ b/liblouis/tables/UEBC-g2.ctb
@@ -0,0 +1,796 @@
+# liblouis: Unified English Braille Grade 2 Table
+#
+#  Copyright (C) 2004-2008 ViewPlus Technologies, Inc. www.viewplus.com
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+# Created by Tom Johnston <tom.johnston@accessibilityconsulting.co.uk>. 
+
+include UEBC-g1.utb
+
+punctuation ( 12356
+punctuation ) 23456
+
+# the letter a
+largesign a 1
+always about 1-12
+contraction ab
+always above 1-12-1236
+contraction abv
+always according 1-14
+contraction ac
+always across 1-14-1235
+contraction acr
+always aed =
+#always aer = Rosenlaer
+begword aforem 1-123456-15-134 aforementioned 
+word aforesaid 1-123456-15-234-145
+always after 1-124
+contraction af
+sufword afternoon 1-124-1345 afternoons
+contraction afn
+always afterward 1-124-2456
+contraction afw
+word again 1-1245
+contraction ag
+word against 1-1245-34
+word agst =
+#endword gery = orangery
+word almost 1-123-134
+contraction alm
+word already 1-123-1235
+contraction alr
+word also 1-123
+contraction al
+word although 1-123-1456
+word alth =
+word altogether 1-123-2345
+contraction alt
+word always 1-123-2456
+contraction alw
+midendword ance 46-15
+largesign and 12346
+midword angh = Shanghai
+begword aqued = aqueduct
+always ar 345
+word aright 1-5-1235
+word as 1356
+contraction as
+midendword aunder 1-136-1345-145-12456 saunders
+begword auto = autofocus
+
+# the letter b
+lowword be 23
+begword be 23
+begword bea 12-15-1
+always bear 12-15-345
+begword beatif 23-1-2345-24-124
+begword beatit 23-1-2345-24-2345
+begword beatr 12-15-1-2345-1235 Beatrice
+always beck 12-15-14-13
+always bed 12-1246
+begword beda 23-145-1 bedazzle
+begword bede 23-145-15 bedevil
+word bede 12-1246-15 bede (a name)
+begword bedi 23-145-24 bedizzened
+word bee 12-15-15
+begword bee 12-15-15
+always been 12-15-26
+always beer 12-15-12456
+word beg =
+begword begg 12-15-1245-1245
+word begs =
+begword bei = beijing
+sufword being 23-346
+sufword belch 12-15-123-16
+begword beld = Beldon
+begword belf = belfry, belfast
+begword belg = Belgium
+begword belk = Belkin
+always bell =
+begword belm = Belmont
+always belt =
+begword belw = belwether
+always ben 12-26
+begword beni 12-26-24
+begword benif 23-1345-24-124 benificient
+sufword benign 23-1345-24-1245-1345 benignity
+begword benov 23-1345-135-1236 benovolent
+begword benu 23-1345-136 benumbed
+begword ber 12-12456
+begword bera 23-1235-1 berating
+begword bere 23-1235-15 bereft
+begword berea 23-1235-2 bereaved
+begword beri 23-1235-24 beribboned
+always best 12-15-34
+sufword bestow 23-34-246
+always beth 12-15-1456 Bethany
+always bethe 12-15-2346 Bethel (Hans) Bethe
+always bets =
+always bett =
+sufword bev = bevies
+begword bever 12-5-15 Beverly beverage
+always bio =
+midendword bious 12-24-1256-234 dubious
+always because 23-14
+word bec =
+always before 23-124
+word bef =
+always behind 23-125
+word behring 12-15-125-1235-346
+word beh =
+word bel =
+begword beln = Belnick
+always below 23-123
+always beneath 23-1345
+always beside 23-234
+word bes =
+sufword bess = Bessie
+always between 23-2345
+word bet =
+always beyond 23-13456
+word bey =
+always bless 12-46-234 joblessness
+always blind 12-123
+contraction bl
+always blinded 12-123-35-145-1246
+sufword blinder 12-123-35-145-12456
+word blinding 12-123-35-145-346
+always braille 12-1235-123
+contraction brl
+word but 12
+
+# the letter c
+midword cch 14-16
+always chloro 16-123-135-1235-135
+begword cofac = cofactor
+always cofound 14-135-124-46-145
+sufword common 14-135-134-134-135-1345 commonest
+begword con 25
+sufword conceive 25-14-1236
+word concv =
+word concvd =
+word concvr =
+word concvs =
+word concvst =
+word concvth =
+sufword conceiving 25-14-1236-1245
+word concvg =
+always cone 14-5-135
+word cons 14-135-1345-234
+sufword conundrum = 
+always could 14-145
+contraction cd
+sufword coworker 14-135-5-2456-12456
+word can 14
+always cannot 456-14
+word ch =
+always ch 16
+always character 5-16
+always chemo 16-15-134-135
+word child 16
+always children 16-1345
+word chn =
+sufword clever 14-123-5-15 cleverest
+
+# the letter d
+always day 5-145
+begword deact = deactivation
+begword deall = deallocate
+begword decarb 145-15-14-345-12
+always deceive 145-14-1236
+contraction dcv
+contraction dcvd
+contraction dcvr
+contraction dcvs
+word dcvst =
+word dcvth =
+always deceiving 145-14-1236-1245
+contraction dcvg
+always declare 145-14-123
+contraction dcl
+contraction dcld
+contraction dclr
+contraction dcls
+word dclst =
+word dclth =
+always declaring 145-14-123-1245
+contraction dclg
+begword deref = dereferencing
+begword dereg = deregulation
+midendword dday 145-5-145 midday
+begword dedic 145-1246-24-14 dedicated
+begword dis 256
+#sufword disc = discount disconsolate
+always dish 145-24-146
+begword disha 256-125-1 dishabile
+begword dishear 256-125-15-345 disheartened
+begword disho 256-125-135 dishonor
+begword dishone 256-125-5-135 dishonest
+sufword disk =
+sufword dispirit 145-24-456-234 dispirited
+begword disul = disulfide
+word do 145
+
+# the letter e
+midword eabil = interchangeability
+endword eably = noticeably
+midendword eage = mileage
+midendword eager 15-1-1245-12456 meager
+#always eally 15-6-13456
+midendword eance 15-46-15 vengeance
+midendword eand 15-12346 meander
+#always eation 15-6-1345
+always ear 15-345
+always ed 1246
+#always edic = edict Benedict
+sufword edict =
+#sufword edition 15-145-24-56-1345 editions
+#midword edo 15-145-135
+always edraw =
+word either 15-24
+contraction ei
+word en =
+always en 26
+always ename 15-5-1345
+sufword enamel 26-1-134-15-123 enameled
+midendword ence 56-15
+always eneck = bottleneck
+midendword eness 15-56-234 closeness
+endword enesse 15-56-234-15
+#begword enor = enormous
+#begword enou 15-1345-1256
+lowword enough 26
+word enough 26-1256-126
+#begword enu 15-1345-136
+always er 12456
+#begword era =
+#word eras 12456-1-234
+#begword erec = erect 
+#begword ero 15-1235-135
+midendword eroom = storeroom
+#begword eru = erupt
+always ever 5-15
+midendword evere 15-1236-12456-15 Everest
+always evered 15-1236-12456-1246
+word every 15
+
+# the letter f
+always father 5-124
+always fein 124-15-35 Feingold
+always first 124-34
+word fst =
+#always fever 124-15-1236-12456
+always ffor 124-123456
+largesign for 123456
+always fore 123456-15
+begword forens 123456-26-234 forensic
+always forever 123456-5-15 forevermore
+always foot =
+word from 124
+always friend 124-1235
+contraction fr
+midendword ful 56-123
+always funder 124-136-1345-145-12456
+
+# the letter g
+begword geo = geoengineering
+sufword geoff 1245-15-12356-124 Geoffrey
+always gh 126
+endword gham = Langham
+always ghead 1245-125-15-1-145
+always gheart 1245-125-15-345-2345
+midendword ghill = dunghill
+midendword ghorn = bighorn
+always ghouse 1245-125-1256-234-15
+always ghz = (gigahertz)
+begword givea = giveaway
+sufword gnome = gnomedb
+word go 1245
+always good 1245-145
+contraction gd
+begword gos = goshawk
+word goshen 1245-135-146-26
+always great 1245-1235-2345
+contraction grt
+
+# the letter h
+always had 456-125
+begword hadd 125-1-256 haddock
+sufword hade = hadean 
+word have 125
+always here 5-125
+always hered 125-12456-1246
+always heren 125-12456-26
+midendword herence 125-12456-56-15 adherence
+always herer 125-12456-12456
+always heres 125-12456-15-234
+always heret 125-12456-15-2345
+word heretofore 5-125-2345-135-123456-15
+word herself 125-12456-124
+word herf =
+word him 125-134
+word hm 125-3-134
+sufword hmm =
+word himself 125-134-124
+contraction hmf
+lowword his 236
+sufword horse = horseradish
+always hydro =
+
+# the letter i
+word i 24
+midendword iever 24-15-1236-12456
+always immediate 24-134-134
+contraction imm
+begword immuno = immunofluorescence
+lowword in 35
+word in =
+always in 35
+begword incon 35-14-135-1345 incongruous
+always iness 24-56-234
+endword inesse 24-56-234-15
+midendword ing 346
+#midword inga 35-1245-1 nightingale
+always ingar 35-1245-345 Weingarten
+#midword ingen 35-1245-26 palingenesis (new birth)
+#midword ingi 35-1245-24 meningitis
+midendword inging 346-346 bringing
+always isomer 24-234-135-134-12456
+word it 1346
+word its 1346-234
+contraction xs
+word itself 1346-124
+contraction xf
+midendword ity 56-13456
+
+# the letter j
+word just 245
+
+# the letter k
+always know 5-13
+word knowledge 13
+
+# the letter l
+midendword less 46-234
+always letter 123-1235
+contraction lr
+word like 123
+always little 123-123
+contraction ll
+sufword lone 123-5-135 lonely
+always lord 5-123
+
+# the letter m
+always many 456-134
+begword mc =
+always medic 134-1246-24-14 medicare
+midendword ment 56-2345
+midword menth 134-26-1456 Blumenthal
+always mideast 134-24-145-15-1-34
+word milling 134-24-123-123-346
+begword mishand 134-24-234-125-12346 mishandled
+always mishap =
+sufword mishear 134-24-234-125-15-345 misheard
+begword missh 134-24-234-146 misshapen
+word mistook =
+begword mistran = mistranslation
+sufword mistreat 134-24-234-2345-1235-15-1-2345
+begword mistru = mistrust
+begword misty = mistyped
+word monetary 134-5-135-2345-345-13456
+word more 134
+always mother 5-134
+always much 134-16
+word mch =
+word must 134-34
+word mst =
+word mustn 134-34-1345
+begword myo = myofibroblasts
+word myself 134-13456-124
+contraction myf
+
+# the letter n
+always name 5-1345
+always nament 1345-1-56-2345 tournament
+always namese =
+endnum nd 1345-145
+always necessary 1345-15-14
+contraction nec
+word neither 1345-15-24
+contraction nei
+midendword ness 56-234
+begword noness = nonessential
+word nonetheless 1345-5-135-2346-46-234
+always nonex =
+begword nong = nongraphical
+word noone 1345-135-5-135
+sufword nose = nosedive
+word not 1345
+word noways =
+word nowhere 1345-135-5-156
+
+# the letter o
+word O 135
+always O 135
+#midword oed = Schroeder
+#always oen = Phoenix
+midendword oence 135-26-14-15 electroencephalogram
+largesign of 12356
+midendword ofar 135-124-345 insofar
+always ofold = twofold
+midword ofor 135-123456
+always onesi =
+midendword oness 135-56-234
+midendword onesse 135-56-234-15 
+midendword oneer 135-1345-15-12456
+midendword oned 135-1345-1246
+always one 5-135
+midendword onel = salmonella colonel
+always onem = phoneme
+midendword onement 5-135-56-2345 atonement
+always onent 135-1345-26-2345
+midendword oneous 135-1345-15-1256-234 erroneous
+always oner 135-1345-12456
+midendword onese = Cantonese,
+word oneself 5-135-124
+word onef =
+midendword oness 135-56-234 Deaconess
+midendword onet = phonetics bayonet
+endword onez = Ordonez
+midendword ong 56-1245
+always oon = sooner
+always osome =
+word ou =
+always ou 1256
+midendword ound 46-145
+midendword ount 46-2345
+always ourselves 1256-1235-1236-234
+word ourvs =
+word out 1256
+always ought 5-1256
+always ow 246
+
+
+# the letter p
+always paid 1234-145
+contraction pd
+always part 5-1234
+begword parta 1234-345-2345-1 partake
+begword parto 1234-345-2345-135
+word people 1234
+always perceive 1234-12456-14-1236
+word percv =
+word percvd =
+word percvr =
+word percvs =
+word percvst =
+word percvth =
+always perceiving 1234-12456-14-1236-1245
+word percvg =
+always perhaps 1234-12456-125
+word perh =
+always pher 1234-125-12456 cyphered
+begword potho = pothole pothook
+begword pre =
+always preach 1234-1235-15-1-16
+sufword predator 1234-1235-1246-1-2345-135-1235
+always prof = 
+always profes 1234-1235-12356-15-234 unprofessional
+sufword profile 1234-1235-12356-24-123-15
+begword proff 1234-1235-12356-124 proffer
+always profit 1234-1235-12356-24-2345
+
+# the letter q
+always quick 12345-13
+contraction qk
+word quite 12345
+always question 5-12345
+
+# the letter r
+sufword rafter 1235-1-124-2345-12456
+word rather 1235
+sufword raw = rawhide
+endnum rd 1235-145
+begword reab = reabsorbed
+always reac =
+always reach 1235-15-1-16
+begword readj = readjust
+begword readm = readmit
+begword reaff 1235-15-1-235
+always reagent 1235-15-1-1245-26-2345
+begword reagg 1235-15-1-1245-1245 reaggregated
+begword realig = realign
+begword rean = reanalyze, reanimate
+begword reapp = reappear
+begword reass 1235-15-1-234-234
+begword reatt = reattach
+begword reau = reauthorization
+begword reaw = reawaken
+#begword rede =
+#begword redi =
+word redo =
+#word redone 1235-15-145-5-135
+#begword redou 1235-15-145-1256 redouble redoubt 
+#always redu =
+always receive 1235-14-1236
+contraction rcv
+contraction rcvd
+contraction rcvr
+contraction rcvs
+word rcvst =
+word rcvth =
+always receiving 1235-14-1236-1245
+contraction rcvg
+#begword redis = redistribute
+#begword redr = redress
+begword reduc 1235-1246-136-14 reduce
+begword redun 1235-1246-136-1345 redundant
+always rejoice 1235-245-14
+contraction rjc
+contraction rjcd
+contraction rjcr
+contraction rjcs
+word rjcst =
+word rjcth =
+always rejoicing 1235-245-14-1245
+contraction rjcg
+sufword renaming 1235-26-1-134-346 renamings
+#begword rene =
+sufword renegade 1235-26-15-1245-1-145-15
+#begword renom = renominate
+#begword renou 1235-15-1345-1256 renounce
+#sufword renown 1235-15-1345-246-1345 renowned
+#begword renu = renunciation
+sufword reread 1235-15-1235-2-145
+sufword rerun = reruns
+#always rever 1235-15-1236-12456
+always reveren 1235-5-15-26 irreverent
+always reverence 1235-5-15-56-15 irreverence
+sufword reverie 1235-5-15-24-15
+always right 5-1235
+
+# the letter s
+endnum s = 40s (no letter sign)
+always s 234
+always S 234
+word said 234-145
+contraction sd
+sufword saw = sawhorse
+sufword screw = screwhole
+#always sedu =
+always sent 234-26-2345 sentimental
+always sever 234-15-1236-12456 perseverance 
+always several 234-5-15-1-123 severally
+word shall 146
+word sh =
+always sh 146
+always shaus = In German names
+always should 146-145
+word shd =
+always shoulder 146-1256-123-145-12456
+word singapore 234-346-1-1234-135-1235-15 
+midendword sion 46-1345
+#midword stak 234-2345-1-13
+midendword stion 234-56-1345
+word so 234
+always some 5-234
+midendword somed 234-135-134-1246 ransomed
+always somer 234-135-134-12456 somersault 
+always spirit 456-234
+midendword ssword 234-234-45-2456 crossword 
+endnum st 34
+word st =
+always st 34
+always sth 234-1456
+always sthe 234-2346
+midendword sthead 34-125-15-1-145 masthead
+always sthood 34-125-135-135-145 priesthood
+word still 34
+always stime 234-5-2345
+midendword stown 234-2345-246-1345 Pickstown
+#begword stringen 34-1235-35-1245-26 stringent stringency
+begword styro 34-13456-1235-135 styrofoam
+always shead 234-125-15-1-145
+always sheart 124-125-15-345-2345
+always shouse 234-125-1256-234-15
+always ssh =
+always shood =
+word such 234-16
+word sch =
+always sword =
+
+# the letter t
+endnum th 1456
+word th =
+always th 1456
+always thand 2345-125-12346 shorthand
+word that 2345
+word this 1456
+word thyself 1456-13456-124
+word thyf =
+always tnam =
+word today 2345-145
+contraction td
+word tomorrow 2345-134
+contraction tm
+word tonight 2345-1345
+contraction tn
+always thead 2345-125-15-1-145
+always theast 1456-15-1-34
+always theart 2345-125-15-345-2345
+always thouse 2345-125-1256-234-15
+largesign the 2346
+word themselves 2346-134-1236-234
+word themvs 1456-15-134-1236-234
+always their 456-2346
+always thence 1456-56-15
+always there 5-2346
+midendword thereal 2346-1235-15-1-123 ethereal
+word thereupon 5-2346-45-136
+always thered 2346-1235-1246
+always therer 2346-1235-12456
+always theres 2346-1235-15-234 theresa therese 
+always thood =
+midendword tion 56-1345
+always time 5-2345
+midendword timed 1245-24-134-1246
+midendword timer 2345-24-134-12456
+midendword timet = altimeter
+word these 45-2346
+always through 5-1456
+always together 2345-1245-1235
+contraction tgr
+word those 45-1456
+begword trans = transtype
+
+# the letter u
+begword un = unameliorated
+begword unble = unblemished
+#begword undis = undisturbed
+begword uneas = unease
+begword uneat = uneaten
+sufword unful = unfulfilled
+begword unmen 136-1345-134-26 unmentioned
+word upon 45-136 Dupont
+word us 136
+always under 5-136
+word unsaid 136-1345-234-145
+
+# the letter v
+begword vaing 1236-1-35-1245 vainglory
+word very 1236
+begword vice = viceroy
+
+# the letter w
+lowword was 356
+word wh =
+always wh 156
+midendword whart 2456-125-345-2345 Newhart
+word which 156
+midendword whouse 2456-125-1256-234-15 Newhouse
+word will 2456
+lowword were 2356
+always where 5-156
+word whereupon 5-156-45-136
+word wherever 156-12456-5-15
+largesign with 23456
+always word 45-2456
+word whose 45-156
+always work 5-2456
+always would 2456-145
+contraction wd
+always world 456-2456
+
+# the letter x
+
+# the letter y
+word you 13456
+always young 5-13456
+word your 13456-1235
+contraction yr
+word yours 13456-1235-234
+contraction yrs
+word yourself 13456-1235-124
+contraction yrf
+word yourselves 13456-1235-1236-234
+contraction yrvs
+
+# the letter z
+
+# Système International Prefixes
+begword yotta 13456-135-2345-2345-1 10^24
+begword zetta 1356-15-2345-2345-1 10^21
+# begword exa 15-1346-1 10^18
+begword peta 1234-15-2345-1 10^15
+begword tera 2345-12456-1 10^12
+begword giga 1245-24-1245-1 10^9
+begword mega 134-15-1245-1 10^6
+begword kilo 13-24-123-135 10^3
+begword hecto 125-15-14-2345-135 10^2
+begword deca 145-15-14-1 10^1
+begword deci 145-15-14-24 10^-1
+begword centi 14-26-2345-24 10^-2
+begword milli 134-24-123-123-24 10^-3
+begword micro 134-24-14-1235-135 10^-6
+begword nano 1345-1-1345-135 10^-9
+begword pico 1234-24-14-135 10^-12
+begword femto 124-15-134-2345-135 10^-15
+begword atto 1-2345-2345-135 10^-18
+begword zepto 1356-15-1234-2345-135 10^-21
+begword yocto 13456-135-14-2345-135 10^-24
+
+begword anti =
+# begword endo 26-145-135 endow
+begword epi =
+begword extra =
+begword hyper 125-13456-1234-12456
+begword hypo =
+begword infra 35-124-1235-1
+begword inter 35-2345-12456
+begword intra 35-2345-1235-1
+begword iso =
+begword macro =
+begword meta =
+begword micro =
+begword mono =
+begword multi =
+begword patho 1234-1-1456-135
+begword peri 1234-12456-24
+begword poly =
+begword post 1234-135-34
+begword pre =
+begword pseudo =
+begword retro =
+# begword semi = seminar
+begword sub =
+begword super 234-136-1234-12456
+begword tetra =
+begword trans =
+begword ultra =
+# begword uni =
+
+# other prefixes
+begword electro =
+begword neuro =
+begword psycho 1234-234-13456-16-135
+
+# special character sequences
+nocont :// URLs
+nocont www.
+
+nocont .com
+nocont .edu
+nocont .gov
+nocont .mil
+nocont .net
+nocont .org
+include countries.cti
+
+nocont .doc
+nocont .htm
+nocont .html
+nocont .tex
+nocont .txt
+
+nocont .gif
+nocont .jpg
+nocont .png
+nocont .wav
+
+nocont .tar
+nocont .zip
diff --git a/liblouis/tables/afr-za-g1.ctb b/liblouis/tables/afr-za-g1.ctb
new file mode 100644
index 0000000..063944d
--- /dev/null
+++ b/liblouis/tables/afr-za-g1.ctb
@@ -0,0 +1,56 @@
+#afr#1#Afrikaans Uncontracted#za#Afrikaans ongekontrakteerde
+
+# liblouis: Afrikaans Braille Code (Grade 1)
+#
+# Copyright (C) 2014, Greg Kearney <gkearney@gmail.com>
+#
+# Based on English UEB Grade 1
+#
+# Used to display symbols, Unicode chars and other symbols used throughout UEB code.
+#
+# This file is part of liblouis.
+#
+# liblouis is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation, either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# liblouis is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with liblouis. If not, see
+# <http://www.gnu.org/licenses/>.
+
+include en-ueb-g1.ctb
+
+# Afrikaans specific
+#sign \x0302 45 	COMBINING CIRCUMFLEX ACCENT
+#sign \x0308 56 	COMBINING DIAERESIS
+#sign \x0301 4	COMBINING ACUTE ACCENT
+
+uplow	Áá	4-1
+uplow	Àà	45-16-1
+#uplow	Ââ 	45-1
+#uplow	Ää 	56-1
+
+uplow	Éé 	4-15
+uplow	Èè	45-16-15
+uplow	Êê	45-15
+uplow	Ëë 	56-15
+
+uplow	Íí 	4-24
+uplow	Ïï 	56-24
+uplow	Îî 	45-24
+
+uplow	Óó	4-135
+uplow	Ôô	45-135
+uplow	Öö	56-135
+
+uplow	Úú	4-136
+uplow	Ûû	45-136
+uplow	Üü	56-136
+
+uplow	Ýý	4-13456
diff --git a/liblouis/tables/ar-ar-g1.utb b/liblouis/tables/ar-ar-g1.utb
new file mode 100644
index 0000000..bd21a49
--- /dev/null
+++ b/liblouis/tables/ar-ar-g1.utb
@@ -0,0 +1,298 @@
+# liblouis: Generic Arabic Grade 1 table
+#
+# Based on the braille contraction modules in BRLTTY
+#
+# Copyright (C) 1995-2004 by The BRLTTY Team. 
+# Copyright (C) 2004 by ViewPlus Technologies, Inc.,  www.viewplustech.com
+# Copyright (C) 2004 by Computers to Help People, Inc., www.chpi.org  
+# Copyright (C) 2011-2012 by Mesar Hameed <mesar.hameed@gmail.com>
+#
+# This file is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with this file; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+# Maintained by John J. Boyer, director@chpi.org, www.chpi.org
+#
+# This table is built and maintained by Leon Ungier <Leon.Ungier@ViewPlus.com>
+# with help and guidance from Mohammed R. Ramadan <mramadan@nattiq.com>
+
+include text_nabcc.dis All display opcodes
+include braille-patterns.cti # unicode braille.
+
+
+# ----------- define all chars --------------------------------------
+
+space \t 0 tab					#  9
+space \x000A 0
+space \x000D 0
+space \s 0 blank				# 32
+punctuation ! 235				# 33
+punctuation " 2356				# 34
+sign # 3456					# 35
+sign $ 4-234					# 36
+sign % 25-1234					# 37
+sign & 1234					# 38
+punctuation ' 3					# 39 apostrophe
+
+punctuation ) 356				# 40
+punctuation ( 236				# 41
+
+sign * 56-35					# 42
+math + 56-235					# 43
+punctuation , 46				# 44
+punctuation - 36				# 45
+
+punctuation \x06D4 256				# Arabic Full stop
+punctuation . 256				# 46
+
+math / 34					# 47
+include loweredDigits6Dots.uti
+punctuation : 25				# 58
+punctuation ; 56				# 59
+math < 0-246-0					# 60
+math = 56-2356					# 61
+math > 0-135-0					# 62
+punctuation ? 1456				# 63
+sign @ 4					# 64
+
+include latinLetterDef6Dots.uti
+
+punctuation [ 6-236				# 91
+sign \\ 6-34					# 92
+punctuation ] 356-6				# 93
+sign ^ 346					# 94 circumflex accent
+sign _ 456					# 95 underscore
+sign ` 4					# 96 grave accent
+punctuation { 5-236				# 123
+sign | 1245					# 124
+punctuation } 356-2				# 125
+math ~ 45					# 126
+
+space \X00A0 0					# 160 no-break space
+sign \x00A2 4-14				# 162 ¢ cents sign
+sign \x00A3 4-123				# 163 £ pounds sign
+
+sign \x00A5 4-13456				# 165 ¥ yen sign
+
+sign \x00A7 4-234-3				# 167 section sign §
+
+sign \x00A9 2356-6-14-2356 			# 169 © copyright sign
+
+sign \x00AB 2356 				# LEFT-POINTING DOUBLE ANGLE QUOTATION
+sign \x00AE 16-256				# ® Registered mark
+
+punctuation \x00Ad 36				# 173 soft hyphen
+
+sign \x00B0 356					# 176 ° degrees sign
+
+sign \x00B5 46-134				# 181 µ micro sign
+sign \x00B6 4-1234-345				# 182 ¶ pilcrow sign
+
+sign \x00BB 2356 				# RIGHT-POINTING DOUBLE ANGLE QUOTATION
+sign \x00BF 236					# 191 inverted question mark
+
+math \x00D7 56-236				# 215 × multiplication sign
+
+math \x00F7 56-256				# 247 ÷ division sign
+
+sign \x200C 9 					# ZERO WIDTH NON-JOINER
+punctuation \x2010 36				# 8208 hyphen
+punctuation \x2011 23478			# 8209 non-breaking hyphen
+
+punctuation \x2013 6-36				# 8211	en dash
+
+
+punctuation	\x2018 3			# 8216	smart single left quotation mark
+punctuation	\x2019 3			# 8217	smart single right quotation mark
+
+punctuation	\x201C 2356			# 8220	smart opening double quote
+punctuation	\x201D 2356			# 8221	smart closing double quote
+punctuation	\x201E 2356			# 8222	smart double low quotation mark
+punctuation	\x201F 2356			# 8223	smart double high reverse quotation mark
+
+
+punctuation \x2026 3-3-3			# 8230 smart ellipsis
+
+sign \x20AC 4-15				# 8364 Euro sign
+sign \x25CF 35 					# BLACK CIRCLE
+
+#-------------------------- Arabic characters ---------------------------------
+
+sign \x060C 5
+sign \x061B 56
+sign \x061F 236					# Arabic question mark (؟)
+sign \x0621 3
+sign \x0622 345
+sign \x0623 34
+sign \x0624 1256
+sign \x0625 46
+sign \x0626 13456
+sign \x0627 1					# Alef (ا)
+sign \x0628 12
+sign \x0629 16
+sign \x062B 1456
+sign \x062A 2345				# Teh (ت)
+sign \x062C 245
+sign \x062D 156
+sign \x062E 1346
+sign \x062F 145
+sign \x0630 2346
+sign \x0631 1235
+sign \x0632 1356
+sign \x0633 234
+sign \x0634 146
+sign \x0635 12346
+sign \x0636 1246
+sign \x0637 23456
+sign \x0638 123456
+sign \x0639 12356
+sign \x063A 126
+sign \x0640 2
+sign \x0641 124
+sign \x0642 12345
+sign \x0643 13
+sign \x0644 123
+sign \x0645 134
+sign \x0646 1345
+sign \x0647 125
+sign \x0648 2456
+sign \x0649 135
+sign \x064A 24
+sign \x064E 2
+sign \x0650 15
+
+
+sign \x064B 23
+sign \x064C 26
+sign \x064D 35
+sign \x064F 136
+sign \x0651 6
+sign \x0652 25
+
+
+always \x0644\x0627 1236
+always \x0640\x0640\x0640\x064F 136
+always \x0640\x0640\x0640\x064B 23
+always \x0640\x0640\x0640\x064C 26
+
+# --------------------------- end definitions ---------------------------------
+
+include countries.cti
+
+# include text.nabcc.dis All display opcodes
+# include text_nabcc.dis All display opcodes
+
+# Braille indicators
+numsign 3456  number sign, just a dots operand
+multind 56-6 letsign capsletter
+# letsign 56
+capsletter 6
+begcapsword 6-6
+endcapsword 6-3
+emphclass italic
+emphclass underline
+emphclass bold
+begemph italic 46
+endemph italic 46-46
+begemph bold 456
+endemph bold 456-456
+begcomp 456-346
+endcomp 456-156
+
+# the decimal digits
+include litdigits6Dots.uti
+
+# Arabic numerals
+digit \x0660 345		# 0 (٠)
+digit \x0661 1			# 1 (١)
+digit \x0662 12 		# 2 (٢)
+digit \x0663 14 		# 3 (٣)
+digit \x0664 145 		# 4 (٤)
+digit \x0665 15 		# 5 (٥)
+digit \x0666 124 		# 6 (٦)
+digit \x0667 1245 		# 7 (٧)
+digit \x0668 125 		# 8 (٨)
+digit \x0669 24 		# 9 (٩)
+
+# Letters are defined in en-chardefs
+# punctuation
+
+# prepunc ( 356
+# postpunc ) 236
+prepunc ) 356
+postpunc ( 236
+
+prepunc " 2356
+postpunc " 2356
+
+prepunc ' 6-236
+postpunc ' 356-3
+word 'em = 
+word 'tis =
+word 'twas =
+begnum # 3456-4 print number sign before number
+midnum , 46
+postpunc , 46
+decpoint . 46
+midnum - 36
+hyphen - 36
+#capsnocont
+postpunc . 256
+postpunc ; 23
+midnum : 25
+postpunc : 25
+postpunc ! 235
+midnum / 34
+always / 34
+always < 0-246-0
+always > 0-135-0
+postpunc ? 236
+endnum % 25-1234
+midnum ^ 346
+always ^ 346
+always ~ 45
+always & 1234
+midnum * 56-35
+always * 56-35
+always [ 6-236
+always ] 356-3
+always { 5-236
+always } 356-2
+prepunc ` 6-236
+always @ 4
+always \\ 6-34
+always | 1245
+always ... 3-3-3
+always $ 4-234
+
+# special character sequences
+compbrl :// URLs
+compbrl www.
+compbrl .com
+compbrl .edu
+compbrl .gov
+compbrl .mil
+compbrl .net
+compbrl .org
+# include countries.cti
+compbrl .doc
+compbrl .htm
+compbrl .html
+compbrl .tex
+compbrl .txt
+compbrl .gif
+compbrl .jpg
+compbrl .png
+compbrl .wav
+compbrl .tar
+compbrl .zip
diff --git a/liblouis/tables/ar-fa.utb b/liblouis/tables/ar-fa.utb
new file mode 100644
index 0000000..7febdc5
--- /dev/null
+++ b/liblouis/tables/ar-fa.utb
@@ -0,0 +1,32 @@
+# liblouis: Generic Farsi Grade 1 table
+#
+# Copyright (C) 2011 by Mesar Hameed <mesar.hameed@gmail.com>
+# Copyright (C) 2011 by Abdolamir Banisaeid <saedjan at gmail.com>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+include ar-ar-g1.utb
+
+# Additional letters not defined in the standard arabic table.
+
+sign \x067E 1234
+sign \x0698 346
+sign \x0686 14
+sign \x06AF 1245
+sign \x06A9 13
+sign \x06CC 24
+
diff --git a/liblouis/tables/ar.tbl b/liblouis/tables/ar.tbl
new file mode 100644
index 0000000..1a8b87d
--- /dev/null
+++ b/liblouis/tables/ar.tbl
@@ -0,0 +1,15 @@
+#+locale:ar
+#+type:literary
+#+grade:1
+
+# TODO: Please correct the metadata above. It is not meant to be
+# accurate nor complete. It hasn't been verified by the table
+# author yet. It is merely an attempt by the liblouis maintainers
+# to get some sensible initial values in place.
+
+# TODO: Please add a reference to official documentation about
+# the implemented braille code. Preferably submit the documents
+# to https://github.com/liblouis/braille-specs.
+
+include ar-ar-g1.utb
+include braille-patterns.cti
diff --git a/liblouis/tables/as-in-g1.utb b/liblouis/tables/as-in-g1.utb
new file mode 100644
index 0000000..42bd319
--- /dev/null
+++ b/liblouis/tables/as-in-g1.utb
@@ -0,0 +1,27 @@
+# This table contains braille codes and rules for Assamese Grade 1 and includes English grade 1
+#
+# Copyright (C) 2014 National Institute for Visually Handicapped, 116, Rajpur Road, Dehradun, Uttrakhand, India
+#
+# This file is part of liblouis.
+#
+# liblouis is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation, either version 2.1 of the
+# License, or (at your option) any later version.
+#
+# liblouis is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with liblouis. If not, see
+# <http://www.gnu.org/licenses/>.
+
+# This table is built and maintained under an activity of Braille Council of India
+# Contributors: Dipendra Manocha, Sreeja, Dinesh Kaushal, Mesar Hameed
+# Last updated on May 5, 2014
+# To report any bugs or any suggestion, please write to d@saksham.org and sreeja.param@gmail.com
+
+include bengali.cti
+include en-in-g1.ctb
diff --git a/liblouis/tables/as.tbl b/liblouis/tables/as.tbl
new file mode 100644
index 0000000..e57e432
--- /dev/null
+++ b/liblouis/tables/as.tbl
@@ -0,0 +1,16 @@
+#+locale:as
+#+type:literary
+#+grade:1
+
+# TODO: Please correct the metadata above. It is not meant to be
+# accurate nor complete. It hasn't been verified by the table
+# author yet. It is merely an attempt by the liblouis maintainers
+# to get some sensible initial values in place.
+
+# TODO: Please add a reference to official documentation about
+# the implemented braille code. Preferably submit the documents
+# to https://github.com/liblouis/braille-specs.
+
+include spaces.ctb
+include as-in-g1.utb
+include braille-patterns.cti
diff --git a/liblouis/tables/aw-in-g1.utb b/liblouis/tables/aw-in-g1.utb
new file mode 100644
index 0000000..8a68e48
--- /dev/null
+++ b/liblouis/tables/aw-in-g1.utb
@@ -0,0 +1,27 @@
+# This table contains braille codes and rules for Awadhi Grade 1 and includes English grade 1
+#
+# Copyright (C) 2014 National Institute for Visually Handicapped, 116, Rajpur Road, Dehradun, Uttrakhand, India
+#
+# This file is part of liblouis.
+#
+# liblouis is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation, either version 2.1 of the
+# License, or (at your option) any later version.
+#
+# liblouis is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with liblouis. If not, see
+# <http://www.gnu.org/licenses/>.
+
+# This table is built and maintained under an activity of Braille Council of India
+# Contributors: Dipendra Manocha, Sreeja, Dinesh Kaushal, Mesar Hamid
+# Last updated on May 5, 2014
+# To report any bugs or any suggestion, please write to d@saksham.org and sreeja.param@gmail.com
+
+include devanagari.cti
+include en-in-g1.ctb
diff --git a/liblouis/tables/awa.tbl b/liblouis/tables/awa.tbl
new file mode 100644
index 0000000..3d4d451
--- /dev/null
+++ b/liblouis/tables/awa.tbl
@@ -0,0 +1,16 @@
+#+locale:awa
+#+type:literary
+#+grade:1
+
+# TODO: Please correct the metadata above. It is not meant to be
+# accurate nor complete. It hasn't been verified by the table
+# author yet. It is merely an attempt by the liblouis maintainers
+# to get some sensible initial values in place.
+
+# TODO: Please add a reference to official documentation about
+# the implemented braille code. Preferably submit the documents
+# to https://github.com/liblouis/braille-specs.
+
+include spaces.ctb
+include aw-in-g1.utb
+include braille-patterns.cti
diff --git a/liblouis/tables/be-in-g1.utb b/liblouis/tables/be-in-g1.utb
new file mode 100644
index 0000000..e8a8cb2
--- /dev/null
+++ b/liblouis/tables/be-in-g1.utb
@@ -0,0 +1,27 @@
+# This table contains braille codes and rules for Bengali Grade 1 and includes English grade 1
+#
+# Copyright (C) 2014 National Institute for Visually Handicapped, 116, Rajpur Road, Dehradun, Uttrakhand, India
+#
+# This file is part of liblouis.
+#
+# liblouis is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation, either version 2.1 of the
+# License, or (at your option) any later version.
+#
+# liblouis is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with liblouis. If not, see
+# <http://www.gnu.org/licenses/>.
+
+# This table is built and maintained under an activity of Braille Council of India
+# Contributors: Dipendra Manocha, Sreeja, Dinesh Kaushal, Mesar Hameed
+# Last updated on May 5, 2014
+# To report any bugs or any suggestion, please write to d@saksham.org and sreeja.param@gmail.com
+
+include bengali.cti
+include en-in-g1.ctb
diff --git a/liblouis/tables/bengali.cti b/liblouis/tables/bengali.cti
new file mode 100644
index 0000000..0bacedb
--- /dev/null
+++ b/liblouis/tables/bengali.cti
@@ -0,0 +1,242 @@
+# This table contains braille codes and rules for Bengali  script.
+#
+# Copyright (C) 2014 National Institute for Visually Handicapped, 116, Rajpur Road, Dehradun, Uttrakhand, India
+#
+# This file is part of liblouis.
+#
+# liblouis is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation, either version 2.1 of the
+# License, or (at your option) any later version.
+#
+# liblouis is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with liblouis. If not, see
+# <http://www.gnu.org/licenses/>.
+
+# This table is built and maintained under an activity of Braille Council of India
+# Contributors: Dipendra Manocha, Sreeja, Dinesh Kaushal, Mesar Hameed
+# Last updated on May 5, 2014
+# To report any bugs or any suggestion, please write to d@saksham.org and sreeja.param@gmail.com
+
+include braille-patterns.cti
+
+letter   \x0981	3	# Bengali Sign Candrabindu
+letter   \x0982	56	# Bengali Sign Anusvara
+letter   \x0983	6	# Bengali Sign Visarga
+letter   \x0985	1	# Bengali Letter A
+letter   \x0986	345	# Bengali Letter AA
+letter   \x0987	24	# Bengali Letter I
+letter   \x0988	35	# Bengali Letter II
+letter   \x0989	136	# Bengali Letter U
+letter   \x098A	1256	# Bengali Letter UU
+letter   \x098B	5-1235	# Bengali Letter Vocalic R
+letter   \x098C	5-123	# Bengali Letter Vocalic L
+letter   \x098F	15	# Bengali Letter E
+letter   \x0990	34	# Bengali Letter AI
+letter   \x0993	135	# Bengali Letter O
+letter   \x0994	246	# Bengali Letter AU
+
+# Consonents
+
+letter   \x0995	13	# Bengali Letter KA
+letter   \x0996	46	# Bengali Letter KHA
+letter   \x0997	1245	# Bengali Letter GA
+letter   \x0998	126	# Bengali Letter GHA
+letter   \x0999	346	# Bengali Letter NGA
+
+letter   \x099A	14	# Bengali Letter CA
+letter   \x099B	16	# Bengali Letter CHA
+letter   \x099C	245	# Bengali Letter JA
+letter   \x099D	356	# Bengali Letter JHA
+letter   \x099E	25	# Bengali Letter NYA
+
+letter   \x099F	23456	# Bengali Letter TTA
+letter   \x09A0	2456	# Bengali Letter TTHA
+letter   \x09A1	1246	# Bengali Letter DDA
+letter   \x09A2	123456	# Bengali Letter DDHA
+letter   \x09A3	3456	# Bengali Letter NNA
+
+letter   \x09A4	2345	# Bengali Letter TA
+letter   \x09A5	1456	# Bengali Letter THA
+letter   \x09A6	145	# Bengali Letter DA
+letter   \x09A7	2346	# Bengali Letter DHA
+letter   \x09A8	1345	# Bengali Letter NA
+
+letter   \x09AA	1234	# Bengali Letter PA
+letter   \x09AB	235	# Bengali Letter PHA
+letter   \x09AC	12	# Bengali Letter BA = Bengali va, wa
+letter   \x09AD	45	# Bengali Letter BHA
+letter   \x09AE	134	# Bengali Letter MA
+letter   \x09AF	13456	# Bengali Letter YA
+letter   \x09B0	1235	# Bengali Letter RA
+letter   \x09B2	123	# Bengali Letter LA
+letter   \x09B6	146	# Bengali Letter SHA
+letter   \x09B7	12346	# Bengali Letter SSA
+letter   \x09B8	234	# Bengali Letter SA
+letter   \x09B9	125	# Bengali Letter HA
+
+letter   \x09BD	2	# Bengali Sign Avagraha
+
+# vowel sign
+
+letter   \x09BE	345	# Bengali vowel sign AA
+letter   \x09BF	24	# Bengali vowel sign I (Stands To The Left Of The Consonant)
+letter   \x09C0	35	# Bengali vowel sign II
+letter   \x09C1	136	# Bengali vowel sign U
+letter   \x09C2	1256	# Bengali vowel sign UU                                                
+letter   \x09C3	5-1235	# Bengali vowel sign VOCALIC R
+letter   \x09C4	6-1235	# Bengali vowel sign VOCALIC RR
+letter   \x09C7	15	# Bengali vowel sign E (stands to the left of the consonant)
+letter   \x09C8	34	# Bengali vowel sign AI (stands to the left of the consonant)
+letter   \x09CB	135	# Bengali vowel sign O = 09C7 and 09BE
+letter   \x09CC	246	# Bengali vowel sign AU = 09C7 and 09D7
+
+letter   \x09CD	  4	# Bengali sign VIRAMA
+
+letter   \x09CE   4-2345    # Bengali letter Khanda TA (a dead consonant form of ta, without implicit vowel, used in some     sequences)
+letter   \x09DC	12456	# Bengali letter RRA =   09A1 and 09BC
+letter   \x09DD	5-12456	# BENGALI LETTER RHA =  09A2 AND  09BC
+letter   \x09DF	26	# BENGALI LETTER YYA =  09AF AND   09BC
+
+letter   \x09E0	6-1235	# BENGALI LETTER VOCALIC RR
+letter   \x09E1	6-123	# BENGALI LETTER VOCALIC LL
+letter   \x09E2	5-123	# BENGALI LETTER VOCALIC L
+letter   \x09E3	6-123	# BENGALIC LETTER VOCALIC LL
+
+# Digits
+
+litdigit   \x09E6	245	# BENGALI DIGIT ZERO
+litdigit   \x09E7	1	# BENGALI DIGIT ONE
+litdigit   \x09E8	12	# BENGALI DIGIT TWO
+litdigit   \x09E9	14	# BENGALI DIGIT THREE
+litdigit   \x09EA	145	# BENGALI DIGIT FOUR
+litdigit   \x09EB	15	# BENGALI DIGIT FIVE
+litdigit   \x09EC	124	# BENGALI DIGIT SIX
+litdigit  \x09ED	1245	# BENGALI DIGIT SEVEN
+litdigit   \x09EE	125	# BENGALI DIGIT EIGHT
+litdigit  \x09EF	24	# BENGALI DIGIT NINE
+
+letter     \x09F0	1235	# BENGALI LETTER RA WITH MIDDLE DIAGONAL (ASSAMESE)
+letter    \x09F1    1236	# BENGALI LETTER RA WITH LOWER DIAGONAL =  BENGALI LETTER VA WITH LOWER DIAGONAL (1.0) ASSAMESE
+
+replace \X200D
+
+# Half characters 
+always	\x0995\x09cD   	4-13	# Bengali Letter KA
+always	\x0996\x09cD   	4-46	# Bengali Letter KHA
+always	\x0997\x09cD   	4-1245	# Bengali Letter GA
+always	\x0998\x09cD   	4-126	# Bengali Letter GHA
+always	\x0999\x09cD   	4-346	# Bengali Letter NGA
+
+always	\x099A\x09cD   	4-14	# Bengali Letter CA
+always	\x099B\x09cD   	4-16	# Bengali Letter CHA
+always	\x099C\x09cD   	4-245	# Bengali Letter JA
+always	\x099D\x09cD   	4-356	# Bengali Letter JHA
+always	\x099E\x09cD   	4-25	# Bengali Letter NYA
+
+always	\x099F\x09cD   	4-23456	# Bengali Letter TTA
+always	\x09A0\x09cD   	4-2456	# Bengali Letter TTHA
+always	\x09A1\x09cD   	4-1246	# Bengali Letter DDA
+always	\x09A2\x09cD   	4-123456	# Bengali Letter DDHA
+always	\x09A3\x09cD   	4-3456	# Bengali Letter NNA
+
+always	\x09A4\x09cD   	4-2345	# Bengali Letter TA
+always	\x09A5\x09cD   	4-1456	# Bengali Letter THA
+always	\x09A6\x09cD   	4-145	# Bengali Letter DA
+always	\x09A7\x09cD   	4-2346	# Bengali Letter DHA
+always	\x09A8\x09cD   	4-1345	# Bengali Letter NA
+
+always	\x09AA\x09cD   	4-1234	# Bengali Letter PA
+always	\x09AB\x09cD   	4-235	# Bengali Letter PHA
+always	\x09AC\x09cD   	4-12	# Bengali Letter BA =  Bengali va, wa
+always	\x09AD\x09cD   	4-45	# Bengali Letter BHA
+always	\x09AE\x09cD   	4-134	# Bengali Letter MA
+
+always	\x09AF\x09cD   	4-13456	# Bengali Letter YA
+always	\x09B0\x09cD   	4-1235	# Bengali Letter RA
+always	\x09B2\x09cD   	4-123	# Bengali Letter LA
+always	\x09B6\x09cD   	4-146	# Bengali Letter SHA
+always	\x09B7\x09cD   	4-12346	# Bengali Letter SSA
+always	\x09B8\x09cD   	4-234	# Bengali Letter SA
+always	\x09B9\x09cD   	4-125	# Bengali Letter HA
+
+
+always	\x09C4\x09cD   	4-6-1235	# Bengali vowel sign VOCALIC RR
+always	\x09CE\x09cD   	4-4-2345	# Bengali letter Khanda TA (a dead consonant form of ta, without implicit vowel, used in some sequences)
+always	\x09DC\x09cD   	4-12456	# Bengali letter RRA = 09A1 and 09BC
+always	\x09DF\x09cD   	4-26	# BENGALI LETTER YYA = 09AF AND 09BC
+always	\x09E0\x09cD   	4-6-1235	# BENGALI LETTER VOCALIC RR
+always	\x09E1\x09cD   	4-6-123	# BENGALI LETTER VOCALIC LL
+always	\x09E2\x09cD   	4-5-123	# BENGALI LETTER VOCALIC L
+always	\x09E3\x09cD   	4-6-123	# BENGALIC LETTER VOCALIC LL
+always	\x09F0\x09cD   	4-1235	# BENGALI LETTER RA WITH MIDDLE DIAGONAL (ASSAMESE)
+always	\x09F1\x09cD   	4-1236	# BENGALI LETTER RA WITH LOWER DIAGONAL =  BENGALI LETTER VA WITH LOWER DIAGONAL (1.0) ASSAMESE
+
+ # ksha and gya
+
+
+ 
+ always \x0995\x09CD\x09B7\x09CD 4-12345 #"ksha"
+ always \x099C\x09CD\x099E  156 #"gyan"
+ always \x0995\x09CD\x09B7 12345 #"ksha"
+ 
+   # consonent followed by vowel but not matra
+   
+   class BengaliVowel \x0985\x0986\x0987\x0988\x0989\x0985\x098A\x098B\x098C\x098F\x0990\x0993\x0994
+   class HALANT \x09CD
+   
+   
+
+
+before BengaliVowel always \x0995 13-1 # Bengali ka
+before BengaliVowel always \x0996 46-1 # Bengali kha
+before BengaliVowel always \x0997 1245-1 # Bengali ga
+before BengaliVowel always \x0998 126-1 # Bengali gha
+
+#before HALANT always \x0995  4-13 # Bengali ka
+
+before BengaliVowel always \x099A 14-1 # Bengali ca
+before BengaliVowel always \x099B 16-1 # Bengali cha
+before BengaliVowel always \x099C 245-1 # Bengali ja
+before BengaliVowel always \x099D 356-1 # Bengali jha
+
+before BengaliVowel always \x099F 23456-1 # Bengali ta
+before BengaliVowel always \x09A0 2456-1 # Bengali tha
+before BengaliVowel always \x09A1 1246-1 # Bengali da
+before BengaliVowel always \x09A2 123456-1 # Bengali dha
+before BengaliVowel always \x09A3 3456-1 #Bengali nna
+
+before BengaliVowel always \x09A4 2345-1 # Bengali ta
+before BengaliVowel always \x09A5 1456-1 # Bengali tha
+before BengaliVowel always \x09A6 145-1 # Bengali da
+before BengaliVowel always \x09A7 2346-1 # Bengali dha
+before BengaliVowel always \x09A8 1345-1 #Bengali na
+
+before BengaliVowel always \x09AA 1234-1 # Bengali pa
+before BengaliVowel always \x09AB 235-1 # Bengali pha
+before BengaliVowel always \x09AC 12-1 # Bengali ba
+before BengaliVowel always \x09AD 45-1 # Bengali bha
+before BengaliVowel always \x09AE 134-1 #Bengali ma
+
+before BengaliVowel always \x09AF 13456-1 # Bengali yaa
+before BengaliVowel always \x09B0 1235-1 # Bengali ra
+before BengaliVowel always \x09B2 123-1 # Bengali la
+before BengaliVowel always \x09B6 146-1 #Bengali sha
+before BengaliVowel always \x09B7 12346-1 #Bengali ssha
+before BengaliVowel always \x09B8 234-1 #Bengali sa
+before BengaliVowel always \x09B9 125-1 #Bengali ha
+
+ before BengaliVowel always	\x09C4 	6-1235-1	# Bengali vowel sign VOCALIC RR
+ before BengaliVowel always	\x09CE 	2345-1	# Bengali letter Khanda TA (a dead consonant form of ta, without implicit vowel, used in some sequences)
+ before BengaliVowel always	\x09DC 	12456-1	# Bengali letter RRA = 09A1 and 09BC
+ before BengaliVowel always	\x09DF 	26-1	# BENGALI LETTER YYA = 09AF AND 09BC
+ before BengaliVowel always	\x09E0 	6-1235-1	# BENGALI LETTER VOCALIC RR
+ before BengaliVowel always	\x09E1 	6-123-1	# BENGALI LETTER VOCALIC LL
+ before BengaliVowel always	\x09E3 	6-123-1	# BENGALIC LETTER VOCALIC LL
+ before BengaliVowel always	\x09F0 	1235-1	# BENGALI LETTER RA WITH MIDDLE DIAGONAL (ASSAMESE)
+ before BengaliVowel always	\x09F1 	1236-1	# BENGALI LETTER RA WITH LOWER DIAGONAL =  BENGALI LETTER VA WITH LOWER DIAGONAL (1.0) ASSAMESE
diff --git a/liblouis/tables/bg.ctb b/liblouis/tables/bg.ctb
new file mode 100644
index 0000000..9532424
--- /dev/null
+++ b/liblouis/tables/bg.ctb
@@ -0,0 +1,189 @@
+#
+# Copyright (C) 1995-2008 by The BRLTTY Developers.
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+
+# BRLTTY Text Table - Bulgarian
+#
+# Samuel Thibault <samuel.thibault@ens-lyon.org>
+# 
+# This table is based on the Unesco report on the progress of unification of
+# braille writing « L'ÉCRITURE BRAILLE DANS LE MONDE », by Sir Clutha
+# MACKENZIE: http://unesdoc.unesco.org/images/0013/001352/135251fo.pdf
+# The document is dated 1954, so this table may be quite outdated.
+#  Edited on Mar 10 2013 by Rumiana Kamenska <rkamenska@gmail.com>
+# to meet modern standards.
+# Added latinn letters.
+#
+# generated by ttbtest
+
+#Punctuation and symbols 
+space \s 0		SPACE
+space \t 9 tab
+space \s 0 blank
+space \x00a0 a unbreakable space
+sign \x000a 78 newline
+space \x000d 0 carriage return
+punctuation ! 235		EXCLAMATION MARK
+punctuation " 236		QUOTATION MARK
+punctuation ' 3		APOSTROPHE
+punctuation ( 126		LEFT PARENTHESIS
+punctuation ) 345		RIGHT PARENTHESIS
+punctuation , 2		COMMA
+punctuation - 36		HYPHEN-MINUS
+punctuation . 256		FULL STOP
+punctuation : 25		COLON
+punctuation ; 23		SEMICOLON
+punctuation ? 26		QUESTION MARK
+punctuation \x00a0 0		NO-BREAK SPACE
+sign _ 456
+math < 246
+math = 2345
+math > 135
+sign % 356
+math + 235
+math ~ 346
+sign ` 4
+sign & 12346
+sign $ 1246
+punctuation { 246
+punctuation [ 1235678
+punctuation } 135
+punctuation ] 2345678
+sign ^ 34
+sign @ 2346
+sign # 346
+sign \\ 16
+sign | 1456
+math / 34
+sign * 35
+
+# Digits
+digit 0 3568		DIGIT ZERO
+digit 1 28		DIGIT ONE
+digit 2 238		DIGIT TWO
+digit 3 258		DIGIT THREE
+digit 4 2568		DIGIT FOUR
+digit 5 268		DIGIT FIVE
+digit 6 2358		DIGIT SIX
+digit 7 23568		DIGIT SEVEN
+digit 8 2368		DIGIT EIGHT
+digit 9 358		DIGIT NINE
+
+#Cyrillic  letters
+uppercase \x0401 167		CYRILLIC CAPITAL LETTER IO
+uppercase \x0410 17		CYRILLIC CAPITAL LETTER A
+uppercase \x0411 127		CYRILLIC CAPITAL LETTER BE
+uppercase \x0412 24567		CYRILLIC CAPITAL LETTER VE
+uppercase \x0413 12457		CYRILLIC CAPITAL LETTER GHE
+uppercase \x0414 1457		CYRILLIC CAPITAL LETTER DE
+uppercase \x0415 157		CYRILLIC CAPITAL LETTER IE
+uppercase \x0416 2457		CYRILLIC CAPITAL LETTER ZHE
+uppercase \x0417 13567		CYRILLIC CAPITAL LETTER ZE
+uppercase \x0418 247		CYRILLIC CAPITAL LETTER I
+uppercase \x0419 134567		CYRILLIC CAPITAL LETTER SHORT I
+uppercase \x041a 137		CYRILLIC CAPITAL LETTER KA
+uppercase \x041b 1237		CYRILLIC CAPITAL LETTER EL
+uppercase \x041c 1347		CYRILLIC CAPITAL LETTER EM
+uppercase \x041d 13457		CYRILLIC CAPITAL LETTER EN
+uppercase \x041e 1357		CYRILLIC CAPITAL LETTER O
+uppercase \x041f 12347		CYRILLIC CAPITAL LETTER PE
+uppercase \x0420 12357		CYRILLIC CAPITAL LETTER ER
+uppercase \x0421 2347		CYRILLIC CAPITAL LETTER ES
+uppercase \x0422 23457		CYRILLIC CAPITAL LETTER TE
+uppercase \x0423 1367		CYRILLIC CAPITAL LETTER U
+uppercase \x0424 1247		CYRILLIC CAPITAL LETTER EF
+uppercase \x0425 1257		CYRILLIC CAPITAL LETTER HA
+uppercase \x0426 147		CYRILLIC CAPITAL LETTER TSE
+uppercase \x0427 123457		CYRILLIC CAPITAL LETTER CHE
+uppercase \x0428 1567		CYRILLIC CAPITAL LETTER SHA
+uppercase \x0429 13467		CYRILLIC CAPITAL LETTER SHCHA
+uppercase \x042a 123567		CYRILLIC CAPITAL LETTER HARD SIGN
+uppercase \x042b 23467		CYRILLIC CAPITAL LETTER YERU
+uppercase \x042c 234567		CYRILLIC CAPITAL LETTER SOFT SIGN
+uppercase \x042d 2467		CYRILLIC CAPITAL LETTER E
+uppercase \x042e 12567		CYRILLIC CAPITAL LETTER YU
+uppercase \x042f 12467		CYRILLIC CAPITAL LETTER YA
+lowercase \x0430 1		CYRILLIC SMALL LETTER A
+lowercase \x0431 12		CYRILLIC SMALL LETTER BE
+lowercase \x0432 2456		CYRILLIC SMALL LETTER VE
+lowercase \x0433 1245		CYRILLIC SMALL LETTER GHE
+lowercase \x0434 145		CYRILLIC SMALL LETTER DE
+lowercase \x0435 15		CYRILLIC SMALL LETTER IE
+lowercase \x0436 245		CYRILLIC SMALL LETTER ZHE
+lowercase \x0437 1356		CYRILLIC SMALL LETTER ZE
+lowercase \x0438 24		CYRILLIC SMALL LETTER I
+lowercase \x0439 13456		CYRILLIC SMALL LETTER SHORT I
+lowercase \x043a 13		CYRILLIC SMALL LETTER KA
+lowercase \x043b 123		CYRILLIC SMALL LETTER EL
+lowercase \x043c 134		CYRILLIC SMALL LETTER EM
+lowercase \x043d 1345		CYRILLIC SMALL LETTER EN
+lowercase \x043e 135		CYRILLIC SMALL LETTER O
+lowercase \x043f 1234		CYRILLIC SMALL LETTER PE
+lowercase \x0440 1235		CYRILLIC SMALL LETTER ER
+lowercase \x0441 234		CYRILLIC SMALL LETTER ES
+lowercase \x0442 2345		CYRILLIC SMALL LETTER TE
+lowercase \x0443 136		CYRILLIC SMALL LETTER U
+lowercase \x0444 124		CYRILLIC SMALL LETTER EF
+lowercase \x0445 125		CYRILLIC SMALL LETTER HA
+lowercase \x0446 14		CYRILLIC SMALL LETTER TSE
+lowercase \x0447 12345		CYRILLIC SMALL LETTER CHE
+lowercase \x0448 156		CYRILLIC SMALL LETTER SHA
+lowercase \x0449 1346		CYRILLIC SMALL LETTER SHCHA
+lowercase \x044a 12356		CYRILLIC SMALL LETTER HARD SIGN
+lowercase \x044b 2346		CYRILLIC SMALL LETTER YERU
+lowercase \x044c 23456		CYRILLIC SMALL LETTER SOFT SIGN
+lowercase \x044d 246		CYRILLIC SMALL LETTER E
+lowercase \x044e 1256		CYRILLIC SMALL LETTER YU
+lowercase \x044f 1246		CYRILLIC SMALL LETTER YA
+lowercase \x0451 16		CYRILLIC SMALL LETTER IO
+uppercase \x0462 3457		CYRILLIC CAPITAL LETTER YAT
+lowercase \x0463 345		CYRILLIC SMALL LETTER YAT
+uppercase \x046a 2467		CYRILLIC CAPITAL LETTER BIG YUS
+lowercase \x046b 246		CYRILLIC SMALL LETTER BIG YUS
+
+# Latin letters
+uplow Aa 178,18
+uplow Bb 1278,128
+uplow Cc 1478,148
+uplow Dd 14578,1458
+uplow Ee 1578,158
+uplow Ff 12478,1248
+uplow Gg 124578,12458
+uplow Hh 12578,1258
+uplow Ii 2478,248
+uplow Jj 24578,2458
+uplow Kk 1378,138
+uplow Ll 12378,1238
+uplow Mm 13478,1348
+uplow Nn 134578,13458
+uplow Oo 13578,1358
+uplow Pp 123478,12348
+uplow Qq 1234578,123458
+uplow Rr 123578,12358
+uplow Ss 23478,2348
+uplow Tt 234578,23458
+uplow Uu 13678,1368
+uplow Vv 123678,12368
+uplow Ww 245678,24568
+uplow Xx 134678,13468
+uplow Yy 1345678,134568
+uplow Zz 135678,13568
+
+# Miscellaneous
+noback sign \x25CF 35 BLACK CIRCLE
diff --git a/liblouis/tables/bg.tbl b/liblouis/tables/bg.tbl
new file mode 100644
index 0000000..0db3041
--- /dev/null
+++ b/liblouis/tables/bg.tbl
@@ -0,0 +1,15 @@
+#+locale:bg
+#+type:computer
+#+dots:8
+
+# TODO: Please correct the metadata above. It is not meant to be
+# accurate nor complete. It hasn't been verified by the table
+# author yet. It is merely an attempt by the liblouis maintainers
+# to get some sensible initial values in place.
+
+# TODO: Please add a reference to official documentation about
+# the implemented braille code. Preferably submit the documents
+# to https://github.com/liblouis/braille-specs.
+
+include bg.ctb
+include braille-patterns.cti
diff --git a/liblouis/tables/bh.ctb b/liblouis/tables/bh.ctb
new file mode 100644
index 0000000..9e64b1a
--- /dev/null
+++ b/liblouis/tables/bh.ctb
@@ -0,0 +1,22 @@
+#  Copyright (C) 2010 Leon Ungier <Leon.Ungier@ViewPlus.com>, 
+#  Copyright (C) 2010 Samuel Thibault <samuel.thibault@ens-lyon.org>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+# Table for Bihari
+include devanagari.cti
+include text_nabcc.dis
diff --git a/liblouis/tables/bh.tbl b/liblouis/tables/bh.tbl
new file mode 100644
index 0000000..332bbb9
--- /dev/null
+++ b/liblouis/tables/bh.tbl
@@ -0,0 +1,15 @@
+#+locale:bh
+#+type:literary
+
+# TODO: Please correct the metadata above. It is not meant to be
+# accurate nor complete. It hasn't been verified by the table
+# author yet. It is merely an attempt by the liblouis maintainers
+# to get some sensible initial values in place.
+
+# TODO: Please add a reference to official documentation about
+# the implemented braille code. Preferably submit the documents
+# to https://github.com/liblouis/braille-specs.
+
+include spaces.ctb
+include bh.ctb
+include braille-patterns.cti
diff --git a/liblouis/tables/bn.tbl b/liblouis/tables/bn.tbl
new file mode 100644
index 0000000..379de21
--- /dev/null
+++ b/liblouis/tables/bn.tbl
@@ -0,0 +1,16 @@
+#+locale:bn
+#+type:literary
+#+grade:1
+
+# TODO: Please correct the metadata above. It is not meant to be
+# accurate nor complete. It hasn't been verified by the table
+# author yet. It is merely an attempt by the liblouis maintainers
+# to get some sensible initial values in place.
+
+# TODO: Please add a reference to official documentation about
+# the implemented braille code. Preferably submit the documents
+# to https://github.com/liblouis/braille-specs.
+
+include spaces.ctb
+include be-in-g1.utb
+include braille-patterns.cti
diff --git a/liblouis/tables/bo.ctb b/liblouis/tables/bo.ctb
new file mode 100644
index 0000000..0e6758c
--- /dev/null
+++ b/liblouis/tables/bo.ctb
@@ -0,0 +1,184 @@
+#
+# Copyright (C) 1995-2009 by The BRLTTY Developers.
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+# BRLTTY Text Table - Tibetan
+#
+# Samuel Thibault <samuel.thibault@ens-lyon.org>
+#
+# From "Braille without borders"
+
+# generated by ttbtest
+space	\s	0	# SPACE
+punctuation	!	2358	# EXCLAMATION MARK
+punctuation	"	23568	# QUOTATION MARK
+punctuation	#	34568	# NUMBER SIGN
+punctuation	$	12468	# DOLLAR SIGN
+punctuation	%	1468	# PERCENT SIGN
+punctuation	&	23468	# AMPERSAND
+punctuation	'	3	# APOSTROPHE
+punctuation	(	2368	# LEFT PARENTHESIS
+punctuation	)	3568	# RIGHT PARENTHESIS
+punctuation	*	358	# ASTERISK
+punctuation	+	3468	# PLUS SIGN
+punctuation	,	28	# COMMA
+punctuation	-	36	# HYPHEN-MINUS
+punctuation	.	2568	# FULL STOP
+punctuation	/	348	# SOLIDUS
+include loweredDigits6Dots.uti
+punctuation	:	258	# COLON
+punctuation	;	238	# SEMICOLON
+punctuation	<	1268	# LESS-THAN SIGN
+punctuation	=	1234568	# EQUALS SIGN
+punctuation	>	3458	# GREATER-THAN SIGN
+punctuation	?	268	# QUESTION MARK
+punctuation	@	47	# COMMERCIAL AT
+uppercase	A	178	# LATIN CAPITAL LETTER A
+uppercase	B	1278	# LATIN CAPITAL LETTER B
+uppercase	C	1478	# LATIN CAPITAL LETTER C
+uppercase	D	14578	# LATIN CAPITAL LETTER D
+uppercase	E	1578	# LATIN CAPITAL LETTER E
+uppercase	F	12478	# LATIN CAPITAL LETTER F
+uppercase	G	124578	# LATIN CAPITAL LETTER G
+uppercase	H	12578	# LATIN CAPITAL LETTER H
+uppercase	I	2478	# LATIN CAPITAL LETTER I
+uppercase	J	24578	# LATIN CAPITAL LETTER J
+uppercase	K	1378	# LATIN CAPITAL LETTER K
+uppercase	L	12378	# LATIN CAPITAL LETTER L
+uppercase	M	13478	# LATIN CAPITAL LETTER M
+uppercase	N	134578	# LATIN CAPITAL LETTER N
+uppercase	O	13578	# LATIN CAPITAL LETTER O
+uppercase	P	123478	# LATIN CAPITAL LETTER P
+uppercase	Q	1234578	# LATIN CAPITAL LETTER Q
+uppercase	R	123578	# LATIN CAPITAL LETTER R
+uppercase	S	23478	# LATIN CAPITAL LETTER S
+uppercase	T	234578	# LATIN CAPITAL LETTER T
+uppercase	U	13678	# LATIN CAPITAL LETTER U
+uppercase	V	123678	# LATIN CAPITAL LETTER V
+uppercase	W	245678	# LATIN CAPITAL LETTER W
+uppercase	X	134678	# LATIN CAPITAL LETTER X
+uppercase	Y	1345678	# LATIN CAPITAL LETTER Y
+uppercase	Z	135678	# LATIN CAPITAL LETTER Z
+punctuation	[	123568	# LEFT SQUARE BRACKET
+punctuation	\\	168	# REVERSE SOLIDUS
+punctuation	]	234568	# RIGHT SQUARE BRACKET
+punctuation	^	457	# CIRCUMFLEX ACCENT
+punctuation	_	456	# LOW LINE
+punctuation	`	4	# GRAVE ACCENT
+lowercase	a	18	# LATIN SMALL LETTER A
+lowercase	b	128	# LATIN SMALL LETTER B
+lowercase	c	148	# LATIN SMALL LETTER C
+lowercase	d	1458	# LATIN SMALL LETTER D
+lowercase	e	158	# LATIN SMALL LETTER E
+lowercase	f	1248	# LATIN SMALL LETTER F
+lowercase	g	12458	# LATIN SMALL LETTER G
+lowercase	h	1258	# LATIN SMALL LETTER H
+lowercase	i	248	# LATIN SMALL LETTER I
+lowercase	j	2458	# LATIN SMALL LETTER J
+lowercase	k	138	# LATIN SMALL LETTER K
+lowercase	l	1238	# LATIN SMALL LETTER L
+lowercase	m	1348	# LATIN SMALL LETTER M
+lowercase	n	13458	# LATIN SMALL LETTER N
+lowercase	o	1358	# LATIN SMALL LETTER O
+lowercase	p	12348	# LATIN SMALL LETTER P
+lowercase	q	123458	# LATIN SMALL LETTER Q
+lowercase	r	12358	# LATIN SMALL LETTER R
+lowercase	s	2348	# LATIN SMALL LETTER S
+lowercase	t	23458	# LATIN SMALL LETTER T
+lowercase	u	1368	# LATIN SMALL LETTER U
+lowercase	v	12368	# LATIN SMALL LETTER V
+lowercase	w	24568	# LATIN SMALL LETTER W
+lowercase	x	13468	# LATIN SMALL LETTER X
+lowercase	y	134568	# LATIN SMALL LETTER Y
+lowercase	z	13568	# LATIN SMALL LETTER Z
+punctuation	{	23678	# LEFT CURLY BRACKET
+punctuation	|	12568	# VERTICAL LINE
+punctuation	}	35678	# RIGHT CURLY BRACKET
+punctuation	~	45	# TILDE
+punctuation	\x00a0	0	# NO-BREAK SPACE
+letter	\x0f40	13	# TIBETAN LETTER KA
+letter	\x0f41	14	# TIBETAN LETTER KHA
+letter	\x0f42	1245	# TIBETAN LETTER GA
+letter	\x0f44	2356	# TIBETAN LETTER NGA
+letter	\x0f45	1456	# TIBETAN LETTER CA
+letter	\x0f46	13456	# TIBETAN LETTER CHA
+letter	\x0f47	12345	# TIBETAN LETTER JA
+letter	\x0f49	345	# TIBETAN LETTER NYA
+letter	\x0f4f	2345	# TIBETAN LETTER TA
+letter	\x0f50	23456	# TIBETAN LETTER THA
+letter	\x0f51	145	# TIBETAN LETTER DA
+letter	\x0f53	1345	# TIBETAN LETTER NA
+letter	\x0f54	1234	# TIBETAN LETTER PA
+letter	\x0f55	12346	# TIBETAN LETTER PHA
+letter	\x0f56	12	# TIBETAN LETTER BA
+letter	\x0f58	134	# TIBETAN LETTER MA
+letter	\x0f59	1346	# TIBETAN LETTER TSA
+letter	\x0f5a	1356	# TIBETAN LETTER TSHA
+letter	\x0f5b	123456	# TIBETAN LETTER DZA
+letter	\x0f5d	2456	# TIBETAN LETTER WA
+letter	\x0f5e	146	# TIBETAN LETTER ZHA
+letter	\x0f5f	234	# TIBETAN LETTER ZA
+letter	\x0f60	1246	# TIBETAN LETTER -A
+letter	\x0f61	245	# TIBETAN LETTER YA
+letter	\x0f62	1235	# TIBETAN LETTER RA
+letter	\x0f63	123	# TIBETAN LETTER LA
+letter	\x0f64	156	# TIBETAN LETTER SHA
+letter	\x0f66	2346	# TIBETAN LETTER SA
+letter	\x0f67	125	# TIBETAN LETTER HA
+letter	\x0f68	1	# TIBETAN LETTER A
+letter	\x0f90	13	# TIBETAN SUBJOINED LETTER KA
+letter	\x0f91	14	# TIBETAN SUBJOINED LETTER KHA
+letter	\x0f92	1245	# TIBETAN SUBJOINED LETTER GA
+letter	\x0f94	2356	# TIBETAN SUBJOINED LETTER NGA
+letter	\x0f95	1456	# TIBETAN SUBJOINED LETTER CA
+letter	\x0f96	13456	# TIBETAN SUBJOINED LETTER CHA
+letter	\x0f97	12345	# TIBETAN SUBJOINED LETTER JA
+letter	\x0f99	345	# TIBETAN SUBJOINED LETTER NYA
+letter	\x0f9f	2345	# TIBETAN SUBJOINED LETTER TA
+letter	\x0fa0	23456	# TIBETAN SUBJOINED LETTER THA
+letter	\x0fa1	145	# TIBETAN SUBJOINED LETTER DA
+letter	\x0fa3	1345	# TIBETAN SUBJOINED LETTER NA
+letter	\x0fa4	1234	# TIBETAN SUBJOINED LETTER PA
+letter	\x0fa5	12346	# TIBETAN SUBJOINED LETTER PHA
+letter	\x0fa6	12	# TIBETAN SUBJOINED LETTER BA
+letter	\x0fa8	134	# TIBETAN SUBJOINED LETTER MA
+letter	\x0fa9	1346	# TIBETAN SUBJOINED LETTER TSA
+letter	\x0faa	1356	# TIBETAN SUBJOINED LETTER TSHA
+letter	\x0fab	123456	# TIBETAN SUBJOINED LETTER DZA
+letter	\x0fad	2456	# TIBETAN SUBJOINED LETTER WA
+letter	\x0fae	146	# TIBETAN SUBJOINED LETTER ZHA
+letter	\x0faf	234	# TIBETAN SUBJOINED LETTER ZA
+letter	\x0fb0	1246	# TIBETAN SUBJOINED LETTER -A
+letter	\x0fb1	245	# TIBETAN SUBJOINED LETTER YA
+letter	\x0fb2	1235	# TIBETAN SUBJOINED LETTER RA
+letter	\x0fb3	123	# TIBETAN SUBJOINED LETTER LA
+letter	\x0fb4	156	# TIBETAN SUBJOINED LETTER SHA
+letter	\x0fb6	2346	# TIBETAN SUBJOINED LETTER SA
+letter	\x0fb7	125	# TIBETAN SUBJOINED LETTER HA
+letter	\x0fb8	1	# TIBETAN SUBJOINED LETTER A
+space	\x2002	0	# EN SPACE
+space	\x2003	0	# EM SPACE
+space	\x2004	0	# THREE-PER-EM SPACE
+space	\x2005	0	# FOUR-PER-EM SPACE
+space	\x2006	0	# SIX-PER-EM SPACE
+punctuation	\x2007	0	# FIGURE SPACE
+space	\x2008	0	# PUNCTUATION SPACE
+space	\x2009	0	# THIN SPACE
+space	\x200a	0	# HAIR SPACE
+punctuation	\x202f	0	# NARROW NO-BREAK SPACE
+space	\x205f	0	# MEDIUM MATHEMATICAL SPACE
diff --git a/liblouis/tables/bo.tbl b/liblouis/tables/bo.tbl
new file mode 100644
index 0000000..eeff15d
--- /dev/null
+++ b/liblouis/tables/bo.tbl
@@ -0,0 +1,15 @@
+#+locale:bo
+#+type:computer
+#+dots:8
+
+# TODO: Please correct the metadata above. It is not meant to be
+# accurate nor complete. It hasn't been verified by the table
+# author yet. It is merely an attempt by the liblouis maintainers
+# to get some sensible initial values in place.
+
+# TODO: Please add a reference to official documentation about
+# the implemented braille code. Preferably submit the documents
+# to https://github.com/liblouis/braille-specs.
+
+include bo.ctb
+include braille-patterns.cti
diff --git a/liblouis/tables/boxes.ctb b/liblouis/tables/boxes.ctb
new file mode 100644
index 0000000..b4ee015
--- /dev/null
+++ b/liblouis/tables/boxes.ctb
@@ -0,0 +1,162 @@
+#
+# Copyright (C) 1995-2008 by The BRLTTY Developers.
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+# This BRLTTY text subtable implements a portable representation of the box
+# drawing characters.aNo distinction is made between the three types of boxes:
+# light, heavy, and double. Characters with no vertical component (horizontal
+# edges) are represented by the four middle dots [2356]. Those with a vertical
+# component above the center (e.g. bottom corners) add the two top dots [14],
+# and those with a vertical component below the center (e.g. top corners) add
+# the two bottom dots [78]. This means, for example, that side edges and the
+# cross are represented by a full cell [12345678].
+
+# For diagonals within boxes, the top-left and bottom-right dots [18] are used
+# to represent the line which descends toward the right, and the top-right and
+# bottom-left dots [47] are used to represent the line which ascends toward the
+# right. The X is represented by all four of these dots [1478].
+
+# generated by ttbtest
+punctuation \x2500 2356		BOX DRAWINGS LIGHT HORIZONTAL
+punctuation \x2501 2356		BOX DRAWINGS HEAVY HORIZONTAL
+punctuation \x2502 12345678		BOX DRAWINGS LIGHT VERTICAL
+punctuation \x2503 12345678		BOX DRAWINGS HEAVY VERTICAL
+punctuation \x2504 2356		BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+punctuation \x2505 2356		BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+punctuation \x2506 12345678		BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+punctuation \x2507 12345678		BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+punctuation \x2508 2356		BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+punctuation \x2509 2356		BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+punctuation \x250a 12345678		BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+punctuation \x250b 12345678		BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+punctuation \x250c 235678		BOX DRAWINGS LIGHT DOWN AND RIGHT
+punctuation \x250d 235678		BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+punctuation \x250e 235678		BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+punctuation \x250f 235678		BOX DRAWINGS HEAVY DOWN AND RIGHT
+punctuation \x2510 235678		BOX DRAWINGS LIGHT DOWN AND LEFT
+punctuation \x2511 235678		BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+punctuation \x2512 235678		BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+punctuation \x2513 235678		BOX DRAWINGS HEAVY DOWN AND LEFT
+punctuation \x2514 123456		BOX DRAWINGS LIGHT UP AND RIGHT
+punctuation \x2515 123456		BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+punctuation \x2516 123456		BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+punctuation \x2517 123456		BOX DRAWINGS HEAVY UP AND RIGHT
+punctuation \x2518 123456		BOX DRAWINGS LIGHT UP AND LEFT
+punctuation \x2519 123456		BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+punctuation \x251a 123456		BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+punctuation \x251b 123456		BOX DRAWINGS HEAVY UP AND LEFT
+punctuation \x251c 12345678		BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+punctuation \x251d 12345678		BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+punctuation \x251e 12345678		BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+punctuation \x251f 12345678		BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+punctuation \x2520 12345678		BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+punctuation \x2521 12345678		BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+punctuation \x2522 12345678		BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+punctuation \x2523 12345678		BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+punctuation \x2524 12345678		BOX DRAWINGS LIGHT VERTICAL AND LEFT
+punctuation \x2525 12345678		BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+punctuation \x2526 12345678		BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+punctuation \x2527 12345678		BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+punctuation \x2528 12345678		BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+punctuation \x2529 12345678		BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+punctuation \x252a 12345678		BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+punctuation \x252b 12345678		BOX DRAWINGS HEAVY VERTICAL AND LEFT
+punctuation \x252c 235678		BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+punctuation \x252d 235678		BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+punctuation \x252e 235678		BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+punctuation \x252f 235678		BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+punctuation \x2530 235678		BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+punctuation \x2531 235678		BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+punctuation \x2532 235678		BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+punctuation \x2533 235678		BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+punctuation \x2534 123456		BOX DRAWINGS LIGHT UP AND HORIZONTAL
+punctuation \x2535 123456		BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+punctuation \x2536 123456		BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+punctuation \x2537 123456		BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+punctuation \x2538 123456		BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+punctuation \x2539 123456		BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+punctuation \x253a 123456		BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+punctuation \x253b 123456		BOX DRAWINGS HEAVY UP AND HORIZONTAL
+punctuation \x253c 12345678		BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+punctuation \x253d 12345678		BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+punctuation \x253e 12345678		BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+punctuation \x253f 12345678		BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+punctuation \x2540 12345678		BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+punctuation \x2541 12345678		BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+punctuation \x2542 12345678		BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+punctuation \x2543 12345678		BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+punctuation \x2544 12345678		BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+punctuation \x2545 12345678		BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+punctuation \x2546 12345678		BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+punctuation \x2547 12345678		BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+punctuation \x2548 12345678		BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+punctuation \x2549 12345678		BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+punctuation \x254a 12345678		BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+punctuation \x254b 12345678		BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+punctuation \x254c 2356		BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+punctuation \x254d 2356		BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+punctuation \x254e 12345678		BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+punctuation \x254f 12345678		BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+punctuation \x2550 2356		BOX DRAWINGS DOUBLE HORIZONTAL
+punctuation \x2551 12345678		BOX DRAWINGS DOUBLE VERTICAL
+punctuation \x2552 235678		BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+punctuation \x2553 235678		BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+punctuation \x2554 235678		BOX DRAWINGS DOUBLE DOWN AND RIGHT
+punctuation \x2555 235678		BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+punctuation \x2556 235678		BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+punctuation \x2557 235678		BOX DRAWINGS DOUBLE DOWN AND LEFT
+punctuation \x2558 123456		BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+punctuation \x2559 123456		BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+punctuation \x255a 123456		BOX DRAWINGS DOUBLE UP AND RIGHT
+punctuation \x255b 123456		BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+punctuation \x255c 123456		BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+punctuation \x255d 123456		BOX DRAWINGS DOUBLE UP AND LEFT
+punctuation \x255e 12345678		BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+punctuation \x255f 12345678		BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+punctuation \x2560 12345678		BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+punctuation \x2561 12345678		BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+punctuation \x2562 12345678		BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+punctuation \x2563 12345678		BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+punctuation \x2564 235678		BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+punctuation \x2565 235678		BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+punctuation \x2566 235678		BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+punctuation \x2567 123456		BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+punctuation \x2568 123456		BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+punctuation \x2569 123456		BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+punctuation \x256a 12345678		BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+punctuation \x256b 12345678		BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+punctuation \x256c 12345678		BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+punctuation \x256d 235678		BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+punctuation \x256e 235678		BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+punctuation \x256f 123456		BOX DRAWINGS LIGHT ARC UP AND LEFT
+punctuation \x2570 123456		BOX DRAWINGS LIGHT ARC UP AND RIGHT
+punctuation \x2571 47		BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+punctuation \x2572 18		BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+punctuation \x2573 1478		BOX DRAWINGS LIGHT DIAGONAL CROSS
+punctuation \x2574 2356		BOX DRAWINGS LIGHT LEFT
+punctuation \x2575 123456		BOX DRAWINGS LIGHT UP
+punctuation \x2576 2356		BOX DRAWINGS LIGHT RIGHT
+punctuation \x2577 235678		BOX DRAWINGS LIGHT DOWN
+punctuation \x2578 2356		BOX DRAWINGS HEAVY LEFT
+punctuation \x2579 123456		BOX DRAWINGS HEAVY UP
+punctuation \x257a 2356		BOX DRAWINGS HEAVY RIGHT
+punctuation \x257b 235678		BOX DRAWINGS HEAVY DOWN
+punctuation \x257c 2356		BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+punctuation \x257d 12345678		BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+punctuation \x257e 2356		BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+punctuation \x257f 12345678		BOX DRAWINGS HEAVY UP AND LIGHT DOWN
diff --git a/liblouis/tables/br-in-g1.utb b/liblouis/tables/br-in-g1.utb
new file mode 100644
index 0000000..2259fdb
--- /dev/null
+++ b/liblouis/tables/br-in-g1.utb
@@ -0,0 +1,27 @@
+# This table contains braille codes and rules for Braj Grade 1 and includes English grade 1
+#
+# Copyright (C) 2014 National Institute for Visually Handicapped, 116, Rajpur Road, Dehradun, Uttrakhand, India
+#
+# This file is part of liblouis.
+#
+# liblouis is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation, either version 2.1 of the
+# License, or (at your option) any later version.
+#
+# liblouis is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with liblouis. If not, see
+# <http://www.gnu.org/licenses/>.
+
+# This table is built and maintained under an activity of Braille Council of India
+# Contributors: Dipendra Manocha, Sreeja, Dinesh Kaushal, Mesar Hamid
+# Last updated on May 5, 2014
+# To report any bugs or any suggestion, please write to d@saksham.org and sreeja.param@gmail.com
+
+include devanagari.cti
+include en-in-g1.ctb
diff --git a/liblouis/tables/bra.tbl b/liblouis/tables/bra.tbl
new file mode 100644
index 0000000..679b2ea
--- /dev/null
+++ b/liblouis/tables/bra.tbl
@@ -0,0 +1,16 @@
+#+locale:bra
+#+type:literary
+#+grade:1
+
+# TODO: Please correct the metadata above. It is not meant to be
+# accurate nor complete. It hasn't been verified by the table
+# author yet. It is merely an attempt by the liblouis maintainers
+# to get some sensible initial values in place.
+
+# TODO: Please add a reference to official documentation about
+# the implemented braille code. Preferably submit the documents
+# to https://github.com/liblouis/braille-specs.
+
+include spaces.ctb
+include br-in-g1.utb
+include braille-patterns.cti
diff --git a/liblouis/tables/braille-patterns.cti b/liblouis/tables/braille-patterns.cti
new file mode 100644
index 0000000..1cb7df6
--- /dev/null
+++ b/liblouis/tables/braille-patterns.cti
@@ -0,0 +1,287 @@
+#
+#  Copyright (C) 2010, 2011 DocArch <http://www.docarch.be>.
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+# ----------------------------------------------------------------------------------------------
+#  odt2braille - Braille authoring in OpenOffice.org.
+# ----------------------------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 2800..28FF  Braille Patterns
+# ----------------------------------------------------------------------------------------------
+
+noback sign        \x2800  0                    # ⠀                   BRAILLE PATTERN DOTS-0
+noback sign        \x2801  1                    # ⠁                   BRAILLE PATTERN DOTS-1
+noback sign        \x2802  2                    # ⠂                   BRAILLE PATTERN DOTS-2
+noback sign        \x2803  12                   # ⠃                   BRAILLE PATTERN DOTS-12
+noback sign        \x2804  3                    # ⠄                   BRAILLE PATTERN DOTS-3
+noback sign        \x2805  13                   # ⠅                   BRAILLE PATTERN DOTS-13
+noback sign        \x2806  23                   # ⠆                   BRAILLE PATTERN DOTS-23
+noback sign        \x2807  123                  # ⠇                   BRAILLE PATTERN DOTS-123
+noback sign        \x2808  4                    # ⠈                   BRAILLE PATTERN DOTS-4
+noback sign        \x2809  14                   # ⠉                   BRAILLE PATTERN DOTS-14
+noback sign        \x280A  24                   # ⠊                   BRAILLE PATTERN DOTS-24
+noback sign        \x280B  124                  # ⠋                   BRAILLE PATTERN DOTS-124
+noback sign        \x280C  34                   # ⠌                   BRAILLE PATTERN DOTS-34
+noback sign        \x280D  134                  # ⠍                   BRAILLE PATTERN DOTS-134
+noback sign        \x280E  234                  # ⠎                   BRAILLE PATTERN DOTS-234
+noback sign        \x280F  1234                 # ⠏                   BRAILLE PATTERN DOTS-1234
+noback sign        \x2810  5                    # ⠐                   BRAILLE PATTERN DOTS-5
+noback sign        \x2811  15                   # ⠑                   BRAILLE PATTERN DOTS-15
+noback sign        \x2812  25                   # ⠒                   BRAILLE PATTERN DOTS-25
+noback sign        \x2813  125                  # ⠓                   BRAILLE PATTERN DOTS-125
+noback sign        \x2814  35                   # ⠔                   BRAILLE PATTERN DOTS-35
+noback sign        \x2815  135                  # ⠕                   BRAILLE PATTERN DOTS-135
+noback sign        \x2816  235                  # ⠖                   BRAILLE PATTERN DOTS-235
+noback sign        \x2817  1235                 # ⠗                   BRAILLE PATTERN DOTS-1235
+noback sign        \x2818  45                   # ⠘                   BRAILLE PATTERN DOTS-45
+noback sign        \x2819  145                  # ⠙                   BRAILLE PATTERN DOTS-145
+noback sign        \x281A  245                  # ⠚                   BRAILLE PATTERN DOTS-245
+noback sign        \x281B  1245                 # ⠛                   BRAILLE PATTERN DOTS-1245
+noback sign        \x281C  345                  # ⠜                   BRAILLE PATTERN DOTS-345
+noback sign        \x281D  1345                 # ⠝                   BRAILLE PATTERN DOTS-1345
+noback sign        \x281E  2345                 # ⠞                   BRAILLE PATTERN DOTS-2345
+noback sign        \x281F  12345                # ⠟                   BRAILLE PATTERN DOTS-12345
+noback sign        \x2820  6                    # ⠠                   BRAILLE PATTERN DOTS-6
+noback sign        \x2821  16                   # ⠡                   BRAILLE PATTERN DOTS-16
+noback sign        \x2822  26                   # ⠢                   BRAILLE PATTERN DOTS-26
+noback sign        \x2823  126                  # ⠣                   BRAILLE PATTERN DOTS-126
+noback sign        \x2824  36                   # ⠤                   BRAILLE PATTERN DOTS-36
+noback sign        \x2825  136                  # ⠥                   BRAILLE PATTERN DOTS-136
+noback sign        \x2826  236                  # ⠦                   BRAILLE PATTERN DOTS-236
+noback sign        \x2827  1236                 # ⠧                   BRAILLE PATTERN DOTS-1236
+noback sign        \x2828  46                   # ⠨                   BRAILLE PATTERN DOTS-46
+noback sign        \x2829  146                  # ⠩                   BRAILLE PATTERN DOTS-146
+noback sign        \x282A  246                  # ⠪                   BRAILLE PATTERN DOTS-246
+noback sign        \x282B  1246                 # ⠫                   BRAILLE PATTERN DOTS-1246
+noback sign        \x282C  346                  # ⠬                   BRAILLE PATTERN DOTS-346
+noback sign        \x282D  1346                 # ⠭                   BRAILLE PATTERN DOTS-1346
+noback sign        \x282E  2346                 # ⠮                   BRAILLE PATTERN DOTS-2346
+noback sign        \x282F  12346                # ⠯                   BRAILLE PATTERN DOTS-12346
+noback sign        \x2830  56                   # ⠰                   BRAILLE PATTERN DOTS-56
+noback sign        \x2831  156                  # ⠱                   BRAILLE PATTERN DOTS-156
+noback sign        \x2832  256                  # ⠲                   BRAILLE PATTERN DOTS-256
+noback sign        \x2833  1256                 # ⠳                   BRAILLE PATTERN DOTS-1256
+noback sign        \x2834  356                  # ⠴                   BRAILLE PATTERN DOTS-356
+noback sign        \x2835  1356                 # ⠵                   BRAILLE PATTERN DOTS-1356
+noback sign        \x2836  2356                 # ⠶                   BRAILLE PATTERN DOTS-2356
+noback sign        \x2837  12356                # ⠷                   BRAILLE PATTERN DOTS-12356
+noback sign        \x2838  456                  # ⠸                   BRAILLE PATTERN DOTS-456
+noback sign        \x2839  1456                 # ⠹                   BRAILLE PATTERN DOTS-1456
+noback sign        \x283A  2456                 # ⠺                   BRAILLE PATTERN DOTS-2456
+noback sign        \x283B  12456                # ⠻                   BRAILLE PATTERN DOTS-12456
+noback sign        \x283C  3456                 # ⠼                   BRAILLE PATTERN DOTS-3456
+noback sign        \x283D  13456                # ⠽                   BRAILLE PATTERN DOTS-13456
+noback sign        \x283E  23456                # ⠾                   BRAILLE PATTERN DOTS-23456
+noback sign        \x283F  123456               # ⠿                   BRAILLE PATTERN DOTS-123456
+noback sign        \x2840  7                    # ⡀                   BRAILLE PATTERN DOTS-7
+noback sign        \x2841  17                   # ⡁                   BRAILLE PATTERN DOTS-17
+noback sign        \x2842  27                   # ⡂                   BRAILLE PATTERN DOTS-27
+noback sign        \x2843  127                  # ⡃                   BRAILLE PATTERN DOTS-127
+noback sign        \x2844  37                   # ⡄                   BRAILLE PATTERN DOTS-37
+noback sign        \x2845  137                  # ⡅                   BRAILLE PATTERN DOTS-137
+noback sign        \x2846  237                  # ⡆                   BRAILLE PATTERN DOTS-237
+noback sign        \x2847  1237                 # ⡇                   BRAILLE PATTERN DOTS-1237
+noback sign        \x2848  47                   # ⡈                   BRAILLE PATTERN DOTS-47
+noback sign        \x2849  147                  # ⡉                   BRAILLE PATTERN DOTS-147
+noback sign        \x284A  247                  # ⡊                   BRAILLE PATTERN DOTS-247
+noback sign        \x284B  1247                 # ⡋                   BRAILLE PATTERN DOTS-1247
+noback sign        \x284C  347                  # ⡌                   BRAILLE PATTERN DOTS-347
+noback sign        \x284D  1347                 # ⡍                   BRAILLE PATTERN DOTS-1347
+noback sign        \x284E  2347                 # ⡎                   BRAILLE PATTERN DOTS-2347
+noback sign        \x284F  12347                # ⡏                   BRAILLE PATTERN DOTS-12347
+noback sign        \x2850  57                   # ⡐                   BRAILLE PATTERN DOTS-57
+noback sign        \x2851  157                  # ⡑                   BRAILLE PATTERN DOTS-157
+noback sign        \x2852  257                  # ⡒                   BRAILLE PATTERN DOTS-257
+noback sign        \x2853  1257                 # ⡓                   BRAILLE PATTERN DOTS-1257
+noback sign        \x2854  357                  # ⡔                   BRAILLE PATTERN DOTS-357
+noback sign        \x2855  1357                 # ⡕                   BRAILLE PATTERN DOTS-1357
+noback sign        \x2856  2357                 # ⡖                   BRAILLE PATTERN DOTS-2357
+noback sign        \x2857  12357                # ⡗                   BRAILLE PATTERN DOTS-12357
+noback sign        \x2858  457                  # ⡘                   BRAILLE PATTERN DOTS-457
+noback sign        \x2859  1457                 # ⡙                   BRAILLE PATTERN DOTS-1457
+noback sign        \x285A  2457                 # ⡚                   BRAILLE PATTERN DOTS-2457
+noback sign        \x285B  12457                # ⡛                   BRAILLE PATTERN DOTS-12457
+noback sign        \x285C  3457                 # ⡜                   BRAILLE PATTERN DOTS-3457
+noback sign        \x285D  13457                # ⡝                   BRAILLE PATTERN DOTS-13457
+noback sign        \x285E  23457                # ⡞                   BRAILLE PATTERN DOTS-23457
+noback sign        \x285F  123457               # ⡟                   BRAILLE PATTERN DOTS-123457
+noback sign        \x2860  67                   # ⡠                   BRAILLE PATTERN DOTS-67
+noback sign        \x2861  167                  # ⡡                   BRAILLE PATTERN DOTS-167
+noback sign        \x2862  267                  # ⡢                   BRAILLE PATTERN DOTS-267
+noback sign        \x2863  1267                 # ⡣                   BRAILLE PATTERN DOTS-1267
+noback sign        \x2864  367                  # ⡤                   BRAILLE PATTERN DOTS-367
+noback sign        \x2865  1367                 # ⡥                   BRAILLE PATTERN DOTS-1367
+noback sign        \x2866  2367                 # ⡦                   BRAILLE PATTERN DOTS-2367
+noback sign        \x2867  12367                # ⡧                   BRAILLE PATTERN DOTS-12367
+noback sign        \x2868  467                  # ⡨                   BRAILLE PATTERN DOTS-467
+noback sign        \x2869  1467                 # ⡩                   BRAILLE PATTERN DOTS-1467
+noback sign        \x286A  2467                 # ⡪                   BRAILLE PATTERN DOTS-2467
+noback sign        \x286B  12467                # ⡫                   BRAILLE PATTERN DOTS-12467
+noback sign        \x286C  3467                 # ⡬                   BRAILLE PATTERN DOTS-3467
+noback sign        \x286D  13467                # ⡭                   BRAILLE PATTERN DOTS-13467
+noback sign        \x286E  23467                # ⡮                   BRAILLE PATTERN DOTS-23467
+noback sign        \x286F  123467               # ⡯                   BRAILLE PATTERN DOTS-123467
+noback sign        \x2870  567                  # ⡰                   BRAILLE PATTERN DOTS-567
+noback sign        \x2871  1567                 # ⡱                   BRAILLE PATTERN DOTS-1567
+noback sign        \x2872  2567                 # ⡲                   BRAILLE PATTERN DOTS-2567
+noback sign        \x2873  12567                # ⡳                   BRAILLE PATTERN DOTS-12567
+noback sign        \x2874  3567                 # ⡴                   BRAILLE PATTERN DOTS-3567
+noback sign        \x2875  13567                # ⡵                   BRAILLE PATTERN DOTS-13567
+noback sign        \x2876  23567                # ⡶                   BRAILLE PATTERN DOTS-23567
+noback sign        \x2877  123567               # ⡷                   BRAILLE PATTERN DOTS-123567
+noback sign        \x2878  4567                 # ⡸                   BRAILLE PATTERN DOTS-4567
+noback sign        \x2879  14567                # ⡹                   BRAILLE PATTERN DOTS-14567
+noback sign        \x287A  24567                # ⡺                   BRAILLE PATTERN DOTS-24567
+noback sign        \x287B  124567               # ⡻                   BRAILLE PATTERN DOTS-124567
+noback sign        \x287C  34567                # ⡼                   BRAILLE PATTERN DOTS-34567
+noback sign        \x287D  134567               # ⡽                   BRAILLE PATTERN DOTS-134567
+noback sign        \x287E  234567               # ⡾                   BRAILLE PATTERN DOTS-234567
+noback sign        \x287F  1234567              # ⡿                   BRAILLE PATTERN DOTS-1234567
+noback sign        \x2880  8                    # ⢀                   BRAILLE PATTERN DOTS-8
+noback sign        \x2881  18                   # ⢁                   BRAILLE PATTERN DOTS-18
+noback sign        \x2882  28                   # ⢂                   BRAILLE PATTERN DOTS-28
+noback sign        \x2883  128                  # ⢃                   BRAILLE PATTERN DOTS-128
+noback sign        \x2884  38                   # ⢄                   BRAILLE PATTERN DOTS-38
+noback sign        \x2885  138                  # ⢅                   BRAILLE PATTERN DOTS-138
+noback sign        \x2886  238                  # ⢆                   BRAILLE PATTERN DOTS-238
+noback sign        \x2887  1238                 # ⢇                   BRAILLE PATTERN DOTS-1238
+noback sign        \x2888  48                   # ⢈                   BRAILLE PATTERN DOTS-48
+noback sign        \x2889  148                  # ⢉                   BRAILLE PATTERN DOTS-148
+noback sign        \x288A  248                  # ⢊                   BRAILLE PATTERN DOTS-248
+noback sign        \x288B  1248                 # ⢋                   BRAILLE PATTERN DOTS-1248
+noback sign        \x288C  348                  # ⢌                   BRAILLE PATTERN DOTS-348
+noback sign        \x288D  1348                 # ⢍                   BRAILLE PATTERN DOTS-1348
+noback sign        \x288E  2348                 # ⢎                   BRAILLE PATTERN DOTS-2348
+noback sign        \x288F  12348                # ⢏                   BRAILLE PATTERN DOTS-12348
+noback sign        \x2890  58                   # ⢐                   BRAILLE PATTERN DOTS-58
+noback sign        \x2891  158                  # ⢑                   BRAILLE PATTERN DOTS-158
+noback sign        \x2892  258                  # ⢒                   BRAILLE PATTERN DOTS-258
+noback sign        \x2893  1258                 # ⢓                   BRAILLE PATTERN DOTS-1258
+noback sign        \x2894  358                  # ⢔                   BRAILLE PATTERN DOTS-358
+noback sign        \x2895  1358                 # ⢕                   BRAILLE PATTERN DOTS-1358
+noback sign        \x2896  2358                 # ⢖                   BRAILLE PATTERN DOTS-2358
+noback sign        \x2897  12358                # ⢗                   BRAILLE PATTERN DOTS-12358
+noback sign        \x2898  458                  # ⢘                   BRAILLE PATTERN DOTS-458
+noback sign        \x2899  1458                 # ⢙                   BRAILLE PATTERN DOTS-1458
+noback sign        \x289A  2458                 # ⢚                   BRAILLE PATTERN DOTS-2458
+noback sign        \x289B  12458                # ⢛                   BRAILLE PATTERN DOTS-12458
+noback sign        \x289C  3458                 # ⢜                   BRAILLE PATTERN DOTS-3458
+noback sign        \x289D  13458                # ⢝                   BRAILLE PATTERN DOTS-13458
+noback sign        \x289E  23458                # ⢞                   BRAILLE PATTERN DOTS-23458
+noback sign        \x289F  123458               # ⢟                   BRAILLE PATTERN DOTS-123458
+noback sign        \x28A0  68                   # ⢠                   BRAILLE PATTERN DOTS-68
+noback sign        \x28A1  168                  # ⢡                   BRAILLE PATTERN DOTS-168
+noback sign        \x28A2  268                  # ⢢                   BRAILLE PATTERN DOTS-268
+noback sign        \x28A3  1268                 # ⢣                   BRAILLE PATTERN DOTS-1268
+noback sign        \x28A4  368                  # ⢤                   BRAILLE PATTERN DOTS-368
+noback sign        \x28A5  1368                 # ⢥                   BRAILLE PATTERN DOTS-1368
+noback sign        \x28A6  2368                 # ⢦                   BRAILLE PATTERN DOTS-2368
+noback sign        \x28A7  12368                # ⢧                   BRAILLE PATTERN DOTS-12368
+noback sign        \x28A8  468                  # ⢨                   BRAILLE PATTERN DOTS-468
+noback sign        \x28A9  1468                 # ⢩                   BRAILLE PATTERN DOTS-1468
+noback sign        \x28AA  2468                 # ⢪                   BRAILLE PATTERN DOTS-2468
+noback sign        \x28AB  12468                # ⢫                   BRAILLE PATTERN DOTS-12468
+noback sign        \x28AC  3468                 # ⢬                   BRAILLE PATTERN DOTS-3468
+noback sign        \x28AD  13468                # ⢭                   BRAILLE PATTERN DOTS-13468
+noback sign        \x28AE  23468                # ⢮                   BRAILLE PATTERN DOTS-23468
+noback sign        \x28AF  123468               # ⢯                   BRAILLE PATTERN DOTS-123468
+noback sign        \x28B0  568                  # ⢰                   BRAILLE PATTERN DOTS-568
+noback sign        \x28B1  1568                 # ⢱                   BRAILLE PATTERN DOTS-1568
+noback sign        \x28B2  2568                 # ⢲                   BRAILLE PATTERN DOTS-2568
+noback sign        \x28B3  12568                # ⢳                   BRAILLE PATTERN DOTS-12568
+noback sign        \x28B4  3568                 # ⢴                   BRAILLE PATTERN DOTS-3568
+noback sign        \x28B5  13568                # ⢵                   BRAILLE PATTERN DOTS-13568
+noback sign        \x28B6  23568                # ⢶                   BRAILLE PATTERN DOTS-23568
+noback sign        \x28B7  123568               # ⢷                   BRAILLE PATTERN DOTS-123568
+noback sign        \x28B8  4568                 # ⢸                   BRAILLE PATTERN DOTS-4568
+noback sign        \x28B9  14568                # ⢹                   BRAILLE PATTERN DOTS-14568
+noback sign        \x28BA  24568                # ⢺                   BRAILLE PATTERN DOTS-24568
+noback sign        \x28BB  124568               # ⢻                   BRAILLE PATTERN DOTS-124568
+noback sign        \x28BC  34568                # ⢼                   BRAILLE PATTERN DOTS-34568
+noback sign        \x28BD  134568               # ⢽                   BRAILLE PATTERN DOTS-134568
+noback sign        \x28BE  234568               # ⢾                   BRAILLE PATTERN DOTS-234568
+noback sign        \x28BF  1234568              # ⢿                   BRAILLE PATTERN DOTS-1234568
+noback sign        \x28C0  78                   # ⣀                   BRAILLE PATTERN DOTS-78
+noback sign        \x28C1  178                  # ⣁                   BRAILLE PATTERN DOTS-178
+noback sign        \x28C2  278                  # ⣂                   BRAILLE PATTERN DOTS-278
+noback sign        \x28C3  1278                 # ⣃                   BRAILLE PATTERN DOTS-1278
+noback sign        \x28C4  378                  # ⣄                   BRAILLE PATTERN DOTS-378
+noback sign        \x28C5  1378                 # ⣅                   BRAILLE PATTERN DOTS-1378
+noback sign        \x28C6  2378                 # ⣆                   BRAILLE PATTERN DOTS-2378
+noback sign        \x28C7  12378                # ⣇                   BRAILLE PATTERN DOTS-12378
+noback sign        \x28C8  478                  # ⣈                   BRAILLE PATTERN DOTS-478
+noback sign        \x28C9  1478                 # ⣉                   BRAILLE PATTERN DOTS-1478
+noback sign        \x28CA  2478                 # ⣊                   BRAILLE PATTERN DOTS-2478
+noback sign        \x28CB  12478                # ⣋                   BRAILLE PATTERN DOTS-12478
+noback sign        \x28CC  3478                 # ⣌                   BRAILLE PATTERN DOTS-3478
+noback sign        \x28CD  13478                # ⣍                   BRAILLE PATTERN DOTS-13478
+noback sign        \x28CE  23478                # ⣎                   BRAILLE PATTERN DOTS-23478
+noback sign        \x28CF  123478               # ⣏                   BRAILLE PATTERN DOTS-123478
+noback sign        \x28D0  578                  # ⣐                   BRAILLE PATTERN DOTS-578
+noback sign        \x28D1  1578                 # ⣑                   BRAILLE PATTERN DOTS-1578
+noback sign        \x28D2  2578                 # ⣒                   BRAILLE PATTERN DOTS-2578
+noback sign        \x28D3  12578                # ⣓                   BRAILLE PATTERN DOTS-12578
+noback sign        \x28D4  3578                 # ⣔                   BRAILLE PATTERN DOTS-3578
+noback sign        \x28D5  13578                # ⣕                   BRAILLE PATTERN DOTS-13578
+noback sign        \x28D6  23578                # ⣖                   BRAILLE PATTERN DOTS-23578
+noback sign        \x28D7  123578               # ⣗                   BRAILLE PATTERN DOTS-123578
+noback sign        \x28D8  4578                 # ⣘                   BRAILLE PATTERN DOTS-4578
+noback sign        \x28D9  14578                # ⣙                   BRAILLE PATTERN DOTS-14578
+noback sign        \x28DA  24578                # ⣚                   BRAILLE PATTERN DOTS-24578
+noback sign        \x28DB  124578               # ⣛                   BRAILLE PATTERN DOTS-124578
+noback sign        \x28DC  34578                # ⣜                   BRAILLE PATTERN DOTS-34578
+noback sign        \x28DD  134578               # ⣝                   BRAILLE PATTERN DOTS-134578
+noback sign        \x28DE  234578               # ⣞                   BRAILLE PATTERN DOTS-234578
+noback sign        \x28DF  1234578              # ⣟                   BRAILLE PATTERN DOTS-1234578
+noback sign        \x28E0  678                  # ⣠                   BRAILLE PATTERN DOTS-678
+noback sign        \x28E1  1678                 # ⣡                   BRAILLE PATTERN DOTS-1678
+noback sign        \x28E2  2678                 # ⣢                   BRAILLE PATTERN DOTS-2678
+noback sign        \x28E3  12678                # ⣣                   BRAILLE PATTERN DOTS-12678
+noback sign        \x28E4  3678                 # ⣤                   BRAILLE PATTERN DOTS-3678
+noback sign        \x28E5  13678                # ⣥                   BRAILLE PATTERN DOTS-13678
+noback sign        \x28E6  23678                # ⣦                   BRAILLE PATTERN DOTS-23678
+noback sign        \x28E7  123678               # ⣧                   BRAILLE PATTERN DOTS-123678
+noback sign        \x28E8  4678                 # ⣨                   BRAILLE PATTERN DOTS-4678
+noback sign        \x28E9  14678                # ⣩                   BRAILLE PATTERN DOTS-14678
+noback sign        \x28EA  24678                # ⣪                   BRAILLE PATTERN DOTS-24678
+noback sign        \x28EB  124678               # ⣫                   BRAILLE PATTERN DOTS-124678
+noback sign        \x28EC  34678                # ⣬                   BRAILLE PATTERN DOTS-34678
+noback sign        \x28ED  134678               # ⣭                   BRAILLE PATTERN DOTS-134678
+noback sign        \x28EE  234678               # ⣮                   BRAILLE PATTERN DOTS-234678
+noback sign        \x28EF  1234678              # ⣯                   BRAILLE PATTERN DOTS-1234678
+noback sign        \x28F0  5678                 # ⣰                   BRAILLE PATTERN DOTS-5678
+noback sign        \x28F1  15678                # ⣱                   BRAILLE PATTERN DOTS-15678
+noback sign        \x28F2  25678                # ⣲                   BRAILLE PATTERN DOTS-25678
+noback sign        \x28F3  125678               # ⣳                   BRAILLE PATTERN DOTS-125678
+noback sign        \x28F4  35678                # ⣴                   BRAILLE PATTERN DOTS-35678
+noback sign        \x28F5  135678               # ⣵                   BRAILLE PATTERN DOTS-135678
+noback sign        \x28F6  235678               # ⣶                   BRAILLE PATTERN DOTS-235678
+noback sign        \x28F7  1235678              # ⣷                   BRAILLE PATTERN DOTS-1235678
+noback sign        \x28F8  45678                # ⣸                   BRAILLE PATTERN DOTS-45678
+noback sign        \x28F9  145678               # ⣹                   BRAILLE PATTERN DOTS-145678
+noback sign        \x28FA  245678               # ⣺                   BRAILLE PATTERN DOTS-245678
+noback sign        \x28FB  1245678              # ⣻                   BRAILLE PATTERN DOTS-1245678
+noback sign        \x28FC  345678               # ⣼                   BRAILLE PATTERN DOTS-345678
+noback sign        \x28FD  1345678              # ⣽                   BRAILLE PATTERN DOTS-1345678
+noback sign        \x28FE  2345678              # ⣾                   BRAILLE PATTERN DOTS-2345678
+noback sign        \x28FF  12345678             # ⣿                   BRAILLE PATTERN DOTS-12345678
+
+
+# ----------------------------------------------------------------------------------------------
+
diff --git a/liblouis/tables/ca-chardefs.cti b/liblouis/tables/ca-chardefs.cti
new file mode 100644
index 0000000..e70ca53
--- /dev/null
+++ b/liblouis/tables/ca-chardefs.cti
@@ -0,0 +1,197 @@
+# ----------------------------------------------------------------------------------------------
+#  odt2braille - Braille authoring in OpenOffice.org.
+#  Copyright (c) 2010 by DocArch <http://www.docarch.be>.
+# ----------------------------------------------------------------------------------------------
+#
+#  Catalan Braille
+#     Created and maintained by Bert Frees <bertfrees@gmail.com>
+#	  with the assistance of Carles Sadurní Anguita <http://www.transcriptor.net/>
+#
+# ----------------------------------------------------------------------------------------------
+
+# ==============================================================================================
+# SINGLE-CELL
+# ==============================================================================================
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 0000..007F  C0 Controls and Basic Latin
+# ----------------------------------------------------------------------------------------------
+
+include latinLetterDef6Dots.uti
+
+uplow       \x00C0\x00E0  12356,12356         Àà                  LATIN CAPITAL LETTER A WITH GRAVE - LATIN SMALL LETTER A WITH GRAVE
+uplow       \x00C7\x00E7  12346,12346         Çç                  LATIN CAPITAL LETTER C WITH CEDILLA - LATIN SMALL LETTER C WITH CEDILLA
+uplow       \x00C8\x00E8  2346,2346           Èè                  LATIN CAPITAL LETTER E WITH GRAVE - LATIN SMALL LETTER E WITH GRAVE
+uplow       \x00C9\x00E9  123456,123456       Éé                  LATIN CAPITAL LETTER E WITH ACUTE - LATIN SMALL LETTER E WITH ACUTE
+uplow       \x00CD\x00ED  34,34               Íí                  LATIN CAPITAL LETTER I WITH ACUTE - LATIN SMALL LETTER I WITH ACUTE
+uplow       \x00CF\x00EF  12456,12456         Ïï                  LATIN CAPITAL LETTER I WITH DIAERESIS - LATIN SMALL LETTER I WITH DIAERESIS
+uplow       \x00D2\x00F2  346,346             Òò                  LATIN CAPITAL LETTER O WITH GRAVE - LATIN SMALL LETTER O WITH GRAVE
+uplow       \x00D3\x00F3  246,246             Óó                  LATIN CAPITAL LETTER O WITH ACUTE - LATIN SMALL LETTER O WITH ACUTE
+uplow       \x00DA\x00FA  23456,23456         Úú                  LATIN CAPITAL LETTER U WITH ACUTE - LATIN SMALL LETTER U WITH ACUTE
+uplow       \x00DC\x00FC  1256,1256           Üü                  LATIN CAPITAL LETTER U WITH DIAERESIS - LATIN SMALL LETTER U WITH DIAERESIS
+
+space       \x0009        9                                       <control> HORIZONTAL TABULATION
+space       \x000A        0                                       <control> LINE FEED
+space       \x000C        0                                       <control> FORM FEED
+space       \x000D        0                                       <control> CARRIAGE RETURN
+space       \x001B        1b                                      <control> ESCAPE
+space       \x0020        0                                       SPACE
+punctuation \x0021        256                 !                   EXCLAMATION MARK
+punctuation \x0022        236                 "                   QUOTATION MARK
+punctuation \x0027        3                   '                   APOSTROPHE
+punctuation \x0028        126                 (                   LEFT PARENTHESIS
+punctuation \x0029        345                 )                   RIGHT PARENTHESIS
+sign        \x002A        35                  *                   ASTERISK
+math        \x002B        235                 +                   PLUS SIGN
+punctuation \x002C        2                   ,                   COMMA
+punctuation \x002D        36                  -                   HYPHEN-MINUS
+punctuation \x002E        3                   .                   FULL STOP
+include loweredDigits6Dots.uti
+punctuation \x003A        25                  :                   COLON
+punctuation \x003B        23                  ;                   SEMICOLON
+math        \x003C        246                 <                   LESS-THAN SIGN
+math        \x003D        2356                =                   EQUALS SIGN
+math        \x003E        135                 >                   GREATER-THAN SIGN
+punctuation \x003F        26                  ?                   QUESTION MARK
+punctuation \x005B        12356               [                   LEFT SQUARE BRACKET
+punctuation \x005D        23456               ]                   RIGHT SQUARE BRACKET
+sign        \x007C        456                 |                   VERTICAL LINE
+
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 0080..00FF  C1 Controls and Latin-1 Supplement
+# ----------------------------------------------------------------------------------------------
+
+punctuation \x0082        2                   ‚                   <control> BREAK PERMITTED HERE - ANSI: SINGLE LOW-9 QUOTATION MARK - MACROMAN: C CEDILLA
+punctuation \x0084        236                 „                   <control> - ANSI: DOUBLE LOW-9 QUOTATION MARK - MACROMAN: N TILDE
+punctuation \x0093        236                 “                   <control> SET TRANSMIT STATE - ANSI: LEFT DOUBLE QUOTATION MARK - MACROMAN: I GRAVE
+punctuation \x0094        236                 ”                   <control> CANCEL CHARACTER - ANSI: RIGHT DOUBLE QUOTATION MARK - MACROMAN: I CIRCUMFLEX
+punctuation \x0096        36                  –                   <control> START OF GUARDED AREA - ANSI: EN DASH - MACROMAN: N TILDE
+space       \x00A0        a                                       NO-BREAK SPACE
+punctuation \x00A1        235                 ¡                   INVERTED EXCLAMATION MARK
+punctuation \x00AB        236                 «                   LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+punctuation \x00AD        36                  ­                   SOFT HYPHEN
+sign        \x00B8        2                   ¸                   CEDILLA
+punctuation \x00BB        236                 »                   RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+punctuation \x00B7        5                   ·                   MIDDLE DOT
+punctuation \x00BF        26                  ¿                   INVERTED QUESTION MARK
+math        \x00D7        236                 ×                   MULTIPLICATION SIGN
+math        \x00F7        256                 ÷                   DIVISION SIGN
+
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 2000..206F  General Punctuation
+# ----------------------------------------------------------------------------------------------
+
+punctuation \x2010        36                  ‐                   HYPHEN
+punctuation \x2011        36                  ‑                   NON-BREAKING HYPHEN
+punctuation \x2012        36                  ‒                   FIGURE DASH
+punctuation \x2013        36                  –                   EN DASH
+punctuation \x2018        236                 ‘                   LEFT SINGLE QUOTATION MARK
+punctuation \x2019        236                 ’                   RIGHT SINGLE QUOTATION MARK
+punctuation \x201A        236                 ‚                   SINGLE LOW-9 QUOTATION MARK
+punctuation \x201B        236                 ‛                   SINGLE HIGH-REVERSED-9 QUOTATION MARK
+punctuation \x201C        236                 “                   LEFT DOUBLE QUOTATION MARK
+punctuation \x201D        236                 ”                   RIGHT DOUBLE QUOTATION MARK
+punctuation \x201E        236                 „                   DOUBLE LOW-9 QUOTATION MARK
+punctuation \x201F        236                 ‟                   DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+punctuation \x2043        36                  ⁃                   HYPHEN BULLET
+
+include braille-patterns.cti
+
+# ==============================================================================================
+# MULTI-CELL
+# ==============================================================================================
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 0000..007F  C0 Controls and Basic Latin
+# ----------------------------------------------------------------------------------------------
+
+sign        \x0024        345-234             $                   DOLLAR SIGN
+math        \x0025        456-356             %                   PERCENT SIGN
+sign        \x0026        6-12346             &                   AMPERSAND
+math        \x002F        6-2                 /                   SOLIDUS
+sign        \x0040        56-16               @                   COMMERCIAL AT
+sign        \x005C        5-3                 \                   REVERSE SOLIDUS
+math        \x007B        5-123               {                   LEFT CURLY BRACKET
+math        \x007D        456-2               }                   RIGHT CURLY BRACKET
+
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 0080..00FF  C1 Controls and Latin-1 Supplement
+# ----------------------------------------------------------------------------------------------
+
+sign        \x0080        456-15              €                   <control> - ANSI: EURO-CURRENCY SIGN - MACROMAN: A DIAERESIS
+punctuation \x0085        3-3-3               …                   <control> NEXT LINE (NEL) - ANSI: HORIZONTAL ELLIPSIS - MACROMAN: O DIAERESIS
+sign        \x0089        456-356-356         ‰                   <control> CHARACTER TABULATION WITH JUSTIFICATION - ANSI: PER MILLE SIGN - MACROMAN: A CIRCUMFLEX
+punctuation \x0097        36-36               —                   <control> END OF GUARDED AREA - ANSI: EM DASH - MACROMAN: O ACUTE
+sign        \x00A2        45-14               ¢                   CENT SIGN
+sign        \x00A3        5-2346              £                   POUND SIGN
+sign        \x00A5        456-13456           ¥                   YEN SIGN
+sign        \x00A9        126-46-14-345       ©                   COPYRIGHT SIGN
+sign        \x00AA        56-16               ª                   FEMININE ORDINAL INDICATOR
+sign        \x00AE        126-46-1235-345     ®                   REGISTERED SIGN
+math        \x00B1        235-25-36           ±                   PLUS-MINUS SIGN
+sign        \x00B2        16-3456-12          ²                   SUPERSCRIPT TWO
+sign        \x00B3        16-3456-14          ³                   SUPERSCRIPT THREE
+sign        \x00B5        4-134               µ                   MICRO SIGN
+math        \x00BC        1456-2-145          ¼                   VULGAR FRACTION ONE QUARTER
+math        \x00BD        1456-2-12           ½                   VULGAR FRACTION ONE HALF
+math        \x00BE        1456-25-145         ¾                   VULGAR FRACTION THREE QUARTERS
+
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 0100..017F  Latin Extended-A
+# ----------------------------------------------------------------------------------------------
+
+uplow       \x013F\x0140  123-5,123-5         Ŀŀ                  LATIN CAPITAL LETTER L WITH MIDDLE DOT - LATIN SMALL LETTER L WITH MIDDLE DOT
+
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 0370..03FF  Greek and Coptic
+# ----------------------------------------------------------------------------------------------
+
+lowercase   \x03B1        4-1                 α                   GREEK SMALL LETTER ALPHA
+lowercase   \x03B2        4-12                β                   GREEK SMALL LETTER BETA
+lowercase   \x03B3        4-1245              γ                   GREEK SMALL LETTER GAMMA
+lowercase   \x03B4        4-145               δ                   GREEK SMALL LETTER DELTA
+lowercase   \x03B5        4-15                ε                   GREEK SMALL LETTER EPSILON
+lowercase   \x03B6        4-1356              ζ                   GREEK SMALL LETTER ZETA
+lowercase   \x03B7        4-156               η                   GREEK SMALL LETTER ETA
+lowercase   \x03B8        4-1456              θ                   GREEK SMALL LETTER THETA
+lowercase   \x03B9        4-24                ι                   GREEK SMALL LETTER IOTA
+lowercase   \x03BA        4-13                κ                   GREEK SMALL LETTER KAPPA
+lowercase   \x03BB        4-123               λ                   GREEK SMALL LETTER LAMDA
+lowercase   \x03BC        4-134               μ                   GREEK SMALL LETTER MU
+lowercase   \x03BD        4-1345              ν                   GREEK SMALL LETTER NU
+lowercase   \x03BE        4-1346              ξ                   GREEK SMALL LETTER XI
+lowercase   \x03BF        4-135               ο                   GREEK SMALL LETTER OMICRON
+lowercase   \x03C0        4-1234              π                   GREEK SMALL LETTER PI
+lowercase   \x03C1        4-1235              ρ                   GREEK SMALL LETTER RHO
+lowercase   \x03C2        4-234               ς                   GREEK SMALL LETTER FINAL SIGMA
+lowercase   \x03C3        4-234               σ                   GREEK SMALL LETTER SIGMA
+lowercase   \x03C4        4-2345              τ                   GREEK SMALL LETTER TAU
+lowercase   \x03C5        4-136               υ                   GREEK SMALL LETTER UPSILON
+lowercase   \x03C6        4-124               φ                   GREEK SMALL LETTER PHI
+lowercase   \x03C7        4-12346             χ                   GREEK SMALL LETTER CHI
+lowercase   \x03C8        4-13456             ψ                   GREEK SMALL LETTER PSI
+lowercase   \x03C9        4-2456              ω                   GREEK SMALL LETTER OMEGA
+
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 2000..206F  General Punctuation
+# ----------------------------------------------------------------------------------------------
+
+punctuation \x2014        36-36               —                   EM DASH
+punctuation \x2015        36-36               ―                   HORIZONTAL BAR
+punctuation \x2026        3-3-3               …                   HORIZONTAL ELLIPSIS
+
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 20A0..20CF  Currency Symbols
+# ----------------------------------------------------------------------------------------------
+
+sign        \x20AC        456-15              €                   EURO SIGN
+
+
+# ----------------------------------------------------------------------------------------------
diff --git a/liblouis/tables/ca-g1.ctb b/liblouis/tables/ca-g1.ctb
new file mode 100644
index 0000000..07ddd37
--- /dev/null
+++ b/liblouis/tables/ca-g1.ctb
@@ -0,0 +1,28 @@
+# ----------------------------------------------------------------------------------------------
+#  odt2braille - Braille authoring in OpenOffice.org.
+#  Copyright (c) 2010 by DocArch <http://www.docarch.be>.
+# ----------------------------------------------------------------------------------------------
+#
+#  Catalan Braille
+#     Created and maintained by Bert Frees <bertfrees@gmail.com>
+#	  with the assistance of Carles Sadurní Anguita <http://www.transcriptor.net/>
+#
+# ----------------------------------------------------------------------------------------------
+
+include ca-chardefs.cti
+
+# ---------------------------------------
+# Digits
+# ---------------------------------------
+
+include litdigits6Dots.uti
+
+# ---------------------------------------
+# Braille indicator opcodes
+# ---------------------------------------
+
+numsign 3456
+capsletter 46
+begcapsword 46-46
+
+# ----------------------------------------------------------------------------------------------
diff --git a/liblouis/tables/ca.tbl b/liblouis/tables/ca.tbl
new file mode 100644
index 0000000..9a86447
--- /dev/null
+++ b/liblouis/tables/ca.tbl
@@ -0,0 +1,15 @@
+#+locale:ca
+#+type:literary
+#+grade:1
+
+# TODO: Please correct the metadata above. It is not meant to be
+# accurate nor complete. It hasn't been verified by the table
+# author yet. It is merely an attempt by the liblouis maintainers
+# to get some sensible initial values in place.
+
+# TODO: Please add a reference to official documentation about
+# the implemented braille code. Preferably submit the documents
+# to https://github.com/liblouis/braille-specs.
+
+include ca-g1.ctb
+include braille-patterns.cti
diff --git a/liblouis/tables/chardefs.cti b/liblouis/tables/chardefs.cti
new file mode 100644
index 0000000..4e22071
--- /dev/null
+++ b/liblouis/tables/chardefs.cti
@@ -0,0 +1,182 @@
+# liblouis: English, U.S. (EBAE) character definitions table
+#
+#  Based on the Linux screenreader BRLTTY, copyright (C) 1999-2006 by
+#  The BRLTTY Team
+#
+#  Copyright (C) 2004-2006 ViewPlus Technologies, Inc. www.viewplus.com
+#  Copyright (C) 2004-2006 JJB Software, Inc. www.jjb-software.com
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+# Computer braille single-cell characters
+space \s 0 blank
+space \t 9 tab
+space \x000a 0 newline
+space \x000c 0
+space \x000d 0 carriage return
+space \x001b 1b escape character for html back-translation
+space \x00A0 a NO-BREAK SPACE <noBreak> 0020 NON-BREAKING SPACE 
+include loweredDigits6Dots.uti
+
+include latinLetterDef8Dots.uti
+
+punctuation ( 12356
+punctuation } 12456
+punctuation ] 124567
+punctuation ? 1456
+punctuation : 156
+punctuation ) 23456
+punctuation ! 2346
+punctuation { 246
+punctuation [ 2467
+punctuation ' 3
+punctuation - 36
+punctuation . 46
+punctuation " 5
+punctuation ; 56
+punctuation , 6
+sign & 12346
+sign $ 1246
+sign | 1256
+sign \\ 12567
+sign % 146
+sign * 16
+sign # 3456
+punctuation ` 4
+sign _ 456
+sign ^ 457
+sign @ 47
+math = 123456
+math < 126
+math / 34
+math > 345
+math + 346
+math ~ 45
+
+# Accented letters
+lowercase \x00DF 4-234 LATIN SMALL LETTER SHARP S German 
+lowercase \x00E0 4-1 LATIN SMALL LETTER A WITH GRAVE 0061 0300 LATIN 
+lowercase \x00E1 4-1 LATIN SMALL LETTER A WITH ACUTE 0061 0301 LATIN 
+lowercase \x00E2 4-1 LATIN SMALL LETTER A WITH CIRCUMFLEX 0061 0302 
+lowercase \x00E3 4-1 LATIN SMALL LETTER A WITH TILDE 0061 0303 LATIN 
+lowercase \x00E4 4-1 LATIN SMALL LETTER A WITH DIAERESIS 0061 0308 LATIN 
+lowercase \x00E5 4-1 LATIN SMALL LETTER A WITH RING ABOVE 0061 030A 
+lowercase \x00E6 4-1 LATIN SMALL LETTER AE LATIN SMALL LETTER A E ash * 
+lowercase \x00E7 4-14 LATIN SMALL LETTER C WITH CEDILLA 0063 0327 LATIN 
+lowercase \x00E8 4-15 LATIN SMALL LETTER E WITH GRAVE 0065 0300 LATIN 
+lowercase \x00E9 4-15 LATIN SMALL LETTER E WITH ACUTE 0065 0301 LATIN 
+lowercase \x00EA 4-15 LATIN SMALL LETTER E WITH CIRCUMFLEX 0065 0302 
+lowercase \x00EB 4-15 LATIN SMALL LETTER E WITH DIAERESIS 0065 0308 
+lowercase \x00EC 4-24 LATIN SMALL LETTER I WITH GRAVE 0069 0300 LATIN 
+lowercase \x00ED 4-24 LATIN SMALL LETTER I WITH ACUTE 0069 0301 LATIN 
+lowercase \x00EE 4-24 LATIN SMALL LETTER I WITH CIRCUMFLEX 0069 0302 
+lowercase \x00EF 4-24 LATIN SMALL LETTER I WITH DIAERESIS 0069 0308 
+lowercase \x00F0 4-15 LATIN SMALL LETTER ETH Icelandic 00D0 00D0
+lowercase \x00F1 4-1345 LATIN SMALL LETTER N WITH TILDE 006E 0303 LATIN 
+lowercase \x00F2 4-135 LATIN SMALL LETTER O WITH GRAVE 006F 0300 LATIN 
+lowercase \x00F3 4-135 LATIN SMALL LETTER O WITH ACUTE 006F 0301 LATIN 
+lowercase \x00F4 4-135 LATIN SMALL LETTER O WITH CIRCUMFLEX 006F 0302 
+lowercase \x00F5 4-135 LATIN SMALL LETTER O WITH TILDE 006F 0303 LATIN 
+lowercase \x00F6 4-135 LATIN SMALL LETTER O WITH DIAERESIS 006F 0308 
+lowercase \x00F8 4-135 LATIN SMALL LETTER O WITH STROKE LATIN SMALL 
+lowercase \x00F9 4-136 LATIN SMALL LETTER U WITH GRAVE 0075 0300 LATIN 
+lowercase \x00FA 4-136 LATIN SMALL LETTER U WITH ACUTE 0075 0301 LATIN 
+lowercase \x00FB 4-136 LATIN SMALL LETTER U WITH CIRCUMFLEX 0075 0302 
+lowercase \x00FC 4-136 LATIN SMALL LETTER U WITH DIAERESIS 0075 0308 
+lowercase \x00FD 4-13456 LATIN SMALL LETTER Y WITH ACUTE 0079 0301 LATIN 
+lowercase \x00FE 4-2345 LATIN SMALL LETTER THORN Icelandic 00DE 00DE
+lowercase \x00FF 4-13456 LATIN SMALL LETTER Y WITH DIAERESIS 0079 0308 
+uppercase \x00C0 4-1 LATIN CAPITAL LETTER A WITH GRAVE 0041 0300 LATIN 
+uppercase \x00C1 4-1 LATIN CAPITAL LETTER A WITH ACUTE 0041 0301 LATIN 
+uppercase \x00C2 4-1 LATIN CAPITAL LETTER A WITH CIRCUMFLEX 0041 0302 
+uppercase \x00C3 4-1 LATIN CAPITAL LETTER A WITH TILDE 0041 0303 LATIN 
+uppercase \x00C4 4-1 LATIN CAPITAL LETTER A WITH DIAERESIS 0041 0308 
+uppercase \x00C5 4-1 LATIN CAPITAL LETTER A WITH RING ABOVE 0041 030A 
+uppercase \x00C6 4-1 LATIN CAPITAL LETTER AE LATIN CAPITAL LETTER A E 
+uppercase \x00C7 4-14 LATIN CAPITAL LETTER C WITH CEDILLA 0043 0327 
+uppercase \x00C8 4-15 LATIN CAPITAL LETTER E WITH GRAVE 0045 0300 LATIN 
+uppercase \x00C9 4-15 LATIN CAPITAL LETTER E WITH ACUTE 0045 0301 LATIN 
+uppercase \x00CA 4-15 LATIN CAPITAL LETTER E WITH CIRCUMFLEX 0045 0302 
+uppercase \x00CB 4-15 LATIN CAPITAL LETTER E WITH DIAERESIS 0045 0308 
+uppercase \x00CC 4-24 LATIN CAPITAL LETTER I WITH GRAVE 0049 0300 LATIN 
+uppercase \x00CD 4-24 LATIN CAPITAL LETTER I WITH ACUTE 0049 0301 LATIN 
+uppercase \x00CE 4-24 LATIN CAPITAL LETTER I WITH CIRCUMFLEX 0049 0302 
+uppercase \x00CF 4-24 LATIN CAPITAL LETTER I WITH DIAERESIS 0049 0308 
+uppercase \x00D0 4-15 LATIN CAPITAL LETTER ETH Icelandic 00F0 
+uppercase \x00D1 4-1345 LATIN CAPITAL LETTER N WITH TILDE 004E 0303 
+uppercase \x00D2 4-135 LATIN CAPITAL LETTER O WITH GRAVE 004F 0300 LATIN 
+uppercase \x00D3 4-135 LATIN CAPITAL LETTER O WITH ACUTE 004F 0301 LATIN 
+uppercase \x00D4 4-135 LATIN CAPITAL LETTER O WITH CIRCUMFLEX 004F 0302 
+uppercase \x00D6 4-135 LATIN CAPITAL LETTER O WITH DIAERESIS 004F 0308 
+uppercase \x00D8 4-135 LATIN CAPITAL LETTER O WITH STROKE LATIN CAPITAL 
+uppercase \x00D9 4-136 LATIN CAPITAL LETTER U WITH GRAVE 0055 0300 LATIN 
+uppercase \x00DA 4-136 LATIN CAPITAL LETTER U WITH ACUTE 0055 0301 LATIN 
+uppercase \x00DB 4-136 LATIN CAPITAL LETTER U WITH CIRCUMFLEX 0055 0302 
+uppercase \x00DC 4-136 LATIN CAPITAL LETTER U WITH DIAERESIS 0055 0308 
+uppercase \x00DD 4-13456 LATIN CAPITAL LETTER Y WITH ACUTE 0059 0301 
+uppercase \x00DE 4-2345 LATIN CAPITAL LETTER THORN Icelandic 00FE 
+
+# Miscellaneous
+math \x00B1 346-36 PLUS-MINUS SIGN PLUS-OR-MINUS SIGN 
+math \x00B7 4-16 MIDDLE DOT 
+math \x00BC 1456-2-34-256-3456 VULGAR FRACTION ONE QUARTER No 0031 2044 
+math \x00BD 1456-2-34-23-3456 VULGAR FRACTION ONE HALF No 0031 2044 0032 
+math \x00BE 1456-25-34-23-3456 VULGAR FRACTION THREE QUARTERS No 0033 
+math \x00D7 16 MULTIPLICATION SIGN 
+math \x00F7 4-34 DIVISION SIGN 
+noback punctuation \x0092 3
+noback punctuation \x0097 36-36
+punctuation \x00A1 235 INVERTED EXCLAMATION MARK 
+punctuation \x00ad 36
+punctuation \x00BF 236 INVERTED QUESTION MARK 
+punctuation \x2011 36
+punctuation \x2013 36-36
+punctuation \x2014 36-36
+noback punctuation \x2018 6-236
+noback punctuation \x2019 3
+noback punctuation \x2019 356-3
+punctuation \x201c 236
+punctuation \x201d 356
+noback punctuation \x2026 3
+sign \x2122 45-2345 trademark sign
+sign \x00A2 4-14 CENT SIGN 
+sign \x00A3 3456 POUND SIGN 
+sign \x00A4 1246 CURRENCY SIGN 
+sign \x00A7 4-234 SECTION SIGN 
+sign \x00A9 45-14 COPYRIGHT SIGN 
+sign \x00AE 45-1235 REGISTERED SIGN REGISTERED TRADE MARK SIGN 
+sign \x00B0 56-145-1245 DEGREE SIGN 
+sign \x00B4 b4 ACUTE ACCENT 0020 0301 SPACING ACUTE 
+sign \x00B5 46-134 MICRO SIGN 03BC 039C 039C
+# sign \x00A5 YEN SIGN 
+punctuation \x00A6 456-1256 BROKEN BAR BROKEN VERTICAL BAR 
+punctuation \x0093 236
+punctuation \x0094 356
+punctuation \x0096 36
+# sign \x00A8 DIAERESIS 0020 0308 SPACING DIAERESIS 
+# sign \x00AA FEMININE ORDINAL INDICATOR 0061 
+# punctuation \x00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK LEFT 
+# sign \x00AC NOT SIGN 
+# sign \x00AF MACRON 0020 0304 SPACING MACRON 
+# math \x00B2 SUPERSCRIPT TWO 0032 2 2 SUPERSCRIPT DIGIT TWO 
+# math \x00B3 SUPERSCRIPT THREE 0033 3 3 SUPERSCRIPT DIGIT THREE 
+# sign \x00B6 PILCROW SIGN PARAGRAPH SIGN 
+# sign \x00B8 CEDILLA 0020 0327 SPACING CEDILLA 
+# math \x00B9 SUPERSCRIPT ONE 0031 1 1 SUPERSCRIPT DIGIT ONE 
+# sign \x00BA MASCULINE ORDINAL INDICATOR 006F 
+# punctuation \x00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK Pf Y 
+noback sign \X25CF 16 BLACK CIRCLE
diff --git a/liblouis/tables/chr-us-g1.ctb b/liblouis/tables/chr-us-g1.ctb
new file mode 100644
index 0000000..b3d9e85
--- /dev/null
+++ b/liblouis/tables/chr-us-g1.ctb
@@ -0,0 +1,159 @@
+#chr##1#Cherokee Uncontracted#
+# liblouis: Cherokee Braille Table
+#
+# Copyright (C) 2014, Greg Kearney, gkearney@gmail.com
+#
+# This file is part of liblouis.
+#
+# liblouis is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation, either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# liblouis is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with liblouis. If not, see
+# <http://www.gnu.org/licenses/>.
+
+#include text_nabcc.dis All display opcodes
+
+include en-ueb-g1.ctb
+
+# letsign 456 ink letter sign
+
+# The Vowels
+
+letter		\x13A0		1		CHEROKEE LETTER A
+letter		\x13A1		15		CHEROKEE LETTER E
+letter		\x13A2		24		CHEROKEE LETTER I
+letter		\x13A3		135		CHEROKEE LETTER O
+letter		\x13A4		136		CHEROKEE LETTER U
+letter		\x13A5		1236	CHEROKEE LETTER V
+
+# The Consonants
+# G
+
+letter		\x13A6		1245-1		CHEROKEE LETTER GA
+letter		\x13A7		13-1		CHEROKEE LETTER KA
+letter		\x13A8		1245-15		CHEROKEE LETTER GE
+letter		\x13A9		1245-24		CHEROKEE LETTER GI
+letter		\x13AA		1245-135	CHEROKEE LETTER GO
+letter		\x13AB		1245-136	CHEROKEE LETTER GU
+letter		\x13AC		1245-1236	CHEROKEE LETTER GV
+
+# H
+
+letter		\x13AD		125-1		CHEROKEE LETTER HA
+letter		\x13AE		125-15		CHEROKEE LETTER HE
+letter		\x13AF		125-24		CHEROKEE LETTER HI
+letter		\x13B0		125-135		CHEROKEE LETTER HO
+letter		\x13B1		125-136		CHEROKEE LETTER HU
+letter		\x13B2		125-1236	CHEROKEE LETTER HV
+
+# L
+
+letter		\x13B3		123-1		CHEROKEE LETTER LA
+letter		\x13B4		123-15		CHEROKEE LETTER LE
+letter		\x13B5		123-24		CHEROKEE LETTER LI
+letter		\x13B6		123-135		CHEROKEE LETTER LO
+letter		\x13B7		123-136		CHEROKEE LETTER LU
+letter		\x13B8		123-1236	CHEROKEE LETTER LV
+
+# M
+
+letter		\x13B9		134-1		CHEROKEE LETTER MA
+letter		\x13BA		134-15		CHEROKEE LETTER ME
+letter		\x13BB		134-24		CHEROKEE LETTER MI
+letter		\x13BC		134-135		CHEROKEE LETTER MO
+letter		\x13BD		134-136		CHEROKEE LETTER MU
+# SPACE RESERVED FOR CHEROKEE LETTER MV
+
+# N
+
+letter		\x13BE		1345-1		CHEROKEE LETTER NA
+letter		\x13BF		12-1		CHEROKEE LETTER HNA
+letter		\x13C0		14-1		CHEROKEE LETTER NAH
+letter		\x13C1		1345-15		CHEROKEE LETTER NE
+letter		\x13C2		1345-24		CHEROKEE LETTER NI
+letter		\x13C3		1345-135	CHEROKEE LETTER NO
+letter		\x13C4		1345-136	CHEROKEE LETTER NU
+letter		\x13C5		1345-1236	CHEROKEE LETTER NV
+
+# Q
+
+letter		\x13C6		12345-1		CHEROKEE LETTER QA
+letter		\x13C7		12345-15	CHEROKEE LETTER QE
+letter		\x13C8		12345-24	CHEROKEE LETTER QI
+letter		\x13C9		12345-135	CHEROKEE LETTER QO
+letter		\x13CA		12345-136	CHEROKEE LETTER QU
+letter		\x13CB		12345-1236	CHEROKEE LETTER QV
+
+# S
+
+letter		\x13CD		234			CHEROKEE LETTER S
+letter		\x13CC		234-1		CHEROKEE LETTER SA
+letter		\x13CE		234-15		CHEROKEE LETTER SE
+letter		\x13CF		234-24		CHEROKEE LETTER SI
+letter		\x13D0		234-135		CHEROKEE LETTER SO
+letter		\x13D1		234-136		CHEROKEE LETTER SU
+letter		\x13D2		234-1236	CHEROKEE LETTER SV
+
+# D T
+
+letter		\x13D3		145-1		CHEROKEE LETTER DA
+letter		\x13D4		2345-1		CHEROKEE LETTER SA
+letter		\x13D5		145-15		CHEROKEE LETTER DE
+letter		\x13D6		2345-15		CHEROKEE LETTER SE
+letter		\x13D7		145-24		CHEROKEE LETTER DI
+letter		\x13D8		2345-24		CHEROKEE LETTER SI
+
+letter		\x13D9		145-135		CHEROKEE LETTER DO
+letter		\x13DA		145-136		CHEROKEE LETTER DU
+letter		\x13DB		145-1236	CHEROKEE LETTER DV
+
+# R F
+
+letter		\x13DC		124-1		CHEROKEE LETTER DLA
+letter		\x13DD		1235-1		CHEROKEE LETTER TLA
+letter		\x13DE		1235-15		CHEROKEE LETTER TLE
+letter		\x13DF		1235-24		CHEROKEE LETTER TLI
+letter		\x13E0		1235-135	CHEROKEE LETTER TLO
+letter		\x13E1		1235-136	CHEROKEE LETTER TLU
+letter		\x13E2		1235-1236	CHEROKEE LETTER TLV
+
+
+# Z
+
+letter		\x13E3		1356-1		CHEROKEE LETTER TSA
+letter		\x13E4		1356-15		CHEROKEE LETTER TSE
+letter		\x13E5		1356-24		CHEROKEE LETTER TSI
+letter		\x13E6		1356-135	CHEROKEE LETTER TSO
+letter		\x13E7		1356-136	CHEROKEE LETTER TSU
+letter		\x13E8		1356-1236	CHEROKEE LETTER TSV
+
+# W
+
+letter		\x13E9		2456-1		CHEROKEE LETTER WA
+letter		\x13EA		2456-15		CHEROKEE LETTER WE
+letter		\x13EB		2456-24		CHEROKEE LETTER WI
+letter		\x13EC		2456-135	CHEROKEE LETTER WO
+letter		\x13ED		2456-136	CHEROKEE LETTER WU
+letter		\x13EE		2456-1236	CHEROKEE LETTER WV
+
+# Y
+
+letter		\x13EF		13456-1		CHEROKEE LETTER YA
+letter		\x13F0		13456-15	CHEROKEE LETTER YE
+letter		\x13F1		13456-24	CHEROKEE LETTER YI
+letter		\x13F2		13456-135	CHEROKEE LETTER YO
+letter		\x13F3		13456-136	CHEROKEE LETTER YU
+letter		\x13F4		13456-1236	CHEROKEE LETTER YV
+
+letter		\x0323		5			COMBINING DOT BELOW
+letter		\x0331		156			COMBINING MACRON BELOW
+letter		\x0324		56			COMBINING DIAERESIS BELOW
+letter		\x0330		12456		COMBINING TILDE BELOW
diff --git a/liblouis/tables/ckb-chardefs.cti b/liblouis/tables/ckb-chardefs.cti
new file mode 100644
index 0000000..d85b00c
--- /dev/null
+++ b/liblouis/tables/ckb-chardefs.cti
@@ -0,0 +1,224 @@
+#
+#  Copyright (C) 2011 by Peter Engström <peter.engstrom@indexbraille.com>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+# -----------------------------------------------------------------------------
+#
+# 	SORANI (KURDISH)
+#	================
+# 	Author:		Peter Engström
+# 	Company:	Index Braille
+#
+# 	Date: 		Note:
+#	2011-02-08	Initial release based on _chardefs_ar.cti
+#	2011-03-15	Updated
+#	2011-03-22	Removing U+200C from text. New braille code for Heh.
+#				Arabic letters where coded as signs.
+#	2011-03-23	New handling of U+200C. Letter Heh changed again.
+#
+#
+
+# ----------- define all chars ------------------------------------------------
+space \t 0 tab							#  9
+space \x000A 0
+space \x000D 0
+space \s 0 blank						# 32
+
+#--BEGIN--------------------------------------------[Peter Engström 2011-03-23]
+# Remove U+200C three-per-em space = thick space but let it be a virtual space.
+space \x200C 9							# Assign x200C to virtual dot 9.
+noback pass2 @9 ?								# Remove virtual dot 9 during second pass.
+#--END----------------------------------------------[Peter Engström 2011-03-23]
+
+punctuation ! 235						# 33
+punctuation " 236						# 34	[Peter Engström 2011-03-15]
+sign # 3456								# 35
+sign $ 1246								# 36	[Peter Engström 2011-03-15]
+sign % 1234								# 37	[Peter Engström 2011-03-15]
+sign & 12346							# 38	[Peter Engström 2011-03-15]
+punctuation ' 3							# 39 apostrophe
+punctuation ) 356						# 40
+punctuation ( 236						# 41
+sign * 16								# 42	[Peter Engström 2011-03-15]
+math + 346								# 43	[Peter Engström 2011-03-15]
+punctuation , 46						# 44
+punctuation - 36						# 45
+punctuation \x06D4 256					# Arabic Full stop
+punctuation . 256						# 46	[Peter Engström 2011-03-15]
+math / 34								# 47
+include loweredDigits6Dots.uti
+punctuation : 5-2						# 58	[Peter Engström 2011-03-15]
+punctuation ; 5							# 59	[Peter Engström 2011-03-15]
+math < 0-126-0							# 60	[Peter Engström 2011-03-15]
+math = 123456							# 61	[Peter Engström 2011-03-15]
+letter > 0-246-0
+math > 0-345-0							# 62	[Peter Engström 2011-03-15]
+punctuation ? 1456						# 63
+sign @ 4								# 64
+
+include latinLetterDef6Dots.uti
+
+punctuation [ 13456						# 91	[Peter Engström 2011-03-15]
+sign \\ 1256							# 92	[Peter Engström 2011-03-15]
+punctuation ] 12346						# 93	[Peter Engström 2011-03-15]
+sign ^ 45								# 94 circumflex accent	[Peter Engström 2011-03-15]
+sign _ 456								# 95 underscore
+sign ` 4								# 96 grave accent
+# a - z									# 97 - 122
+punctuation { 135						# 123	[Peter Engström 2011-03-15]
+sign | 1245								# 124
+punctuation } 246						# 125	[Peter Engström 2011-03-15]
+math ~ 45								# 126
+space \X00A0 0							# 160 no-break space
+sign \x00A2 4-14						# 162 ¢ cents sign
+sign \x00A3 4-123						# 163 £ pounds sign
+sign \x00A5 4-13456						# 165 ¥ yen sign
+sign § 4-234-3							# 167 section sign \x00A7
+sign \x00A9 2356-6-14-2356 				# 169 © copyright sign
+sign \x00AE 16-256				 		# ® Registered mark
+punctuation \x00Ad 36					# 173 soft hyphen
+sign \x00B0 356							# 176 ° degrees sign
+sign \x00B5 46-134						# 181 µ micro sign
+sign \x00B6 4-1234-345					# 182 ¶ pilcrow sign
+sign \x00BF 236							# 191 inverted question mark
+math \x00D7 56-236						# 215 × multiplication sign
+math \x00F7 56-256						# 247 ÷ division sign
+
+punctuation \x2010 36					# 8208 hyphen
+punctuation \x2011 23478				# 8209 non-breaking hyphen
+punctuation \x2013 246					# 8211 en dash	[Peter Engström 2011-03-15]
+punctuation \x2014 246					# 8212	[Peter Engström 2011-03-15]
+punctuation	\x2018 3					# 8216 smart single left quotation mark
+punctuation	\x2019 3					# 8217 smart single right quotation mark
+punctuation	\x201C 2356					# 8220 smart opening double quote
+punctuation	\x201D 2356					# 8221 smart closing double quote
+punctuation	\x201E 2356					# 8222 smart double low quotation mark
+punctuation	\x201F 2356					# 8223 smart double high reverse quotation mark
+punctuation \x2026 3-3-3				# 8230 smart ellipsis
+sign \x20AC 4-15						# 8364 Euro sign
+noback sign \X25CF 16					# 9679 black circle
+
+#-------------------------- Arabic characters ---------------------------------
+sign \x060C 5							# Arabic comma
+sign \x061B 56							# Arabic semicolon
+sign \x061F 236							# Arabic question mark
+
+letter \x0621 345						# Hamza	[Peter Engström 2011-03-15]
+letter \x0622 345						# Alef with madda above
+letter \x0623 34						# Alef with hamza above
+letter \x0624 1256						# Waw with hamza above
+letter \x0625 34						# Alef with hamza below	[Peter Engström 2011-03-15]
+letter \x0626 345						# Yeh with hamza above 
+letter \x0627 1							# Alef
+letter \x0628 12						# Beh
+letter \x0629 16						# Teh marbutha
+letter \x062A 2345						# Teh
+letter \x062B 1456						# Theh
+letter \x062C 245						# Jeem
+letter \x062D 156						# Hah
+letter \x062E 1346						# Khah
+letter \x062F 145						# Dal
+letter \x0630 2346						# Thal
+letter \x0631 246						# Reh	[Peter Engström 2011-03-15]
+letter \x0632 1356						# Zain
+letter \x0633 234						# Seen
+letter \x0634 146						# Sheen
+letter \x0635 12346						# Sad
+letter \x0636 1246						# Dad
+letter \x0637 23456						# Tah
+letter \x0638 123456					# Zah
+letter \x0639 12356						# Ain
+letter \x063A 126						# Ghain
+letter \x0640 2							# Tatweel (=kashida inserted to stretch characters).
+letter \x0641 124						# Feh
+letter \x0642 12345						# Qaf
+letter \x0643 13						# Kaf
+letter \x0644 123						# Lam
+letter \x0645 134						# Meem
+letter \x0646 1345						# Noon
+
+#--BEGIN--------------------------------------------[Peter Engström 2011-02-08]
+letter \x0647 15						# Heh
+begword \x0647 125						
+midword \x0647 125						
+endword \x0647 15						
+#--END----------------------------------------------[Peter Engström 2011-02-08]
+
+letter \x0648 2456						# Waw
+letter \x0649 135						# Alef maksura
+letter \x064A 24						# Yeh
+letter \x064B 23						# Fathatan
+letter \x064C 26						# Dammatan
+letter \x064D 35						# Kasratan
+letter \x064E 2							# Fatha
+letter \x064F 136						# Damma
+letter \x0650 15						# Kasra
+letter \x0651 6							# Shadda
+letter \x0652 25						# Sukun
+
+#--BEGIN--------------------------------------------[Peter Engström 2011-02-08]
+sign \x02C7 456							# Caron (=hacek)
+sign \x032C 56							# Combinding caron below
+sign \x065A 456							# Vowel sign small v above
+sign \x0660 356							# 0 Arabic numbers
+sign \x0661 2							# 1
+sign \x0662 23							# 2
+sign \x0663 25							# 3
+sign \x0664 256							# 4
+sign \x0665 26							# 5
+sign \x0666 235							# 6
+sign \x0667 2356						# 7
+sign \x0668 236							# 8
+sign \x0669 35							# 9
+sign \x066C 5							# Arabic thousands separator
+
+letter \x067E 1234						# Peh
+letter \x0686 14						# Tcheh
+letter \x0695 1235						# Reh with small v below
+letter \x0698 346						# Jeh
+letter \x06A4 1236						# Veh
+letter \x06A9 13						# Keheh
+letter \x06AF 1245						# Gaf
+letter \x06B5 123456					# Lam with small v
+letter \x06BE 125						# Heh doachashmee
+letter \x06C1 15						# Heh goal
+letter \x06C6 135						# Oe
+letter \x06CB 1236						# Ve
+letter \x06CC 24						# Farsi Yeh
+letter \x06CE 34						# Yeh with small v
+letter \x06D5 15						# Ae
+letter \xFB8A 346						# Jeh isolated form
+letter \xFBA6 15						# Heh goal isolated form
+letter \xFBAA 125						# Heh doachashmee isolated form
+letter \xFBAB 15						# Heh doachashmee final form
+letter \xFBAC 125						# Heh doachashmee initial form
+letter \xFBAD 125						# Heh doachashmee medial form
+letter \xFBFC 24						# Farsi yeh isolated form
+letter \xFEAD 246						# Reh isolated form
+letter \xFEAE 246						# Reh final form
+letter \xFEDD 123						# Lam isolated form
+letter \xFEDE 123						# Lam final form
+letter \xFEE9 15						# Heh isolated form
+letter \xFEEA 15						# Heh final form
+letter \xFEEB 125						# Heh initial form
+letter \xFEEC 125						# Heh medial form
+letter \xFEEF 24						# Alef maksura isolated form
+letter \xFEFB 123-1						# Ligature lam with alef with hamza below isolated form 
+letter \xFEFC 123-1						# Ligature lam with alef with hamza below final form 
+
+#--END----------------------------------------------[Peter Engström 2011-02-08]
diff --git a/liblouis/tables/ckb-g1.ctb b/liblouis/tables/ckb-g1.ctb
new file mode 100644
index 0000000..1a2c47b
--- /dev/null
+++ b/liblouis/tables/ckb-g1.ctb
@@ -0,0 +1,31 @@
+#
+#  Copyright (C) 2011 by Peter Engström <peter.engstrom@indexbraille.com>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+# -----------------------------------------------------------------------------
+# 	SORANI (KURDISH)
+#	================
+# 	Author:		Peter Engström
+# 	Company:	Index Braille
+# ---------------------------------------------------------------------------------------
+
+include ckb-chardefs.cti
+include braille-patterns.cti
+include ckb-translation.cti
+
+# ---------------------------------------------------------------------------------------
diff --git a/liblouis/tables/ckb-translation.cti b/liblouis/tables/ckb-translation.cti
new file mode 100644
index 0000000..446fbee
--- /dev/null
+++ b/liblouis/tables/ckb-translation.cti
@@ -0,0 +1,131 @@
+#
+#  Copyright (C) 2011 by Peter Engström <peter.engstrom@indexbraille.com>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+# -----------------------------------------------------------------------------
+#
+# 	SORANI (KURDISH)
+#	================
+# 	Author:		Peter Engström
+# 	Company:	Index Braille
+#
+# 	Date: 		Note:
+#	2011-02-08	Renamed _translation_ar-g1.ctb and changed first line to access this file.
+#				Peter Engström, Index Braille.
+#	2011-03-15	Updated by Peter Engström
+#
+# ---------------------------------------------------------------------------------------
+
+always \x0644\x0627 123-1					#[Peter Engström 2011-02-08]
+always \x0640\x0640\x0640\x064F 136
+always \x0640\x0640\x0640\x064B 23
+always \x0640\x0640\x0640\x064C 26
+
+
+include countries.cti
+#undefined 123456
+
+# Braille indicators
+numsign 3456  number sign, just a dots operand
+multind 56-6 letsign capsletter
+capsletter 6
+begcapsword 6-6
+endcapsword 6-3
+emphclass italic
+emphclass underline
+emphclass bold
+begemph italic 46
+endemph italic 46-46
+begemph bold 456
+endemph bold 456-456
+begcomp 456-346
+endcomp 456-156
+
+# the decimal digits
+include litdigits6Dots.uti
+
+# Letters are defined in en-chardefs
+# punctuation
+
+prepunc ) 356
+postpunc ( 236
+
+prepunc " 236	#[Peter Engström 2011-03-15]
+postpunc " 236	#[Peter Engström 2011-03-15]
+
+prepunc ' 3		#[Peter Engström 2011-03-15]
+postpunc ' 3	#[Peter Engström 2011-03-15]
+word 'em = 
+word 'tis =
+word 'twas =
+begnum # 3456 print number sign before number #[Peter Engström 2011-03-15]
+midnum , 46
+postpunc , 46
+decpoint . 46
+midnum - 36
+hyphen - 36
+#capsnocont
+postpunc . 256
+postpunc ; 5		#[Peter Engström 2011-03-15]
+midnum : 5-2		#[Peter Engström 2011-03-15]
+postpunc : 5-2		#[Peter Engström 2011-03-15]
+postpunc ! 235
+midnum / 34
+always / 34
+#always < 0-135-0	#[Peter Engström 2011-03-15]
+# always > 0-246-0
+postpunc ? 1456		#[Peter Engström 2011-03-15]
+endnum % 1234		#[Peter Engström 2011-03-15]
+midnum ^ 346		#[Peter Engström 2011-03-15]
+always ^ 45			#[Peter Engström 2011-03-15]
+always ~ 45
+always & 12346		#[Peter Engström 2011-03-15]
+midnum * 16			#[Peter Engström 2011-03-15]
+always * 16			#[Peter Engström 2011-03-15]
+always [ 13456		#[Peter Engström 2011-03-15]
+always ] 12346		#[Peter Engström 2011-03-15]
+always { 135		#[Peter Engström 2011-03-15]
+always } 246		#[Peter Engström 2011-03-15]
+prepunc ` 6-236
+always @ 4
+always \\ 1256		#[Peter Engström 2011-03-15]
+always | 1245
+always ... 3-3-3
+always .\s.\s. 3-3-3 . . .
+always $ 1246		#[Peter Engström 2011-03-15]
+
+# special character sequences
+compbrl :// URLs
+compbrl www.
+compbrl .com
+compbrl .edu
+compbrl .gov
+compbrl .mil
+compbrl .net
+compbrl .org
+compbrl .doc
+compbrl .htm
+compbrl .html
+compbrl .tex
+compbrl .txt
+compbrl .gif
+compbrl .jpg
+compbrl .png
+compbrl .wav
+compbrl .tar
+compbrl .zip
diff --git a/liblouis/tables/ckb.tbl b/liblouis/tables/ckb.tbl
new file mode 100644
index 0000000..24e3612
--- /dev/null
+++ b/liblouis/tables/ckb.tbl
@@ -0,0 +1,15 @@
+#+locale:ckb
+#+type:literary
+#+grade:1
+
+# TODO: Please correct the metadata above. It is not meant to be
+# accurate nor complete. It hasn't been verified by the table
+# author yet. It is merely an attempt by the liblouis maintainers
+# to get some sensible initial values in place.
+
+# TODO: Please add a reference to official documentation about
+# the implemented braille code. Preferably submit the documents
+# to https://github.com/liblouis/braille-specs.
+
+include ckb-g1.ctb
+include braille-patterns.cti
diff --git a/liblouis/tables/compress.cti b/liblouis/tables/compress.cti
new file mode 100644
index 0000000..e0c04a3
--- /dev/null
+++ b/liblouis/tables/compress.cti
@@ -0,0 +1,44 @@
+# Multiple Blank, Tab, etc. Suppression Table
+
+#  Based on the Linux screenreader BRLTTY, copyright (C) 1999-2006 by
+#  The BRLTTY Team
+#
+#  Copyright (C) 2004-2006 ViewPlus Technologies, Inc. www.viewplus.com
+#  Copyright (C) 2004-2006 JJB Software, Inc. www.jjb-software.com
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+space \s 0 blank
+space \t 9 tab
+space \x000a 0 newline
+space \x000c 0
+space \x000d 0 carriage return
+space \x001b 1b escape character for html back-translation
+space \x00A0 a NO-BREAK SPACE <noBreak> 0020 NON-BREAKING SPACE 
+
+# Sequences which should be represented by blank spaces
+repeated \s 0
+repeated \t 0
+
+# cut down lines of hyphens, underscores, etc.
+repeated --- 36
+repeated ___ 456
+repeated === 123456
+
+#pass2 `$s1-10 ?
+#pass2 $s1-10 @0
+
diff --git a/liblouis/tables/controlchars.cti b/liblouis/tables/controlchars.cti
new file mode 100644
index 0000000..951bcb9
--- /dev/null
+++ b/liblouis/tables/controlchars.cti
@@ -0,0 +1,27 @@
+# liblouis: some control characters
+
+#  Based on the Linux screenreader BRLTTY, copyright (C) 1999-2006 by
+#  The BRLTTY Team
+#
+#  Copyright (C) 2004-2006 ViewPlus Technologies, Inc. www.viewplus.com
+#  Copyright (C) 2004-2006 JJB Software, Inc. www.jjb-software.com
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+space \x000a a1 newline
+space \x000c a2 forms feed
+space \x000d a3 carriage return
diff --git a/liblouis/tables/corrections.cti b/liblouis/tables/corrections.cti
new file mode 100644
index 0000000..da7dd39
--- /dev/null
+++ b/liblouis/tables/corrections.cti
@@ -0,0 +1,47 @@
+# liblouis: corrections table
+#
+#  Copyright (C) 2009 JJB Software, Inc. www.jjb-software.com
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+# Append this table to others to correct scannos, etc.
+
+repeated ____ 456-456-456-456
+repeated ---- 36-36-36-36
+repeated .... 3-3-3-3 
+sign \x0094 5
+noback correct "\x0094" "\""
+noback correct "\x00a0" "\s"
+noback correct "\x000a" "\s"
+space \x00ad 0
+noback correct "\x00ad" ?
+noback correct "\x2019" "'"
+space \x0097 0
+noback correct "\x0097" "\s"
+noback correct "(\s" "("
+noback correct "\s)" ")" 
+noback correct "cornf" "comf"
+noback correct "cornm" "comm"
+noback correct "cornp" "comp"
+noback correct $p["-"] "\s-\s"
+noback correct "..." *
+noback correct "\s," ","
+noback correct "\s." "."
+noback correct "\s?" "?"
+noback correct "-\"" "--\""
+noback correct [".\s\""]$s ".\""
+noback correct "-"$s ?
diff --git a/liblouis/tables/countries.cti b/liblouis/tables/countries.cti
new file mode 100644
index 0000000..f4d3a7d
--- /dev/null
+++ b/liblouis/tables/countries.cti
@@ -0,0 +1,263 @@
+#
+# Copyright (C) 1995-2004 by The BRLTTY Team. All rights reserved.
+#
+# This file is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with this file; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# This is free software, placed under the terms of the
+# GNU General Public License, as published by the Free Software
+# Foundation.  Please see the file COPYING for details.
+
+# show any "word" which contains a country code in 8-dot computer braille.
+compbrl .ad Andorra
+compbrl .ae United Arab Emirates
+compbrl .af Afghanistan
+compbrl .ag Antigua and Barbuda
+compbrl .ai Anguilla
+compbrl .al Albania
+compbrl .am Armenia
+compbrl .an Netherlands Antilles
+compbrl .ao Angola
+compbrl .aq Antarctica
+compbrl .ar Argentina
+compbrl .as American Samoa
+compbrl .at Austria
+compbrl .au Australia
+compbrl .aw Aruba
+compbrl .az Azerbaijan
+compbrl .ba Bosnia-Herzegovina
+compbrl .bb Barbados
+compbrl .bd Bangladesh
+compbrl .be Belgium
+compbrl .bf Burkina Faso
+compbrl .bg Bulgaria
+compbrl .bh Bahrain
+compbrl .bi Burundi
+compbrl .bj Benin
+compbrl .bm Bermuda
+compbrl .bn Brunei Darussalam
+compbrl .bo Bolivia
+compbrl .br Brazil
+compbrl .bs Bahamas
+compbrl .bt Bhutan
+compbrl .bv Bouvet Island
+compbrl .bw Botswana
+compbrl .by Belarus
+compbrl .bz Belize
+compbrl .ca Canada
+compbrl .cc Cocos (Keeling) Islands
+compbrl .cd The Democratic Republic of The Congo
+compbrl .cf Central African Republic
+compbrl .cg Congo
+compbrl .ch Switzerland
+compbrl .ci Ivory Coast
+compbrl .ck Cook Islands
+compbrl .cl Chile
+compbrl .cm Cameroon
+compbrl .cn China
+compbrl .co Colombia
+compbrl .cr Costa Rica
+compbrl .cu Cuba
+compbrl .cv Cape Verde
+compbrl .cx Christmas Island
+compbrl .cy Cyprus
+compbrl .cz Czech Republic
+compbrl .de Germany
+compbrl .dj Djibouti
+compbrl .dk Denmark
+compbrl .dm Dominica
+compbrl .do Dominican Republic
+compbrl .dz Algeria
+compbrl .ec Ecuador
+compbrl .ee Estonia
+compbrl .eg Egypt
+compbrl .eh Western Sahara
+compbrl .er Eritrea
+compbrl .es Spain
+compbrl .et Ethiopia
+compbrl .fi Finland
+compbrl .fj Fiji
+compbrl .fk Falkland Islands (Malvinas)
+compbrl .fm Micronesia
+compbrl .fo Faroe Islands
+compbrl .fr France
+compbrl .ga Gabon
+compbrl .gb United Kingdom
+compbrl .gd Grenada
+compbrl .ge Georgia
+compbrl .gf French Guiana
+compbrl .gh Ghana
+compbrl .gi Gibraltar
+compbrl .gl Greenland
+compbrl .gm Gambia
+compbrl .gn Guinea
+compbrl .gp Guadeloupe (Fr.)
+compbrl .gq Equatorial Guinea
+compbrl .gr Greece
+compbrl .gs South Georgia And The South Sandwich Islands
+compbrl .gt Guatemala
+compbrl .gu Guam (U.S.)
+compbrl .gw Guinea-Bissau
+compbrl .gy Guyana
+compbrl .hk Hong Kong
+compbrl .hm Heard Island And Mcdonald Islands
+compbrl .hn Honduras
+compbrl .hr Croatia
+compbrl .ht Haiti
+compbrl .hu Hungary
+compbrl .id Indonesia
+compbrl .ie Ireland
+compbrl .il Israel
+compbrl .im Isle of Man
+compbrl .in India
+compbrl .io British Indian Ocean Territory
+compbrl .iq Iraq
+compbrl .ir Iran
+compbrl .is Iceland
+compbrl .it Italy
+compbrl .jm Jamaica
+compbrl .jo Jordan
+compbrl .jp Japan
+compbrl .ke Kenya
+compbrl .kg Kyrgyzstan
+compbrl .kh Cambodia
+compbrl .ki Kiribati
+compbrl .km Comoros
+compbrl .kn Saint Kitts and Nevis
+compbrl .kp Korea (North)
+compbrl .kr Korea (South)
+compbrl .kw Kuwait
+compbrl .ky Cayman Islands
+compbrl .kz Kazakstan
+compbrl .la Lao People's Democratic Republic
+compbrl .lb Lebanon
+compbrl .lc Saint Lucia
+compbrl .li Liechtenstein
+compbrl .lk Sri Lanka
+compbrl .lr Liberia
+compbrl .ls Lesotho
+compbrl .lt Lithuania
+compbrl .lu Luxembourg
+compbrl .lv Latvia
+compbrl .ly Libyan Arab Jamahiriya
+compbrl .ma Morocco
+compbrl .mc Monaco
+compbrl .md Moldova
+compbrl .mg Madagascar
+compbrl .mh Marshall Islands
+compbrl .mk Macedonia
+compbrl .ml Mali
+compbrl .mm Myanmar
+compbrl .mn Mongolia
+compbrl .mo Macau
+compbrl .mp Northern Mariana Islands
+compbrl .mq Martinique
+compbrl .mr Mauritania
+compbrl .ms Montserrat
+compbrl .mt Malta
+compbrl .mu Mauritius
+compbrl .mv Maldives
+compbrl .mw Malawi
+compbrl .mx Mexico
+compbrl .my Malaysia
+compbrl .mz Mozambique
+compbrl .na Namibia
+compbrl .nc New Caledonia (Fr.)
+compbrl .ne Niger
+compbrl .nf Norfolk Island
+compbrl .ng Nigeria
+compbrl .ni Nicaragua
+compbrl .nl Netherlands
+compbrl .no Norway
+compbrl .np Nepal
+compbrl .nr Nauru
+compbrl .nu Niue
+compbrl .nz New Zealand
+compbrl .om Oman
+compbrl .pa Panama
+compbrl .pe Peru
+compbrl .pf Polynesia (Fr.)
+compbrl .pg Papua New Guinea
+compbrl .ph Philippines
+compbrl .pk Pakistan
+compbrl .pl Poland
+compbrl .pm Saint Pierre and Miquelon
+compbrl .pn Pitcairn
+compbrl .pr Puerto Rico (U.S.)
+compbrl .ps Palestinian Territory, Occupied
+compbrl .pt Portugal
+compbrl .pw Palau
+compbrl .py Paraguay
+compbrl .qa Qatar
+compbrl .re Reunion (Fr.)
+compbrl .ro Romania
+compbrl .ru Russia
+compbrl .rw Rwanda
+compbrl .sa Saudi Arabia
+compbrl .sb Solomon Islands
+compbrl .sc Seychelles
+compbrl .sd Sudan
+compbrl .se Sweden
+compbrl .sg Singapore
+compbrl .sh Saint Helena
+compbrl .si Slovenia
+compbrl .sj Svalbard and Jan Mayen
+compbrl .sk Slovakia
+compbrl .sl Sierra Leone
+compbrl .sm San Marino
+compbrl .sn Senegal
+compbrl .so Somalia
+compbrl .sr Suriname
+compbrl .st Sao Tome And Principe
+compbrl .su U.S.S.R.
+compbrl .sv El Salvador
+compbrl .sy Syrian Arab Republic
+compbrl .sz Swaziland
+compbrl .tc Turks And Caicos Islands
+compbrl .td Chad
+compbrl .tf French Southern Territories
+compbrl .tg Togo
+compbrl .th Thailand
+compbrl .tj Tajikistan
+compbrl .tk Tokelau
+compbrl .tm Turkmenistan
+compbrl .tn Tunisia
+compbrl .to Tonga
+compbrl .tp East Timor
+compbrl .tr Turkey
+compbrl .tt Trinidad and Tobago
+compbrl .tv Tuvalu
+compbrl .tw Taiwan
+compbrl .tz Tanzania
+compbrl .ua Ukraine
+compbrl .ug Uganda
+compbrl .uk United Kingdom
+compbrl .um United States Minor Outlying Islands
+compbrl .us United States
+compbrl .uy Uruguay
+compbrl .uz Uzbekistan
+compbrl .va Holy See (Vatican City State)
+compbrl .vc St. Vincent and the Grenadines
+compbrl .ve Venezuela
+compbrl .vg Virgin Islands, British
+compbrl .vi Virgin Islands, U.S.
+compbrl .vn Vietnam
+compbrl .vu Vanuatu
+compbrl .wf Wallis and Futuna
+compbrl .ws Samoa
+compbrl .ye Yemen
+compbrl .yt Mayotte
+compbrl .yu Yugoslavia
+compbrl .za South Africa
+compbrl .zm Zambia
+compbrl .zw Zimbabwe
diff --git a/liblouis/tables/cs-chardefs.cti b/liblouis/tables/cs-chardefs.cti
new file mode 100644
index 0000000..e8ec893
--- /dev/null
+++ b/liblouis/tables/cs-chardefs.cti
@@ -0,0 +1,250 @@
+#
+#  Copyright (C) 2011 by Bert Frees <bertfrees@gmail.com>
+#  Copyright (C) 2011 by Jan Halousek <merit@login.cz>
+#  Copyright (C) 2012 by Brailcom, o.p.s.
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+# ----------------------------------------------------------------------------------------------
+#
+#  Czech Braille
+#
+#     Created and maintained by Bert Frees <bertfrees@gmail.com>
+#                               Jan Halousek <merit@login.cz>
+#
+#     Based on the official Czech Braille Standard
+# ----------------------------------------------------------------------------------------------
+
+# ==============================================================================================
+# SINGLE-CELL
+# ==============================================================================================
+
+uplow       \x0041\x0061  1,1                 Aa                  LATIN CAPITAL LETTER A - LATIN SMALL LETTER A
+uplow       \x0042\x0062  12,12               Bb                  LATIN CAPITAL LETTER B - LATIN SMALL LETTER B
+uplow       \x0043\x0063  14,14               Cc                  LATIN CAPITAL LETTER C - LATIN SMALL LETTER C
+uplow       \x0044\x0064  145,145             Dd                  LATIN CAPITAL LETTER D - LATIN SMALL LETTER D
+uplow       \x0045\x0065  15,15               Ee                  LATIN CAPITAL LETTER E - LATIN SMALL LETTER E
+uplow       \x0046\x0066  124,124             Ff                  LATIN CAPITAL LETTER F - LATIN SMALL LETTER F
+uplow       \x0047\x0067  1245,1245           Gg                  LATIN CAPITAL LETTER G - LATIN SMALL LETTER G
+uplow       \x0048\x0068  125,125             Hh                  LATIN CAPITAL LETTER H - LATIN SMALL LETTER H
+uplow       \x0049\x0069  24,24               Ii                  LATIN CAPITAL LETTER I - LATIN SMALL LETTER I
+uplow       \x004A\x006A  245,245             Jj                  LATIN CAPITAL LETTER J - LATIN SMALL LETTER J
+uplow       \x004B\x006B  13,13               Kk                  LATIN CAPITAL LETTER K - LATIN SMALL LETTER K
+uplow       \x004C\x006C  123,123             Ll                  LATIN CAPITAL LETTER L - LATIN SMALL LETTER L
+uplow       \x004D\x006D  134,134             Mm                  LATIN CAPITAL LETTER M - LATIN SMALL LETTER M
+uplow       \x004E\x006E  1345,1345           Nn                  LATIN CAPITAL LETTER N - LATIN SMALL LETTER N
+uplow       \x004F\x006F  135,135             Oo                  LATIN CAPITAL LETTER O - LATIN SMALL LETTER O
+uplow       \x0050\x0070  1234,1234           Pp                  LATIN CAPITAL LETTER P - LATIN SMALL LETTER P
+uplow       \x0051\x0071  12345,12345         Qq                  LATIN CAPITAL LETTER Q - LATIN SMALL LETTER Q
+uplow       \x0052\x0072  1235,1235           Rr                  LATIN CAPITAL LETTER R - LATIN SMALL LETTER R
+uplow       \x0053\x0073  234,234             Ss                  LATIN CAPITAL LETTER S - LATIN SMALL LETTER S
+uplow       \x0054\x0074  2345,2345           Tt                  LATIN CAPITAL LETTER T - LATIN SMALL LETTER T
+uplow       \x0055\x0075  136,136             Uu                  LATIN CAPITAL LETTER U - LATIN SMALL LETTER U
+uplow       \x0056\x0076  1236,1236           Vv                  LATIN CAPITAL LETTER V - LATIN SMALL LETTER V
+uplow       \x0057\x0077  12356,12356         Ww                  LATIN CAPITAL LETTER W - LATIN SMALL LETTER W
+uplow       \x0058\x0078  1346,1346           Xx                  LATIN CAPITAL LETTER X - LATIN SMALL LETTER X
+uplow       \x0059\x0079  13456,13456         Yy                  LATIN CAPITAL LETTER Y - LATIN SMALL LETTER Y
+uplow       \x005A\x007A  1356,1356           Zz                  LATIN CAPITAL LETTER Z - LATIN SMALL LETTER Z
+
+uplow       \x00C1\x00E1  16,16               Áá                  LATIN CAPITAL LETTER A WITH ACUTE - LATIN SMALL LETTER A WITH ACUTE
+uplow       \x00C9\x00E9  345,345             Éé                  LATIN CAPITAL LETTER E WITH ACUTE - LATIN SMALL LETTER E WITH ACUTE
+uplow       \x00CD\x00ED  34,34               Íí                  LATIN CAPITAL LETTER I WITH ACUTE - LATIN SMALL LETTER I WITH ACUTE
+uplow       \x00D3\x00F3  246,246             Óó                  LATIN CAPITAL LETTER O WITH ACUTE - LATIN SMALL LETTER O WITH ACUTE
+uplow       \x00DA\x00FA  346,346             Úú                  LATIN CAPITAL LETTER U WITH ACUTE - LATIN SMALL LETTER U WITH ACUTE
+uplow       \x00DD\x00FD  12346,12346         Ýý                  LATIN CAPITAL LETTER Y WITH ACUTE - LATIN SMALL LETTER Y WITH ACUTE
+uplow       \x010C\x010D  146,146             Čč                  LATIN CAPITAL LETTER C WITH CARON - LATIN SMALL LETTER C WITH CARON
+uplow       \x010E\x010F  1456,1456           Ďď                  LATIN CAPITAL LETTER D WITH CARON - LATIN SMALL LETTER D WITH CARON
+uplow       \x011A\x011B  126,126             Ěě                  LATIN CAPITAL LETTER E WITH CARON - LATIN SMALL LETTER E WITH CARON
+uplow       \x013D\x013E  123456,123456       Ľľ                  LATIN CAPITAL LETTER L WITH CARON - LATIN SMALL LETTER L WITH CARON
+uplow       \x0147\x0148  1246,1246           Ňň                  LATIN CAPITAL LETTER N WITH CARON - LATIN SMALL LETTER N WITH CARON
+uplow       \x0158\x0159  2456,2456           Řř                  LATIN CAPITAL LETTER R WITH CARON - LATIN SMALL LETTER R WITH CARON
+uplow       \x0160\x0161  156,156             Šš                  LATIN CAPITAL LETTER S WITH CARON - LATIN SMALL LETTER S WITH CARON
+uplow       \x0164\x0165  1256,1256           Ťť                  LATIN CAPITAL LETTER T WITH CARON - LATIN SMALL LETTER T WITH CARON
+uplow       \x016E\x016F  23456,23456         Ůů                  LATIN CAPITAL LETTER U WITH RING ABOVE - LATIN SMALL LETTER U WITH RING ABOVE
+uplow       \x017D\x017E  2346,2346           Žž                  LATIN CAPITAL LETTER Z WITH CARON - LATIN SMALL LETTER Z WITH CARON
+
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 0000..007F  C0 Controls and Basic Latin
+# ----------------------------------------------------------------------------------------------
+
+space       \x0009        9                                       <control> HORIZONTAL TABULATION
+space       \x000A        0                                       <control> LINE FEED
+space       \x000C        0                                       <control> FORM FEED
+space       \x000D        0                                       <control> CARRIAGE RETURN
+space       \x001B        1b                                      <control> ESCAPE
+space       \x0020        0                                       SPACE
+
+punctuation \x0021        235                 !                   EXCLAMATION MARK
+punctuation \x0022        2356                "                   QUOTATION MARK
+sign        \x0023        3456                #                   NUMBER SIGN
+punctuation \x0027        4                   '                   APOSTROPHE
+punctuation \x0028        236                 (                   LEFT PARENTHESIS
+punctuation \x0029        356                 )                   RIGHT PARENTHESIS
+sign        \x002A        35                  *                   ASTERISK
+math        \x002B        256                 +                   PLUS SIGN
+punctuation \x002C        2                   ,                   COMMA
+punctuation \x002D        36                  -                   HYPHEN-MINUS
+punctuation \x002E        3                   .                   FULL STOP
+math        \x002F        12456               /                   SOLIDUS
+include digits6Dots.uti
+punctuation \x003A        25                  :                   COLON
+punctuation \x003B        23                  ;                   SEMICOLON
+math        \x003C        126                 <                   LESS-THAN SIGN
+math        \x003D        2356                =                   EQUALS SIGN
+math        \x003E        345                 >                   GREATER-THAN SIGN
+punctuation \x003F        26                  ?                   QUESTION MARK
+punctuation \x0060        4                   `                   GRAVE ACCENT
+sign        \x007C        456                 |                   VERTICAL LINE
+
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 0080..00FF  C1 Controls and Latin-1 Supplement
+# ----------------------------------------------------------------------------------------------
+
+space       \x00A0        a                                       NO-BREAK SPACE
+punctuation \x00AD        36                  ­                   SOFT HYPHEN
+math        \x00B1        256-36              ±                   PLUS-MINUS SIGN
+sign        \x00B4        4                   ´                   ACUTE ACCENT
+math        \x00D7        346                 ×                   MULTIPLICATION SIGN
+math        \x00F7        25                  ÷                   DIVISION SIGN
+
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 2000..206F  General Punctuation
+# ----------------------------------------------------------------------------------------------
+
+punctuation \x2010        36                  ‐                   HYPHEN
+punctuation \x2011        36                  ‑                   NON-BREAKING HYPHEN
+punctuation \x2012        36                  ‒                   FIGURE DASH
+punctuation \x2013        36                  –                   EN DASH
+punctuation \x2014        36                  —                   EM DASH
+punctuation \x2015        36                  ―                   HORIZONTAL BAR
+punctuation \x2018        4                   ‘                   LEFT SINGLE QUOTATION MARK
+punctuation \x2019        4                   ’                   RIGHT SINGLE QUOTATION MARK
+punctuation \x201A        4                   ‚                   SINGLE LOW-9 QUOTATION MARK
+punctuation \x201B        4                   ‛                   SINGLE HIGH-REVERSED-9 QUOTATION MARK
+punctuation \x201C        2356                “                   LEFT DOUBLE QUOTATION MARK
+punctuation \x201D        2356                ”                   RIGHT DOUBLE QUOTATION MARK
+punctuation \x201E        2356                „                   DOUBLE LOW-9 QUOTATION MARK
+punctuation \x201F        2356                ‟                   DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+
+
+# ==============================================================================================
+# MULTI-CELL
+# ==============================================================================================
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 0000..007F  C0 Controls and Basic Latin
+# ----------------------------------------------------------------------------------------------
+
+sign        \x0024        3456-1246           $                   DOLLAR SIGN
+math        \x0025        3456-1234           %                   PERCENT SIGN
+sign        \x0026        3456-12346          &                   AMPERSAND
+sign        \x0040        3456-12456          @                   COMMERCIAL AT
+punctuation \x005B        6-236               [                   LEFT SQUARE BRACKET
+sign        \x005C        3456-1256           \                   REVERSE SOLIDUS
+punctuation \x005D        6-356               ]                   RIGHT SQUARE BRACKET
+sign        \x005E        6-45                ^                   CIRCUMFLEX ACCENT
+sign        \x005F        6-36                _                   LOW LINE
+math        \x007B        45-236              {                   LEFT CURLY BRACKET
+math        \x007D        45-356              }                   RIGHT CURLY BRACKET
+math        \x007E        6-5                 ~                   TILDE
+
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 0080..00FF  C1 Controls and Latin-1 Supplement
+# ----------------------------------------------------------------------------------------------
+
+sign        \x0080        15-136-1235-135     €                   <control> - ANSI: EURO-CURRENCY SIGN - MACROMAN: A DIAERESIS
+sign        \x00B0        3456-234            °                   DEGREE SIGN
+sign        \x00B5        4-134               µ                   MICRO SIGN
+math        \x00B9        34-1                ¹                   SUPERSCRIPT ONE
+uplow       \x00C4\x00E4  1-15,1-15           Ää                  LATIN CAPITAL LETTER A WITH DIAERESIS - LATIN SMALL LETTER A WITH DIAERESIS
+uplow       \x00D6\x00F6  135-15,135-15       Öö                  LATIN CAPITAL LETTER O WITH DIAERESIS - LATIN SMALL LETTER O WITH DIAERESIS
+uplow       \x00DC\x00FC  136-15,136-15       Üü                  LATIN CAPITAL LETTER U WITH DIAERESIS - LATIN SMALL LETTER U WITH DIAERESIS
+
+
+# ----------------------------------------------------------------------------------------------
+# Unicode 0370..03FF  Greek and Coptic
+# ----------------------------------------------------------------------------------------------
+
+letter      \x0391        46-1                Α                   GREEK CAPITAL LETTER ALPHA
+letter      \x0392        46-12               Β                   GREEK CAPITAL LETTER BETA
+letter      \x0393        46-1245             Γ                   GREEK CAPITAL LETTER GAMMA
+letter      \x0394        46-145              Δ                   GREEK CAPITAL LETTER DELTA
+letter      \x0395        46-15               Ε                   GREEK CAPITAL LETTER EPSILON
+letter      \x0398        46-1456             Θ                   GREEK CAPITAL LETTER THETA
+letter      \x0399        46-24               Ι                   GREEK CAPITAL LETTER IOTA
+letter      \x039A        46-13               Κ                   GREEK CAPITAL LETTER KAPPA
+letter      \x039B        46-123              Λ                   GREEK CAPITAL LETTER LAMDA
+letter      \x039C        46-134              Μ                   GREEK CAPITAL LETTER MU
+letter      \x039D        46-1345             Ν                   GREEK CAPITAL LETTER NU
+letter      \x039E        46-1346             Ξ                   GREEK CAPITAL LETTER XI
+letter      \x039F        46-135              Ο                   GREEK CAPITAL LETTER OMICRON
+letter      \x03A0        46-1234             Π                   GREEK CAPITAL LETTER PI
+letter      \x03A1        46-1235             Ρ                   GREEK CAPITAL LETTER RHO
+letter      \x03A3        46-234              Σ                   GREEK CAPITAL LETTER SIGMA
+letter      \x03A4        46-2345             Τ                   GREEK CAPITAL LETTER TAU
+letter      \x03A5        46-13456            Υ                   GREEK CAPITAL LETTER UPSILON
+letter      \x03A6        46-124              Φ                   GREEK CAPITAL LETTER PHI
+letter      \x03A7        46-125              Χ                   GREEK CAPITAL LETTER CHI
+letter      \x03A8        46-12346            Ψ                   GREEK CAPITAL LETTER PSI
+letter      \x03A9        46-2356             Ω                   GREEK CAPITAL LETTER OMEGA
+
+lowercase   \x03B1        45-1                α                   GREEK SMALL LETTER ALPHA
+lowercase   \x03B2        45-12               β                   GREEK SMALL LETTER BETA
+lowercase   \x03B3        45-1245             γ                   GREEK SMALL LETTER GAMMA
+lowercase   \x03B4        45-145              δ                   GREEK SMALL LETTER DELTA
+lowercase   \x03B5        45-15               ε                   GREEK SMALL LETTER EPSILON
+lowercase   \x03B8        45-1456             θ                   GREEK SMALL LETTER THETA
+lowercase   \x03B9        45-24               ι                   GREEK SMALL LETTER IOTA
+lowercase   \x03BA        45-13               κ                   GREEK SMALL LETTER KAPPA
+lowercase   \x03BB        45-123              λ                   GREEK SMALL LETTER LAMDA
+lowercase   \x03BC        45-134              μ                   GREEK SMALL LETTER MU
+lowercase   \x03BD        45-1345             ν                   GREEK SMALL LETTER NU
+lowercase   \x03BE        45-1346             ξ                   GREEK SMALL LETTER XI
+lowercase   \x03BF        45-135              ο                   GREEK SMALL LETTER OMICRON
+lowercase   \x03C0        45-1234             π                   GREEK SMALL LETTER PI
+lowercase   \x03C1        45-1235             ρ                   GREEK SMALL LETTER RHO
+lowercase   \x03C3        45-234              σ                   GREEK SMALL LETTER SIGMA
+lowercase   \x03C4        45-2345             τ                   GREEK SMALL LETTER TAU
+lowercase   \x03C5        45-13456            υ                   GREEK SMALL LETTER UPSILON
+lowercase   \x03C6        45-124              φ                   GREEK SMALL LETTER PHI
+lowercase   \x03C7        45-125              χ                   GREEK SMALL LETTER CHI
+lowercase   \x03C8        45-12346            ψ                   GREEK SMALL LETTER PSI
+lowercase   \x03C9        45-2356             ω                   GREEK SMALL LETTER OMEGA
+
+# ----------------------------------------------------------------------------------------------
+# Other Unicode characters
+# ----------------------------------------------------------------------------------------------
+
+math        \x2030        3456-1235           ‰                   PER MILLE SIGN
+math        \x0609        3456-1235           ؉                   ARABIC-INDIC PER MILLE SIGN
+math        \x27E8        4-126               ⟨                   MATHEMATICAL LEFT ANGLE BRACKET
+math        \x27E9        4-345               ⟩                   MATHEMATICAL RIGHT ANGLE BRACKET
+math        \x2260        4-2356              ≠                   NOT EQUAL TO
+math        \x2250        5-2356              ≐                   APPROACHES THE LIMIT
+math        \x2264        126-2356            ≤                   LESS-THAN OR EQUAL TO
+math        \x2265        345-2356            ≥                   GREATER-THAN OR EQUAL TO
+math        \x22C5        3                   ⋅                   DOT OPERATOR
+math        \x2217        35                  ∗                   ASTERISK OPERATOR
+math        \x2236        25                  ∶                   RATIO
+math        \x2208        45-15               ∈                   ELEMENT OF
+math        \x2209        4-45-15             ∉                   NOT AN ELEMENT OF
+
+# ----------------------------------------------------------------------------------------------
diff --git a/liblouis/tables/cs-g1.ctb b/liblouis/tables/cs-g1.ctb
new file mode 100644
index 0000000..0183df1
--- /dev/null
+++ b/liblouis/tables/cs-g1.ctb
@@ -0,0 +1,35 @@
+#
+#  Copyright (C) 2011 by Bert Frees <bertfrees@gmail.com>
+#  Copyright (C) 2011 by Jan Halousek <merit@login.cz>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#--------------------------------------------------------------------------------
+#
+#  Czech Braille
+#
+#     Created and maintained by Bert Frees <bertfrees@gmail.com>
+#                               Jan Halousek <merit@login.cz>
+#
+#     Based on the official Czech Braille Standard
+# -------------------------------------------------------------------------------
+
+include cs-chardefs.cti
+include braille-patterns.cti
+include cs-translation.cti
+
+# -------------------------------------------------------------------------------
diff --git a/liblouis/tables/cs-translation.cti b/liblouis/tables/cs-translation.cti
new file mode 100644
index 0000000..75fe283
--- /dev/null
+++ b/liblouis/tables/cs-translation.cti
@@ -0,0 +1,63 @@
+#
+#  Copyright (C) 2011 by Bert Frees <bertfrees@gmail.com>
+#  Copyright (C) 2011 by Jan Halousek <merit@login.cz>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+# ----------------------------------------------------------------------------------------------
+#
+#  Czech Braille
+#
+#     Created and maintained by Bert Frees <bertfrees@gmail.com>
+#                               Jan Halousek <merit@login.cz>
+#
+#     Based on the official Czech Braille Standard
+# ----------------------------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------------------------
+# Braille indicator opcodes
+# ----------------------------------------------------------------------------------------------
+
+numsign  3456
+capsletter  6
+begcapsword  56
+endcapsword  5
+
+# ----------------------------------------------------------------------------------------------
+# Literary digits
+# ----------------------------------------------------------------------------------------------
+
+include litdigits6Dots.uti
+
+# ----------------------------------------------------------------------------------------------
+# Decimal points, hyphens
+# ----------------------------------------------------------------------------------------------
+
+decpoint  \x002C  2
+decpoint  \x002E  3
+hyphen    \x002D  36
+
+# ----------------------------------------------------------------------------------------------
+# Letter prefix in numbers
+# ----------------------------------------------------------------------------------------------
+
+class    digitletter                 abcdefghij
+noback context  $d[]%digitletter            @5
+noback context  $d"."[]%digitletter         @5
+noback context  $d","[]%digitletter         @5
+
+# ----------------------------------------------------------------------------------------------
diff --git a/liblouis/tables/cs.tbl b/liblouis/tables/cs.tbl
new file mode 100644
index 0000000..95f6c60
--- /dev/null
+++ b/liblouis/tables/cs.tbl
@@ -0,0 +1,17 @@
+#+locale:cs
+#+type:literary
+#+grade:1
+#+hyphenation:yes
+
+# TODO: Please correct the metadata above. It is not meant to be
+# accurate nor complete. It hasn't been verified by the table
+# author yet. It is merely an attempt by the liblouis maintainers
+# to get some sensible initial values in place.
+
+# TODO: Please add a reference to official documentation about
+# the implemented braille code. Preferably submit the documents
+# to https://github.com/liblouis/braille-specs.
+
+include cs-g1.ctb
+include hyph_cs_CZ.dic
+include braille-patterns.cti
diff --git a/liblouis/tables/cy-cy-g1.utb b/liblouis/tables/cy-cy-g1.utb
new file mode 100644
index 0000000..8f42358
--- /dev/null
+++ b/liblouis/tables/cy-cy-g1.utb
@@ -0,0 +1,441 @@
+# liblouis: Welsh Grade 1 table
+#
+# Based on the braille contraction modules in BRLTTY
+#
+# Copyright (C) 1995-2004 by The BRLTTY Team.
+# Copyright (C) 2004 ViewPlus Technologies, inc.,  www.viewplustech.com
+# Copyright (C) 2004 Computers to Help People, Inc., www.chpi.org
+
+# This file is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with this file; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+include text_nabcc.dis All display opcodes
+space \s 0 blank
+space \t 9 tab
+space \x000a 0 newline
+space \x000c 0
+space \x000d 0 carriage return
+space \x001b 1b escape character for html back-translation
+space \x00A0 a NO-BREAK SPACE <noBreak> 0020 NON-BREAKING SPACE 
+include loweredDigits6Dots.uti
+
+include latinLetterDef8Dots.uti
+
+punctuation ( 12356
+punctuation } 12456
+punctuation ] 124567
+punctuation ? 1456
+punctuation : 156
+punctuation ) 23456
+punctuation ! 2346
+punctuation { 246
+punctuation [ 2467
+punctuation ' 3
+punctuation - 36
+punctuation . 46
+punctuation " 5
+punctuation ; 56
+punctuation , 6
+sign & 12346
+sign $ 1246
+sign | 1256
+sign \\ 12567
+sign % 146
+sign * 16
+sign # 3456
+punctuation ` 4
+sign _ 456
+sign ^ 457
+sign @ 47
+math = 123456
+math < 126
+math / 34
+math > 345
+math + 346
+math ~ 45
+
+# Miscellaneous
+math \x00B1 346-36 PLUS-MINUS SIGN PLUS-OR-MINUS SIGN 
+math \x00B7 16 MIDDLE DOT 
+math \x00BC 1456-2-34-256-3456 VULGAR FRACTION ONE QUARTER No 0031 2044 
+math \x00BD 1456-2-34-23-3456 VULGAR FRACTION ONE HALF No 0031 2044 0032 
+math \x00BE 1456-25-34-23-3456 VULGAR FRACTION THREE QUARTERS No 0033 
+math \x00D7 4-16 MULTIPLICATION SIGN 
+math \x00F7 46-34 DIVISION SIGN 
+punctuation \x0092 3
+punctuation \x0097 36-36
+punctuation \x00A1 235 INVERTED EXCLAMATION MARK 
+punctuation \x00ad 36
+punctuation \x00BF 236 INVERTED QUESTION MARK 
+punctuation \x2011 36
+punctuation \x2013 36-36
+punctuation \x2014 36-36
+punctuation \x2018 6-236
+punctuation \x2019 3
+punctuation \x2019 356-3
+punctuation \x201c 236
+punctuation \x201d 356
+punctuation \x2026 3
+sign \x2122 45-2345 trademark sign
+sign \x00A2 4-14 CENT SIGN 
+sign \x00A3 3456 POUND SIGN 
+sign \x00A4 1246 CURRENCY SIGN 
+sign \x00A7 4-234 SECTION SIGN 
+sign \x00A9 45-14 COPYRIGHT SIGN 
+sign \x00AE 45-1235 REGISTERED SIGN REGISTERED TRADE MARK SIGN 
+sign \x00B0 56-145-1245 DEGREE SIGN 
+sign \x00B4 b4 ACUTE ACCENT 0020 0301 SPACING ACUTE 
+sign \x00B5 46-134 MICRO SIGN 03BC 039C 039C
+sign \x00A5 4-13456 YEN SIGN 
+punctuation \x00A6 456-1256 BROKEN BAR BROKEN VERTICAL BAR 
+# sign \x00A8 DIAERESIS 0020 0308 SPACING DIAERESIS 
+# sign \x00AA FEMININE ORDINAL INDICATOR 0061 
+# punctuation \x00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK LEFT 
+# sign \x00AC NOT SIGN 
+# sign \x00AF MACRON 0020 0304 SPACING MACRON 
+# math \x00B2 SUPERSCRIPT TWO 0032 2 2 SUPERSCRIPT DIGIT TWO 
+# math \x00B3 SUPERSCRIPT THREE 0033 3 3 SUPERSCRIPT DIGIT THREE 
+sign \x00B6 1234-345 PILCROW SIGN PARAGRAPH SIGN 
+# sign \x00B8 CEDILLA 0020 0327 SPACING CEDILLA 
+# math \x00B9 SUPERSCRIPT ONE 0031 1 1 SUPERSCRIPT DIGIT ONE 
+sign \x00BA 145-1245 MASCULINE ORDINAL INDICATOR 006F 
+# punctuation \x00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK Pf Y 
+
+punctuation \x2010 36			# 8208  hyphen
+punctuation	\x201F 356		# 8223	smart double high reverse quotation mark
+punctuation	\x201E 236		# 8222	smart double low quotation mark
+
+noback sign \X25CF 16 black circle
+
+# Braille indicators
+numsign 3456  number sign, just a dots operand
+multind 56-6 letsign capsletter
+letsign 56
+capsletter 6
+begcapsword 6-6
+endcapsword 6-3
+emphclass italic
+emphclass underline
+emphclass bold
+begemph italic 46
+endemph italic 46-3
+begemph bold 46-46
+endemph bold 46-3
+begcomp 6-346
+endcomp 6-346
+
+# the decimal digits
+include litdigits6Dots.uti
+
+# Letters not defined in en-chardefs
+always ch 16
+always th 1456
+
+#single letter words
+word a 1
+word A 1
+word i 24
+word I 24
+word o 135
+word O 135
+word y 13456
+word Y 13456
+
+# punctuation
+prepunc " 236
+postpunc " 356
+always " 5
+prepunc ' 6-236
+postpunc ' 356-3
+postpunc '' 356
+postpunc ''' 356-3-356
+
+always ' 3
+midnum , 3
+always , 2
+midnum . 2
+decpoint . 2
+always . 256
+always ; 23
+midnum : 6-25
+always : 25
+endnum ! 6-235
+always ! 235
+always # 4-3456
+midnum / 456-34-3456
+always / 456-34
+always ? 236
+endnum % 0-25-1234
+always % 25-1234
+midnum ^ 346-3456
+always ^ 456-126
+always ~ 4-156
+always & 4-12346
+midnum * 0-56-236-3456
+always * 35-35
+repeated *** 35-35-0-35-35-0-35-35
+prepunc ( 2356
+postpunc ) 2356
+always [ 6-2356
+always ] 2356-3
+always { 46-2356
+always } 46-2356
+always -com =
+endword -to = pointed-to resource
+endword -by = used-by
+# always _ 78
+prepunc `` 236
+prepunc ` 6-236
+always ` 4
+always @ 2346
+always \\ 5-16
+always | 5-123
+repeated --- 36-36-36
+
+# repeated ___ 78-78-78
+repeated ___ 46-46-46
+
+repeated ::: 25-25-25
+
+repeated === 56-2356-56-2356-56-2356
+repeated ~~~ 4-156-4-156-4-156
+always \s-\s 36-36
+always \s-\scom 36-36-14-135-134
+always ... 3-3-3
+always .\s.\s. 3-3-3 . . .
+# always  \x2026 3-3-3 # 8230			MS Word smart ellipsis
+
+# the hyphen
+# always ­ 36
+repeated ­­­ 36-36-36
+always \s­\s 36-36
+
+# accented letters
+
+uplow \x00C0\x00E0 1				# a with grave
+uplow \x00C1\x00E1 1				# a with acute
+uplow \x00C2\x00E2 1				# a with circumflex
+#uplow \x00C3\x00E3 1				# a with tilde
+uplow \x00C4\x00E4 1				# a with dieresis
+#uplow \x00C5\x00E5 1				# a with ring above
+uplow \x00C6\x00E6 1				# letter ae
+#uplow \x00C7\x00E7 14				# c with cedilla
+uplow \x00C8\x00E8 15				# e with grave
+uplow \x00C9\x00E9 15				# e with acute
+uplow \x00CA\x00EA 15				# e with circumflex
+uplow \x00CB\x00EB 15				# e with dieresis
+uplow \x00CC\x00EC 24				# i with grave above
+uplow \x00CD\x00ED 24				# i with acute above
+uplow \x00CE\x00EE 24				# i with circumflex
+uplow \x00CF\x00EF 24				# i with dieresis
+#uplow \x00D0\x00F0 15				# letter eth
+#uplow \x00D1\x00F1 1345			# n with tilde
+uplow \x00D2\x00F2 135			# o with grave above
+uplow \x00D3\x00F3 135			# o with acute above
+uplow \x00D4\x00F4 135			# o with circumflex
+#uplow \x00D5\x00F5 135			# o with tilde
+uplow \x00D6\x00F6 135			# o with dieresis
+# \x00D7	× multiplication sign	----------------------
+#uplow \x00D8\x00F8 135			# o with stroke
+uplow \x00D9\x00F9 136			# u with grave above
+uplow \x00DA\x00FA 136			# u with acute above
+uplow \x00DB\x00FB 136			# u with circumflex above
+uplow \x00DC\x00FC 136				# u with dieeresis
+uplow \x00DD\x00FD 13456		# y with acute above
+#uplow \x00DE\x00FE 2345			# letter thorn
+letter \x00DF 2346		# small sharp s
+uplow \x0174\x0175 2456 w with circumflex
+uplow \x0176\x0177 13456 # y with circumflex
+uplow \x0178\x00ff 13456 # y with diaeresis
+uplow \x1ef2\x1ef3 13456 # y with grave
+
+largesign \x00C0 23-1      [C0] upper a grave
+largesign \x00E0   23-1      [E0] lower a grave
+
+largesign \x00C1 25-1      [C1] upper a acute
+largesign \x00E1   25-1      [E1] lower a acute
+
+largesign \x00C2 4-1      [C2] upper a circumflex
+largesign \x00E2   4-1      [E2] lower a circumflex
+
+#largesign \x00C3 4-1      [C3] upper a tilde
+#largesign \x00E3   4-1      [E3] lower a tilde
+
+largesign \x00C4 45-1      [C4] upper a dieresis
+largesign \x00E4   45-1      [E4] lower a dieresis
+
+#largesign \x00C5 4-1      [C5] upper a ring
+#largesign \x00E5   4-1      [E5] lower a ring
+
+largesign \x00C6 1-15     [C6] upper ae
+largesign \x00E6   1-15			[E6] lower ae
+
+#largesign \x00C7 4-14     [C7] upper c cedilla
+#largesign \x00E7   4-14     [E7] lower c cedilla
+
+largesign \x00C8 23-15     [C8] upper e grave
+largesign \x00E8   23-15     [E8] lower e grave
+
+largesign \x00C9 25-15     [C9] upper e acute
+largesign \x00E9   25-15     [E9] lower e acute
+
+largesign \x00CA 4-15     [CA] upper e circumflex
+largesign \x00EA   4-15     [EA] lower e circumflex
+
+largesign \x00CB 45-15     [CB] upper e dieresis
+largesign \x00EB   45-15     [EB] lower e dieresis
+
+largesign \x00CC 23-24     [CC] upper i grave
+largesign \x00EC   23-24     [EC] lower i grave
+
+largesign \x00CD 25-24     [CD] upper i acute
+largesign \x00ED   25-24     [ED] lower i acute
+
+largesign \x00CE 4-24     [CE] upper i circumflex
+largesign \x00EE   4-24     [EE] lower i circumflex
+
+largesign \x00CF 45-24     [CF] upper i dieresis
+largesign \x00EF   45-24     [EF] lower i dieresis
+
+#largesign \x00D0 4-15     [D0] upper eth
+#largesign \x00F0   4-15     [F0] lower eth
+
+#largesign \x00D1 4-1345   [D1] upper n tilde
+#largesign \x00F1   4-1345   [F1] lower n tilde
+
+largesign \x00D2 23-135    [D2] upper o grave
+largesign \x00F2   23-135    [F2] lower o grave
+
+largesign \x00D3 25-135    [D3] upper o acute
+largesign \x00F3   25-135    [F3] lower o acute
+
+largesign \x00D4 4-135    [D4] upper o circumflex
+largesign \x00F4   4-135    [F4] lower o circumflex
+
+#largesign \x00D5 4-135    [D5] upper o tilde
+#largesign \x00F5   4-135    [F5] lower o tilde
+
+largesign \x00D6 45-135    [D6] upper o dieresis
+largesign \x00F6   45-135			[F6] lower o dieresis
+
+#largesign \x00D8 4-135    [D8] upper o slash
+#largesign \x00f8   4-135    [F8] lower o slash
+
+largesign \x00D9 23-136    [D9] upper u grave
+largesign \x00F9   23-136    [F9] lower u grave
+
+largesign \x00DA 25-136    [DA] upper u acute
+largesign \x00FA   25-136    [FA] lower u acute
+
+largesign \x00DB 4-136    [DB] upper u circumflex
+largesign \x00FB   4-136    [FB] lower u circumflex
+
+largesign \x00DC 45-136    [DC] upper u dieresis
+largesign \x00FC   54-136    [FC] lower u dieresis
+
+largesign \x00DD 25-13456  [DD] upper y acute
+largesign \x00FD   25-13456  [FD] lower y acute
+
+#largesign \x00DE 4-2345   [DE] upper t horn
+#largesign \x00FE   4-2345   [FE] lower t horn
+
+largesign \x00DF 234-234 (DF) lower ss
+
+largesign \x0174 4-2456 lower w circumflex
+largesign \x0175 4-2456 upper w circumflex
+
+largesign \x0176 4-13456 upper y circumflex
+largesign \x0177 4-13456 lower y circumflex
+
+largesign \x0178 45-13456 upper y with dieresis
+largesign \x00FF 45-13456 lower y with dieresis
+
+largesign \x1EF2 23-13456 upper y with grave
+largesign \x1EF3 23-13456 lower y with grave
+
+hyphen 	\x2010 36		 # 8208			hyphen
+
+# punctuation \x2011 36		 # 8209			non-breaking hyphen
+punctuation \x2011 23478	# 8209  non-breaking hyphen
+
+
+always	\x2013 56-36		 # 8211		smart minus sign
+
+
+always	\x201C 236	 # 8220			smart opening double quote
+always	\x201D 356	 # 8221			smart closing double quote
+always	\x201E 236	 # 8222			smart double low quotation mark
+always	\x201F 356	 # 8223			smart double high reverse quotation mark
+
+
+# mathematical symbols
+decpoint . 2
+always < 246
+joinword = 56-2356
+joinnum = 56-2356
+always > 135
+midnum + 0-56-235-3456
+joinnum + 56-235
+joinword + 56-235
+midnum - 36-3456
+always - 36
+joinnum × 56-236
+joinword × 56-236
+midnum ÷ 0-56-256-3456 division sign
+joinnum ÷ 56-256
+joinword ÷ 56-256
+begnum £ 123
+always £ 4-123 pounds
+
+# other special characters
+always © 45-14 copyright
+sign ™ 45-2345 trademark
+sign ® 45-1235 registered
+always ¶ 1234-345 paragraph
+always § 234-3 section
+always ° 356 degrees
+begnum $ 256
+always $ 4-256
+always ¢ 4-14 cents
+sign € 4-15	euro
+always € 4-15	euro
+always ¥ 4-13456 yen
+always µ 2-134 mu
+
+# special character sequences
+literal :// URLs
+literal www.
+
+literal .com
+literal .edu
+literal .gov
+literal .mil
+literal .net
+literal .org
+ include countries.cti
+
+literal .doc
+literal .htm
+literal .html
+literal .tex
+literal .txt
+
+literal .gif
+literal .jpg
+literal .png
+literal .wav
+
+literal .tar
+literal .zip
+
diff --git a/liblouis/tables/cy-cy-g2.ctb b/liblouis/tables/cy-cy-g2.ctb
new file mode 100644
index 0000000..a425c4d
--- /dev/null
+++ b/liblouis/tables/cy-cy-g2.ctb
@@ -0,0 +1,199 @@
+# liblouis: Welsh Grade 2 Braille Contraction Table
+#
+#  Copyright (C) 2004-2008 ViewPlus Technologies, Inc. www.viewplus.com
+#  Copyright (C) 2004-2006 JJB Software, Inc. www.jjb-software.com
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+# Created by Tom Johnston <tom.johnston@accessibilityconsulting.co.uk>. 
+
+include cy-cy-g1.utb
+
+# the letter a
+word a 1
+word anghofio 1-1345-1245-125
+always ar 345
+word arbennig 345-12-15-1345-1345-24-1245
+always arh 1-1235-125
+
+#the letter b
+word beth 12
+always blwyddyn 12-123
+always braille 12-1235-123
+word byddai 12-145-145
+
+#the letter c
+word cael 14
+always cyrraedd 456-14
+
+#the letter ch
+word chwarae 16
+always chwerthin 5-16
+
+#the letter d
+always dechrau 145-16-1235
+word diolch 145-16
+always diwedd 145-2456
+word diwethaf 145-2456-1456
+always dydd 5-145
+word dyma 145
+
+#the letter dd
+word ddoe 145-145
+
+#the letter e
+always ed 1246
+always edd 15-145-145
+word ef 15
+word efallai 15-124-123-123
+always eisiau 15-24-234
+always eistedd 5-15
+always en 26
+always er 12456
+always erh 15-1235-125
+
+#the letter f
+word fel 124
+always fyny 5-124
+
+#the letter ff
+word ffordd 124-124
+always ffrind 124-124-1235
+
+#the letter g
+always gorffen 1245-1235-124-124
+always gweithio 456-1245
+word gwelwch 1245-2456
+word gwneud 1245-1345-145
+word gwybod 1245-2456-12
+word gyda 1245
+
+#the letter h
+always heddiw 5-125
+always hefyd 456-125
+word hoffi 125
+word hynny 125-1345
+
+#the letter i
+word i 24
+endword iaeth 56-1456
+endword iaid 46-145
+endword ion 46-1345
+always in 35
+
+#the letter l
+word lawr 123
+
+#the letter ll
+word llawer 123-123
+always llythr 123-123-1235
+
+#the letter m
+word mae 134
+word meddai 134-145-145
+always meddwl 456-134
+always mynd 5-134
+
+#the letter n
+word neithiwr 1345-1456
+always newydd 5-1345
+word nid 1345
+
+#the letter o
+word o 135
+always o'r\sgloch 135-3-1235-0-1245-123
+word oedd 5-135
+always of 12356
+always off 135-124-124
+word oherwydd 135-125-2456
+always ow 135-2456
+
+#the letter p
+word penderfynu 1234-26-145 #the letter p
+always pethau 1234-1456-136
+word plant 1234-123
+always plentyn 5-1234
+word pobl 1234
+always prynhawn 1234-1235-125
+
+#the letter r
+word roedd 1235
+endword rwydd 56-145-145
+
+#the letter rh
+word rhai 1235-125
+always rhaid 5-1235-125
+word rhyw 1235-125-2456
+word rhywbeth 1235-125-2456-12
+word rhywbryd 1235-125-2456-12-1235
+word rhywfaint 1235-125-2456-124-2345
+word rhywfodd 1235-125-2456-124
+word rhywle 1235-125-2456-123
+word rhywun 1235-125-2456-136
+
+#the letter s
+always siarad 5-234
+always st 34
+always sth 234-1456
+always stori 34
+word sydd 234
+always sylweddoli 456-234
+
+#the letter t
+word trwy 2345
+always tywydd 5-2345
+
+#the letter u
+always uchel 5-136
+word unig 136
+word uwchben 136-2456-12
+
+#the letter w
+endword waith 46-1456
+word wedi 2456
+always wedyn 456-2456
+always wrth 5-2456
+word weithiau 2456-1456-136
+
+#the letter y
+word y 13456
+endword yddes 56-234
+always ysgol 5-13456
+word ysgrifennu 13456-234-1245
+
+# Système International Prefixes
+begword yotta 13456-135-2345-2345-1 10^24
+begword zetta 1356-15-2345-2345-1 10^21
+ begword exa 15-1346-1 10^18
+begword peta 1234-15-2345-1 10^15
+begword tera 2345-12456-1 10^12
+begword giga 1245-24-1245-1 10^9
+begword mega 134-15-1245-1 10^6
+begword kilo 13-24-123-135 10^3
+begword hecto 125-15-14-2345-135 10^2
+begword deca 145-15-14-1 10^1
+begword deci 145-15-14-24 10^-1
+begword centi 14-26-2345-24 10^-2
+begword milli 134-24-123-123-24 10^-3
+begword micro 134-24-14-1235-135 10^-6
+begword nano 1345-1-1345-135 10^-9
+begword pico 1234-24-14-135 10^-12
+begword femto 124-15-134-2345-135 10^-15
+begword atto 1-2345-2345-135 10^-18
+begword zepto 1356-15-1234-2345-135 10^-21
+begword yocto 13456-135-14-2345-135 10^-24
+
diff --git a/liblouis/tables/cy.tbl b/liblouis/tables/cy.tbl
new file mode 100644
index 0000000..7a3f85a
--- /dev/null
+++ b/liblouis/tables/cy.tbl
@@ -0,0 +1,16 @@
+#+locale:cy
+#+type:literary
+#+contraction:full
+#+grade:2
+
+# TODO: Please correct the metadata above. It is not meant to be
+# accurate nor complete. It hasn't been verified by the table
+# author yet. It is merely an attempt by the liblouis maintainers
+# to get some sensible initial values in place.
+
+# TODO: Please add a reference to official documentation about
+# the implemented braille code. Preferably submit the documents
+# to https://github.com/liblouis/braille-specs.
+
+include cy-cy-g2.ctb
+include braille-patterns.cti
diff --git a/liblouis/tables/da-dk-6miscChars.cti b/liblouis/tables/da-dk-6miscChars.cti
new file mode 100644
index 0000000..612b839
--- /dev/null
+++ b/liblouis/tables/da-dk-6miscChars.cti
@@ -0,0 +1,262 @@
+# Liblouis: Misc character definitions for Danish 6 dots (all grades)
+#
+# By Bue Vester-Andersen
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#------------
+# This file contains miscelaneous unicode character definitions used by 6 dots, all grades.
+# The aim is to include all unicode characters that have a meaningful 6 dots representation in Danish Braille.
+#
+# Most character definitions in this file have the noback flag set,
+# meaning they will not be used for back-translation.
+# This is due to the fact that many characters share the same Braille definition.
+# The characters used for back-translation are marked with (back) making them more searchable.
+# Where cp1252 and unicode overlap, the unicode version of a character is used for back-translation.
+#
+# Version: Bue Vester-Andersen 170604
+
+# CP1252 (\x0080-\x009f)
+noback sign \x0080 45-15 #EURO SIGN (0x80)
+noback punctuation \x0082 4 #Low single quote (0x82)
+noback sign \x0083 45-124 #Flurihn (0x83)
+noback punctuation \x0084 2356 #Low quote (0x84)
+noback punctuation \x0085 3-3-3 #Elipsis (0x85)
+noback math \x0089 245-356-356 #permille sign (0x89)
+noback uplow \x008a\x009a 5-234 #LATIN LETTER S WITH CARON (0x8a)
+noback punctuation \x008b 4 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK (0x8b)
+noback uplow \x008c\x009c 135-15 #LATIN LIGATURE OE (0x8c)
+noback uplow \x008e\x009e 5-1356 #LATIN CAPITAL LETTER Z WITH CARON (0x8e)
+noback punctuation \x0091 4 #LEFT SINGLE QUOTATION MARK (0x91)
+noback punctuation \x0092 4 #RIGHT SINGLE QUOTATION MARK (0x92)
+noback punctuation \x0093 2356 #LEFT DOUBLE QUOTATION MARK (0x93)
+noback punctuation \x0094 2356 #RIGHT DOUBLE QUOTATION MARK (0x94)
+noback sign \x0095 45-3 #Bullit (0x95)
+noback sign \x0096 36-36 #EN DASH (0x96)
+noback sign \x0097 36-36 #Em DASH (0x97)
+noback sign \x0099 45-2345 #TRADE MARK SIGN (0x99)
+noback punctuation \x009b 4 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (0x9b)
+noback uppercase \x009f 5-13456 #LATIN CAPITAL LETTER Y WITH DIAERESIS (0x9f)
+
+# Latin-1 Supplement (Unicode block) (\x00a0-\x00ff)
+noback punctuation \x00a0 0 NO-BREAK SPACE (0xa0)
+noback punctuation \x00a1 256 INVERTED EXCLAMATION MARK )0xa1)
+punctuation \x00a2 45-25 CENT SIGN (0xa2)
+punctuation \x00a3 45-123 POUND SIGN (0xa3)
+#punctuation \x00a4 2367 CURRENCY SIGN (0xa4)
+punctuation \x00a5 45-13456 YEN SIGN (0xa5)
+#punctuation \x00a6 3478 BROKEN BAR (0xa6)
+#punctuation \x00a8 6-56 DIAERESIS (0xa8)
+punctuation \x00a9 45-14 COPYRIGHT SIGN (0xa9)
+#letter \x00aa 234678 FEMININE ORDINAL INDICATOR (0xaa)
+noback punctuation \x00ab 2356 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (0xab)
+#punctuation \x00ac 34567 NOT SIGN (0xac)
+noback punctuation \x00ad 36 SOFT HYPHEN (0xad)
+punctuation \x00ae 45-1235 REGISTERED SIGN (0xae)
+#punctuation \x00af 23567 MACRON (0xaf)
+sign \x00b0 4-356 DEGREE SIGN (0xb0)
+noback math \x00b1 45-235-36 PLUS-MINUS SIGN
+digit \x00b2 346-12 SUPERSCRIPT TWO
+digit \x00b3 346-14 SUPERSCRIPT THREE
+noback punctuation \x00b4 4 ACUTE ACCENT
+sign \x00b5 5-134 MICRO SIGN
+#punctuation \x00b6 1234568 PILCROW SIGN
+#punctuation \x00b7 38 MIDDLE DOT
+#punctuation \x00b8 4678 CEDILLA
+digit \x00b9 346-1 SUPERSCRIPT ONE
+#letter \x00ba 12345678 MASCULINE ORDINAL INDICATOR
+noback punctuation \x00bb 2356 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+sign \x00bc 3456-1-34-145 VULGAR FRACTION ONE QUARTER
+sign \x00bd 3456-1-34-12 VULGAR FRACTION ONE HALF
+sign \x00be 3456-14-34-145 VULGAR FRACTION THREE QUARTERS
+noback punctuation \x00bf 26 INVERTED QUESTION MARK
+uplow \x00c0\x00e0 5-1 LATIN LETTER A WITH GRAVE
+noback uplow \x00c1\x00e1 5-1 LATIN LETTER A WITH ACUTE
+noback uplow \x00c2\x00e2 5-1 LATIN LETTER A WITH CIRCUMFLEX
+noback uplow \x00c3\x00e3 5-1 LATIN LETTER A WITH TILDE
+noback uplow \x00c4\x00e4 345 LATIN LETTER A WITH DIAERESIS
+uplow \x00c7\x00e7 5-14 LATIN LETTER C WITH CEDILLA
+noback uplow \x00c8\x00e8 5-15 LATIN LETTER E WITH GRAVE
+uplow \x00c9\x00e9 5-15 LATIN LETTER E WITH ACUTE 
+noback uplow \x00ca\x00ea 5-15 LATIN LETTER E WITH CIRCUMFLEX
+noback uplow \x00cb\x00eb 5-15 LATIN LETTER E WITH DIAERESIS
+noback uplow \x00cc\x00ec 5-24 LATIN LETTER I WITH GRAVE
+noback uplow \x00cd\x00ed 5-24 LATIN LETTER I WITH ACUTE
+uplow \x00ce\x00ee 5-24 LATIN LETTER I WITH CIRCUMFLEX (first for back-translation)
+noback uplow \x00cf\x00ef 5-24 LATIN LETTER I WITH DIAERESIS
+uplow \x00d0\x00f0 5-145 LATIN LETTER ETH
+uplow \x00d1\x00f1 5-1345 LATIN LETTER N WITH TILDE
+noback uplow \x00d2\x00f2 5-135 LATIN LETTER O WITH GRAVE
+noback uplow \x00d3\x00f3 5-135 LATIN LETTER O WITH ACUTE
+uplow \x00d4\x00f4 5-135 LATIN LETTER O WITH CIRCUMFLEX (first for back-translation)
+noback uplow \x00d5\x00f5 5-135 LATIN LETTER O WITH TILDE
+noback uplow \x00d6\x00f6 246 LATIN LETTER O WITH DIAERESIS
+math \x00d7 45-3 MULTIPLICATION SIGN
+noback uplow \x00d9\x00f9 5-136 LATIN LETTER U WITH GRAVE
+noback uplow \x00da\x00fa 5-136 LATIN LETTER U WITH ACUTE
+uplow \x00db\x00fb 5-136 LATIN LETTER U WITH CIRCUMFLEX (first for back-translation
+uplow \x00dd\x00fd 5-13456 LATIN LETTER Y WITH ACUTE (infinite?)
+uplow \x00de\x00fe 5-2345 LATIN CAPITAL LETTER THORN
+noback lowercase \x00df 234-234 LATIN SMALL LETTER SHARP S
+math \x00f7 45-256 DIVISION SIGN
+
+# Latin Extended-A (\x0100-\x017f)
+
+noback uplow \x0100\x0101 5-1 Latin letter a with macron
+noback uplow \x0102\x0103 5-1 Latin letter a with breve
+noback uplow \x0104\x0105 5-1 Latin letter a with ogonek
+noback uplow \x0106\x0107 5-14 Latin letter c with acute
+noback uplow \x0108\x0109 5-14 Latin letter c with circumflex
+noback uplow \x010a\x010b 5-14 Latin letter c with dot above
+noback uplow \x010c\x010d 5-14 Latin letter c with caron
+noback uplow \x010e\x010f 5-145 Latin letter d with caron
+noback uplow \x0110\x0111 5-145 Latin letter d with stroke
+noback uplow \x0112\x0113 5-15 Latin letter e with macron
+noback uplow \x0114\x0115 5-15 Latin letter e with breve
+noback uplow \x0116\x0117 5-15 Latin letter e with dot above
+noback uplow \x0118\x0119 5-15 Latin letter e with ogonek
+noback uplow \x011a\x011b 5-15 Latin letter e with caron
+noback uplow \x011c\x011d 5-1245 Latin letter g with circumflex
+noback uplow \x011e\x011f 5-1245 Latin letter g with breve
+noback uplow \x0120\x0121 5-1245 Latin letter g with dot above
+noback uplow \x0122\x0123 5-1245 Latin letter g with cedilla
+noback uplow \x0124\x0125 5-125 Latin letter h with circumflex
+noback uplow \x0126\x0127 5-125 Latin letter h with stroke
+noback uplow \x0128\x0129 5-24 Latin letter i with tilde
+noback uplow \x012a\x012b 5-24 Latin letter i with macron
+noback uplow \x012c\x012d 5-24 Latin letter i with breve
+noback uplow \x012e\x012f 5-24 Latin letter i with ogonek
+noback uplow \x0130\x0131 5-24 Latin capital letter i with dot above / small dotless i
+noback uplow \x0132\x0133 24-245 Latin ligature ij
+noback uplow \x0134\x0135 5-245 Latin letter j with circumflex
+noback uplow \x0136\x0137 5-13 Latin letter k with cedilla
+noback lowercase \x0138 5-12345 Small latin letter kra (Greenlandic q)
+noback uplow \x0139\x013a 5-123 Latin letter l with acute
+noback uplow \x013b\x013c 5-123 Latin letter l with cedilla
+noback uplow \x013d\x013e 5-123 Latin letter l with caron
+noback uplow \x013f\x0140 5-123 Latin letter l with middle dot
+noback uplow \x0141\x0142 5-123 Latin letter l with stroke
+noback uplow \x0143\x0144 5-1345 Latin letter n with acute
+noback uplow \x0145\x0146 5-1345 Latin letter n with cedilla
+noback uplow \x0147\x0148 5-1345 Latin letter n with caron
+noback lowercase \x0149 4-1345 Latin small letter n preceeded by apostrophe
+noback uplow \x014a\x014b 5-1345 Latin letter eng
+noback uplow \x014c\x014d 5-135 Latin letter o with macron
+noback uplow \x014e\x014f 5-135 Latin letter o with breve
+noback uplow \x0150\x0151 5-135 Latin letter o with double acute
+noback uplow \x0152\x0153 135-15 #LATIN LIGATURE OE (0x8c)
+noback uplow \x0154\x0155 5-1235 Latin letter r with acute
+noback uplow \x0156\x0157 5-1235 Latin letter r with cedilla
+noback uplow \x0158\x0159 5-1235 Latin letter r with caron
+noback uplow \x015a\x015b 5-234 Latin letter s with acute
+noback uplow \x015c\x015d 5-234 Latin letter s with circumflex
+noback uplow \x015e\x015f 5-234 Latin letter s with cedilla
+uplow \x0160\x0161 5-234 #LATIN LETTER S WITH CARON (0x8a)
+noback uplow \x0162\x0163 5-2345 Latin letter t with cedilla
+noback uplow \x0164\x0165 5-2345 Latin letter t with caron
+noback uplow \x0166\x0167 5-2345 Latin letter t with stroke
+noback uplow \x0168\x0169 5-136 Latin letter u with tilde
+noback uplow \x016a\x016b 5-136 Latin letter u with macron
+noback uplow \x016c\x016d 5-136 Latin letter u with breve
+noback uplow \x016e\x016f 5-136 Latin letter u with ring above
+noback uplow \x0170\x0171 5-136 Latin letter u with double acute
+noback uplow \x0172\x0173 5-136 Latin letter u with ogonek
+noback uplow \x0174\x0175 5-2456 Latin letter w with circumflex
+noback uplow \x0176\x0177 5-13456 Latin letter y with circumflex
+uplow \x0178\x00ff 5-13456 #LATIN LETTER Y WITH DIAERESIS (0x9f)
+noback uplow \x0179\x017a 5-1356 Latin letter z with acute
+noback uplow \x017b\x017c 5-1356 Latin letter z with dot above
+uplow \x017d\x017e 5-1356 #LATIN LETTER Z WITH CARON (0x8e)
+noback lowercase \x017f 5-234 Latin small letter long s 
+
+# Latin Extended-B 
+
+
+sign \x0192 45-124 #Flurihn (0x83)
+#letter \x02c6 5678 #Modifier letter circumflex (0x88)
+noback sign \x02DC 45-6 #SMALL TILDE (0x98)
+
+# Greek letters (with dot 5 as prefix)
+
+noback uplow \x0386\x03AC 5-1 Greek letter alpha with tonos
+noback uplow \x0388\x03AD 5-15 Greek letter epsilon with tonos
+noback uplow \x0389\x03AE 5-345 Greek letter eta with tonos
+noback uplow \x038A\x03AF 5-24 Greek letter iota with sonos
+noback uplow \x038C\x03CC 5-135 Greek letter omicron with tonos
+noback uplow \x038E\x03CD 5-13456 Greek letter upsilon with tonos
+noback uplow \x038F\x03CE 5-245 Greek letter omega with tonos
+
+noback uplow \x0391\X03B1 5-1 Greek letter alpha
+noback uplow \x0392\X03B2 5-12 Greek letter beta
+noback uplow \x0393\X03B3 5-1245 Greek letter gamma
+noback uplow \x0394\X03B4 5-145 Greek letter delta
+noback uplow \x0395\X03B5 5-15 Greek letter epsilon
+noback uplow \x0396\X03B6 5-1356 Greek letter zeta
+noback uplow \x0397\X03B7 5-345 Greek letter eta
+noback uplow \x0398\X03B8 5-1456 Greek letter theta
+noback uplow \x0399\X03B9 5-24 Greek letter iota
+noback uplow \x039A\X03BA 5-13 Greek letter kappa
+noback uplow \x039B\X03BB 5-123 Greek letter lamda
+noback uplow \x039C\X03BC 5-134 Greek letter Mu
+noback uplow \x039D\X03BD 5-1345 Greek letter Nu
+noback uplow \x039E\X03BE 5-1346 Greek letter Xi
+noback uplow \x039F\X03BF 5-135 Greek letter Omicron
+noback uplow \x03A0\X03C0 5-1234 Greek letter Pi
+noback uplow \x03A1\X03C1 5-1235 Greek letter Rho
+noback uplow \x03A3\X03C3 5-234 Greek letter sigma
+noback uplow \x03A4\X03C4 5-2345			Greek letter Tau
+noback uplow \x03A5\X03C5 5-13456 Greek letter Upsilon
+noback uplow \x03A6\X03C6 5-124 Greek letter Phi
+noback uplow \x03A7\X03C7 5-125 Greek letter Chi
+noback uplow \x03A8\X03C8 5-12346 Greek letter Psi
+noback uplow \x03A9\X03C9 5-245 Greek letter Omega
+
+
+
+
+noback sign \x2013 36-36 #EN DASH (0x96)
+noback sign \x2014 36-36 #Em DASH (0x97)
+noback punctuation \x2018 4 #LEFT SINGLE QUOTATION MARK (0x91)
+noback punctuation \x2019 4 #RIGHT SINGLE QUOTATION MARK (0x92)
+noback punctuation \x201A 4 #Low single quote (0x82)
+noback punctuation \x201c 2356 #LEFT DOUBLE QUOTATION MARK (0x93)
+noback punctuation \x201d 2356 #RIGHT DOUBLE QUOTATION MARK (0x94)
+noback punctuation \x201E 2356 #Low quote (0x84)
+#letter \x2020 2357 #Dagger (0x86
+#letter \x2021 23578 #Double dagger (0x87
+sign \x2022 45-3 #Bullit (0x95)
+noback sign \x2023 45-3 #Triangular bullit
+noback punctuation \x2026 3-3-3 #Elipsis (0x85)
+math \x2030 245-356-356 #permille sign (0x89)
+noback punctuation \x2039 4 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK (0x8b)
+noback punctuation \x203A 4 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (0x9b)
+noback sign \x2043 45-3 # Hyphen bullet (0x95)
+noback sign \x204c 45-3 # BLACK LEFTWARDS BULLET 
+noback sign \x204d 45-3 # BLACK RIGHTWARDS BULLET 
+sign \x20AC 45-15 #EURO SIGN (0x80)
+sign \x2122 45-2345 #TRADE MARK SIGN (0x99)
+
+# Arrows
+
+sign \x2190 45-2456 Left arrow
+sign \x2191 45-12356 Up arrow
+sign \x2192 45-1235 Right arrow
+sign \x2193 45-12345 Down arrow
+
+# Geometrical shapes
+
+noback sign \x25e6 45-3 #White bullet
diff --git a/liblouis/tables/da-dk-g08.ctb b/liblouis/tables/da-dk-g08.ctb
new file mode 100644
index 0000000..a472f74
--- /dev/null
+++ b/liblouis/tables/da-dk-g08.ctb
@@ -0,0 +1,323 @@
+# Liblouis: Danish table for 8 dots computer Braille (G0)
+#
+#  Copyright (C) 2014-2017, Bue Vester-Andersen <bue@vester-andersen.dk>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#------------
+#
+# This  is the Danish table for 8 dots computer Braille.
+# Use this table for translation and back-translation of Danish 8 dots computer Braille (Octo-Braille).
+#
+# Version: Bue Vester-Andersen, 170604
+
+### Table Metadata
+
+#+locale: da
+#+type: computer
+#+contraction: no
+#+grade: 0
+#+dots: 8
+#+direction: both
+
+### Character definitions
+
+# Display upcodes
+include da-dk-octobraille.dis
+
+sign \x0000 8 NULL
+sign \x0001 178 START OF HEADING
+sign \x0002 1278 START OF TEXT
+sign \x0003 1478 END OF TEXT
+sign \x0004 14578 END OF TRANSMISSION
+sign \x0005 24568 ENQUIRY
+sign \x0006 12478 ACKNOWLEDGE
+sign \x0007 124578 BELL
+sign \x0008 12578 BACKSPACE
+space \t 2478 CHARACTER TABULATION
+space \n 678 LINE FEED (LF)
+space \v 1368 LINE TABULATION
+space \f 12378 FORM FEED (FF)
+space \r 257 CARRIAGE RETURN (CR)
+sign \x000e 134578 SHIFT OUT
+sign \x000f 12358 SHIFT IN
+sign \x0010 123478 DATA LINK ESCAPE
+sign \x0011 1234578 DEVICE CONTROL ONE
+sign \x0012 13568 DEVICE CONTROL TWO
+sign \x0013 4578 DEVICE CONTROL THREE
+sign \x0014 268 DEVICE CONTROL FOUR
+sign \x0015 13678 NEGATIVE ACKNOWLEDGE
+sign \x0016 278 SYNCHRONOUS IDLE
+sign \x0017 3578 END OF TRANSMISSION BLOCK
+sign \x0018 78 CANCEL
+sign \x0019 68 END OF MEDIUM
+sign \x001a 135678 SUBSTITUTE
+sign \x001b 2678 ESCAPE
+sign \x001c 45678 INFORMATION SEPARATOR FOUR
+sign \x001d 12368 INFORMATION SEPARATOR THREE
+sign \x001e 1234678 INFORMATION SEPARATOR TWO
+sign \x001f 235678 INFORMATION SEPARATOR ONE
+space \s 0 SPACE
+punctuation ! 235 EXCLAMATION MARK
+punctuation " 2356 QUOTATION MARK
+punctuation # 34568 NUMBER SIGN
+sign $ 25678 DOLLAR SIGN
+math % 24578 PERCENT SIGN
+sign & 123468 AMPERSAND
+punctuation ' 4 APOSTROPHE
+punctuation ( 2368 LEFT PARENTHESIS
+punctuation ) 3568 RIGHT PARENTHESIS
+punctuation * 35 ASTERISK
+math + 2358 PLUS SIGN
+punctuation , 2 COMMA
+punctuation - 368 HYPHEN-MINUS
+punctuation . 3 FULL STOP
+punctuation / 348 SLASH
+include digits8Dots.uti
+punctuation : 25 COLON
+punctuation ; 23 SEMICOLON
+math < 358 LESS-THAN SIGN
+math = 23568 EQUALS SIGN
+math > 267 GREATER-THAN SIGN
+punctuation ? 26 QUESTION MARK
+sign @ 478 COMMERCIAL AT
+uppercase A 17 Latin capital letter A
+uppercase B 127 Latin capital letter B
+uppercase C 147 Latin capital letter C
+uppercase D 1457 Latin capital letter D
+uppercase E 157 Latin capital letter E
+uppercase F 1247 Latin capital letter F
+uppercase G 12457 Latin capital letter G
+uppercase H 1257 Latin capital letter H
+uppercase I 247 Latin capital letter I
+uppercase J 2457 Latin capital letter J
+uppercase K 137 Latin capital letter K
+uppercase L 1237 Latin capital letter L
+uppercase M 1347 Latin capital letter M
+uppercase N 13457 Latin capital letter N
+uppercase O 1357 Latin capital letter O
+uppercase P 12347 Latin capital letter P
+uppercase Q 123457 Latin capital letter Q
+uppercase R 12357 Latin capital letter R
+uppercase S 2347 Latin capital letter S
+uppercase T 23457 Latin capital letter T
+uppercase U 1367 Latin capital letter U
+uppercase V 12367 Latin capital letter V
+uppercase W 24567 Latin capital letter W
+uppercase X 13467 Latin capital letter X
+uppercase Y 134567 Latin capital letter Y
+uppercase Z 13567 Latin capital letter Z
+punctuation [ 23678 LEFT SQUARE BRACKET
+punctuation \\ 347 REVERSE SLASH
+punctuation ] 35678 RIGHT SQUARE BRACKET
+punctuation ^ 12348 CIRCUMFLEX ACCENT
+punctuation _ 3678 LOW LINE
+punctuation ` 5 GRAVE ACCENT
+lowercase a 1 Latin small letter A
+lowercase b 12 Latin small letter B
+lowercase c 14 Latin small letter C
+lowercase d 145 Latin small letter D
+lowercase e 15 Latin small letter E
+lowercase f 124 Latin small letter F
+lowercase g 1245 Latin small letter G
+lowercase h 125 Latin small letter H
+lowercase i 24 Latin small letter I
+lowercase j 245 Latin small letter J
+lowercase k 13 Latin small letter K
+lowercase l 123 Latin small letter L
+lowercase m 134 Latin small letter M
+lowercase n 1345 Latin small letter N
+lowercase o 135 Latin small letter O
+lowercase p 1234 Latin small letter P
+lowercase q 12345 Latin small letter Q
+lowercase r 1235 Latin small letter R
+lowercase s 234 Latin small letter S
+lowercase t 2345 Latin small letter T
+lowercase u 136 Latin small letter U
+lowercase v 1236 Latin small letter V
+lowercase w 2456 Latin small letter W
+lowercase x 1346 Latin small letter X
+lowercase y 13456 Latin small letter Y
+lowercase z 1356 Latin small letter Z
+punctuation { 123678 LEFT CURLY BRACKET
+punctuation | 4568 VERTICAL LINE
+punctuation } 345678 RIGHT CURLY BRACKET
+punctuation ~ 467 TILDE
+sign \x007f 7 DELETE
+sign \x20AC 1578 #EURO SIGN (0x80)
+sign \x0081 45 <control-0081>
+punctuation \x201A 457 #Low single quote (0x82)
+sign \x0192 58 #Flurihn (0x83)
+punctuation \x201E 2378 #Low quote (0x84)
+punctuation \x2026 6 #Elipsis (0x85)
+sign \x2020 2357 #Dagger (0x86
+sign \x2021 23578 #Double dagger (0x87
+sign \x02c6 5678 #Modifier letter circumflex (0x88)
+math \x2030 245678 #permille sign (0x89)
+uppercase \x0160 23478 #Latin  capital Letter S with caron (0x8a/0x9a)
+punctuation \x2039 456 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK (0x8b)
+uppercase \x0152 13578 #Latin capital LIGATURE OE (0x8c)
+sign \x008d 3567 REVERSE LINE FEED (not defined in cp1252)
+uppercase \x017d 3467 #Latin capital letter Z with caron (0x8e)
+sign \x008f 27 SINGLE SHIFT THREE (not defined in cp1252)
+sign \x0090 357 DEVICE CONTROL STRING (not defined in cp1252)
+punctuation \x2018 47 #LEFT SINGLE QUOTATION MARK (0x91)
+punctuation \x2019 48 #RIGHT SINGLE QUOTATION MARK (0x92)
+punctuation \x201c 237 #LEFT DOUBLE QUOTATION MARK (0x93)
+punctuation \x201d 568 #RIGHT DOUBLE QUOTATION MARK (0x94)
+sign \x2022 37 #Bullit (0x95)
+sign \x2013 36 #EN DASH (0x96)
+sign \x2014 367 #Em DASH (0x97)
+sign \x02DC 46 #small TILDE (0x98)
+sign \x2122 234578 #TRADE MARK SIGN (0x99)
+lowercase \x0161 2348 #Latin  lowercase Letter S with caron (0x8a/0x9a)
+punctuation \x203A 4567 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (0x9b)
+lowercase \x0153 1358 #Latin small LIGATURE OE (0x9c)
+letter \x009d 2567 OPERATING SYSTEM COMMAND
+lowercase \x017E 346 #Latin small letter Z with caron (0x9e)
+uppercase \x0178 2345678 #Latin capital letter Y with DIAERESIS (0x9f)
+punctuation \x00a0 23458 NO-BREAK SPACE (0xa0)
+punctuation \x00a1 256 INVERTED EXCLAMATION MARK )0xa1)
+punctuation \x00a2 2578 CENT SIGN (0xa2)
+punctuation \x00a3 1238 POUND SIGN (0xa3)
+punctuation \x00a4 2367 CURRENCY SIGN (0xa4)
+punctuation \x00a5 67 YEN SIGN (0xa5)
+punctuation \x00a6 3478 BROKEN BAR (0xa6)
+punctuation \x00a7 578 SECTION SIGN (0xa7)
+punctuation \x00a8 56 DIAERESIS (0xa8)
+punctuation \x00a9 134678 COPYRIGHT SIGN (0xa9)
+letter \x00aa 234678 FEMININE ORDINAL INDICATOR (0xaa)
+punctuation \x00ab 57 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (0xab)
+punctuation \x00ac 34567 NOT SIGN (0xac)
+letter \x00ad 378 SOFT HYPHEN (0xad)
+punctuation \x00ae 123578 Registered sign (0xae)
+punctuation \x00af 23567 macron (0xaf)
+sign \x00b0 356 Degree sign (0xb0)
+math \x00b1 123458 PLUS-MINUS SIGN
+punctuation \x00b2 238 SUPERSCRIPT TWO
+punctuation \x00b3 258 SUPERSCRIPT THREE
+punctuation \x00b4 468 acute ACCENT
+sign \x00b5 236 MICRO SIGN
+punctuation \x00b6 1234568 PILCROW SIGN
+punctuation \x00b7 38 MIDDLE DOT
+punctuation \x00b8 4678 CEDILLA
+punctuation \x00b9 28 SUPERSCRIPT ONE
+letter \x00ba 12345678 MASCULINE ORDINAL INDICATOR
+punctuation \x00bb 567 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+punctuation \x00bc 13458 VULGAR FRACTION ONE QUARTER
+punctuation \x00bd 458 VULGAR FRACTION ONE HALF
+punctuation \x00be 3456 VULGAR FRACTION THREE QUARTERS
+punctuation \x00bf 34 INVERTED QUESTION MARK
+uppercase \x00c0 123567 Latin capital letter A with GRAVE
+uppercase \x00c1 1235678 Latin capital letter A with acute
+uppercase \x00c2 1678 Latin capital letter A with CIRCUMFLEX
+uppercase \x00c3 14678 Latin capital letter A with TILDE
+uppercase \x00c4 34578 Latin capital letter A with DIAERESIS
+uppercase \x00c5 167 Latin capital letter A with RING ABOVE
+uppercase \x00c6 3457 Latin capital letter AE
+uppercase \x00c7 123467 Latin capital letter C with CEDILLA
+uppercase \x00c8 23467 Latin capital letter E with GRAVE
+uppercase \x00c9 1234567 Latin capital letter E with acute
+uppercase \x00ca 1267 Latin capital letter E with CIRCUMFLEX
+uppercase \x00cb 12467 Latin capital letter E with DIAERESIS
+uppercase \x00cc 15678 Latin capital letter I with GRAVE
+uppercase \x00cd 12678 Latin capital letter I with acute
+uppercase \x00ce 1467 Latin capital letter I with CIRCUMFLEX
+uppercase \x00cf 124567 Latin capital letter I with DIAERESIS
+uppercase \x00d0 1345678 Latin capital letter ETH
+uppercase \x00d1 1245678 Latin capital letter N with TILDE
+uppercase \x00d2 124678 Latin capital letter O with GRAVE
+uppercase \x00d3 34678 Latin capital letter O with acute
+uppercase \x00d4 14567 Latin capital letter O with CIRCUMFLEX
+uppercase \x00d5 145678 Latin capital letter O with TILDE
+uppercase \x00d6 24678 Latin capital letter O with DIAERESIS
+math \x00d7 13468 MULTIPLICATION SIGN
+uppercase \x00d8 2467 Latin capital letter O with STROKE
+uppercase \x00d9 234567 Latin capital letter U with GRAVE
+uppercase \x00da 125678 Latin capital letter U with acute
+uppercase \x00db 1567 Latin capital letter U with CIRCUMFLEX
+uppercase \x00dc 12567 Latin capital letter U with DIAERESIS
+uppercase \x00dd 13478 Latin capital letter Y with acute (infinite?)
+uppercase \x00de 1378 Latin capital letter THORN
+lowercase \x00df 23468 Latin small letter SHARP S
+lowercase \x00e0 12356 Latin small letter A with GRAVE
+lowercase \x00e1 123568 Latin small letter A with acute
+lowercase \x00e2 168 Latin small letter A with CIRCUMFLEX
+lowercase \x00e3 1468 Latin small letter A with TILDE
+lowercase \x00e4 3458 Latin small letter A with DIAERESIS
+lowercase \x00e5 16 Latin small letter A with RING ABOVE
+lowercase \x00e6 345 Latin small letter AE
+lowercase \x00e7 12346 Latin small letter C with CEDILLA
+lowercase \x00e8 2346 Latin small letter E with GRAVE
+lowercase \x00e9 123456 Latin small letter E with acute
+lowercase \x00ea 126 Latin small letter E with CIRCUMFLEX
+lowercase \x00eb 1246 Latin small letter E with DIAERESIS
+lowercase \x00ec 1568 Latin small letter I with GRAVE
+lowercase \x00ed 1268 Latin small letter I with acute
+lowercase \x00ee 146 Latin small letter I with CIRCUMFLEX
+lowercase \x00ef 12456 Latin small letter I with DIAERESIS
+lowercase \x00f0 134568 Latin small letter ETH
+lowercase \x00f1 124568 Latin small letter N with TILDE
+lowercase \x00f2 12468 Latin small letter O with GRAVE
+lowercase \x00f3 3468 Latin small letter O with acute
+lowercase \x00f4 1456 Latin small letter O with CIRCUMFLEX
+lowercase \x00f5 14568 Latin small letter O with TILDE
+lowercase \x00f6 2468 Latin small letter O with DIAERESIS
+math \x00f7 2568 DIVISION SIGN
+lowercase \x00f8 246 Latin small letter O with STROKE
+lowercase \x00f9 23456 Latin small letter U with GRAVE
+lowercase \x00fa 12568 Latin small letter U with acute
+lowercase \x00fb 156 Latin small letter U with CIRCUMFLEX
+lowercase \x00fc 1256 Latin small letter U with DIAERESIS
+lowercase \x00fd 1348 Latin small letter Y with acute
+lowercase \x00fe 138 Latin small letter THORN
+lowercase \x00ff 234568 Latin small letter Y with DIAERESIS
+
+# In CP-1252 the following chars are different from Unicode.
+# This placement ensures that Liblouis will always return the unicode when back-translating.
+sign \x0080 1578 #EURO SIGN (0x80)
+punctuation \x0082 457 #Low single quote (0x82)
+sign \x0083 58 #Flurihn (0x83)
+punctuation \x0084 2378 #Low quote (0x84)
+punctuation \x0085 6 #Elipsis (0x85)
+letter \x0086 2357 #Dagger (0x86
+letter \x0087 23578 #Double dagger (0x87
+letter \x0088 5678 #Modifier letter circumflex (0x88)
+math \x0089 245678 #permille sign (0x89)
+uppercase \x008a 23478 #Latin letter S with caron (0x8a)
+lowercase \x009a 2348
+punctuation \x008b 456 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK (0x8b)
+uppercase \x008c 13578 #Latin LIGATURE OE (0x8c)
+lowercase \x009c 1358
+uppercase \x008e 3467 #Latin capital letter Z with caron (0x8e)
+lowercase \x009e 346
+punctuation \x0091 47 #LEFT SINGLE QUOTATION MARK (0x91)
+punctuation \x0092 48 #RIGHT SINGLE QUOTATION MARK (0x92)
+punctuation \x0093 237 #LEFT DOUBLE QUOTATION MARK (0x93)
+punctuation \x0094 568 #RIGHT DOUBLE QUOTATION MARK (0x94)
+sign \x0095 37 #Bullit (0x95)
+sign \x0096 36 #EN DASH (0x96)
+sign \x0097 367 #Em DASH (0x97)
+sign \x0098 46 #small TILDE (0x98)
+sign \x0099 234578 #TRADE MARK SIGN (0x99)
+punctuation \x009b 4567 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (0x9b)
+uppercase \x009f 2345678 #Latin capital letter Y with DIAERESIS (0x9f)
+
+#Unicode Braille patterns
+include braille-patterns.cti
+
+undefined 26
diff --git a/liblouis/tables/da-dk-g16-lit.ctb b/liblouis/tables/da-dk-g16-lit.ctb
new file mode 100644
index 0000000..9c03e77
--- /dev/null
+++ b/liblouis/tables/da-dk-g16-lit.ctb
@@ -0,0 +1,269 @@
+# Liblouis: Danish table for 6 dots grade 1 forward translation (literary)
+#
+#  Copyright (C) 2014-2017, Bue Vester-Andersen <bue@vester-andersen.dk>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#------------
+#
+# This  is the Danish  6 dots grade 1 table for forward translation (literary / not back-translateable).
+# 
+# The output from this table is mainly ment for embossing and not suited for back-translation.
+#
+# Version: Bue Vester-Andersen, 170604
+
+### Table Metadata
+
+#+locale: da
+#+type: literary
+#+contraction: no
+#+grade: 1
+#+dots: 6
+#+direction: forward
+
+# Display opcodes
+include da-dk-octobraille.dis
+
+### Character definitions
+
+# These ctrl-chars have to have a representation, so that they can be properly converted back and forth.
+space \t 2478 CHARACTER TABULATION
+space \n 678 LINE FEED (LF)
+space \v 1368 LINE TABULATION
+space \f 12378 FORM FEED (FF)
+space \r 257 CARRIAGE RETURN (CR)
+
+# Definition of dot cells
+space \s 0
+punctuation ! 235 EXCLAMATION MARK
+punctuation " 2356 QUOTATION MARK
+sign & 12346 AMPERSAND
+punctuation ' 4 APOSTROPHE
+punctuation ( 236 LEFT PARENTHESIS
+punctuation ) 356 RIGHT PARENTHESIS
+punctuation * 35 ASTERISK
+punctuation , 2 COMMA
+punctuation - 36 HYPHEN-MINUS
+punctuation . 3 FULL STOP
+punctuation / 34 SLASH
+punctuation : 25 COLON
+punctuation ; 23 SEMICOLON
+punctuation ? 26 QUESTION MARK
+include latinLetterDef6Dots.uti
+
+include digits6Dots.uti
+
+punctuation \x00a7 346 SECTION SIGN (0xa7)
+
+uplow \x00c5\x00e5 16 LATIN LETTER A WITH RING ABOVE
+uplow \x00c6\x00e6 345 LATIN LETTER AE
+uplow \x00d8\x00f8 246 LATIN LETTER O WITH STROKE
+uplow \x00dc\x00fc 1256 LATIN CAPITAL LETTER U WITH DIAERESIS
+math \x00f7 256 DIVISION SIGN
+
+# cover all other Braille patterns
+include braille-patterns.cti
+
+# Characters with two or more cells
+
+punctuation # 45-3456 NUMBER SIGN
+sign $ 45-256 DOLLAR SIGN
+math % 245-356 PERCENT SIGN
+#sign & 6-12346 AMPERSAND
+#punctuation * 6-35 ASTERISK
+math + 45-235 PLUS SIGN
+math < 45-134 LESS-THAN SIGN
+math = 45-2356 EQUALS SIGN
+math > 45-234 GREATER-THAN SIGN
+sign @ 45-1 COMMERCIAL AT
+punctuation [ 5-236 LEFT SQUARE BRACKET
+punctuation \\ 45-16 REVERSE SLASH
+punctuation ] 5-356 RIGHT SQUARE BRACKET
+punctuation ^ 45-346 CIRCUMFLEX ACCENT
+punctuation _ 45-36 LOW LINE
+punctuation ` 4 GRAVE ACCENT
+punctuation { 45-246 LEFT CURLY BRACKET
+punctuation | 45-456 VERTICAL LINE
+punctuation } 45-135 RIGHT CURLY BRACKET
+punctuation ~ 45-6 TILDE
+
+# Misc unicode characters
+include da-dk-6miscChars.cti
+
+# Litdigits
+include litdigits6Dots.uti
+
+undefined 26
+
+### Braille indicators and special characters
+
+#hyphen - 36
+
+letsign 6
+
+# No letsign before capital letters or letters with accents
+
+noletsign ABCDEFGHIJKLMNOPQRSTUVWXYZ\x0160\x0152\x017d\x0178\x00c0\x00c1\x00c2\x00c3\x00c4\x00c5\x00c6\x00c7\x00c8\x00c9\x00ca\x00cb\x00cc\x00cd\x00ce\x00cf\x00d0\x00d1\x00d2\x00d3\x00d4\x00d5\x00d6\x00d8\x00d9\x00da\x00db\x00dc\x00dd\x00de\x008a\x008c\x008e
+noletsign i\x0161\x0153\x017e\x00ff\x00df\x00e0\x00e1\x00e2\x00e3\x00e7\x00e8\x00e9\x00ea\x00eb\x00ec\x00ed\x00ee\x00ef\x00f0\x00f1\x00f2\x00f3\x00f4\x00f5\x00f9\x00fa\x00fb\x00fd\x00fe\x009a\x009c
+noletsign abcdefghjklmnopqrstuvwxyz\x00e4\x00e5\x00e6\x00f6\x00f8\x00fc
+
+# Emphasis opcodes
+emphclass italic
+emphclass underline
+emphclass bold
+
+begemphphrase italic 56
+endemphphrase italic after 56
+begemphword italic 56
+endemphword italic 56
+
+begemphphrase bold 56
+endemphphrase bold after 56
+begemphword bold 56
+endemphword bold 56
+
+begemphphrase underline 56
+endemphphrase underline after 56
+begemphword underline 56
+endemphword underline 56
+
+capsletter 46 
+begcapsword 456
+endcapsword 6
+
+numsign 3456
+
+#class of none-space characters that demand double dashes
+# Used in context lines later.
+#must be the first class defined.
+class charsWDoubleDash .,?!/:"'() # class w
+
+### Correct
+
+# Chars that don't require a space before percent and permille:
+class charsBeforePercent "(\x201e\x0084\x201c\x0093\x201d\x0094\x00ab\x00bb #class x
+noback correct `["%"] *
+noback correct `["\x2030"] *
+noback correct !$sx["%"] " %"
+noback correct !$sx["\x2030"] " \x2030"
+noback correct `["\x0089"] *
+noback correct !$sx["\x0089"] " \x2030"
+
+# Chars to be treated like digits when switching back to letter mode
+class extraDigits \x00bc\x00bd\x00be
+
+#Use the "correct" opcode to convert chars that can't be back-translated
+# and make the table more simple.
+
+# Dashes
+class dashes \x2013\x2014\x0096\x0097\x00ad
+noback correct %dashes "-"
+
+class quotes \x201e\x0084\x201c\x0093\x201d\x0094\x00ab\x00bb 
+noback correct %quotes "\""
+
+class apostrophes `\x201a\x0082\x2039\x008b\x2018\x0091\x2019\x0092\x203a\x009b\x00b4
+noback correct %apostrophes "'"
+
+# Convert most single caps to lowercase
+
+#Special abbreviations with imbedded small letters.
+# Must be handled by case in this version of liblouis
+noback correct "KAbB" "KABB"
+noback correct "CUDiM" "CUDIM"
+
+swapcc UpperLower ABCDEFGHIJKLMNOPQRSTUVWXYZ\x0160\x0152\x017d\x0178\x00c0\x00c1\x00c2\x00c3\x00c4\x00c5\x00c6\x00c7\x00c8\x00c9\x00ca\x00cb\x00cc\x00cd\x00ce\x00cf\x00d0\x00d1\x00d2\x00d3\x00d4\x00d5\x00d6\x00d8\x00d9\x00da\x00db\x00dc\x00dd\x00de\x008a\x008c abcdefghijklmnopqrstuvwxyz\x0161\x0153\x017e\x00ff\x00e0\x00e1\x00e2\x00e3\x00e4\x00e5\x00e6\x00e7\x00e8\x00e9\x00ea\x00eb\x00ec\x00ed\x00ee\x00ef\x00f0\x00f1\x00f2\x00f3\x00f4\x00f5\x00f6\x00f8\x00f9\x00fa\x00fb\x00fc\x00fd\x00fe\x009a\x009c
+
+# I is a special case
+noback correct _$sp["I"]$sp "i"
+noback correct `["I"]$sp "i"
+noback correct _$sp["I"]~ "i"
+
+noback correct $sSpu[%UpperLower]$u %UpperLower
+noback correct `[%UpperLower]$u %UpperLower
+
+# Punctuations, math and numbers
+midnum , 2
+midnum . 3
+midnum - 36
+endnum - 36
+midnum / 34
+midnum : 25
+
+midnum ^ 45-346
+midnum \x00d7 45-3-3456
+
+# Punctuation
+prepunc " 2356
+postpunc " 2356
+prepunc - 36
+postpunc - 36
+always :- 25-36
+always ;- 23-36
+always --- 36-36-36
+always ---- 36-36-36-36
+always ----- 36-36-36-36-36
+
+# these characters must be separated from ")" by a letsign.
+class SepToRightpar Jj%'\x2030\x0089\x201a\x0082\x2039\x009b\x2018\x0091\x2019\x0092\x203a\x009b
+after SepToRightpar always ) 6-356
+
+prepunc ( 236
+postpunc ) 356
+
+always .) 3-356
+always ... 3-3-3
+
+always !! 235-235
+always !!! 235-235-235
+always !!!! 235-235-235-235
+always !!!!! 235-235-235-235-235
+
+### Context rules
+
+# Substitutions for joinnum rules with common math signs
+noback context $dy$s["-"$s]$dy @36
+noback context $dy$s["+"$s]$dy @235
+noback context $dy$s["\x00d7"$s]$dy @3
+noback context $dy$s["\x00f7"$s]$dy @256
+noback context $dy$s["="$s]$dy @2356
+
+# Space on each side of = when between letters or punctuation.
+noback context $lp["="]$lp @0-2356-0
+
+# Ensure two dashes where appropriate.
+noback context $w["-"]$w @36
+noback context $sw["-"]$sw @36-36
+noback context `["-"]$sw @36-36
+noback context $sw["-"]~ @36-36
+noback context !$sw["-"]~ @36
+noback context `["-"]~ @36-36
+
+#ensure dot 6 between a digit and a letter
+noback context $dy[]$u @6
+noback context $dy$Spm.[]$u @6
+
+# Ensure dot 6 as nocaps
+#noback context $U2-50[]$u @6
+
+### Pass 2
+
+noback pass2 @6-46-5 @46-5 # no letsign before cap letters with accent
+noback pass2 @45-6-46 * # don't touch tilde before capnoback pass2 @6-46 @46-6 # Ensure correct order
+
+# Ensure there is only one letsign
+ noback pass2 @6-6 @6
diff --git a/liblouis/tables/da-dk-g16.ctb b/liblouis/tables/da-dk-g16.ctb
new file mode 100644
index 0000000..fd2e155
--- /dev/null
+++ b/liblouis/tables/da-dk-g16.ctb
@@ -0,0 +1,333 @@
+# Liblouis: Danish table for 6 dots grade 1 forward and backward translation 
+#
+#  Copyright (C) 2014-2017, Bue Vester-Andersen <bue@vester-andersen.dk>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+# Version: Bue Vester-Andersen, 170604
+
+### Table Metadata
+
+#+locale: da
+#+type: literary
+#+contraction: no
+#+grade: 1
+#+dots: 6
+#+direction: both
+
+### Character definitions
+
+# Display opcodes
+include da-dk-octobraille.dis
+
+# These ctrl-chars have to have a representation, so that they can be properly converted back and forth.
+space \t 2478 CHARACTER TABULATION
+space \n 678 LINE FEED (LF)
+space \v 1368 LINE TABULATION
+space \f 12378 FORM FEED (FF)
+space \r 257 CARRIAGE RETURN (CR)
+
+# Definition of dot cells
+space \s 0
+punctuation ! 235 EXCLAMATION MARK
+punctuation " 2356 QUOTATION MARK
+sign & 12346 AMPERSAND
+punctuation ' 4 APOSTROPHE
+punctuation ( 236 LEFT PARENTHESIS
+punctuation ) 356 RIGHT PARENTHESIS
+punctuation * 35 ASTERISK
+punctuation , 2 COMMA
+punctuation - 36 HYPHEN-MINUS
+punctuation . 3 FULL STOP
+punctuation / 34 SLASH
+punctuation : 25 COLON
+punctuation ; 23 SEMICOLON
+punctuation ? 26 QUESTION MARK
+include latinLetterDef6Dots.uti
+
+include digits6Dots.uti
+
+punctuation \x00a7 346 SECTION SIGN (0xa7)
+
+uplow \x00c5\x00e5 16 LATIN LETTER A WITH RING ABOVE
+uplow \x00c6\x00e6 345 LATIN LETTER AE
+uplow \x00d8\x00f8 246 LATIN LETTER O WITH STROKE
+uplow \x00dc\x00fc 1256 LATIN CAPITAL LETTER U WITH DIAERESIS
+math \x00f7 256 DIVISION SIGN
+
+# cover all other Braille patterns
+include braille-patterns.cti
+
+# Characters with two or more cells
+
+punctuation # 45-3456 NUMBER SIGN
+sign $ 45-256 DOLLAR SIGN
+math % 245-356 PERCENT SIGN
+#sign & 6-12346 AMPERSAND
+#punctuation * 6-35 ASTERISK
+math + 45-235 PLUS SIGN
+math < 45-134 LESS-THAN SIGN
+math = 45-2356 EQUALS SIGN
+math > 45-234 GREATER-THAN SIGN
+sign @ 45-1 COMMERCIAL AT
+punctuation [ 5-236 LEFT SQUARE BRACKET
+punctuation \\ 45-16 REVERSE SLASH
+punctuation ] 5-356 RIGHT SQUARE BRACKET
+punctuation ^ 45-346 CIRCUMFLEX ACCENT
+punctuation _ 45-36 LOW LINE
+punctuation ` 4 GRAVE ACCENT
+punctuation { 45-246 LEFT CURLY BRACKET
+punctuation | 4568 VERTICAL LINE
+punctuation } 45-135 RIGHT CURLY BRACKET
+punctuation ~ 467 TILDE (changed by pass 2 to not conflict with indicators
+
+# Misc unicode characters
+include da-dk-6miscChars.cti
+
+# Litdigits
+include litdigits6Dots.uti
+
+undefined 26
+
+### Braille indicators and special characters
+
+#hyphen - 36
+
+letsign 6
+
+# No letsign before capital letters or letters with accents
+
+noletsign ABCDEFGHIJKLMNOPQRSTUVWXYZ\x0160\x0152\x017d\x0178\x00c0\x00c1\x00c2\x00c3\x00c4\x00c5\x00c6\x00c7\x00c8\x00c9\x00ca\x00cb\x00cc\x00cd\x00ce\x00cf\x00d0\x00d1\x00d2\x00d3\x00d4\x00d5\x00d6\x00d8\x00d9\x00da\x00db\x00dc\x00dd\x00de\x008a\x008c\x008e
+noletsign i\x0161\x0153\x017e\x00ff\x00df\x00e0\x00e1\x00e2\x00e3\x00e7\x00e8\x00e9\x00ea\x00eb\x00ec\x00ed\x00ee\x00ef\x00f0\x00f1\x00f2\x00f3\x00f4\x00f5\x00f9\x00fa\x00fb\x00fd\x00fe\x009a\x009c
+noletsign abcdefghjklmnopqrstuvwxyz\x00e4\x00e5\x00e6\x00f6\x00f8\x00fc
+
+# Emphasis opcodes
+emphclass italic
+emphclass underline
+emphclass bold
+
+begemphphrase italic 56
+endemphphrase italic after 56
+begemphword italic 56
+endemphword italic 56
+
+begemphphrase bold 56
+endemphphrase bold after 56
+begemphword bold 56
+endemphword bold 56
+
+begemphphrase underline 56
+endemphphrase underline after 56
+begemphword underline 56
+endemphword underline 56
+
+capsletter 46
+begcapsword 456
+endcapsword 68 # Used during back-translation to stop overflow of capsword
+multind 6-46 letsign capsletter
+multind 46-6 capsletter letsign
+multind 6-456 letsign begcapsword
+multind 68-6-46 endcapsword letsign capsletter
+multind 68-6-456 endcapsword letsign begcapsword
+multind 68-6 endcapsword letsign
+
+numsign 3456
+multind 6-3456 letsign numsign
+
+#class of none-space characters that demand double dashes
+# Used in context lines later.
+#must be the first class defined.
+class charsWDoubleDash .,?!/:"'() # class w
+
+### Correct - forward translation
+
+# Chars that don't require a space before percent and permille:
+class charsBeforePercent "(\x201e\x0084\x201c\x0093\x201d\x0094\x00ab\x00bb #class x
+noback correct `["%"] *
+noback correct !$sx["%"] " %"
+noback correct `["\x2030"] *
+noback correct !$sx["\x2030"] " \x2030"
+noback correct `["\x0089"] *
+noback correct !$sx["\x0089"] " \x2030"
+
+# Chars to be treated like digits when switching back to letter mode
+class extraDigits \x00bc\x00bd\x00be
+
+#Use the "correct" opcode to convert chars that can't be back-translated
+# and make the table more simple.
+
+# Dashes
+class dashes \x2013\x2014\x0096\x0097\x00ad
+noback correct %dashes "-"
+
+class quotes \x201e\x0084\x201c\x0093\x201d\x0094\x00ab\x00bb 
+noback correct %quotes "\""
+
+class apostrophes `\x201a\x0082\x2039\x008b\x2018\x0091\x2019\x0092\x203a\x009b\x00b4
+noback correct %apostrophes "'"
+
+### Correct - backward translation
+
+# characters that may get mangled by the insertion of extra letsigns
+nofor correct "\x2818" "~"
+#nofor correct "\x282f" "&"
+#nofor correct "\x2814" "*"
+
+# Try to distinguish between times (\x00d7) and bullit (\x2022),
+# which share the same Braille representation.
+nofor correct `["\x00d7"] "\x2022" 
+# nofor correct $d["\s\x00d7\s"]$d * #apparently doesn't work now
+nofor correct ["\x00d7"]!$d "\x2022" 
+nofor correct !$d["\x00d7"] "\x2022" 
+
+nofor correct "\x28a0" ? # Extraneous endcaps signs
+#nofor correct "\x2820" ?
+nofor correct "~\\456/" "|"
+
+### Pass 1 - Forward and backward
+
+# Punctuations, math and numbers
+midnum , 2
+midnum . 3
+#midnum - 36
+endnum - 36
+midnum / 34
+midnum : 25
+
+midnum ^ 45-346
+midnum \x00d7 45-3-3456
+
+# Punctuation
+prepunc " 2356
+postpunc " 2356
+prepunc - 36
+postpunc - 36
+nofor always \s-\s 0-36-36-0
+always :- 25-36
+always ;- 23-36
+always --- 36-36-36
+always ---- 36-36-36-36
+always ----- 36-36-36-36-36
+
+# these characters must be separated from ")" by a letsign.
+class SepToRightpar Jj%'\x2030\x0089\x201a\x0082\x2039\x009b\x2018\x0091\x2019\x0092\x203a\x009b
+after SepToRightpar always ) 6-356
+
+prepunc ( 236
+postpunc ) 356
+
+always .) 3-356
+always ... 3-3-3
+
+always !! 235-235
+always !!! 235-235-235
+always !!!! 235-235-235-235
+always !!!!! 235-235-235-235-235
+
+### Context rules - forward translation
+
+# Ensure two dashes where appropriate.
+noback context $w["-"]$w @36
+noback context $sw["-"]$sw @36-36
+noback context `["-"]$sw @36-36
+noback context $sw["-"]~ @36-36
+noback context !$sw["-"]~ @36
+noback context `["-"]~ @36-36
+
+#ensure dot 6 between a digit and a letter
+noback context $dy[]$u @6
+noback context $dy$Spm.[]$u @6
+
+### context - backward translation
+
+# Ensure the correct number of dashes
+nofor context @36[@36-36] "--"
+nofor context [@36-36]@36 "--"
+nofor context $w[@36-36]$w "--"
+nofor context $sw[@36-36]$sw "-"
+nofor context `[@36-36]$sw "-"
+nofor context $sw[@36-36]~ "-"
+nofor context `@36-36~ "-"
+
+
+### Pass 2 - forward translation
+
+# Correct tilde and vertical line
+noback pass2 @467 @45-6
+noback pass2 @4568 @45-456
+
+# Show endcapsword as dot 6 (letsign)
+noback pass2 @68 @6
+
+noback pass2 @6-46-5 @46-5 # no letsign before cap letters with accent
+noback pass2 @6-46 @46-6 # Ensure correct order
+
+ ### Pass 2 - backward
+
+# Insert letsign between number (with extra punctuation) and capsletter sign
+nofor pass2 @3456$l.$Spm$l.@3$l.@3[]@46 @68-6
+nofor pass2 @3456$l.$Spm$l.@3[]@46 @68-6
+nofor pass2 @3456$l.$Spm$Spm[]@46 @68-6
+nofor pass2 @3456$l.$Spm[]@46 @68-6
+
+# Insert letsign between number (with extra punctuation) and capsword sign
+nofor pass2 @3456$l.$Spm$l.@3$l.@3[]@456 @6
+nofor pass2 @3456$l.$Spm$l.@34$l.@34[]@456 @6
+nofor pass2 @3456$l.$Spm$l.@36$l.@36[]@456 @6
+nofor pass2 @3456$l.$Spm$l.@3[]@456 @6
+nofor pass2 @3456$l.$Spm$l.@34[]@456 @6
+nofor pass2 @3456$l.$Spm$l.@36[]@456 @6
+nofor pass2 @3456$l.$Spm$Spm[]@456 @6
+nofor pass2 @3456$l.$Spm[]@456 @6
+nofor pass2 @3456$l.[]@456 @6
+
+# Place endcaps in connection to all the following Braille patterns:
+nofor pass2 $l[@45-3] @45-3-68
+nofor pass2 $l[@468] @468-68
+nofor pass2 $l[@6] @68-6 # Must come before letsign
+nofor pass2 $l[@36] @36-68
+nofor pass2 $l[@34] @34-68
+nofor pass2 $l[@2356] @2356-68
+nofor pass2 $l[@45-36] @45-36-68
+nofor pass2 $l[@4-356] @4-356-68
+nofor pass2 $l[@245-356] @245-356-68
+nofor pass2 $l[@4] @4-68
+nofor pass2 $l[@235] @235-68
+nofor pass2 $l[@45-1] @45-1-68
+nofor pass2 $l[@236] @236-68
+nofor pass2 $l[@356-356] @356-356-68
+nofor pass2 $l[@356] @356-68
+nofor pass2 $l[@3] @3-68
+nofor pass2 $l[@2] @2-68
+nofor pass2 $l[@26] @26-68
+nofor pass2 $l[@25] @25-68
+nofor pass2 $l[@12346] @12346-68
+
+nofor pass2 $l[]@46 @68-6
+#nofor pass2 $a[]@456 @6
+
+### Pass 3 - forward translation
+
+# Ensure there is only one letsign
+ noback pass3 @6-6 @6
+
+
+### Pass 3 - backward translation
+
+# save ~ and |  before inserting extra letsigns and endcapsword in pass 2.
+nofor pass3 @45-6 @468 # Create alternative representation of "~"
+nofor pass3 @45-456 @4568
diff --git a/liblouis/tables/da-dk-g18.ctb b/liblouis/tables/da-dk-g18.ctb
new file mode 100644
index 0000000..18621ed
--- /dev/null
+++ b/liblouis/tables/da-dk-g18.ctb
@@ -0,0 +1,352 @@
+# Liblouis: Danish table for 8 dots grade 1
+#
+#  Copyright (C) 2014-2017, Bue Vester-Andersen <bue@vester-andersen.dk>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#------------
+#
+# This  is the Danish table for 8 dots grade 1 (fuldskrift).
+# Use this table for translation and back-translation of Danish 8 dots grade 1.
+#
+# Version: Bue Vester-Andersen, 170604
+
+### Table Metadata
+
+#+locale: da
+#+type: literary
+#+contraction: no
+#+grade: 1
+#+dots: 8
+#+direction: both
+
+# Display upcodes
+include da-dk-octobraille.dis
+
+### Character definitions ###
+
+sign \x0000 8 NULL
+sign \x0001 178 START OF HEADING
+sign \x0002 1278 START OF TEXT
+sign \x0003 1478 END OF TEXT
+sign \x0004 14578 END OF TRANSMISSION
+sign \x0005 24568 ENQUIRY
+sign \x0006 12478 ACKNOWLEDGE
+sign \x0007 124578 BELL
+sign \x0008 12578 BACKSPACE
+space \t 2478 CHARACTER TABULATION
+space \n 678 LINE FEED (LF)
+space \v 1368 LINE TABULATION
+space \f 12378 FORM FEED (FF)
+space \r 257 CARRIAGE RETURN (CR)
+sign \x000e 134578 SHIFT OUT
+sign \x000f 12358 SHIFT IN
+sign \x0010 123478 DATA LINK ESCAPE
+sign \x0011 1234578 DEVICE CONTROL ONE
+sign \x0012 13568 DEVICE CONTROL TWO
+sign \x0013 4578 DEVICE CONTROL THREE
+sign \x0014 268 DEVICE CONTROL FOUR
+sign \x0015 13678 NEGATIVE ACKNOWLEDGE
+sign \x0016 278 SYNCHRONOUS IDLE
+sign \x0017 3578 END OF TRANSMISSION BLOCK
+sign \x0018 78 CANCEL
+sign \x0019 68 END OF MEDIUM
+sign \x001a 135678 SUBSTITUTE
+sign \x001b 2678 ESCAPE
+sign \x001c 45678 INFORMATION SEPARATOR FOUR
+sign \x001d 12368 INFORMATION SEPARATOR THREE
+sign \x001e 1234678 INFORMATION SEPARATOR TWO
+sign \x001f 235678 INFORMATION SEPARATOR ONE
+space \s 0 SPACE
+punctuation ! 235 EXCLAMATION MARK
+punctuation " 2356 QUOTATION MARK
+punctuation # 34568 NUMBER SIGN
+sign $ 25678 DOLLAR SIGN
+math % 24578 PERCENT SIGN
+sign & 123468 AMPERSAND
+punctuation ' 4 APOSTROPHE
+punctuation ( 2368 LEFT PARENTHESIS
+punctuation ) 3568 RIGHT PARENTHESIS
+punctuation * 35 ASTERISK
+math + 2358 PLUS SIGN
+punctuation , 2 COMMA
+punctuation - 368 HYPHEN-MINUS
+punctuation . 3 FULL STOP
+punctuation / 348 SLASH
+include digits8Dots.uti
+punctuation : 25 COLON
+punctuation ; 23 SEMICOLON
+math < 358 LESS-THAN SIGN
+math = 23568 EQUALS SIGN
+math > 267 GREATER-THAN SIGN
+punctuation ? 26 QUESTION MARK
+sign @ 478 COMMERCIAL AT
+uppercase A 17 LATIN CAPITAL LETTER A
+uppercase B 127 LATIN CAPITAL LETTER B
+uppercase C 147 LATIN CAPITAL LETTER C
+uppercase D 1457 LATIN CAPITAL LETTER D
+uppercase E 157 LATIN CAPITAL LETTER E
+uppercase F 1247 LATIN CAPITAL LETTER F
+uppercase G 12457 LATIN CAPITAL LETTER G
+uppercase H 1257 LATIN CAPITAL LETTER H
+uppercase I 247 LATIN CAPITAL LETTER I
+uppercase J 2457 LATIN CAPITAL LETTER J
+uppercase K 137 LATIN CAPITAL LETTER K
+uppercase L 1237 LATIN CAPITAL LETTER L
+uppercase M 1347 LATIN CAPITAL LETTER M
+uppercase N 13457 LATIN CAPITAL LETTER N
+uppercase O 1357 LATIN CAPITAL LETTER O
+uppercase P 12347 LATIN CAPITAL LETTER P
+uppercase Q 123457 LATIN CAPITAL LETTER Q
+uppercase R 12357 LATIN CAPITAL LETTER R
+uppercase S 2347 LATIN CAPITAL LETTER S
+uppercase T 23457 LATIN CAPITAL LETTER T
+uppercase U 1367 LATIN CAPITAL LETTER U
+uppercase V 12367 LATIN CAPITAL LETTER V
+uppercase W 24567 LATIN CAPITAL LETTER W
+uppercase X 13467 LATIN CAPITAL LETTER X
+uppercase Y 134567 LATIN CAPITAL LETTER Y
+uppercase Z 13567 LATIN CAPITAL LETTER Z
+punctuation [ 23678 LEFT SQUARE BRACKET
+punctuation \\ 347 REVERSE SLASH
+punctuation ] 35678 RIGHT SQUARE BRACKET
+punctuation ^ 12348 CIRCUMFLEX ACCENT
+punctuation _ 3678 LOW LINE
+punctuation ` 5 GRAVE ACCENT
+lowercase a 1 LATIN SMALL LETTER A
+lowercase b 12 LATIN SMALL LETTER B
+lowercase c 14 LATIN SMALL LETTER C
+lowercase d 145 LATIN SMALL LETTER D
+lowercase e 15 LATIN SMALL LETTER E
+lowercase f 124 LATIN SMALL LETTER F
+lowercase g 1245 LATIN SMALL LETTER G
+lowercase h 125 LATIN SMALL LETTER H
+lowercase i 24 LATIN SMALL LETTER I
+lowercase j 245 LATIN SMALL LETTER J
+lowercase k 13 LATIN SMALL LETTER K
+lowercase l 123 LATIN SMALL LETTER L
+lowercase m 134 LATIN SMALL LETTER M
+lowercase n 1345 LATIN SMALL LETTER N
+lowercase o 135 LATIN SMALL LETTER O
+lowercase p 1234 LATIN SMALL LETTER P
+lowercase q 12345 LATIN SMALL LETTER Q
+lowercase r 1235 LATIN SMALL LETTER R
+lowercase s 234 LATIN SMALL LETTER S
+lowercase t 2345 LATIN SMALL LETTER T
+lowercase u 136 LATIN SMALL LETTER U
+lowercase v 1236 LATIN SMALL LETTER V
+lowercase w 2456 LATIN SMALL LETTER W
+lowercase x 1346 LATIN SMALL LETTER X
+lowercase y 13456 LATIN SMALL LETTER Y
+lowercase z 1356 LATIN SMALL LETTER Z
+punctuation { 123678 LEFT CURLY BRACKET
+punctuation | 4568 VERTICAL LINE
+punctuation } 345678 RIGHT CURLY BRACKET
+punctuation ~ 467 TILDE
+sign \x007f 7 DELETE
+sign \x20AC 1578 #EURO SIGN (0x80)
+sign \x0081 45 <control-0081>
+punctuation \x201A 457 #Low single quote (0x82)
+sign \x0192 58 #Flurihn (0x83)
+punctuation \x201E 2378 #Low quote (0x84)
+letter \x2020 2357 #Dagger (0x86
+letter \x2021 23578 #Double dagger (0x87
+letter \x02c6 5678 #Modifier letter circumflex (0x88)
+math \x2030 245678 #permille sign (0x89)
+uppercase \x0160 23478 #LATIN CAPITAL LETTER S WITH CARON (0x8a)
+punctuation \x2039 456 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK (0x8b)
+uppercase \x0152 13578 #LATIN CAPITAL LIGATURE OE (0x8c)
+sign \x008d 3567 REVERSE LINE FEED (not defined in cp1252)
+uppercase \x017d 3467 #LATIN CAPITAL LETTER Z WITH CARON (0x8e)
+letter \x008f 27 SINGLE SHIFT THREE (not defined in cp1252)
+letter \x0090 357 DEVICE CONTROL STRING (not defined in cp1252)
+punctuation \x2018 47 #LEFT SINGLE QUOTATION MARK (0x91)
+punctuation \x2019 48 #RIGHT SINGLE QUOTATION MARK (0x92)
+punctuation \x201c 237 #LEFT DOUBLE QUOTATION MARK (0x93)
+punctuation \x201d 568 #RIGHT DOUBLE QUOTATION MARK (0x94)
+sign \x2022 37 #Bullit (0x95)
+sign \x02DC 46 #SMALL TILDE (0x98)
+sign \x2122 234578 #TRADE MARK SIGN (0x99)
+lowercase \x0161 2348 #LATIN SMALL LETTER S WITH CARON (0x9a)
+punctuation \x203A 4567 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (0x9b)
+lowercase \x0153 1358 #LATIN SMALL LIGATURE OE (0x9c)
+letter \x009d 2567 OPERATING SYSTEM COMMAND
+lowercase \x017E 346 #LATIN SMALL LETTER Z WITH CARON (0x9e)
+uppercase \x0178 2345678 #LATIN CAPITAL LETTER Y WITH DIAERESIS (0x9f)
+punctuation \x00a0 23458 NO-BREAK SPACE (0xa0)
+punctuation \x00a1 256 INVERTED EXCLAMATION MARK )0xa1)
+punctuation \x00a2 2578 CENT SIGN (0xa2)
+punctuation \x00a3 1238 POUND SIGN (0xa3)
+punctuation \x00a4 2367 CURRENCY SIGN (0xa4)
+punctuation \x00a5 67 YEN SIGN (0xa5)
+punctuation \x00a6 3478 BROKEN BAR (0xa6)
+punctuation \x00a7 578 SECTION SIGN (0xa7)
+punctuation \x00a8 56 DIAERESIS (0xa8)
+punctuation \x00a9 134678 COPYRIGHT SIGN (0xa9)
+letter \x00aa 234678 FEMININE ORDINAL INDICATOR (0xaa)
+punctuation \x00ab 57 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (0xab)
+punctuation \x00ac 34567 NOT SIGN (0xac)
+letter \x00ad 378 SOFT HYPHEN (0xad)
+punctuation \x00ae 123578 REGISTERED SIGN (0xae)
+punctuation \x00af 23567 MACRON (0xaf)
+sign \x00b0 356 DEGREE SIGN (0xb0)
+math \x00b1 123458 PLUS-MINUS SIGN
+punctuation \x00b2 238 SUPERSCRIPT TWO
+punctuation \x00b3 258 SUPERSCRIPT THREE
+punctuation \x00b4 468 ACUTE ACCENT
+sign \x00b5 236 MICRO SIGN
+punctuation \x00b6 1234568 PILCROW SIGN
+punctuation \x00b7 38 MIDDLE DOT
+punctuation \x00b8 4678 CEDILLA
+punctuation \x00b9 28 SUPERSCRIPT ONE
+letter \x00ba 12345678 MASCULINE ORDINAL INDICATOR
+punctuation \x00bb 567 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+punctuation \x00bc 13458 VULGAR FRACTION ONE QUARTER
+punctuation \x00bd 458 VULGAR FRACTION ONE HALF
+punctuation \x00be 3456 VULGAR FRACTION THREE QUARTERS
+punctuation \x00bf 34 INVERTED QUESTION MARK
+uppercase \x00c0 123567 LATIN CAPITAL LETTER A WITH GRAVE
+uppercase \x00c1 1235678 LATIN CAPITAL LETTER A WITH ACUTE
+uppercase \x00c2 1678 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+uppercase \x00c3 14678 LATIN CAPITAL LETTER A WITH TILDE
+uppercase \x00c4 34578 LATIN CAPITAL LETTER A WITH DIAERESIS
+uppercase \x00c5 167 LATIN CAPITAL LETTER A WITH RING ABOVE
+uppercase \x00c6 3457 LATIN CAPITAL LETTER AE
+uppercase \x00c7 123467 LATIN CAPITAL LETTER C WITH CEDILLA
+uppercase \x00c8 23467 LATIN CAPITAL LETTER E WITH GRAVE
+uppercase \x00c9 1234567 LATIN CAPITAL LETTER E WITH ACUTE
+uppercase \x00ca 1267 LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+uppercase \x00cb 12467 LATIN CAPITAL LETTER E WITH DIAERESIS
+uppercase \x00cc 15678 LATIN CAPITAL LETTER I WITH GRAVE
+uppercase \x00cd 12678 LATIN CAPITAL LETTER I WITH ACUTE
+uppercase \x00ce 1467 LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+uppercase \x00cf 124567 LATIN CAPITAL LETTER I WITH DIAERESIS
+uppercase \x00d0 1345678 LATIN CAPITAL LETTER ETH
+uppercase \x00d1 1245678 LATIN CAPITAL LETTER N WITH TILDE
+uppercase \x00d2 124678 LATIN CAPITAL LETTER O WITH GRAVE
+uppercase \x00d3 34678 LATIN CAPITAL LETTER O WITH ACUTE
+uppercase \x00d4 14567 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+uppercase \x00d5 145678 LATIN CAPITAL LETTER O WITH TILDE
+uppercase \x00d6 24678 LATIN CAPITAL LETTER O WITH DIAERESIS
+math \x00d7 13468 MULTIPLICATION SIGN
+uppercase \x00d8 2467 LATIN CAPITAL LETTER O WITH STROKE
+uppercase \x00d9 234567 LATIN CAPITAL LETTER U WITH GRAVE
+uppercase \x00da 125678 LATIN CAPITAL LETTER U WITH ACUTE
+uppercase \x00db 1567 LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+uppercase \x00dc 12567 LATIN CAPITAL LETTER U WITH DIAERESIS
+uppercase \x00dd 13478 LATIN CAPITAL LETTER Y WITH ACUTE (infinite?)
+uppercase \x00de 1378 LATIN CAPITAL LETTER THORN
+lowercase \x00df 23468 LATIN SMALL LETTER SHARP S
+lowercase \x00e0 12356 LATIN SMALL LETTER A WITH GRAVE
+lowercase \x00e1 123568 LATIN SMALL LETTER A WITH ACUTE
+lowercase \x00e2 168 LATIN SMALL LETTER A WITH CIRCUMFLEX
+lowercase \x00e3 1468 LATIN SMALL LETTER A WITH TILDE
+lowercase \x00e4 3458 LATIN SMALL LETTER A WITH DIAERESIS
+lowercase \x00e5 16 LATIN SMALL LETTER A WITH RING ABOVE
+lowercase \x00e6 345 LATIN SMALL LETTER AE
+lowercase \x00e7 12346 LATIN SMALL LETTER C WITH CEDILLA
+lowercase \x00e8 2346 LATIN SMALL LETTER E WITH GRAVE
+lowercase \x00e9 123456 LATIN SMALL LETTER E WITH ACUTE
+lowercase \x00ea 126 LATIN SMALL LETTER E WITH CIRCUMFLEX
+lowercase \x00eb 1246 LATIN SMALL LETTER E WITH DIAERESIS
+lowercase \x00ec 1568 LATIN SMALL LETTER I WITH GRAVE
+lowercase \x00ed 1268 LATIN SMALL LETTER I WITH ACUTE
+lowercase \x00ee 146 LATIN SMALL LETTER I WITH CIRCUMFLEX
+lowercase \x00ef 12456 LATIN SMALL LETTER I WITH DIAERESIS
+lowercase \x00f0 134568 LATIN SMALL LETTER ETH
+lowercase \x00f1 124568 LATIN SMALL LETTER N WITH TILDE
+lowercase \x00f2 12468 LATIN SMALL LETTER O WITH GRAVE
+lowercase \x00f3 3468 LATIN SMALL LETTER O WITH ACUTE
+lowercase \x00f4 1456 LATIN SMALL LETTER O WITH CIRCUMFLEX
+lowercase \x00f5 14568 LATIN SMALL LETTER O WITH TILDE
+lowercase \x00f6 2468 LATIN SMALL LETTER O WITH DIAERESIS
+math \x00f7 2568 DIVISION SIGN
+lowercase \x00f8 246 LATIN SMALL LETTER O WITH STROKE
+lowercase \x00f9 23456 LATIN SMALL LETTER U WITH GRAVE
+lowercase \x00fa 12568 LATIN SMALL LETTER U WITH ACUTE
+lowercase \x00fb 156 LATIN SMALL LETTER U WITH CIRCUMFLEX
+lowercase \x00fc 1256 LATIN SMALL LETTER U WITH DIAERESIS
+lowercase \x00fd 1348 LATIN SMALL LETTER Y WITH ACUTE
+lowercase \x00fe 138 LATIN SMALL LETTER THORN
+lowercase \x00ff 234568 LATIN SMALL LETTER Y WITH DIAERESIS
+
+# In CP-1252 the following chars are different from Unicode.
+# This placement ensures that Liblouis will always return the unicode when back-translating.
+sign \x0080 1578 #EURO SIGN (0x80)
+punctuation \x0082 457 #Low single quote (0x82)
+sign \x0083 58 #Flurihn (0x83)
+punctuation \x0084 2378 #Low quote (0x84)
+letter \x0086 2357 #Dagger (0x86
+letter \x0087 23578 #Double dagger (0x87
+letter \x0088 5678 #Modifier letter circumflex (0x88)
+math \x0089 245678 #permille sign (0x89)
+uppercase \x008a 23478 #LATIN LETTER S WITH CARON (0x8a)
+lowercase \x009a 2348
+punctuation \x008b 456 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK (0x8b)
+uppercase \x008c 13578 #LATIN LIGATURE OE (0x8c)
+lowercase \x009c 1358
+uppercase \x008e 3467 #LATIN CAPITAL LETTER Z WITH CARON (0x8e)
+lowercase \x009e 346
+punctuation \x0091 47 #LEFT SINGLE QUOTATION MARK (0x91)
+punctuation \x0092 48 #RIGHT SINGLE QUOTATION MARK (0x92)
+punctuation \x0093 237 #LEFT DOUBLE QUOTATION MARK (0x93)
+punctuation \x0094 568 #RIGHT DOUBLE QUOTATION MARK (0x94)
+sign \x0095 37 #Bullit (0x95)
+sign \x0098 46 #SMALL TILDE (0x98)
+sign \x0099 234578 #TRADE MARK SIGN (0x99)
+punctuation \x009b 4567 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (0x9b)
+uppercase \x009f 2345678 #LATIN CAPITAL LETTER Y WITH DIAERESIS (0x9f)
+
+#Unicode Braille patterns
+include braille-patterns.cti
+
+# characters that have letsign as part of their definition
+# (to be removed when the alwaysletsign opcode has been implemented).
+
+punctuation \x2026 6-3-3-3 #Elipsis (0x85)
+noback punctuation \x0085 6-3-3-3 #Elipsis (0x85)
+letter \x2013 6-36 #EN DASH (0x96)
+noback sign \x0096 6-36 #EN DASH (0x96)
+letter \x2014 6-367 #Em DASH (0x97)
+noback sign \x0097 6-367 #Em DASH (0x97)
+
+# Misc letters from other character sets prefixed with dot 5
+# to be implemented
+
+
+# Rules for grade 1 and grade 2
+
+# Emphasis opcodes
+emphclass italic
+emphclass underline
+emphclass bold
+
+begemphphrase italic 56
+endemphphrase italic after 56
+begemphword italic 56
+endemphword italic 56
+
+begemphphrase bold 56
+endemphphrase bold after 56
+begemphword bold 56
+endemphword bold 56
+
+begemphphrase underline 56
+endemphphrase underline after 56
+begemphword underline 56
+endemphword underline 56
+
diff --git a/liblouis/tables/da-dk-g26-lit.ctb b/liblouis/tables/da-dk-g26-lit.ctb
new file mode 100644
index 0000000..b069f5f
--- /dev/null
+++ b/liblouis/tables/da-dk-g26-lit.ctb
@@ -0,0 +1,904 @@
+# Liblouis: Danish table for 6 dots grade 2 forward translation (literary)
+#
+#  Copyright (C) 2014-2017, Bue Vester-Andersen <bue@vester-andersen.dk>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+# This table is for 6 dots grade 2 literary Braille, embossable, not meant for back-translation.
+#
+# Version: Bue Vester-Andersen, 170604
+
+### Table Metadata
+
+#+locale: da
+#+type: literary
+#+contraction: full
+#+grade: 2
+#+dots: 6
+#+direction: forward
+
+# Display opcodes
+include da-dk-octobraille.dis
+
+### Character definitions
+
+# These ctrl-chars have to have a representation, so that they can be properly converted back and forth.
+space \t 2478 CHARACTER TABULATION
+space \n 678 LINE FEED (LF)
+space \v 1368 LINE TABULATION
+space \f 12378 FORM FEED (FF)
+space \r 257 CARRIAGE RETURN (CR)
+
+# Definition of dot cells
+space \s 0
+punctuation ! 235 EXCLAMATION MARK
+punctuation " 2356 QUOTATION MARK
+punctuation ' 4 APOSTROPHE
+punctuation ( 236 LEFT PARENTHESIS
+punctuation ) 356 RIGHT PARENTHESIS
+punctuation , 2 COMMA
+punctuation - 36 HYPHEN-MINUS
+punctuation . 3 FULL STOP
+punctuation / 34 SLASH
+punctuation : 25 COLON
+punctuation ; 23 SEMICOLON
+punctuation ? 26 QUESTION MARK
+uplow Aa 1
+uplow Bb 12
+uplow Cc 14
+uplow Dd 145
+uplow Ee 15
+uplow Ff 124
+uplow Gg 1245
+uplow Hh 125
+uplow Ii 24
+uplow Jj 245
+uplow Kk 13
+uplow Ll 123
+uplow Mm 134
+uplow Nn 1345
+uplow Oo 135
+uplow Pp 1234
+uplow Rr 1235
+uplow Ss 234
+uplow Tt 2345
+uplow Uu 136
+uplow Vv 1236
+uplow Yy 13456
+
+#use 8 dots for the following chars to avoid conflict with indicators
+uplow Qq 123457
+uplow Ww 24567
+uplow Xx 13467
+uplow Zz 13567
+punctuation | 4568 VERTICAL LINE
+punctuation ~ 467 TILDE (changed by pass 2 to not conflict with indicators
+uplow \x00dc\x00fc 12567
+
+include digits6Dots.uti
+
+punctuation \x00a7 346 SECTION SIGN (0xa7)
+
+uplow \x00c5\x00e5 16 LATIN LETTER A WITH RING ABOVE
+uplow \x00c6\x00e6 345 LATIN LETTER AE
+uplow \x00d8\x00f8 246 LATIN LETTER O WITH STROKE
+
+# cover all other Braille patterns
+include braille-patterns.cti
+
+# Characters with two or more cells
+
+punctuation # 45-3456 NUMBER SIGN
+sign $ 45-256 DOLLAR SIGN
+math % 245-356 PERCENT SIGN
+sign & 6-12346 AMPERSAND
+punctuation * 6-35 ASTERISK
+math + 45-235 PLUS SIGN
+math < 45-134 LESS-THAN SIGN
+math = 45-2356 EQUALS SIGN
+math > 45-234 GREATER-THAN SIGN
+sign @ 45-1 COMMERCIAL AT
+punctuation [ 5-236 LEFT SQUARE BRACKET
+punctuation \\ 45-16 REVERSE SLASH
+punctuation ] 5-356 RIGHT SQUARE BRACKET
+punctuation ^ 45-346 CIRCUMFLEX ACCENT
+punctuation _ 45-36 LOW LINE
+punctuation ` 4 GRAVE ACCENT
+punctuation { 45-246 LEFT CURLY BRACKET
+punctuation } 45-135 RIGHT CURLY BRACKET
+math \x00f7 45-256 DIVISION SIGN
+
+# Misc unicode characters
+include da-dk-6miscChars.cti
+
+# Litdigits
+include litdigits6Dots.uti
+
+undefined 26
+
+### Braille indicators and special characters
+
+#hyphen - 36
+
+letsign 6
+
+# No letsign before capital letters or letters with accents
+
+noletsign I\x0160\x0152\x017d\x0178\x00c0\x00c1\x00c2\x00c3\x00c7\x00c8\x00c9\x00ca\x00cb\x00cc\x00cd\x00ce\x00cf\x00d0\x00d1\x00d2\x00d3\x00d4\x00d5\x00d9\x00da\x00db\x00dc\x00dd\x00de\x008a\x008c\x008e
+noletsign i\x0161\x0153\x017e\x00ff\x00df\x00e0\x00e1\x00e2\x00e3\x00e7\x00e8\x00e9\x00ea\x00eb\x00ec\x00ed\x00ee\x00ef\x00f0\x00f1\x00f2\x00f3\x00f4\x00f5\x00f9\x00fa\x00fb\x00fd\x00fe\x009a\x009c
+
+# Emphasis opcodes
+emphclass italic
+emphclass underline
+emphclass bold
+
+begemphphrase italic 56
+endemphphrase italic after 56
+begemphword italic 56
+endemphword italic 56
+
+begemphphrase bold 56
+endemphphrase bold after 56
+begemphword bold 56
+endemphword bold 56
+
+begemphphrase underline 56
+endemphphrase underline after 56
+begemphword underline 56
+endemphword underline 56
+
+capsletter 46
+begcapsword 456
+endcapsword 68 # Used during back-translation to stop overflow of capsword
+multind 6-46 letsign capsletter
+multind 46-6 capsletter letsign
+multind 6-456 letsign begcapsword
+multind 68-6-46 endcapsword letsign capsletter
+multind 68-6-456 endcapsword letsign begcapsword
+multind 68-6 endcapsword letsign
+
+numsign 3456
+multind 6-3456 letsign numsign
+
+#class of none-space characters that demand double dashes
+# Used in context lines later.
+#must be the first class defined.
+class charsWDoubleDash .,?!/:"'() # class w
+
+### Correct - forward translation
+
+# Chars that don't require a space before percent and permille:
+class charsBeforePercent "(\x201e\x0084\x201c\x0093\x201d\x0094\x00ab\x00bb #class x
+noback correct `["%"] *
+noback correct !$sx["%"] " %"
+noback correct `["\x2030"] *
+noback correct !$sx["\x2030"] " \x2030"
+noback correct `["\x0089"] *
+noback correct !$sx["\x0089"] " \x2030"
+
+# Chars to be treated like digits when switching back to letter mode
+class extraDigits \x00bc\x00bd\x00be
+
+#Use the "correct" opcode to convert chars that can't be back-translated
+# and make the table more simple.
+
+# Dashes
+class dashes \x2013\x2014\x0096\x0097\x00ad
+noback correct %dashes "-"
+
+class quotes \x201e\x0084\x201c\x0093\x201d\x0094\x00ab\x00bb 
+noback correct %quotes "\""
+
+class apostrophes `\x201a\x0082\x2039\x008b\x2018\x0091\x2019\x0092\x203a\x009b\x00b4
+noback correct %apostrophes "'"
+
+# Convert most single caps to lowercase
+
+#Special abbreviations with imbedded small letters.
+# Must be handled by case in this version of liblouis
+noback correct "KAbB" "KABB"
+noback correct "CUDiM" "CUDIM"
+
+swapcc UpperLower ABCDEFGHIJKLMNOPQRSTUVWXYZ\x0160\x0152\x017d\x0178\x00c0\x00c1\x00c2\x00c3\x00c4\x00c5\x00c6\x00c7\x00c8\x00c9\x00ca\x00cb\x00cc\x00cd\x00ce\x00cf\x00d0\x00d1\x00d2\x00d3\x00d4\x00d5\x00d6\x00d8\x00d9\x00da\x00db\x00dc\x00dd\x00de\x008a\x008c abcdefghijklmnopqrstuvwxyz\x0161\x0153\x017e\x00ff\x00e0\x00e1\x00e2\x00e3\x00e4\x00e5\x00e6\x00e7\x00e8\x00e9\x00ea\x00eb\x00ec\x00ed\x00ee\x00ef\x00f0\x00f1\x00f2\x00f3\x00f4\x00f5\x00f6\x00f8\x00f9\x00fa\x00fb\x00fc\x00fd\x00fe\x009a\x009c
+
+# I is a special case
+noback correct _$sp["I"]$sp "i"
+noback correct `["I"]$sp "i"
+noback correct _$sp["I"]~ "i"
+
+noback correct $sSpu[%UpperLower]$u %UpperLower
+noback correct `[%UpperLower]$u %UpperLower
+
+### Pass 1 
+
+# Punctuations, math and numbers
+midnum , 2
+midnum . 3
+#midnum - 36
+endnum - 36
+midnum / 34
+midnum : 25
+nofor midnum ^ 346
+nofor midnum ^ 45-346
+
+midnum ^ 45-346
+midnum \x00d7 45-3-3456
+
+# Punctuation
+prepunc " 2356
+postpunc " 2356
+always /\s 6-34-0
+always \s/ 0-6-34
+prepunc - 36
+postpunc - 36
+always :- 25-36
+always ;- 23-36
+always --- 36-36-36
+always ---- 36-36-36-36
+always ----- 36-36-36-36-36
+# Star enclosed by parentheses
+always (*) 236-35-356
+
+before punctuation before sign always ( 6-236
+
+# these characters must be separated from ")" by a letsign.
+class SepToRightpar Jj%'\x2030\x0089\x201a\x0082\x2039\x009b\x2018\x0091\x2019\x0092\x203a\x009b
+after SepToRightpar always ) 6-356
+after punctuation after sign always ) 6-356
+
+prepunc ( 236
+postpunc ) 356
+always .) 3-356
+always ( 6-236
+always ) 6-356
+
+always ... 3-3-3
+
+# Exclamation and "fra"
+always fra! 124-1235-1-235
+always !fra 235-124-1235-1
+always ?! 26-6-235
+always )! 356-6-235
+always (!) 236-6-235-356
+always "fra" 2356-124-1235-1-2356
+always "!" 2356-6-235-2356
+always !! 235-235
+always !!! 235-235-235
+always !!!! 235-235-235-235
+always !!!!! 235-235-235-235-235
+always '! 4-6-235
+always \s! 0-6-235
+prepunc ! 6-235
+always \x00a1 6-256
+
+### Contractions ###
+
+#Special sequences, urls emails and file names.
+
+nocont $
+nocont \x005c
+nocont @
+nocont ://
+nocont www
+nocont .com
+nocont .dk
+nocont .eu
+nocont .edu
+nocont .gov
+nocont .mil
+nocont .net
+nocont .org
+nocont .uk
+nocont .doc
+nocont .exe
+nocont .htm
+nocont .tex
+nocont .txt
+nocont .gif
+nocont .jpg
+nocont .png
+nocont .wav
+nocont .tar
+nocont .zip
+
+# Ensure no contractions in English ordinal numbers
+endnum nd 6-1345-145
+endnum st 6-234-2345
+endnum ve 6-1236-15
+
+#Words
+word af 356
+always 'af 4-1-124
+word aldrig 1-35
+word aig =
+word alle 1-15
+begnum ae 6-1-15
+contraction ae
+word allerede 1-123-1235
+begnum alr 6-1-123-1235
+contraction alr
+word alligevel 1-123-1236
+begnum alv 6-1-123-1236
+contraction alv
+word altid 1-2345-145
+begnum atd 6-1-2345-145
+contraction atd
+word altså 1-16
+begnum aå 6-1-16
+contraction aå
+word at 1
+
+word blevet 12-2345
+begnum bt 6-12-2345
+contraction bt
+word blev 12-1236
+begnum bv 6-12-1236
+contraction bv
+word blive 12-3456
+word bve 12-1236-15
+word bliver 12
+
+word derefter 23456-1356
+word derst =
+word deres 256
+word derfor 23456-124
+word derf =
+word derigennem 23456-24-12456
+word derige 1456-1235-24-12456
+word dermed 23456-134
+word derm =
+word derned 23456-1246
+word derne =
+word derop 23456-135
+word dero =
+word derover 23456-1346
+word deror =
+word derpå 23456-1234
+word derp =
+word dersom 23456-234
+word ders =
+word dertil 23456-2345
+word dert =
+word derunder 23456-12345
+word derved 23456-1236
+word din 145-1345
+begnum dn 6-145-1345
+contraction dn
+word disse 145-234
+begnum ds 6-145-234
+contraction ds
+word dit 145-2345
+begnum dt 6-145-2345
+contraction dt
+word du 145
+
+word efter 1356
+word eller 15
+word endnu 15-136
+begnum eu 6-15-136
+contraction eu
+
+word fik 124-13
+begnum fk 6-124-13
+contraction fk
+word fordi 124-145
+begnum fd 6-124-145
+contraction fd
+word forskellige 124-123456-15
+word fske =
+word forskelligt 124-123456-2345
+word fskt =
+word forskellig 124-123456
+word fsk =
+word for 124
+word fra 235
+word første 124-1356-15
+word først 124-1356
+word før 246
+
+word ganske 1245-123456
+word gennem 12456
+word ge =
+word gik 1245-13
+begnum gk 6-1245-13
+contraction gk
+word gør 1245
+
+word ham 236
+word hans 13456-234
+begnum ys 6-13456-234
+contraction ys
+word han 13456
+word har 125
+word havde 125-1456
+word hde =
+word have 125-3456
+word hve =
+word helt 125-2345
+begnum ht 6-125-2345
+contraction ht
+word hendes 125-234
+begnum hs 6-125-234
+contraction hs
+word hende 125-145
+begnum hd 6-125-145
+contraction hd
+word hun 136
+word hvad 2456
+word hv =
+word hvis 2456-234
+word hvs =
+word hvordan 34-1
+word hvora 34-6-1
+word hvorefter 34-1356
+word hvorst 34-234-2345
+word hvorfor 34-124
+word hvorf 34-6-124
+word hvorigennem 34-24-12456
+word hvorledes 34-15
+word hvore 34-6-15
+word hvormed 34-134
+word hvorm 34-6-134
+word hvornår 34-1345
+word hvorn 34-6-1345
+word hvorover 34-1346
+word hvoror 34-135-1235
+word hvorpå 34-1234
+word hvorp 34-6-1234
+word hvortil 34-2345
+word hvort 34-6-2345
+word hvorunder 34-12345
+word hvornd 34-1345-145
+word hvorved 34-1236
+word hvorv 34-6-1236
+word hvor 34
+
+word igennem 24-12456
+word ige =
+word igen 35
+word (igen) 236-24-1245-126-356
+word ig =
+word ikke 24-13
+begnum ik 6-24-13
+contraction ik
+word imidlertid 24-24
+begnum ii 6-24-24
+contraction ii
+
+word jeg 245
+word jeg) 245-6-356
+
+word kan 13
+word kommer 13-156
+word ker =
+word kommet 13-346
+word ket =
+word komme 13-146
+word kme =
+word kom 13-134
+begnum km 6-13-134
+contraction km
+word kunne 13-1246
+word kne =
+
+word ligesom 123-234
+begnum ls 6-123-234
+contraction ls
+word lige 123
+word lille 123-123
+begnum ll 6-123-123
+contraction ll
+
+word mange 134-12456
+word mge =
+word med 134
+word megen 146-126
+word meen =
+word meget 146-346
+word meet =
+word mellem 146-134
+word mem =
+word men 146
+word me =
+word min 134-1345
+begnum mn 6-134-1345
+contraction mn
+word mit 134-2345
+begnum mt 6-145-2345
+contraction mt
+word måske 134-123456
+word msk =
+word måtte 134-1256
+word mte =
+
+word naturligvis 1345-2345-1236
+begnum ntv 6-1345-2345-1236
+contraction ntv
+word nd =
+word ned 1246
+word ne =
+word nogen 1345-1345
+begnum nn 6-1345-1345
+contraction nn
+word noget 1345-2345
+begnum nt 6-1345-2345
+contraction nt
+word nogle 1345-123-15
+begnum nle 6-1345-123-15
+contraction nle
+word når 1345
+
+word også 14-16
+begnum cå 6-14-16
+contraction cå
+word og 14
+word omkring 135-134-13
+begnum omk 6-135-134-13
+contraction omk
+word op 135
+word or =
+word over 1346
+
+word på 1234
+
+word ret 12356
+word re 1235-15
+word rigtige 1235-12456
+word rge =
+word rigtigt 1235-2345
+begnum rt 6-1235-2345
+contraction rt
+word rigtig 1235
+
+word sagde 234-1456
+word sammen 234-134
+begnum sm 6-234-134
+contraction sm
+word samme 234-146
+word sme =
+word selvfølgelig 234-1236-124
+begnum svf 6-234-1236-124
+contraction svf
+word selv 234-1236
+begnum sv 6-234-1236
+contraction sv
+word sidste 234-1356-15
+word sste =
+word sidst 234-1356
+word sst =
+word sin 234-1345
+begnum sn 6-234-1345
+contraction sn
+word sit 234-2345
+begnum st 6-234-2345
+contraction st
+word skal 123456
+word sk =
+word skulle 123456-123-15
+word skle =
+word snart 234-1235
+begnum sr 6-234-1235
+contraction sr
+word som 234
+word sådan 16-1
+begnum åa 6-16-1
+contraction åa
+word således 16-15
+begnum åe 6-16-15
+contraction åe
+word så 16
+
+word tid 2345-145
+begnum td 6-2345-145
+contraction td
+word tilbage 2345-12
+begnum tb 6-2345-12
+contraction tb
+word til 2345
+
+word under 12345
+
+word var- =
+word var. =
+word var 36
+word ve 3456
+word ved 1236
+word ville 1236-123-15
+begnum vle 6-1236-123-15
+contraction vle
+word vil 1236-123
+begnum vl 6-1236-123
+contraction vl
+word været 1236-2345
+begnum vt 6-1236-2345
+contraction vt
+word være 345
+
+#Part words
+nocross den 12346
+nocross der 23456
+nocross det 2346
+nocross de 1456
+nocross en 126
+nocross er 156
+nocross et 346
+nocross ge 12456
+#nocross hvor 34
+nocross hv 2456
+nocross ig 35
+nocross me 146
+nocross nd 12345
+nocross ne 1246
+nocross or 1346
+nocross re 12356
+nocross sk 123456
+nocross st 1356
+nocross te 1256
+
+# Numsign/"ve", special case when back-translating
+noback nocross ve 3456
+
+# combinations to handle Danish regression rules
+nocross dend 1456-12345
+nocross end 15-12345
+nocross gend 12456-12345
+nocross gen 1245-126
+nocross ger 1245-156
+nocross get 1245-346
+nocross hven 2456-126
+nocross hver 2456-156
+nocross hvet 2456-346
+nocross hve 2456-15
+nocross mend 146-12345
+nocross men 134-126
+nocross mer 134-156
+nocross met 134-346
+nocross nden 1345-12346
+nocross nder 1345-23456
+nocross ndet 1345-2346
+nocross nend 1246-12345
+nocross nen 1345-126
+nocross ner 1345-156
+nocross net 1345-346
+nocross rend 12356-12345
+nocross ren 1235-126
+nocross rer 1235-156
+nocross ret 1235-346
+nocross sten 1356-126
+nocross ster 1356-156
+nocross stet 1356-346
+nocross ste 1356-15
+nocross tend 1256-12345
+nocross ten 2345-126
+nocross ter 2345-156
+nocross tet 2345-346
+nocross vend 3456-12345
+nocross ven 1236-126
+nocross ver 1236-156
+nocross vet 1236-346
+
+# Additional words containing "hvor"
+# these are made explicit in 6-dots to handle / better
+
+word hvoraf 34-1-124
+word hvorfra 34-124-1235-1
+word hvorhen 34-125-126
+word hvorhenne 34-125-126-1246
+word hvori 34-24
+word hvoriblandt 34-24-12-123-1-12345-2345
+word hvorimellem 34-24-146-123-123-15-134
+word hvorimod 34-24-134-135-145
+word hvorlænge 34-123-345-1345-12456
+word hvormange 34-134-1-1345-12456
+word hvorom 34-135-134
+word hvormeget 34-146-1245-346
+word hvorudfra 34-136-145-124-1235-1
+word hvorvidt 34-1236-24-145-2345
+word ihvorvel 24-34-3456-123
+
+# Common combinations of one word contractions with slash
+word af/på 356-34-1234
+word af/på 356-34-68-1234
+word du/i 145-34-24
+word du/i 145-34-68-24
+word eller/og 15-34-14
+word eller/og 15-34-68-14
+word fra/til 235-34-2345
+word fra/til 235-34-68-2345
+word han/hun 13456-34-136
+word han/hun 13456-34-68-136
+word hun/han 136-34-13456
+word hun/han 136-34-68-13456
+word i/du 24-34-145
+word i/du 24-34-68-145
+word og/eller 14-34-15
+word og/eller 14-34-68-15
+word over/under 1346-34-12345
+word over/under 1346-34-68-12345
+word på/af 1234-34-356
+word på/af 1234-34-68-356
+word til/fra 2345-34-235
+word til/fra 2345-34-68-235
+word under/over 12345-34-1346
+word under/over 12345-34-68-1346
+
+# Ensure no one-letter word contraction before or after a dash
+
+endword -af 36-1-124
+begword af- 1-124-36
+endword -altid 36-1-2345-145
+begword altid- 1-2345-145-36
+endword -at 36-1-2345
+endword -a 36-6-1
+begword at- 1-2345-36
+endword -og 36-135-1245
+endword -c 36-6-14
+begword og- 135-1245-36
+endword -du 36-145-136
+endword -d 36-6-145
+begword du- 145-136-36
+endword -efter 36-15-124-2345-156
+endword -z 36-6-1356
+begword efter- 15-124-2345-156-36
+midword -efter- 36-1356-36
+endword -e 36-6-15
+endword -for 36-124-1346
+endword -f 36-6-124
+begword for- 124-1346-36
+endword -fra 36-124-1235-1
+begword fra- 124-1235-1-36
+endword -g 36-6-1245
+endword -gennem 36-1245-126-1246-134
+begword gennem- 1245-126-1246-134-36
+endword -ham 36-125-1-134
+begword ham- 125-1-134-36
+endword -han 36-125-1-1345
+endword -y 36-6-13456
+begword han- 125-1-1345-36
+endword -har 36-125-1-1235
+endword -h 36-6-125
+begword har- 125-1-1235-36
+endword -hun 36-125-136-1345
+endword -u 36-6-136
+begword hun- 125-136-1345-36
+endword -j 36-6-245
+endword -kan 36-13-1-1345
+endword -k 36-6-13
+begword kan- 13-1-1345-36
+endword -lige 36-123-24-12456
+endword -l 36-6-123
+begword lige- 123-24-12456-36
+endword -med 36-146-145
+endword -m 36-6-134
+begword med- 146-145-36
+endword -men 36-134-126
+begword men- 134-126-36
+ endword -ned 36-1246-145
+begword ned- 1246-145-36
+endword -når 36-1345-16-1235
+endword -n 36-6-1345
+begword når- 1345-16-1235-36
+endword -op 36-135-1234
+endword -o 36-6-135
+begword op- 135-1234-36
+endword -over 36-135-1236-156
+endword -x 36-6-1346
+begword over- 135-1236-156-36
+endword -på 36-1234-16
+endword -p 36-6-1234
+begword på- 1234-16-36
+midword -på- 36-1234-36
+endword -ret 36-1235-346
+begword ret- 1235-346-36
+midword -ret- 36-12356-36
+endword -rigtig 36-1235-35-2345-35
+endword -r 36-6-1235
+begword rigtig- 1235-35-2345-35-36
+midword -rigtig- 36-1235-36
+endword -skal 36-123456-1-123
+begword skal- 123456-1-123-36
+midword -skal- 36-123456-36
+endword -som 36-234-135-134
+endword -s 36-6-234
+begword som- 234-135-134-36
+midword -som- 36-234-36
+endword -så 36-234-16
+endword -å 36-6-16
+begword så- 234-16-36
+endword -til 36-2345-24-123
+endword -t 36-6-2345
+begword til- 2345-24-123-36
+midword -til- 36-2345-36
+endword -under 36-136-1345-23456
+begword under- 136-1345-23456-36
+midword -under- 36-12345-36
+endword -ved 36-1236-15-145
+endword -v 36-6-1236
+begword ved- 1236-15-145-36
+midword -ved- 36-1236-36
+
+
+### Context rules - forward translation
+
+# Substitutions for joinnum rules with common math signs
+noback context $dy$s["-"$s]$dy @36
+noback context $dy$s["+"$s]$dy @235
+noback context $dy$s["\x00d7"$s]$dy @3
+noback context $dy$s["\x00f7"$s]$dy @256
+noback context $dy$s["="$s]$dy @2356
+
+# Space on each side of = when between letters or punctuation.
+noback context $lp["="]$lp @0-2356-0
+
+# Exclamation at beginning of string
+noback context `["!"] @6-235
+
+# Ensure two dashes where appropriate.
+noback context $w["-"]$w @36
+noback context $sw["-"]$sw @36-36
+noback context `["-"]$sw @36-36
+noback context $sw["-"]~ @36-36
+noback context !$sw["-"]~ @36
+noback context `["-"]~ @36-36
+
+# Ensure letsign between letter and numsign
+noback context $l[]$D @6
+
+# No "nd", "hv", "or", or "st" after a digit and a letsign
+noback context $dy["hv"] @6-125-1236
+noback context $dy$Spm["hv"] @6-125-1236
+noback context $dy["nd"] @6-1345-145
+noback context $dy$Spm["nd"] @6-1345-145
+noback context $dy["or"] @6-135-1235
+noback context $dy$Spm["or"] @6-135-1235
+noback context $dy["st"] @6-234-2345
+noback context $dy$Spm["st"] @6-234-2345
+noback context $dy["te"] @6-2345-15
+noback context $dy$Spm["te"] @6-2345-15
+
+
+#ensure dot 6 between a digit and a letter
+noback context $dy[]$u @6
+# Not letsign after digit + punctuation in literary braille
+# noback context $dy$Spm.[]$u @6
+
+### Pass 2 - forward translation
+
+# Correct chars defined as 8 dots because they include letsign
+noback pass2 @467 @45-6
+noback pass2 @4568 @45-456
+noback pass2 @123457 @6-12345
+noback pass2 @24567 @6-2456
+noback pass2 @13467 @6-1346
+noback pass2 @13567 @6-1356
+noback pass2 @12567 @6-1256
+
+# Show endcapsword as dot 6 (letsign)
+noback pass2 @68 @6
+
+noback pass2 @6-46-5 @46-5 # no letsign before cap letters with accent
+noback pass2 _$D[@6-46-6] *
+noback pass2 _$D[@6-46] *
+noback pass2 @6-46-6 @46-6 # Ensure correct order and no double letsign
+noback pass2 @6-46 @46-6 # Ensure correct order
+
+### Pass 3 - forward translation
+
+# Ensure there is only one letsign
+ noback pass3 @6-6 @6
+
+# Include hyphenation file as the last thing
+include hyph_brl_da_dk.dic
diff --git a/liblouis/tables/da-dk-g26.ctb b/liblouis/tables/da-dk-g26.ctb
new file mode 100644
index 0000000..4ad9267
--- /dev/null
+++ b/liblouis/tables/da-dk-g26.ctb
@@ -0,0 +1,1120 @@
+# Liblouis: Danish table for 6 dots grade 2 forward and backward translation 
+#
+#  Copyright (C) 2014-2017, Bue Vester-Andersen <bue@vester-andersen.dk>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+# Version: Bue Vester-Andersen, 170604
+
+### Table Metadata
+
+#+locale: da
+#+type: literary
+#+contraction: full
+#+grade: 2
+#+dots: 6
+#+direction: both
+
+# Display opcodes
+include da-dk-octobraille.dis
+
+### Character definitions
+
+# These ctrl-chars have to have a representation, so that they can be properly converted back and forth.
+space \t 2478 CHARACTER TABULATION
+space \n 678 LINE FEED (LF)
+space \v 1368 LINE TABULATION
+space \f 12378 FORM FEED (FF)
+space \r 257 CARRIAGE RETURN (CR)
+
+# Definition of dot cells
+space \s 0
+punctuation ! 235 EXCLAMATION MARK
+punctuation " 2356 QUOTATION MARK
+punctuation ' 4 APOSTROPHE
+punctuation ( 236 LEFT PARENTHESIS
+punctuation ) 356 RIGHT PARENTHESIS
+punctuation , 2 COMMA
+punctuation - 36 HYPHEN-MINUS
+punctuation . 3 FULL STOP
+punctuation / 34 SLASH
+punctuation : 25 COLON
+punctuation ; 23 SEMICOLON
+punctuation ? 26 QUESTION MARK
+uplow Aa 1
+uplow Bb 12
+uplow Cc 14
+uplow Dd 145
+uplow Ee 15
+uplow Ff 124
+uplow Gg 1245
+uplow Hh 125
+uplow Ii 24
+uplow Jj 245
+uplow Kk 13
+uplow Ll 123
+uplow Mm 134
+uplow Nn 1345
+uplow Oo 135
+uplow Pp 1234
+uplow Rr 1235
+uplow Ss 234
+uplow Tt 2345
+uplow Uu 136
+uplow Vv 1236
+uplow Yy 13456
+
+#use 8 dots for the following chars to avoid conflict with indicators
+uplow Qq 123457
+uplow Ww 24567
+uplow Xx 13467
+uplow Zz 13567
+punctuation | 4568 VERTICAL LINE
+punctuation ~ 467 TILDE (changed by pass 2 to not conflict with indicators
+uplow \x00dc\x00fc 12567
+
+include digits6Dots.uti
+
+punctuation \x00a7 346 SECTION SIGN (0xa7)
+
+uplow \x00c5\x00e5 16 LATIN LETTER A WITH RING ABOVE
+uplow \x00c6\x00e6 345 LATIN LETTER AE
+uplow \x00d8\x00f8 246 LATIN LETTER O WITH STROKE
+
+# cover all other Braille patterns
+include braille-patterns.cti
+
+# Characters with two or more cells
+
+punctuation # 45-3456 NUMBER SIGN
+sign $ 45-256 DOLLAR SIGN
+math % 245-356 PERCENT SIGN
+sign & 6-12346 AMPERSAND
+punctuation * 6-35 ASTERISK
+math + 45-235 PLUS SIGN
+math < 45-134 LESS-THAN SIGN
+math = 45-2356 EQUALS SIGN
+math > 45-234 GREATER-THAN SIGN
+sign @ 45-1 COMMERCIAL AT
+punctuation [ 5-236 LEFT SQUARE BRACKET
+punctuation \\ 45-16 REVERSE SLASH
+punctuation ] 5-356 RIGHT SQUARE BRACKET
+punctuation ^ 45-346 CIRCUMFLEX ACCENT
+punctuation _ 45-36 LOW LINE
+punctuation ` 4 GRAVE ACCENT
+punctuation { 45-246 LEFT CURLY BRACKET
+punctuation } 45-135 RIGHT CURLY BRACKET
+math \x00f7 45-256 DIVISION SIGN
+
+# Misc unicode characters
+include da-dk-6miscChars.cti
+
+# Litdigits
+include litdigits6Dots.uti
+
+undefined 26
+
+### Braille indicators and special characters
+
+#hyphen - 36
+
+letsign 6
+
+# No letsign before capital letters or letters with accents
+
+noletsign I\x0160\x0152\x017d\x0178\x00c0\x00c1\x00c2\x00c3\x00c7\x00c8\x00c9\x00ca\x00cb\x00cc\x00cd\x00ce\x00cf\x00d0\x00d1\x00d2\x00d3\x00d4\x00d5\x00d9\x00da\x00db\x00dc\x00dd\x00de\x008a\x008c\x008e
+noletsign i\x0161\x0153\x017e\x00ff\x00df\x00e0\x00e1\x00e2\x00e3\x00e7\x00e8\x00e9\x00ea\x00eb\x00ec\x00ed\x00ee\x00ef\x00f0\x00f1\x00f2\x00f3\x00f4\x00f5\x00f9\x00fa\x00fb\x00fd\x00fe\x009a\x009c
+
+# Emphasis opcodes
+emphclass italic
+emphclass underline
+emphclass bold
+
+begemphphrase italic 56
+endemphphrase italic after 56
+begemphword italic 56
+endemphword italic 56
+
+begemphphrase bold 56
+endemphphrase bold after 56
+begemphword bold 56
+endemphword bold 56
+
+begemphphrase underline 56
+endemphphrase underline after 56
+begemphword underline 56
+endemphword underline 56
+
+capsletter 46
+begcapsword 456
+endcapsword 68 # Used during back-translation to stop overflow of capsword
+multind 6-46 letsign capsletter
+multind 46-6 capsletter letsign
+multind 6-456 letsign begcapsword
+multind 68-6-46 endcapsword letsign capsletter
+multind 68-6-456 endcapsword letsign begcapsword
+multind 68-6 endcapsword letsign
+
+numsign 3456
+multind 6-3456 letsign numsign
+
+#class of none-space characters that demand double dashes
+# Used in context lines later.
+#must be the first class defined.
+class charsWDoubleDash .,?!/:"'() # class w
+
+### Correct - forward translation
+
+# Chars that don't require a space before percent and permille:
+class charsBeforePercent "(\x201e\x0084\x201c\x0093\x201d\x0094\x00ab\x00bb #class x
+noback correct `["%"] *
+noback correct !$sx["%"] " %"
+noback correct `["\x2030"] *
+noback correct !$sx["\x2030"] " \x2030"
+noback correct `["\x0089"] *
+noback correct !$sx["\x0089"] " \x2030"
+
+# Chars to be treated like digits when switching back to letter mode
+class extraDigits \x00bc\x00bd\x00be
+
+#Use the "correct" opcode to convert chars that can't be back-translated
+# and make the table more simple.
+
+# Dashes
+class dashes \x2013\x2014\x0096\x0097\x00ad
+noback correct %dashes "-"
+
+class quotes \x201e\x0084\x201c\x0093\x201d\x0094\x00ab\x00bb 
+noback correct %quotes "\""
+
+class apostrophes `\x201a\x0082\x2039\x008b\x2018\x0091\x2019\x0092\x203a\x009b\x00b4
+noback correct %apostrophes "'"
+
+### Correct - backward translation
+
+# characters that may get mangled by the insertion of extra letsigns
+nofor correct "\x2818" "~"
+#nofor correct "\x282f" "&"
+#nofor correct "\x2814" "*"
+
+# Try to distinguish between times (\x00d7) and bullit (\x2022),
+# which share the same Braille representation.
+nofor correct `["\x00d7"] "\x2022" 
+# nofor correct $d["\s\x00d7\s"]$d * #apparently doesn't work now
+nofor correct ["\x00d7"]!$d "\x2022" 
+nofor correct !$d["\x00d7"] "\x2022" 
+
+nofor correct "\x28a0" ? # Extraneous endcaps signs
+#nofor correct "\x2820" ?
+nofor correct "~\\456/" "|"
+
+### Pass 1 - Forward and backward
+
+# Punctuations, math and numbers
+midnum , 2
+midnum . 3
+#midnum - 36
+endnum - 36
+midnum / 34
+midnum : 25
+nofor midnum ^ 346
+nofor midnum ^ 45-346
+
+midnum ^ 45-346
+midnum \x00d7 45-3-3456
+
+# various back rules for math signs etc.
+nofor midnum % 0-245-356-0-3456
+nofor endnum % 0-245-356
+nofor endnum \x2030 0-245-356-356
+nofor midnum \s 3456
+nofor midnum \x00d7 45-3-3456
+nofor midnum \x00d7 45-3
+nofor midnum \x00d7 3-3456
+
+# Punctuation
+prepunc " 2356
+postpunc " 2356
+always /\s 6-34-0
+always \s/ 0-6-34
+nofor always / 6-34
+prepunc - 36
+postpunc - 36
+nofor always \s-\s 0-36-36-0
+always :- 25-36
+always ;- 23-36
+always --- 36-36-36
+always ---- 36-36-36-36
+always ----- 36-36-36-36-36
+# Star enclosed by parentheses
+always (*) 236-35-356
+
+before punctuation before sign always ( 6-236
+
+# these characters must be separated from ")" by a letsign.
+class SepToRightpar Jj%'\x2030\x0089\x201a\x0082\x2039\x009b\x2018\x0091\x2019\x0092\x203a\x009b
+after SepToRightpar always ) 6-356
+after punctuation after sign always ) 6-356
+
+prepunc ( 236
+postpunc ) 356
+always .) 3-356
+always ( 6-236
+always ) 6-356
+
+# extra back rules for ")"
+nofor after punctuation always ) 356
+nofor after punctuation always ) 68-356
+nofor always \x00b0 4-356
+nofor always ') 4-6-356
+nofor always ") 2356-356
+nofor endword j) 245-356
+nofor always ) 6-356
+
+always ... 3-3-3
+
+# Exclamation and "fra"
+always fra! 124-1235-1-235
+always !fra 235-124-1235-1
+always ?! 26-6-235
+always )! 356-6-235
+always (!) 236-6-235-356
+always "fra" 2356-124-1235-1-2356
+always "!" 2356-6-235-2356
+always !! 235-235
+always !!! 235-235-235
+always !!!! 235-235-235-235
+always !!!!! 235-235-235-235-235
+always '! 4-6-235
+always \s! 0-6-235
+prepunc ! 6-235
+always \x00a1 6-256
+
+### Contractions ###
+
+#Special sequences, urls emails and file names.
+
+nocont $
+nocont \x005c
+nocont @
+nocont ://
+nocont www
+nocont .com
+nocont .dk
+nocont .eu
+nocont .edu
+nocont .gov
+nocont .mil
+nocont .net
+nocont .org
+nocont .uk
+nocont .doc
+nocont .exe
+nocont .htm
+nocont .tex
+nocont .txt
+nocont .gif
+nocont .jpg
+nocont .png
+nocont .wav
+nocont .tar
+nocont .zip
+
+# Ensure no contractions in English ordinal numbers
+endnum nd 6-1345-145
+endnum st 6-234-2345
+endnum ve 6-1236-15
+
+#Words
+word af 356
+always 'af 4-1-124
+word aldrig 1-35
+word aig =
+word alle 1-15
+begnum ae 6-1-15
+contraction ae
+word allerede 1-123-1235
+begnum alr 6-1-123-1235
+contraction alr
+word alligevel 1-123-1236
+begnum alv 6-1-123-1236
+contraction alv
+word altid 1-2345-145
+begnum atd 6-1-2345-145
+contraction atd
+word altså 1-16
+begnum aå 6-1-16
+contraction aå
+word at 1
+
+word blevet 12-2345
+begnum bt 6-12-2345
+contraction bt
+word blev 12-1236
+begnum bv 6-12-1236
+contraction bv
+word blive 12-3456
+word bve 12-1236-15
+word bliver 12
+
+word derefter 23456-1356
+word derst =
+word deres 256
+word derfor 23456-124
+word derf =
+word derigennem 23456-24-12456
+word derige 1456-1235-24-12456
+word dermed 23456-134
+word derm =
+word derned 23456-1246
+word derne =
+word derop 23456-135
+word dero =
+word derover 23456-1346
+word deror =
+word derpå 23456-1234
+word derp =
+word dersom 23456-234
+word ders =
+word dertil 23456-2345
+word dert =
+word derunder 23456-12345
+word derved 23456-1236
+word din 145-1345
+begnum dn 6-145-1345
+contraction dn
+word disse 145-234
+begnum ds 6-145-234
+contraction ds
+word dit 145-2345
+begnum dt 6-145-2345
+contraction dt
+word du 145
+
+word efter 1356
+word eller 15
+word endnu 15-136
+begnum eu 6-15-136
+contraction eu
+
+word fik 124-13
+begnum fk 6-124-13
+contraction fk
+word fordi 124-145
+begnum fd 6-124-145
+contraction fd
+word forskellige 124-123456-15
+word fske =
+word forskelligt 124-123456-2345
+word fskt =
+word forskellig 124-123456
+word fsk =
+word for 124
+word fra 235
+word første 124-1356-15
+word først 124-1356
+word før 246
+
+word ganske 1245-123456
+word gennem 12456
+word ge =
+word gik 1245-13
+begnum gk 6-1245-13
+contraction gk
+word gør 1245
+
+word ham 236
+word hans 13456-234
+begnum ys 6-13456-234
+contraction ys
+word han 13456
+word har 125
+word havde 125-1456
+word hde =
+word have 125-3456
+word hve =
+word helt 125-2345
+begnum ht 6-125-2345
+contraction ht
+word hendes 125-234
+begnum hs 6-125-234
+contraction hs
+word hende 125-145
+begnum hd 6-125-145
+contraction hd
+word hun 136
+word hvad 2456
+word hv =
+word hvis 2456-234
+word hvs =
+word hvordan 34-1
+word hvora 34-6-1
+word hvorefter 34-1356
+word hvorst 34-234-2345
+word hvorfor 34-124
+word hvorf 34-6-124
+word hvorigennem 34-24-12456
+word hvorledes 34-15
+word hvore 34-6-15
+word hvormed 34-134
+word hvorm 34-6-134
+word hvornår 34-1345
+word hvorn 34-6-1345
+word hvorover 34-1346
+word hvoror 34-135-1235
+word hvorpå 34-1234
+word hvorp 34-6-1234
+word hvortil 34-2345
+word hvort 34-6-2345
+word hvorunder 34-12345
+word hvornd 34-1345-145
+word hvorved 34-1236
+word hvorv 34-6-1236
+word hvor 34
+
+word igennem 24-12456
+word ige =
+word igen 35
+word (igen) 236-24-1245-126-356
+word ig =
+word ikke 24-13
+begnum ik 6-24-13
+contraction ik
+word imidlertid 24-24
+begnum ii 6-24-24
+contraction ii
+
+word jeg 245
+word jeg) 245-6-356
+
+word kan 13
+word kommer 13-156
+word ker =
+word kommet 13-346
+word ket =
+word komme 13-146
+word kme =
+word kom 13-134
+begnum km 6-13-134
+contraction km
+word kunne 13-1246
+word kne =
+
+word ligesom 123-234
+begnum ls 6-123-234
+contraction ls
+word lige 123
+word lille 123-123
+begnum ll 6-123-123
+contraction ll
+
+word mange 134-12456
+word mge =
+word med 134
+word megen 146-126
+word meen =
+word meget 146-346
+word meet =
+word mellem 146-134
+word mem =
+word men 146
+word me =
+word min 134-1345
+begnum mn 6-134-1345
+contraction mn
+word mit 134-2345
+begnum mt 6-145-2345
+contraction mt
+word måske 134-123456
+word msk =
+word måtte 134-1256
+word mte =
+
+word naturligvis 1345-2345-1236
+begnum ntv 6-1345-2345-1236
+contraction ntv
+word nd =
+word ned 1246
+word ne =
+word nogen 1345-1345
+begnum nn 6-1345-1345
+contraction nn
+word noget 1345-2345
+begnum nt 6-1345-2345
+contraction nt
+word nogle 1345-123-15
+begnum nle 6-1345-123-15
+contraction nle
+word når 1345
+
+word også 14-16
+begnum cå 6-14-16
+contraction cå
+word og 14
+word omkring 135-134-13
+begnum omk 6-135-134-13
+contraction omk
+word op 135
+word or =
+word over 1346
+
+word på 1234
+
+word ret 12356
+word re 1235-15
+word rigtige 1235-12456
+word rge =
+word rigtigt 1235-2345
+begnum rt 6-1235-2345
+contraction rt
+word rigtig 1235
+
+word sagde 234-1456
+word sammen 234-134
+begnum sm 6-234-134
+contraction sm
+word samme 234-146
+word sme =
+word selvfølgelig 234-1236-124
+begnum svf 6-234-1236-124
+contraction svf
+word selv 234-1236
+begnum sv 6-234-1236
+contraction sv
+word sidste 234-1356-15
+word sste =
+word sidst 234-1356
+word sst =
+word sin 234-1345
+begnum sn 6-234-1345
+contraction sn
+word sit 234-2345
+begnum st 6-234-2345
+contraction st
+word skal 123456
+word sk =
+word skulle 123456-123-15
+word skle =
+word snart 234-1235
+begnum sr 6-234-1235
+contraction sr
+word som 234
+word sådan 16-1
+begnum åa 6-16-1
+contraction åa
+word således 16-15
+begnum åe 6-16-15
+contraction åe
+word så 16
+
+word tid 2345-145
+begnum td 6-2345-145
+contraction td
+word tilbage 2345-12
+begnum tb 6-2345-12
+contraction tb
+word til 2345
+
+word under 12345
+
+word var- =
+word var. =
+word var 36
+word ve 3456
+word ved 1236
+word ville 1236-123-15
+begnum vle 6-1236-123-15
+contraction vle
+word vil 1236-123
+begnum vl 6-1236-123
+contraction vl
+word været 1236-2345
+begnum vt 6-1236-2345
+contraction vt
+word være 345
+
+#Part words
+nocross den 12346
+nocross der 23456
+nocross det 2346
+nocross de 1456
+nocross en 126
+nocross er 156
+nocross et 346
+nocross ge 12456
+#nocross hvor 34
+nocross hv 2456
+nocross ig 35
+nocross me 146
+nocross nd 12345
+nocross ne 1246
+nocross or 1346
+nocross re 12356
+nocross sk 123456
+nocross st 1356
+nocross te 1256
+
+# Numsign/"ve", special case when back-translating
+noback nocross ve 3456
+
+#ve special case
+nofor midendword ve 3456
+
+# nondigletters covers small letters from k + various part word contractions with dots 5 or 6. Necesary to ensure correct back-translation.
+class nondigletter klmnopqrstuvwxyzæøå\x017e\x00e0\x00e7\x00e8\x00e9\x00ea\x00eb\x00ee\x00ef\x00f4\x00f9\x00fb\x00fc\x283f\x2829\x282b\x2837
+nofor before nondigletter begword ve 3456
+nofor sufword veade 3456-1-1456
+nofor sufword veader 3456-1-23456
+nofor sufword veage 3456-1-12456
+
+# veb
+nofor before nondigletter begword veb 3456-12
+nofor before nondigletter begword veba 3456-12-1
+nofor before nondigletter begword vebb 3456-12-12
+nofor before nondigletter begword vebe 3456-12-15
+nofor before nondigletter begword vebi 3456-12-24
+
+# vec
+nofor before nondigletter begword vec 3456-14
+
+# ved
+nofor before nondigletter begword ved 3456-145
+nofor before nondigletter begword veda 3456-145-1
+nofor before nondigletter begword vedb 3456-145-12
+nofor sufword vedben 3456-145-12-126
+nofor sufword vedbend 3456-145-12-15-12345
+nofor sufword vedbenden 3456-145-12-126-12346
+nofor before nondigletter begword vedc 3456-145-14
+nofor before nondigletter begword vedd 3456-145-145
+nofor sufword vedde 3456-145-1456
+nofor sufword veddet 3456-145-2346
+nofor sufword vede 3456-1456
+nofor sufword veden 3456-12346
+nofor sufword veder 3456-23456
+nofor sufword vedet 3456-2346
+nofor before nondigletter begword vedf 3456-145-124
+nofor before nondigletter begword vedfa 3456-145-124-1
+nofor before nondigletter begword vedfe 3456-145-124-15
+nofor before nondigletter begword vedfi 3456-145-124-24
+nofor before nondigletter begword vedg 3456-145-1245
+nofor before nondigletter begword vedga 3456-145-1245-1
+nofor sufword vedge 3456-145-12456
+nofor before nondigletter begword vedgi 3456-145-1245-24
+nofor before nondigletter begword vedh 3456-145-125
+nofor before nondigletter begword vedha 3456-145-125-1
+nofor before nondigletter begword vedhe 3456-145-125-15
+nofor before nondigletter begword vedhi 3456-145-125-24
+nofor before nondigletter begword vedi 3456-145-24
+nofor before nondigletter begword vedj 3456-145-245
+
+# vee
+nofor before nondigletter begword vee 3456-15
+nofor sufword veen 3456-126
+nofor sufword veer 3456-156
+nofor sufword veet 3456-346
+
+# vef
+nofor before nondigletter begword vef 3456-124
+nofor before nondigletter begword vefa 3456-124-1
+nofor before nondigletter begword vefe 3456-124-15
+nofor before nondigletter begword vefi 3456-124-24
+
+# veg
+nofor before nondigletter begword veg 3456-1245
+nofor before nondigletter begword vega 3456-1245-1
+nofor sufword vege 3456-12456
+nofor sufword vegen 3456-1245-126
+nofor word veget 3456-1245-346
+nofor sufword vegger 3456-1245-1245-156
+nofor before nondigletter begword vegi 3456-1245-24
+
+# veh
+nofor before nondigletter begword veh 3456-125
+nofor before nondigletter begword veha 3456-125-1
+nofor sufword vehage 3456-125-1-23456
+nofor before nondigletter begword vehe 3456-125-15
+nofor before nondigletter begword vehi 3456-125-24
+
+# vei
+nofor before nondigletter begword vei 3456-24
+nofor sufword veide 3456-24-1456
+nofor sufword veige 3456-24-12456
+
+# vej
+nofor before nondigletter begword vej 3456-245
+nofor before nondigletter begword veja 3456-245-1
+nofor before nondigletter begword vejaf 3456-245-1-124
+nofor sufword vejafde 3456-245-1-124-1456
+nofor before nondigletter begword vejafgif 3456-245-1-124-1245-24-124
+nofor before nondigletter begword vejb 3456-245-12
+nofor before nondigletter begword vejba 3456-245-12-1
+nofor before nondigletter begword vejbe 3456-245-12-15
+nofor before nondigletter begword vejbi 3456-245-12-24
+nofor before nondigletter begword vejc 3456-245-14
+nofor before nondigletter begword vejd 3456-245-145
+nofor before nondigletter begword vejda 3456-245-145-1
+nofor sufword vejde 3456-245-1456
+nofor before nondigletter begword vejdi 3456-245-145-24
+nofor before nondigletter begword veje 3456-245-15
+nofor before nondigletter begword vejeb 3456-245-15-12
+nofor before nondigletter begword vejed 3456-245-15-145
+nofor sufword vejede 3456-245-15-1456
+nofor before nondigletter begword vejef 3456-245-15-124
+nofor before nondigletter begword vejeg 3456-245-15-1245
+nofor sufword vejege 3456-245-15-12456
+nofor sufword vejen 3456-245-126
+nofor sufword vejene 3456-245-15-1246
+nofor sufword vejer 3456-245-156
+nofor word vejet 3456-245-346
+nofor before nondigletter begword vejf 3456-245-124
+nofor before nondigletter begword vejfa 3456-245-124-1
+nofor before nondigletter begword vejfe 3456-245-124-15
+nofor before nondigletter begword vejfi 3456-245-124-24
+nofor before nondigletter begword vejg 3456-245-1245
+nofor before nondigletter begword vejga 3456-245-1245-1
+nofor sufword vejge 3456-245-12456
+nofor before nondigletter begword vejgi 3456-245-1245-24
+nofor before nondigletter begword vejh 3456-245-125
+nofor before nondigletter begword vejha 3456-245-125-1
+nofor before nondigletter begword vejhe 3456-245-125-15
+nofor before nondigletter begword vejhi 3456-245-125-24
+nofor before nondigletter begword vejhj 3456-245-125-245
+nofor before nondigletter begword veji 3456-245-24
+nofor before nondigletter begword vejid 3456-245-24-145
+nofor before nondigletter begword vejj 3456-245-245
+nofor before nondigletter begword vejja 3456-245-245-1
+nofor before nondigletter begword vejje 3456-245-245-15
+nofor before nondigletter begword vejji 3456-245-245-24
+nofor always vend 3456-12345
+nofor always veor 3456-1346
+nofor always vest 3456-1356
+
+# combinations to handle Danish regression rules
+nocross dend 1456-12345
+nocross end 15-12345
+nocross gend 12456-12345
+nocross gen 1245-126
+nocross ger 1245-156
+nocross get 1245-346
+nocross hven 2456-126
+nocross hver 2456-156
+nocross hvet 2456-346
+nocross hve 2456-15
+nocross mend 146-12345
+nocross men 134-126
+nocross mer 134-156
+nocross met 134-346
+nocross nden 1345-12346
+nocross nder 1345-23456
+nocross ndet 1345-2346
+nocross nend 1246-12345
+nocross nen 1345-126
+nocross ner 1345-156
+nocross net 1345-346
+nocross rend 12356-12345
+nocross ren 1235-126
+nocross rer 1235-156
+nocross ret 1235-346
+nocross sten 1356-126
+nocross ster 1356-156
+nocross stet 1356-346
+nocross ste 1356-15
+nocross tend 1256-12345
+nocross ten 2345-126
+nocross ter 2345-156
+nocross tet 2345-346
+nocross vend 3456-12345
+nocross ven 1236-126
+nocross ver 1236-156
+nocross vet 1236-346
+
+# Additional words containing "hvor"
+# these are made explicit in 6-dots to handle / better
+
+word hvoraf 34-1-124
+word hvorfra 34-124-1235-1
+word hvorhen 34-125-126
+word hvorhenne 34-125-126-1246
+word hvori 34-24
+word hvoriblandt 34-24-12-123-1-12345-2345
+word hvorimellem 34-24-146-123-123-15-134
+word hvorimod 34-24-134-135-145
+word hvorlænge 34-123-345-1345-12456
+word hvormange 34-134-1-1345-12456
+word hvorom 34-135-134
+word hvormeget 34-146-1245-346
+word hvorudfra 34-136-145-124-1235-1
+word hvorvidt 34-1236-24-145-2345
+word ihvorvel 24-34-3456-123
+
+# Common combinations of one word contractions with slash
+word af/på 356-34-1234
+word af/på 356-34-68-1234
+word du/i 145-34-24
+word du/i 145-34-68-24
+word eller/og 15-34-14
+word eller/og 15-34-68-14
+word fra/til 235-34-2345
+word fra/til 235-34-68-2345
+word han/hun 13456-34-136
+word han/hun 13456-34-68-136
+word hun/han 136-34-13456
+word hun/han 136-34-68-13456
+word i/du 24-34-145
+word i/du 24-34-68-145
+word og/eller 14-34-15
+word og/eller 14-34-68-15
+word over/under 1346-34-12345
+word over/under 1346-34-68-12345
+word på/af 1234-34-356
+word på/af 1234-34-68-356
+word til/fra 2345-34-235
+word til/fra 2345-34-68-235
+word under/over 12345-34-1346
+word under/over 12345-34-68-1346
+
+# no backtrans of ^1 and `2. use contractions
+nofor always eta 346-1
+nofor always etb 346-12
+always etc 346-14
+
+# Ensure no one-letter word contraction before or after a dash
+
+endword -af 36-1-124
+begword af- 1-124-36
+endword -altid 36-1-2345-145
+begword altid- 1-2345-145-36
+endword -at 36-1-2345
+endword -a 36-6-1
+begword at- 1-2345-36
+endword -og 36-135-1245
+endword -c 36-6-14
+begword og- 135-1245-36
+endword -du 36-145-136
+endword -d 36-6-145
+begword du- 145-136-36
+endword -efter 36-15-124-2345-156
+endword -z 36-6-1356
+begword efter- 15-124-2345-156-36
+midword -efter- 36-1356-36
+endword -e 36-6-15
+endword -for 36-124-1346
+endword -f 36-6-124
+begword for- 124-1346-36
+endword -fra 36-124-1235-1
+begword fra- 124-1235-1-36
+endword -g 36-6-1245
+endword -gennem 36-1245-126-1246-134
+begword gennem- 1245-126-1246-134-36
+endword -ham 36-125-1-134
+begword ham- 125-1-134-36
+endword -han 36-125-1-1345
+endword -y 36-6-13456
+begword han- 125-1-1345-36
+endword -har 36-125-1-1235
+endword -h 36-6-125
+begword har- 125-1-1235-36
+endword -hun 36-125-136-1345
+endword -u 36-6-136
+begword hun- 125-136-1345-36
+endword -j 36-6-245
+endword -kan 36-13-1-1345
+endword -k 36-6-13
+begword kan- 13-1-1345-36
+endword -lige 36-123-24-12456
+endword -l 36-6-123
+begword lige- 123-24-12456-36
+endword -med 36-146-145
+endword -m 36-6-134
+begword med- 146-145-36
+endword -men 36-134-126
+begword men- 134-126-36
+ endword -ned 36-1246-145
+begword ned- 1246-145-36
+endword -når 36-1345-16-1235
+endword -n 36-6-1345
+begword når- 1345-16-1235-36
+endword -op 36-135-1234
+endword -o 36-6-135
+begword op- 135-1234-36
+endword -over 36-135-1236-156
+endword -x 36-6-1346
+begword over- 135-1236-156-36
+endword -på 36-1234-16
+endword -p 36-6-1234
+begword på- 1234-16-36
+midword -på- 36-1234-36
+endword -ret 36-1235-346
+begword ret- 1235-346-36
+midword -ret- 36-12356-36
+endword -rigtig 36-1235-35-2345-35
+endword -r 36-6-1235
+begword rigtig- 1235-35-2345-35-36
+midword -rigtig- 36-1235-36
+endword -skal 36-123456-1-123
+begword skal- 123456-1-123-36
+midword -skal- 36-123456-36
+endword -som 36-234-135-134
+endword -s 36-6-234
+begword som- 234-135-134-36
+midword -som- 36-234-36
+endword -så 36-234-16
+endword -å 36-6-16
+begword så- 234-16-36
+endword -til 36-2345-24-123
+endword -t 36-6-2345
+begword til- 2345-24-123-36
+midword -til- 36-2345-36
+endword -under 36-136-1345-23456
+begword under- 136-1345-23456-36
+midword -under- 36-12345-36
+endword -ved 36-1236-15-145
+endword -v 36-6-1236
+begword ved- 1236-15-145-36
+midword -ved- 36-1236-36
+
+
+### Context rules - forward translation
+
+# Exclamation at beginning of string
+noback context `["!"] @6-235
+
+# Ensure two dashes where appropriate.
+noback context $w["-"]$w @36
+noback context $sw["-"]$sw @36-36
+noback context `["-"]$sw @36-36
+noback context $sw["-"]~ @36-36
+noback context !$sw["-"]~ @36
+noback context `["-"]~ @36-36
+
+# Ensure letsign between letter and numsign
+noback context $l[]$D @6
+
+# No "nd", "hv", "or", or "st" after a digit and a letsign
+noback context $dy["hv"] @6-125-1236
+noback context $dy$Spm["hv"] @6-125-1236
+noback context $dy["nd"] @6-1345-145
+noback context $dy$Spm["nd"] @6-1345-145
+noback context $dy["or"] @6-135-1235
+noback context $dy$Spm["or"] @6-135-1235
+noback context $dy["st"] @6-234-2345
+noback context $dy$Spm["st"] @6-234-2345
+noback context $dy["te"] @6-2345-15
+noback context $dy$Spm["te"] @6-2345-15
+
+
+#ensure dot 6 between a digit and a letter
+noback context $dy[]$u @6
+noback context $dy$Spm.[]$u @6
+
+### context - backward translation
+
+# Ensure the correct number of dashes
+nofor context @36[@36-36] "--"
+nofor context [@36-36]@36 "--"
+nofor context $w[@36-36]$w "--"
+nofor context $sw[@36-36]$sw "-"
+nofor context `[@36-36]$sw "-"
+nofor context $sw[@36-36]~ "-"
+nofor context `@36-36~ "-"
+
+
+### Pass 2 - forward translation
+
+# Correct chars defined as 8 dots because they include letsign
+noback pass2 @467 @45-6
+noback pass2 @4568 @45-456
+noback pass2 @123457 @6-12345
+noback pass2 @24567 @6-2456
+noback pass2 @13467 @6-1346
+noback pass2 @13567 @6-1356
+noback pass2 @12567 @6-1256
+
+# Show endcapsword as dot 6 (letsign)
+noback pass2 @68 @6
+
+noback pass2 @6-46-5 @46-5 # no letsign before cap letters with accent
+noback pass2 _$D[@6-46-6] *
+noback pass2 _$D[@6-46] *
+noback pass2 @6-46-6 @46-6 # Ensure correct order and no double letsign
+noback pass2 @6-46 @46-6 # Ensure correct order
+
+ ### Pass 2 - backward
+
+# Insert letsign between number (with extra punctuation) and capsletter sign
+nofor pass2 @3456$l.$Spm$l.@3$l.@3[]@46 @68-6
+nofor pass2 @3456$l.$Spm$l.@3[]@46 @68-6
+nofor pass2 @3456$l.$Spm$Spm[]@46 @68-6
+nofor pass2 @3456$l.$Spm[]@46 @68-6
+
+# Insert letsign between number (with extra punctuation) and capsword sign
+nofor pass2 @3456$l.$Spm$l.@3$l.@3[]@456 @6
+nofor pass2 @3456$l.$Spm$l.@34$l.@34[]@456 @6
+nofor pass2 @3456$l.$Spm$l.@36$l.@36[]@456 @6
+nofor pass2 @3456$l.$Spm$l.@3[]@456 @6
+nofor pass2 @3456$l.$Spm$l.@34[]@456 @6
+nofor pass2 @3456$l.$Spm$l.@36[]@456 @6
+nofor pass2 @3456$l.$Spm$Spm[]@456 @6
+nofor pass2 @3456$l.$Spm[]@456 @6
+nofor pass2 @3456$l.[]@456 @6
+
+# Place endcaps in connection to all the following Braille patterns:
+nofor pass2 $l[@45-3] @45-3-68
+nofor pass2 $l[@468] @468-68
+nofor pass2 $l[@6] @68-6 # Must come before letsign
+nofor pass2 $l[@36] @36-68
+nofor pass2 $l[@34] @34-68
+nofor pass2 $l[@2356] @2356-68
+nofor pass2 $l[@45-36] @45-36-68
+nofor pass2 $l[@4-356] @4-356-68
+nofor pass2 $l[@245-356] @245-356-68
+nofor pass2 $l[@4] @4-68
+nofor pass2 $l[@235] @235-68
+nofor pass2 $l[@45-1] @45-1-68
+nofor pass2 $l[@236] @236-68
+nofor pass2 $l[@356-356] @356-356-68
+nofor pass2 $l[@356] @356-68
+nofor pass2 $l[@3] @3-68
+nofor pass2 $l[@2] @2-68
+nofor pass2 $l[@26] @26-68
+nofor pass2 $l[@25] @25-68
+nofor pass2 $l[@12346] @12346-68
+
+nofor pass2 $l[]@46 @68-6
+#nofor pass2 $a[]@456 @6
+
+### Pass 3 - forward translation
+
+# Ensure there is only one letsign
+ noback pass3 @6-6 @6
+
+
+### Pass 3 - backward translation
+
+# Save letters that have been defined with letsign as part of their definitions
+nofor pass3 @6-12345 @6-123457
+nofor pass3 @6-2456 @6-24567
+nofor pass3 @6-1346 @6-13467
+nofor pass3 @6-1356 @6-13567
+nofor pass3 @6-1256 @6-12567
+
+# save ~ and |  before inserting extra letsigns and endcapsword in pass 2.
+nofor pass3 @45-6 @467 # Create alternative representation of "~"
+nofor pass3 @45-456 @4568
+
+# Include hyphenation file as the last thing
+include hyph_brl_da_dk.dic
diff --git a/liblouis/tables/da-dk-g26l-lit.ctb b/liblouis/tables/da-dk-g26l-lit.ctb
new file mode 100644
index 0000000..3fc9df3
--- /dev/null
+++ b/liblouis/tables/da-dk-g26l-lit.ctb
@@ -0,0 +1,559 @@
+# Liblouis: Danish table for 6 dots grade 1.5 (grade 2l) literary, forward translation only
+#
+#  Copyright (C) 2014-2017, Bue Vester-Andersen <bue@vester-andersen.dk>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+# Version: Bue Vester-Andersen, 170604
+
+### Table Metadata
+
+#+locale: da
+#+type: literary
+# #+contraction: partial
+# #+grade: 1.5
+#+dots: 6
+#+direction: forward
+
+# Display opcodes
+include da-dk-octobraille.dis
+
+### Character definitions
+
+# These ctrl-chars have to have a representation, so that they can be properly converted back and forth.
+space \t 2478 CHARACTER TABULATION
+space \n 678 LINE FEED (LF)
+space \v 1368 LINE TABULATION
+space \f 12378 FORM FEED (FF)
+space \r 257 CARRIAGE RETURN (CR)
+
+# Definition of dot cells
+space \s 0
+punctuation ! 235 EXCLAMATION MARK
+punctuation " 2356 QUOTATION MARK
+punctuation ' 4 APOSTROPHE
+punctuation ( 236 LEFT PARENTHESIS
+punctuation ) 356 RIGHT PARENTHESIS
+punctuation , 2 COMMA
+punctuation - 36 HYPHEN-MINUS
+punctuation . 3 FULL STOP
+punctuation / 34 SLASH
+punctuation : 25 COLON
+punctuation ; 23 SEMICOLON
+punctuation ? 26 QUESTION MARK
+uplow Aa 1
+uplow Bb 12
+uplow Cc 14
+uplow Dd 145
+uplow Ee 15
+uplow Ff 124
+uplow Gg 1245
+uplow Hh 125
+uplow Ii 24
+uplow Jj 245
+uplow Kk 13
+uplow Ll 123
+uplow Mm 134
+uplow Nn 1345
+uplow Oo 135
+uplow Pp 1234
+uplow Rr 1235
+uplow Ss 234
+uplow Tt 2345
+uplow Uu 136
+uplow Vv 1236
+uplow Yy 13456
+
+#use 8 dots for the following chars to avoid conflict with indicators
+uplow Qq 123457
+uplow Ww 24567
+uplow Xx 13467
+uplow Zz 13567
+punctuation | 4568 VERTICAL LINE
+punctuation ~ 467 TILDE (changed by pass 2 to not conflict with indicators
+uplow \x00dc\x00fc 12567
+
+include digits6Dots.uti
+
+punctuation \x00a7 346 SECTION SIGN (0xa7)
+
+uplow \x00c5\x00e5 16 LATIN LETTER A WITH RING ABOVE
+uplow \x00c6\x00e6 345 LATIN LETTER AE
+uplow \x00d8\x00f8 246 LATIN LETTER O WITH STROKE
+
+# cover all other Braille patterns
+include braille-patterns.cti
+
+# Characters with two or more cells
+
+punctuation # 45-3456 NUMBER SIGN
+sign $ 45-256 DOLLAR SIGN
+math % 245-356 PERCENT SIGN
+sign & 6-12346 AMPERSAND
+punctuation * 6-35 ASTERISK
+math + 45-235 PLUS SIGN
+math < 45-134 LESS-THAN SIGN
+math = 45-2356 EQUALS SIGN
+math > 45-234 GREATER-THAN SIGN
+sign @ 45-1 COMMERCIAL AT
+punctuation [ 5-236 LEFT SQUARE BRACKET
+punctuation \\ 45-16 REVERSE SLASH
+punctuation ] 5-356 RIGHT SQUARE BRACKET
+punctuation ^ 45-346 CIRCUMFLEX ACCENT
+punctuation _ 45-36 LOW LINE
+punctuation ` 4 GRAVE ACCENT
+punctuation { 45-246 LEFT CURLY BRACKET
+punctuation } 45-135 RIGHT CURLY BRACKET
+math \x00f7 45-256 DIVISION SIGN
+
+# Misc unicode characters
+include da-dk-6miscChars.cti
+
+# Litdigits
+include litdigits6Dots.uti
+
+undefined 26
+
+### Braille indicators and special characters
+
+#hyphen - 36
+
+letsign 6
+
+# No letsign before capital letters or letters with accents
+
+noletsign I\x0160\x0152\x017d\x0178\x00c0\x00c1\x00c2\x00c3\x00c7\x00c8\x00c9\x00ca\x00cb\x00cc\x00cd\x00ce\x00cf\x00d0\x00d1\x00d2\x00d3\x00d4\x00d5\x00d9\x00da\x00db\x00dc\x00dd\x00de\x008a\x008c\x008e
+noletsign i\x0161\x0153\x017e\x00ff\x00df\x00e0\x00e1\x00e2\x00e3\x00e7\x00e8\x00e9\x00ea\x00eb\x00ec\x00ed\x00ee\x00ef\x00f0\x00f1\x00f2\x00f3\x00f4\x00f5\x00f9\x00fa\x00fb\x00fd\x00fe\x009a\x009c
+
+# Emphasis opcodes
+emphclass italic
+emphclass underline
+emphclass bold
+
+begemphphrase italic 56
+endemphphrase italic after 56
+begemphword italic 56
+endemphword italic 56
+
+begemphphrase bold 56
+endemphphrase bold after 56
+begemphword bold 56
+endemphword bold 56
+
+begemphphrase underline 56
+endemphphrase underline after 56
+begemphword underline 56
+endemphword underline 56
+
+capsletter 46
+begcapsword 456
+endcapsword 68 # Used during back-translation to stop overflow of capsword
+multind 6-46 letsign capsletter
+multind 46-6 capsletter letsign
+multind 6-456 letsign begcapsword
+multind 68-6-46 endcapsword letsign capsletter
+multind 68-6-456 endcapsword letsign begcapsword
+multind 68-6 endcapsword letsign
+
+numsign 3456
+multind 6-3456 letsign numsign
+
+#class of none-space characters that demand double dashes
+# Used in context lines later.
+#must be the first class defined.
+class charsWDoubleDash .,?!/:"'() # class w
+
+### Correct - forward translation
+
+# Chars that don't require a space before percent and permille:
+class charsBeforePercent "(\x201e\x0084\x201c\x0093\x201d\x0094\x00ab\x00bb #class x
+noback correct `["%"] *
+noback correct !$sx["%"] " %"
+noback correct `["\x2030"] *
+noback correct !$sx["\x2030"] " \x2030"
+noback correct `["\x0089"] *
+noback correct !$sx["\x0089"] " \x2030"
+
+# Chars to be treated like digits when switching back to letter mode
+class extraDigits \x00bc\x00bd\x00be
+
+#Use the "correct" opcode to convert chars that can't be back-translated
+# and make the table more simple.
+
+# Dashes
+class dashes \x2013\x2014\x0096\x0097\x00ad
+noback correct %dashes "-"
+
+class quotes \x201e\x0084\x201c\x0093\x201d\x0094\x00ab\x00bb 
+noback correct %quotes "\""
+
+class apostrophes `\x201a\x0082\x2039\x008b\x2018\x0091\x2019\x0092\x203a\x009b\x00b4
+noback correct %apostrophes "'"
+
+# Convert most single caps to lowercase
+
+#Special abbreviations with imbedded small letters.
+# Must be handled by case in this version of liblouis
+noback correct "KAbB" "KABB"
+noback correct "CUDiM" "CUDIM"
+
+swapcc UpperLower ABCDEFGHIJKLMNOPQRSTUVWXYZ\x0160\x0152\x017d\x0178\x00c0\x00c1\x00c2\x00c3\x00c4\x00c5\x00c6\x00c7\x00c8\x00c9\x00ca\x00cb\x00cc\x00cd\x00ce\x00cf\x00d0\x00d1\x00d2\x00d3\x00d4\x00d5\x00d6\x00d8\x00d9\x00da\x00db\x00dc\x00dd\x00de\x008a\x008c abcdefghijklmnopqrstuvwxyz\x0161\x0153\x017e\x00ff\x00e0\x00e1\x00e2\x00e3\x00e4\x00e5\x00e6\x00e7\x00e8\x00e9\x00ea\x00eb\x00ec\x00ed\x00ee\x00ef\x00f0\x00f1\x00f2\x00f3\x00f4\x00f5\x00f6\x00f8\x00f9\x00fa\x00fb\x00fc\x00fd\x00fe\x009a\x009c
+
+# I is a special case
+noback correct _$sp["I"]$sp "i"
+noback correct `["I"]$sp "i"
+noback correct _$sp["I"]~ "i"
+
+noback correct $sSpu[%UpperLower]$u %UpperLower
+noback correct `[%UpperLower]$u %UpperLower
+
+### Pass 1
+
+# Punctuations, math and numbers
+midnum , 2
+midnum . 3
+#midnum - 36
+endnum - 36
+midnum / 34
+midnum : 25
+nofor midnum ^ 346
+nofor midnum ^ 45-346
+
+midnum ^ 45-346
+midnum \x00d7 45-3-3456
+
+# various back rules for math signs etc.
+nofor midnum % 0-245-356-0-3456
+nofor endnum % 0-245-356
+nofor endnum \x2030 0-245-356-356
+nofor midnum \s 3456
+nofor midnum \x00d7 45-3-3456
+nofor midnum \x00d7 45-3
+nofor midnum \x00d7 3-3456
+
+# Punctuation
+prepunc " 2356
+postpunc " 2356
+always /\s 6-34-0
+always \s/ 0-6-34
+nofor always / 6-34
+prepunc - 36
+postpunc - 36
+nofor always \s-\s 0-36-36-0
+always :- 25-36
+always ;- 23-36
+always --- 36-36-36
+always ---- 36-36-36-36
+always ----- 36-36-36-36-36
+# Star enclosed by parentheses
+always (*) 236-35-356
+
+before punctuation before sign always ( 6-236
+
+# these characters must be separated from ")" by a letsign.
+class SepToRightpar Jj%'\x2030\x0089\x201a\x0082\x2039\x009b\x2018\x0091\x2019\x0092\x203a\x009b
+after SepToRightpar always ) 6-356
+
+prepunc ( 236
+postpunc ) 356
+always .) 3-356
+always ( 6-236
+always ) 6-356
+
+# extra back rules for ")"
+nofor after punctuation always ) 356
+nofor after punctuation always ) 68-356
+nofor always \x00b0 4-356
+nofor always ') 4-6-356
+nofor always ") 2356-356
+nofor endword j) 245-356
+nofor always ) 6-356
+
+always ... 3-3-3
+
+#inverted exclamation
+always \x00a1 6-256
+
+### Contractions ###
+
+#Special sequences, urls emails and file names.
+
+nocont $
+nocont \x005c
+nocont @
+nocont ://
+nocont www
+nocont .com
+nocont .dk
+nocont .eu
+nocont .edu
+nocont .gov
+nocont .mil
+nocont .net
+nocont .org
+nocont .uk
+nocont .doc
+nocont .exe
+nocont .htm
+nocont .tex
+nocont .txt
+nocont .gif
+nocont .jpg
+nocont .png
+nocont .wav
+nocont .tar
+nocont .zip
+
+#Words
+word at 1
+word bliver 12
+word den 12346
+word der 23456
+word det 2346
+word de 1456
+word du 145
+word efter 1356
+word eller 15
+word en 126
+word er 156
+word et 346
+word for 124
+word før 246
+word gennem 12456
+word gør 1245
+word han 13456
+word har 125
+word hun 136
+word hvad 2456
+word hvor 34
+word jeg 245
+word kan 13
+word lige 123
+word med 134
+word men 146
+word ned 1246
+word når 1345
+word og 14
+word op 135
+word over 1346
+word på 1234
+word ret 12356
+word rigtig 1235
+word skal 123456
+word som 234
+word så 16
+word te 1256
+word til 2345
+word under 12345
+word ve 3456
+word ved 1236
+word være 345
+
+# Common combinations of one word contractions with slash
+word af/på 356-34-1234
+word af/på 356-34-68-1234
+word du/i 145-34-24
+word du/i 145-34-68-24
+word eller/og 15-34-14
+word eller/og 15-34-68-14
+word fra/til 235-34-2345
+word fra/til 235-34-68-2345
+word han/hun 13456-34-136
+word han/hun 13456-34-68-136
+word hun/han 136-34-13456
+word hun/han 136-34-68-13456
+word i/du 24-34-145
+word i/du 24-34-68-145
+word og/eller 14-34-15
+word og/eller 14-34-68-15
+word over/under 1346-34-12345
+word over/under 1346-34-68-12345
+word på/af 1234-34-356
+word på/af 1234-34-68-356
+word til/fra 2345-34-235
+word til/fra 2345-34-68-235
+word under/over 12345-34-1346
+word under/over 12345-34-68-1346
+
+# no backtrans of ^1 and `2. use contractions
+nofor always eta 346-1
+nofor always etb 346-12
+always etc 346-14
+
+# Ensure no one-letter word contraction before or after a dash
+
+endword -af 36-1-124
+begword af- 1-124-36
+endword -altid 36-1-2345-145
+begword altid- 1-2345-145-36
+endword -at 36-1-2345
+endword -a 36-6-1
+begword at- 1-2345-36
+endword -og 36-135-1245
+endword -c 36-6-14
+begword og- 135-1245-36
+endword -du 36-145-136
+endword -d 36-6-145
+begword du- 145-136-36
+endword -efter 36-15-124-2345-156
+endword -z 36-6-1356
+begword efter- 15-124-2345-156-36
+midword -efter- 36-1356-36
+endword -e 36-6-15
+endword -for 36-124-1346
+endword -f 36-6-124
+begword for- 124-1346-36
+endword -fra 36-124-1235-1
+begword fra- 124-1235-1-36
+endword -g 36-6-1245
+endword -gennem 36-1245-126-1246-134
+begword gennem- 1245-126-1246-134-36
+endword -ham 36-125-1-134
+begword ham- 125-1-134-36
+endword -han 36-125-1-1345
+endword -y 36-6-13456
+begword han- 125-1-1345-36
+endword -har 36-125-1-1235
+endword -h 36-6-125
+begword har- 125-1-1235-36
+endword -hun 36-125-136-1345
+endword -u 36-6-136
+begword hun- 125-136-1345-36
+endword -j 36-6-245
+endword -kan 36-13-1-1345
+endword -k 36-6-13
+begword kan- 13-1-1345-36
+endword -lige 36-123-24-12456
+endword -l 36-6-123
+begword lige- 123-24-12456-36
+endword -med 36-146-145
+endword -m 36-6-134
+begword med- 146-145-36
+endword -men 36-134-126
+begword men- 134-126-36
+ endword -ned 36-1246-145
+begword ned- 1246-145-36
+endword -når 36-1345-16-1235
+endword -n 36-6-1345
+begword når- 1345-16-1235-36
+endword -op 36-135-1234
+endword -o 36-6-135
+begword op- 135-1234-36
+endword -over 36-135-1236-156
+endword -x 36-6-1346
+begword over- 135-1236-156-36
+endword -på 36-1234-16
+endword -p 36-6-1234
+begword på- 1234-16-36
+midword -på- 36-1234-36
+endword -ret 36-1235-346
+begword ret- 1235-346-36
+midword -ret- 36-12356-36
+endword -rigtig 36-1235-35-2345-35
+endword -r 36-6-1235
+begword rigtig- 1235-35-2345-35-36
+midword -rigtig- 36-1235-36
+endword -skal 36-123456-1-123
+begword skal- 123456-1-123-36
+midword -skal- 36-123456-36
+endword -som 36-234-135-134
+endword -s 36-6-234
+begword som- 234-135-134-36
+midword -som- 36-234-36
+endword -så 36-234-16
+endword -å 36-6-16
+begword så- 234-16-36
+endword -til 36-2345-24-123
+endword -t 36-6-2345
+begword til- 2345-24-123-36
+midword -til- 36-2345-36
+endword -under 36-136-1345-23456
+begword under- 136-1345-23456-36
+midword -under- 36-12345-36
+endword -ved 36-1236-15-145
+endword -v 36-6-1236
+begword ved- 1236-15-145-36
+midword -ved- 36-1236-36
+
+
+### Context rules - forward translation
+
+# Substitutions for joinnum rules with common math signs
+noback context $dy$s["-"$s]$dy @36
+noback context $dy$s["+"$s]$dy @235
+noback context $dy$s["\x00d7"$s]$dy @3
+noback context $dy$s["\x00f7"$s]$dy @256
+noback context $dy$s["="$s]$dy @2356
+
+# Space on each side of = when between letters or punctuation.
+noback context $lp["="]$lp @0-2356-0
+
+# Exclamation at beginning of string
+noback context `["!"] @6-235
+
+# Ensure two dashes where appropriate.
+noback context $w["-"]$w @36
+noback context $sw["-"]$sw @36-36
+noback context `["-"]$sw @36-36
+noback context $sw["-"]~ @36-36
+noback context !$sw["-"]~ @36
+noback context `["-"]~ @36-36
+
+# Ensure letsign between letter and numsign
+noback context $l[]$D @6
+
+# No "nd", "hv", "or", or "st" after a digit and a letsign
+noback context $dy["hv"] @6-125-1236
+noback context $dy$Spm["hv"] @6-125-1236
+noback context $dy["nd"] @6-1345-145
+noback context $dy$Spm["nd"] @6-1345-145
+noback context $dy["or"] @6-135-1235
+noback context $dy$Spm["or"] @6-135-1235
+noback context $dy["st"] @6-234-2345
+noback context $dy$Spm["st"] @6-234-2345
+noback context $dy["te"] @6-2345-15
+noback context $dy$Spm["te"] @6-2345-15
+
+
+#ensure dot 6 between a digit and a letter
+noback context $dy[]$u @6
+noback context $dy$Spm.[]$u @6
+
+### Pass 2 - forward translation
+
+# Correct chars defined as 8 dots because they include letsign
+noback pass2 @467 @45-6
+noback pass2 @4568 @45-456
+noback pass2 @123457 @6-12345
+noback pass2 @24567 @6-2456
+noback pass2 @13467 @6-1346
+noback pass2 @13567 @6-1356
+noback pass2 @12567 @6-1256
+
+# Show endcapsword as dot 6 (letsign)
+noback pass2 @68 @6
+
+noback pass2 @6-46-5 @46-5 # no letsign before cap letters with accent
+noback pass2 _$D[@6-46-6] *
+noback pass2 _$D[@6-46] *
+noback pass2 @6-46-6 @46-6 # Ensure correct order and no double letsign
+noback pass2 @6-46 @46-6 # Ensure correct order
+
+### Pass 3 - forward translation
+
+# Ensure there is only one letsign
+ noback pass3 @6-6 @6
diff --git a/liblouis/tables/da-dk-g26l.ctb b/liblouis/tables/da-dk-g26l.ctb
new file mode 100644
index 0000000..ad3b414
--- /dev/null
+++ b/liblouis/tables/da-dk-g26l.ctb
@@ -0,0 +1,620 @@
+# Liblouis: Danish table for 6 dots grade 1.5 (grade 2l) forward and backward translation 
+#
+#  Copyright (C) 2014-2017, Bue Vester-Andersen <bue@vester-andersen.dk>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+# Version: Bue Vester-Andersen, 170604
+
+### Table Metadata
+
+#+locale: da
+#+type: literary
+# #+contraction: partial
+# #+grade: 1.5
+#+dots: 6
+#+direction: both
+
+# Display opcodes
+include da-dk-octobraille.dis
+
+### Character definitions
+
+# These ctrl-chars have to have a representation, so that they can be properly converted back and forth.
+space \t 2478 CHARACTER TABULATION
+space \n 678 LINE FEED (LF)
+space \v 1368 LINE TABULATION
+space \f 12378 FORM FEED (FF)
+space \r 257 CARRIAGE RETURN (CR)
+
+# Definition of dot cells
+space \s 0
+punctuation ! 235 EXCLAMATION MARK
+punctuation " 2356 QUOTATION MARK
+punctuation ' 4 APOSTROPHE
+punctuation ( 236 LEFT PARENTHESIS
+punctuation ) 356 RIGHT PARENTHESIS
+punctuation , 2 COMMA
+punctuation - 36 HYPHEN-MINUS
+punctuation . 3 FULL STOP
+punctuation / 34 SLASH
+punctuation : 25 COLON
+punctuation ; 23 SEMICOLON
+punctuation ? 26 QUESTION MARK
+uplow Aa 1
+uplow Bb 12
+uplow Cc 14
+uplow Dd 145
+uplow Ee 15
+uplow Ff 124
+uplow Gg 1245
+uplow Hh 125
+uplow Ii 24
+uplow Jj 245
+uplow Kk 13
+uplow Ll 123
+uplow Mm 134
+uplow Nn 1345
+uplow Oo 135
+uplow Pp 1234
+uplow Rr 1235
+uplow Ss 234
+uplow Tt 2345
+uplow Uu 136
+uplow Vv 1236
+uplow Yy 13456
+
+#use 8 dots for the following chars to avoid conflict with indicators
+uplow Qq 123457
+uplow Ww 24567
+uplow Xx 13467
+uplow Zz 13567
+punctuation | 4568 VERTICAL LINE
+punctuation ~ 467 TILDE (changed by pass 2 to not conflict with indicators
+uplow \x00dc\x00fc 12567
+
+include digits6Dots.uti
+
+punctuation \x00a7 346 SECTION SIGN (0xa7)
+
+uplow \x00c5\x00e5 16 LATIN LETTER A WITH RING ABOVE
+uplow \x00c6\x00e6 345 LATIN LETTER AE
+uplow \x00d8\x00f8 246 LATIN LETTER O WITH STROKE
+
+# cover all other Braille patterns
+include braille-patterns.cti
+
+# Characters with two or more cells
+
+punctuation # 45-3456 NUMBER SIGN
+sign $ 45-256 DOLLAR SIGN
+math % 245-356 PERCENT SIGN
+sign & 6-12346 AMPERSAND
+punctuation * 6-35 ASTERISK
+math + 45-235 PLUS SIGN
+math < 45-134 LESS-THAN SIGN
+math = 45-2356 EQUALS SIGN
+math > 45-234 GREATER-THAN SIGN
+sign @ 45-1 COMMERCIAL AT
+punctuation [ 5-236 LEFT SQUARE BRACKET
+punctuation \\ 45-16 REVERSE SLASH
+punctuation ] 5-356 RIGHT SQUARE BRACKET
+punctuation ^ 45-346 CIRCUMFLEX ACCENT
+punctuation _ 45-36 LOW LINE
+punctuation ` 4 GRAVE ACCENT
+punctuation { 45-246 LEFT CURLY BRACKET
+punctuation } 45-135 RIGHT CURLY BRACKET
+math \x00f7 45-256 DIVISION SIGN
+
+# Misc unicode characters
+include da-dk-6miscChars.cti
+
+# Litdigits
+include litdigits6Dots.uti
+
+undefined 26
+
+### Braille indicators and special characters
+
+#hyphen - 36
+
+letsign 6
+
+# No letsign before capital letters or letters with accents
+
+noletsign I\x0160\x0152\x017d\x0178\x00c0\x00c1\x00c2\x00c3\x00c7\x00c8\x00c9\x00ca\x00cb\x00cc\x00cd\x00ce\x00cf\x00d0\x00d1\x00d2\x00d3\x00d4\x00d5\x00d9\x00da\x00db\x00dc\x00dd\x00de\x008a\x008c\x008e
+noletsign i\x0161\x0153\x017e\x00ff\x00df\x00e0\x00e1\x00e2\x00e3\x00e7\x00e8\x00e9\x00ea\x00eb\x00ec\x00ed\x00ee\x00ef\x00f0\x00f1\x00f2\x00f3\x00f4\x00f5\x00f9\x00fa\x00fb\x00fd\x00fe\x009a\x009c
+
+# Emphasis opcodes
+emphclass italic
+emphclass underline
+emphclass bold
+
+begemphphrase italic 56
+endemphphrase italic after 56
+begemphword italic 56
+endemphword italic 56
+
+begemphphrase bold 56
+endemphphrase bold after 56
+begemphword bold 56
+endemphword bold 56
+
+begemphphrase underline 56
+endemphphrase underline after 56
+begemphword underline 56
+endemphword underline 56
+
+capsletter 46
+begcapsword 456
+endcapsword 68 # Used during back-translation to stop overflow of capsword
+multind 6-46 letsign capsletter
+multind 46-6 capsletter letsign
+multind 6-456 letsign begcapsword
+multind 68-6-46 endcapsword letsign capsletter
+multind 68-6-456 endcapsword letsign begcapsword
+multind 68-6 endcapsword letsign
+
+numsign 3456
+multind 6-3456 letsign numsign
+
+#class of none-space characters that demand double dashes
+# Used in context lines later.
+#must be the first class defined.
+class charsWDoubleDash .,?!/:"'() # class w
+
+### Correct - forward translation
+
+# Chars that don't require a space before percent and permille:
+class charsBeforePercent "(\x201e\x0084\x201c\x0093\x201d\x0094\x00ab\x00bb #class x
+noback correct `["%"] *
+noback correct !$sx["%"] " %"
+noback correct `["\x2030"] *
+noback correct !$sx["\x2030"] " \x2030"
+noback correct `["\x0089"] *
+noback correct !$sx["\x0089"] " \x2030"
+
+# Chars to be treated like digits when switching back to letter mode
+class extraDigits \x00bc\x00bd\x00be
+
+#Use the "correct" opcode to convert chars that can't be back-translated
+# and make the table more simple.
+
+# Dashes
+class dashes \x2013\x2014\x0096\x0097\x00ad
+noback correct %dashes "-"
+
+class quotes \x201e\x0084\x201c\x0093\x201d\x0094\x00ab\x00bb 
+noback correct %quotes "\""
+
+class apostrophes `\x201a\x0082\x2039\x008b\x2018\x0091\x2019\x0092\x203a\x009b\x00b4
+noback correct %apostrophes "'"
+
+### Correct - backward translation
+
+# characters that may get mangled by the insertion of extra letsigns
+nofor correct "\x2818" "~"
+#nofor correct "\x282f" "&"
+#nofor correct "\x2814" "*"
+
+# Try to distinguish between times (\x00d7) and bullit (\x2022),
+# which share the same Braille representation.
+nofor correct `["\x00d7"] "\x2022" 
+# nofor correct $d["\s\x00d7\s"]$d * #apparently doesn't work now
+nofor correct ["\x00d7"]!$d "\x2022" 
+nofor correct !$d["\x00d7"] "\x2022" 
+
+nofor correct "\x28a0" ? # Extraneous endcaps signs
+#nofor correct "\x2820" ?
+nofor correct "~\\456/" "|"
+
+### Pass 1 - Forward and backward
+
+# Punctuations, math and numbers
+midnum , 2
+midnum . 3
+#midnum - 36
+endnum - 36
+midnum / 34
+midnum : 25
+nofor midnum ^ 346
+nofor midnum ^ 45-346
+
+midnum ^ 45-346
+midnum \x00d7 45-3-3456
+
+# various back rules for math signs etc.
+nofor midnum % 0-245-356-0-3456
+nofor endnum % 0-245-356
+nofor endnum \x2030 0-245-356-356
+nofor midnum \s 3456
+nofor midnum \x00d7 45-3-3456
+nofor midnum \x00d7 45-3
+nofor midnum \x00d7 3-3456
+
+# Punctuation
+prepunc " 2356
+postpunc " 2356
+always /\s 6-34-0
+always \s/ 0-6-34
+nofor always / 6-34
+prepunc - 36
+postpunc - 36
+nofor always \s-\s 0-36-36-0
+always :- 25-36
+always ;- 23-36
+always --- 36-36-36
+always ---- 36-36-36-36
+always ----- 36-36-36-36-36
+# Star enclosed by parentheses
+always (*) 236-35-356
+
+before punctuation before sign always ( 6-236
+
+# these characters must be separated from ")" by a letsign.
+class SepToRightpar Jj%'\x2030\x0089\x201a\x0082\x2039\x009b\x2018\x0091\x2019\x0092\x203a\x009b
+after SepToRightpar always ) 6-356
+
+prepunc ( 236
+postpunc ) 356
+always .) 3-356
+always ( 6-236
+always ) 6-356
+
+# extra back rules for ")"
+nofor after punctuation always ) 356
+nofor after punctuation always ) 68-356
+nofor always \x00b0 4-356
+nofor always ') 4-6-356
+nofor always ") 2356-356
+nofor endword j) 245-356
+nofor always ) 6-356
+
+always ... 3-3-3
+
+#inverted exclamation
+always \x00a1 6-256
+
+### Contractions ###
+
+#Special sequences, urls emails and file names.
+
+nocont $
+nocont \x005c
+nocont @
+nocont ://
+nocont www
+nocont .com
+nocont .dk
+nocont .eu
+nocont .edu
+nocont .gov
+nocont .mil
+nocont .net
+nocont .org
+nocont .uk
+nocont .doc
+nocont .exe
+nocont .htm
+nocont .tex
+nocont .txt
+nocont .gif
+nocont .jpg
+nocont .png
+nocont .wav
+nocont .tar
+nocont .zip
+
+#Words
+word at 1
+word bliver 12
+word den 12346
+word der 23456
+word det 2346
+word de 1456
+word du 145
+word efter 1356
+word eller 15
+word en 126
+word er 156
+word et 346
+word for 124
+word før 246
+word gennem 12456
+word gør 1245
+word han 13456
+word har 125
+word hun 136
+word hvad 2456
+word hvor 34
+word jeg 245
+word kan 13
+word lige 123
+word med 134
+word men 146
+word ned 1246
+word når 1345
+word og 14
+word op 135
+word over 1346
+word på 1234
+word ret 12356
+word rigtig 1235
+word skal 123456
+word som 234
+word så 16
+word te 1256
+word til 2345
+word under 12345
+word ve 3456
+word ved 1236
+word være 345
+
+# Common combinations of one word contractions with slash
+word af/på 356-34-1234
+word af/på 356-34-68-1234
+word du/i 145-34-24
+word du/i 145-34-68-24
+word eller/og 15-34-14
+word eller/og 15-34-68-14
+word fra/til 235-34-2345
+word fra/til 235-34-68-2345
+word han/hun 13456-34-136
+word han/hun 13456-34-68-136
+word hun/han 136-34-13456
+word hun/han 136-34-68-13456
+word i/du 24-34-145
+word i/du 24-34-68-145
+word og/eller 14-34-15
+word og/eller 14-34-68-15
+word over/under 1346-34-12345
+word over/under 1346-34-68-12345
+word på/af 1234-34-356
+word på/af 1234-34-68-356
+word til/fra 2345-34-235
+word til/fra 2345-34-68-235
+word under/over 12345-34-1346
+word under/over 12345-34-68-1346
+
+# no backtrans of ^1 and `2. use contractions
+nofor always eta 346-1
+nofor always etb 346-12
+always etc 346-14
+
+# Ensure no one-letter word contraction before or after a dash
+
+endword -af 36-1-124
+begword af- 1-124-36
+endword -altid 36-1-2345-145
+begword altid- 1-2345-145-36
+endword -at 36-1-2345
+endword -a 36-6-1
+begword at- 1-2345-36
+endword -og 36-135-1245
+endword -c 36-6-14
+begword og- 135-1245-36
+endword -du 36-145-136
+endword -d 36-6-145
+begword du- 145-136-36
+endword -efter 36-15-124-2345-156
+endword -z 36-6-1356
+begword efter- 15-124-2345-156-36
+midword -efter- 36-1356-36
+endword -e 36-6-15
+endword -for 36-124-1346
+endword -f 36-6-124
+begword for- 124-1346-36
+endword -fra 36-124-1235-1
+begword fra- 124-1235-1-36
+endword -g 36-6-1245
+endword -gennem 36-1245-126-1246-134
+begword gennem- 1245-126-1246-134-36
+endword -ham 36-125-1-134
+begword ham- 125-1-134-36
+endword -han 36-125-1-1345
+endword -y 36-6-13456
+begword han- 125-1-1345-36
+endword -har 36-125-1-1235
+endword -h 36-6-125
+begword har- 125-1-1235-36
+endword -hun 36-125-136-1345
+endword -u 36-6-136
+begword hun- 125-136-1345-36
+endword -j 36-6-245
+endword -kan 36-13-1-1345
+endword -k 36-6-13
+begword kan- 13-1-1345-36
+endword -lige 36-123-24-12456
+endword -l 36-6-123
+begword lige- 123-24-12456-36
+endword -med 36-146-145
+endword -m 36-6-134
+begword med- 146-145-36
+endword -men 36-134-126
+begword men- 134-126-36
+ endword -ned 36-1246-145
+begword ned- 1246-145-36
+endword -når 36-1345-16-1235
+endword -n 36-6-1345
+begword når- 1345-16-1235-36
+endword -op 36-135-1234
+endword -o 36-6-135
+begword op- 135-1234-36
+endword -over 36-135-1236-156
+endword -x 36-6-1346
+begword over- 135-1236-156-36
+endword -på 36-1234-16
+endword -p 36-6-1234
+begword på- 1234-16-36
+midword -på- 36-1234-36
+endword -ret 36-1235-346
+begword ret- 1235-346-36
+midword -ret- 36-12356-36
+endword -rigtig 36-1235-35-2345-35
+endword -r 36-6-1235
+begword rigtig- 1235-35-2345-35-36
+midword -rigtig- 36-1235-36
+endword -skal 36-123456-1-123
+begword skal- 123456-1-123-36
+midword -skal- 36-123456-36
+endword -som 36-234-135-134
+endword -s 36-6-234
+begword som- 234-135-134-36
+midword -som- 36-234-36
+endword -så 36-234-16
+endword -å 36-6-16
+begword så- 234-16-36
+endword -til 36-2345-24-123
+endword -t 36-6-2345
+begword til- 2345-24-123-36
+midword -til- 36-2345-36
+endword -under 36-136-1345-23456
+begword under- 136-1345-23456-36
+midword -under- 36-12345-36
+endword -ved 36-1236-15-145
+endword -v 36-6-1236
+begword ved- 1236-15-145-36
+midword -ved- 36-1236-36
+
+
+### Context rules - forward translation
+
+# Exclamation at beginning of string
+noback context `["!"] @6-235
+
+# Ensure two dashes where appropriate.
+noback context $w["-"]$w @36
+noback context $sw["-"]$sw @36-36
+noback context `["-"]$sw @36-36
+noback context $sw["-"]~ @36-36
+noback context !$sw["-"]~ @36
+noback context `["-"]~ @36-36
+
+# Ensure letsign between letter and numsign
+noback context $l[]$D @6
+
+# No "nd", "hv", "or", or "st" after a digit and a letsign
+noback context $dy["hv"] @6-125-1236
+noback context $dy$Spm["hv"] @6-125-1236
+noback context $dy["nd"] @6-1345-145
+noback context $dy$Spm["nd"] @6-1345-145
+noback context $dy["or"] @6-135-1235
+noback context $dy$Spm["or"] @6-135-1235
+noback context $dy["st"] @6-234-2345
+noback context $dy$Spm["st"] @6-234-2345
+noback context $dy["te"] @6-2345-15
+noback context $dy$Spm["te"] @6-2345-15
+
+
+#ensure dot 6 between a digit and a letter
+noback context $dy[]$u @6
+noback context $dy$Spm.[]$u @6
+
+### context - backward translation
+
+# Ensure the correct number of dashes
+nofor context @36[@36-36] "--"
+nofor context [@36-36]@36 "--"
+nofor context $w[@36-36]$w "--"
+nofor context $sw[@36-36]$sw "-"
+nofor context `[@36-36]$sw "-"
+nofor context $sw[@36-36]~ "-"
+nofor context `@36-36~ "-"
+
+
+### Pass 2 - forward translation
+
+# Correct chars defined as 8 dots because they include letsign
+noback pass2 @467 @45-6
+noback pass2 @4568 @45-456
+noback pass2 @123457 @6-12345
+noback pass2 @24567 @6-2456
+noback pass2 @13467 @6-1346
+noback pass2 @13567 @6-1356
+noback pass2 @12567 @6-1256
+
+# Show endcapsword as dot 6 (letsign)
+noback pass2 @68 @6
+
+noback pass2 @6-46-5 @46-5 # no letsign before cap letters with accent
+noback pass2 _$D[@6-46-6] *
+noback pass2 _$D[@6-46] *
+noback pass2 @6-46-6 @46-6 # Ensure correct order and no double letsign
+noback pass2 @6-46 @46-6 # Ensure correct order
+
+ ### Pass 2 - backward
+
+# Insert letsign between number (with extra punctuation) and capsletter sign
+nofor pass2 @3456$l.$Spm$l.@3$l.@3[]@46 @68-6
+nofor pass2 @3456$l.$Spm$l.@3[]@46 @68-6
+nofor pass2 @3456$l.$Spm$Spm[]@46 @68-6
+nofor pass2 @3456$l.$Spm[]@46 @68-6
+
+# Insert letsign between number (with extra punctuation) and capsword sign
+nofor pass2 @3456$l.$Spm$l.@3$l.@3[]@456 @6
+nofor pass2 @3456$l.$Spm$l.@34$l.@34[]@456 @6
+nofor pass2 @3456$l.$Spm$l.@36$l.@36[]@456 @6
+nofor pass2 @3456$l.$Spm$l.@3[]@456 @6
+nofor pass2 @3456$l.$Spm$l.@34[]@456 @6
+nofor pass2 @3456$l.$Spm$l.@36[]@456 @6
+nofor pass2 @3456$l.$Spm$Spm[]@456 @6
+nofor pass2 @3456$l.$Spm[]@456 @6
+nofor pass2 @3456$l.[]@456 @6
+
+# Place endcaps in connection to all the following Braille patterns:
+nofor pass2 $l[@45-3] @45-3-68
+nofor pass2 $l[@468] @468-68
+nofor pass2 $l[@6] @68-6 # Must come before letsign
+nofor pass2 $l[@36] @36-68
+nofor pass2 $l[@34] @34-68
+nofor pass2 $l[@2356] @2356-68
+nofor pass2 $l[@45-36] @45-36-68
+nofor pass2 $l[@4-356] @4-356-68
+nofor pass2 $l[@245-356] @245-356-68
+nofor pass2 $l[@4] @4-68
+nofor pass2 $l[@235] @235-68
+nofor pass2 $l[@45-1] @45-1-68
+nofor pass2 $l[@236] @236-68
+nofor pass2 $l[@356-356] @356-356-68
+nofor pass2 $l[@356] @356-68
+nofor pass2 $l[@3] @3-68
+nofor pass2 $l[@2] @2-68
+nofor pass2 $l[@26] @26-68
+nofor pass2 $l[@25] @25-68
+nofor pass2 $l[@12346] @12346-68
+
+nofor pass2 $l[]@46 @68-6
+#nofor pass2 $a[]@456 @6
+
+### Pass 3 - forward translation
+
+# Ensure there is only one letsign
+ noback pass3 @6-6 @6
+
+
+### Pass 3 - backward translation
+
+# Save letters that have been defined with letsign as part of their definitions
+nofor pass3 @6-12345 @6-123457
+nofor pass3 @6-2456 @6-24567
+nofor pass3 @6-1346 @6-13467
+nofor pass3 @6-1356 @6-13567
+nofor pass3 @6-1256 @6-12567
+
+# save ~ and |  before inserting extra letsigns and endcapsword in pass 2.
+nofor pass3 @45-6 @467 # Create alternative representation of "~"
+nofor pass3 @45-456 @4568
diff --git a/liblouis/tables/da-dk-g28.ctb b/liblouis/tables/da-dk-g28.ctb
new file mode 100644
index 0000000..2a76774
--- /dev/null
+++ b/liblouis/tables/da-dk-g28.ctb
@@ -0,0 +1,1526 @@
+# liblouis: Danish, table for 8 dots grade 2 (forward and backward translation)
+#
+#  Copyright (C) 2014-2017, Bue Vester-Andersen <bue@vester-andersen.dk>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#------------
+#
+# This  is the Danish table for 8 dots grade 2 (stor forkortelse).
+# Use this table for translation and back-translation of Danish 8 dots grade 2.
+#
+# Version: Bue Vester-Andersen, 160713
+
+### Table Metadata
+
+#+locale: da
+#+type: literary
+#+contraction: full
+#+grade: 2
+#+dots: 8
+#+direction: both
+
+# Display upcodes
+include da-dk-octobraille.dis
+
+### Character definitions ###
+
+sign \x0000 8 NULL
+sign \x0001 178 START OF HEADING
+sign \x0002 1278 START OF TEXT
+sign \x0003 1478 END OF TEXT
+sign \x0004 14578 END OF TRANSMISSION
+sign \x0005 24568 ENQUIRY
+sign \x0006 12478 ACKNOWLEDGE
+sign \x0007 124578 BELL
+sign \x0008 12578 BACKSPACE
+space \t 2478 CHARACTER TABULATION
+space \n 678 LINE FEED (LF)
+space \v 1368 LINE TABULATION
+space \f 12378 FORM FEED (FF)
+space \r 257 CARRIAGE RETURN (CR)
+sign \x000e 134578 SHIFT OUT
+sign \x000f 12358 SHIFT IN
+sign \x0010 123478 DATA LINK ESCAPE
+sign \x0011 1234578 DEVICE CONTROL ONE
+sign \x0012 13568 DEVICE CONTROL TWO
+sign \x0013 4578 DEVICE CONTROL THREE
+sign \x0014 268 DEVICE CONTROL FOUR
+sign \x0015 13678 NEGATIVE ACKNOWLEDGE
+sign \x0016 278 SYNCHRONOUS IDLE
+sign \x0017 3578 END OF TRANSMISSION BLOCK
+sign \x0018 78 CANCEL
+sign \x0019 68 END OF MEDIUM
+sign \x001a 135678 SUBSTITUTE
+sign \x001b 2678 ESCAPE
+sign \x001c 45678 INFORMATION SEPARATOR FOUR
+sign \x001d 12368 INFORMATION SEPARATOR THREE
+sign \x001e 1234678 INFORMATION SEPARATOR TWO
+sign \x001f 235678 INFORMATION SEPARATOR ONE
+space \s 0 SPACE
+punctuation ! 235 EXCLAMATION MARK
+punctuation " 2356 QUOTATION MARK
+punctuation # 34568 NUMBER SIGN
+sign $ 25678 DOLLAR SIGN
+math % 24578 PERCENT SIGN
+sign & 123468 AMPERSAND
+punctuation ' 4 APOSTROPHE
+punctuation ( 2368 LEFT PARENTHESIS
+punctuation ) 3568 RIGHT PARENTHESIS
+math + 2358 PLUS SIGN
+punctuation , 2 COMMA
+punctuation - 368 HYPHEN-MINUS
+punctuation . 3 FULL STOP
+punctuation / 348 SLASH
+include digits8Dots.uti
+punctuation : 25 COLON
+punctuation ; 23 SEMICOLON
+math < 358 LESS-THAN SIGN
+math = 23568 EQUALS SIGN
+math > 267 GREATER-THAN SIGN
+punctuation ? 26 QUESTION MARK
+sign @ 478 COMMERCIAL AT
+uplow Aa 17,1 LATIN LETTER A
+uplow Bb 127,12 LATIN LETTER B
+uplow Cc 147,14 LATIN LETTER C
+uplow Dd 1457,145 LATIN LETTER D
+uplow Ee 157,15 LATIN LETTER E
+uplow Ff 1247,124 LATIN LETTER F
+uplow Gg 12457,1245 LATIN LETTER G
+uplow Hh 1257,125 LATIN LETTER H
+uplow Ii 247,24 LATIN LETTER I
+uplow Jj 2457,245 LATIN LETTER J
+uplow Kk 137,13 LATIN LETTER K
+uplow Ll 1237,123 LATIN LETTER L
+uplow Mm 1347,134 LATIN LETTER M
+uplow Nn 13457,1345 LATIN LETTER N
+uplow Oo 1357,135 LATIN LETTER O
+uplow Pp 12347,1234 LATIN CAPITAL LETTER P
+uplow Rr 12357,1235 LATIN LETTER R
+uplow Ss 2347,234 LATIN LETTER S
+uplow Tt 23457,2345 LATIN LETTER T
+uplow Uu 1367,136 LATIN LETTER U
+uplow Vv 12367,1236 LATIN LETTER V
+uplow Yy 134567,13456 LATIN LETTER Y
+punctuation [ 23678 LEFT SQUARE BRACKET
+punctuation ] 35678 RIGHT SQUARE BRACKET
+punctuation ^ 12348 CIRCUMFLEX ACCENT
+punctuation _ 3678 LOW LINE
+punctuation ` 5 GRAVE ACCENT
+punctuation { 123678 LEFT CURLY BRACKET
+punctuation | 4568 VERTICAL LINE
+punctuation } 345678 RIGHT CURLY BRACKET
+punctuation ~ 467 TILDE
+sign \x007f 7 DELETE
+sign \x20AC 1578 #EURO SIGN (0x80)
+noback sign \x0080 1578 #EURO SIGN (0x80)
+sign \x0081 45 <control-0081>
+punctuation \x201A 457 #Low single quote (0x82)
+noback punctuation \x0082 457 #Low single quote (0x82)
+sign \x0192 58 #Flurihn (0x83)
+noback sign \x0083 58 #Flurihn (0x83)
+punctuation \x201E 2378 #Low quote (0x84)
+noback punctuation \x0084 2378 #Low quote (0x84)
+letter \x2020 2357 #Dagger (0x86
+noback letter \x0086 2357 #Dagger (0x86
+letter \x2021 23578 #Double dagger (0x87
+noback letter \x0087 23578 #Double dagger (0x87
+letter \x02c6 5678 #Modifier letter circumflex (0x88)
+noback letter \x0088 5678 #Modifier letter circumflex (0x88)
+math \x2030 245678 #permille sign (0x89)
+noback math \x0089 245678 #permille sign (0x89)
+uplow \x0160\x0161 23478,2348 #LATIN CAPITAL LETTER S WITH CARON (0x8a)
+noback uplow \x008a\x009a 23478,2348 #LATIN LETTER S WITH CARON (0x8a)
+punctuation \x2039 456 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK (0x8b)
+noback punctuation \x008b 456 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK (0x8b)
+uplow \x0152\x0153 13578,1358 #LATIN CAPITAL LIGATURE OE (0x8c)
+noback uplow \x008c\x009c 13578,1358 #LATIN LIGATURE OE (0x8c)
+sign \x008d 3567 REVERSE LINE FEED (not defined in cp1252)
+letter \x008f 27 SINGLE SHIFT THREE (not defined in cp1252)
+letter \x0090 357 DEVICE CONTROL STRING (not defined in cp1252)
+punctuation \x2018 47 #LEFT SINGLE QUOTATION MARK (0x91)
+noback punctuation \x0091 47 #LEFT SINGLE QUOTATION MARK (0x91)
+punctuation \x2019 48 #RIGHT SINGLE QUOTATION MARK (0x92)
+noback punctuation \x0092 48 #RIGHT SINGLE QUOTATION MARK (0x92)
+punctuation \x201c 237 #LEFT DOUBLE QUOTATION MARK (0x93)
+noback punctuation \x0093 237 #LEFT DOUBLE QUOTATION MARK (0x93)
+punctuation \x201d 568 #RIGHT DOUBLE QUOTATION MARK (0x94)
+noback punctuation \x0094 568 #RIGHT DOUBLE QUOTATION MARK (0x94)
+sign \x2022 37 #Bullit (0x95)
+noback sign \x0095 37 #Bullit (0x95)
+sign \x02DC 46 #SMALL TILDE (0x98)
+noback sign \x0098 46 #SMALL TILDE (0x98)
+sign \x2122 234578 #TRADE MARK SIGN (0x99)
+noback sign \x0099 234578 #TRADE MARK SIGN (0x99)
+punctuation \x203A 4567 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (0x9b)
+noback punctuation \x009b 4567 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (0x9b)
+letter \x009d 2567 OPERATING SYSTEM COMMAND
+uplow \x0178\x00ff 2345678,234568 #LATIN LETTER Y WITH DIAERESIS (0x9f)
+noback uppercase \x009f 2345678 #LATIN LETTER Y WITH DIAERESIS (0x9f)
+punctuation \x00a0 23458 NO-BREAK SPACE (0xa0)
+punctuation \x00a1 256 INVERTED EXCLAMATION MARK )0xa1)
+punctuation \x00a2 2578 CENT SIGN (0xa2)
+punctuation \x00a3 1238 POUND SIGN (0xa3)
+punctuation \x00a5 67 YEN SIGN (0xa5)
+punctuation \x00a6 3478 BROKEN BAR (0xa6)
+punctuation \x00a7 578 SECTION SIGN (0xa7)
+punctuation \x00a9 134678 COPYRIGHT SIGN (0xa9)
+letter \x00aa 234678 FEMININE ORDINAL INDICATOR (0xaa)
+punctuation \x00ab 57 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (0xab)
+letter \x00ad 378 SOFT HYPHEN (0xad)
+punctuation \x00ae 123578 REGISTERED SIGN (0xae)
+punctuation \x00af 23567 MACRON (0xaf)
+math \x00b1 123458 PLUS-MINUS SIGN
+punctuation \x00b2 238 SUPERSCRIPT TWO
+punctuation \x00b3 258 SUPERSCRIPT THREE
+punctuation \x00b4 468 ACUTE ACCENT
+punctuation \x00b6 1234568 PILCROW SIGN
+punctuation \x00b7 38 MIDDLE DOT
+punctuation \x00b8 4678 CEDILLA
+punctuation \x00b9 28 SUPERSCRIPT ONE
+letter \x00ba 12345678 MASCULINE ORDINAL INDICATOR
+punctuation \x00bb 567 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+punctuation \x00bc 13458 VULGAR FRACTION ONE QUARTER
+punctuation \x00bd 458 VULGAR FRACTION ONE HALF
+uplow \x00c1\x00e1 1235678,123568 LATIN  LETTER A WITH ACUTE
+uplow \x00c2\x00e2 1678,168 LATIN  LETTER A WITH CIRCUMFLEX
+uplow \x00c3\x00e3 14678,1468 LATIN  LETTER A WITH TILDE
+uplow \x00c4\x00e4 34578,3458 LATIN  LETTER A WITH DIAERESIS
+uplow \x00c5\x00e5 167,16 LATIN LETTER A WITH RING ABOVE
+uplow \x00c6\x00e6 3457,345 LATIN LETTER AE
+uplow \x00cc\x00ec 15678,1568 LATIN  LETTER I WITH GRAVE
+uplow \x00cd\x00ed 12678,1268 LATIN  LETTER I WITH ACUTE
+uplow \x00d0\x00f0 1345678,134568 LATIN  LETTER ETH
+uplow \x00d1\x00f1 1245678,124568 LATIN  LETTER N WITH TILDE
+uplow \x00d2\x00f2 124678,12468 LATIN  LETTER O WITH GRAVE
+uplow \x00d3\x00f3 34678,3468 LATIN  LETTER O WITH ACUTE
+uplow \x00d5\x00f5 145678,14568 LATIN  LETTER O WITH TILDE
+uplow \x00d6\x00f6 24678,2468 LATIN  LETTER O WITH DIAERESIS
+math \x00d7 13468 MULTIPLICATION SIGN
+uplow \x00d8\x00f8 2467,246 LATIN LETTER O WITH STROKE
+uplow \x00da\x00fa 125678,12568 LATIN  LETTER U WITH ACUTE
+uplow \x00dd\x00fd 13478,1348 LATIN  LETTER Y WITH ACUTE (infinite?)
+uplow \x00de\x00fe 1378,138 LATIN  LETTER THORN
+lowercase \x00df 23468 LATIN SMALL LETTER SHARP S
+math \x00f7 2568 DIVISION SIGN
+
+# Character used for capslettersign
+# Resides in the "private use area", and shouldn't conflict with anything.
+sign \xf8ff f
+
+# Used as dash where dash should act as space.
+space \xf8fe ef
+
+#Unicode Braille patterns
+include braille-patterns.cti
+
+# characters that have letsign as part of their definition
+# (to be removed when the alwaysletsign opcode has been implemented).
+punctuation * 6-35 ASTERISK
+uplow Qq 6-123457,6-12345 LATIN LETTER Q
+uplow Ww 6-24567,6-2456 LATIN LETTER W
+uplow Xx 6-13467,6-1346 LATIN LETTER X
+uplow Zz 6-13567,6-1356 LATIN LETTER Z
+punctuation \\ 6-347 REVERSE SLASH
+punctuation \x2026 6-3-3-3 #Elipsis (0x85)
+noback punctuation \x0085 6-3-3-3 #Elipsis (0x85)
+uplow \x017d\x017e 6-3467,6-346 #LATIN  LETTER Z WITH CARON (0x8e)
+noback uplow \x008e\x009e 6-3467,6-346 #LATIN  LETTER Z WITH CARON (0x8e)
+letter \x2013 6-36 #EN DASH (0x96)
+noback sign \x0096 6-36 #EN DASH (0x96)
+letter \x2014 6-367 #Em DASH (0x97)
+noback sign \x0097 6-367 #Em DASH (0x97)
+punctuation \x00a4 6-2367 CURRENCY SIGN (0xa4)
+punctuation \x00a8 6-56 DIAERESIS (0xa8)
+punctuation \x00ac 6-34567 NOT SIGN (0xac)
+sign \x00b0 4-356 DEGREE SIGN (0xb0)
+sign \x00b5 6-236 MICRO SIGN
+punctuation \x00be 6-3456 VULGAR FRACTION THREE QUARTERS
+punctuation \x00bf 6-34 INVERTED QUESTION MARK
+uplow \x00c0\x00e0 6-123567,6-12356 LATIN  LETTER A WITH GRAVE
+uplow \x00c7\x00e7 6-123467,6-12346 LATIN  LETTER C WITH CEDILLA
+uplow \x00c8\x00e8 6-23467,6-2346 LATIN  LETTER E WITH GRAVE
+uplow \x00c9\x00e9 6-1234567,6-123456 LATIN  LETTER E WITH ACUTE
+uplow \x00ca\x00ea 6-1267,6-126 LATIN  LETTER E WITH CIRCUMFLEX
+uplow \x00cb\x00eb 6-12467,6-1246 LATIN  LETTER E WITH DIAERESIS
+uplow \x00ce\x00ee 6-1467,6-146 LATIN  LETTER I WITH CIRCUMFLEX
+uplow \x00cf\x00ef 6-124567,6-12456 LATIN  LETTER I WITH DIAERESIS
+uplow \x00d4\x00f4 6-14567,6-1456 LATIN  LETTER O WITH CIRCUMFLEX
+uplow \x00d9\x00f9 6-234567,6-23456 LATIN  LETTER U WITH GRAVE
+uplow \x00db\x00fb 6-1567,6-156 LATIN  LETTER U WITH CIRCUMFLEX
+uplow \x00dc\x00fc 6-12567,6-1256 LATIN  LETTER U WITH DIAERESIS
+
+# Misc letters from other character sets prefixed with dot 5
+# to be implemented
+
+### misc opcodes ###
+
+# Emphasis opcodes
+# Emphasis opcodes
+emphclass italic
+emphclass underline
+emphclass bold
+
+begemphphrase italic 56
+endemphphrase italic after 56
+begemphword italic 56
+endemphword italic 56
+
+begemphphrase bold 56
+endemphphrase bold after 56
+begemphword bold 56
+endemphword bold 56
+
+begemphphrase underline 56
+endemphphrase underline after 56
+begemphword underline 56
+endemphword underline 56
+
+# special symbols
+decpoint , 2
+hyphen - 368
+letsign 6
+noletsign IQWXZiqwxz
+noletsignbefore 1234567890
+
+capsletter f
+multind f-6 capsletter letsign
+multind 6-f letsign capsletter
+capsnocont
+
+### Correct - Forward translation
+
+# Ensure that capsnocont does not stretch across dashes
+noback correct $U["-"] "\xf8fe"
+
+# Special characters that always need letsigns because they represent contractions
+always \x00a1 6-256 # inverted exclamationmark
+
+#Special sequences, urls emails and file names.
+nocont $
+nocont \\ # line cannot end with a backslash
+nocont @
+nocont ://
+nocont www
+nocont .com
+nocont .dk
+nocont .eu
+nocont .edu
+nocont .gov
+nocont .mil
+nocont .net
+nocont .org
+nocont .uk
+nocont .doc
+nocont .exe
+nocont .htm
+nocont .tex
+nocont .txt
+nocont .gif
+nocont .jpg
+nocont .png
+nocont .wav
+nocont .tar
+nocont .zip
+
+#Words
+word af 356
+word aldrig 1-35
+word aig =
+word alle 1-15
+begnum ae 6-1-15
+contraction ae
+word allerede 1-123-1235
+begnum alr 6-1-123-1235
+contraction alr
+word alligevel 1-123-1236
+begnum alv 6-1-123-1236
+contraction alv
+word altid 1-2345-145
+begnum atd 6-1-2345-145
+contraction atd
+word altså 1-16
+begnum aå 6-1-16
+contraction aå
+word at 1
+
+word blevet 12-2345
+begnum bt 6-12-2345
+contraction bt
+word blev 12-1236
+begnum bv 6-12-1236
+contraction bv
+word blive 12-3456
+word bve 12-1236-15
+word bliver 12
+
+word derefter 23456-1356
+word derst =
+word deres 256
+word derfor 23456-124
+word derf =
+word derigennem 23456-24-12456
+word derige 1456-1235-24-12456
+word dermed 23456-134
+word derm =
+word derned 23456-1246
+word derne =
+word derop 23456-135
+word dero =
+word derover 23456-1346
+word deror =
+word derpå 23456-1234
+word derp =
+word dersom 23456-234
+word ders =
+word dertil 23456-2345
+word dert =
+word derunder 23456-12345
+word derved 23456-1236
+word din 145-1345
+begnum dn 6-145-1345
+contraction dn
+word disse 145-234
+begnum ds 6-145-234
+contraction ds
+word dit 145-2345
+begnum dt 6-145-2345
+contraction dt
+word du 145
+
+word efter 1356
+word eller 15
+word endnu 15-136
+begnum eu 6-15-136
+contraction eu
+
+word fik 124-13
+begnum fk 6-124-13
+contraction fk
+word fordi 124-145
+begnum fd 6-124-145
+contraction fd
+word forskellige 124-123456-15
+word fske =
+word forskelligt 124-123456-2345
+word fskt =
+word forskellig 124-123456
+word fsk =
+word for 124
+word fra 235
+word første 124-1356-15
+word først 124-1356
+word før 246
+
+word ganske 1245-123456
+word gennem 12456
+word ge =
+word gik 1245-13
+begnum gk 6-1245-13
+contraction gk
+word gør 1245
+
+word ham 236
+word hans 13456-234
+begnum ys 6-13456-234
+contraction ys
+word han 13456
+word har 125
+word havde 125-1456
+word hde =
+word have 125-3456
+word hve =
+word helt 125-2345
+begnum ht 6-125-2345
+contraction ht
+word hendes 125-234
+begnum hs 6-125-234
+contraction hs
+word hende 125-145
+begnum hd 6-125-145
+contraction hd
+word hun 136
+word hvad 2456
+word hv =
+word hvis 2456-234
+word hvs =
+word hvordan 34-1
+word hvora 34-6-1
+word hvorefter 34-1356
+word hvorst 34-234-2345
+word hvorfor 34-124
+word hvorf 34-6-124
+word hvorigennem 34-24-12456
+word hvorledes 34-15
+word hvore 34-6-15
+word hvormed 34-134
+word hvorm 34-6-134
+word hvornår 34-1345
+word hvorn 34-6-1345
+word hvorover 34-1346
+word hvoror 34-135-1235
+word hvorpå 34-1234
+word hvorp 34-6-1234
+word hvortil 34-2345
+word hvort 34-6-2345
+word hvorunder 34-12345
+word hvornd 34-1345-145
+word hvorved 34-1236
+word hvorv 34-6-1236
+word hvor 34
+
+word igennem 24-12456
+word ige =
+word igen 35
+word ig =
+word ikke 24-13
+begnum ik 6-24-13
+contraction ik
+word imidlertid 24-24
+begnum ii 6-24-24
+contraction ii
+
+word jeg 245
+
+word kan 13
+word kommer 13-156
+word ker =
+word kommet 13-346
+word ket =
+word komme 13-146
+word kme =
+word kom 13-134
+begnum km 6-13-134
+contraction km
+word kunne 13-1246
+word kne =
+
+word ligesom 123-234
+begnum ls 6-123-234
+contraction ls
+word lige 123
+word lille 123-123
+begnum ll 6-123-123
+contraction ll
+
+word mange 134-12456
+word mge =
+word med 134
+word megen 146-126
+word meen =
+word meget 146-346
+word meet =
+word mellem 146-134
+word mem =
+word men 146
+word me =
+word min 134-1345
+begnum mn 6-134-1345
+contraction mn
+word mit 134-2345
+begnum mt 6-145-2345
+contraction mt
+word måske 134-123456
+word msk =
+word måtte 134-1256
+word mte =
+
+word naturligvis 1345-2345-1236
+begnum ntv 6-1345-2345-1236
+contraction ntv
+word nd =
+word ned 1246
+word ne =
+word nogen 1345-1345
+begnum nn 6-1345-1345
+contraction nn
+word noget 1345-2345
+begnum nt 6-1345-2345
+contraction nt
+word nogle 1345-123-15
+begnum nle 6-1345-123-15
+contraction nle
+word når 1345
+
+word også 14-16
+begnum cå 6-14-16
+contraction cå
+word og 14
+word omkring 135-134-13
+begnum omk 6-135-134-13
+contraction omk
+word op 135
+word or =
+word over 1346
+
+word på 1234
+
+word ret 12356
+word re 1235-15
+word rigtige 1235-12456
+word rge =
+word rigtigt 1235-2345
+begnum rt 6-1235-2345
+contraction rt
+word rigtig 1235
+
+word sagde 234-1456
+word sammen 234-134
+begnum sm 6-234-134
+contraction sm
+word samme 234-146
+word sme =
+word selvfølgelig 234-1236-124
+begnum svf 6-234-1236-124
+contraction svf
+word selv 234-1236
+begnum sv 6-234-1236
+contraction sv
+word sidste 234-1356-15
+word sste =
+word sidst 234-1356
+word sst =
+word sin 234-1345
+begnum sn 6-234-1345
+contraction sn
+word sit 234-2345
+begnum st 6-234-2345
+contraction st
+word skal 123456
+word sk =
+word skulle 123456-123-15
+word skle =
+word snart 234-1235
+begnum sr 6-234-1235
+contraction sr
+word som 234
+word sådan 16-1
+begnum åa 6-16-1
+contraction åa
+word således 16-15
+begnum åe 6-16-15
+contraction åe
+word så 16
+
+word te 1256
+word tid 2345-145
+begnum td 6-2345-145
+contraction td
+word tilbage 2345-12
+begnum tb 6-2345-12
+contraction tb
+word til 2345
+
+word under 12345
+
+word var- =
+word var. =
+word var 36
+word ve 3456
+word ved 1236
+word ville 1236-123-15
+begnum vle 6-1236-123-15
+contraction vle
+word vil 1236-123
+begnum vl 6-1236-123
+contraction vl
+word været 1236-2345
+begnum vt 6-1236-2345
+contraction vt
+word være 345
+
+#Part words
+nocross den 12346
+nocross der 23456
+nocross det 2346
+nocross de 1456
+nocross en 126
+nocross er 156
+nocross et 346
+nocross ge 12456
+nocross hvor 34
+nocross hv 2456
+nocross ig 35
+nocross me 146
+nocross nd 12345
+nocross ne 1246
+nocross or 1346
+nocross re 12356
+nocross sk 123456
+nocross st 1356
+nocross te 1256
+nocross ve 3456
+
+# combinations to handle Danish regression rules
+nocross dend 1456-12345
+nocross end 15-12345
+nocross gend 12456-12345
+nocross gen 1245-126
+nocross ger 1245-156
+nocross get 1245-346
+nocross hven 2456-126
+nocross hver 2456-156
+nocross hvet 2456-346
+nocross hve 2456-15
+nocross mend 146-12345
+nocross men 134-126
+nocross mer 134-156
+nocross met 134-346
+nocross nden 1345-12346
+nocross nder 1345-23456
+nocross ndet 1345-2346
+nocross nend 1246-12345
+nocross nen 1345-126
+nocross ner 1345-156
+nocross net 1345-346
+nocross rend 12356-12345
+nocross ren 1235-126
+nocross rer 1235-156
+nocross ret 1235-346
+nocross sten 1356-126
+nocross ster 1356-156
+nocross stet 1356-346
+nocross ste 1356-15
+nocross tend 1256-12345
+nocross ten 2345-126
+nocross ter 2345-156
+nocross tet 2345-346
+nocross vend 3456-12345
+nocross ven 1236-126
+nocross ver 1236-156
+nocross vet 1236-346
+
+#special cases with dropped signs
+# which can be both punctuations and contractions.
+
+always fra! 124-1235-1-235
+always !fra 235-124-1235-1
+always !! 235-235
+always !!! 235-235-235
+always "fra" 2356-124-1235-1-2356
+after punctuation always ! 6-235
+always 'af 4-1-124
+
+always \s! 0-6-235
+prepunc ! 6-235
+nofor always ! 6-235
+noback context `["!"] @6-235
+
+
+# Ensure no one-letter word contraction before or after a dash
+
+prfword -af 368-1-124
+sufword af- 1-124-368
+prfword -at 368-1-2345
+sufword at- 1-2345-368
+prfword -deres 368-1456-12356-234
+sufword deres- 1456-12356-234-368
+prfword -du 368-145-136
+sufword du- 145-136-368
+prfword -efter 368-15-124-2345-156
+sufword efter- 15-124-2345-156-368
+prfword -for 368-124-1346
+sufword for- 124-1346-368
+prfword -fra 368-124-1235-1
+sufword fra- 124-1235-1-368
+prfword -gennem 368-1245-126-1246-134
+sufword gennem- 1245-126-1246-134-368
+prfword -ham 368-125-1-134
+sufword ham- 125-1-134-368
+prfword -han 368-125-1-1345
+sufword han- 125-1-1345-368
+prfword -har 368-125-1-1235
+sufword har- 125-1-1235-368
+prfword -hun 368-125-136-1345
+sufword hun- 125-136-1345-368
+prfword -kan 368-13-1-1345
+sufword kan- 13-1-1345-368
+prfword -lige 368-123-24-12456
+sufword lige- 123-24-12456-368
+prfword -med 368-146-145
+sufword med- 146-145-368
+prfword -men 368-134-126
+sufword men- 134-126-368
+prfword -ned 368-1246-145
+sufword ned- 1246-145-368
+prfword -når 368-1345-16-1235
+sufword når- 1345-16-1235-368
+prfword -og 368-135-1245
+sufword og- 135-1245-368
+prfword -op 368-135-1234
+sufword op- 135-1234-368
+prfword -over 368-135-1236-156
+sufword over- 135-1236-156-368
+prfword -på 368-1234-16
+sufword på- 1234-16-368
+prfword -ret 368-1235-346
+sufword ret- 1235-346-368
+prfword -rigtig 368-1235-35-2345-35
+sufword rigtig- 1235-35-2345-35-368
+prfword -skal 368-123456-1-123
+sufword skal- 123456-1-123-368
+prfword -som 368-234-135-134
+sufword som- 234-135-134-368
+prfword -så 368-234-16
+sufword så- 234-16-368
+prfword -til 368-2345-24-123
+sufword til- 2345-24-123-368
+prfword -under 368-136-1345-23456
+sufword under- 136-1345-23456-368
+prfword -ved 368-1236-15-145
+sufword ved- 1236-15-145-368
+prfword -være 368-1236-345-12356
+sufword være- 1236-345-12356-368
+
+# *** patches for various Liblouis bugs
+# this file will be removed when the bugs are fixed
+
+nofor always a 6-1
+nofor always b 6-12
+nofor always c 6-14
+nofor always d 6-145
+nofor always e 6-15
+nofor always f 6-124
+nofor always g 6-1245
+nofor always h 6-125
+nofor always j 6-245
+nofor always k 6-13
+nofor always l 6-123
+nofor always m 6-134
+nofor always n 6-1345
+nofor always o 6-135
+nofor always p 6-1234
+nofor always q 6-12345
+nofor always r 6-1235
+nofor always s 6-234
+nofor always t 6-2345
+nofor always u 6-136
+nofor always v 6-1236
+nofor always w 6-2456
+nofor always x 6-1346
+nofor always y 6-13456
+nofor always z 6-1356
+nofor always æ 6-345
+nofor always ø 6-246
+nofor always å 6-16
+
+nofor always A 6-17
+nofor always B 6-127
+nofor always C 6-147
+nofor always D 6-1457
+nofor always E 6-157
+nofor always F 6-1247
+nofor always G 6-12457
+nofor always H 6-1257
+nofor always J 6-2457
+nofor always K 6-137
+nofor always L 6-1237
+nofor always M 6-1347
+nofor always N 6-13457
+nofor always O 6-1357
+nofor always P 6-12347
+nofor always Q 6-123457
+nofor always R 6-12357
+nofor always S 6-2347
+nofor always T 6-23457
+nofor always U 6-1367
+nofor always V 6-12367
+nofor always W 6-24567
+nofor always X 6-13467
+nofor always Y 6-134567
+nofor always Z 6-13567
+nofor always Æ 6-3457
+nofor always Ø 6-2467
+nofor always Å 6-167
+
+# if a word contraction is followed by a punctuation and another word immediately after,
+# The contracted word before the punctuation will back-translate as its components
+class wordlimit /,!.:’()?"'\x00ab_\x201d\x0094\x2019\x0092\x00bb
+nofor before wordlimit begword af 356
+nofor before wordlimit begword aldrig 1-35
+nofor before wordlimit begword aig =
+nofor before wordlimit begword alle 1-15
+nofor before wordlimit begword allerede 1-123-1235
+nofor before wordlimit begword alligevel 1-123-1236
+nofor before wordlimit begword altid 1-2345-145
+nofor before wordlimit begword altså 1-16
+nofor before wordlimit begword at 1
+
+nofor before wordlimit begword blevet 12-2345
+nofor before wordlimit begword blev 12-1236
+nofor before wordlimit begword blive 12-3456
+nofor before wordlimit begword bve 12-1236-15
+nofor before wordlimit begword bliver 12
+
+nofor before wordlimit begword derefter 23456-1356
+nofor before wordlimit begword derst =
+nofor before wordlimit begword deres 256
+nofor before wordlimit begword derfor 23456-124
+nofor before wordlimit begword derf =
+nofor before wordlimit begword derigennem 23456-24-12456
+nofor before wordlimit begword derige 1456-1235-24-12456
+nofor before wordlimit begword dermed 23456-134
+nofor before wordlimit begword derm =
+nofor before wordlimit begword derned 23456-1246
+nofor before wordlimit begword derne =
+nofor before wordlimit begword derop 23456-135
+nofor before wordlimit begword dero =
+nofor before wordlimit begword derover 23456-1346
+nofor before wordlimit begword deror =
+nofor before wordlimit begword derpå 23456-1234
+nofor before wordlimit begword derp =
+nofor before wordlimit begword dersom 23456-234
+nofor before wordlimit begword ders =
+nofor before wordlimit begword dertil 23456-2345
+nofor before wordlimit begword dert =
+nofor before wordlimit begword derunder 23456-12345
+nofor before wordlimit begword derved 23456-1236
+nofor before wordlimit begword din 145-1345
+nofor before wordlimit begword disse 145-234
+nofor before wordlimit begword dit 145-2345
+nofor before wordlimit begword du 145
+
+nofor before wordlimit begword efter 1356
+nofor before wordlimit begword eller 15
+nofor before wordlimit begword endnu 15-136
+
+nofor before wordlimit begword fik 124-13
+nofor before wordlimit begword fordi 124-145
+nofor before wordlimit begword forskellige 124-123456-15
+nofor before wordlimit begword fske =
+nofor before wordlimit begword forskelligt 124-123456-2345
+nofor before wordlimit begword fskt =
+nofor before wordlimit begword forskellig 124-123456
+nofor before wordlimit begword fsk =
+nofor before wordlimit sufword for 124
+nofor before wordlimit begword fra 235
+nofor before wordlimit begword første 124-1356-15
+nofor before wordlimit begword først 124-1356
+nofor before wordlimit begword før 246
+
+nofor before wordlimit begword ganske 1245-123456
+nofor before wordlimit begword gennem 12456
+nofor before wordlimit begword ge =
+nofor before wordlimit begword gik 1245-13
+nofor before wordlimit begword gør 1245
+
+nofor before wordlimit begword ham 236
+nofor before wordlimit begword hans 13456-234
+nofor before wordlimit begword han 13456
+nofor before wordlimit begword har 125
+nofor before wordlimit begword havde 125-1456
+nofor before wordlimit begword hde =
+nofor before wordlimit begword have 125-3456
+nofor before wordlimit begword hve =
+nofor before wordlimit begword helt 125-2345
+nofor before wordlimit begword hendes 125-234
+nofor before wordlimit begword hende 125-145
+nofor before wordlimit begword hun 136
+nofor before wordlimit begword hvad 2456
+nofor before wordlimit begword hv =
+nofor before wordlimit begword hvis 2456-234
+nofor before wordlimit begword hvs =
+nofor before wordlimit begword hvordan 34-1
+nofor before wordlimit begword hvorefter 34-1356
+nofor before wordlimit begword hvorfor 34-124
+nofor before wordlimit begword hvorigennem 34-24-12456
+nofor before wordlimit begword hvorledes 34-15
+nofor before wordlimit begword hvormed 34-134
+nofor before wordlimit begword hvornår 34-1345
+nofor before wordlimit begword hvorover 34-1346
+nofor before wordlimit begword hvorpå 34-1234
+nofor before wordlimit begword hvortil 34-2345
+nofor before wordlimit begword hvorunder 34-12345
+nofor before wordlimit begword hvorved 34-1236
+nofor before wordlimit begword hvor 34
+
+nofor before wordlimit begword igennem 24-12456
+nofor before wordlimit begword ige =
+nofor before wordlimit begword igen 35
+nofor before wordlimit begword ig =
+nofor before wordlimit begword ikke 24-13
+nofor before wordlimit begword imidlertid 24-24
+
+nofor before wordlimit begword jeg 245
+
+nofor before wordlimit begword kan 13
+nofor before wordlimit begword kommer 13-156
+nofor before wordlimit begword ker =
+nofor before wordlimit begword kommet 13-346
+nofor before wordlimit begword ket =
+nofor before wordlimit begword komme 13-146
+nofor before wordlimit begword kme =
+nofor before wordlimit begword kom 13-134
+nofor before wordlimit begword kunne 13-1246
+nofor before wordlimit begword kne =
+
+nofor before wordlimit begword ligesom 123-234
+nofor before wordlimit begword lige 123
+nofor before wordlimit begword lille 123-123
+
+nofor before wordlimit begword mange 134-12456
+nofor before wordlimit begword mge =
+nofor before wordlimit begword med 134
+nofor before wordlimit begword megen 146-126
+nofor before wordlimit begword meen =
+nofor before wordlimit begword meget 146-346
+nofor before wordlimit begword meet =
+nofor before wordlimit begword mellem 146-134
+nofor before wordlimit begword mem =
+nofor before wordlimit begword men 146
+nofor before wordlimit begword me =
+nofor before wordlimit begword min 134-1345
+nofor before wordlimit begword mit 134-2345
+nofor before wordlimit begword måske 134-123456
+nofor before wordlimit begword msk =
+nofor before wordlimit begword måtte 134-1256
+nofor before wordlimit begword mte =
+
+nofor before wordlimit begword naturligvis 1345-2345-1236
+nofor before wordlimit begword nd =
+nofor before wordlimit begword ned 1246
+nofor before wordlimit begword ne =
+nofor before wordlimit begword nogen 1345-1345
+nofor before wordlimit begword noget 1345-2345
+nofor before wordlimit begword nogle 1345-123-15
+nofor before wordlimit begword når 1345
+
+nofor before wordlimit begword også 14-16
+nofor before wordlimit begword og 14
+nofor before wordlimit begword omkring 135-134-13
+nofor before wordlimit begword op 135
+nofor before wordlimit begword or =
+nofor before wordlimit begword over 1346
+
+nofor before wordlimit begword på 1234
+
+nofor before wordlimit begword ret 12356
+nofor before wordlimit begword re 1235-15
+nofor before wordlimit begword rigtige 1235-12456
+nofor before wordlimit begword rge =
+nofor before wordlimit begword rigtigt 1235-2345
+nofor before wordlimit begword rigtig 1235
+
+nofor before wordlimit begword sagde 234-1456
+nofor before wordlimit begword sammen 234-134
+nofor before wordlimit begword samme 234-146
+nofor before wordlimit begword sme =
+nofor before wordlimit begword selvfølgelig 234-1236-124
+nofor before wordlimit begword selv 234-1236
+nofor before wordlimit begword sidste 234-1356-15
+nofor before wordlimit begword sste =
+nofor before wordlimit begword sidst 234-1356
+nofor before wordlimit begword sst =
+nofor before wordlimit begword sin 234-1345
+nofor before wordlimit begword sit 234-2345
+nofor before wordlimit begword skal 123456
+nofor before wordlimit begword sk =
+nofor before wordlimit begword skulle 123456-123-15
+nofor before wordlimit begword skle =
+nofor before wordlimit begword snart 234-1235
+nofor before wordlimit begword som 234
+nofor before wordlimit begword sådan 16-1
+nofor before wordlimit begword således 16-15
+nofor before wordlimit begword så 16
+
+nofor before wordlimit begword tid 2345-145
+nofor before wordlimit begword tilbage 2345-12
+nofor before wordlimit begword til 2345
+
+nofor before wordlimit begword under 12345
+
+nofor before wordlimit begword var- =
+nofor before wordlimit begword var 36
+nofor before wordlimit begword ved 1236
+nofor before wordlimit begword ville 1236-123-15
+nofor before wordlimit begword vil 1236-123
+nofor before wordlimit begword været 1236-2345
+nofor before wordlimit begword være 345
+
+# Problems solved with pass 2
+
+# The Danish use of letsign differs somewhat from the LibLouis way.
+# In order to be sure that we are getting a letsign when we want one, we are sometimes getting an overlap.
+
+# Ensure that we have letsign between a digit and "st"
+# and nd after a digit is not contracted
+noback context _$d["st"]!$l @6-234-2345
+noback context _$d["nd"]!$l @1345-145
+# The following lines are to ensure that we get a letsign between a digit and a single letter.
+noback context $d[]$l!$l @6
+noback context $d[]$l~ @6
+
+# Convert the fake "space hyphen" back to a normal hyphen.
+noback pass2 @ef @368
+
+### Multi-pass opcodes for converting the virtual capsletter sign @f into dot 7.
+
+# Most of these lines are temporary.
+# They will be written with a few swap sets when the swapdd opcode has been fixed.
+
+
+# Generic forward convert of @f-... to @...7
+noback pass2 @f-235 @2357
+# Conversion with letsign.
+noback pass2 @f-6-235 @6-2357
+# Conversion with dot 5, which is used for accent marker in higher unicode pages.
+noback pass2 @f-5-235 @5-2357
+# Generic backward conversion.
+nofor pass2 @2357 @f-235
+# Conversion with dot 5 (letsign is handled below).
+nofor pass2 @5-2357 @f-5-235
+
+# Same for the following characters.
+
+noback pass2 @f-35 @357
+noback pass2 @f-6-35 @6-357
+noback pass2 @f-5-35 @5-357
+nofor pass2 @357 @f-35
+nofor pass2 @5-357 @f-5-35
+
+noback pass2 @f-1 @17
+noback pass2 @f-6-1 @6-17
+noback pass2 @f-5-1 @5-17
+nofor pass2 @17 @f-1
+nofor pass2 @5-17 @f-5-1
+
+noback pass2 @f-12 @127
+noback pass2 @f-6-12 @6-127
+noback pass2 @f-5-12 @5-127
+nofor pass2 @127 @f-12
+nofor pass2 @5-127 @f-5-12
+
+noback pass2 @f-14 @147
+noback pass2 @f-6-14 @6-147
+noback pass2 @f-5-14 @5-147
+nofor pass2 @147 @f-14
+nofor pass2 @5-147 @f-5-14
+
+noback pass2 @f-145 @1457
+noback pass2 @f-6-145 @6-1457
+noback pass2 @f-5-145 @5-1457
+nofor pass2 @1457 @f-145
+nofor pass2 @5-1457 @f-5-145
+
+noback pass2 @f-15 @157
+noback pass2 @f-6-15 @6-157
+noback pass2 @f-5-15 @5-157
+nofor pass2 @157 @f-15
+nofor pass2 @5-157 @f-5-15
+
+noback pass2 @f-124 @1247
+noback pass2 @f-6-124 @6-1247
+noback pass2 @f-5-124 @5-1247
+nofor pass2 @1247 @f-124
+nofor pass2 @5-1247 @f-5-124
+
+noback pass2 @f-1245 @12457
+noback pass2 @f-6-1245 @6-12457
+noback pass2 @f-5-1245 @5-12457
+nofor pass2 @12457 @f-1245
+nofor pass2 @5-12457 @f-5-1245
+
+noback pass2 @f-125 @1257
+noback pass2 @f-6-125 @6-1257
+noback pass2 @f-5-125 @5-1257
+nofor pass2 @1257 @f-125
+nofor pass2 @5-1257 @f-5-125
+
+noback pass2 @f-24 @247
+noback pass2 @f-6-24 @6-247
+noback pass2 @f-5-24 @5-247
+nofor pass2 @247 @f-24
+nofor pass2 @5-247 @f-5-24
+
+noback pass2 @f-245 @2457
+noback pass2 @f-6-245 @6-2457
+noback pass2 @f-5-245 @5-2457
+nofor pass2 @2457 @f-245
+nofor pass2 @5-2457 @f-5-245
+
+noback pass2 @f-13 @137
+noback pass2 @f-6-13 @6-137
+noback pass2 @f-5-13 @5-137
+nofor pass2 @137 @f-13
+nofor pass2 @5-137 @f-5-13
+
+noback pass2 @f-123 @1237
+noback pass2 @f-6-123 @6-1237
+noback pass2 @f-5-123 @5-1237
+nofor pass2 @1237 @f-123
+nofor pass2 @5-1237 @f-5-123
+
+noback pass2 @f-134 @1347
+noback pass2 @f-6-134 @6-1347
+noback pass2 @f-5-134 @5-1347
+nofor pass2 @1347 @f-134
+nofor pass2 @5-1347 @f-5-134
+
+noback pass2 @f-1345 @13457
+noback pass2 @f-6-1345 @6-13457
+noback pass2 @f-5-1345 @5-13457
+nofor pass2 @13457 @f-1345
+nofor pass2 @5-13457 @f-5-1345
+
+noback pass2 @f-135 @1357
+noback pass2 @f-6-135 @6-1357
+noback pass2 @f-5-135 @5-1357
+nofor pass2 @1357 @f-135
+nofor pass2 @5-1357 @f-5-135
+
+noback pass2 @f-1234 @12347
+noback pass2 @f-6-1234 @6-12347
+noback pass2 @f-5-1234 @5-12347
+nofor pass2 @12347 @f-1234
+nofor pass2 @5-12347 @f-5-1234
+
+noback pass2 @f-12345 @123457
+noback pass2 @f-6-12345 @6-123457
+noback pass2 @f-5-12345 @5-123457
+nofor pass2 @123457 @f-12345
+nofor pass2 @5-123457 @f-5-12345
+
+noback pass2 @f-1235 @12357
+noback pass2 @f-6-1235 @6-12357
+noback pass2 @f-5-1235 @5-12357
+nofor pass2 @12357 @f-1235
+nofor pass2 @5-12357 @f-5-1235
+
+noback pass2 @f-234 @2347
+noback pass2 @f-6-234 @6-2347
+noback pass2 @f-5-234 @5-2347
+nofor pass2 @2347 @f-234
+nofor pass2 @5-2347 @f-5-234
+
+noback pass2 @f-2345 @23457
+noback pass2 @f-6-2345 @6-23457
+noback pass2 @f-5-2345 @5-23457
+nofor pass2 @23457 @f-2345
+nofor pass2 @5-23457 @f-5-2345
+
+noback pass2 @f-136 @1367
+noback pass2 @f-6-136 @6-1367
+noback pass2 @f-5-136 @5-1367
+nofor pass2 @1367 @f-136
+nofor pass2 @5-1367 @f-5-136
+
+noback pass2 @f-1236 @12367
+noback pass2 @f-6-1236 @6-12367
+noback pass2 @f-5-1236 @5-12367
+nofor pass2 @12367 @f-1236
+nofor pass2 @5-12367 @f-5-1236
+
+noback pass2 @f-2456 @24567
+noback pass2 @f-6-2456 @6-24567
+noback pass2 @f-5-2456 @5-24567
+nofor pass2 @24567 @f-2456
+nofor pass2 @5-24567 @f-5-2456
+
+noback pass2 @f-1346 @13467
+noback pass2 @f-6-1346 @6-13467
+noback pass2 @f-5-1346 @5-13467
+nofor pass2 @13467 @f-1346
+nofor pass2 @5-13467 @f-5-1346
+
+noback pass2 @f-13456 @134567
+noback pass2 @f-6-13456 @6-134567
+noback pass2 @f-5-13456 @5-134567
+nofor pass2 @134567 @f-13456
+nofor pass2 @5-134567 @f-5-13456
+
+noback pass2 @f-1356 @13567
+noback pass2 @f-6-1356 @6-13567
+noback pass2 @f-5-1356 @5-13567
+nofor pass2 @13567 @f-1356
+nofor pass2 @5-13567 @f-5-1356
+
+noback pass2 @f-34 @347
+noback pass2 @f-6-34 @6-347
+noback pass2 @f-5-34 @5-347
+nofor pass2 @347 @f-34
+nofor pass2 @5-347 @f-5-34
+
+noback pass2 @f-346 @3467
+noback pass2 @f-6-346 @6-3467
+noback pass2 @f-5-346 @5-3467
+nofor pass2 @3467 @f-346
+nofor pass2 @5-3467 @f-5-346
+
+noback pass2 @f-2348 @23478
+noback pass2 @f-6-2348 @6-23478
+noback pass2 @f-5-2348 @5-23478
+nofor pass2 @23478 @f-2348
+nofor pass2 @5-23478 @f-5-2348
+
+noback pass2 @f-1358 @13578
+noback pass2 @f-6-1358 @6-13578
+noback pass2 @f-5-1358 @5-13578
+nofor pass2 @13578 @f-1358
+nofor pass2 @5-13578 @f-5-1358
+
+noback pass2 @f-234568 @2345678
+noback pass2 @f-6-234568 @6-2345678
+noback pass2 @f-5-234568 @5-2345678
+nofor pass2 @2345678 @f-234568
+nofor pass2 @5-2345678 @f-5-234568
+
+noback pass2 @f-236 @2367
+noback pass2 @f-6-236 @6-2367
+noback pass2 @f-5-236 @5-2367
+nofor pass2 @2367 @f-236
+nofor pass2 @5-2367 @f-5-236
+
+noback pass2 @f-256 @2567
+noback pass2 @f-6-256 @6-2567
+noback pass2 @f-5-256 @5-2567
+nofor pass2 @2567 @f-256
+nofor pass2 @5-2567 @f-5-256
+
+noback pass2 @f-356 @3567
+noback pass2 @f-6-356 @6-3567
+noback pass2 @f-5-356 @5-3567
+nofor pass2 @3567 @f-356
+nofor pass2 @5-3567 @f-5-356
+
+noback pass2 @f-3456 @34567
+noback pass2 @f-6-3456 @6-34567
+noback pass2 @f-5-3456 @5-34567
+nofor pass2 @34567 @f-3456
+nofor pass2 @5-34567 @f-5-3456
+
+noback pass2 @f-12356 @123567
+noback pass2 @f-6-12356 @6-123567
+noback pass2 @f-5-12356 @5-123567
+nofor pass2 @123567 @f-12356
+nofor pass2 @5-123567 @f-5-12356
+
+noback pass2 @f-123568 @1235678
+noback pass2 @f-6-123568 @6-1235678
+noback pass2 @f-5-123568 @5-1235678
+nofor pass2 @1235678 @f-123568
+nofor pass2 @5-1235678 @f-5-123568
+
+noback pass2 @f-168 @1678
+noback pass2 @f-6-168 @6-1678
+noback pass2 @f-5-168 @5-1678
+nofor pass2 @1678 @f-168
+nofor pass2 @5-1678 @f-5-168
+
+noback pass2 @f-1468 @14678
+noback pass2 @f-6-1468 @6-14678
+noback pass2 @f-5-1468 @5-14678
+nofor pass2 @14678 @f-1468
+nofor pass2 @5-14678 @f-5-1468
+
+noback pass2 @f-3458 @34578
+noback pass2 @f-6-3458 @6-34578
+noback pass2 @f-5-3458 @5-34578
+nofor pass2 @34578 @f-3458
+nofor pass2 @5-34578 @f-5-3458
+
+noback pass2 @f-16 @167
+noback pass2 @f-6-16 @6-167
+noback pass2 @f-5-16 @5-167
+nofor pass2 @167 @f-16
+nofor pass2 @5-167 @f-5-16
+
+noback pass2 @f-345 @3457
+noback pass2 @f-6-345 @6-3457
+noback pass2 @f-5-345 @5-3457
+nofor pass2 @3457 @f-345
+nofor pass2 @5-3457 @f-5-345
+
+noback pass2 @f-12346 @123467
+noback pass2 @f-6-12346 @6-123467
+noback pass2 @f-5-12346 @5-123467
+nofor pass2 @123467 @f-12346
+nofor pass2 @5-123467 @f-5-12346
+
+noback pass2 @f-2346 @23467
+noback pass2 @f-6-2346 @6-23467
+noback pass2 @f-5-2346 @5-23467
+nofor pass2 @23467 @f-2346
+nofor pass2 @5-23467 @f-5-2346
+
+noback pass2 @f-123456 @1234567
+noback pass2 @f-6-123456 @6-1234567
+noback pass2 @f-5-123456 @5-1234567
+nofor pass2 @1234567 @f-123456
+nofor pass2 @5-1234567 @f-5-123456
+
+noback pass2 @f-126 @1267
+noback pass2 @f-6-126 @6-1267
+noback pass2 @f-5-126 @5-1267
+nofor pass2 @1267 @f-126
+nofor pass2 @5-1267 @f-5-126
+
+noback pass2 @f-1246 @12467
+noback pass2 @f-6-1246 @6-12467
+noback pass2 @f-5-1246 @5-12467
+nofor pass2 @12467 @f-1246
+nofor pass2 @5-12467 @f-5-1246
+
+noback pass2 @f-1568 @15678
+noback pass2 @f-6-1568 @6-15678
+noback pass2 @f-5-1568 @5-15678
+nofor pass2 @15678 @f-1568
+nofor pass2 @5-15678 @f-5-1568
+
+noback pass2 @f-1268 @12678
+noback pass2 @f-6-1268 @6-12678
+noback pass2 @f-5-1268 @5-12678
+nofor pass2 @12678 @f-1268
+nofor pass2 @5-12678 @f-5-1268
+
+noback pass2 @f-146 @1467
+noback pass2 @f-6-146 @6-1467
+noback pass2 @f-5-146 @5-1467
+nofor pass2 @1467 @f-146
+nofor pass2 @5-1467 @f-5-146
+
+noback pass2 @f-12456 @124567
+noback pass2 @f-6-12456 @6-124567
+noback pass2 @f-5-12456 @5-124567
+nofor pass2 @124567 @f-12456
+nofor pass2 @5-124567 @f-5-12456
+
+noback pass2 @f-134568 @1345678
+noback pass2 @f-6-134568 @6-1345678
+noback pass2 @f-5-134568 @5-1345678
+nofor pass2 @1345678 @f-134568
+nofor pass2 @5-1345678 @f-5-134568
+
+noback pass2 @f-124568 @1245678
+noback pass2 @f-6-124568 @6-1245678
+noback pass2 @f-5-124568 @5-1245678
+nofor pass2 @1245678 @f-124568
+nofor pass2 @5-1245678 @f-5-124568
+
+noback pass2 @f-12468 @124678
+noback pass2 @f-6-12468 @6-124678
+noback pass2 @f-5-12468 @5-124678
+nofor pass2 @124678 @f-12468
+nofor pass2 @5-124678 @f-5-12468
+
+noback pass2 @f-3468 @34678
+noback pass2 @f-6-3468 @6-34678
+noback pass2 @f-5-3468 @5-34678
+nofor pass2 @34678 @f-3468
+nofor pass2 @5-34678 @f-5-3468
+
+noback pass2 @f-1456 @14567
+noback pass2 @f-6-1456 @6-14567
+noback pass2 @f-5-1456 @5-14567
+nofor pass2 @14567 @f-1456
+nofor pass2 @5-14567 @f-5-1456
+
+noback pass2 @f-14568 @145678
+noback pass2 @f-6-14568 @6-145678
+noback pass2 @f-5-14568 @5-145678
+nofor pass2 @145678 @f-14568
+nofor pass2 @5-145678 @f-5-14568
+
+noback pass2 @f-2468 @24678
+noback pass2 @f-6-2468 @6-24678
+noback pass2 @f-5-2468 @5-24678
+nofor pass2 @24678 @f-2468
+nofor pass2 @5-24678 @f-5-2468
+
+noback pass2 @f-246 @2467
+noback pass2 @f-6-246 @6-2467
+noback pass2 @f-5-246 @5-2467
+nofor pass2 @2467 @f-246
+nofor pass2 @5-2467 @f-5-246
+
+noback pass2 @f-23456 @234567
+noback pass2 @f-6-23456 @6-234567
+noback pass2 @f-5-23456 @5-234567
+nofor pass2 @234567 @f-23456
+nofor pass2 @5-234567 @f-5-23456
+
+noback pass2 @f-12568 @125678
+noback pass2 @f-6-12568 @6-125678
+noback pass2 @f-5-12568 @5-125678
+nofor pass2 @125678 @f-12568
+nofor pass2 @5-125678 @f-5-12568
+
+noback pass2 @f-156 @1567
+noback pass2 @f-6-156 @6-1567
+noback pass2 @f-5-156 @5-1567
+nofor pass2 @1567 @f-156
+nofor pass2 @5-1567 @f-5-156
+
+noback pass2 @f-1256 @12567
+noback pass2 @f-6-1256 @6-12567
+noback pass2 @f-5-1256 @5-12567
+nofor pass2 @12567 @f-1256
+nofor pass2 @5-12567 @f-5-1256
+
+noback pass2 @f-1348 @13478
+noback pass2 @f-6-1348 @6-13478
+noback pass2 @f-5-1348 @5-13478
+nofor pass2 @13478 @f-1348
+nofor pass2 @5-13478 @f-5-1348
+
+noback pass2 @f-138 @1378
+noback pass2 @f-6-138 @6-1378
+noback pass2 @f-5-138 @5-1378
+nofor pass2 @1378 @f-138
+nofor pass2 @5-1378 @f-5-138
+
+noback pass2 @f-234568 @2345678
+noback pass2 @f-6-234568 @6-2345678
+noback pass2 @f-5-234568 @5-2345678
+nofor pass2 @2345678 @f-234568
+nofor pass2 @5-2345678 @f-5-234568
+
+# Tweak to keep letsign for letters that should always have letsign.
+# Letsign will be removed by the multind opcode. So we insert an extra one.
+nofor pass2 @6-123457 @f-6-6-12345
+nofor pass2 @6-24567 @f-6-6-2456
+nofor pass2 @6-13467 @f-6-6-1346
+nofor pass2 @6-134567 @f-6-6-13456
+nofor pass2 @6-13567 @f-6-6-1356
+nofor pass2 @6-123567 @f-6-6-12356
+nofor pass2 @6-123467 @f-6-6-12346
+nofor pass2 @6-23467 @f-6-6-2346
+nofor pass2 @6-1234567 @f-6-6-123456
+nofor pass2 @6-1267 @f-6-6-126
+nofor pass2 @6-12467 @f-6-6-1246
+nofor pass2 @6-1467 @f-6-6-146
+nofor pass2 @6-124567 @f-6-6-12456
+nofor pass2 @6-14567 @f-6-6-1456
+nofor pass2 @6-234567 @f-6-6-23456
+nofor pass2 @6-1567 @f-6-6-156
+nofor pass2 @6-12567 @f-6-6-1256
+
+# Ensure that punctuation signs etc. are not "tolowered" when they have a letsign, but only when they act as a partword contraction.
+nofor pass2 @6-347 *
+nofor pass2 @6-2357 *
+nofor pass2 @6-3467 *
+nofor pass2 @6-2567 *
+nofor pass2 @6-2367 *
+nofor pass2 @6-34567 *
+
+# remove any superfluous capsletter marks.
+noback pass2 @f ?
+
+# Remove any superfluous letsigns and only keep one.
+noback pass3 @6-6 @6
+
+# Include hyphenation file as the last thing
+include hyph_brl_da_dk.dic
diff --git a/liblouis/tables/da-dk-g28l.ctb b/liblouis/tables/da-dk-g28l.ctb
new file mode 100644
index 0000000..b71808d
--- /dev/null
+++ b/liblouis/tables/da-dk-g28l.ctb
@@ -0,0 +1,1031 @@
+# liblouis: Danish, table for 8 dots grade 1.5, partial contraction (forward and backward translation)
+#
+#  Copyright (C) 2014-2017, Bue Vester-Andersen <bue@vester-andersen.dk>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#------------
+#
+#
+# This  is the Danish table for 8 dots grade 2l/1.5 limited contractions (lille forkortelse).
+# Use this table for translation and back-translation of Danish 8 dots grade 2 limited.
+#
+# Version: Bue Vester-Andersen, 160713
+
+### Table Metadata
+
+#+locale: da
+#+type: literary
+# #+contraction: partial
+# #+grade: 1.5
+#+dots: 8
+#+direction: both
+
+
+# Display opcodes
+include da-dk-octobraille.dis
+
+### Character definitions ###
+
+sign \x0000 8 NULL
+sign \x0001 178 START OF HEADING
+sign \x0002 1278 START OF TEXT
+sign \x0003 1478 END OF TEXT
+sign \x0004 14578 END OF TRANSMISSION
+sign \x0005 24568 ENQUIRY
+sign \x0006 12478 ACKNOWLEDGE
+sign \x0007 124578 BELL
+sign \x0008 12578 BACKSPACE
+space \t 2478 CHARACTER TABULATION
+space \n 678 LINE FEED (LF)
+space \v 1368 LINE TABULATION
+space \f 12378 FORM FEED (FF)
+space \r 257 CARRIAGE RETURN (CR)
+sign \x000e 134578 SHIFT OUT
+sign \x000f 12358 SHIFT IN
+sign \x0010 123478 DATA LINK ESCAPE
+sign \x0011 1234578 DEVICE CONTROL ONE
+sign \x0012 13568 DEVICE CONTROL TWO
+sign \x0013 4578 DEVICE CONTROL THREE
+sign \x0014 268 DEVICE CONTROL FOUR
+sign \x0015 13678 NEGATIVE ACKNOWLEDGE
+sign \x0016 278 SYNCHRONOUS IDLE
+sign \x0017 3578 END OF TRANSMISSION BLOCK
+sign \x0018 78 CANCEL
+sign \x0019 68 END OF MEDIUM
+sign \x001a 135678 SUBSTITUTE
+sign \x001b 2678 ESCAPE
+sign \x001c 45678 INFORMATION SEPARATOR FOUR
+sign \x001d 12368 INFORMATION SEPARATOR THREE
+sign \x001e 1234678 INFORMATION SEPARATOR TWO
+sign \x001f 235678 INFORMATION SEPARATOR ONE
+space \s 0 SPACE
+punctuation ! 235 EXCLAMATION MARK
+punctuation " 2356 QUOTATION MARK
+punctuation # 34568 NUMBER SIGN
+sign $ 25678 DOLLAR SIGN
+math % 24578 PERCENT SIGN
+sign & 123468 AMPERSAND
+punctuation ' 4 APOSTROPHE
+punctuation ( 2368 LEFT PARENTHESIS
+punctuation ) 3568 RIGHT PARENTHESIS
+math + 2358 PLUS SIGN
+punctuation , 2 COMMA
+punctuation - 368 HYPHEN-MINUS
+punctuation . 3 FULL STOP
+punctuation / 348 SLASH
+include digits8Dots.uti
+punctuation : 25 COLON
+punctuation ; 23 SEMICOLON
+math < 358 LESS-THAN SIGN
+math = 23568 EQUALS SIGN
+math > 267 GREATER-THAN SIGN
+punctuation ? 26 QUESTION MARK
+sign @ 478 COMMERCIAL AT
+uplow Aa 17,1 LATIN LETTER A
+uplow Bb 127,12 LATIN LETTER B
+uplow Cc 147,14 LATIN LETTER C
+uplow Dd 1457,145 LATIN LETTER D
+uplow Ee 157,15 LATIN LETTER E
+uplow Ff 1247,124 LATIN LETTER F
+uplow Gg 12457,1245 LATIN LETTER G
+uplow Hh 1257,125 LATIN LETTER H
+uplow Ii 247,24 LATIN LETTER I
+uplow Jj 2457,245 LATIN LETTER J
+uplow Kk 137,13 LATIN LETTER K
+uplow Ll 1237,123 LATIN LETTER L
+uplow Mm 1347,134 LATIN LETTER M
+uplow Nn 13457,1345 LATIN LETTER N
+uplow Oo 1357,135 LATIN LETTER O
+uplow Pp 12347,1234 LATIN CAPITAL LETTER P
+uplow Rr 12357,1235 LATIN LETTER R
+uplow Ss 2347,234 LATIN LETTER S
+uplow Tt 23457,2345 LATIN LETTER T
+uplow Uu 1367,136 LATIN LETTER U
+uplow Vv 12367,1236 LATIN LETTER V
+uplow Yy 134567,13456 LATIN LETTER Y
+punctuation [ 23678 LEFT SQUARE BRACKET
+punctuation ] 35678 RIGHT SQUARE BRACKET
+punctuation ^ 12348 CIRCUMFLEX ACCENT
+punctuation _ 3678 LOW LINE
+punctuation ` 5 GRAVE ACCENT
+punctuation { 123678 LEFT CURLY BRACKET
+punctuation | 4568 VERTICAL LINE
+punctuation } 345678 RIGHT CURLY BRACKET
+punctuation ~ 467 TILDE
+sign \x007f 7 DELETE
+sign \x20AC 1578 #EURO SIGN (0x80)
+noback sign \x0080 1578 #EURO SIGN (0x80)
+sign \x0081 45 <control-0081>
+punctuation \x201A 457 #Low single quote (0x82)
+noback punctuation \x0082 457 #Low single quote (0x82)
+sign \x0192 58 #Flurihn (0x83)
+noback sign \x0083 58 #Flurihn (0x83)
+punctuation \x201E 2378 #Low quote (0x84)
+noback punctuation \x0084 2378 #Low quote (0x84)
+letter \x2020 2357 #Dagger (0x86
+noback letter \x0086 2357 #Dagger (0x86
+letter \x2021 23578 #Double dagger (0x87
+noback letter \x0087 23578 #Double dagger (0x87
+letter \x02c6 5678 #Modifier letter circumflex (0x88)
+noback letter \x0088 5678 #Modifier letter circumflex (0x88)
+math \x2030 245678 #permille sign (0x89)
+noback math \x0089 245678 #permille sign (0x89)
+uplow \x0160\x0161 23478,2348 #LATIN CAPITAL LETTER S WITH CARON (0x8a)
+noback uplow \x008a\x009a 23478,2348 #LATIN LETTER S WITH CARON (0x8a)
+punctuation \x2039 456 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK (0x8b)
+noback punctuation \x008b 456 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK (0x8b)
+uplow \x0152\x0153 13578,1358 #LATIN CAPITAL LIGATURE OE (0x8c)
+noback uplow \x008c\x009c 13578,1358 #LATIN LIGATURE OE (0x8c)
+sign \x008d 3567 REVERSE LINE FEED (not defined in cp1252)
+letter \x008f 27 SINGLE SHIFT THREE (not defined in cp1252)
+letter \x0090 357 DEVICE CONTROL STRING (not defined in cp1252)
+punctuation \x2018 47 #LEFT SINGLE QUOTATION MARK (0x91)
+noback punctuation \x0091 47 #LEFT SINGLE QUOTATION MARK (0x91)
+punctuation \x2019 48 #RIGHT SINGLE QUOTATION MARK (0x92)
+noback punctuation \x0092 48 #RIGHT SINGLE QUOTATION MARK (0x92)
+punctuation \x201c 237 #LEFT DOUBLE QUOTATION MARK (0x93)
+noback punctuation \x0093 237 #LEFT DOUBLE QUOTATION MARK (0x93)
+punctuation \x201d 568 #RIGHT DOUBLE QUOTATION MARK (0x94)
+noback punctuation \x0094 568 #RIGHT DOUBLE QUOTATION MARK (0x94)
+sign \x2022 37 #Bullit (0x95)
+noback sign \x0095 37 #Bullit (0x95)
+sign \x02DC 46 #SMALL TILDE (0x98)
+noback sign \x0098 46 #SMALL TILDE (0x98)
+sign \x2122 234578 #TRADE MARK SIGN (0x99)
+noback sign \x0099 234578 #TRADE MARK SIGN (0x99)
+punctuation \x203A 4567 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (0x9b)
+noback punctuation \x009b 4567 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (0x9b)
+letter \x009d 2567 OPERATING SYSTEM COMMAND
+uplow \x0178\x00ff 2345678,234568 #LATIN LETTER Y WITH DIAERESIS (0x9f)
+noback uppercase \x009f 2345678 #LATIN LETTER Y WITH DIAERESIS (0x9f)
+punctuation \x00a0 23458 NO-BREAK SPACE (0xa0)
+punctuation \x00a2 2578 CENT SIGN (0xa2)
+punctuation \x00a3 1238 POUND SIGN (0xa3)
+punctuation \x00a5 67 YEN SIGN (0xa5)
+punctuation \x00a6 3478 BROKEN BAR (0xa6)
+punctuation \x00a7 578 SECTION SIGN (0xa7)
+punctuation \x00a9 134678 COPYRIGHT SIGN (0xa9)
+letter \x00aa 234678 FEMININE ORDINAL INDICATOR (0xaa)
+punctuation \x00ab 57 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (0xab)
+letter \x00ad 378 SOFT HYPHEN (0xad)
+punctuation \x00ae 123578 REGISTERED SIGN (0xae)
+punctuation \x00af 23567 MACRON (0xaf)
+math \x00b1 123458 PLUS-MINUS SIGN
+punctuation \x00b2 238 SUPERSCRIPT TWO
+punctuation \x00b3 258 SUPERSCRIPT THREE
+punctuation \x00b4 468 ACUTE ACCENT
+punctuation \x00b6 1234568 PILCROW SIGN
+punctuation \x00b7 38 MIDDLE DOT
+punctuation \x00b8 4678 CEDILLA
+punctuation \x00b9 28 SUPERSCRIPT ONE
+letter \x00ba 12345678 MASCULINE ORDINAL INDICATOR
+punctuation \x00bb 567 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+punctuation \x00bc 13458 VULGAR FRACTION ONE QUARTER
+punctuation \x00bd 458 VULGAR FRACTION ONE HALF
+uplow \x00c1\x00e1 1235678,123568 LATIN  LETTER A WITH ACUTE
+uplow \x00c2\x00e2 1678,168 LATIN  LETTER A WITH CIRCUMFLEX
+uplow \x00c3\x00e3 14678,1468 LATIN  LETTER A WITH TILDE
+uplow \x00c4\x00e4 34578,3458 LATIN  LETTER A WITH DIAERESIS
+uplow \x00c5\x00e5 167,16 LATIN LETTER A WITH RING ABOVE
+uplow \x00c6\x00e6 3457,345 LATIN LETTER AE
+uplow \x00cc\x00ec 15678,1568 LATIN  LETTER I WITH GRAVE
+uplow \x00cd\x00ed 12678,1268 LATIN  LETTER I WITH ACUTE
+uplow \x00d0\x00f0 1345678,134568 LATIN  LETTER ETH
+uplow \x00d1\x00f1 1245678,124568 LATIN  LETTER N WITH TILDE
+uplow \x00d2\x00f2 124678,12468 LATIN  LETTER O WITH GRAVE
+uplow \x00d3\x00f3 34678,3468 LATIN  LETTER O WITH ACUTE
+uplow \x00d5\x00f5 145678,14568 LATIN  LETTER O WITH TILDE
+uplow \x00d6\x00f6 24678,2468 LATIN  LETTER O WITH DIAERESIS
+math \x00d7 13468 MULTIPLICATION SIGN
+uplow \x00d8\x00f8 2467,246 LATIN LETTER O WITH STROKE
+uplow \x00da\x00fa 125678,12568 LATIN  LETTER U WITH ACUTE
+uplow \x00dd\x00fd 13478,1348 LATIN  LETTER Y WITH ACUTE (infinite?)
+uplow \x00de\x00fe 1378,138 LATIN  LETTER THORN
+lowercase \x00df 23468 LATIN SMALL LETTER SHARP S
+math \x00f7 2568 DIVISION SIGN
+
+# Character used for capslettersign
+# Resides in the "private use area", and shouldn't conflict with anything.
+sign \xf8ff f
+
+#Unicode Braille patterns
+include braille-patterns.cti
+
+# characters that have letsign as part of their definition
+# (to be removed when the alwaysletsign opcode has been implemented).
+punctuation * 6-35 ASTERISK
+uplow Qq 6-123457,6-12345 LATIN LETTER Q
+uplow Ww 6-24567,6-2456 LATIN LETTER W
+uplow Xx 6-13467,6-1346 LATIN LETTER X
+uplow Zz 6-13567,6-1356 LATIN LETTER Z
+punctuation \\ 6-347 REVERSE SLASH
+punctuation \x2026 6-3-3-3 #Elipsis (0x85)
+noback punctuation \x0085 6-3-3-3 #Elipsis (0x85)
+uplow \x017d\x017e 6-3467,6-346 #LATIN  LETTER Z WITH CARON (0x8e)
+noback uplow \x008e\x009e 6-3467,6-346 #LATIN  LETTER Z WITH CARON (0x8e)
+letter \x2013 6-36 #EN DASH (0x96)
+noback sign \x0096 6-36 #EN DASH (0x96)
+letter \x2014 6-367 #Em DASH (0x97)
+noback sign \x0097 6-367 #Em DASH (0x97)
+punctuation \x00a4 6-2367 CURRENCY SIGN (0xa4)
+punctuation \x00a8 6-56 DIAERESIS (0xa8)
+punctuation \x00ac 6-34567 NOT SIGN (0xac)
+sign \x00b0 4-356 DEGREE SIGN (0xb0)
+sign \x00b5 6-236 MICRO SIGN
+punctuation \x00be 6-3456 VULGAR FRACTION THREE QUARTERS
+punctuation \x00bf 6-34 INVERTED QUESTION MARK
+uplow \x00c0\x00e0 6-123567,6-12356 LATIN  LETTER A WITH GRAVE
+uplow \x00c7\x00e7 6-123467,6-12346 LATIN  LETTER C WITH CEDILLA
+uplow \x00c8\x00e8 6-23467,6-2346 LATIN  LETTER E WITH GRAVE
+uplow \x00c9\x00e9 6-1234567,6-123456 LATIN  LETTER E WITH ACUTE
+uplow \x00ca\x00ea 6-1267,6-126 LATIN  LETTER E WITH CIRCUMFLEX
+uplow \x00cb\x00eb 6-12467,6-1246 LATIN  LETTER E WITH DIAERESIS
+uplow \x00ce\x00ee 6-1467,6-146 LATIN  LETTER I WITH CIRCUMFLEX
+uplow \x00cf\x00ef 6-124567,6-12456 LATIN  LETTER I WITH DIAERESIS
+uplow \x00d4\x00f4 6-14567,6-1456 LATIN  LETTER O WITH CIRCUMFLEX
+uplow \x00d9\x00f9 6-234567,6-23456 LATIN  LETTER U WITH GRAVE
+uplow \x00db\x00fb 6-1567,6-156 LATIN  LETTER U WITH CIRCUMFLEX
+uplow \x00dc\x00fc 6-12567,6-1256 LATIN  LETTER U WITH DIAERESIS
+
+# Misc letters from other character sets prefixed with dot 5
+# to be implemented
+
+### misc opcodes ###
+
+# Emphasis opcodes
+emphclass italic
+emphclass underline
+emphclass bold
+
+begemphphrase italic 56
+endemphphrase italic after 56
+begemphword italic 56
+endemphword italic 56
+
+begemphphrase bold 56
+endemphphrase bold after 56
+begemphword bold 56
+endemphword bold 56
+
+begemphphrase underline 56
+endemphphrase underline after 56
+begemphword underline 56
+endemphword underline 56
+
+# special symbols
+decpoint , 2
+hyphen - 368
+letsign 6
+noletsign Ii
+noletsignbefore 1234567890
+
+capsletter f
+multind f-6 capsletter letsign
+multind 6-f letsign capsletter
+capsnocont
+
+#Special sequences, urls emails and file names.
+
+nocont $
+nocont \\ # line cannot end with a backslash
+nocont @
+nocont ://
+nocont www
+nocont .com
+nocont .dk
+nocont .eu
+nocont .edu
+nocont .gov
+nocont .mil
+nocont .net
+nocont .org
+nocont .uk
+nocont .doc
+nocont .exe
+nocont .htm
+nocont .tex
+nocont .txt
+nocont .gif
+nocont .jpg
+nocont .png
+nocont .wav
+nocont .tar
+nocont .zip
+
+# Word contractions with only 1 cell
+word at 1
+word bliver 12
+word den 12346
+word der 23456
+word det 2346
+word de 1456
+word du 145
+word efter 1356
+word eller 15
+word en 126
+word er 156
+word et 346
+word for 124
+word før 246
+word gennem 12456
+word gør 1245
+word han 13456
+word har 125
+word hun 136
+word hvad 2456
+word hvor 34
+word jeg 245
+word kan 13
+word lige 123
+word med 134
+word men 146
+word ned 1246
+word når 1345
+word og 14
+word op 135
+word over 1346
+word på 1234
+word ret 12356
+word rigtig 1235
+word skal 123456
+word som 234
+word så 16
+word te 1256
+word til 2345
+word under 12345
+word ved 1236
+word ve 3456
+word være 345
+
+### Exceptions ###
+
+# Ensure no single cell word contraction before or after a dash
+word -at 368-1-2345
+word at- 1-2345-368
+word -bliver 368-12-123-24-1236-15-1235
+word bliver- 12-123-24-1236-15-1235-368
+word -den 368-145-15-1345
+word den- 145-15-1345-368
+word -der 368-145-15-1235
+word der- 145-15-1235-368
+word -det 368-145-15-2345
+word det- 145-15-2345-368
+word -de 368-145-15
+word de- 145-15-368
+word -du 368-145-136
+word du- 145-136-368
+word -efter 368-15-124-2345-15-1235
+word efter- 15-124-2345-15-1235-368
+word -er 368-15-1235
+word er- 15-1235-368
+word -et 368-15-2345
+word et- 15-2345-368
+word -for 368-124-135-1235
+word for- 124-135-1235-368
+word -før 368-124-246-1235
+word før- 124-246-1235-368
+word -gennem 368-1245-15-1345-1345-15-134
+word gennem- 1245-15-1345-1345-15-134-368
+word -gør 368-1245-246-1235
+word gør- 1245-246-1235-368
+word -han 368-125-1-1345
+word han- 125-1-1345-368
+word -har 368-125-1-1235
+word har- 125-1-1235-368
+word -hun 368-125-136-1345
+word hun- 125-136-1345-368
+word -kan 368-13-1-1345
+word kan- 13-1-1345-368
+word -lige 368-123-24-12456
+word lige- 123-24-12456-368
+word -med 368-146-145
+word med- 146-145-368
+word -men 368-134-126
+word men- 134-126-368
+word -ned 368-1345-15-145
+word ned- 1345-15-145-368
+word -når 368-1345-16-1235
+word når- 1345-16-1235-368
+word -og 368-135-1245
+word og- 135-1245-368
+word -op 368-135-1234
+word op- 135-1234-368
+word -over 368-135-1236-15-1235
+word over- 135-1236-15-1235-368
+word -på 368-1234-16
+word på- 1234-16-368
+word -ret 368-1235-15-2345
+word ret- 1235-15-2345-368
+word -rigtig 368-1235-24-1245-2345-24-1245
+word rigtig- 1235-24-1245-2345-24-1245-368
+word -skal 368-234-13-1-123
+word skal- 234-13-1-123-368
+word -som 368-234-135-134
+word som- 234-135-134-368
+word -så 368-234-16
+word så- 234-16-368
+word -te 368-2345-15
+word te- 2345-15-368
+word -til 368-2345-24-123
+word til- 2345-24-123-368
+word -under 368-136-1345-145-15-1235
+word under- 136-1345-145-15-1235-368
+word -ved 368-1236-15-145
+word ved- 1236-15-145-368
+word -ve 368-1236-15
+word ve- 1236-15-368
+word -være 368-1236-345-1235-15
+word Være- 1236-345-1235-15-368
+
+### Patches ###
+# the following sections are to compensate for various behaviours and problems in liblouis.
+# They will be removed, as the issues are resolved.
+
+# Ensure correct back-translation of word contractions before various punctuation.
+
+nofor always a 6-1
+nofor always b 6-12
+nofor always c 6-14
+nofor always d 6-145
+nofor always e 6-15
+nofor always f 6-124
+nofor always g 6-1245
+nofor always h 6-125
+nofor always j 6-245
+nofor always k 6-13
+nofor always l 6-123
+nofor always m 6-134
+nofor always n 6-1345
+nofor always o 6-135
+nofor always p 6-1234
+nofor always q 6-12345
+nofor always r 6-1235
+nofor always s 6-234
+nofor always t 6-2345
+nofor always u 6-136
+nofor always v 6-1236
+nofor always w 6-2456
+nofor always x 6-1346
+nofor always y 6-13456
+nofor always z 6-1356
+nofor always æ 6-345
+nofor always ø 6-246
+nofor always å 6-16
+
+nofor always A 6-17
+nofor always B 6-127
+nofor always C 6-147
+nofor always D 6-1457
+nofor always E 6-157
+nofor always F 6-1247
+nofor always G 6-12457
+nofor always H 6-1257
+nofor always J 6-2457
+nofor always K 6-137
+nofor always L 6-1237
+nofor always M 6-1347
+nofor always N 6-13457
+nofor always O 6-1357
+nofor always P 6-12347
+nofor always Q 6-123457
+nofor always R 6-12357
+nofor always S 6-2347
+nofor always T 6-23457
+nofor always U 6-1367
+nofor always V 6-12367
+nofor always W 6-24567
+nofor always X 6-13467
+nofor always Y 6-134567
+nofor always Z 6-13567
+nofor always Æ 6-3457
+nofor always Ø 6-2467
+nofor always Å 6-167
+
+# if a word contraction is followed by a punctuation and another word immediately after,
+# The contracted word before the punctuation will back-translate as its components
+class wordlimit /,!.:’()?"'\x00ab_\x201d\x0094\x2019\x0092\x00bb
+
+nofor before wordlimit sufword at 1
+nofor before wordlimit sufword bliver 12
+nofor before wordlimit sufword den 12346
+nofor before wordlimit sufword der 23456
+nofor before wordlimit sufword det 2346
+nofor before wordlimit sufword de 1456
+nofor before wordlimit sufword du 145
+nofor before wordlimit sufword efter 1356
+nofor before wordlimit sufword eller 15
+nofor before wordlimit sufword en 126
+nofor before wordlimit sufword er 156
+nofor before wordlimit sufword et 346
+nofor before wordlimit sufword for 124
+nofor before wordlimit sufword før 246
+nofor before wordlimit sufword gennem 12456
+nofor before wordlimit sufword gør 1245
+nofor before wordlimit sufword han 13456
+nofor before wordlimit sufword har 125
+nofor before wordlimit sufword hun 136
+nofor before wordlimit sufword hvad 2456
+nofor before wordlimit sufword hvor 34
+nofor before wordlimit sufword jeg 245
+nofor before wordlimit sufword kan 13
+nofor before wordlimit sufword lige 123
+nofor before wordlimit sufword med 134
+nofor before wordlimit sufword men 146
+nofor before wordlimit sufword ned 1246
+nofor before wordlimit sufword når 1345
+nofor before wordlimit sufword og 14
+nofor before wordlimit sufword op 135
+nofor before wordlimit sufword over 1346
+nofor before wordlimit sufword på 1234
+nofor before wordlimit sufword ret 12356
+nofor before wordlimit sufword rigtig 1235
+nofor before wordlimit sufword skal 123456
+nofor before wordlimit sufword som 234
+nofor before wordlimit sufword så 16
+nofor before wordlimit sufword te 1256
+nofor before wordlimit sufword til 2345
+nofor before wordlimit sufword under 12345
+nofor before wordlimit sufword ved 1236
+nofor before wordlimit sufword være 345
+
+### Problems solved with pass 2 ###
+
+
+# The Danish use of letsign differs somewhat from the LibLouis way.
+# In order to be sure that we are getting a letsign when we want one, we are sometimes getting an overlap.
+
+# Ensure that we have letsign between a digit and "st"
+# and nd after a digit is not contracted
+noback context _$d["st"]!$l @6-234-2345
+noback context _$d["nd"]!$l @1345-145
+# Ensure that we get a letsign between a digit and a single letter.
+noback context $d[]$l!$l @6
+noback context $d[]$l~ @6
+
+# Most of these lines are temporary.
+# They will be written with a few swap sets when the swapdd opcode has been fixed.
+
+
+# Generic forward convert of @f-... to @...7
+noback pass2 @f-235 @2357
+# Conversion with letsign.
+noback pass2 @f-6-235 @6-2357
+# Conversion with dot 5, which is used for accent marker in higher unicode pages.
+noback pass2 @f-5-235 @5-2357
+# Generic backward conversion.
+nofor pass2 @2357 @f-235
+# Conversion with dot 5 (letsign is handled below).
+nofor pass2 @5-2357 @f-5-235
+
+# Same for the following characters.
+
+noback pass2 @f-35 @357
+noback pass2 @f-6-35 @6-357
+noback pass2 @f-5-35 @5-357
+nofor pass2 @357 @f-35
+nofor pass2 @5-357 @f-5-35
+
+noback pass2 @f-1 @17
+noback pass2 @f-6-1 @6-17
+noback pass2 @f-5-1 @5-17
+nofor pass2 @17 @f-1
+nofor pass2 @5-17 @f-5-1
+
+noback pass2 @f-12 @127
+noback pass2 @f-6-12 @6-127
+noback pass2 @f-5-12 @5-127
+nofor pass2 @127 @f-12
+nofor pass2 @5-127 @f-5-12
+
+noback pass2 @f-14 @147
+noback pass2 @f-6-14 @6-147
+noback pass2 @f-5-14 @5-147
+nofor pass2 @147 @f-14
+nofor pass2 @5-147 @f-5-14
+
+noback pass2 @f-145 @1457
+noback pass2 @f-6-145 @6-1457
+noback pass2 @f-5-145 @5-1457
+nofor pass2 @1457 @f-145
+nofor pass2 @5-1457 @f-5-145
+
+noback pass2 @f-15 @157
+noback pass2 @f-6-15 @6-157
+noback pass2 @f-5-15 @5-157
+nofor pass2 @157 @f-15
+nofor pass2 @5-157 @f-5-15
+
+noback pass2 @f-124 @1247
+noback pass2 @f-6-124 @6-1247
+noback pass2 @f-5-124 @5-1247
+nofor pass2 @1247 @f-124
+nofor pass2 @5-1247 @f-5-124
+
+noback pass2 @f-1245 @12457
+noback pass2 @f-6-1245 @6-12457
+noback pass2 @f-5-1245 @5-12457
+nofor pass2 @12457 @f-1245
+nofor pass2 @5-12457 @f-5-1245
+
+noback pass2 @f-125 @1257
+noback pass2 @f-6-125 @6-1257
+noback pass2 @f-5-125 @5-1257
+nofor pass2 @1257 @f-125
+nofor pass2 @5-1257 @f-5-125
+
+noback pass2 @f-24 @247
+noback pass2 @f-6-24 @6-247
+noback pass2 @f-5-24 @5-247
+nofor pass2 @247 @f-24
+nofor pass2 @5-247 @f-5-24
+
+noback pass2 @f-245 @2457
+noback pass2 @f-6-245 @6-2457
+noback pass2 @f-5-245 @5-2457
+nofor pass2 @2457 @f-245
+nofor pass2 @5-2457 @f-5-245
+
+noback pass2 @f-13 @137
+noback pass2 @f-6-13 @6-137
+noback pass2 @f-5-13 @5-137
+nofor pass2 @137 @f-13
+nofor pass2 @5-137 @f-5-13
+
+noback pass2 @f-123 @1237
+noback pass2 @f-6-123 @6-1237
+noback pass2 @f-5-123 @5-1237
+nofor pass2 @1237 @f-123
+nofor pass2 @5-1237 @f-5-123
+
+noback pass2 @f-134 @1347
+noback pass2 @f-6-134 @6-1347
+noback pass2 @f-5-134 @5-1347
+nofor pass2 @1347 @f-134
+nofor pass2 @5-1347 @f-5-134
+
+noback pass2 @f-1345 @13457
+noback pass2 @f-6-1345 @6-13457
+noback pass2 @f-5-1345 @5-13457
+nofor pass2 @13457 @f-1345
+nofor pass2 @5-13457 @f-5-1345
+
+noback pass2 @f-135 @1357
+noback pass2 @f-6-135 @6-1357
+noback pass2 @f-5-135 @5-1357
+nofor pass2 @1357 @f-135
+nofor pass2 @5-1357 @f-5-135
+
+noback pass2 @f-1234 @12347
+noback pass2 @f-6-1234 @6-12347
+noback pass2 @f-5-1234 @5-12347
+nofor pass2 @12347 @f-1234
+nofor pass2 @5-12347 @f-5-1234
+
+noback pass2 @f-12345 @123457
+noback pass2 @f-6-12345 @6-123457
+noback pass2 @f-5-12345 @5-123457
+nofor pass2 @123457 @f-12345
+nofor pass2 @5-123457 @f-5-12345
+
+noback pass2 @f-1235 @12357
+noback pass2 @f-6-1235 @6-12357
+noback pass2 @f-5-1235 @5-12357
+nofor pass2 @12357 @f-1235
+nofor pass2 @5-12357 @f-5-1235
+
+noback pass2 @f-234 @2347
+noback pass2 @f-6-234 @6-2347
+noback pass2 @f-5-234 @5-2347
+nofor pass2 @2347 @f-234
+nofor pass2 @5-2347 @f-5-234
+
+noback pass2 @f-2345 @23457
+noback pass2 @f-6-2345 @6-23457
+noback pass2 @f-5-2345 @5-23457
+nofor pass2 @23457 @f-2345
+nofor pass2 @5-23457 @f-5-2345
+
+noback pass2 @f-136 @1367
+noback pass2 @f-6-136 @6-1367
+noback pass2 @f-5-136 @5-1367
+nofor pass2 @1367 @f-136
+nofor pass2 @5-1367 @f-5-136
+
+noback pass2 @f-1236 @12367
+noback pass2 @f-6-1236 @6-12367
+noback pass2 @f-5-1236 @5-12367
+nofor pass2 @12367 @f-1236
+nofor pass2 @5-12367 @f-5-1236
+
+noback pass2 @f-2456 @24567
+noback pass2 @f-6-2456 @6-24567
+noback pass2 @f-5-2456 @5-24567
+nofor pass2 @24567 @f-2456
+nofor pass2 @5-24567 @f-5-2456
+
+noback pass2 @f-1346 @13467
+noback pass2 @f-6-1346 @6-13467
+noback pass2 @f-5-1346 @5-13467
+nofor pass2 @13467 @f-1346
+nofor pass2 @5-13467 @f-5-1346
+
+noback pass2 @f-13456 @134567
+noback pass2 @f-6-13456 @6-134567
+noback pass2 @f-5-13456 @5-134567
+nofor pass2 @134567 @f-13456
+nofor pass2 @5-134567 @f-5-13456
+
+noback pass2 @f-1356 @13567
+noback pass2 @f-6-1356 @6-13567
+noback pass2 @f-5-1356 @5-13567
+nofor pass2 @13567 @f-1356
+nofor pass2 @5-13567 @f-5-1356
+
+noback pass2 @f-34 @347
+noback pass2 @f-6-34 @6-347
+noback pass2 @f-5-34 @5-347
+nofor pass2 @347 @f-34
+nofor pass2 @5-347 @f-5-34
+
+noback pass2 @f-346 @3467
+noback pass2 @f-6-346 @6-3467
+noback pass2 @f-5-346 @5-3467
+nofor pass2 @3467 @f-346
+nofor pass2 @5-3467 @f-5-346
+
+noback pass2 @f-2348 @23478
+noback pass2 @f-6-2348 @6-23478
+noback pass2 @f-5-2348 @5-23478
+nofor pass2 @23478 @f-2348
+nofor pass2 @5-23478 @f-5-2348
+
+noback pass2 @f-1358 @13578
+noback pass2 @f-6-1358 @6-13578
+noback pass2 @f-5-1358 @5-13578
+nofor pass2 @13578 @f-1358
+nofor pass2 @5-13578 @f-5-1358
+
+noback pass2 @f-234568 @2345678
+noback pass2 @f-6-234568 @6-2345678
+noback pass2 @f-5-234568 @5-2345678
+nofor pass2 @2345678 @f-234568
+nofor pass2 @5-2345678 @f-5-234568
+
+noback pass2 @f-236 @2367
+noback pass2 @f-6-236 @6-2367
+noback pass2 @f-5-236 @5-2367
+nofor pass2 @2367 @f-236
+nofor pass2 @5-2367 @f-5-236
+
+noback pass2 @f-256 @2567
+noback pass2 @f-6-256 @6-2567
+noback pass2 @f-5-256 @5-2567
+nofor pass2 @2567 @f-256
+nofor pass2 @5-2567 @f-5-256
+
+noback pass2 @f-356 @3567
+noback pass2 @f-6-356 @6-3567
+noback pass2 @f-5-356 @5-3567
+nofor pass2 @3567 @f-356
+nofor pass2 @5-3567 @f-5-356
+
+noback pass2 @f-3456 @34567
+noback pass2 @f-6-3456 @6-34567
+noback pass2 @f-5-3456 @5-34567
+nofor pass2 @34567 @f-3456
+nofor pass2 @5-34567 @f-5-3456
+
+noback pass2 @f-12356 @123567
+noback pass2 @f-6-12356 @6-123567
+noback pass2 @f-5-12356 @5-123567
+nofor pass2 @123567 @f-12356
+nofor pass2 @5-123567 @f-5-12356
+
+noback pass2 @f-123568 @1235678
+noback pass2 @f-6-123568 @6-1235678
+noback pass2 @f-5-123568 @5-1235678
+nofor pass2 @1235678 @f-123568
+nofor pass2 @5-1235678 @f-5-123568
+
+noback pass2 @f-168 @1678
+noback pass2 @f-6-168 @6-1678
+noback pass2 @f-5-168 @5-1678
+nofor pass2 @1678 @f-168
+nofor pass2 @5-1678 @f-5-168
+
+noback pass2 @f-1468 @14678
+noback pass2 @f-6-1468 @6-14678
+noback pass2 @f-5-1468 @5-14678
+nofor pass2 @14678 @f-1468
+nofor pass2 @5-14678 @f-5-1468
+
+noback pass2 @f-3458 @34578
+noback pass2 @f-6-3458 @6-34578
+noback pass2 @f-5-3458 @5-34578
+nofor pass2 @34578 @f-3458
+nofor pass2 @5-34578 @f-5-3458
+
+noback pass2 @f-16 @167
+noback pass2 @f-6-16 @6-167
+noback pass2 @f-5-16 @5-167
+nofor pass2 @167 @f-16
+nofor pass2 @5-167 @f-5-16
+
+noback pass2 @f-345 @3457
+noback pass2 @f-6-345 @6-3457
+noback pass2 @f-5-345 @5-3457
+nofor pass2 @3457 @f-345
+nofor pass2 @5-3457 @f-5-345
+
+noback pass2 @f-12346 @123467
+noback pass2 @f-6-12346 @6-123467
+noback pass2 @f-5-12346 @5-123467
+nofor pass2 @123467 @f-12346
+nofor pass2 @5-123467 @f-5-12346
+
+noback pass2 @f-2346 @23467
+noback pass2 @f-6-2346 @6-23467
+noback pass2 @f-5-2346 @5-23467
+nofor pass2 @23467 @f-2346
+nofor pass2 @5-23467 @f-5-2346
+
+noback pass2 @f-123456 @1234567
+noback pass2 @f-6-123456 @6-1234567
+noback pass2 @f-5-123456 @5-1234567
+nofor pass2 @1234567 @f-123456
+nofor pass2 @5-1234567 @f-5-123456
+
+noback pass2 @f-126 @1267
+noback pass2 @f-6-126 @6-1267
+noback pass2 @f-5-126 @5-1267
+nofor pass2 @1267 @f-126
+nofor pass2 @5-1267 @f-5-126
+
+noback pass2 @f-1246 @12467
+noback pass2 @f-6-1246 @6-12467
+noback pass2 @f-5-1246 @5-12467
+nofor pass2 @12467 @f-1246
+nofor pass2 @5-12467 @f-5-1246
+
+noback pass2 @f-1568 @15678
+noback pass2 @f-6-1568 @6-15678
+noback pass2 @f-5-1568 @5-15678
+nofor pass2 @15678 @f-1568
+nofor pass2 @5-15678 @f-5-1568
+
+noback pass2 @f-1268 @12678
+noback pass2 @f-6-1268 @6-12678
+noback pass2 @f-5-1268 @5-12678
+nofor pass2 @12678 @f-1268
+nofor pass2 @5-12678 @f-5-1268
+
+noback pass2 @f-146 @1467
+noback pass2 @f-6-146 @6-1467
+noback pass2 @f-5-146 @5-1467
+nofor pass2 @1467 @f-146
+nofor pass2 @5-1467 @f-5-146
+
+noback pass2 @f-12456 @124567
+noback pass2 @f-6-12456 @6-124567
+noback pass2 @f-5-12456 @5-124567
+nofor pass2 @124567 @f-12456
+nofor pass2 @5-124567 @f-5-12456
+
+noback pass2 @f-134568 @1345678
+noback pass2 @f-6-134568 @6-1345678
+noback pass2 @f-5-134568 @5-1345678
+nofor pass2 @1345678 @f-134568
+nofor pass2 @5-1345678 @f-5-134568
+
+noback pass2 @f-124568 @1245678
+noback pass2 @f-6-124568 @6-1245678
+noback pass2 @f-5-124568 @5-1245678
+nofor pass2 @1245678 @f-124568
+nofor pass2 @5-1245678 @f-5-124568
+
+noback pass2 @f-12468 @124678
+noback pass2 @f-6-12468 @6-124678
+noback pass2 @f-5-12468 @5-124678
+nofor pass2 @124678 @f-12468
+nofor pass2 @5-124678 @f-5-12468
+
+noback pass2 @f-3468 @34678
+noback pass2 @f-6-3468 @6-34678
+noback pass2 @f-5-3468 @5-34678
+nofor pass2 @34678 @f-3468
+nofor pass2 @5-34678 @f-5-3468
+
+noback pass2 @f-1456 @14567
+noback pass2 @f-6-1456 @6-14567
+noback pass2 @f-5-1456 @5-14567
+nofor pass2 @14567 @f-1456
+nofor pass2 @5-14567 @f-5-1456
+
+noback pass2 @f-14568 @145678
+noback pass2 @f-6-14568 @6-145678
+noback pass2 @f-5-14568 @5-145678
+nofor pass2 @145678 @f-14568
+nofor pass2 @5-145678 @f-5-14568
+
+noback pass2 @f-2468 @24678
+noback pass2 @f-6-2468 @6-24678
+noback pass2 @f-5-2468 @5-24678
+nofor pass2 @24678 @f-2468
+nofor pass2 @5-24678 @f-5-2468
+
+noback pass2 @f-246 @2467
+noback pass2 @f-6-246 @6-2467
+noback pass2 @f-5-246 @5-2467
+nofor pass2 @2467 @f-246
+nofor pass2 @5-2467 @f-5-246
+
+noback pass2 @f-23456 @234567
+noback pass2 @f-6-23456 @6-234567
+noback pass2 @f-5-23456 @5-234567
+nofor pass2 @234567 @f-23456
+nofor pass2 @5-234567 @f-5-23456
+
+noback pass2 @f-12568 @125678
+noback pass2 @f-6-12568 @6-125678
+noback pass2 @f-5-12568 @5-125678
+nofor pass2 @125678 @f-12568
+nofor pass2 @5-125678 @f-5-12568
+
+noback pass2 @f-156 @1567
+noback pass2 @f-6-156 @6-1567
+noback pass2 @f-5-156 @5-1567
+nofor pass2 @1567 @f-156
+nofor pass2 @5-1567 @f-5-156
+
+noback pass2 @f-1256 @12567
+noback pass2 @f-6-1256 @6-12567
+noback pass2 @f-5-1256 @5-12567
+nofor pass2 @12567 @f-1256
+nofor pass2 @5-12567 @f-5-1256
+
+noback pass2 @f-1348 @13478
+noback pass2 @f-6-1348 @6-13478
+noback pass2 @f-5-1348 @5-13478
+nofor pass2 @13478 @f-1348
+nofor pass2 @5-13478 @f-5-1348
+
+noback pass2 @f-138 @1378
+noback pass2 @f-6-138 @6-1378
+noback pass2 @f-5-138 @5-1378
+nofor pass2 @1378 @f-138
+nofor pass2 @5-1378 @f-5-138
+
+noback pass2 @f-234568 @2345678
+noback pass2 @f-6-234568 @6-2345678
+noback pass2 @f-5-234568 @5-2345678
+nofor pass2 @2345678 @f-234568
+nofor pass2 @5-2345678 @f-5-234568
+
+# Tweak to keep letsign for letters that should always have letsign.
+# Letsign will be removed by the multind opcode. So we insert an extra one.
+nofor pass2 @6-123457 @f-6-6-12345
+nofor pass2 @6-24567 @f-6-6-2456
+nofor pass2 @6-13467 @f-6-6-1346
+nofor pass2 @6-134567 @f-6-6-13456
+nofor pass2 @6-13567 @f-6-6-1356
+nofor pass2 @6-123567 @f-6-6-12356
+nofor pass2 @6-123467 @f-6-6-12346
+nofor pass2 @6-23467 @f-6-6-2346
+nofor pass2 @6-1234567 @f-6-6-123456
+nofor pass2 @6-1267 @f-6-6-126
+nofor pass2 @6-12467 @f-6-6-1246
+nofor pass2 @6-1467 @f-6-6-146
+nofor pass2 @6-124567 @f-6-6-12456
+nofor pass2 @6-14567 @f-6-6-1456
+nofor pass2 @6-234567 @f-6-6-23456
+nofor pass2 @6-1567 @f-6-6-156
+nofor pass2 @6-12567 @f-6-6-1256
+
+# Ensure that punctuation signs etc. are not "tolowered" when they have a letsign, but only when they act as a partword contraction.
+nofor pass2 @6-347 *
+nofor pass2 @6-2357 *
+nofor pass2 @6-3467 *
+nofor pass2 @6-2567 *
+nofor pass2 @6-2367 *
+nofor pass2 @6-34567 *
+
+# remove any superfluous capsletter marks.
+noback pass2 @f ?
+
+# Remove any superfluous letsigns and only keep one.
+noback pass3 @6-6 @6
diff --git a/liblouis/tables/da-dk-octobraille.dis b/liblouis/tables/da-dk-octobraille.dis
new file mode 100644
index 0000000..6218a23
--- /dev/null
+++ b/liblouis/tables/da-dk-octobraille.dis
@@ -0,0 +1,283 @@
+# Liblouis: Display table for Danish CP1252 Octo Braille
+#
+#  Copyright (C) 2014-2017, Bue Vester-Andersen <bue@vester-andersen.dk>
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#------------
+#
+# This file contains display definitions for Danish 8 dot Braille.
+# It should be included in high level tables to ensure correct mapping of characters to dot patterns.
+#
+# Version: Bue Vester-Andersen 170604
+
+display \x0000 8 NULL
+display \x0001 178 START OF HEADING
+display \x0002 1278 START OF TEXT
+display \x0003 1478 END OF TEXT
+display \x0004 14578 END OF TRANSMISSION
+display \x0005 24568 ENQUIRY
+display \x0006 12478 ACKNOWLEDGE
+display \x0007 124578 BELL
+display \x0008 12578 BACKSPACE
+display \t 2478 CHARACTER TABULATION
+display \n 678 LINE FEED (LF)
+display \v 1368 LINE TABULATION
+display \f 12378 FORM FEED (FF)
+display \r 257 CARRIAGE RETURN (CR)
+display \x000e 134578 SHIFT OUT
+display \x000f 12358 SHIFT IN
+display \x0010 123478 DATA LINK ESCAPE
+display \x0011 1234578 DEVICE CONTROL ONE
+display \x0012 13568 DEVICE CONTROL TWO
+display \x0013 4578 DEVICE CONTROL THREE
+display \x0014 268 DEVICE CONTROL FOUR
+display \x0015 13678 NEGATIVE ACKNOWLEDGE
+display \x0016 278 SYNCHRONOUS IDLE
+display \x0017 3578 END OF TRANSMISSION BLOCK
+display \x0018 78 CANCEL
+display \x0019 68 END OF MEDIUM
+display \x001a 135678 SUBSTITUTE
+display \x001b 2678 ESCAPE
+display \x001c 45678 INFORMATION SEPARATOR FOUR
+display \x001d 12368 INFORMATION SEPARATOR THREE
+display \x001e 1234678 INFORMATION SEPARATOR TWO
+display \x001f 235678 INFORMATION SEPARATOR ONE
+display \s 0 SPACE
+display ! 235 EXCLAMATION MARK
+display " 2356 QUOTATION MARK
+display # 34568 NUMBER SIGN
+display $ 25678 DOLLAR SIGN
+display % 24578 PERCENT SIGN
+display & 123468 AMPERSAND
+display ' 4 APOSTROPHE
+display ( 2368 LEFT PARENTHESIS
+display ) 3568 RIGHT PARENTHESIS
+display * 35 ASTERISK
+display + 2358 PLUS SIGN
+display , 2 COMMA
+display - 368 HYPHEN-MINUS
+display . 3 FULL STOP
+display / 348 SLASH
+display 0 2458 #0
+display 1 18 #1
+display 2 128 #2
+display 3 148 #3
+display 4 1458 #4
+display 5 158 #5
+display 6 1248 #6
+display 7 12458 #7
+display 8 1258 #8
+display 9 248 #9
+display : 25 COLON
+display ; 23 SEMICOLON
+display < 358 LESS-THAN SIGN
+display = 23568 EQUALS SIGN
+display > 267 GREATER-THAN SIGN
+display ? 26 QUESTION MARK
+display @ 478 COMMERCIAL AT
+display A 17 LATIN CAPITAL LETTER A
+display B 127 LATIN CAPITAL LETTER B
+display C 147 LATIN CAPITAL LETTER C
+display D 1457 LATIN CAPITAL LETTER D
+display E 157 LATIN CAPITAL LETTER E
+display F 1247 LATIN CAPITAL LETTER F
+display G 12457 LATIN CAPITAL LETTER G
+display H 1257 LATIN CAPITAL LETTER H
+display I 247 LATIN CAPITAL LETTER I
+display J 2457 LATIN CAPITAL LETTER J
+display K 137 LATIN CAPITAL LETTER K
+display L 1237 LATIN CAPITAL LETTER L
+display M 1347 LATIN CAPITAL LETTER M
+display N 13457 LATIN CAPITAL LETTER N
+display O 1357 LATIN CAPITAL LETTER O
+display P 12347 LATIN CAPITAL LETTER P
+display Q 123457 LATIN CAPITAL LETTER Q
+display R 12357 LATIN CAPITAL LETTER R
+display S 2347 LATIN CAPITAL LETTER S
+display T 23457 LATIN CAPITAL LETTER T
+display U 1367 LATIN CAPITAL LETTER U
+display V 12367 LATIN CAPITAL LETTER V
+display W 24567 LATIN CAPITAL LETTER W
+display X 13467 LATIN CAPITAL LETTER X
+display Y 134567 LATIN CAPITAL LETTER Y
+display Z 13567 LATIN CAPITAL LETTER Z
+display [ 23678 LEFT SQUARE BRACKET
+display \\ 347 REVERSE SLASH
+display ] 35678 RIGHT SQUARE BRACKET
+display ^ 12348 CIRCUMFLEX ACCENT
+display _ 3678 LOW LINE
+display ` 5 GRAVE ACCENT
+display a 1 LATIN SMALL LETTER A
+display b 12 LATIN SMALL LETTER B
+display c 14 LATIN SMALL LETTER C
+display d 145 LATIN SMALL LETTER D
+display e 15 LATIN SMALL LETTER E
+display f 124 LATIN SMALL LETTER F
+display g 1245 LATIN SMALL LETTER G
+display h 125 LATIN SMALL LETTER H
+display i 24 LATIN SMALL LETTER I
+display j 245 LATIN SMALL LETTER J
+display k 13 LATIN SMALL LETTER K
+display l 123 LATIN SMALL LETTER L
+display m 134 LATIN SMALL LETTER M
+display n 1345 LATIN SMALL LETTER N
+display o 135 LATIN SMALL LETTER O
+display p 1234 LATIN SMALL LETTER P
+display q 12345 LATIN SMALL LETTER Q
+display r 1235 LATIN SMALL LETTER R
+display s 234 LATIN SMALL LETTER S
+display t 2345 LATIN SMALL LETTER T
+display u 136 LATIN SMALL LETTER U
+display v 1236 LATIN SMALL LETTER V
+display w 2456 LATIN SMALL LETTER W
+display x 1346 LATIN SMALL LETTER X
+display y 13456 LATIN SMALL LETTER Y
+display z 1356 LATIN SMALL LETTER Z
+display { 123678 LEFT CURLY BRACKET
+display | 4568 VERTICAL LINE
+display } 345678 RIGHT CURLY BRACKET
+display ~ 467 TILDE
+display \x007f 7 DELETE
+display \x0080 1578 #EURO SIGN (0x80)
+display \x0081 45 <control-0081> (not defined in cp1252)
+display \x0082 457 #Low single quote (0x82)
+display \x0083 58 #Flurihn (0x83)
+display \x0084 2378 #Low quote (0x84)
+display \x0085 6 #Elipsis (0x85)
+display \x0086 2357 #Dagger (0x86
+display \x0087 23578 #Double dagger (0x87
+display \x0088 5678 #Modifier letter circumflex (0x88)
+display \x0089 245678 #permille sign (0x89)
+display \x008a 23478 #LATIN CAPITAL LETTER S WITH CARON (0x8a)
+display \x008b 456 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK (0x8b)
+display \x008c 13578 #LATIN CAPITAL LIGATURE OE (0x8c)
+display \x008d 3567 REVERSE LINE FEED (not defined in cp1252)
+display \x008e 3467 #LATIN CAPITAL LETTER Z WITH CARON (0x8e)
+display \x008f 27 SINGLE SHIFT THREE (not defined in cp1252)
+display \x0090 357 DEVICE CONTROL STRING (not defined in cp1252)
+display \x0091 47 #LEFT SINGLE QUOTATION MARK (0x91)
+display \x0092 48 #RIGHT SINGLE QUOTATION MARK (0x92)
+display \x0093 237 #LEFT DOUBLE QUOTATION MARK (0x93)
+display \x0094 568 #RIGHT DOUBLE QUOTATION MARK (0x94)
+display \x0095 37 #Bullit (0x95)
+display \x0096 36 #EN DASH (0x96)
+display \x0097 367 #Em DASH (0x97)
+display \x0098 46 #SMALL TILDE (0x98)
+display \x0099 234578 #TRADE MARK SIGN (0x99)
+display \x009a 2348 #LATIN SMALL LETTER S WITH CARON (0x9a)
+display \x009b 4567 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (0x9b)
+display \x009c 1358 #LATIN SMALL LIGATURE OE (0x9c)
+display \x009d 2567 OPERATING SYSTEM COMMAND
+display \x009e 346 #LATIN SMALL LETTER Z WITH CARON (0x9e)
+display \x009f 2345678 #LATIN CAPITAL LETTER Y WITH DIAERESIS (0x9f)
+display \x00a0 23458 NO-BREAK SPACE (0xa0)
+display \x00a1 256 INVERTED EXCLAMATION MARK )0xa1)
+display \x00a2 2578 CENT SIGN (0xa2)
+display \x00a3 1238 POUND SIGN (0xa3)
+display \x00a4 2367 CURRENCY SIGN (0xa4)
+display \x00a5 67 YEN SIGN (0xa5)
+display \x00a6 3478 BROKEN BAR (0xa6)
+display \x00a7 578 SECTION SIGN (0xa7)
+display \x00a8 56 DIAERESIS (0xa8)
+display \x00a9 134678 COPYRIGHT SIGN (0xa9)
+display \x00aa 234678 FEMININE ORDINAL INDICATOR (0xaa)
+display \x00ab 57 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (0xab)
+display \x00ac 34567 NOT SIGN (0xac)
+display \x00ad 378 SOFT HYPHEN (0xad)
+display \x00ae 123578 REGISTERED SIGN (0xae)
+display \x00af 23567 MACRON (0xaf)
+display \x00b0 356 DEGREE SIGN (0xb0)
+display \x00b1 123458 PLUS-MINUS SIGN
+display \x00b2 238 SUPERSCRIPT TWO
+display \x00b3 258 SUPERSCRIPT THREE
+display \x00b4 468 ACUTE ACCENT
+display \x00b5 236 MICRO SIGN
+display \x00b6 1234568 PILCROW SIGN
+display \x00b7 38 MIDDLE DOT
+display \x00b8 4678 CEDILLA
+display \x00b9 28 SUPERSCRIPT ONE
+display \x00ba 12345678 MASCULINE ORDINAL INDICATOR
+display \x00bb 567 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+display \x00bc 13458 VULGAR FRACTION ONE QUARTER
+display \x00bd 458 VULGAR FRACTION ONE HALF
+display \x00be 3456 VULGAR FRACTION THREE QUARTERS
+display \x00bf 34 INVERTED QUESTION MARK
+display \x00c0 123567 LATIN CAPITAL LETTER A WITH GRAVE
+display \x00c1 1235678 LATIN CAPITAL LETTER A WITH ACUTE
+display \x00c2 1678 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+display \x00c3 14678 LATIN CAPITAL LETTER A WITH TILDE
+display \x00c4 34578 LATIN CAPITAL LETTER A WITH DIAERESIS
+display \x00c5 167 LATIN CAPITAL LETTER A WITH RING ABOVE
+display \x00c6 3457 LATIN CAPITAL LETTER AE
+display \x00c7 123467 LATIN CAPITAL LETTER C WITH CEDILLA
+display \x00c8 23467 LATIN CAPITAL LETTER E WITH GRAVE
+display \x00c9 1234567 LATIN CAPITAL LETTER E WITH ACUTE
+display \x00ca 1267 LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+display \x00cb 12467 LATIN CAPITAL LETTER E WITH DIAERESIS
+display \x00cc 15678 LATIN CAPITAL LETTER I WITH GRAVE
+display \x00cd 12678 LATIN CAPITAL LETTER I WITH ACUTE
+display \x00ce 1467 LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+display \x00cf 124567 LATIN CAPITAL LETTER I WITH DIAERESIS
+display \x00d0 1345678 LATIN CAPITAL LETTER ETH
+display \x00d1 1245678 LATIN CAPITAL LETTER N WITH TILDE
+display \x00d2 124678 LATIN CAPITAL LETTER O WITH GRAVE
+display \x00d3 34678 LATIN CAPITAL LETTER O WITH ACUTE
+display \x00d4 14567 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+display \x00d5 145678 LATIN CAPITAL LETTER O WITH TILDE
+display \x00d6 24678 LATIN CAPITAL LETTER O WITH DIAERESIS
+display \x00d7 13468 MULTIPLICATION SIGN
+display \x00d8 2467 LATIN CAPITAL LETTER O WITH STROKE
+display \x00d9 234567 LATIN CAPITAL LETTER U WITH GRAVE
+display \x00da 125678 LATIN CAPITAL LETTER U WITH ACUTE
+display \x00db 1567 LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+display \x00dc 12567 LATIN CAPITAL LETTER U WITH DIAERESIS
+display \x00dd 13478 LATIN CAPITAL LETTER Y WITH ACUTE (infinite?)
+display \x00de 1378 LATIN CAPITAL LETTER THORN
+display \x00df 23468 LATIN SMALL LETTER SHARP S
+display \x00e0 12356 LATIN SMALL LETTER A WITH GRAVE
+display \x00e1 123568 LATIN SMALL LETTER A WITH ACUTE
+display \x00e2 168 LATIN SMALL LETTER A WITH CIRCUMFLEX
+display \x00e3 1468 LATIN SMALL LETTER A WITH TILDE
+display \x00e4 3458 LATIN SMALL LETTER A WITH DIAERESIS
+display \x00e5 16 LATIN SMALL LETTER A WITH RING ABOVE
+display \x00e6 345 LATIN SMALL LETTER AE
+display \x00e7 12346 LATIN SMALL LETTER C WITH CEDILLA
+display \x00e8 2346 LATIN SMALL LETTER E WITH GRAVE
+display \x00e9 123456 LATIN SMALL LETTER E WITH ACUTE
+display \x00ea 126 LATIN SMALL LETTER E WITH CIRCUMFLEX
+display \x00eb 1246 LATIN SMALL LETTER E WITH DIAERESIS
+display \x00ec 1568 LATIN SMALL LETTER I WITH GRAVE
+display \x00ed 1268 LATIN SMALL LETTER I WITH ACUTE
+display \x00ee 146 LATIN SMALL LETTER I WITH CIRCUMFLEX
+display \x00ef 12456 LATIN SMALL LETTER I WITH DIAERESIS
+display \x00f0 134568 LATIN SMALL LETTER ETH
+display \x00f1 124568 LATIN SMALL LETTER N WITH TILDE
+display \x00f2 12468 LATIN SMALL LETTER O WITH GRAVE
+display \x00f3 3468 LATIN SMALL LETTER O WITH ACUTE
+display \x00f4 1456 LATIN SMALL LETTER O WITH CIRCUMFLEX
+display \x00f5 14568 LATIN SMALL LETTER O WITH TILDE
+display \x00f6 2468 LATIN SMALL LETTER O WITH DIAERESIS
+display \x00f7 2568 DIVISION SIGN
+display \x00f8 246 LATIN SMALL LETTER O WITH STROKE
+display \x00f9 23456 LATIN SMALL LETTER U WITH GRAVE
+display \x00fa 12568 LATIN SMALL LETTER U WITH ACUTE
+display \x00fb 156 LATIN SMALL LETTER U WITH CIRCUMFLEX
+display \x00fc 1256 LATIN SMALL LETTER U WITH DIAERESIS
+display \x00fd 1348 LATIN SMALL LETTER Y WITH ACUTE
+display \x00fe 138 LATIN SMALL LETTER THORN
+display \x00ff 234568 LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/liblouis/tables/da-dk.dis b/liblouis/tables/da-dk.dis
new file mode 100644
index 0000000..21e2b2a
--- /dev/null
+++ b/liblouis/tables/da-dk.dis
@@ -0,0 +1,280 @@
+# Danish 8-dot Computer Braille Table 
+#
+#  Copyright (C) 2004-2008 ViewPlus Technologies, Inc. www.viewplus.com
+#  Copyright (C) 2004-2006 JJB Software, Inc. www.jjb-software.com
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+# by Mike Sivill - <mike.sivill@viewplustechnologies.com>
+
+#**** Display Codes
+display \s 0
+display \x0000 8	# space marker
+display \x0001 178
+display \x0002 1278
+display \x0003 1478
+display \x0004 14578
+display \x0005 24568
+display \x0006 12478
+display \x0007 124578
+display \x0008 12578
+display \x0009 2478
+display \x000A 678
+display \x000B 1368
+display \x000C 12378
+display \x000D 257
+display \x000E 134578
+display \x000F 12358
+display \x0010 123478
+display \x0011 1234578
+display \x0012 13568
+display \x0013 4578
+display \x0014 268
+display \x0015 13678
+display \x0016 278
+display \x0017 3578
+display \x0018 78
+display \x0019 68
+display \x001A 135678
+display \x001B 2678
+display \x001C 45678
+display \x001D 12368
+display \x001E 1234678
+display \x001F 235678
+display \x0020 2356 
+display \x0021 235	# !
+display \x0022 2356 	# Quote marks
+display \x0023 34568	# Number hash mark
+display \x0024 25678 	# $
+display \x0025 24578
+display \x0026 123468
+display \x0027 4	# Apostrophe
+display \x0028 2368	# left paren
+display \x0029 3568	# right paren
+display \x002A 35	# *
+display \x002B 2358	# +
+display \x002C 2	# ,
+display \x002D 368	# -
+display \x002E 3	# .
+display \x002F 348	# /
+display \x0030 2458	# zero
+display \x0031 18	# one
+display \x0032 128	# two
+display \x0033 148	# three
+display \x0034 1458	$ four
+display \x0035  168	$ five
+display \x0036 1248	# six
+display \x0037 12458	# seven
+display \x0038 125	# eight
+display \x0039 24	# nine
+display \x003A 25	# colon
+display \x003B 23	# semicolon
+display \x003C 358	# less than
+display \x003D 23568	# equals
+display \x003E 267	# greater than
+display \x003F 26	# question mark
+display \x0040 478	# at sign
+display \x0041 17	# A
+display \x0042 127 	# B
+display \x0043 147 	# C
+display \x0044 145 	# D
+display \x0045 157 	# E
+display \x0046 1247 	# F
+display \x0047 12457 	# G
+display \x0048 1257 	# H
+display \x0049 247 	# I
+display \x004A 2457 	# J
+display \x004B 137 	# K
+display \x004C 1237 	# L
+display \x004D 1347 	# M
+display \x004E 13457 	# N
+display \x004F 1357 	# O
+display \x0050 12347 	# P
+display \x0051 123457 	# Q
+display \x0052 12357 	# R
+display \x0053 2347 	# S
+display \x0054 23457 	# T
+display \x0055 1367 	# U
+display \x0056 12367 	# V
+display \x0057 24567 	# W
+display \x0058 13467 	# X
+display \x0059 134567 	# Y
+display \x005A 13567 	# Z
+display \x005B 23678	# left bracket
+display \x005C  347	# backslash
+display \x005D 35678	# right bracket
+display \x005E 12348	# caret
+display \x005F 3678	# underline
+display \x0060 5	# grave accent
+display \x0061 1 	# a
+display \x0062 12 	# b
+display \x0063 14 	# c 
+display \x0064 145 	# d
+display \x0065 15 	# e 
+display \x0066 124 	# f
+display \x0067 1245	# g
+display \x0068 125	# h
+display \x0069 24 	# i 
+display \x006A 245 	# j 
+display \x006B 13 	# k
+display \x006C 123 	# l
+display \x006D 134 	# m
+display \x006E 1345	# n
+display \x006F 135 	# o 
+display \x0070 1234	# p
+display \x0071 12345 	# q
+display \x0072 1235	# r
+display \x0073 234 	# s
+display \x0074 2345	# t
+display \x0075 136 	# u  
+display \x0076 1236 	# v
+display \x0077 2456 	# w
+display \x0078 1346 	# x
+display \x0079 13456 	# y
+display \x007A 1345 	# z
+display \x007B 123678	# left brace
+display \x007C 4568	# vertical bar
+display \x007D 345678	# right brace
+display \x007E 467	# tilde
+display \x007F 7	# del
+display \x20AC 1578	# euros
+display \x201A 457	# unknown
+display \x0192 58	# florin
+display \x201E 2378	# unknown
+display \x2026 6	# elipsis
+display \x2020 2357	# single dagger
+display \x2021 23578	# double dagger
+display \x02C6 5678	# unknown
+display \x2030 245678	# unknown
+display \x0260 23478	# unknown
+display \x2039 456	# unknown
+display \x0152 13578	# OE
+display \x017D 3467	# unknown
+display \x2018 47	# unknown apostrophe?
+display \x2019 48	# unknown apostrophe?
+display \x201C 237	# open double quote
+display \x201D 568	# close double quote
+display \x2022 37	# bullet
+display \x2013 36	# en dash
+display \x2014 367	# em dash
+display \x20DC 46	# tilde?
+display \x2122 234578	# trademark
+display \x0161 2348	# unknown
+display \x203A 4567	# unknown
+display \x0153 1358	# oe
+display \x017E 346	# unknown
+display \x0178 2345678	# unknown
+display \x00A0 0	# space
+display \x00A1 256	# inverted exclaim
+display \x00A2 2578	# cent sign
+display \x00A3 1238	# pounds sterling
+display \x00A4 2367	# ham (ng)
+display \x00A5 67	# yen
+display \x00A6 3478	# broken bar
+display \x00A7 578	# section
+display \x00A8 56	# diamond bullet
+display \x00A9 134678	# copyright 
+display \x00AA 234678	# superscript a
+display \x00AB 57	# left double angle bracket
+display \x00AC 34567	# optional hyphen
+display \x00AD 378	# unknown
+display \x00AE 123567	# registered
+display \x00AF 23567	# macron
+display \x00B0 356	# degrees
+display \x00B1 123458	# plus or minus
+display \x00B2 238	# superscript 2
+display \x00B3 258	# superscript 3
+display \x00B4 468	# unknown
+display \x00B5 236	# greek letter mu
+display \x00B6 1234568	# paragraph 
+display \x00B7 38	# space marker
+display \x00B8 4678	# cedilla
+display \x00B9 28        # superscript 1
+display \x00bA 12345678	# degrees
+display \x00bB 567	# right double angle bracket
+display \x00bC 13458	# one-fourth
+display \x00bD 458	# one-half
+display \x00bE 3456	# three-fourths
+display \x00bF 34	# inverted question
+display \x00C0 123567	# a grave
+display \x00C1 1235678	# a acute
+display \x00C2 1678	# a circumflex
+display \x00C3 14678	# a tilde
+display \x00C4 34578	# a umlaut
+display \x00C5 167	# A
+display \x00C6 3457	# AE
+display \x00C7 123467	# c cedilla
+display \x00C8 23467	# e grave
+display \x00C9 1234567	# e acute
+display \x00CA 1267	# e circumflex
+display \x00CB 12467	# e umlaut
+display \x00CC 15678	# i grave
+display \x00CD 12678	# i acute
+display \x00CE 1467	# i circumflex
+display \x00CF 124567	# i umlaut
+display \x00D0 1345678	# eth
+display \x00D1 1245678	# any
+display \x00D2 124678	# o grave
+display \x00D3 34678	# o acute
+display \x00D4 14567	# o circumflex
+display \x00D5 145678	# o tilde
+display \x00D6 24678	# o umlaut
+display \x00D7 13468	# times
+display \x00D8 2467	# O
+display \x00D9 234567	# u grave
+display \x00DA 125678	# u acute
+display \x00DB 1567	# u circumflex
+display \x00DC 12567	# u umlaut
+display \x00DD 13478	# y acute
+display \x00DE 1378	# arrow bullet
+display \x00DF 23468	# s-zet
+display \x00E0 12356	# lc a grave
+display \x00E1 123568	# lc a acute
+display \x00E2 168	# lc a circumflex
+display \x00E3 1468	# lc a tilde
+display \x00E4 3458	# lc a umlaut
+display \x00E5 16	# lc a
+display \x00E6 345	# lc ae
+display \x00E7 12346	# lc c cedilla
+display \x00E8 2346	# lc e grave
+display \x00E9 123456	# lc e acute
+display \x00EA 126	# lc e circumflex
+display \x00EB 1246	# lc e umlaut
+display \x00EC 1568	# lc i grave
+display \x00ED 1268	# lc i acute
+display \x00EE 146	# lc i circumflex
+display \x00EF 12456	# lc i umlaut
+display \x00F0 134568	# lc eth
+display \x00F1 124568	# lc any
+display \x00F2 12468	# lc o grave
+display \x00F3 3468	# lc o acute
+display \x00F4 1456	# lc o circumflex
+display \x00F5 14568	# lc o tilde
+display \x00F6 2468	# lc o umlaut
+display \x00F7 2568	# divided by
+display \x00F8 246	# lc o
+display \x00F9 23456	# lc u grave
+display \x00FA 12568	# lc u acute
+display \x00FB 156	# lc u circumflex
+display \x00FC 1256	# lc u umlaut
+display \x00FD 1348	# y acute
+display \x00FE 138	# thorn
+display \x00FF 234568	# unknown
+display \x0081 45	# unknown
+display \x008D 3567	# unknown
+display \x008F 27	# Oplosningstegn
+display \x0090 357	# unknown
diff --git a/liblouis/tables/da-lt.ctb b/liblouis/tables/da-lt.ctb
new file mode 100644
index 0000000..db2e1cf
--- /dev/null
+++ b/liblouis/tables/da-lt.ctb
@@ -0,0 +1,273 @@
+#
+# Copyright (C) 1995-2008 by The BRLTTY Developers.
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+# BRLTTY Text Table - Danish LogText (iso-8859-1)
+
+# Danish LogText users are accustomed to the percent sign (%) and the
+# exclamation point (!) being mapped to patterns which differ from the new 1252
+# standard. LogText users will be more comfortable with this table.
+
+# generated by ttbtest
+letter \x0000 12345678		NULL
+letter \x0001 178		START OF HEADING
+letter \x0002 1278		START OF TEXT
+letter \x0003 1478		END OF TEXT
+letter \x0004 14578		END OF TRANSMISSION
+letter \x0005 1578		ENQUIRY
+letter \x0006 12478		ACKNOWLEDGE
+letter \x0007 124578		BELL
+letter \x0008 12578		BACKSPACE
+space \t 2478		CHARACTER TABULATION
+space \n 24578		LINE FEED (LF)
+space \v 1378		LINE TABULATION
+space \f 12378		FORM FEED (FF)
+space \r 13478		CARRIAGE RETURN (CR)
+letter \x000e 134578		SHIFT OUT
+letter \x000f 13578		SHIFT IN
+letter \x0010 123478		DATA LINK ESCAPE
+letter \x0011 1234578		DEVICE CONTROL ONE
+letter \x0012 123578		DEVICE CONTROL TWO
+letter \x0013 23478		DEVICE CONTROL THREE
+letter \x0014 234578		DEVICE CONTROL FOUR
+letter \x0015 13678		NEGATIVE ACKNOWLEDGE
+letter \x0016 123678		SYNCHRONOUS IDLE
+letter \x0017 245678		END OF TRANSMISSION BLOCK
+letter \x0018 134678		CANCEL
+letter \x0019 1345678		END OF MEDIUM
+letter \x001a 135678		SUBSTITUTE
+letter \x001b 34578		ESCAPE
+letter \x001c 45678		INFORMATION SEPARATOR FOUR
+letter \x001d 278		INFORMATION SEPARATOR THREE
+letter \x001e 1234678		INFORMATION SEPARATOR TWO
+letter \x001f 235678		INFORMATION SEPARATOR ONE
+space \s 0		SPACE
+punctuation ! 56		EXCLAMATION MARK
+punctuation " 2356		QUOTATION MARK
+punctuation # 34568		NUMBER SIGN
+punctuation $ 1568		DOLLAR SIGN
+punctuation % 3568		PERCENT SIGN
+punctuation & 123468		AMPERSAND
+punctuation ' 6		APOSTROPHE
+punctuation ( 1268		LEFT PARENTHESIS
+punctuation ) 3458		RIGHT PARENTHESIS
+punctuation * 13468		ASTERISK
+punctuation + 2358		PLUS SIGN
+punctuation , 2		COMMA
+punctuation - 368		HYPHEN-MINUS
+punctuation . 3		FULL STOP
+punctuation / 258		SOLIDUS
+include digits8Dots.uti
+punctuation : 25		COLON
+punctuation ; 23		SEMICOLON
+punctuation < 1348		LESS-THAN SIGN
+punctuation = 23568		EQUALS SIGN
+punctuation > 2348		GREATER-THAN SIGN
+punctuation ? 26		QUESTION MARK
+punctuation @ 478		COMMERCIAL AT
+uppercase A 17		LATIN CAPITAL LETTER A
+uppercase B 127		LATIN CAPITAL LETTER B
+uppercase C 147		LATIN CAPITAL LETTER C
+uppercase D 1457		LATIN CAPITAL LETTER D
+uppercase E 157		LATIN CAPITAL LETTER E
+uppercase F 1247		LATIN CAPITAL LETTER F
+uppercase G 12457		LATIN CAPITAL LETTER G
+uppercase H 1257		LATIN CAPITAL LETTER H
+uppercase I 247		LATIN CAPITAL LETTER I
+uppercase J 2457		LATIN CAPITAL LETTER J
+uppercase K 137		LATIN CAPITAL LETTER K
+uppercase L 1237		LATIN CAPITAL LETTER L
+uppercase M 1347		LATIN CAPITAL LETTER M
+uppercase N 13457		LATIN CAPITAL LETTER N
+uppercase O 1357		LATIN CAPITAL LETTER O
+uppercase P 12347		LATIN CAPITAL LETTER P
+uppercase Q 123457		LATIN CAPITAL LETTER Q
+uppercase R 12357		LATIN CAPITAL LETTER R
+uppercase S 2347		LATIN CAPITAL LETTER S
+uppercase T 23457		LATIN CAPITAL LETTER T
+uppercase U 1367		LATIN CAPITAL LETTER U
+uppercase V 12367		LATIN CAPITAL LETTER V
+uppercase W 24567		LATIN CAPITAL LETTER W
+uppercase X 13467		LATIN CAPITAL LETTER X
+uppercase Y 134567		LATIN CAPITAL LETTER Y
+uppercase Z 13567		LATIN CAPITAL LETTER Z
+punctuation [ 12368		LEFT SQUARE BRACKET
+punctuation \\ 168		REVERSE SOLIDUS
+punctuation ] 14568		RIGHT SQUARE BRACKET
+punctuation ^ 67		CIRCUMFLEX ACCENT
+punctuation _ 78		LOW LINE
+punctuation ` 23567		GRAVE ACCENT
+lowercase a 1		LATIN SMALL LETTER A
+lowercase b 12		LATIN SMALL LETTER B
+lowercase c 14		LATIN SMALL LETTER C
+lowercase d 145		LATIN SMALL LETTER D
+lowercase e 15		LATIN SMALL LETTER E
+lowercase f 124		LATIN SMALL LETTER F
+lowercase g 1245		LATIN SMALL LETTER G
+lowercase h 125		LATIN SMALL LETTER H
+lowercase i 24		LATIN SMALL LETTER I
+lowercase j 245		LATIN SMALL LETTER J
+lowercase k 13		LATIN SMALL LETTER K
+lowercase l 123		LATIN SMALL LETTER L
+lowercase m 134		LATIN SMALL LETTER M
+lowercase n 1345		LATIN SMALL LETTER N
+lowercase o 135		LATIN SMALL LETTER O
+lowercase p 1234		LATIN SMALL LETTER P
+lowercase q 12345		LATIN SMALL LETTER Q
+lowercase r 1235		LATIN SMALL LETTER R
+lowercase s 234		LATIN SMALL LETTER S
+lowercase t 2345		LATIN SMALL LETTER T
+lowercase u 136		LATIN SMALL LETTER U
+lowercase v 1236		LATIN SMALL LETTER V
+lowercase w 2456		LATIN SMALL LETTER W
+lowercase x 1346		LATIN SMALL LETTER X
+lowercase y 13456		LATIN SMALL LETTER Y
+lowercase z 1356		LATIN SMALL LETTER Z
+punctuation { 2468		LEFT CURLY BRACKET
+punctuation | 4568		VERTICAL LINE
+punctuation } 1358		RIGHT CURLY BRACKET
+punctuation ~ 68		TILDE
+letter \x007f 8		DELETE
+letter \x0080 4		<control-0080>
+letter \x0081 45		<control-0081>
+letter \x0082 457		BREAK PERMITTED HERE
+letter \x0083 5		NO BREAK HERE
+letter \x0084 2378		<control-0084>
+letter \x0085 235		NEXT LINE (NEL)
+letter \x0086 2357		START OF SELECTED AREA
+letter \x0087 23578		END OF SELECTED AREA
+letter \x0088 5678		CHARACTER TABULATION SET
+letter \x0089 678		CHARACTER TABULATION WITH JUSTIFICATION
+letter \x008a 2368		LINE TABULATION SET
+letter \x008b 456		PARTIAL LINE FORWARD
+letter \x008c 347		PARTIAL LINE BACKWARD
+letter \x008d 3567		REVERSE LINE FEED
+letter \x008e 3467		SINGLE SHIFT TWO
+letter \x008f 27		SINGLE SHIFT THREE
+letter \x0090 357		DEVICE CONTROL STRING
+letter \x0091 47		PRIVATE USE ONE
+letter \x0092 48		PRIVATE USE TWO
+letter \x0093 237		SET TRANSMIT STATE
+letter \x0094 568		CANCEL CHARACTER
+letter \x0095 37		MESSAGE WAITING
+letter \x0096 36		START OF GUARDED AREA
+letter \x0097 367		END OF GUARDED AREA
+letter \x0098 46		START OF STRING
+letter \x0099 257		<control-0099>
+letter \x009a 34		SINGLE CHARACTER INTRODUCER
+letter \x009b 4567		CONTROL SEQUENCE INTRODUCER
+letter \x009c 467		STRING TERMINATOR
+letter \x009d 23458		OPERATING SYSTEM COMMAND
+letter \x009e 346		PRIVACY MESSAGE
+letter \x009f 2345678		APPLICATION PROGRAM COMMAND
+punctuation \x00a0 0		NO-BREAK SPACE
+punctuation \x00a1 256		INVERTED EXCLAMATION MARK
+punctuation \x00a2 2578		CENT SIGN
+punctuation \x00a3 1238		POUND SIGN
+punctuation \x00a4 2367		CURRENCY SIGN
+punctuation \x00a5 25678		YEN SIGN
+punctuation \x00a6 3478		BROKEN BAR
+punctuation \x00a7 578		SECTION SIGN
+punctuation \x00a8 23678		DIAERESIS
+punctuation \x00a9 345678		COPYRIGHT SIGN
+letter \x00aa 234678		FEMININE ORDINAL INDICATOR
+punctuation \x00ab 57		LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+punctuation \x00ac 34567		NOT SIGN
+punctuation \x00ad 378		SOFT HYPHEN
+punctuation \x00ae 4578		REGISTERED SIGN
+punctuation \x00af 267		MACRON
+punctuation \x00b0 356		DEGREE SIGN
+punctuation \x00b1 123458		PLUS-MINUS SIGN
+punctuation \x00b2 238		SUPERSCRIPT TWO
+punctuation \x00b3 12348		SUPERSCRIPT THREE
+punctuation \x00b4 468		ACUTE ACCENT
+lowercase \x00b5 236		MICRO SIGN
+punctuation \x00b6 1234568		PILCROW SIGN
+punctuation \x00b7 38		MIDDLE DOT
+punctuation \x00b8 4678		CEDILLA
+punctuation \x00b9 28		SUPERSCRIPT ONE
+letter \x00ba 7		MASCULINE ORDINAL INDICATOR
+punctuation \x00bb 567		RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+punctuation \x00bc 13458		VULGAR FRACTION ONE QUARTER
+punctuation \x00bd 458		VULGAR FRACTION ONE HALF
+punctuation \x00be 3456		VULGAR FRACTION THREE QUARTERS
+punctuation \x00bf 348		INVERTED QUESTION MARK
+uppercase \x00c0 123567		LATIN CAPITAL LETTER A WITH GRAVE
+uppercase \x00c1 1235678		LATIN CAPITAL LETTER A WITH ACUTE
+uppercase \x00c2 1678		LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+uppercase \x00c3 14678		LATIN CAPITAL LETTER A WITH TILDE
+uppercase \x00c4 358		LATIN CAPITAL LETTER A WITH DIAERESIS
+uppercase \x00c5 167		LATIN CAPITAL LETTER A WITH RING ABOVE
+uppercase \x00c6 3457		LATIN CAPITAL LETTER AE
+uppercase \x00c7 123467		LATIN CAPITAL LETTER C WITH CEDILLA
+uppercase \x00c8 23467		LATIN CAPITAL LETTER E WITH GRAVE
+uppercase \x00c9 1234567		LATIN CAPITAL LETTER E WITH ACUTE
+uppercase \x00ca 1267		LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+uppercase \x00cb 12467		LATIN CAPITAL LETTER E WITH DIAERESIS
+uppercase \x00cc 15678		LATIN CAPITAL LETTER I WITH GRAVE
+uppercase \x00cd 12678		LATIN CAPITAL LETTER I WITH ACUTE
+uppercase \x00ce 1467		LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+uppercase \x00cf 124567		LATIN CAPITAL LETTER I WITH DIAERESIS
+uppercase \x00d0 35678		LATIN CAPITAL LETTER ETH
+uppercase \x00d1 1245678		LATIN CAPITAL LETTER N WITH TILDE
+uppercase \x00d2 124678		LATIN CAPITAL LETTER O WITH GRAVE
+uppercase \x00d3 34678		LATIN CAPITAL LETTER O WITH ACUTE
+uppercase \x00d4 14567		LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+uppercase \x00d5 145678		LATIN CAPITAL LETTER O WITH TILDE
+uppercase \x00d6 24678		LATIN CAPITAL LETTER O WITH DIAERESIS
+punctuation \x00d7 13568		MULTIPLICATION SIGN
+uppercase \x00d8 2467		LATIN CAPITAL LETTER O WITH STROKE
+uppercase \x00d9 234567		LATIN CAPITAL LETTER U WITH GRAVE
+uppercase \x00da 125678		LATIN CAPITAL LETTER U WITH ACUTE
+uppercase \x00db 1567		LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+uppercase \x00dc 12567		LATIN CAPITAL LETTER U WITH DIAERESIS
+uppercase \x00dd 3578		LATIN CAPITAL LETTER Y WITH ACUTE
+uppercase \x00de 2678		LATIN CAPITAL LETTER THORN
+lowercase \x00df 23468		LATIN SMALL LETTER SHARP S
+lowercase \x00e0 12356		LATIN SMALL LETTER A WITH GRAVE
+lowercase \x00e1 123568		LATIN SMALL LETTER A WITH ACUTE
+lowercase \x00e2 268		LATIN SMALL LETTER A WITH CIRCUMFLEX
+lowercase \x00e3 1468		LATIN SMALL LETTER A WITH TILDE
+lowercase \x00e4 58		LATIN SMALL LETTER A WITH DIAERESIS
+lowercase \x00e5 16		LATIN SMALL LETTER A WITH RING ABOVE
+lowercase \x00e6 345		LATIN SMALL LETTER AE
+lowercase \x00e7 12346		LATIN SMALL LETTER C WITH CEDILLA
+lowercase \x00e8 2346		LATIN SMALL LETTER E WITH GRAVE
+lowercase \x00e9 123456		LATIN SMALL LETTER E WITH ACUTE
+lowercase \x00ea 126		LATIN SMALL LETTER E WITH CIRCUMFLEX
+lowercase \x00eb 1246		LATIN SMALL LETTER E WITH DIAERESIS
+lowercase \x00ec 3678		LATIN SMALL LETTER I WITH GRAVE
+lowercase \x00ed 1368		LATIN SMALL LETTER I WITH ACUTE
+lowercase \x00ee 146		LATIN SMALL LETTER I WITH CIRCUMFLEX
+lowercase \x00ef 12456		LATIN SMALL LETTER I WITH DIAERESIS
+lowercase \x00f0 134568		LATIN SMALL LETTER ETH
+lowercase \x00f1 124568		LATIN SMALL LETTER N WITH TILDE
+lowercase \x00f2 12468		LATIN SMALL LETTER O WITH GRAVE
+lowercase \x00f3 3468		LATIN SMALL LETTER O WITH ACUTE
+lowercase \x00f4 1456		LATIN SMALL LETTER O WITH CIRCUMFLEX
+lowercase \x00f5 12358		LATIN SMALL LETTER O WITH TILDE
+lowercase \x00f6 35		LATIN SMALL LETTER O WITH DIAERESIS
+punctuation \x00f7 2568		DIVISION SIGN
+lowercase \x00f8 246		LATIN SMALL LETTER O WITH STROKE
+lowercase \x00f9 23456		LATIN SMALL LETTER U WITH GRAVE
+lowercase \x00fa 12568		LATIN SMALL LETTER U WITH ACUTE
+lowercase \x00fb 156		LATIN SMALL LETTER U WITH CIRCUMFLEX
+lowercase \x00fc 1256		LATIN SMALL LETTER U WITH DIAERESIS
+lowercase \x00fd 24568		LATIN SMALL LETTER Y WITH ACUTE
+lowercase \x00fe 138		LATIN SMALL LETTER THORN
+lowercase \x00ff 234568		LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/liblouis/tables/da.tbl b/liblouis/tables/da.tbl
new file mode 100644
index 0000000..7ebd482
--- /dev/null
+++ b/liblouis/tables/da.tbl
@@ -0,0 +1,17 @@
+#+locale:da
+#+type:literary
+#+contraction:full
+#+grade:2
+#+dots:6
+
+# TODO: Please correct the metadata above. It is not meant to be
+# accurate nor complete. It hasn't been verified by the table
+# author yet. It is merely an attempt by the liblouis maintainers
+# to get some sensible initial values in place.
+
+# TODO: Please add a reference to official documentation about
+# the implemented braille code. Preferably submit the documents
+# to https://github.com/liblouis/braille-specs.
+
+include da-dk-g26.ctb
+include braille-patterns.cti
diff --git a/liblouis/tables/de-ch-accents.cti b/liblouis/tables/de-ch-accents.cti
new file mode 100644
index 0000000..f950660
--- /dev/null
+++ b/liblouis/tables/de-ch-accents.cti
@@ -0,0 +1,63 @@
+# liblouis: Letters with accents (without ä ö ü)
+#
+#  Copyright (C) 2009 SBS Schweizerische Bibliothek für Blinde und Sehbehinderte
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#-------------------------------------------------------------------------------
+#
+#  Letters with accents (without ä ö ü) - Switzerland
+#
+#  Version 11-17-09
+#  christian.waldvogel@sbszh.ch
+#
+#-------------------------------------------------------------------------------
+
+uplow Àà 4-12356 \x00C0 &#192;  LATIN CAPITAL LETTER A WITH GRAVE
+#            Áá                     \x00C1 &#193;  LATIN CAPITAL LETTER A WITH ACUTE
+uplow Ââ 4-16 \x00C2 &#194;  LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+#            Ãã                     \x00C3 &#195;  LATIN CAPITAL LETTER A WITH TILDE
+
+#            Åå                     \x00C5 &#197;  LATIN CAPITAL LETTER A WITH RING ABOVE
+#            Ææ                     \x00C6 &#198;  LATIN CAPITAL LETTER AE
+uplow Çç 4-12346 \x00C7 &#199;  LATIN CAPITAL LETTER C WITH CEDILLA
+uplow Èè 4-2346 \x00C8 &#200;  LATIN CAPITAL LETTER E WITH GRAVE
+uplow Éé 4-123456 \x00C9 &#201;  LATIN CAPITAL LETTER E WITH ACUTE
+uplow Êê 4-126 \x00CA &#202;  LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+uplow Ëë 4-1246 \x00CB &#203;  LATIN CAPITAL LETTER E WITH DIAERESIS
+uplow Ìì 4-34 \x00CC &#204;  LATIN CAPITAL LETTER I WITH GRAVE
+#            Íí                     \x00CD &#205;  LATIN CAPITAL LETTER I WITH ACUTE
+uplow Îî 4-146 \x00CE &#206;  LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+uplow Ïï 4-12456 \x00CF &#207;  LATIN CAPITAL LETTER I WITH DIAERESIS
+#            Ðð                     \x00D0 &#208;  LATIN CAPITAL LETTER ETH
+#            Ññ                     \x00D1 &#209;  LATIN CAPITAL LETTER N WITH TILDE
+uplow Òò 4-346 \x00D2 &#210;  LATIN CAPITAL LETTER O WITH GRAVE
+#            Óó                     \x00D3 &#211;  LATIN CAPITAL LETTER O WITH ACUTE
+uplow Ôô 4-1456 \x00D4 &#212;  LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+#            Õõ                     \x00D5 &#213;  LATIN CAPITAL LETTER O WITH TILDE
+
+#            Øø                     \x00D8 &#216;  LATIN CAPITAL LETTER O WITH STROKE
+uplow Ùù 4-23456 \x00D9 &#217;  LATIN CAPITAL LETTER U WITH GRAVE
+#            Úú                     \x00DA &#218;  LATIN CAPITAL LETTER U WITH ACUTE
+uplow Ûû 4-156 \x00DB &#219;  LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+
+#            Ýý                     \x00DD &#221;  LATIN CAPITAL LETTER Y WITH ACUTE
+#            Þþ                     \x00DE &#222;  LATIN CAPITAL LETTER THORN
+
+#            ÿ      134568          \x00FF &#255;  LATIN SMALL LETTER Y WITH DIAERESIS
+
+#            \x0152\x0153  OE              &#338;  LATIN CAPITAL LIGATURE OE
diff --git a/liblouis/tables/de-ch-g0.utb b/liblouis/tables/de-ch-g0.utb
new file mode 100644
index 0000000..8e34a2a
--- /dev/null
+++ b/liblouis/tables/de-ch-g0.utb
@@ -0,0 +1,35 @@
+# liblouis: Swiss German Grade 0 Braille
+#
+#  Copyright (C) 2009 SBS Schweizerische Bibliothek für Blinde und Sehbehinderte
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#-------------------------------------------------------------------------------
+#
+#  DEUTSCHE BASISSCHRIFT - German Grade 0 Braille - Switzerland
+#
+#  Version 11-17-09
+#  christian.waldvogel@sbszh.ch
+#
+#-------------------------------------------------------------------------------
+
+
+include de-eurobrl6u.dis
+include de-chardefs6.cti
+include de-ch-accents.cti
+include de-de-accents.cti
+include de-g0-core.uti
diff --git a/liblouis/tables/de-ch-g1.ctb b/liblouis/tables/de-ch-g1.ctb
new file mode 100644
index 0000000..a5edf5f
--- /dev/null
+++ b/liblouis/tables/de-ch-g1.ctb
@@ -0,0 +1,32 @@
+# liblouis: Swiss German Grade 1 Braille
+#
+#  Copyright (C) 2009 SBS Schweizerische Bibliothek für Blinde und Sehbehinderte
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#-------------------------------------------------------------------------------
+#
+#  DEUTSCHE VOLLSCHRIFT - German Grade 1 Braille - Switzerland
+#
+#  Version 11-17-09
+#  christian.waldvogel@sbszh.ch
+#
+#-------------------------------------------------------------------------------
+
+
+include de-ch-g0.utb
+include de-g1-core.cti
diff --git a/liblouis/tables/de-ch-g2.ctb b/liblouis/tables/de-ch-g2.ctb
new file mode 100644
index 0000000..b75db16
--- /dev/null
+++ b/liblouis/tables/de-ch-g2.ctb
@@ -0,0 +1,33 @@
+# liblouis: Swiss German Grade 2 Braille
+#
+#  Copyright (C) 2009 SBS Schweizerische Bibliothek für Blinde und Sehbehinderte
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#-------------------------------------------------------------------------------
+#
+#  DEUTSCHE KURZSCHRIFT - German Grade 2 Braille - Switzerland
+#
+#  Version 11-17-09
+#  christian.waldvogel@sbszh.ch
+#
+#-------------------------------------------------------------------------------
+
+
+include de-ch-g0.utb
+letsign 6
+include de-g2-core.cti
diff --git a/liblouis/tables/de-chardefs6.cti b/liblouis/tables/de-chardefs6.cti
new file mode 100644
index 0000000..90344e1
--- /dev/null
+++ b/liblouis/tables/de-chardefs6.cti
@@ -0,0 +1,245 @@
+# liblouis: Character definitions for german tables
+#
+#  Copyright (C) 2009 SBS Schweizerische Bibliothek für Blinde und Sehbehinderte
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#-------------------------------------------------------------------------------
+#
+#  Character definitions for german tables
+#
+#  Version 2009-11-19
+#  christian.waldvogel@sbszh.ch
+#
+#-------------------------------------------------------------------------------
+
+
+# ===== BASIC LATIN - 0000-007F ================================================
+
+space         \x0009 0               #9     [CHARACTER TABULATION]
+space         \x000A 0               #10    [LINE FEED (LF)]
+space         \x000C 0               #12    [FORM FEED (FF)]
+space         \x000D 0               #13    [CARRIAGE RETURN (CR)]
+
+space         \x0020 0               #32    SPACE
+punctuation   \x0021 5               #33    ! EXCLAMATION MARK
+punctuation   \x0022 4               #34    " QUOTATION MARK
+sign          \x0023 3456            #35    # NUMBER SIGN
+sign          \x0024 46              #36    $ DOLLAR SIGN
+sign          \x0025 123456          #37    % PERCENT SIGN
+sign          \x0026 12346           #38    & AMPERSAND
+punctuation   \x0027 6               #39    ' APOSTROPHE APOSTROPHE-QUOTE
+punctuation   \x0028 236             #40    ( LEFT PARENTHESIS
+punctuation   \x0029 356             #41    ) RIGHT PARENTHESIS
+sign          \x002A 35              #42    * ASTERISK
+math          \x002B 235             #43    + PLUS SIGN
+punctuation   \x002C 2               #44    , COMMA
+punctuation   \x002D 36              #45    - HYPHEN-MINUS
+punctuation   \x002E 3               #46    . FULL STOP PERIOD
+sign          \x002F 256             #47    / SOLIDUS SLASH
+include digits6DotsPlusDot6.uti
+punctuation   \x003A 25              #58    : COLON
+punctuation   \x003B 23              #59    ; SEMICOLON
+math          \x003C 56              #60    < LESS-THAN SIGN
+math          \x003D 2356            #61    = EQUALS SIGN
+math          \x003E 45              #62    > GREATER-THAN SIGN
+punctuation   \x003F 26              #63    ? QUESTION MARK
+
+include latinLetterDef6Dots.uti
+
+sign          \x0060 345             #96    `  GRAVE ACCENT
+punctuation   \x007B 12356           #123   {  LEFT CURLY BRACKET
+sign          \x007C 34              #124   |  VERTICAL LINE
+punctuation   \x007D 23456           #125   }  RIGHT CURLY BRACKET
+sign          \x007E 2346            #126   ~  TILDE
+sign          \x007F 456             #127   [DELETE]
+
+sign          \x0040 4-345           #64    @  COMMERCIAL AT
+punctuation   \x005B 6-2356          #91    [  LEFT SQUARE BRACKET
+sign          \x005C 4-34            #92    \  REVERSE SOLIDUS
+punctuation   \x005D 6-2356          #93    ]  RIGHT SQUARE BRACKET
+sign          \x005E 4-2346          #94    ^  CIRCUMFLEX ACCENT
+sign          \x005F 4-456           #95    _  LOW LINE
+
+# ===== LATIN-1 SUPPLEMENT: 0080-00FF ==========================================
+
+space         \x00A0 0               #160   NO-BREAK SPACE
+punctuation   \x00A1 0               #161   ¡ INVERTED EXCLAMATION MARK
+sign          \x00A2 4-14            #162   ¢ CENT SIGN
+sign          \x00A3 4-123           #163   £ POUND SIGN
+sign          \x00A4 0               #164   ¤ CURRENCY SIGN
+sign          \x00A5 4-13456         #165   ¥ YEN SIGN
+sign          \x00A6 0-456-123-0     #166   ¦ BROKEN BAR
+sign          \x00A7 4-346           #167   § SECTION SIGN
+sign          \x00A8 0               #168   ¨ DIAERESIS
+sign          \x00A9 2356-45-14-2356 #169   © COPYRIGHT SIGN
+lowercase     \x00AA 1               #170   ª FEMININE ORDINAL INDICATOR
+punctuation   \x00AB 236             #171   « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+sign          \x00AC 0               #172   ¬ NOT SIGN
+sign          \x00AD 0               #173   ­ SOFT HYPHEN
+sign          \x00AE 2356-45-1235-2356   #174 ® REGISTERED SIGN
+sign          \x00AF 0               #175   ¯ MACRON
+sign          \x00B0 4-356           #176   ° DEGREE SIGN
+math          \x00B1 235-36          #177   ± PLUS-MINUS SIGN
+sign          \x00B2 0               #178   ² SUPERSCRIPT TWO
+sign          \x00B3 0               #179   ³ SUPERSCRIPT THREE
+sign          \x00B4 0               #180   ´ ACUTE ACCENT
+sign          \x00B5 56-134          #181   µ MICRO SIGN
+sign          \x00B6 0               #182   ¶ PILCROW SIGN
+sign          \x00B7 0               #183   · MIDDLE DOT
+sign          \x00B8 0               #184   ¸ CEDILLA
+sign          \x00B9 0               #185   ¹ SUPERSCRIPT ONE
+lowercase     \x00BA 135             #186   º MASCULINE ORDINAL INDICATOR
+punctuation   \x00BB 356             #187   » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+math          \x00BC 3456-1-256      #188   ¼ VULGAR FRACTION ONE QUARTER
+math          \x00BD 3456-1-23       #189   ½ VULGAR FRACTION ONE HALF
+math          \x00BE 3456-14-256     #190   ¾ VULGAR FRACTION THREE QUARTERS
+punctuation   \x00BF 0               #191   ¿ INVERTED QUESTION MARK
+uplow         \x00C4\x00E4  345      #196 #228  Ää LATIN CAPITAL LETTER A WITH DIAERESIS
+uplow         \x00D6\x00F6  246      #214 #246  Öö LATIN CAPITAL LETTER O WITH DIAERESIS
+math          \x00D7 236             #215   × MULTIPLICATION SIGN
+uplow         \x00DC\x00FC  1256     #220 #252   Üü LATIN CAPITAL LETTER U WITH DIAERESIS
+lowercase     \x00DF 2346            #223   ß LATIN SMALL LETTER SHARP S
+math          \x00F7 0               #247   ÷ DIVISION SIGN
+
+# ===== GENERAL PUNCTUATION: 2000-206F =========================================
+
+punctuation   \x2013 6-36            #8211          EN DASH
+punctuation   \x2014 6-36            #8212          EM DASH
+punctuation   \x2018 6-236           #8216          LEFT SINGLE QUOTATION MARK
+punctuation   \x2019 6-356           #8217          RIGHT SINGLE QUOTATION MARK
+punctuation   \x201A 6-236           #8218          SINGLE LOW-9 QUOTATION MARK
+punctuation   \x201B 6-356           #8219          SINGLE HIGH-REVERSED-9 QUOTATION MARK
+punctuation   \x201C 236             #8220          LEFT DOUBLE QUOTATION MARK
+punctuation   \x201D 356             #8221          RIGHT DOUBLE QUOTATION MARK
+punctuation   \x201E 236             #8222          DOUBLE LOW-9 QUOTATION MARK
+punctuation   \x201F 356             #8223          DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+sign          \x2030 3456-245-356-356      #8240    PER MILLE SIGN
+sign          \x2031 3456-245-356-356-356  #8241    PER TEN THOUSAND SIGN
+sign          \x2032 4-35            #8242          PRIME
+sign          \x2033 4-35-35         #8243          DOUBLE PRIME
+punctuation   \x2039 6-236                          SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+punctuation   \x203a 6-356                          SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+
+# ===== CURRENCY SYMBOLS: 20A0-20CF ============================================
+
+sign          \x20A0 4-15                           EURO-CURRENCY SIGN
+
+# ===== NUMBER FORMS: 2150-218F ================================================
+
+math          \x2153 3456-1-25               VULGAR FRACTION ONE THIRD
+math          \x2154 3456-12-23              VULGAR FRACTION TWO THIRDS
+math          \x2155 3456-1-26               VULGAR FRACTION ONE FIFTH
+math          \x2156 3456-12-26              VULGAR FRACTION TWO FIFTHS
+math          \x2157 3456-14-26              VULGAR FRACTION THREE FIFTHS
+math          \x2158 3456-145-26             VULGAR FRACTION FOUR FIFTHS
+math          \x2159 3456-1-235              VULGAR FRACTION ONE SIXTH
+math          \x215a 3456-15-235             VULGAR FRACTION FIVE SIXTHS
+math          \x215b 3456-1-236              VULGAR FRACTION ONE EIGHTH
+math          \x215c 3456-14-236             VULGAR FRACTION THREE EIGHTHS
+math          \x215d 3456-15-236             VULGAR FRACTION FIVE EIGHTHS
+math          \x215e 3456-1245-236           VULGAR FRACTION SEVEN EIGHTHS
+
+# ===== ARROWS: 2190-21FF ======================================================
+
+sign          \x2190 0-246-25-25-0           LEFTWARDS ARROW
+sign          \x2192 0-25-25-135-0           RIGHTWARDS ARROW
+sign          \x2194 0-246-25-25-135-0       LEFT RIGHT ARROW
+
+# ===== MATHEMATICAL OPERATORS: 2200-22FF ======================================
+
+math          \x2212 36              #8722   MINUS SIGN
+math          \x2215 25              #8725   DIVISION SLASH
+math          \x2217 35              #8727   ASTERISK OPERATOR
+math          \x223C 25-25           #8764   TILDE OPERATOR
+math          \x2245 26-26           #8773   APPROXIMATELY EQUAL TO
+math          \x2259 26              #8793   ESTIMATES
+math          \x2260 35-2356         #8800   NOT EQUAL TO
+math          \x2261 2356-2356       #8801   IDENTICAL TO
+math          \x2264 246-2356        #8804   LESS-THAN OR EQUAL TO
+math          \x2265 135-2356        #8805   GREATER-THAN OR EQUAL TO
+math          \x2266 246-2356        #8806   LESS-THAN OVER EQUAL TO
+math          \x2267 135-2356        #8807   GREATER-THAN OVER EQUAL TO
+math          \x22c5 3               #8901   DOT OPERATOR
+math          \x22c6 3               #8902   STAR OPERATOR
+
+# ===== BRAILLE PATTERNS: 2800-28FF ============================================
+
+space         \x2800 0               #10240  BRAILLE PATTERN BLANK
+sign          \x2801 1               #10241  BRAILLE PATTERN DOTS-1
+sign          \x2802 2               #10242  BRAILLE PATTERN DOTS-2
+sign          \x2803 12              #10243  BRAILLE PATTERN DOTS-12
+sign          \x2804 3               #10244  BRAILLE PATTERN DOTS-3
+sign          \x2805 13              #10245  BRAILLE PATTERN DOTS-13
+sign          \x2806 23              #10246  BRAILLE PATTERN DOTS-23
+sign          \x2807 123             #10247  BRAILLE PATTERN DOTS-123
+sign          \x2808 4               #10248  BRAILLE PATTERN DOTS-4
+sign          \x2809 14              #10249  BRAILLE PATTERN DOTS-14
+sign          \x280a 24              #10250  BRAILLE PATTERN DOTS-24
+sign          \x280b 124             #10251  BRAILLE PATTERN DOTS-124
+sign          \x280c 34              #10252  BRAILLE PATTERN DOTS-34
+sign          \x280d 134             #10253  BRAILLE PATTERN DOTS-134
+sign          \x280e 234             #10254  BRAILLE PATTERN DOTS-234
+sign          \x280f 1234            #10255  BRAILLE PATTERN DOTS-1234
+sign          \x2810 5               #10256  BRAILLE PATTERN DOTS-5
+sign          \x2811 15              #10257  BRAILLE PATTERN DOTS-15
+sign          \x2812 25              #10258  BRAILLE PATTERN DOTS-25
+sign          \x2813 125             #10259  BRAILLE PATTERN DOTS-125
+sign          \x2814 35              #10260  BRAILLE PATTERN DOTS-35
+sign          \x2815 135             #10261  BRAILLE PATTERN DOTS-135
+sign          \x2816 235             #10262  BRAILLE PATTERN DOTS-235
+sign          \x2817 1235            #10263  BRAILLE PATTERN DOTS-1235
+sign          \x2818 45              #10264  BRAILLE PATTERN DOTS-45
+sign          \x2819 145             #10265  BRAILLE PATTERN DOTS-145
+sign          \x281a 245             #10266  BRAILLE PATTERN DOTS-245
+sign          \x281b 1245            #10267  BRAILLE PATTERN DOTS-1245
+sign          \x281c 345             #10268  BRAILLE PATTERN DOTS-345
+sign          \x281d 1345            #10269  BRAILLE PATTERN DOTS-1345
+sign          \x281e 2345            #10270  BRAILLE PATTERN DOTS-2345
+sign          \x281f 12345           #10271  BRAILLE PATTERN DOTS-12345
+sign          \x2820 6               #10272  BRAILLE PATTERN DOTS-6
+sign          \x2821 16              #10273  BRAILLE PATTERN DOTS-16
+sign          \x2822 26              #10274  BRAILLE PATTERN DOTS-26
+sign          \x2823 126             #10275  BRAILLE PATTERN DOTS-126
+sign          \x2824 36              #10276  BRAILLE PATTERN DOTS-36
+sign          \x2825 136             #10277  BRAILLE PATTERN DOTS-136
+sign          \x2826 236             #10278  BRAILLE PATTERN DOTS-236
+sign          \x2827 1236            #10279  BRAILLE PATTERN DOTS-1236
+sign          \x2828 46              #10280  BRAILLE PATTERN DOTS-46
+sign          \x2829 146             #10281  BRAILLE PATTERN DOTS-146
+sign          \x282a 246             #10282  BRAILLE PATTERN DOTS-246
+sign          \x282b 1246            #10283  BRAILLE PATTERN DOTS-1246
+sign          \x282c 346             #10284  BRAILLE PATTERN DOTS-346
+sign          \x282d 1346            #10285  BRAILLE PATTERN DOTS-1346
+sign          \x282e 2346            #10286  BRAILLE PATTERN DOTS-2346
+sign          \x282f 12346           #10287  BRAILLE PATTERN DOTS-12346
+sign          \x2830 56              #10288  BRAILLE PATTERN DOTS-56
+sign          \x2831 156             #10289  BRAILLE PATTERN DOTS-156
+sign          \x2832 256             #10290  BRAILLE PATTERN DOTS-256
+sign          \x2833 1256            #10291  BRAILLE PATTERN DOTS-1256
+sign          \x2834 356             #10292  BRAILLE PATTERN DOTS-356
+sign          \x2835 1356            #10293  BRAILLE PATTERN DOTS-1356
+sign          \x2836 2356            #10294  BRAILLE PATTERN DOTS-2356
+sign          \x2837 12356           #10295  BRAILLE PATTERN DOTS-12356
+sign          \x2838 456             #10296  BRAILLE PATTERN DOTS-456
+sign          \x2839 1456            #10297  BRAILLE PATTERN DOTS-1456
+sign          \x283a 2456            #10298  BRAILLE PATTERN DOTS-2456
+sign          \x283b 12456           #10299  BRAILLE PATTERN DOTS-12456
+sign          \x283c 3456            #10300  BRAILLE PATTERN DOTS-3456
+sign          \x283d 13456           #10301  BRAILLE PATTERN DOTS-13456
+sign          \x283e 23456           #10302  BRAILLE PATTERN DOTS-23456
+sign          \x283f 123456          #10303  BRAILLE PATTERN DOTS-123456
diff --git a/liblouis/tables/de-chardefs8.cti b/liblouis/tables/de-chardefs8.cti
new file mode 100644
index 0000000..2c3a92a
--- /dev/null
+++ b/liblouis/tables/de-chardefs8.cti
@@ -0,0 +1,278 @@
+# liblouis: Character definitions for german tables
+#
+#  Copyright (C) 2009 SBS Schweizerische Bibliothek für Blinde und Sehbehinderte
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#-------------------------------------------------------------------------------
+#
+#  EUROBRAILLE
+#  This computer braille table is widely
+#  being used in german speaking parts of europe
+#
+#  Version 2009-11-19
+#  christian.waldvogel@sbszh.ch
+#
+#-------------------------------------------------------------------------------
+
+#                   34578           \x0000 &#0;    <control> [NULL]
+#                   178             \x0001 &#1;    <control> [START OF HEADING]
+#                   1278            \x0002 &#2;    <control> [START OF TEXT]
+#                   1478            \x0003 &#3;    <control> [END OF TEXT]
+#                   14578           \x0004 &#4;    <control> [END OF TRANSMISSION]
+#                   1578            \x0005 &#5;    <control> [ENQUIRY]
+#                   12478           \x0006 &#6;    <control> [ACKNOWLEDGE]
+#                   124578          \x0007 &#7;    <control> [BELL]
+#                   12578           \x0008 &#8;    <control> [BACKSPACE]
+#                   2478            \x0009 &#9;    <control> [CHARACTER TABULATION]
+#                   24578           \x000A &#10;   <control> [LINE FEED (LF)]
+#                   1378            \x000B &#11;   <control> [LINE TABULATION]
+#                   12378           \x000C &#12;   <control> [FORM FEED (FF)]
+#                   13478           \x000D &#13;   <control> [CARRIAGE RETURN (CR)]
+#                   134578          \x000E &#14;   <control> [SHIFT OUT]
+#                   13578           \x000F &#15;   <control> [SHIFT IN]
+#                   123478          \x0010 &#16;   <control> [DATA LINK ESCAPE]
+#                   1234578         \x0011 &#17;   <control> [DEVICE CONTROL ONE]
+#                   123578          \x0012 &#18;   <control> [DEVICE CONTROL TWO]
+#                   23478           \x0013 &#19;   <control> [DEVICE CONTROL THREE]
+#                   234578          \x0014 &#20;   <control> [DEVICE CONTROL FOUR]
+#                   13678           \x0015 &#21;   <control> [NEGATIVE ACKNOWLEDGE]
+#                   123678          \x0016 &#22;   <control> [SYNCHRONOUS IDLE]
+#                   245678          \x0017 &#23;   <control> [END OF TRANSMISSION BLOCK]
+#                   134678          \x0018 &#24;   <control> [CANCEL]
+#                   1345678         \x0019 &#25;   <control> [END OF MEDIUM]
+#                   135678          \x001A &#26;   <control> [SUBSTITUTE]
+#                   1235678         \x001B &#27;   <control> [ESCAPE]
+#                   3478            \x001C &#28;   <control> [INFORMATION SEPARATOR FOUR]
+#                   2345678         \x001D &#29;   <control> [INFORMATION SEPARATOR THREE]
+#                   234678          \x001E &#30;   <control> [INFORMATION SEPARATOR TWO]
+#                   45678           \x001F &#31;   <control> [INFORMATION SEPARATOR ONE]
+space        \s     0               \x0020 &#32;   SPACE
+punctuation  !      5               \x0021 &#33;   EXCLAMATION MARK
+punctuation  "      4               \x0022 &#34;   QUOTATION MARK
+sign         #      3456            \x0023 &#35;   NUMBER SIGN
+sign         $      46              \x0024 &#36;   DOLLAR SIGN
+sign         %      123456          \x0025 &#37;   PERCENT SIGN
+sign         &      12346           \x0026 &#38;   AMPERSAND
+punctuation  '      6               \x0027 &#39;   APOSTROPHE APOSTROPHE-QUOTE
+punctuation  (      236             \x0028 &#40;   LEFT PARENTHESIS
+punctuation  )      356             \x0029 &#41;   RIGHT PARENTHESIS
+sign         *      35              \x002A &#42;   ASTERISK
+math         +      235             \x002B &#43;   PLUS SIGN
+punctuation  ,      2               \x002C &#44;   COMMA
+punctuation  -      36              \x002D &#45;   HYPHEN-MINUS
+punctuation  .      3               \x002E &#46;   FULL STOP PERIOD
+punctuation  /      256             \x002F &#47;   SOLIDUS SLASH
+include digits6DotsPlusDot6.uti
+punctuation  :      25              \x003A &#58;   COLON
+punctuation  ;      23              \x003B &#59;   SEMICOLON
+math         <      56              \x003C &#60;   LESS-THAN SIGN
+math         =      2356            \x003D &#61;   EQUALS SIGN
+math         >      45              \x003E &#62;   GREATER-THAN SIGN
+punctuation  ?      26              \x003F &#63;   QUESTION MARK
+sign         @      3457            \x0040 &#64;   COMMERCIAL AT
+uppercase    A      17              \x0041 &#65;   LATIN CAPITAL LETTER A
+uppercase    B      127             \x0042 &#66;   LATIN CAPITAL LETTER B
+uppercase    C      147             \x0043 &#67;   LATIN CAPITAL LETTER C
+uppercase    D      1457            \x0044 &#68;   LATIN CAPITAL LETTER D
+uppercase    E      157             \x0045 &#69;   LATIN CAPITAL LETTER E
+uppercase    F      1247            \x0046 &#70;   LATIN CAPITAL LETTER F
+uppercase    G      12457           \x0047 &#71;   LATIN CAPITAL LETTER G
+uppercase    H      1257            \x0048 &#72;   LATIN CAPITAL LETTER H
+uppercase    I      247             \x0049 &#73;   LATIN CAPITAL LETTER I
+uppercase    J      2457            \x004A &#74;   LATIN CAPITAL LETTER J
+uppercase    K      137             \x004B &#75;   LATIN CAPITAL LETTER K
+uppercase    L      1237            \x004C &#76;   LATIN CAPITAL LETTER L
+uppercase    M      1347            \x004D &#77;   LATIN CAPITAL LETTER M
+uppercase    N      13457           \x004E &#78;   LATIN CAPITAL LETTER N
+uppercase    O      1357            \x004F &#79;   LATIN CAPITAL LETTER O
+uppercase    P      12347           \x0050 &#80;   LATIN CAPITAL LETTER P
+uppercase    Q      123457          \x0051 &#81;   LATIN CAPITAL LETTER Q
+uppercase    R      12357           \x0052 &#82;   LATIN CAPITAL LETTER R
+uppercase    S      2347            \x0053 &#83;   LATIN CAPITAL LETTER S
+uppercase    T      23457           \x0054 &#84;   LATIN CAPITAL LETTER T
+uppercase    U      1367            \x0055 &#85;   LATIN CAPITAL LETTER U
+uppercase    V      12367           \x0056 &#86;   LATIN CAPITAL LETTER V
+uppercase    W      24567           \x0057 &#87;   LATIN CAPITAL LETTER W
+uppercase    X      13467           \x0058 &#88;   LATIN CAPITAL LETTER X
+uppercase    Y      134567          \x0059 &#89;   LATIN CAPITAL LETTER Y
+uppercase    Z      13567           \x005A &#90;   LATIN CAPITAL LETTER Z
+punctuation  [      123567          \x005B &#91;   LEFT SQUARE BRACKET
+sign         \\     347             \x005C &#92;   REVERSE SOLIDUS
+punctuation  ]      234567          \x005D &#93;   RIGHT SQUARE BRACKET
+sign         ^      23467           \x005E &#94;   CIRCUMFLEX ACCENT
+sign         _      4567            \x005F &#95;   LOW LINE
+sign         `      345             \x0060 &#96;   GRAVE ACCENT
+lowercase    a      1               \x0061 &#97;   LATIN SMALL LETTER A
+lowercase    b      12              \x0062 &#97;   LATIN SMALL LETTER B
+lowercase    c      14              \x0063 &#97;   LATIN SMALL LETTER C
+lowercase    d      145             \x0064 &#97;   LATIN SMALL LETTER D
+lowercase    e      15              \x0065 &#97;   LATIN SMALL LETTER E
+lowercase    f      124             \x0066 &#97;   LATIN SMALL LETTER F
+lowercase    g      1245            \x0067 &#97;   LATIN SMALL LETTER G
+lowercase    h      125             \x0068 &#97;   LATIN SMALL LETTER H
+lowercase    i      24              \x0069 &#97;   LATIN SMALL LETTER I
+lowercase    j      245             \x006A &#97;   LATIN SMALL LETTER J
+lowercase    k      13              \x006B &#97;   LATIN SMALL LETTER K
+lowercase    l      123             \x006C &#97;   LATIN SMALL LETTER L
+lowercase    m      134             \x006D &#97;   LATIN SMALL LETTER M
+lowercase    n      1345            \x006E &#97;   LATIN SMALL LETTER N
+lowercase    o      135             \x006F &#111;  LATIN SMALL LETTER O
+lowercase    p      1234            \x0070 &#112;  LATIN SMALL LETTER P
+lowercase    q      12345           \x0071 &#113;  LATIN SMALL LETTER Q
+lowercase    r      1235            \x0072 &#114;  LATIN SMALL LETTER R
+lowercase    s      234             \x0073 &#115;  LATIN SMALL LETTER S
+lowercase    t      2345            \x0074 &#116;  LATIN SMALL LETTER T
+lowercase    u      136             \x0075 &#117;  LATIN SMALL LETTER U
+lowercase    v      1236            \x0076 &#118;  LATIN SMALL LETTER V
+lowercase    w      2456            \x0077 &#119;  LATIN SMALL LETTER W
+lowercase    x      1346            \x0078 &#120;  LATIN SMALL LETTER X
+lowercase    y      13456           \x0079 &#121;  LATIN SMALL LETTER Y
+lowercase    z      1356            \x007A &#122;  LATIN SMALL LETTER Z
+punctuation  {      12356           \x007B &#123;  LEFT CURLY BRACKET
+sign         |      34              \x007C &#124;  VERTICAL LINE
+punctuation  }      23456           \x007D &#125;  RIGHT CURLY BRACKET
+sign         ~      2346            \x007E &#126;  TILDE
+sign         \x007F 456             \x007F &#127;  [DELETE]
+#                   457             \x0080 &#128;  <control>
+#                   8               \x0081 &#129;  <control>
+#                   3678            \x0082 &#130;  <control> [BREAK PERMITTED HERE]
+#                   78              \x0083 &#131;  <control> [NO BREAK HERE]
+#                   1268            \x0084 &#132;  <control>
+#                   238             \x0085 &#133;  <control> [NEXT LINE (NEL)]
+#                   1248            \x0086 &#134;  <control> [START OF SELECTED AREA]
+#                   12458           \x0087 &#135;  <control> [END OF SELECTED AREA]
+#                   378             \x0088 &#136;  <control> [CHARACTER TABULATION SET]
+#                   248             \x0089 &#137;  <control> [CHARACTER TABULATION WITH JUSTIFICATION]
+#                   678             \x008A &#138;  <control> [LINE TABULATION SET]
+#                   27              \x008B &#139;  <control> [PARTIAL LINE FORWARD]
+#                   237             \x008C &#140;  <control> [PARTIAL LINE BACKWARD]
+#                   257             \x008D &#141;  <control> [REVERSE LINE FEED]
+#                   12567           \x008E &#142;  <control> [SINGLE SHIFT TWO]
+#                   12467           \x008F &#143;  <control> [SINGLE SHIFT THREE]
+#                   124678          \x0090 &#144;  <control> [DEVICE CONTROL STRING]
+#                   23567           \x0091 &#145;  <control> [PRIVATE USE ONE]
+#                   2367            \x0092 &#146;  <control> [PRIVATE USE TWO]
+#                   138             \x0093 &#147;  <control> [SET TRANSMIT STATE]
+#                   1238            \x0094 &#148;  <control> [CANCEL CHARACTER]
+#                   278             \x0095 &#149;  <control> [MESSAGE WAITING]
+#                   2378            \x0096 &#150;  <control> [START OF GUARDED AREA]
+#                   13568           \x0097 &#151;  <control> [END OF GUARDED AREA]
+#                   2578            \x0098 &#152;  <control> [START OF STRING]
+#                   1245678         \x0099 &#153;  <control>
+#                   2678            \x009A &#154;  <control> [SINGLE CHARACTER INTRODUCER]
+#                   123458          \x009B &#155;  <control> [CONTROL SEQUENCE INTRODUCER]
+#                   67              \x009C &#156;  <control> [STRING TERMINATOR]
+#                   124567          \x009D &#157;  <control> [OPERATING SYSTEM COMMAND]
+#                   235678          \x009E &#158;  <control> [PRIVACY MESSAGE]
+#                   12345678        \x009F &#159;  <control> [APPLICATION PROGRAM COMMAND]
+space        \x00a0 7               \x00A0 &#160;  NO-BREAK SPACE
+punctuation  ¡      367             \x00A1 &#161;  INVERTED EXCLAMATION MARK
+sign         ¢      58              \x00A2 &#162;  CENT SIGN
+sign         £      467             \x00A3 &#163;  POUND SIGN
+sign         ¤      4678            \x00A4 &#164;  CURRENCY SIGN
+sign         ¥      468             \x00A5 &#165;  YEN SIGN
+sign         ¦      158             \x00A6 &#166;  BROKEN BAR
+sign         §      357             \x00A7 &#167;  SECTION SIGN
+sign         ¨      48              \x00A8 &#168;  DIAERESIS
+sign         ©      123468          \x00A9 &#169;  COPYRIGHT SIGN
+sign         ª      1258            \x00AA &#170;  FEMININE ORDINAL INDICATOR
+punctuation  «      5678            \x00AB &#171;  LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+sign         ¬      25678           \x00AC &#172;  NOT SIGN
+sign         ­      368             \x00AD &#173;  SOFT HYPHEN
+sign         ®      12358           \x00AE &#174;  REGISTERED SIGN
+sign         ¯      458             \x00AF &#175;  MACRON
+sign         °      4568            \x00B0 &#176;  DEGREE SIGN
+math         ±      23578           \x00B1 &#177;  PLUS-MINUS SIGN
+sign         ²      128             \x00B2 &#178;  SUPERSCRIPT TWO
+sign         ³      148             \x00B3 &#179;  SUPERSCRIPT THREE
+sign         ´      568             \x00B4 &#180;  ACUTE ACCENT
+sign         µ      1348            \x00B5 &#181;  MICRO SIGN
+sign         ¶      1458            \x00B6 &#182;  PILCROW SIGN
+sign         ·      37              \x00B7 &#183;  MIDDLE DOT
+sign         ¸      68              \x00B8 &#184;  CEDILLA
+sign         ¹      18              \x00B9 &#185;  SUPERSCRIPT ONE
+sign         º      2458            \x00BA &#186;  MASCULINE ORDINAL INDICATOR
+punctuation  »      4578            \x00BB &#187;  RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+math         ¼      1368            \x00BC &#188;  VULGAR FRACTION ONE QUARTER
+math         ½      12368           \x00BD &#189;  VULGAR FRACTION ONE HALF
+math         ¾      13468           \x00BE &#190;  VULGAR FRACTION THREE QUARTERS
+punctuation  ¿      38              \x00BF &#191;  INVERTED QUESTION MARK
+uppercase    À      23678           \x00C0 &#192;  LATIN CAPITAL LETTER A WITH GRAVE
+uppercase    Á      28              \x00C1 &#193;  LATIN CAPITAL LETTER A WITH ACUTE
+uppercase    Â      167             \x00C2 &#194;  LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+uppercase    Ã      3467            \x00C3 &#195;  LATIN CAPITAL LETTER A WITH TILDE
+uppercase    Ä      567             \x00C4 &#196;  LATIN CAPITAL LETTER A WITH DIAERESIS
+uppercase    Å      34567           \x00C5 &#197;  LATIN CAPITAL LETTER A WITH RING ABOVE
+uppercase    Æ      47              \x00C6 &#198;  LATIN CAPITAL LETTER AE
+uppercase    Ç      123467          \x00C7 &#199;  LATIN CAPITAL LETTER C WITH CEDILLA
+uppercase    È      3578            \x00C8 &#200;  LATIN CAPITAL LETTER E WITH GRAVE
+uppercase    É      1234567         \x00C9 &#201;  LATIN CAPITAL LETTER E WITH ACUTE
+uppercase    Ê      1267            \x00CA &#202;  LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+uppercase    Ë      2358            \x00CB &#203;  LATIN CAPITAL LETTER E WITH DIAERESIS
+uppercase    Ì      57              \x00CC &#204;  LATIN CAPITAL LETTER I WITH GRAVE
+uppercase    Í      258             \x00CD &#205;  LATIN CAPITAL LETTER I WITH ACUTE
+uppercase    Î      1467            \x00CE &#206;  LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+uppercase    Ï      23568           \x00CF &#207;  LATIN CAPITAL LETTER I WITH DIAERESIS
+uppercase    Ð      3567            \x00D0 &#208;  LATIN CAPITAL LETTER ETH
+uppercase    Ñ      2567            \x00D1 &#209;  LATIN CAPITAL LETTER N WITH TILDE
+uppercase    Ò      578             \x00D2 &#210;  LATIN CAPITAL LETTER O WITH GRAVE
+uppercase    Ó      2568            \x00D3 &#211;  LATIN CAPITAL LETTER O WITH ACUTE
+uppercase    Ô      14567           \x00D4 &#212;  LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+uppercase    Õ      267             \x00D5 &#213;  LATIN CAPITAL LETTER O WITH TILDE
+uppercase    Ö      358             \x00D6 &#214;  LATIN CAPITAL LETTER O WITH DIAERESIS
+math         ×      2348            \x00D7 &#215;  MULTIPLICATION SIGN
+uppercase    Ø      2467            \x00D8 &#216;  LATIN CAPITAL LETTER O WITH STROKE
+uppercase    Ù      35678           \x00D9 &#217;  LATIN CAPITAL LETTER U WITH GRAVE
+uppercase    Ú      268             \x00DA &#218;  LATIN CAPITAL LETTER U WITH ACUTE
+uppercase    Û      1567            \x00DB &#219;  LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+uppercase    Ü      2368            \x00DC &#220;  LATIN CAPITAL LETTER U WITH DIAERESIS
+uppercase    Ý      3568            \x00DD &#221;  LATIN CAPITAL LETTER Y WITH ACUTE
+uppercase    Þ      2357            \x00DE &#222;  LATIN CAPITAL LETTER THORN
+lowercase    ß      34568           \x00DF &#223;  LATIN SMALL LETTER SHARP S
+lowercase    à      123568          \x00E0 &#224;  LATIN SMALL LETTER A WITH GRAVE
+lowercase    á      168             \x00E1 &#225;  LATIN SMALL LETTER A WITH ACUTE
+lowercase    â      1678            \x00E2 &#226;  LATIN SMALL LETTER A WITH CIRCUMFLEX
+lowercase    ã      34678           \x00E3 &#227;  LATIN SMALL LETTER A WITH TILDE
+lowercase    ä      3458            \x00E4 &#228;  LATIN SMALL LETTER A WITH DIAERESIS
+lowercase    å      345678          \x00E5 &#229;  LATIN SMALL LETTER A WITH RING ABOVE
+lowercase    æ      478             \x00E6 &#230;  LATIN SMALL LETTER AE
+lowercase    ç      1234678         \x00E7 &#231;  LATIN SMALL LETTER C WITH CEDILLA
+lowercase    è      23468           \x00E8 &#232;  LATIN SMALL LETTER E WITH GRAVE
+lowercase    é      1234568         \x00E9 &#233;  LATIN SMALL LETTER E WITH ACUTE
+lowercase    ê      12678           \x00EA &#234;  LATIN SMALL LETTER E WITH CIRCUMFLEX
+lowercase    ë      12468           \x00EB &#235;  LATIN SMALL LETTER E WITH DIAERESIS
+lowercase    ì      348             \x00EC &#236;  LATIN SMALL LETTER I WITH GRAVE
+lowercase    í      1468            \x00ED &#237;  LATIN SMALL LETTER I WITH ACUTE
+lowercase    î      14678           \x00EE &#238;  LATIN SMALL LETTER I WITH CIRCUMFLEX
+lowercase    ï      124568          \x00EF &#239;  LATIN SMALL LETTER I WITH DIAERESIS
+lowercase    ð      23458           \x00F0 &#240;  LATIN SMALL LETTER ETH
+lowercase    ñ      13458           \x00F1 &#241;  LATIN SMALL LETTER N WITH TILDE
+lowercase    ò      3468            \x00F2 &#242;  LATIN SMALL LETTER O WITH GRAVE
+lowercase    ó      14568           \x00F3 &#243;  LATIN SMALL LETTER O WITH ACUTE
+lowercase    ô      145678          \x00F4 &#244;  LATIN SMALL LETTER O WITH CIRCUMFLEX
+lowercase    õ      1358            \x00F5 &#245;  LATIN SMALL LETTER O WITH TILDE
+lowercase    ö      2468            \x00F6 &#246;  LATIN SMALL LETTER O WITH DIAERESIS
+math         ÷      125678          \x00F7 &#247;  DIVISION SIGN
+lowercase    ø      24678           \x00F8 &#248;  LATIN SMALL LETTER O WITH STROKE
+lowercase    ù      234568          \x00F9 &#249;  LATIN SMALL LETTER U WITH GRAVE
+lowercase    ú      1568            \x00FA &#250;  LATIN SMALL LETTER U WITH ACUTE
+lowercase    û      15678           \x00FB &#251;  LATIN SMALL LETTER U WITH CIRCUMFLEX
+lowercase    ü      12568           \x00FC &#252;  LATIN SMALL LETTER U WITH DIAERESIS
+lowercase    ý      24568           \x00FD &#253;  LATIN SMALL LETTER Y WITH ACUTE
+lowercase    þ      12348           \x00FE &#254;  LATIN SMALL LETTER THORN
+lowercase    ÿ      134568          \x00FF &#255;  LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/liblouis/tables/de-chess.ctb b/liblouis/tables/de-chess.ctb
new file mode 100644
index 0000000..97880a5
--- /dev/null
+++ b/liblouis/tables/de-chess.ctb
@@ -0,0 +1,37 @@
+#
+# Copyright (C) 1995-2008 by The BRLTTY Developers.
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+# This text subtable defines braille representations for the chess figures in
+# terms of the letters that are used for them in the German language.
+
+# See: http://en.wikipedia.org/wiki/Chess_symbols_in_Unicode
+
+# generated by ttbtest
+punctuation \x2654 137		WHITE CHESS KING
+punctuation \x2655 1457		WHITE CHESS QUEEN
+punctuation \x2656 23457		WHITE CHESS ROOK
+punctuation \x2657 1237		WHITE CHESS BISHOP
+punctuation \x2658 2347		WHITE CHESS KNIGHT
+punctuation \x2659 127		WHITE CHESS PAWN
+punctuation \x265a 13		BLACK CHESS KING
+punctuation \x265b 145		BLACK CHESS QUEEN
+punctuation \x265c 2345		BLACK CHESS ROOK
+punctuation \x265d 123		BLACK CHESS BISHOP
+punctuation \x265e 234		BLACK CHESS KNIGHT
+punctuation \x265f 12		BLACK CHESS PAWN
diff --git a/liblouis/tables/de-de-accents.cti b/liblouis/tables/de-de-accents.cti
new file mode 100644
index 0000000..ade2c2a
--- /dev/null
+++ b/liblouis/tables/de-de-accents.cti
@@ -0,0 +1,63 @@
+# liblouis: Letters with accents (without ä ö ü) - Germany, Austria
+#
+#  Copyright (C) 2009 SBS Schweizerische Bibliothek für Blinde und Sehbehinderte
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#-------------------------------------------------------------------------------
+#
+#  Letters with accents (without ä ö ü) - Germany, Austria
+#
+#  Version 11-17-09
+#  christian.waldvogel@sbszh.ch
+#
+#-------------------------------------------------------------------------------
+
+uplow Àà 4-1 \x00C0 &#192;  LATIN LETTER A WITH GRAVE
+uplow Áá 4-1 \x00C1 &#193;  LATIN LETTER A WITH ACUTE
+uplow Ââ 4-1 \x00C2 &#194;  LATIN LETTER A WITH CIRCUMFLEX
+uplow Ãã 4-1 \x00C3 &#195;  LATIN LETTER A WITH TILDE
+
+uplow Åå 4-1 \x00C5 &#197;  LATIN LETTER A WITH RING ABOVE
+uplow Ææ 1-15 \x00C6 &#198;  LATIN LETTER AE
+uplow Çç 4-14 \x00C7 &#199;  LATIN LETTER C WITH CEDILLA
+uplow Èè 4-15 \x00C8 &#200;  LATIN LETTER E WITH GRAVE
+uplow Éé 4-15 \x00C9 &#201;  LATIN LETTER E WITH ACUTE
+uplow Êê 4-15 \x00CA &#202;  LATIN LETTER E WITH CIRCUMFLEX
+uplow Ëë 4-15 \x00CB &#203;  LATIN LETTER E WITH DIAERESIS
+uplow Ìì 4-24 \x00CC &#204;  LATIN LETTER I WITH GRAVE
+uplow Íí 4-24 \x00CD &#205;  LATIN LETTER I WITH ACUTE
+uplow Îî 4-24 \x00CE &#206;  LATIN LETTER I WITH CIRCUMFLEX
+uplow Ïï 4-24 \x00CF &#207;  LATIN LETTER I WITH DIAERESIS
+uplow Ðð 4-145 \x00D0 &#208;  LATIN LETTER ETH
+uplow Ññ 4-1345 \x00D1 &#209;  LATIN LETTER N WITH TILDE
+uplow Òò 4-135 \x00D2 &#210;  LATIN LETTER O WITH GRAVE
+uplow Óó 4-135 \x00D3 &#211;  LATIN LETTER O WITH ACUTE
+uplow Ôô 4-135 \x00D4 &#212;  LATIN LETTER O WITH CIRCUMFLEX
+uplow Õõ 4-135 \x00D5 &#213;  LATIN LETTER O WITH TILDE
+
+uplow Øø 4-135 \x00D8 &#216;  LATIN LETTER O WITH STROKE
+uplow Ùù 4-136 \x00D9 &#217;  LATIN LETTER U WITH GRAVE
+uplow Úú 4-136 \x00DA &#218;  LATIN LETTER U WITH ACUTE
+uplow Ûû 4-136 \x00DB &#219;  LATIN LETTER U WITH CIRCUMFLEX
+
+uplow Ýý 4-13456 \x00DD &#221;  LATIN LETTER Y WITH ACUTE
+uplow Þþ 4-2345 \x00DE &#222;  LATIN LETTER THORN
+
+lowercase ÿ 4-13456 \x00FF &#255;  LATIN SMALL LETTER Y WITH DIAERESIS
+
+uplow \x0152\x0153 135-15 &#338;  LATIN LIGATURE OE
diff --git a/liblouis/tables/de-de-comp8.ctb b/liblouis/tables/de-de-comp8.ctb
new file mode 100644
index 0000000..68446a0
--- /dev/null
+++ b/liblouis/tables/de-de-comp8.ctb
@@ -0,0 +1,293 @@
+
+#  Copyright (C) 2004-2008 ViewPlus Technologies, Inc. www.viewplus.com
+#  Copyright (C) 2004-2006 JJB Software, Inc. www.jjb-software.com
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+
+include braille-patterns.cti
+
+sign \x0000 0
+sign \x0001 178
+sign \x0002 1278
+sign \x0003 1478
+sign \x0004 14578
+sign \x0005 1578
+sign \x0006 12478
+sign \x0007 124578
+sign \x0008 12578
+sign \x0009 2478
+sign \x000a 24578
+sign \x000b 1378
+sign \x000c 12378
+sign \x000d 13478
+sign \x000e 134578
+sign \x000f 13578
+sign \x0010 123478
+sign \x0011 1234578
+sign \x0012 123578
+sign \x0013 23478
+sign \x0014 234578
+sign \x0015 13678
+sign \x0016 123678
+sign \x0017 245678
+sign \x0018 134678
+sign \x0019 1345678
+sign \x001a 135678
+sign \x001b 1235678
+sign \x001c 3478
+sign \x001d 2345678
+sign \x001e 234678
+sign \x001f 45678
+sign \x0020 0
+sign \x0021 5
+sign \x0022 4
+sign \x0023 3456
+sign \x0024 46
+sign \x0025 123456
+sign \x0026 12346
+sign \x0027 6
+sign \x0028 236
+sign \x0029 356
+sign \x002a 35
+sign \x002b 235
+sign \x002c 2
+sign \x002d 36
+sign \x002e 3
+sign \x002f 256
+sign \x0030 346
+sign \x0031 16
+sign \x0032 126
+sign \x0033 146
+sign \x0034 1456
+sign \x0035 156
+sign \x0036 1246
+sign \x0037 12456
+sign \x0038 1256
+sign \x0039 246
+sign \x003a 25
+sign \x003b 23
+sign \x003c 56
+sign \x003d 2356
+sign \x003e 45
+sign \x003f 26
+sign \x0040 3457
+sign \x0041 17
+sign \x0042 127
+sign \x0043 147
+sign \x0044 1457
+sign \x0045 157
+sign \x0046 1247
+sign \x0047 12457
+sign \x0048 1257
+sign \x0049 247
+sign \x004a 2457
+sign \x004b 137
+sign \x004c 1237
+sign \x004d 1347
+sign \x004e 13457
+sign \x004f 1357
+sign \x0050 12347
+sign \x0051 123457
+sign \x0052 12357
+sign \x0053 2347
+sign \x0054 23457
+sign \x0055 1367
+sign \x0056 12367
+sign \x0057 24567
+sign \x0058 13467
+sign \x0059 134567
+sign \x005a 13567
+sign \x005b 123567
+sign \x005c 347
+sign \x005d 234567
+sign \x005e 23467
+sign \x005f 4567
+sign \x0060 345
+sign \x0061 1
+sign \x0062 12
+sign \x0063 14
+sign \x0064 145
+sign \x0065 15
+sign \x0066 124
+sign \x0067 1245
+sign \x0068 125
+sign \x0069 24
+sign \x006a 245
+sign \x006b 13
+sign \x006c 123
+sign \x006d 134
+sign \x006e 1345
+sign \x006f 135
+sign \x0070 1234
+sign \x0071 12345
+sign \x0072 1235
+sign \x0073 234
+sign \x0074 2345
+sign \x0075 136
+sign \x0076 1236
+sign \x0077 2456
+sign \x0078 1346
+sign \x0079 13456
+sign \x007a 1356
+sign \x007b 12356
+sign \x007c 34
+sign \x007d 23456
+sign \x007e 2346
+sign \x007f 456
+sign \x0080 457
+sign \x0081 8
+sign \x0082 3678
+sign \x0083 78
+sign \x0084 1268
+sign \x0085 238
+sign \x0086 1248
+sign \x0087 12458
+sign \x0088 378
+sign \x0089 248
+sign \x008a 678
+sign \x008b 27
+sign \x008c 237
+sign \x008d 257
+sign \x008e 12567
+sign \x008f 12467
+sign \x0090 124678
+sign \x0091 23567
+sign \x0092 2367
+sign \x0093 138
+sign \x0094 1238
+sign \x0095 278
+sign \x0096 2378
+sign \x0097 13568
+sign \x0098 2578
+sign \x0099 1245678
+sign \x009a 2678
+sign \x009b 123458
+sign \x009c 67
+sign \x009d 124567
+sign \x009e 235678
+sign \x009f 12345678
+sign \x00a0 7
+sign \x00a1 367
+sign \x00a2 58
+sign \x00a3 467
+sign \x00a4 4678
+sign \x00a5 468
+sign \x00a6 158
+sign \x00a7 357
+sign \x00a8 48
+sign \x00a9 123468
+sign \x00aa 1258
+sign \x00ab 5678
+sign \x00ac 25678
+sign \x00ad 368
+sign \x00ae 12358
+sign \x00af 458
+sign \x00b0 4568
+sign \x00b1 23578
+sign \x00b2 128
+sign \x00b3 148
+sign \x00b4 568
+sign \x00b5 1348
+sign \x00b6 1458
+sign \x00b7 37
+sign \x00b8 68
+sign \x00b9 18
+sign \x00ba 2458
+sign \x00bb 4578
+sign \x00bc 1368
+sign \x00bd 12368
+sign \x00be 13468
+sign \x00bf 38
+sign \x00c0 23678
+sign \x00c1 28
+sign \x00c2 167
+sign \x00c3 3467
+sign \x00c4 567
+sign \x00c5 34567
+sign \x00c6 47
+sign \x00c7 123467
+sign \x00c8 3578
+sign \x00c9 1234567
+sign \x00ca 1267
+sign \x00cb 2358
+sign \x00cc 57
+sign \x00cd 258
+sign \x00ce 1467
+sign \x00cf 23568
+sign \x00d0 3567
+sign \x00d1 2567
+sign \x00d2 578
+sign \x00d3 2568
+sign \x00d4 14567
+sign \x00d5 267
+sign \x00d6 358
+sign \x00d7 2348
+sign \x00d8 2467
+sign \x00d9 35678
+sign \x00da 268
+sign \x00db 1567
+sign \x00dc 2368
+sign \x00dd 3568
+sign \x00de 2357
+sign \x00df 34568
+sign \x00e0 123568
+sign \x00e1 168
+sign \x00e2 1678
+sign \x00e3 34678
+sign \x00e4 3458
+sign \x00e5 345678
+sign \x00e6 478
+sign \x00e7 1234678
+sign \x00e8 23468
+sign \x00e9 1234568
+sign \x00ea 12678
+sign \x00eb 12468
+sign \x00ec 348
+sign \x00ed 1468
+sign \x00ee 14678
+sign \x00ef 124568
+sign \x00f0 23458
+sign \x00f1 13458
+sign \x00f2 3468
+sign \x00f3 14568
+sign \x00f4 145678
+sign \x00f5 1358
+sign \x00f6 2468
+sign \x00f7 125678
+sign \x00f8 24678
+sign \x00f9 234568
+sign \x00fa 1568
+sign \x00fb 15678
+sign \x00fc 12568
+sign \x00fd 24568
+sign \x00fe 12348
+sign \x00ff 134568
+sign \x2022 35		# •
+sign \x2014 36		# —
+sign \x2013 36		# –
+sign \x201e 1268	# „
+sign \x201c 138		# “
+sign \x201a 3678	# ‚
+sign \x2018 2367	# ‘
+noback sign \X25CF 35	# 9679 black circle
+
+# those symbols should be ignored because there is no one character mapping in the actual braille table
+sign \x2192 0	# →
+sign \x2190 0	# ←
+sign \x25bc 0	# ▼
+
+
diff --git a/liblouis/tables/de-de-g0.utb b/liblouis/tables/de-de-g0.utb
new file mode 100644
index 0000000..c4a4f13
--- /dev/null
+++ b/liblouis/tables/de-de-g0.utb
@@ -0,0 +1,34 @@
+# liblouis: German Grade 0 Braille
+#
+#  Copyright (C) 2009 SBS Schweizerische Bibliothek für Blinde und Sehbehinderte
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#-------------------------------------------------------------------------------
+#
+#  DEUTSCHE BASISSCHRIFT - German Grade 0 Braille - Germany, Austria
+#
+#  Version 11-18-09
+#  christian.waldvogel@sbszh.ch
+#
+#-------------------------------------------------------------------------------
+
+
+include de-eurobrl6.dis
+include de-chardefs6.cti
+include de-de-accents.cti
+include de-g0-core.uti
diff --git a/liblouis/tables/de-de-g1.ctb b/liblouis/tables/de-de-g1.ctb
new file mode 100644
index 0000000..36166bd
--- /dev/null
+++ b/liblouis/tables/de-de-g1.ctb
@@ -0,0 +1,32 @@
+# liblouis: German Grade 1 Braille
+#
+#  Copyright (C) 2009 SBS Schweizerische Bibliothek für Blinde und Sehbehinderte
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#-------------------------------------------------------------------------------
+#
+#  DEUTSCHE VOLLSCHRIFT - German Grade 1 Braille - Germany, Austria
+#
+#  Version 2009-11-19
+#  christian.waldvogel@sbszh.ch
+#
+#-------------------------------------------------------------------------------
+
+
+include de-de-g0.utb
+include de-g1-core.cti
diff --git a/liblouis/tables/de-de-g2.ctb b/liblouis/tables/de-de-g2.ctb
new file mode 100644
index 0000000..bce203a
--- /dev/null
+++ b/liblouis/tables/de-de-g2.ctb
@@ -0,0 +1,70 @@
+# liblouis: German Grade 2 Braille
+#
+#  Copyright (C) 2009 SBS Schweizerische Bibliothek für Blinde und Sehbehinderte
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#-------------------------------------------------------------------------------
+#
+#  DEUTSCHE KURZSCHRIFT - German Grade 2 Braille - Germany, Austria
+#
+#  Version 2009-11-19
+#  christian.waldvogel@sbszh.ch
+#
+#-------------------------------------------------------------------------------
+
+
+include de-de-g0.utb
+letsign 6
+
+# All exception rules which use the letter "ß" are added BEFORE
+# de-g2-core is included
+always raufuß 1235-16-124-136-6-2346
+always raufüß 1235-16-124-1256-6-2346
+always beruß 23-1235-136-6-2346
+always beiß 12-146-6-2346
+always beimaß 2-12-134-1-6-2346
+always demgemäß 2-12356-12346-134-345-6-2346
+word außerdem 16-6-2346-12456-2-12356
+midendword emaß 15-134-1-6-2346
+midendword emäßig 15-134-345-6-2346-45
+always mußestund 134-136-6-2346-15-23456-256-145
+always mußestünd 134-136-6-2346-15-23456-1256-1345-145
+always mädesüß 134-345-145-15-234-1256-6-2346
+begmidword außengeländ 16-6-2346-14-12346-123-345-1345-145
+always genieß 12346-1345-346-6-2346
+always genuß 12346-1345-136-6-2346
+always steingeiß 23456-1246-1245-146-6-2346
+always habergeiß 125-1-12-12456-1245-146-6-2346
+always herreiß 125-12456-1235-146-6-2346
+midendword ßion 6-2346-245
+midendword ßions 6-2346-245-234
+always müßig 134-1256-6-2346-45
+always ß 6-2346
+syllable stöß 23456-246-6-2346
+midendword sspaß 234-234-1234-1-6-2346
+midendword sstoß 234-23456-135-6-2346
+midendword sstraß 234-23456-1235-1-6-2346
+always jakobstraß 245-1-13-135-12-23456-1235-1-6-2346
+always einfallstraß 1246-124-12345-23456-1235-1-6-2346
+begmidword karlstraß 13-356-123-23456-1235-1-6-2346
+always fahrtstraß 2-1235-2345-23456-1235-1-6-2346
+always fahrtsträß 2-1235-2345-23456-1235-345-6-2346
+always begrüßungstrunk 23-1245-1235-1256-6-2346-136-234-2345-1235-256-13
+always beißt 12-146-6-2346-2345
+
+include de-g2-core.cti
diff --git a/liblouis/tables/de-de.dis b/liblouis/tables/de-de.dis
new file mode 100644
index 0000000..eaa7a6f
--- /dev/null
+++ b/liblouis/tables/de-de.dis
@@ -0,0 +1,331 @@
+# This file is obsolete. Do not use!
+
+# liblouis: de-de.dis
+#
+# Copyright (C) 1995-2004 by The BRLTTY Team. All rights reserved.
+# Copyright (C) 2004 ViewPlus Technologies, inc., www.viewplustech.com
+# Copyright (C) 2004 Computers to Help People, Inc., www.chpi.org
+
+# This file is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with this file; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+# Maintained by John J. Boyer, director@chpi.org, www.chpi.org
+
+# This is to be used with German translation tables.
+
+
+        #Hex   Dots				Dec		Char Description
+display \X0020 0					#32					space
+display \X0021   5				#33		!			exclamation mark
+display \X0022    4				#34		"			quotation mark
+display \X0023   3456			#35		#			number sign
+display \X0024 46					#36		$			dollar sign
+display \X0025 123456			#37		%			percent sign
+display \X0026 12346			#38		&			ampersand
+display \X0027  6					#39		'			apostrophe
+display \X0028	236		#40	(			left parenthesis
+display \X0029  356		#41	)			right parenthesis
+display \X002A	35		#42	*			asterisk
+display \X002B	235		#43	+			plus sign
+display \X002C      2		#44 ,			comma
+display \X002D	36		#45	-			hyphen-minus
+display \X002E	3			#46 .			full stop
+display \X002F	256		#47	/			solidus
+
+display \X0030	346		#480			digit zero
+display \X0031	16		#491			digit one
+display \X0032	126		#502			digit two
+display \X0033	146		#513			digit three
+display \X0034  1456	#524			digit four
+display \X0035  156		#535			digit five
+display \X0036  1246	#546			digit six
+display \X0037  12456 #557			digit seven
+display \X0038  1256	#568			digit eight
+display \X0039	246		#579			digit nine
+display \X003A	25		#58 :			colon
+display \X003B  23		#59 ;			semicolon
+display \X003C 56			#60  <	less-than sign
+# display \X003D 156		#61  =	equals sign
+display \X003D 2356		#61  =	equals sign
+display \X003E 45			#62  >	greater-than sign
+display \X003F  26		#63 ?			question mark
+display \X0040 345				#64  @	commercial at
+
+        #Hex   Dots		Dec	Char Description
+display \X0041 17				#65	A Latin capital letter a
+display \X0042 127			#66	B Latin capital letter b
+display \X0043 147			#67	C Latin capital letter c
+display \X0044 1457			#68	D Latin capital letter d
+display \X0045 157			#69	E Latin capital letter e
+display \X0046 1247			#70	F Latin capital letter f
+display \X0047 12457		#71	G Latin capital letter g
+display \X0048 1257			#72	H Latin capital letter h
+display \X0049 247			#73	I Latin capital letter i
+display \X004A 2457			#74	J Latin capital letter j
+display \X004B 137			#75	K Latin capital letter k
+display \X004C 1237			#76	L Latin capital letter l
+display \X004D 1347			#77	M Latin capital letter m
+display \X004E 13457		#78	N Latin capital letter n
+display \X004F 1357			#79	O Latin capital letter o
+display \X0050 12347		#80	P Latin capital letter p
+display \X0051 123457		#81	Q Latin capital letter q
+display \X0052 12357		#82	R Latin capital letter r
+display \X0053 2347			#83	S Latin capital letter s
+display \X0054 23457		#84	T Latin capital letter t
+display \X0055 1367			#85	U Latin capital letter u
+display \X0056 12367		#86	V Latin capital letter v
+display \X0057 24567		#87	W Latin capital letter w
+display \X0058 13467		#88	X Latin capital letter x
+display \X0059 134567		#89	Y Latin capital letter y
+display \X005A 13567		#90	Z Latin capital letter z
+
+display \X005B 12356	#	91  [	left square bracket
+display \X005C 347		#	92	\	reverse solidus
+display \X005D 23456	# 93  ]	right square bracket
+display \X005E 2346		# 94 ^	circumflex accent
+display \X005F 456		# 95 _	low line
+display \X0060 345		# 96 `	grave accent
+
+display \X0061 1			#97  a  Latin small letter a
+display \X0062 12			#98  b Latin small letter b
+display \X0063 14			#99  c Latin small letter c
+display \X0064 145		#100 d Latin small letter d
+display \X0065 15			#101 e Latin small letter e
+display \X0066 124		#102 f Latin small letter f
+display \X0067 1245		#103 g Latin small letter g
+display \X0068 125		#104 h Latin small letter h
+display \X0069  24		#105 i Latin small letter i
+display \X006A  245		#106 j Latin small letter j
+display \X006B 13			#107 k Latin small letter k
+display \X006C 123		#108 l Latin small letter l
+display \X006D 134		#109 m Latin small letter m
+display \X006E 1345		#110 n Latin small letter n
+display \X006F 135		#111 o Latin small letter o
+display \X0070 1234		#112 p Latin small letter p
+display \X0071 12345	#113 q Latin small letter q
+display \X0072 1235		#114 r Latin small letter r
+display \X0073 234		#115 s Latin small letter s
+display \X0074  2345	#116 t Latin small letter t
+display \X0075 136		#117 u Latin small letter u
+display \X0076 1236		#118 v Latin small letter v
+display \X0077  2456	#119 w Latin small letter w
+display \X0078 1346		#120 x Latin small letter x
+display \X0079 13456	#121 y Latin small letter y
+display \X007A 1356		#122 z Latin small letter z
+
+display \X007B  12356			# 123 {		left curly bracket
+display \X007C 34					# 124 |		vertical line
+display \X007D 23456			#	125 }		right curly bracket
+display \X007E   2356     #	126 ~   tilde
+display \X007F 4568				# 127	^		?delete
+
+#Hex Dots Dec Char Description
+display \X0080 48 # 128~@<control>
+display \X0081 18 # 129~A<control>
+display \X0082 128 # 130~Bbreak permitted here
+display \X0083 148 # 131~Cno break here
+display \X0084 1458 # 132~D<control>
+display \X0085 158 # 133~Enext line
+display \X0086 1248 # 134~Fstart of selected area
+display \X0087 12458 # 135~Gend of selected area
+display \X0088 1258 # 136~Hcharacter tabulation set
+display \X0089  248 # 137~Icharacter tabulation with justification
+display \X008A  2458 # 138~Jline tabulation set
+display \X008B 138 # 139~Kpartial line down
+display \X008C 1238 # 140~Lpartial line up
+display \X008D 1348 # 141~Mreverse line feed
+display \X008E 13458 # 142~Nsingle shift two
+display \X008F 1358 # 143~Osingle shift three
+display \X0090 12348 # 144~Pdevice control string
+display \X0091 123458 # 145~Qprivate use one
+display \X0092 12358 # 146~Rprivate use two
+display \X0093 2348 # 147~Sset transmit state
+display \X0094  23458 # 148~Tcancel character
+display \X0095 1368 # 149~Umessage waiting
+display \X0096 12368 # 150~Vstart of guarded area
+display \X0097  24568 # 151~Wend of guarded area
+display \X0098 13468 # 152~Xstart of string
+display \X0099 134568 # 153~Y<control>
+display \X009A 13568 # 154~Zsingle character introducer
+display \X009B  2468 # 155~[control sequence introducer
+display \X009C 12568 # 156~\string terminator
+display \X009D 124568 # 157~]operating system command
+display \X009E 458 # 158~^privacy message
+display \X009F 4568		# 159				~_application program command
+display \X00A0 0			#160			no-break space
+
+#Hex Dots Dec Char Description
+display \X0000 478 #0^@null
+display \X0001 178 #1^Astart of heading
+display \X0002 1278 #2^Bstart of text
+display \X0003 1478 #3^Cend of text
+display \X0004 14578 #4^Dend of transmission
+display \X0005 1578 #5^Eenquiry
+display \X0006 12478 #6^Facknowledge
+display \X0007 124578 #7^Gbell
+display \X0008 12578 #8^Hbackspace
+display \X0009  2478 #9^Ihorizontal tabulation
+display \X000A  24578 #10^Jline feed
+display \X000B 1378 #11^Kvertical tabulation
+display \X000C 12378 #12^Lform feed
+display \X000D 13478 #13^Mcarriage return
+display \X000E 134578 #14^Nshift out
+display \X000F 13578 #15^Oshift in
+display \X0010 123478 #16^Pdata link escape
+display \X0011 1234578 #17^Qdevice control one
+display \X0012 123578 #18^Rdevice control two
+display \X0013 23478 #19^Sdevice control three
+display \X0014  234578 #20^Tdevice control four
+display \X0015 13678 #21^Unegative acknowledge
+display \X0016 123678 #22^Vsynchronous idle
+display \X0017  245678 #23^Wend of transmission block
+display \X0018 134678 #24^Xcancel
+display \X0019 1345678 #25^Yend of medium
+display \X001A 135678 #26^Zsubstitute
+display \X001B  24678 #27^[escape
+display \X001C 125678 #28^\file separator
+display \X001D 1245678 #29^]group separator
+display \X001E 4578 #30^^record separator
+display \X001F 45678 #31^_unit separator
+
+				#Hex	 Dots			Dec	Char	Description
+display \X00A1 23467  #	161 ¡			inverted exclamation mark
+display \X00A2 58			#162	¢			cent sign 
+display \X00A3 34567  # 163	£			pound sign
+display \X00A4 1467		# 164	¤			currency sign
+display \X00A5 123467 # 165	¥			yen sign
+display \X00A6 1567		# 166	¦			broken bar
+display \X00A7 357		# 167	§			section sign
+display \X00A8  57		# 168	¨			diaeresis
+display \X00A9  23567 # 169	©			copyright sign
+display \X00AA 8			# 170	ª			feminine ordinal indicator
+display \X00AB 1267		# 171	«			left-pointing double angle quotation mark
+display \X00AC  2567  # 172	¬			not sign
+display \X00AD 367		# 173	­			soft hyphen
+display \X00AE  2367  # 174	®			registered sign
+display \X00AF  267		# 175	¯			macron
+display \X00B0 3567		# 176	°			degree sign
+
+display \X00C0  23578		# 192		À		Latin capital letter a with grave
+display \X00C1	1678		# 193		Á		Latin capital letter a with acute
+display \X00C2	16			# 194		Â		Latin capital letter a with circumflex
+display \X00C3	578 # 195Ã Latin capital letter a with tilde
+display \X00C4	1234678 # 196Ä Latin capital letter a with diaeresis
+display \X00C5	34578 # 197Å Latin capital letter a with ring above
+display \X00C6	378 # 198Æ Latin capital letter ae
+display \X00C7	34678 # 199Ç Latin capital letter c with cedilla
+display \X00C8  23567		#	200		È		Latin capital letter e with grave
+display \X00C9	12678		# 201É Latin capital letter e with acute
+display \X00CA  2378	# 202		Ê		Latin capital letter e with circumflex
+display \X00CB 12345678 # 203Ë Latin capital letter e with diaeresis
+display \X00CC  23678 # 204Ì Latin capital letter i with grave
+display \X00CD 14678 # 205Í Latin capital letter i with acute
+display \X00CE  2578	# 206		Î		Latin capital letter i with circumflex
+display \X00CF 1235678 # 207Ï Latin capital letter i with diaeresis
+display \X00D0 678 # 208Ð Latin capital letter eth
+display \X00D1 4678 # 209Ñ Latin capital letter n with tilde
+display \X00D2 3578 # 210Ò Latin capital letter o with grave
+display \X00D3 145678 # 211Ó Latin capital letter o with acute
+display \X00D4  25678 # 212		Ô		Latin capital letter o with circumflex
+display \X00D5  5678 # 213Õ Latin capital letter o with tilde
+display \X00D6  234678 # 214Ö Latin capital letter o with diaeresis
+display \X00D7 167  # 215×multiplication sign
+display \X00D8 3478 # 216Ø Latin capital letter o with stroke
+display \X00D9 35678 # 217Ù Latin capital letter u with grave
+display \X00DA 15678 # 218Ú Latin capital letter u with acute
+display \X00DB  2678	# 219		Û		Latin capital letter u with circumflex
+display \X00DC  2345678 # 220Ü Latin capital letter u with diaeresis
+display \X00DD 124678 # 221Ý Latin capital letter y with acute
+display \X00DE 3678 # 222Þ Latin capital letter thorn
+display \X00DF 345678 # 223ß Latin small letter sharp s
+display \X00E0  2358 # 224à Latin small letter a with grave
+display \X00E1 168 # 225á Latin small letter a with acute
+display \X00E2	16		# 226		â		Latin small letter a with circumflex
+display \X00E3 58 # 227ã Latin small letter a with tilde
+display \X00E4 123468 # 228ä Latin small letter a with diaeresis
+display \X00E5 3458 # 229å Latin small letter a with ring above
+display \X00E6 38 # 230æ Latin small letter ae
+display \X00E7 3468 # 231ç Latin small letter c with cedilla
+display \X00E8  23568 # 232è Latin small letter e with grave
+display \X00E9 1268 # 233é Latin small letter e with acute
+display \X00EA  238		# 234		ê		Latin small letter e with circumflex
+display \X00EB 1234568 # 235ë Latin small letter e with diaeresis
+display \X00EC  2368 # 236ì Latin small letter i with grave
+display \X00ED 1468 # 237í Latin small letter i with acute
+display \X00EE  258		# 238		î		Latin small letter i with circumflex
+display \X00EF 123568 # 239ï Latin small letter i with diaeresis
+display \X00F0 68 # 240ð Latin small letter eth
+display \X00F1 468 # 241ñ Latin small letter n with tilde
+display \X00F2 358 # 242ò Latin small letter o with grave
+display \X00F3 14568 # 243ó Latin small letter o with acute
+display \X00F4  2568	# 244		ô		Latin small letter o with circumflex
+display \X00F5  568 # 245õ Latin small letter o with tilde
+display \X00F6  23468 # 246ö Latin small letter o with diaeresis
+display \X00F7 347  # 247÷division sign
+display \X00F8 348 # 248ø Latin small letter o with stroke
+display \X00F9 3568 # 249ù Latin small letter u with grave
+display \X00FA 1568 # 250ú Latin small letter u with acute
+display \X00FB  268		# 251		û		Latin small letter u with circumflex
+display \X00FC  234568 # 252ü Latin small letter u with diaeresis
+display \X00FD 12468 # 253ý Latin small letter y with acute
+display \X00FE 368 # 254þ Latin small letter thorn
+display \X00FF 34568 # 255ÿ Latin small letter y with diaeresis
+
+
+display \X00BB 3457  # 187»right-pointing double angle quotation mark
+display \X00B9  27  # 185¹superscript one
+display \X00B2 237  # 178²superscript two
+display \X00B3 257  # 179³superscript three
+display \X00B1 3467  # 177±plus-minus sign
+display \X00D7 167  # 215×multiplication sign
+
+display \X00B7 467  # 183·middle dot
+
+display \X00BF 14567  # 191¿inverted question mark
+
+
+display \X00B6  2357  # 182¶pilcrow sign
+
+
+#Hex Dots Dec Char Description
+display \X00BC 123567  # 188¼vulgar fraction one quarter
+display \X00BD 1234567  # 189½vulgar fraction one half
+display \X00BE  234567  # 190¾vulgar fraction three quarters
+
+# Each of the three extended accent characters is the same as its conventional
+# compose character but with dot7 added:
+
+#Hex Dots Dec Char Description
+display \X00B4 37  # 180´acute accent
+display \X00B8 67  # 184¸cedilla
+
+
+# The two gender symbols are:
+
+#Hex Dots Dec Char Description
+display \X00BA 7  # 186ºmasculine ordinal indicator
+
+
+# The three remaining characters are:
+
+#Hex Dots Dec Char Description
+
+display \X00B5  567  # 181µmicro sign
+
+
+# The nonbreaking space is dots 7 and 8 because this presents a sequence of
+# nonbreaking spaces as a smooth low line segment.
+
+#Hex Dots Dec Char Description
+
diff --git a/liblouis/tables/de-eurobrl6.dis b/liblouis/tables/de-eurobrl6.dis
new file mode 100644
index 0000000..932a4eb
--- /dev/null
+++ b/liblouis/tables/de-eurobrl6.dis
@@ -0,0 +1,98 @@
+# liblouis: German Eurobraille Display Table
+#
+#  Copyright (C) 2009 SBS Schweizerische Bibliothek für Blinde und Sehbehinderte
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#-------------------------------------------------------------------------------
+#
+#  EUROBRAILLE DISPLAY TABLE
+#
+#  This character mapping of 6-dot braille is widely being
+#  used in german speaking parts of europe.
+#
+#  Version 2009-11-19
+#  christian.waldvogel@sbszh.ch
+#
+#-------------------------------------------------------------------------------
+
+display \s 0
+display a 1
+display b 12
+display c 14
+display d 145
+display e 15
+display f 124
+display g 1245
+display h 125
+display i 24
+display j 245
+display k 13
+display l 123
+display m 134
+display n 1345
+display o 135
+display p 1234
+display q 12345
+display r 1235
+display s 234
+display t 2345
+display u 136
+display v 1236
+display x 1346
+display y 13456
+display z 1356
+display & 12346
+display % 123456
+display { 12356
+display ~ 2346
+display } 23456
+display 1 16
+display 2 126
+display 3 146
+display 4 1456
+display 5 156
+display 6 1246
+display 7 12456
+display 8 1256
+display 9 246
+display w 2456
+display , 2
+display ; 23
+display : 25
+display / 256
+display ? 26
+display + 235
+display = 2356
+display ( 236
+display * 35
+display ) 356
+display . 3
+display - 36
+display | 34
+display 0 346
+display ` 345
+display # 3456
+display " 4
+display ! 5
+display > 45
+display $ 46
+# according to the standard it should be \x007F but _ seems more convenient and used more widely
+# display \x007F 456
+display _ 456 
+display < 56
+display ' 6
diff --git a/liblouis/tables/de-eurobrl6u.dis b/liblouis/tables/de-eurobrl6u.dis
new file mode 100644
index 0000000..3e87eac
--- /dev/null
+++ b/liblouis/tables/de-eurobrl6u.dis
@@ -0,0 +1,96 @@
+# liblouis: "Upshifted" German Eurobraille Display Table
+#
+#  Copyright (C) 2009 SBS Schweizerische Bibliothek für Blinde und Sehbehinderte
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#-------------------------------------------------------------------------------
+#
+#  "Upshifted" Version of EUROBRAILLE
+#
+#  This "upshifted" version of de-eurobrl6.dis
+#  is (sometimes) being used in Switzerland.
+#
+#  Version 2009-11-19
+#  christian.waldvogel@sbszh.ch
+#
+#-------------------------------------------------------------------------------
+
+display \s 0
+display A 1
+display B 12
+display C 14
+display D 145
+display E 15
+display F 124
+display G 1245
+display H 125
+display I 24
+display J 245
+display K 13
+display L 123
+display M 134
+display N 1345
+display O 135
+display P 1234
+display Q 12345
+display R 1235
+display S 234
+display T 2345
+display U 136
+display V 1236
+display X 1346
+display Y 13456
+display Z 1356
+display & 12346
+display % 123456
+display [ 12356
+display ^ 2346
+display ] 23456
+display 1 16
+display 2 126
+display 3 146
+display 4 1456
+display 5 156
+display 6 1246
+display 7 12456
+display 8 1256
+display 9 246
+display W 2456
+display , 2
+display ; 23
+display : 25
+display / 256
+display ? 26
+display + 235
+display = 2356
+display ( 236
+display * 35
+display ) 356
+display . 3
+display - 36
+display \\ 34
+display 0 346
+display @ 345
+display # 3456
+display " 4
+display ! 5
+display > 45
+display $ 46
+display _ 456
+display < 56
+display ' 6
diff --git a/liblouis/tables/de-g0-core.uti b/liblouis/tables/de-g0-core.uti
new file mode 100644
index 0000000..88b1fe2
--- /dev/null
+++ b/liblouis/tables/de-g0-core.uti
@@ -0,0 +1,311 @@
+# liblouis: German grade 0 braille
+#
+#  Copyright (C) 2009 SBS Schweizerische Bibliothek für Blinde und Sehbehinderte
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#-------------------------------------------------------------------------------
+#
+#  DEUTSCHE BASISSCHRIFT - German grade 0 braille
+#
+#  Version 11-17-09
+#  christian.waldvogel@sbszh.ch
+#
+#-------------------------------------------------------------------------------
+
+include countries.cti
+
+# --- Braille indicator opcodes ------------------------------------------------
+
+# letsign 6
+
+# capsletter 46
+begcapsword 45
+endcapsword 6
+
+numsign 3456
+
+# --- Emphasis opcodes ---------------------------------------------------------
+
+emphclass italic
+emphclass underline
+emphclass bold
+
+endemphphrase italic after 6-3
+lenemphphrase italic 1
+begemphword italic 6-456
+endemphword italic 6-3
+emphletter italic 456
+
+endemphphrase bold after 6-3
+lenemphphrase bold 1
+begemphword bold 6-456
+endemphword bold 6-3
+emphletter bold 456
+
+endemphphrase underline after 6-3
+lenemphphrase underline 1
+begemphword underline 6-456
+endemphword underline 6-3
+emphletter underline 456
+
+begcomp 6-46
+# endcomp 6-3         # Omitted here (only to be used when longer than one word)
+
+# --- Special Symbol Opcodes ---------------------------------------------------
+
+hyphen - 36
+
+# --- Special Processing Opcodes -----------------------------------------------
+
+capsnocont
+
+# --- Translation opcodes ------------------------------------------------------
+
+# Mehrfach-Leerschläge eliminieren
+
+midnum , 2 Komma
+endnum ; 6-23 Strichpunkt
+endnum : 6-25
+endnum ? 6-26 Fragezeichen
+endnum ! 6-235 Ausrufezeichen
+always ! 235
+midword ( 6-2356 Runde Klammer auf
+midnum ( 6-2356-3456
+endnum ( 6-2356
+always ( 2356
+midword ) 6-2356 Runde Klammer zu
+midnum ) 6-2356-3456
+endnum ) 6-2356
+always ) 2356
+prepunc " 236 Anführungszeichen am Anfang
+prepunc « 236
+prepunc » 236
+endnum " 6-356 Anführungszeichen am Ende
+postpunc " 356
+postpunc » 356
+postpunc « 356
+midnum . 3 Punkt
+always .\s.\s. 3-3-3
+midnum ' 3 Apostroph (Gliederung grosser Zahlen)
+
+always ** 6-35-35 Anmerkungssternchen
+always *** 6-35-35-35
+prepunc \x2039 6-236 Halbes Anführungszeichen am Anfang
+prepunc \x203a 6-236
+prepunc \x2018 6-236
+prepunc \x2019 6-236
+postpunc \x2039 6-356 Halbes Anführungszeichen am Ende
+postpunc \x203a 6-356
+postpunc \x2018 6-356
+postpunc \x2019 6-356
+
+always \x2192 0-25-25-135-0 Pfeil nach rechts
+always \x2190 0-246-25-25-0 Pfeil nach links
+always \x2194 0-246-25-25-135-0 Pfeil nach links und rechts
+always & 5-136 Et-Zeichen
+
+include litdigits6Dots.uti
+
+midnum ' 3
+
+endnum a 6-1
+endnum b 6-12
+endnum c 6-14
+endnum d 6-145
+endnum e 6-15
+endnum f 6-124
+endnum g 6-1245
+endnum h 6-125
+endnum i 6-24
+endnum j 6-245
+
+always % 3456-245-356 Prozent
+always \s% 3456-245-356
+always \s\x2030 3456-245-356-356 Promille 0/00
+always \s\x2031 3456-245-356-356-356 0/000
+always \s° 4-356 Grad
+always \s\x2032 4-35 Winkelminute
+always \s\x2033 4-35-35 Winkelsekunde
+
+begnum § 346 Paragrafzeichen
+joinnum § 346
+
+endnum .-- 3-36-36
+endnum ,-- 2-36-36
+
+always \s-\s 6-36-0 Gedankenstrich
+always \s-- 6-36
+always -- 6-36 Streckenstrich
+always \s\x2013 6-36 EN DASH
+always \s\x2014 6-36 EM DASH
+
+always / 5-2 Schrägstrich
+always | 0-456-123-0 Senkrechter Strich
+
+joinnum £ 4-123 Pfund
+joinnum $ 4-234 Dollar
+always $ 4-234 Dollar
+joinnum ¢ 4-14 Cent
+joinnum ¥ 4-13456 Yen
+joinnum Fr. 124-1235-3 Franken    !!! TUT NICHT !!!
+joinnum Fr 124-1235
+joinnum F 124
+
+# Plus:
+midnum \s+\s 0-4-235-3456
+midnum \s+ 0-4-235-3456
+midnum + 0-4-235-3456
+always + 4-235
+# Minus:
+begnum \s- 0-4-36-3456
+always \s- 0-6-36
+midnum \s\x2212\s 0-4-36-3456
+midnum \s\x2212 0-4-36-3456
+midnum \x2212 0-4-36-3456
+always \x2212 4-36
+# Plus Minus:
+midnum \s±\s 0-4-235-36-3456
+midnum \s± 0-4-235-36-3456
+midnum ± 0-4-235-36-3456
+always ± 4-235-36
+# Gleich:
+midnum \s=\s 0-4-2356-3456
+midnum \s= 0-4-2356-3456
+midnum = 0-4-2356-3456
+always = 4-2356
+# Ungleich:
+midnum \s\x2260\s 0-4-35-2356-3456
+midnum \s\x2260 0-4-35-2356-3456
+midnum \x2260 0-4-35-2356-3456
+always \x2260 4-35-2356
+# Identisch gleich:
+midnum \s\x2261\s 0-4-2356-2356-3456
+midnum \s\x2261 0-4-2356-2356-3456
+midnum \x2261 0-4-2356-2356-3456
+always \x2261 4-2356-2356
+# Äquivalent:
+midnum \s\x2259\s 0-4-26-3456
+midnum \s\x2259 0-4-26-3456
+midnum \x2259 0-4-26-3456
+always \x2259 4-26
+# Ungefähr gleich:
+midnum \s\x2245\s 0-4-26-26-3456
+midnum \s\x2245 0-4-26-26-3456
+midnum \x2245 0-4-26-26-3456
+always \x2245 4-26-26
+# Mal(-Kreuz):
+midnum \s×\s 0-4-236-3456
+midnum \s× 0-4-236-3456
+midnum × 0-4-236-3456
+always × 4-236
+# Mal(-Stern):
+midnum \s\x2217\s 3-3456
+midnum \s\x2217 3-3456
+midnum \x2217 3-3456
+midnum \s*\s 3-3456
+midnum \s* 3-3456
+midnum * 3-3456
+# Anmerkungssternchen:
+always * 6-35
+# Mal(-Punkt):
+midnum \s\x22c5\s 3-3456
+midnum \s\x22c5 3-3456
+midnum \x22c5 3-3456
+# Mal(-Stern):
+midnum \s\x22c6\s 3-3456
+midnum \s\x22c6 3-3456
+midnum \x22c6 3-3456
+# Doppelpunkt (dividiert durch, verhält sich zu):
+midnum \s:\s 4-25-3456
+midnum \s: 4-25-3456
+midnum : 4-25-3456
+midnum \s÷\s 0-4-25-3456
+midnum \s÷ 0-4-25-3456
+midnum ÷ 0-4-25-3456
+always ÷ 4-25
+midnum \s\x2215\s 0-4-25-3456
+midnum \s\x2215 0-4-25-3456
+midnum \x2215 0-4-25-3456
+always \x2215 4-25
+# Proportional:
+midnum \s~\s 0-4-25-25-3456
+midnum \s~ 0-4-25-25-3456
+midnum ~ 0-4-25-25-3456
+always ~ 4-25-25
+midnum \s\x223C\s 0-4-25-25-3456
+midnum \s\x223C 0-4-25-25-3456
+midnum \x223C 0-4-25-25-3456
+always \x223C 4-25-25
+# Kleiner als:
+midnum \s<\s 0-4-246-3-3456
+midnum \s< 0-4-246-3-3456
+midnum < 0-4-246-3-3456
+always < 4-246-3
+# Kleiner oder gleich:
+midnum \s\x2264\s 0-4-246-2356-3456
+midnum \s\x2264 0-4-246-2356-3456
+midnum \x2264 0-4-246-2356-3456
+always \x2264 4-246-2356
+midnum \s\x2266\s 0-4-246-2356-3456
+midnum \s\x2266 0-4-246-2356-3456
+midnum \x2266 0-4-246-2356-3456
+always \x2266 4-246-2356
+# Grösser als:
+midnum \s>\s 0-4-135-2-3456
+midnum \s> 0-4-135-2-3456
+midnum > 0-4-135-2-3456
+always > 4-135-2
+# Grösser oder gleich:
+midnum \s\x2265\s 0-4-135-2356-3456
+midnum \s\x2265 0-4-135-2356-3456
+midnum \x2265 0-4-135-2356-3456
+always \x2265 4-135-2356
+midnum \s\x2267\s 0-4-135-2356-3456
+midnum \s\x2267 0-4-135-2356-3456
+midnum \x2267 0-4-135-2356-3456
+always \x2267 4-135-2356
+
+
+# special character sequences
+
+literal :// URLs
+literal www.
+literal @ Mail-address
+
+literal .com
+literal .edu
+literal .gov
+literal .mil
+literal .net
+literal .org
+
+literal .doc
+literal .htm
+literal .html
+literal .tex
+literal .txt
+
+literal .gif
+literal .jpg
+literal .png
+literal .wav
+
+literal .tar
+literal .zip
+
+
diff --git a/liblouis/tables/de-g1-core.cti b/liblouis/tables/de-g1-core.cti
new file mode 100644
index 0000000..d07c26c
--- /dev/null
+++ b/liblouis/tables/de-g1-core.cti
@@ -0,0 +1,1595 @@
+# liblouis: German grade 1 braille
+#
+#  Copyright (C) 2009 SBS Schweizerische Bibliothek für Blinde und Sehbehinderte
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#-------------------------------------------------------------------------------
+#
+#  DEUTSCHE VOLLSCHRIFT - German Grade 1 Braille
+#
+#  Version 11-17-09
+#  christian.waldvogel@sbszh.ch
+#
+#-------------------------------------------------------------------------------
+
+
+class i i
+class u u
+
+# AU
+always au 16
+always kapernaum 13-1-1234-12456-1345-1-136-134
+always propaganda 1234-1235-135-1234-1-1245-1-1345-145-1
+always europa 126-1235-135-1234-1
+before u begmidword extra 15-1346-2345-1235-1
+always galauniform 1245-1-123-1-136-1345-24-124-135-1235-134
+before u begmidword intra 24-1345-2345-1235-1
+always kamera 13-1-134-15-1235-1
+always pharma 1234-125-1-1235-134-1
+
+# ÄU
+always äu 34
+always skarabäus 234-13-1-1235-1-12-345-136-234
+always thaddäus 2345-125-1-145-145-345-136-234
+midendword igäum 24-1245-345-136-134
+always apogäum 1-1234-135-1245-345-136-134
+always trochäus 2345-1235-135-1456-345-136-234
+always matthäus 134-1-2345-2345-125-345-136-234
+always jubiläum 245-136-12-24-123-345-136-134
+always ptolemäus 1234-2345-135-123-15-134-345-136-234
+always bartimäus 12-1-1235-2345-24-134-345-136-234
+always bartholomäus 12-1-1235-2345-125-135-123-135-134-345-136-234
+always borromäus 12-135-1235-1235-135-134-345-136-234
+always athenäum 1-2345-125-15-1345-345-136-134
+always piräus 1234-24-1235-345-136-234
+
+# CH
+always ch 1456
+
+# EI
+always ei 146
+midendword eideal 15-24-145-15-1-123
+midendword eidee 15-24-145-15-15
+begmidword getreidee 1245-15-2345-1235-146-145-15-15
+begmidword getreideein 1245-15-2345-1235-146-145-15-146-1345
+begmidword schneideein 156-1345-146-145-15-146-1345
+midendword eidentifi 15-24-145-15-1345-2345-24-124-24
+midendword eidentisch 15-24-145-15-1345-2345-24-156
+midendword eidentität 15-24-145-15-1345-2345-24-2345-345-2345
+midendword eideo 15-24-145-15-135
+midendword eidyll 15-24-145-13456-123-123
+midendword eignor 15-24-1245-1345-135-1235
+midword eikon 15-24-13-135-1345
+always reederei 1235-15-15-145-15-1235-146
+always fischerei 124-24-156-15-1235-146
+always molkerei 134-135-123-13-15-1235-146
+always datei 145-1-2345-146
+always polizei 1234-135-123-24-1356-146
+begmidword freikon 124-1235-146-13-135-1345
+begmidword parteikon 1234-1-1235-2345-146-13-135-1345
+midendword eille 15-24-123-123-15
+begmidword teillei 2345-146-123-123-146
+midword eilleus 15-24-123-123-126-234
+begmidword marseill 134-1-1235-234-15-24-123-123
+midendword eilloy 15-24-123-123-135-13456
+midendword eillu 15-24-123-123-136
+midendword eimag 15-24-134-1-1245
+always geheim 1245-15-125-146-134
+midendword eimbiss 15-24-134-12-24-234-234
+midendword eimit 15-24-134-24-2345
+always arzneimittel 1-1235-1356-1345-146-134-24-2345-2345-15-123
+always eimitgl 146-134-24-2345-1245-123
+always eimitt 146-134-24-2345-2345
+midendword eimker 15-24-134-13-15-1235
+midendword eimm 15-24-134-134
+always leim 123-146-134
+always heim 125-146-134
+midendword eimp 15-24-134-1234
+always keim 13-146-134
+always reimpaar 1235-146-134-1234-1-1-1235
+# MACHNOCH: von G2: alle "EIN" abgleichen
+midendword eindex 15-24-1345-145-15-1346
+midendword eindik 15-24-1345-145-24-13
+midendword eindio 15-24-1345-145-24-135
+midendword eindiz 15-24-1345-145-24-1356
+midendword einduk 15-24-1345-145-136-13
+midendword eindust 15-24-1345-145-136-23456
+midendword einduzier 15-24-1345-145-136-1356-346-1235
+midword eineff 15-24-1345-15-124-124
+midendword einfant 15-24-1345-124-1-1345-2345
+midword einfark 15-24-1345-124-1-1235-13
+midendword einfekt 15-24-1345-124-15-13-2345
+midendword einfektion 15-24-1345-124-15-13-2345-24-135-1345
+midword einfer 15-24-1345-124-15-1235
+midword einfilt 15-24-1345-124-24-123-2345
+midendword einfinit 15-24-1345-124-24-1345-24-2345
+midword einfiz 15-24-1345-124-24-1356
+midword einflat 15-24-1345-124-123-1-2345
+midendword einfo 15-24-1345-124-135
+always klein 13-123-146-1345
+always schein 156-146-1345
+always reinform 1235-146-1345-124-135-1235-134
+midendword einfusion 15-24-1345-124-136-234-24-135-1345
+midendword einhab 15-24-1345-125-1-12
+midendword einhala 15-24-1345-125-1-123-1
+midendword einhalier 15-24-1345-125-1-123-346-1235
+midendword einhär 15-24-1345-125-345-1235
+midendword einhomo 15-24-1345-125-135-134-135
+midendword einhuman 15-24-1345-125-136-134-1-1345
+midendword einit 15-24-1345-24-2345
+midendword einj 15-24-1345-245
+begmidword feinj 124-146-1345-245
+midendword einkarn 15-24-1345-13-1-1235-1345
+midendword einkasso 15-24-1345-13-1-234-234-135
+midendword einklu 15-24-1345-13-123-136
+midendword einkomp 15-24-1345-13-135-134-1234
+midendword einkon 15-24-1345-13-135-1345
+always wein 2456-146-1345
+midendword einkub 15-24-1345-13-136-12
+midendword einland 15-24-1345-123-1-1345-145
+always stein 23456-146-1345
+always rhein 1235-125-146-1345
+midendword einnen 15-24-1345-1345-15-1345
+midendword einner 15-24-1345-1345-15-1235
+begmidword beinnerv 12-146-1345-1345-15-1235-1236
+begmidword feinnerv 124-146-1345-1345-15-1235-1236
+midendword einnov 15-24-1345-1345-135-1236
+midendword einnung 15-24-1345-1345-136-1345-1245
+midendword einput 15-24-1345-1234-136-2345
+midendword einschrift 15-24-1345-156-1235-24-124-2345
+always latein 123-1-2345-146-1345
+always reinschrift 1235-146-1345-156-1235-24-124-2345
+midendword einsekt 15-24-1345-234-15-13-2345
+midendword einserat 15-24-1345-234-15-1235-1-2345
+midendword einserent 15-24-1345-234-15-1235-15-1345-2345
+midendword einserier 15-24-1345-234-15-1235-346-1235
+midendword einsert 15-24-1345-234-15-1235-2345
+midendword einsider 15-24-1345-234-24-145-15-1235
+midendword einsign 15-24-1345-234-24-1245-1345
+midendword einsist 15-24-1345-234-24-23456
+midendword einsolv 15-24-1345-234-135-123-1236
+midendword einspekt 15-24-1345-234-1234-15-13-2345
+midendword einspir 15-24-1345-234-1234-24-1235
+midendword einspiz 15-24-1345-234-1234-24-1356
+midendword einstabil 15-24-1345-23456-1-12-24-123
+midendword einstall 15-24-1345-23456-1-123-123
+midendword einstanz 15-24-1345-23456-1-1345-1356
+midendword einstinkt 15-24-1345-23456-24-1345-13-2345
+midendword einstit 15-24-1345-23456-24-2345
+midendword einstrument 15-24-1345-23456-1235-136-134-15-1345-2345
+always feinstrumpf 124-146-1345-23456-1235-136-134-1234-124
+midendword einsul 15-24-1345-234-136-123
+midendword einszen 15-24-1345-234-1356-15-1345
+midendword eintegr 15-24-1345-2345-15-1245-1235
+midendword eintell 15-24-1345-2345-15-123-123
+midendword eintend 15-24-1345-2345-15-1345-145
+always allgemein 1-123-123-1245-15-134-146-1345
+midendword eintens 15-24-1345-2345-15-1345-234
+midendword eintent 15-24-1345-2345-15-1345-2345
+midendword einter 15-24-1345-2345-15-1235
+always gemein 1245-15-134-146-1345
+always geeinter 1245-15-146-1345-2345-15-1235
+always vereinter 1236-15-1235-146-1345-2345-15-1235
+always vermeinter 1236-15-1235-134-146-1345-2345-15-1235
+always verneinter 1236-15-1235-1345-146-1345-2345-15-1235
+midendword eintol 15-24-1345-2345-135-123
+midendword eintra 15-24-1345-2345-1235-1
+always eintracht 146-1345-2345-1235-1-1456-2345
+always eintraf 146-1345-2345-1235-1-124
+always eintrag 146-1345-2345-1235-1-1245
+always eintrat 146-1345-2345-1235-1-2345
+always eintraust 146-1345-2345-1235-16-23456
+always eintraut 146-1345-2345-1235-16-2345
+midendword eintrig 15-24-1345-2345-1235-24-1245
+midendword eintro 15-24-1345-2345-1235-135
+always eintrock 146-1345-2345-1235-135-14-13
+always eintromm 146-1345-2345-1235-135-134-134
+always eintropf 146-1345-2345-1235-135-1234-124
+midendword eintui 15-24-1345-2345-136-24
+midendword einvalid 15-24-1345-1236-1-123-24-145
+midendword einvasion 15-24-1345-1236-1-234-24-135-1345
+midendword einvent 15-24-1345-1236-15-1345-2345
+midendword einvert 15-24-1345-1236-15-1235-2345
+always alleinver 1-123-123-146-1345-1236-15-1235
+always feinver 124-146-1345-1236-15-1235
+always scheinver 156-146-1345-1236-15-1235
+always rhein 1235-125-146-1345
+midendword einvest 15-24-1345-1236-15-23456
+midendword eion 15-24-135-1345
+midendword eirr 15-24-1235-1235
+midendword eisolat 15-24-234-135-123-1-2345
+midendword eisolier 15-24-234-135-123-346-1235
+midendword eiterier 15-24-2345-15-1235-346-1235
+midendword eiterat 15-24-2345-15-1235-1-2345
+always beijing 12-15-24-245-24-1345-1245
+begmidword beimpf 12-15-24-134-1234-124
+always beinhalt 12-15-24-1345-125-1-123-2345
+always beirr 12-15-24-1235-1235
+always deifikation 145-15-24-124-24-13-1-2345-24-135-1345
+always deindividuation 145-15-24-1345-145-24-1236-24-145-136-1-2345-24-135-1345
+always deist 145-15-24-23456
+always badeinsel 12-1-145-15-24-1345-234-15-123
+sufword fidei 124-24-145-15-24
+always codein 14-135-145-15-24-1345
+always kodein 13-135-145-15-24-1345
+midendword deist 145-15-24-23456
+midendword deistisch 145-15-24-23456-24-156
+always schnee 156-1345-15-15
+always seeigel 234-15-15-24-1245-15-123
+always sightseeing 234-24-1245-125-2345-234-15-15-24-1345-1245
+midendword eeinsel 15-15-24-1345-234-15-123
+midendword seeisch 234-15-15-24-156
+always coffein 14-135-124-124-15-24-1345
+always koffein 13-135-124-124-15-24-1345
+midendword geinhalt 1245-15-24-1345-125-1-123-2345
+begmidword geirr 1245-15-24-1235-1235
+begmidword geimpf 1245-15-24-134-1234-124
+always eheinstitut 15-125-15-24-1345-23456-24-2345-136-2345
+always prometheisch 1234-1235-135-134-15-2345-125-15-24-156
+always theismus 2345-125-15-24-234-134-136-234
+always theist 2345-125-15-24-23456
+before i begmidword kohle 13-135-125-123-15
+always leim 123-146-134
+always galilei 1245-1-123-24-123-15-24
+always nuklein 1345-136-13-123-15-24-1345
+always acrolein 1-14-1235-135-123-15-24-1345
+always akrolein 1-13-1235-135-123-15-24-1345
+before i begmidword wärme 2456-345-1235-134-15
+always schweineigel 156-2456-146-1345-15-24-1245-15-123
+always äneis 345-1345-15-24-234
+always aeneis 1-15-1345-15-24-234
+midendword aneität 1-1345-15-24-2345-345-2345
+sufword alineier 1-123-24-1345-15-346-1235
+always guineisch 1245-136-24-1345-15-24-156
+always boeing 12-135-15-24-1345-1245
+always nereide 1345-15-1235-15-24-145-15
+always kreier 13-1235-15-346-1235
+always pythagoreisch 1234-13456-2345-125-1-1245-135-1235-15-24-156
+always epikureisch 15-1234-24-13-136-1235-15-24-156
+always eritreisch 15-1235-24-2345-1235-15-24-156
+always kureismus 13-136-1235-15-24-234-134-136-234
+always diagnose 145-24-1-1245-1345-135-234-15
+always kasein 13-1-234-15-24-1345
+before i begmidword kälte 13-345-123-2345-15
+always protein 1234-1235-135-2345-15-24-1345
+always weight 2456-15-24-1245-125-2345
+
+# EU
+always eu 126
+midendword eunkosten 15-136-1345-13-135-23456-15-1345
+always beunruhig 12-15-136-1345-1235-136-125-24-1245
+always beurkund 12-15-136-1235-13-136-1345-145
+always beurlaub 12-15-136-1235-123-16-12
+always beurteil 12-15-136-1235-2345-146-123
+before u begmidword gewebe 1245-15-2456-15-12-15
+before u begmidword probe 1234-1235-135-12-15
+before u begmidword werbe 2456-15-1235-12-15
+always sterbeuhr 23456-15-1235-12-15-136-125-1235
+before u begmidword vice 1236-24-14-15
+before u begmidword lyce 123-13456-14-15
+always deus 145-15-136-234
+always amadeus 1-134-1-145-15-136-234
+before u begmidword bade 12-1-145-15
+before u begmidword bade 12-1-145-15
+before u begmidword lade 123-1-145-15
+before u begmidword parade 1234-1-1235-1-145-15
+always tedeum 2345-15-145-15-136-134
+before u begmidword code 14-135-145-15
+always gemeindeum 1245-15-134-146-1345-145-15-136-134
+always kundeunter 13-136-1345-145-15-136-1345-2345-15-1235
+always landeunter 123-1-1345-145-15-136-1345-2345-15-1235
+always spondeus 234-1234-135-1345-145-15-136-234
+always tedeum 2345-15-145-15-136-134
+always armeeun 1-1235-134-15-15-136-1345
+always peeun 1234-15-15-136-1345
+always seeufer 234-15-15-136-124-15-1235
+always seeum 234-15-15-136-134
+always seeun 234-15-15-136-1345
+always spreeufer 234-1234-1235-15-15-136-124-15-1235
+before u begmidword hilfe 125-24-123-124-15
+always ausgeufert 16-234-1245-15-136-124-15-1235-2345
+always folgeunter 124-135-123-1245-15-136-1345-2345-15-1235
+always geupdated 1245-15-136-1234-145-1-2345-15-145
+always geurteil 1245-15-136-1235-2345-146-123
+always sorgeunter 234-135-1235-1245-15-136-1345-2345-15-1235
+always rechercheur 1235-15-1456-15-1235-1456-126-1235
+before u begmidword recherche 1235-15-1456-15-1235-1456-15
+before u begmidword beinahe 12-146-1345-1-125-15
+before u begmidword leihe 123-146-125-15
+before u begmidword ruhe 1235-136-125-15
+before u begmidword stärke 23456-345-1235-13-15
+always makeup 134-1-13-15-136-1234
+always bakkalaure 12-1-13-13-1-123-16-1235-15
+always aleuten 1-123-15-136-2345-15-1345
+always aleutisch 1-123-15-136-2345-24-156
+always nucleus 1345-136-14-123-15-136-234
+before u begmidword kohle 13-135-125-123-15
+always ileus 24-123-15-136-234
+always nukleus 1345-136-13-123-15-136-234
+always oleum 135-123-15-136-134
+always linoleum 123-24-1345-135-123-15-136-134
+always mausoleum 134-16-234-135-123-15-136-134
+always petroleum 1234-15-2345-1235-135-123-15-136-134
+always herculaneum 125-15-1235-14-136-123-1-1345-15-136-134
+before u begmidword marine 134-1-1235-24-1345-15
+before u begmidword routine 1235-135-136-2345-24-1345-15
+always marneufer 134-1-1235-1345-15-136-124-15-1235
+always oeuvre 246-136-1236-1235-15
+always bakkalaure 12-1-13-13-1-123-16-1235-15
+before u begmidword ware 2456-1-1235-15
+before u begmidword reise 1235-146-234-15
+before u begmidword presse 1234-1235-15-2346-15
+always colosseum 14-135-123-135-234-234-15-136-134
+always kolosseum 13-135-123-135-234-234-15-136-134
+always presseun 1234-1235-15-234-234-15-136-1345
+before u begmidword gehäuse 1245-15-125-34-234-15
+always museum 134-136-234-15-136-134
+before u begmidword geräte 1245-15-1235-345-2345-15
+before u begmidword elite 15-123-24-2345-15
+always andrözeum 1-1345-145-1235-246-1356-15-136-134
+always lyzeum 123-13456-1356-15-136-134
+before u begmidword vize 1236-24-1356-15
+
+# IE
+midendword ie 346
+midendword iell 24-15-123-123
+always haie 125-1-24-15
+always schanghai 156-1-1345-1245-125-1-24
+always shanghai 234-125-1-1345-1245-125-1-24
+always lakaien 123-1-13-1-24-15-1345
+always tokaier 2345-135-13-1-24-15-1235
+always laie 123-1-24-15
+always malaie 134-1-123-1-24-15
+always maien 134-1-24-15-1345
+always maier 134-1-24-15-1235
+always monnaie 134-135-1345-1345-1-24-15
+word bien 12-24-15-1345
+begword bien 12-346-1345
+midendword bien 12-24-15-1345
+always bienn 12-24-15-1345-1345
+always skabies 234-13-1-12-24-15-234
+always honigbien 125-135-1345-24-1245-12-346-1345
+always mörtelbien 134-246-1235-2345-15-123-12-346-1345
+always kolumbier 13-135-123-136-134-12-24-15-1235
+always hosenbien 125-135-234-15-1345-12-346-1345
+always wespenbien 2456-15-234-1234-15-1345-12-346-1345
+always garderobier 1245-1-1235-145-15-1235-135-12-24-15-1235
+always adverbi 1-145-1236-15-1235-12-24
+always arbeiterbien 1-1235-12-146-2345-15-1235-12-346-1345
+always feuerbien 124-126-15-1235-12-346-1345
+always futterbien 124-136-2345-2345-15-1235-12-346-1345
+always mauerbien 134-16-15-1235-12-346-1345
+always trauerbien 2345-1235-16-15-1235-12-346-1345
+always arbeitsbien 1-1235-12-146-2345-234-12-346-1345
+always lesbier 123-15-234-12-24-15-1235
+always trachtbien 2345-1235-1-1456-2345-12-346-1345
+always nubier 1345-136-12-24-15-1235
+always holzbien 125-135-123-1356-12-346-1345
+always pelzbien 1234-15-123-1356-12-346-1345
+#                                      cie
+always ciego 14-24-15-1245-135
+always ancien 1-1345-14-24-15-1345
+always ancier 1-1345-14-24-15-1235
+always lancier 123-1-1345-14-346-1235
+always nuancier 1345-136-1-1345-14-346-1235
+always avancier 1-1236-1-1345-14-346-1235
+always rencier 1235-15-1345-14-24-15-1235
+always concierge 14-135-1345-14-24-15-1235-1245-15
+always societas 234-135-14-24-15-2345-1-234
+always society 234-135-14-24-15-2345-13456
+always science 234-14-24-15-1345-14-15
+always sciento 234-14-24-15-1345-2345-135
+always saucier 234-16-14-24-15-1235
+always diego 145-24-15-1245-135
+always dielektr 145-24-15-123-15-13-2345-1235
+word dien 145-346-1345
+midendword dien 145-24-15-1345
+always diene 145-346-1345-15
+always medien 134-15-145-24-15-1345
+always dienlich 145-346-1345-123-24-1456
+always dienst 145-346-1345-23456
+always dienstag 145-346-1345-234-2345-1-1245
+always dient 145-346-1345-2345
+#                                      dier
+word diet 145-24-15-2345
+always diethyl 145-24-15-2345-125-13456-123
+prfword dieu 145-24-126
+always adieu 1-145-24-126
+always barbadier 12-1-1235-12-1-145-24-15-1235
+always brigadier 12-1235-24-1245-1-145-24-15-1235
+always arkadier 1-1235-13-1-145-24-15-1235
+always kanadier 13-1-1345-1-145-24-15-1235
+always gradient 1245-1235-1-145-24-15-1345-2345
+always bedien 12-15-145-346-1345
+always gedient 1245-15-145-346-1345-2345
+always expedient 15-1346-1234-15-145-24-15-1345-2345
+always andien 1-1345-145-346-1345
+always burundier 12-136-1235-136-1345-145-24-15-1235
+always komödie 13-135-134-246-145-24-15
+always tragödie 2345-1235-1-1245-246-145-24-15
+always verdien 1236-15-1235-145-346-1345
+always kapverdier 13-1-1234-1236-15-1235-145-24-15-1235
+always studie 23456-136-145-24-15
+always studier 23456-136-145-346-1235
+always fierant 124-24-15-1235-1-1345-2345
+always fiesta 124-24-15-234-2345-1
+endword grafien 1245-1235-1-124-24-15-1345
+midendword schauffier 234-1456-16-124-124-346-1235
+always identifier 24-145-15-1345-2345-24-124-24-15-1235
+always profierfahr 1234-1235-135-124-24-15-1235-124-1-125-1235
+midendword gien 1245-24-15-1345
+always gieneutral 1245-346-1345-126-2345-1235-1-123
+always gieniveau 1245-346-1345-24-1236-15-16
+always magier 134-1-1245-24-15-1235
+always belgier 12-15-123-1245-24-15-1235
+always orgie 135-1235-1245-24-15
+always georgier 1245-15-135-1235-1245-24-15-1235
+always hierarch 125-24-15-1235-1-1235-1456
+always hierarchie 125-24-15-1235-1-1235-1456-346
+always hierarchien 125-24-15-1235-1-1235-1456-24-15-1345
+always hieroglyph 125-24-15-1235-135-1245-123-13456-1234-125
+always hieronymus 125-24-15-1235-135-1345-13456-134-136-234
+always chien 1456-24-15-1345
+always alighieri 1-123-24-1245-125-24-15-1235-24
+endword graphien 1245-1235-1-1234-125-24-15-1345
+prfword philosophien 1234-125-24-123-135-234-135-1234-125-24-15-1345
+#                                     thie
+always thierry 2345-125-24-15-1235-1235-13456
+always pathien 1234-1-2345-125-24-15-1345
+always forsythie 124-135-1235-234-13456-2345-125-24-15
+always kiellini 13-346-123-123-24-1345-24
+always kiew 13-24-15-2456
+always thrakien 2345-125-1235-1-13-24-15-1345
+always bankier 12-1-1345-13-24-15-1235
+sufword skier 234-13-24-15-1235
+always abfahrtsskier 1-12-124-1-125-1235-2345-234-234-13-24-15-1235
+always laufskier 123-16-124-234-13-24-15-1235
+always tourenskier 2345-135-136-1235-15-1345-234-13-24-15-1235
+always wasserskier 2456-1-234-234-15-1235-234-13-24-15-1235
+#                                      lier
+midendword lien 123-24-15-1345
+always lieutenant 123-24-126-2345-15-1345-1-1345-2345
+#                                     alie
+always zerealie 1356-15-1235-15-1-123-24-15
+always chemikalie 1456-15-134-24-13-1-123-24-15
+always somalier 234-135-134-1-123-24-15-1235
+always formalie 124-135-1235-134-1-123-24-15
+always marginalie 134-1-1235-1245-24-1345-1-123-24-15
+always lappalie 123-1-1234-1234-1-123-24-15
+always aralie 1-1235-1-123-24-15
+always salier 234-1-123-24-15-1235
+always nasalier 1345-1-234-1-123-346-1235
+always drangsalier 145-1235-1-1345-1245-234-1-123-346-1235
+always repressalie 1235-15-1234-1235-15-234-234-1-123-24-15
+always australier 16-23456-1235-1-123-24-15-1235
+always chevalier 1456-15-1236-1-123-24-15-1235
+always richelieu 1235-24-1456-15-123-24-126
+always kamelie 13-1-134-15-123-24-15
+always sommelier 234-135-134-134-15-123-24-15-1235
+always relief 1235-15-123-24-15-124
+always atelier 1-2345-15-123-24-15-1235
+always hotelier 125-135-2345-15-123-24-15-1235
+always dahlie 145-1-125-123-24-15
+always immobili 24-134-134-135-12-24-123-24
+always lilie 123-24-123-24-15
+always milieu 134-24-123-24-126
+always famili 124-1-134-24-123-24
+always emilie 15-134-24-123-24-15
+always leutemilieu 123-126-2345-15-134-24-123-24-126
+always petersilie 1234-15-2345-15-1235-234-24-123-24-15
+always ottilie 135-2345-2345-24-123-24-15
+always gallier 1245-1-123-123-24-15-1235
+always montpellier 134-135-1345-2345-1234-15-123-123-24-15-1235
+always collier 14-135-123-123-24-15-1235
+always kollier 13-135-123-123-24-15-1235
+always protokollier 1234-1235-135-2345-135-13-135-123-123-346-1235
+always gondolier 1245-135-1345-145-135-123-24-15-1235
+always folie 124-135-123-24-15
+always moliere 134-135-123-24-15-1235-15
+midendword emolier 15-134-135-123-346-1235
+always magnolie 134-1-1245-1345-135-123-24-15
+always voliere 1236-135-123-24-15-1235-15
+always julier 245-136-123-24-15-1235
+always juliet 245-136-123-24-15-2345
+always apulier 1-1234-136-123-24-15-1235
+midendword mien 134-24-15-1345
+always miene 134-346-1345-15
+always mienerkl 134-24-15-1345-15-1235-13-123
+always mesopotami 134-15-234-135-1234-135-2345-1-134-24
+always prämie 1234-1235-345-134-24-15
+always prämier 1234-1235-345-134-346-1235
+always premier 1234-1235-15-134-24-15-1235
+always krimieck 13-1235-24-134-24-15-14-13
+always mumie 134-136-134-24-15
+midendword nien 1345-24-15-1345
+#                                      nier
+always daniel 145-1-1345-24-15-123
+always jordanier 245-135-1235-145-1-1345-24-15-1235
+always tasmani 2345-1-234-134-1-1345-24
+always spaniel 234-1234-1-1345-24-15-123
+always spanier 234-1234-1-1345-24-15-1235
+always geranie 1245-15-1235-1-1345-24-15
+always akranier 1-13-1235-1-1345-24-15-1235
+always oranier 135-1235-1-1345-24-15-1235
+always turanier 2345-136-1235-1-1345-24-15-1235
+always tansanier 2345-1-1345-234-1-1345-24-15-1235
+always mauretanier 134-16-1235-15-2345-1-1345-24-15-1235
+always kastanie 13-1-23456-1-1345-24-15
+syllable ingenieur 24-1345-1245-15-1345-24-126-1235
+always armenier 1-1235-134-15-1345-24-15-1235
+always slowenier 234-123-135-2456-15-1345-24-15-1235
+always xenie 1346-15-1345-24-15
+always insignie 24-1345-234-24-1245-1345-24-15
+always carabinier 14-1-1235-1-12-24-1345-24-15-1235
+always robinie 1235-135-12-24-1345-24-15
+always jardinier 245-1-1235-145-24-1345-24-15-1235
+always sardinier 234-1-1235-145-24-1345-24-15-1235
+always linie 123-24-1345-24-15
+always linier 123-24-1345-346-1235
+always miniechs 134-24-1345-24-15-1456-234
+always minieisen 134-24-1345-24-146-234-15-1345
+always pinie 1234-24-1345-24-15
+always abessinier 1-12-15-234-234-24-1345-24-15-1235
+always grusinier 1245-1235-136-234-24-1345-24-15-1235
+always aktinie 1-13-2345-24-1345-24-15
+always argentinier 1-1235-1245-15-1345-2345-24-1345-24-15-1235
+prfword routinier 1235-135-136-2345-24-1345-24-15-1235
+always routiniers 1235-135-136-2345-24-1345-24-15-1235-234
+always gloxinie 1245-123-135-1346-24-1345-24-15
+always insomnien 24-1345-234-135-134-1345-24-15-1345
+always zinnie 1356-24-1345-1345-24-15
+always bonbonniere 12-135-1345-12-135-1345-1345-24-15-1235-15
+always saisonnier 234-1-24-234-135-1345-1345-24-15-1235
+always chansonnier 1456-1-1345-234-135-1345-1345-24-15-1235
+always kaledonier 13-1-123-15-145-135-1345-24-15-1235
+always makedonier 134-1-13-15-145-135-1345-24-15-1235
+always mazedonier 134-1-1356-15-145-135-1345-24-15-1235
+always begonie 12-15-1245-135-1345-24-15
+always aragonier 1-1235-1-1245-135-1345-24-15-1235
+always babylonier 12-1-12-13456-123-135-1345-24-15-1235
+always katalonier 13-1-2345-1-123-135-1345-24-15-1235
+always slawonier 234-123-1-2456-135-1345-24-15-1235
+always dernier 145-15-1235-1345-24-15-1235
+always kinderniere 13-24-1345-145-15-1235-1345-346-1235-15
+always rinderniere 1235-24-1345-145-15-1235-1345-346-1235-15
+always spenderniere 234-1234-15-1345-145-15-1235-1345-346-1235-15
+always wanderniere 2456-1-1345-145-15-1235-1345-346-1235-15
+prfword hernie 125-15-1235-1345-24-15
+always hernien 125-15-1235-1345-24-15-1345
+always kalifornier 13-1-123-24-124-135-1235-1345-24-15-1235
+always bosnier 12-135-234-1345-24-15-1235
+always punier 1234-136-1345-24-15-1235
+always harpunier 125-1-1235-1234-136-1345-346-1235
+always petunie 1234-15-2345-136-1345-24-15
+always bithynier 12-24-2345-125-13456-1345-24-15-1235
+#                                      pie
+word pie 1234-24-15
+word pies 1234-24-15-234
+always piemont 1234-24-15-134-135-1345-2345
+midendword pien 1234-24-15-1345
+always pieta 1234-24-15-2345-1
+always pietät 1234-24-15-2345-345-2345
+always pietismus 1234-24-15-2345-24-234-134-136-234
+always pietist 1234-24-15-2345-24-23456
+always piezo 1234-24-15-1356-135
+#                                      pier
+always pierre 1234-24-15-1235-1235-15
+always kopier 13-135-1234-346-1235
+always pierrot 1234-24-15-1235-1235-135-2345
+always pietro 1234-24-15-2345-1235-135
+always kneipier 13-1345-146-1234-24-15-1235
+always olympier 135-123-13456-134-1234-24-15-1235
+always äthiopier 345-2345-125-24-135-1234-24-15-1235
+always spiell 234-1234-346-123-123
+always rupie 1235-136-1234-24-15
+always croupier 14-1235-135-136-1234-24-15-1235
+sufword arie 1-1235-24-15
+always karies 13-1-1235-24-15-234
+always araukarie 1-1235-16-13-1-1235-24-15
+always opernarie 135-1234-15-1235-1345-1-1235-24-15
+always kanari 13-1-1345-1-1235-24
+always sopranarie 234-135-1234-1235-1-1345-1-1235-24-15
+always soloarie 234-135-123-135-1-1235-24-15
+always parietal 1234-1-1235-24-15-2345-1-123
+always tenorarie 2345-15-1345-135-1235-1-1235-24-15
+always bravourarie 12-1235-1-1236-135-136-1235-1-1235-24-15
+always bassarie 12-1-234-234-1-1235-24-15
+always altarie 1-123-2345-1-1235-24-15
+always balzarie 12-1-123-1356-1-1235-24-15
+always gabriel 1245-1-12-1235-24-15-123
+always materie 134-1-2345-15-1235-24-15
+always arterie 1-1235-2345-15-1235-24-15
+always bakterie 12-1-13-2345-15-1235-24-15
+always henriette 125-15-1345-1235-24-15-2345-2345-15
+always kyrie 13-13456-1235-24-15
+#                                     orie
+always zichorie 1356-24-1456-135-1235-24-15
+always glorie 1245-123-135-1235-24-15
+always akzessorietät 1-13-1356-15-234-234-135-1235-24-15-2345-345-2345
+always historie 125-24-23456-135-1235-24-15
+always propriet 1234-1235-135-1234-1235-24-15-2345
+midendword rien 1235-24-15-1345
+#                                      rier
+always agrarier 1-1245-1235-1-1235-24-15-1235
+sufword arier 1-1235-24-15-1235
+sufword ariern 1-1235-24-15-1235-1345
+sufword ariers 1-1235-24-15-1235-234
+always vegetarier 1236-15-1245-15-2345-1-1235-24-15-1235
+always proletarier 1234-1235-135-123-15-2345-1-1235-24-15-1235
+always nichtarier 1345-24-1456-2345-1-1235-24-15-1235
+always trinitarier 2345-1235-24-1345-24-2345-1-1235-24-15-1235
+always unitarier 136-1345-24-2345-1-1235-24-15-1235
+always parlamentarier 1234-1-1235-123-1-134-15-1345-2345-1-1235-24-15-1235
+always rotarier 1235-135-2345-1-1235-24-15-1235
+always variet 1236-1-1235-24-15-2345
+always algerier 1-123-1245-15-1235-24-15-1235
+always serie 234-15-1235-24-15
+always chinoiserie 1456-24-1345-135-24-234-15-1235-346
+prfword chinoiserien 1456-24-1345-135-24-234-15-1235-24-15-1345
+always onfiserie 135-1345-124-24-234-15-1235-346
+endword onfiserien 135-1345-124-24-234-15-1235-24-15-1345
+always inserier 24-1345-234-15-1235-346-1235
+always komparserie 13-135-134-1234-1-1235-234-15-1235-346
+prfword komparserien 13-135-134-1234-1-1235-234-15-1235-24-15-1345
+always asserier 1-234-234-15-1235-346-1235
+always brasserie 12-1235-1-234-234-15-1235-346
+always patisserie 1234-1-2345-24-234-234-15-1235-346
+prfword patisserien 1234-1-2345-24-234-234-15-1235-24-15-1345
+always tapisserie 2345-1-1234-24-234-234-15-1235-346
+prfword tapisserien 2345-1-1234-24-234-234-15-1235-24-15-1345
+always karosserie 13-1-1235-135-234-234-15-1235-346
+prfword karosserien 13-1-1235-135-234-234-15-1235-24-15-1345
+always interieur 24-1345-2345-15-1235-24-126-1235
+always grien 1245-1235-346-1345
+always sibirier 234-24-12-24-1235-24-15-1235
+always theorieneutral 2345-125-15-135-1235-346-1345-126-2345-1235-1-123
+always barriere 12-1-1235-1235-24-15-1235-15
+always harriet 125-1-1235-1235-24-15-2345
+always karriere 13-1-1235-1235-24-15-1235-15
+always karrierist 13-1-1235-1235-24-15-1235-24-23456
+always perrier 1234-15-1235-1235-24-15-1235
+always terrier 2345-15-1235-1235-24-15-1235
+always triest 2345-1235-24-15-23456
+always industrienation 24-1345-145-136-23456-1235-346-1345-1-2345-24-135-1345
+always industrienetz 24-1345-145-136-23456-1235-346-1345-15-2345-1356
+#                                     urie
+always furie 124-136-1235-24-15
+always furier 124-136-1235-346-1235
+always saurier 234-16-1235-24-15-1235
+begmidword thesaurier 2345-125-15-234-16-1235-346-1235
+always injurie 24-1345-245-136-1235-24-15
+always injurier 24-1345-245-136-1235-346-1235
+always dekurie 145-15-13-136-1235-24-15
+always kurie 13-136-1235-24-15
+always kurier 13-136-1235-346-1235
+always courier 14-135-136-1235-24-15-1235
+always zenturie 1356-15-1345-2345-136-1235-24-15
+always couturier 14-135-136-2345-136-1235-24-15-1235
+always illyrier 24-123-123-13456-1235-24-15-1235
+always syrier 234-13456-1235-24-15-1235
+always sien 234-24-15-1345
+#                                      sier
+always sierra 234-24-15-1235-1235-1
+midendword sierraum 234-346-1235-1235-16-134
+always dosier 145-135-234-346-1235
+always siesta 234-24-15-23456-1
+always kaukasier 13-16-13-1-234-24-15-1235
+always douglasie 145-135-136-1245-123-1-234-24-15
+always austrasier 16-23456-1235-1-234-24-15-1235
+always eurasier 126-1235-1-234-24-15-1235
+always antasienam 1-1345-2345-1-234-346-1345-1-134
+always rhodesier 1235-125-135-145-15-234-24-15-1235
+always freesie 124-1235-15-15-234-24-15
+always schlesier 156-123-15-234-24-15-1235
+always milesier 134-24-123-15-234-24-15-1235
+always melanesier 134-15-123-1-1345-15-234-24-15-1235
+always indonesier 24-1345-145-135-1345-15-234-24-15-1235
+always tunesier 2345-136-1345-15-234-24-15-1235
+always polynesier 1234-135-123-13456-1345-15-234-24-15-1235
+always fuchsie 124-136-1456-234-24-15
+always lavoisier 123-1-1236-135-24-234-24-15-1235
+always monsieur 134-135-1345-234-24-126-1235
+always monsieur 134-135-1345-234-24-126-1235
+always hortensie 125-135-1235-2345-15-1345-234-24-15
+always jurassier 245-136-1235-1-234-234-24-15-1235
+always messieurs 134-15-234-234-24-126-1235-234
+always patissier 1234-1-2345-24-234-234-24-15-1235
+always dossier 145-135-234-234-24-15-1235
+always dossierung 145-135-234-234-346-1235-136-1345-1245
+always indossier 24-1345-145-135-234-234-346-1235
+prfword haussier 125-16-234-234-24-15-1235
+prfword haussiers 125-16-234-234-24-15-1235-234
+always arkebusier 1-1235-13-15-12-136-234-24-15-1235
+always corbusier 14-135-1235-12-136-234-24-15-1235
+always andalusier 1-1345-145-1-123-136-234-24-15-1235
+always malaysier 134-1-123-1-13456-234-24-15-1235
+midendword tien 2345-24-15-1345
+#                                      tier
+midendword atien 1-2345-24-15-1345
+always chocolatier 1456-135-14-135-123-1-2345-24-15-1235
+always privatier 1234-1235-24-1236-1-2345-24-15-1235
+always cafetier 14-1-124-15-2345-24-15-1235
+always metier 134-15-2345-24-15-1235
+always helvetier 125-15-123-1236-15-2345-24-15-1235
+always pleitier 1234-123-146-2345-24-15-1235
+always aktie 1-13-2345-24-15
+always paktier 1234-1-13-2345-346-1235
+always traktier 2345-1235-1-13-2345-346-1235
+always taktier 2345-1-13-2345-346-1235
+always multie 134-136-123-2345-24-15
+always antiessen 1-1345-2345-24-15-234-234-15-1345
+always antieuropäisch 1-1345-2345-24-126-1235-135-1234-345-24-156
+always tantieme 2345-1-1345-2345-24-15-134-15
+always cartier 14-1-1235-2345-24-15-1235
+always portier 1234-135-1235-2345-24-15-1235
+always portieren 1234-135-1235-2345-346-1235
+always portierbar 1234-135-1235-2345-346-1235-12-1-1235
+prfword portierst 1234-135-1235-2345-346-1235-23456
+always portierung 1234-135-1235-2345-346-1235-136-1345-1245
+always deportier 145-15-1234-135-1235-2345-346-1235
+always apportier 1-1234-1234-135-1235-2345-346-1235
+always exportier 15-1346-1234-135-1235-2345-346-1235
+always importier 24-134-1234-135-1235-2345-346-1235
+always kolportier 13-135-123-1234-135-1235-2345-346-1235
+always transportier 2345-1235-1-1345-234-1234-135-1235-2345-346-1235
+always stiellappen 23456-346-123-123-1-1234-1234-15-1345
+always stiellos 23456-346-123-123-135-234
+midendword stien 23456-24-15-1345
+always bestie 12-15-23456-24-15
+always bestiefel 12-15-23456-346-124-15-123
+always bestieg 12-15-23456-346-1245
+always bestiehl 12-15-23456-346-125-123
+always bestieß 12-15-23456-346-2346
+always hostie 125-135-23456-24-15
+always bustier 12-136-23456-24-15-1235
+always büfettier 12-1256-124-15-2345-2345-24-15-1235
+always spaghettiess 234-1234-1-1245-125-15-2345-2345-24-15-234-234
+always gautier 1245-16-2345-24-15-1235
+always bijoutier 12-24-245-135-136-2345-24-15-1235
+#                                     quie
+always quietismus 12345-136-24-15-2345-24-234-134-136-234
+always quietistisch 12345-136-24-15-2345-24-23456-24-156
+always requiem 1235-15-12345-136-24-15-134
+always reliquie 1235-15-123-24-12345-136-24-15
+always kolloquie 13-135-123-123-135-12345-136-24-15
+always montesquieu 134-135-1345-2345-15-234-12345-136-24-126
+always vielleicht 1236-346-123-123-146-1456-2345
+#                                      vier
+always viet 1236-24-15-2345
+always view 1236-24-15-2456
+always skandinavi 234-13-1-1345-145-24-1345-1-1236-24
+always endivi 15-1345-145-24-1236-24
+always bolivi 12-135-123-24-1236-24
+always riviera 1235-24-1236-24-15-1235-1
+always moldawi 134-135-123-145-1-2456-24
+always jugoslawi 245-136-1245-135-234-123-1-2456-24
+always galaxien 1245-1-123-1-1346-24-15-1345
+always sexier 234-15-1346-24-15-1235
+always sexiest 234-15-1346-24-15-23456
+always paradoxien 1234-1-1235-1-145-135-1346-24-15-1345
+always harpyie 125-1-1235-1234-13456-24-15
+always zielland 1356-346-123-123-1-1345-145
+always ziellini 1356-346-123-123-24-1345-24
+always zielloch 1356-346-123-123-135-1456
+always ziellos 1356-346-123-123-135-234
+#                                      zie
+midendword zien 1356-24-15-1345
+always akazie 1-13-1-1356-24-15
+always grazie 1245-1235-1-1356-24-15
+always pistazie 1234-24-23456-1-1356-24-15
+always allochezie 1-123-123-135-1456-15-1356-24-15
+always spezies 234-1234-15-1356-24-15-234
+always alopezie 1-123-135-1234-15-1356-24-15
+prfword finanzier 124-24-1345-1-1345-1356-24-15-1235
+prfword finanziers 124-24-1345-1-1345-1356-24-15-1235-234
+always phönizier 1234-125-246-1345-24-1356-24-15-1235
+always patrizier 1234-1-2345-1235-24-1356-24-15-1235
+always antikoagulanzie 1-1345-2345-24-13-135-1-1245-136-123-1-1345-1356-24-15
+always alkylanzie 1-123-13-13456-123-1-1345-1356-24-15
+always soziet 234-135-1356-24-15-2345
+
+# SCH
+always sch 156
+always auscheck 16-234-1456-15-14-13
+always auscheckig 16-156-15-14-13-24-1245
+always bisschen 12-24-234-234-1456-15-1345
+always bläschen 12-123-345-234-1456-15-1345
+always blüschen 12-123-1256-234-1456-15-1345
+always brieschen 12-1235-346-234-1456-15-1345
+always döschen 145-246-234-1456-15-1345
+always eschatolog 15-234-1456-1-2345-135-123-135-1245
+always fässchen 124-345-234-234-1456-15-1345
+always flüsschen 124-123-1256-234-234-1456-15-1345
+always gänschen 1245-345-1345-234-1456-15-1345
+always gässchen 1245-345-234-234-1456-15-1345
+always gläschen 1245-123-345-234-1456-15-1345
+always häschen 125-345-234-1456-15-1345
+always hälschen 125-345-123-234-1456-15-1345
+always hänschen 125-345-1345-234-1456-15-1345
+always häuschen 125-34-234-1456-15-1345
+always heitscheck 125-146-2345-234-1456-15-14-13
+always höschen 125-246-234-1456-15-1345
+always hülschen 125-1256-123-234-1456-15-1345
+always ischämie 24-234-1456-345-134-346
+always ischämien 24-234-1456-345-134-24-15-1345
+always ischia 24-234-1456-24-1
+always kabäuschen 13-1-12-34-234-1456-15-1345
+always käschen 13-345-234-1456-15-1345
+always klösschen 13-123-246-234-234-1456-15-1345
+always küsschen 13-1256-234-234-1456-15-1345
+always läuschen 123-34-234-1456-15-1345
+always lieblingschat 123-346-12-123-24-1345-1245-234-1456-1-2345
+always lieschen 123-346-234-1456-15-1345
+always maischip 134-1-24-234-1456-24-1234
+always mäuschen 134-34-234-1456-15-1345
+always möpschen 134-246-1234-234-1456-15-1345
+always maraschino 134-1-1235-1-234-1456-24-1345-135
+always mischief 134-24-234-1456-346-124
+always näschen 1345-345-234-1456-15-1345
+always nüsschen 1345-1256-234-234-1456-15-1345
+always engelschor 15-1345-1245-15-123-234-1456-135-1235
+always engelschör 15-1345-1245-15-123-234-1456-246-1235
+midendword enschor 15-1345-234-1456-135-1235
+midendword enschör 15-1345-234-1456-246-1235
+midendword ngschor 1345-1245-234-1456-135-1235
+midendword ngschör 1345-1245-234-1456-246-1235
+always prischen 1234-1235-24-234-1456-15-1345
+always radieschen 1235-1-145-346-234-1456-15-1345
+always reischen 1235-146-234-1456-15-1345
+always kreischen 13-1235-146-156-15-1345
+always röschen 1235-246-234-1456-15-1345
+always fröschen 124-1235-246-156-15-1345
+midendword schance 234-1456-1-1345-14-15
+midendword schao 234-1456-1-135
+midendword scharakter 234-1456-1-1235-1-13-2345-15-1235
+midendword schef 234-1456-15-124
+always scheffel 156-15-124-124-15-123
+always scheffle 156-15-124-124-123-15
+always wäsche 2456-345-156-15
+always tusche 2345-136-156-15
+always retuscheur 1235-15-2345-136-156-126-1235
+midendword schemie 234-1456-15-134-346
+midendword schemiker 234-1456-15-134-24-13-15-1235
+midendword schemikalie 234-1456-15-134-24-13-1-123-24-15
+always scherzo 234-1456-15-1235-1356-135
+always scherzando 234-1456-15-1235-1356-1-1345-145-135
+always schlösschen 156-123-246-234-234-1456-15-1345
+midendword schirurg 234-1456-24-1235-136-1235-1245
+always schnäpschen 156-1345-345-1234-234-1456-15-1345
+always school 234-1456-135-135-123
+midendword schromat 234-1456-1235-135-134-1-2345
+midendword schromo 234-1456-1235-135-134-135
+midendword schronik 234-1456-1235-135-1345-24-13
+midendword schüechli 234-1456-1256-15-1456-123-24
+midendword üchschen 1256-1456-234-1456-15-1345
+always tässchen 2345-345-234-234-1456-15-1345
+always väschen 1236-345-234-1456-15-1345
+always wieschen 2456-346-234-1456-15-1345
+
+# ST
+always st 23456
+syllable abgas 1-12-1245-1-234
+always abschiedstrunk 1-12-156-346-145-234-2345-1235-136-1345-13
+always abschlussteil 1-12-156-123-136-234-234-2345-146-123
+always abseitstor 1-12-234-146-2345-234-2345-135-1235
+always adressteil 1-145-1235-15-234-234-2345-146-123
+always aesthet 1-15-234-2345-125-15-2345
+always aidstest 1-24-145-234-2345-15-23456
+always aktionstrupp 1-13-2345-24-135-1345-234-2345-1235-136-1234-1234
+syllable alltags 1-123-123-2345-1-1245-234
+always amtston 1-134-2345-234-2345-135-1345
+always anfangsteil 1-1345-124-1-1345-1245-234-2345-146-123
+always angsträum 1-1345-1245-23456-1235-34-134
+always anschlussteil 1-1345-156-123-136-234-234-2345-146-123
+always anschriftsteil 1-1345-156-1235-24-124-2345-234-2345-146-123
+always anästh 1-1345-345-234-2345-125
+begmidword arbeitst 1-1235-12-146-2345-234-2345
+word asst 1-234-234-2345
+always gasstrom 1245-1-234-23456-1235-135-134
+always augiasstall 16-1245-24-1-234-23456-1-123-123
+always ästhesie 345-234-2345-125-15-234-346
+always ästhet 345-234-2345-125-15-2345
+always asthma 1-234-2345-125-134-1
+always asthmo 1-234-2345-125-134-135
+always ausdruckstanz 16-234-145-1235-136-14-13-234-2345-1-1345-1356
+always ausgleichstor 16-234-1245-123-146-1456-234-2345-135-1235
+always aussichtsturm 16-234-234-24-1456-2345-234-2345-136-1235-134
+always austast 16-234-2345-1-23456
+always austeil 16-234-2345-146-123
+always austobe 16-234-2345-135-12-15
+always austobst 16-234-2345-135-12-23456
+always austobt 16-234-2345-135-12-2345
+always austollen 16-234-2345-135-123-123-15-1345
+always abbaustollen 1-12-12-16-23456-135-123-123-15-1345
+always austonn 16-234-2345-135-1345-1345
+always austrampel 16-234-2345-1235-1-134-1234-15-123
+always austrample 16-234-2345-1235-1-134-1234-123-15
+always austrat 16-234-2345-1235-1-2345
+always austrick 16-234-2345-1235-24-14-13
+always austritt 16-234-2345-1235-24-2345-2345
+always austrock 16-234-2345-1235-135-14-13
+always austun 16-234-2345-136-1345
+always austupf 16-234-2345-136-1234-124
+always austusch 16-234-2345-136-156
+always auswärtstor 16-234-2456-345-1235-2345-234-2345-135-1235
+always basst 12-1-234-234-2345
+syllable befehls 12-15-124-15-125-123-234
+always befehlsteil 12-15-124-15-125-123-234-2345-146-123
+always befleisst 12-15-124-123-146-234-234-2345
+always begrüßungstrunk 12-15-1245-1235-1256-2346-136-1345-1245-234-2345-1235-136-1345-13
+always beisst 12-146-234-234-2345
+always besasst 12-15-234-1-234-234-2345
+always betriebsteil 12-15-2345-1235-346-12-234-2345-146-123
+always betriebstreu 12-15-2345-1235-346-12-234-2345-1235-126
+always beweisteil 12-15-2456-146-234-2345-146-123
+always bezirkstier 12-15-1356-24-1235-13-234-2345-346-1235
+midendword blasst 12-123-1-234-234-2345
+always blutstrunk 12-123-136-2345-234-2345-1235-136-1345-13
+always blösst 12-123-246-234-234-2345
+always brandungstor 12-1235-1-1345-145-136-1345-1245-234-2345-135-1235
+always bundestrupp 12-136-1345-145-15-234-2345-1235-136-1234-1234
+always bündnistreu 12-1256-1345-145-1345-24-234-2345-1235-126
+always büsst 12-1256-234-234-2345
+always dasasst 145-1-234-1-234-234-2345
+always distorsion 145-24-234-2345-135-1235-234-24-135-1345
+always durchbruchstal 145-136-1235-1456-12-1235-136-1456-234-2345-1-123
+always dystonie 145-13456-234-2345-135-1345-346
+always einbruchstal 146-1345-12-1235-136-1456-234-2345-1-123
+always einesteils 146-1345-15-234-2345-146-123-234
+always eingangstor 146-1345-1245-1-1345-1245-234-2345-135-1235
+always eistanz 146-234-2345-1-1345-1356
+always eistorte 146-234-2345-135-1235-2345-15
+always eistört 146-234-2345-246-1235-2345
+always elvistoll 15-123-1236-24-234-2345-135-123-123
+always empfangsteil 15-134-1234-124-1-1345-1245-234-2345-146-123
+always esther 15-234-2345-125-15-1235
+always pestherd 1234-15-23456-125-15-1235-145
+always fallstor 124-1-123-123-234-2345-135-1235
+syllable fasst 124-1-234-234-2345
+always flusstal 124-123-136-234-234-2345-1-123
+always flösst 124-123-246-234-234-2345
+always flüchtlingstreck 124-123-1256-1456-2345-123-24-1345-1245-234-2345-1235-15-14-13
+always formationstanz 124-135-1235-134-1-2345-24-135-1345-234-2345-1-1345-1356
+always frasst 124-1235-1-234-234-2345
+always friedenstaube 124-1235-346-145-15-1345-234-2345-16-12-15
+always friedenstrupp 124-1235-346-145-15-1345-234-2345-1235-136-1234-1234
+always frästisch 124-1235-345-234-2345-24-156
+always frühstücksteller 124-1235-1256-125-23456-1256-14-13-234-2345-15-123-123-15-1235
+always frühstückstisch 124-1235-1256-125-23456-1256-14-13-234-2345-24-156
+always fusst 124-136-234-234-2345
+always führungstor 124-1256-125-1235-136-1345-1245-234-2345-135-1235
+always führungstrupp 124-1256-125-1235-136-1345-1245-234-2345-1235-136-1234-1234
+always gangsteil 1245-1-1345-1245-234-2345-146-123
+always gangston 1245-1-1345-1245-234-2345-135-1345
+always gastank 1245-1-234-2345-1-1345-13
+always gasturm 1245-1-234-2345-136-1235-134
+always gebietsteil 1245-15-12-346-2345-234-2345-146-123
+always gebirgstrupp 1245-15-12-24-1235-1245-234-2345-1235-136-1234-1234
+always geburtstaub 1245-15-12-136-1235-2345-234-2345-16-12
+always gefechtsturm 1245-15-124-15-1456-2345-234-2345-136-1235-134
+syllable geheimnis 1245-15-125-146-134-1345-24-234
+always geschlechtsteil 1245-15-156-123-15-1456-2345-234-2345-146-123
+always geschäftsteil 1245-15-156-345-124-2345-234-2345-146-123
+always gesellschaftstanz 1245-15-234-15-123-123-156-1-124-2345-234-2345-1-1345-1356
+always gesetzestreu 1245-15-234-15-2345-1356-15-234-2345-1235-126
+syllable gesichts 1245-15-234-24-1456-2345-234
+always gespasst 1245-15-234-1234-1-234-234-2345
+always gesprächsteil 1245-15-234-1234-1235-345-1456-234-2345-146-123
+always gesüsst 1245-15-234-1256-234-234-2345
+always gewohnheitstier 1245-15-2456-135-125-1345-125-146-2345-234-2345-346-1235
+always glasteil 1245-123-1-234-2345-146-123
+always glastisch 1245-123-1-234-2345-24-156
+always glasturm 1245-123-1-234-2345-136-1235-134
+always glückstor 1245-123-1256-14-13-234-2345-135-1235
+always gottestreu 1245-135-2345-2345-15-234-2345-1235-126
+always grosst 1245-1235-135-234-234-2345
+always grösst 1245-1235-246-234-234-2345
+always grüsst 1245-1235-1256-234-234-2345
+always gussteil 1245-136-234-234-2345-146-123
+always hadrianstor 125-1-145-1235-24-1-1345-234-2345-135-1235
+always handelsteil 125-1-1345-145-15-123-234-2345-146-123
+syllable hasst 125-1-234-234-2345
+always haustaube 125-16-234-2345-16-12-15
+always haustempel 125-16-234-2345-15-134-1234-15-123
+always haustier 125-16-234-2345-346-1235
+always haustor 125-16-234-2345-135-1235
+always haustrunk 125-16-234-2345-1235-136-1345-13
+always hausturm 125-16-234-2345-136-1235-134
+always heeresteil 125-15-15-1235-15-234-2345-146-123
+always heisst 125-146-234-234-2345
+always heitstick 125-146-2345-234-2345-24-14-13
+midendword heitstrunk 125-146-2345-234-2345-1235-136-1345-13
+always hephaistostempel 125-15-1234-125-1-24-23456-135-234-2345-15-134-1234-15-123
+always hilfstaucher 125-24-123-124-234-2345-16-1456-15-1235
+always hilfstrupp 125-24-123-124-234-2345-1235-136-1234-1234
+always himmelstanz 125-24-134-134-15-123-234-2345-1-1345-1356
+always himmelstempel 125-24-134-134-15-123-234-2345-15-134-1234-15-123
+always himmelstor 125-24-134-134-15-123-234-2345-135-1235
+always hisst 125-24-234-234-2345
+always hofstor 125-135-124-234-2345-135-1235
+always hundsteuer 125-136-1345-145-234-2345-126-15-1235
+always iesst 346-234-234-2345
+always vliesst 1236-123-346-234-23456
+always invasionstrupp 24-1345-1236-1-234-24-135-1345-234-2345-1235-136-1234-1234
+always ionsteil 24-135-1345-234-2345-146-123
+always ionstisch 24-135-1345-234-2345-24-156
+midendword ionstreu 24-135-1345-234-2345-1235-126
+always irrsinnstat 24-1235-1235-234-24-1345-1345-234-2345-1-2345
+word isst 24-234-234-2345
+begmidword isthm 24-234-2345-125-134
+midendword itätstreu 24-2345-345-2345-234-2345-1235-126
+always juliusturm 245-136-123-24-136-234-2345-136-1235-134
+always kabinettstisch 13-1-12-24-1345-15-2345-2345-234-2345-24-156
+always kaffeehaustisch 13-1-124-124-15-15-125-16-234-2345-24-156
+always kapitänstisch 13-1-1234-24-2345-345-1345-234-2345-24-156
+always karnevalstrubel 13-1-1235-1345-15-1236-1-123-234-2345-1235-136-12-15-123
+midendword kaufstresen 13-16-124-234-2345-1235-15-234-15-1345
+midendword kaufstrick 13-16-124-234-2345-1235-24-14-13
+midendword kaufstrip 13-16-124-234-2345-1235-24-1234
+always keitsteil 13-146-2345-234-2345-146-123
+midendword keitstreu 13-146-2345-234-2345-1235-126
+always kindstaufe 13-24-1345-145-234-2345-16-124-15
+always kindstäuf 13-24-1345-145-234-2345-34-124
+always kirmestanz 13-24-1235-134-15-234-2345-1-1345-1356
+always kondenstopf 13-135-1345-145-15-1345-234-2345-135-1234-124
+always konfuziustempel 13-135-1345-124-136-1356-24-136-234-2345-15-134-1234-15-123
+always kongressteil 13-135-1345-1245-1235-15-234-234-2345-146-123
+always krebstier 13-1235-15-12-234-2345-346-1235
+always kreisteil 13-1235-146-234-2345-146-123
+always kriegstalk 13-1235-346-1245-234-2345-1-123-13
+always kriegstanz 13-1235-346-1245-234-2345-1-1345-1356
+always kriegsteil 13-1235-346-1245-234-2345-146-123
+always kriegsto 13-1235-346-1245-234-2345-135
+midendword kunftstrick 13-136-1345-124-2345-234-2345-1235-24-14-13
+always kursteil 13-136-1235-234-2345-146-123
+always kursusteil 13-136-1235-234-136-234-2345-146-123
+always königstiger 13-246-1345-24-1245-234-2345-24-1245-15-1235
+always königstreu 13-246-1345-24-1245-234-2345-1235-126
+always küsst 13-1256-234-234-2345
+always landesteil 123-1-1345-145-15-234-2345-146-123
+syllable lasst 123-1-234-234-2345
+syllable glasst 1245-123-1-234-23456
+always legionstrupp 123-15-1245-24-135-1345-234-2345-1235-136-1234-1234
+always liebestat 123-346-12-15-234-2345-1-2345
+always liebestoll 123-346-12-15-234-2345-135-123-123
+always liebestrunk 123-346-12-15-234-2345-1235-136-1345-13
+always lieblingst 123-346-12-123-24-1345-1245-234-2345
+always lostrab 123-135-234-2345-1235-1-12
+always längstal 123-345-1345-1245-234-2345-1-123
+always machtsteil 134-1-1456-2345-234-2345-146-123
+begmidword maisst 134-1-24-234-23456
+always mannstoll 134-1-1345-1345-234-2345-135-123-123
+always masst 134-1-234-234-2345
+always thomasst 2345-125-135-134-1-234-23456
+always meerestier 134-15-15-1235-15-234-2345-346-1235
+always mittagstrunk 134-24-2345-2345-1-1245-234-2345-1235-136-1345-13
+always moostier 134-135-135-234-2345-346-1235
+always mordsteuer 134-135-1235-145-234-2345-126-15-1235
+always mordsteure 134-135-1235-145-234-2345-126-1235-15
+always moschustier 134-135-156-136-234-2345-346-1235
+always musst 134-136-234-234-2345
+always mönchstum 134-246-1345-1456-234-2345-136-134
+always mündungstrichter 134-1256-1345-145-136-1345-1245-234-2345-1235-24-1456-2345-15-1235
+always müsst 134-1256-234-234-2345
+always namensteil 1345-1-134-15-1345-234-2345-146-123
+midendword ngstresen 1345-1245-234-2345-1235-15-234-15-1345
+always nichtstuer 1345-24-1456-2345-234-2345-136-15-1235
+always nichtstun 1345-24-1456-2345-234-2345-136-1345
+always ortsteil 135-1235-2345-234-2345-146-123
+syllable passt 1234-1-234-234-2345
+syllable prasst 1234-1235-1-234-234-2345
+word psssst 1234-234-234-234-234-2345
+word pssst 1234-234-234-234-2345
+word psst 1234-234-234-2345
+word pst 1234-234-2345
+always ratstisch 1235-1-2345-234-2345-24-156
+always reichsteil 1235-146-1456-234-2345-146-123
+always reichstrupp 1235-146-1456-234-2345-1235-136-1234-1234
+always reisst 1235-146-234-234-2345
+always reisstroh 1235-146-234-23456-1235-135-125
+begmidword kreisst 13-1235-146-234-23456
+always preisst 1234-1235-146-234-23456
+always reisteig 1235-146-234-2345-146-1245
+always reistopf 1235-146-234-2345-135-1234-124
+always revolutionstrupp 1235-15-1236-135-123-136-2345-24-135-1345-234-2345-1235-136-1234-1234
+always rezitationston 1235-15-1356-24-2345-1-2345-24-135-1345-234-2345-135-1345
+syllable rhythmus 1235-125-13456-2345-125-134-136-234
+always ruhmestat 1235-136-125-134-15-234-2345-1-2345
+always sanitätstrupp 234-1-1345-24-2345-345-2345-234-2345-1235-136-1234-1234
+always sasst 234-1-234-234-2345
+always schaftsteil 156-1-124-2345-234-2345-146-123
+midendword schaftstreu 156-1-124-2345-234-2345-1235-126
+syllable schasst 156-1-234-234-2345
+always scheisst 156-146-234-234-2345
+always schiffstaufe 156-24-124-124-234-2345-16-124-15
+always schiffstonnage 156-24-124-124-234-2345-135-1345-1345-1-1245-15
+always schiffstäuf 156-24-124-124-234-2345-34-124
+always schleisst 156-123-146-234-234-2345
+always schleisst 156-123-146-234-234-2345
+always schlussteil 156-123-136-234-234-2345-146-123
+always schmeisst 156-134-146-234-234-2345
+always schosstier 156-135-234-234-2345-346-1235
+always schreckenstat 156-1235-15-14-13-15-1345-234-2345-1-2345
+always sechsteil 234-15-1456-234-2345-146-123
+always sicherheitstrupp 234-24-1456-15-1235-125-146-2345-234-2345-1235-136-1234-1234
+always siegestrunk 234-346-1245-15-234-2345-1235-136-1345-13
+always spannungston 234-1234-1-1345-1345-136-1345-1245-234-2345-135-1345
+always spasst 234-1234-1-234-234-2345
+always spleisst 234-1234-123-146-234-234-2345
+always asst 1-234-234-2345
+begmidword grasst 1245-1235-1-234-23456
+always ässt 345-234-234-2345
+always lässt 123-345-234-234-2345
+always nässt 1345-345-234-234-2345
+always esst 15-234-234-2345
+begmidword grabesst 1245-1235-1-12-15-234-23456
+begmidword liebesst 123-346-12-15-234-23456
+begmidword todesst 2345-135-145-15-234-23456
+begmidword siegesst 234-346-1245-15-234-23456
+begmidword leibesst 123-146-12-15-234-23456
+begmidword eidesst 146-145-15-234-23456
+begmidword landesst 123-1-1345-145-15-234-23456
+begmidword kindesst 13-24-1345-145-15-234-23456
+begmidword bundesst 12-136-1345-145-15-234-23456
+begmidword tagesst 2345-1-1245-15-234-23456
+begmidword mannesst 134-1-1345-1345-15-234-23456
+begmidword sinnesst 234-24-1345-1345-15-234-23456
+begmidword heeresst 125-15-15-1235-15-234-23456
+begmidword meeresst 134-15-15-1235-15-234-23456
+midword stesst 23456-15-234-23456
+begmidword gottesst 1245-135-2345-2345-15-234-23456
+always isst 24-234-234-2345
+midword nisst 1345-24-234-23456
+always relais 1235-15-123-1-24-234
+always basis 12-1-234-24-234
+always basisch 12-1-234-24-156
+always praxis 1234-1235-1-1346-24-234
+always osst 135-234-234-2345
+begmidword losst 123-135-234-23456
+always schloss 156-123-135-234-234
+always usst 136-234-234-2345
+begmidword busst 12-136-234-23456
+begmidword tonusst 2345-135-1345-136-234-23456
+always luxus 123-136-1346-136-234
+midendword ssst 234-234-23456
+always sstell 234-23456-15-123-123
+word st 234-2345
+always st 23456
+word sta 234-2345-1
+midendword stabelle 234-2345-1-12-15-123-123-15
+midendword stablett 234-2345-1-12-123-15-2345-2345
+midendword stabu 234-2345-1-12-136
+midendword stafel 234-2345-1-124-15-123
+midendword stag 234-2345-1-1245
+midendword stagstisch 234-2345-1-1245-234-2345-24-156
+always adjustage 1-145-245-136-23456-1-1245-15
+always backstage 12-1-14-13-23456-1-1245-15
+always fockstag 124-135-14-13-23456-1-1245
+always gestagen 1245-15-23456-1-1245-15-1345
+always dienstagent 145-346-1345-23456-1-1245-15-1345-2345
+always kastagnet 13-1-23456-1-1245-1345-15-2345
+always nystagmus 1345-13456-23456-1-1245-134-136-234
+always ostagent 135-23456-1-1245-15-1345-2345
+always pastagericht 1234-1-23456-1-1245-15-1235-24-1456-2345
+always pastagrinsen 1234-1-23456-1-1245-1235-24-1345-234-15-1345
+always stagnation 23456-1-1245-1345-1-2345-24-135-1345
+always stagnier 23456-1-1245-1345-346-1235
+always stagsegel 23456-1-1245-234-15-1245-15-123
+midendword stakt 234-2345-1-13-2345
+always herbstakt 125-15-1235-12-23456-1-13-2345
+always gestakt 1245-15-23456-1-13-2345
+always festakt 124-15-23456-1-13-2345
+always testakt 2345-15-23456-1-13-2345
+midendword stalar 234-2345-1-123-1-1235
+midendword stalent 234-2345-1-123-15-1345-2345
+midendword staler 234-2345-1-123-15-1235
+midendword stalg 234-2345-1-123-1245
+always nostalg 1345-135-23456-1-123-1245
+always standstanz 23456-1-1345-145-234-2345-1-1345-1356
+midendword stangente 234-2345-1-1345-1245-15-1345-2345-15
+midendword stanne 234-2345-1-1345-1345-15
+midendword stapezier 234-2345-1-1234-15-1356-346-1235
+midendword starier 234-2345-1-1235-346-1235
+midendword starif 234-2345-1-1235-24-124
+midendword stasche 234-2345-1-156-15
+midendword stasse 234-2345-1-234-234-15
+begmidword forstasse 124-135-1235-23456-1-234-234-15
+midendword staste 234-2345-1-23456-15
+midendword statbestand 234-2345-1-2345-12-15-23456-1-1345-145
+midendword statbeständ 234-2345-1-2345-12-15-23456-345-1345-145
+midendword stätig 234-2345-345-2345-24-1245
+always bestätig 12-15-23456-345-2345-24-1245
+midendword stauglich 234-2345-16-1245-123-24-1456
+midendword staumel 234-2345-16-134-15-123
+midendword stausch 234-2345-16-156
+midendword stausend 234-2345-16-234-15-1345-145
+midendword staxe 234-2345-1-1346-15
+word ste 234-2345-15
+midendword steam 234-2345-15-1-134
+begword steam 23456-15-1-134
+always steamen 23456-15-1-134-15-1345
+always steamer 23456-15-1-134-15-1235
+always steamt 23456-15-1-134-2345
+midendword stechnik 234-2345-15-1456-1345-24-13
+midendword stechnisch 234-2345-15-1456-1345-24-156
+midendword stechnolog 234-2345-15-1456-1345-135-123-135-1245
+endword stechnologien 234-2345-15-1456-1345-135-123-135-1245-24-15-1345
+midendword stee 234-2345-15-15
+always gästeelf 1245-345-23456-15-15-123-124
+always steelband 23456-15-15-123-12-1-1345-145
+always westempore 2456-15-23456-15-134-1234-135-1235-15
+always gersteein 1245-15-1235-23456-15-146-1345
+always trustee 2345-1235-136-23456-15-15
+midendword steich 234-2345-146-1456
+midendword steils 234-2345-146-123-234
+always steilst 23456-146-123-23456
+midendword steilzeit 234-2345-146-123-1356-146-2345
+midendword stelefon 234-2345-15-123-15-124-135-1345
+midendword stelegraf 234-2345-15-123-15-1245-1235-1-124
+midendword stelegramm 234-2345-15-123-15-1245-1235-1-134-134
+midendword stemperatur 234-2345-15-134-1234-15-1235-1-2345-136-1235
+midendword stempo 234-2345-15-134-1234-135
+midendword stendenz 234-2345-15-1345-145-15-1345-1356
+midendword stensor 234-2345-15-1345-234-135-1235
+midendword steppich 234-2345-15-1234-1234-24-1456
+midendword sterm 234-2345-15-1235-134
+begmidword lästerm 123-345-23456-15-1235-134
+always pflaster 1234-124-123-1-23456-15-1235
+always mastermind 134-1-23456-15-1235-134-24-1345-145
+always raster 1235-1-23456-15-1235
+always selbst 234-15-123-12-23456
+always orchester 135-1235-1456-15-23456-15-1235
+always schwester 156-2456-15-23456-15-1235
+always gangster 1245-1-1345-1245-23456-15-1235
+always meister 134-146-23456-15-1235
+always minister 134-24-1345-24-23456-15-1235
+always ministerien 134-24-1345-24-23456-15-1235-24-15-1345
+always geschwister 1245-15-156-2456-24-23456-15-1235
+always polster 1234-135-123-23456-15-1235
+always fenster 124-15-1345-23456-15-1235
+begmidword osterm 135-23456-15-1235-134
+always klostermuseum 13-123-135-23456-15-1235-134-136-234-15-136-134
+always schuster 156-136-23456-15-1235
+always muster 134-136-23456-15-1235
+midendword sterrass 234-2345-15-1235-1235-1-234-234
+midendword sterrine 234-2345-15-1235-1235-24-1345-15
+midendword sterritori 234-2345-15-1235-1235-24-2345-135-1235-24
+midendword stest 234-2345-15-23456
+always leastest 123-15-1-23456-15-23456
+always fastest 124-1-23456-15-23456
+always vergastest 1236-15-1235-1245-1-23456-15-23456
+always hastest 125-1-23456-15-23456
+always lastest 123-1-23456-15-23456
+always mästest 134-345-23456-15-23456
+always toastest 2345-135-1-23456-15-23456
+always rastest 1235-1-23456-15-23456
+always tastest 2345-1-23456-15-23456
+always schubstest 156-136-12-23456-15-23456
+always festest 124-15-23456-15-23456
+always pestest 1234-15-23456-15-23456
+always niestest 1345-346-23456-15-23456
+always testest 2345-15-23456-15-23456
+always westest 2456-15-23456-15-23456
+always waistest 2456-1-24-23456-15-23456
+always eistest 146-23456-15-23456
+always listest 123-24-23456-15-23456
+always mistest 134-24-23456-15-23456
+word nistest 1345-24-23456-15-23456
+always einnistest 146-1345-1345-24-23456-15-23456
+always fristest 124-1235-24-23456-15-23456
+always tristest 2345-1235-24-23456-15-23456
+always reistest 1235-146-23456-15-23456
+always speistest 234-1234-146-23456-15-23456
+always halstest 125-1-123-23456-15-23456
+always bremstest 12-1235-15-134-23456-15-23456
+always heimstest 125-146-134-23456-15-23456
+always bumstest 12-136-134-23456-15-23456
+always grinstest 1245-1235-24-1345-23456-15-23456
+always zinstest 1356-24-1345-23456-15-23456
+always ernstest 15-1235-1345-23456-15-23456
+always dunstest 145-136-1345-23456-15-23456
+always kostest 13-135-23456-15-23456
+always lostest 123-135-23456-15-23456
+always mostest 134-135-23456-15-23456
+always postest 1234-135-23456-15-23456
+always rostest 1235-135-23456-15-23456
+midendword östest 246-23456-15-23456
+always wüstest 2456-1256-23456-15-23456
+always tapstest 2345-1-1234-23456-15-23456
+always knipstest 13-1345-24-1234-23456-15-23456
+always beschwipstest 12-15-156-2456-24-1234-23456-15-23456
+always rülpstest 1235-1256-123-1234-23456-15-23456
+always hopstest 125-135-1234-23456-15-23456
+always stupstest 23456-136-1234-23456-15-23456
+always berstest 12-15-1235-23456-15-23456
+always forstest 124-135-1235-23456-15-23456
+always bürstest 12-1256-1235-23456-15-23456
+always durstest 145-136-1235-23456-15-23456
+always dürstest 145-1256-1235-23456-15-23456
+always wurstest 2456-136-1235-23456-15-23456
+always haustest 125-16-23456-15-23456
+always laustest 123-16-23456-15-23456
+always maustest 134-16-23456-15-23456
+always paustest 1234-16-23456-15-23456
+always raustest 1235-16-23456-15-23456
+always saustest 234-16-23456-15-23456
+always robustest 1235-135-12-136-23456-15-23456
+always schleustest 156-123-126-23456-15-23456
+always hustest 125-136-23456-15-23456
+always schmustest 156-134-136-23456-15-23456
+always pustest 1234-136-23456-15-23456
+always krustest 13-1235-136-23456-15-23456
+always rüstest 1235-1256-23456-15-23456
+always wüstest 2456-1256-23456-15-23456
+#         ... macht zu viele Fehler ...
+#midendword steuerung 234-2345-126-15-1235-136-1345-1245
+#always grundsteuerung 1245-1235-136-1345-145-23456-126-15-1235-136-1345-1245
+#always besteuerung 12-15-23456-126-15-1235-136-1345-1245
+#always legesteuerung 123-15-1245-15-23456-126-15-1235-136-1345-1245
+#always logsteuerung 123-135-1245-23456-126-15-1235-136-1345-1245
+#always knopfsteuerung 13-1345-135-1234-124-23456-126-15-1235-136-1345-1245
+#always laufsteuerung 123-16-124-23456-126-15-1235-136-1345-1245
+#always zeugsteuerung 1356-126-1245-23456-126-15-1235-136-1345-1245
+#always gabensteuerung 1245-1-12-15-1345-23456-126-15-1235-136-1345-1245
+#always lagensteuerung 123-1-1245-15-1345-23456-126-15-1235-136-1345-1245
+#always globalsteuerung 1245-123-135-12-1-123-23456-126-15-1235-136-1345-1245
+#always digitalsteuerung 145-24-1245-24-2345-1-123-23456-126-15-1235-136-1345-1245
+#always nadelsteuerung 1345-1-145-15-123-23456-126-15-1235-136-1345-1245
+#always ampelsteuerung 1-134-1234-15-123-23456-126-15-1235-136-1345-1245
+#always doppelsteuerung 145-135-1234-1234-15-123-23456-126-15-1235-136-1345-1245
+#always einzelsteuerung 146-1345-1356-15-123-23456-126-15-1235-136-1345-1245
+#always fehlsteuerung 124-15-125-123-23456-126-15-1235-136-1345-1245
+#always ansteuerung 1-1345-23456-126-15-1235-136-1345-1245
+#midendword itätensteuerung 24-2345-345-2345-15-1345-23456-126-15-1235-136-1345-1245
+#always einsteuerung 146-1345-23456-126-15-1235-136-1345-1245
+#always fernsteuerung 124-15-1235-1345-23456-126-15-1235-136-1345-1245
+#always autosteuerung 16-2345-135-23456-126-15-1235-136-1345-1245
+#always legersteuerung 123-15-1245-15-1235-23456-126-15-1235-136-1345-1245
+#always baggersteuerung 12-1-1245-1245-15-1235-23456-126-15-1235-136-1345-1245
+#always betoniersteuerung 12-15-2345-135-1345-346-1235-23456-126-15-1235-136-1345-1245
+#always computersteuerung 14-135-134-1234-136-2345-15-1235-23456-126-15-1235-136-1345-1245
+#always cursorsteuerung 14-136-1235-234-135-1235-23456-126-15-1235-136-1345-1245
+#midendword ssteuerung 234-23456-126-15-1235-136-1345-1245
+#always tragsst 2345-1235-1-1245-234-23456
+#always tragsstudie 2345-1235-1-1245-234-23456-136-145-24-15
+#always aussteuerung 16-234-23456-126-15-1235-136-1345-1245
+#always bitsteuerung 12-24-2345-23456-126-15-1235-136-1345-1245
+#always bausteuerung 12-16-23456-126-15-1235-136-1345-1245
+midendword steufel 234-2345-126-124-15-123
+midendword stext 234-2345-15-1346-2345
+always mannsthal 134-1-1345-1345-234-2345-125-1-123
+midendword stheat 234-2345-125-15-1-2345
+midendword sthema 234-2345-125-15-134-1
+midendword sthemen 234-2345-125-15-134-15-1345
+midword stheni 234-2345-125-15-1345-24
+endword sthenie 234-2345-125-15-1345-346
+midword stheno 234-2345-125-15-1345-135
+midendword stheo 234-2345-125-15-135
+midendword stherap 234-2345-125-15-1235-1-1234
+endword stherapien 234-2345-125-15-1235-1-1234-24-15-1345
+midendword stherm 234-2345-125-15-1235-134
+midendword sthese 234-2345-125-15-234-15
+midendword sthron 234-2345-125-1235-135-1345
+midendword sticket 234-2345-24-14-13-15-2345
+midendword stief 234-2345-346-124
+always stief 23456-346-124
+always stiefel 23456-346-124-15-123
+always eucharistiefeier 126-1456-1-1235-24-23456-346-124-146-15-1235
+always stiefbruder 23456-346-124-12-1235-136-145-15-1235
+always stiefbrüder 23456-346-124-12-1235-1256-145-15-1235
+always stiefgeschwister 23456-346-124-1245-15-156-2456-24-23456-15-1235
+always stiefkind 23456-346-124-13-24-1345-145
+always stiefmutter 23456-346-124-134-136-2345-2345-15-1235
+always stiefmütter 23456-346-124-134-1256-2345-2345-15-1235
+always stiefschwester 23456-346-124-156-2456-15-23456-15-1235
+always stiefsohn 23456-346-124-234-135-125-1345
+always stiefsöhne 23456-346-124-234-246-125-1345-15
+always stieftochter 23456-346-124-2345-135-1456-2345-15-1235
+always stieftöchter 23456-346-124-2345-246-1456-2345-15-1235
+always stiefvater 23456-346-124-1236-1-2345-15-1235
+always stiefväter 23456-346-124-1236-345-2345-15-1235
+midendword stilgen 234-2345-24-123-1245-15-1345
+midendword stilgung 234-2345-24-123-1245-136-1345-1245
+midendword stinte 234-2345-24-1345-2345-15
+begmidword tastinter 2345-1-23456-24-1345-2345-15-1235
+begmidword hostinter 125-135-23456-24-1345-2345-15-1235
+always höchst 125-246-1456-23456
+always kunst 13-136-1345-23456
+begmidword ostintegr 135-23456-24-1345-2345-15-1245-1235
+begmidword westintegr 2456-15-23456-24-1345-2345-15-1245-1235
+midendword stip 234-2345-24-1234
+always stipendi 23456-24-1234-15-1345-145-24
+always einstipp 146-1345-23456-24-1234-1234
+always gestippt 1245-15-23456-24-1234-1234-2345
+always obstipation 135-12-23456-24-1234-1-2345-24-135-1345
+always speckstippe 234-1234-15-14-13-23456-24-1234-1234-15
+always stippbesuch 23456-24-1234-1234-12-15-234-136-1456
+always stippchen 23456-24-1234-1234-1456-15-1345
+always stippe 23456-24-1234-1234-15
+always stippmilch 23456-24-1234-1234-134-24-123-1456
+always stippvisite 23456-24-1234-1234-1236-24-234-24-2345-15
+always stipulation 23456-24-1234-136-123-1-2345-24-135-1345
+always stipulier 23456-24-1234-136-123-346-1235
+midendword stitel 234-2345-24-2345-15-123
+midendword stiter 234-2345-24-2345-15-1235
+midendword stoast 234-2345-135-1-23456
+midendword stochter 234-2345-135-1456-2345-15-1235
+midendword stod 234-2345-135-145
+always kustode 13-136-23456-135-145-15
+midendword stoleran 234-2345-135-123-15-1235-1-1345
+midendword stool 234-2345-135-135-123
+midendword stopo 234-2345-135-1234-135
+midendword storkel 234-2345-135-1235-13-15-123
+midendword storte 234-2345-135-1235-2345-15
+always stosst 23456-135-234-234-2345
+midendword stour 234-2345-135-136-1235
+midendword stracht 234-2345-1235-1-1456-2345
+midendword stradition 234-2345-1235-1-145-24-2345-24-135-1345
+midendword strag 234-2345-1235-1-1245
+always estragon 15-23456-1235-1-1245-135-1345
+always stragödie 234-2345-1235-1-1245-246-145-24-15
+midendword strain 234-2345-1235-1-24-1345
+midendword strakt 234-2345-1235-1-13-2345
+always abstrakt 1-12-23456-1235-1-13-2345
+midendword stranch 234-2345-1235-1-1345-1456
+midendword strank 234-2345-1235-1-1345-13
+midendword strans 234-2345-1235-1-1345-234
+midendword strauer 234-2345-1235-16-15-1235
+midendword straum 234-2345-1235-16-134
+always gastraum 1245-1-23456-1235-16-134
+always lastraum 123-1-23456-1235-16-134
+always testraum 2345-15-23456-1235-16-134
+always ostraum 135-23456-1235-16-134
+midendword straurig 234-2345-1235-16-1235-24-1245
+midendword strauung 234-2345-1235-16-136-1345-1245
+midendword streff 234-2345-1235-15-124-124
+midendword streib 234-2345-1235-146-12
+midendword strend 234-2345-1235-15-1345-145
+midendword strendite 23456-1235-15-1345-145-24-2345-15
+midendword strenn 234-2345-1235-15-1345-1345
+begmidword testrenn 2345-15-23456-1235-15-1345-1345
+midendword streppe 234-2345-1235-15-1234-1234-15
+midendword strete 234-2345-1235-15-2345-15
+midendword stribun 234-2345-1235-24-12-136-1345
+midendword strieb 234-2345-1235-346-12
+always industrie 24-1345-145-136-23456-1235-346
+prfword industrien 24-1345-145-136-23456-1235-24-15-1345
+always industriell 24-1345-145-136-23456-1235-24-15-123-123
+midendword striller 234-2345-1235-24-123-123-15-1235
+midendword strink 234-2345-1235-24-1345-13
+midendword strog 234-2345-1235-135-1245
+always astrog 1-23456-1235-135-1245
+always östrogen 246-23456-1235-135-1245-15-1345
+midendword strommel 234-2345-1235-135-134-134-15-123
+midendword strompete 234-2345-1235-135-134-1234-15-2345-15
+midendword stropf 234-2345-1235-135-1234-124
+midendword strophäe 234-2345-1235-135-1234-125-345-15
+midendword stross 234-2345-1235-135-234-234
+midendword strost 234-2345-1235-135-23456
+midendword strott 234-2345-1235-135-2345-2345
+midendword strug 234-2345-1235-136-1245
+midendword struthahn 234-2345-1235-136-2345-125-1-125-1345
+midendword strächtig 234-2345-1235-345-1456-2345-24-1245
+midendword sträg 234-2345-1235-345-1245
+midendword sträne 234-2345-1235-345-1345-15
+midendword sträume 234-2345-1235-34-134-15
+midendword strög 234-2345-1235-246-1245
+midendword ströpf 234-2345-1235-246-1234-124
+midendword strüb 234-2345-1235-1256-12
+midendword strümmer 234-2345-1235-1256-134-134-15-1235
+midendword stuberkul 234-2345-136-12-15-1235-13-136-123
+midendword stuch 234-2345-136-1456
+midendword stumor 234-2345-136-134-135-1235
+midendword stür 234-2345-1256-1235
+always stürm 23456-1256-1235-134
+always glastürm 1245-123-1-234-2345-1256-1235-134
+always gastürm 1245-1-234-2345-1256-1235-134
+always aussichtstürm 16-234-234-24-1456-2345-234-2345-1256-1235-134
+always beobachtungstürm 12-15-135-12-1-1456-2345-136-1345-1245-234-2345-1256-1235-134
+always zwillingstürm 1356-2456-24-123-123-24-1345-1245-234-2345-1256-1235-134
+always stürz 23456-1256-1235-1356
+always erstürb 15-1235-23456-1256-1235-12
+midendword sturbine 234-2345-136-1235-12-24-1345-15
+midendword sturbo 234-2345-136-1235-12-135
+midendword sturbul 234-2345-136-1235-12-136-123
+midendword sturn 234-2345-136-1235-1345
+midendword styp 234-2345-13456-1234
+midendword styrann 234-2345-13456-1235-1-1345-1345
+midendword stäfel 234-2345-345-124-15-123
+midendword stäfeln 234-2345-345-124-15-123-1345
+midendword stägig 234-2345-345-1245-24-1245
+midendword stäglich 234-2345-345-1245-123-24-1456
+midendword stäler 234-2345-345-123-15-1235
+midendword stänz 234-2345-345-1345-1356
+midendword stäter 234-2345-345-2345-15-1235
+midendword stäusch 234-2345-34-156
+midendword stöchter 234-2345-246-1456-2345-15-1235
+midendword stöchter 234-2345-246-1456-2345-15-1235
+midendword stöne 234-2345-246-1345-15
+always störungstrupp 23456-246-1235-136-1345-1245-234-2345-1235-136-1234-1234
+always stösst 23456-246-234-234-2345
+midendword stöter 234-2345-246-2345-15-1235
+midendword stötung 234-2345-246-2345-136-1345-1245
+midendword stüch 234-2345-1256-1456
+always stücksteil 23456-1256-14-13-234-2345-146-123
+midendword stüft 234-2345-1256-124-2345
+midendword stülle 234-2345-1256-123-123-15
+midendword stümelei 234-2345-1256-134-15-123-146
+midendword stümlich 234-2345-1256-134-123-24-1456
+always gestüte 1245-15-23456-1256-2345-15
+always eistüte 146-234-2345-1256-2345-15
+always kaufstüte 13-16-124-234-2345-1256-2345-15
+always süsst 234-1256-234-234-2345
+always süsst 234-1256-234-234-2345
+always tagesteller 2345-1-1245-15-234-2345-15-123-123-15-1235
+always tagsteller 2345-1-1245-234-2345-15-123-123-15-1235
+always tagstisch 2345-1-1245-234-2345-24-156
+syllable talkshow 2345-1-123-13-234-125-135-2456
+syllable thorax 2345-125-135-1235-1-1346
+always tischtennistisch 2345-24-156-2345-15-1345-1345-24-234-2345-24-156
+syllable trainings 2345-1235-1-24-1345-24-1345-1245-234
+always überasst 1256-12-15-1235-1-234-234-2345
+always ungstank 136-1345-1245-234-2345-1-1345-13
+always ungstat 136-1345-1245-234-2345-1-2345
+always ungsteil 136-1345-1245-234-2345-146-123
+always ungstisch 136-1345-1245-234-2345-24-156
+midendword ungstreu 136-1345-1245-234-2345-1235-126
+always ungstrick 136-1345-1245-234-2345-1235-24-14-13
+always ungstrupp 136-1345-1245-234-2345-1235-136-1234-1234
+always ungsturm 136-1345-1245-234-2345-136-1235-134
+always unionstrupp 136-1345-24-135-1345-234-2345-1235-136-1234-1234
+always unternehmensteil 136-1345-2345-15-1235-1345-15-125-134-15-1345-234-2345-146-123
+always veitstanz 1236-146-2345-234-2345-1-1345-1356
+always verbandstisch 1236-15-1235-12-1-1345-145-234-2345-24-156
+always vergasst 1236-15-1235-1245-1-234-234-2345
+always vergisst 1236-15-1235-1245-24-234-234-2345
+always verkaufstisch 1236-15-1235-13-16-124-234-2345-24-156
+always verkehrsteil 1236-15-1235-13-15-125-1235-234-2345-146-123
+always verkehrsto 1236-15-1235-13-15-125-1235-234-2345-135
+always vermasst 1236-15-1235-134-1-234-234-2345
+always vermögensteil 1236-15-1235-134-246-1245-15-1345-234-2345-146-123
+always verrusst 1236-15-1235-1235-136-234-234-2345
+always verspasst 1236-15-1235-234-1234-1-234-234-2345
+always versuchstier 1236-15-1235-234-136-1456-234-2345-346-1235
+always versöhnungstrunk 1236-15-1235-234-246-125-1345-136-1345-1245-234-2345-1235-136-1345-13
+always vertragsteil 1236-15-1235-2345-1235-1-1245-234-2345-146-123
+always vertragstreu 1236-15-1235-2345-1235-1-1245-234-2345-1235-126
+always volkstanz 1236-135-123-13-234-2345-1-1345-1356
+always volkstum 1236-135-123-13-234-2345-136-134
+always voraustrupp 1236-135-1235-16-234-2345-1235-136-1234-1234
+always wachstum 2456-1-1456-234-2345-136-134
+always wahnsinnstat 2456-1-125-1345-234-24-1345-1345-234-2345-1-2345
+always weihnachtsteller 2456-146-125-1345-1-1456-2345-234-2345-15-123-123-15-1235
+always weihnachtstisch 2456-146-125-1345-1-1456-2345-234-2345-24-156
+always weisst 2456-146-234-234-2345
+always beweis 12-15-2456-146-234
+prfword beweist 12-15-2456-146-23456
+always wettbewerbsteil 2456-15-2345-2345-12-15-2456-15-1235-12-234-2345-146-123
+always willkommenstrunk 2456-24-123-123-13-135-134-134-15-1345-234-2345-1235-136-1345-13
+always wirtshaustisch 2456-24-1235-2345-234-125-16-234-2345-24-156
+always wirtstier 2456-24-1235-2345-234-2345-346-1235
+always wissenstempel 2456-24-234-234-15-1345-234-2345-15-134-1234-15-123
+word wisst 2456-24-234-234-2345
+always wusst 2456-136-234-234-2345
+always wüsst 2456-1256-234-234-2345
+always zeitungstisch 1356-146-2345-136-1345-1245-234-2345-24-156
+always zirkustier 1356-24-1235-13-136-234-2345-346-1235
+always zugsteil 1356-136-1245-234-2345-146-123
+always zwangstaufe 1356-2456-1-1345-1245-234-2345-16-124-15
+always zwangstäuf 1356-2456-1-1345-1245-234-2345-34-124
+always zwillingsturm 1356-2456-24-123-123-24-1345-1245-234-2345-136-1235-134
diff --git a/liblouis/tables/de-g2-core.cti b/liblouis/tables/de-g2-core.cti
new file mode 100644
index 0000000..6e9dc40
--- /dev/null
+++ b/liblouis/tables/de-g2-core.cti
@@ -0,0 +1,10247 @@
+#  liblouis: German Grade 2 Braille
+#
+#  Copyright (C) 2009 SBS Schweizerische Bibliothek für Blinde und Sehbehinderte
+#
+#  This file is part of liblouis.
+#
+#  liblouis is free software: you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as
+#  published by the Free Software Foundation, either version 2.1 of the
+#  License, or (at your option) any later version.
+#
+#  liblouis is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with liblouis. If not, see
+#  <http://www.gnu.org/licenses/>.
+#
+#-------------------------------------------------------------------------------
+#
+#  DEUTSCHE KURZSCHRIFT - German Grade 2 Braille
+#
+#  Version 2009-12-04
+#  christian.waldvogel@sbszh.ch
+#
+#-------------------------------------------------------------------------------
+
+
+#
+#   Einschränkungen
+#   ---------------
+#
+#   - Optimiert für Neue Rechtschreibung
+#   - Schweizer ss-Schreibung nicht berücksichtigt
+#
+#
+#   Bekannte Probleme
+#   -----------------
+#
+#   - Gross-/Kleinschreibung: caps capsword endcapsword ist nicht genug ...
+#     es braucht Auszeichnung im Text.
+#
+#   - Wortersatzzstrich am Ende:
+#     - Bis jetzt nur die Lautgruppen vor -\s und -,\s.
+#     - Ausformulierte Ausnahmen müssen damit nachgerüstet werden.
+#
+#   Abzuklären
+#   ----------
+#
+#   - "contraction" für Masseinheiten missbrauchen, erfordert eingeschaltetes
+#     lettersign!
+#
+
+
+
+
+# class definitions
+class a a
+class b b
+class c c
+class d d
+class e e
+class er er
+class f f
+class h h
+class g g
+class i i
+class j j
+class k k
+class l l
+class m m
+class n n
+class r r
+class s s
+class t t
+class u u
+class z z
+class kpvw kpvw
+class konsonant bcdfghjklmnpqrstvwxyz
+
+
+
+# (4.1 Lautgruppenkürzungen)
+
+# Doppelvokale
+always frisbee 124-1235-24-234-12-15-15
+always kaffee 13-1-124-124-15-15
+always coffee 6-14-135-124-124-15-15
+always toffee 2345-135-124-124-15-15
+always dragee 145-1235-1-1245-15-15
+always bungee 12-256-1245-15-15
+always dorothee 145-26-135-2345-125-15-15
+always cheese 1456-15-15-234-15
+always pappmaschee 1234-1-1234-1234-134-1-156-15-15
+always klischee 13-123-24-156-15-15
+always yankee 6-13456-235-13-15-15
+always gelee 1245-13456-15-15
+always soufflee 234-135-136-124-124-123-15-15
+always defilee 145-15-124-24-123-15-15
+always klee 13-123-15-15
+always renommee 1235-14-135-1346-15-15
+always armee 356-134-15-15
+always resümee 1235-123456-1256-134-15-15
+always schnee 156-1345-15-15
+always trainee 2345-1235-1-24-1345-15-15
+always pralinee 1234-1235-1-123-35-15-15
+always portmonee 1234-26-2345-134-135-1345-15-15
+always kanapee 13-235-1-1234-15-15
+always portepee 1234-26-236-1234-15-15
+always separee 234-15-1234-356-15-15
+always referee 1235-15-124-12456-15-15
+always schikoree 156-24-13-26-15-15
+always spree 234-1234-1235-15-15
+always karree 13-356-1235-15-15
+always porree 1234-26-1235-15-15
+always püree 1234-1256-1235-15-15
+always frikassee 124-1235-24-13-1-2346-15-15
+always plissee 1234-123-24-2346-15-15
+always varietee 1236-356-24-15-2345-15-15
+always komitee 13-135-134-24-2345-15-15
+always trustee 2345-1235-136-23456-15-15
+always frottee 124-1235-135-2345-2345-15-15
+always queen 6-12345-136-15-15-1345
+always halloween 125-1-12345-135-2456-15-15-1345
+
+always hawaii 125-1-2456-1-24-24
+always ascii 1-234-6-14-24-24
+
+always boom 12-135-135-134
+always voodoo 1236-135-135-145-135-135
+always yahoo 6-13456-1-125-135-135
+always waterloo 2456-1-2345-12456-123-135-135
+always shampoo 234-125-1-134-1234-135-135
+always tattoo 2345-1-2345-2345-135-135
+always daewoo 145-1-15-2456-135-135
+always zoo 1356-135-135
+
+# ABER (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word aber 1
+always aber 2-1
+always aberdeen 1-12-12456-145-15-15-1345
+midword aberech 1-23-1235-15-1456
+midendword abereich 1-23-1235-146-1456
+midendword abericht 1-23-2-3456
+begmidword aberkann 1-12-12456-13-235-1345
+always aberkenn 1-12-12456-13-14-1345
+begmidword abernt 1-12-12456-1345-2345
+prfword abernte 1-12-12456-1345-236
+prfword aberntest 1-12-12456-1345-236-23456
+prfword aberntet 1-12-12456-1345-236-2345
+prfword aberntete 1-12-12456-1345-236-236
+prfword abernteten 1-12-12456-1345-236-2345-14
+prfword aberntetest 1-12-12456-1345-236-236-23456
+prfword aberntetet 1-12-12456-1345-236-236-2345
+always aberrans 1-12-12456-1235-235-234
+always aberratio 1-12-12456-1235-1-2345-24-135
+always aberration 1-12-12456-1235-5-1345
+always aberrier 1-12-12456-1235-346-1235
+always aberzieh 1-12-12456-1356-346-125
+always aaberg 1-1-12-12456-1245
+always cabernet 6-14-1-12-12456-1345-15-2345
+sufword faber 124-1-12-12456
+midword gaber 1245-1-23-1235
+always gaberecht 1245-1-23-1235-2345
+sufword haber 125-1-12-12456
+always schaber 156-1-12-12456
+always makaber 134-1-13-1-12-12456
+always kandelaber 13-235-145-13456-1-12-12456
+always laber 123-1-12-12456
+always annaberg 235-1345-1-12-12456-1245
+always araber 356-1-12-12456
+always graber 1245-1235-1-12-12456
+always traber 2345-1235-1-12-12456
+begmidword tabern 2345-1-12-12456-1345
+always waber 2456-1-12-12456
+
+# ACH (4.1 Lautgruppenkürzungen)
+midendword ach 56
+endword achip 1-1456-24-1234
+endword achips 1-1456-24-1234-234
+begword aach 1-1-1456
+prfword bachelor 12-1-1456-13456-135-1235
+begmidword bachelor 12-1-1456-13456-26
+always cach 6-14-1-1456
+prfword each 15-1-1456
+always beach 12-15-1-1456
+always beacht 23-56-2345
+prfword beachte 23-56-236
+always beachtest 23-56-236-23456
+always beachtet 23-56-236-2345
+prfword beachtete 23-56-236-236
+always teacher 2345-15-1-1456-12456
+always teaching 2345-15-1-1456-35-1245
+begmidword megach 134-15-1245-1-1456
+always diachron 145-24-1-1456-1235-135-1345
+always machia 134-1-1456-24-1
+always machin 134-1-1456-35
+always machis 134-1-1456-24-234
+always nikomachisch 1345-24-13-135-134-56-24-156
+always macho 134-1-1456-135
+begmidword anachron 235-1-1456-1235-135-1345
+always coach 6-14-135-1-1456
+begword tetrach 2345-15-2345-1235-1-1456
+midword tetrach 236-2345-1235-1-1456
+always attach 1-2345-2345-1-1456
+always blattachsel 12-123-1-2345-2345-56-234-13456
+always detach 145-15-2345-1-1456
+begmidword metach 134-15-2345-1-1456
+begmidword gouach 1245-135-136-1-1456
+
+# ÄHNLICH (4.4 Zweiformige Kürzungen)
+always ähnlich 345-456
+
+# AL  (4.1 Lautgruppenkürzungen)
+begmidword al 25
+always al-\s 25-36-0
+always al-,\s 25-36-2-0
+always aal 1-1-123
+begmidword chinaalk 1456-35-1-25-13
+always dalag 145-1-123-1-1245
+begmidword daläg 145-1-123-345-1245
+prfword daläge 145-1-123-345-12346
+always dalieg 145-1-123-346-1245
+prfword daliege 145-1-123-346-12346
+sufword deal 145-15-1-123
+always dealer 145-15-1-123-12456
+always idealer 24-145-15-25-12456
+always health 125-15-1-123-2345-125
+begmidword sofalehn 234-135-124-1-123-2356-1345
+begmidword yogalehr 6-13456-135-1245-1-123-2356-1235
+begmidword medialeit 134-15-145-24-1-123-146-2345
+before l begmidword mafia 134-1-124-24-1
+begmidword asialad 1-234-24-1-123-1-145
+begmidword asialäd 1-234-24-1-123-345-145
+begmidword asialink 1-234-24-1-123-35-13
+midword vinzial 1236-35-1356-24-25
+begmidword sojalezi 234-135-245-1-123-15-1356-24
+before l begmidword zodiakal 1356-135-145-24-1-13-25
+before l begmidword wodka 2456-135-145-13-1
+begmidword biotikal 12-24-135-2345-24-13-1-123
+before l begmidword mokka 134-135-13-13-1
+before l begmidword vokal 1236-135-13-25
+always tombola 2345-135-134-12-135-123-1
+begmidword kanal 13-235-25
+before l begmidword sauna 234-16-1345-1
+before l begmidword pharma 1234-125-356-134-1
+begmidword europalet 126-1235-135-1234-25-15-2345
+begmidword europalig 126-1235-135-1234-1-123-45
+always nappaleder 1345-1-1234-1234-1-123-15-145-12456
+before l begmidword kamera 13-1-134-12456-1
+always kameralia 13-1-134-12456-25-24-1
+always kameralist 13-1-134-12456-25-24-23456
+always kameralistisch 13-1-134-12456-25-5-156
+begmidword paraling 1234-356-1-123-35-1245
+begmidword paralymp 1234-356-1-123-6-13456-134-1234
+before l begmidword tundra 2345-256-145-1235-1
+begmidword supraleit 234-136-1234-1235-1-123-146-2345
+before l begmidword ultra 136-123-2345-1235-1
+before l begword extra 1346-2345-1235-1
+before l midword extra 15-6-1346-2345-1235-1
+before l begword prosa 12345-234-1
+before l midword prosa 1234-1235-135-234-1
+begmidword metaling 134-15-2345-1-123-35-1245
+begmidword metalog 134-15-2345-1-123-135-1245
+always rastalock 1235-1-23456-1-123-135-46
+begmidword lavalamp 123-1-1236-1-123-1-134-1234
+begmidword lavalämp 123-1-1236-1-123-345-134-1234
+before l begmidword maya 134-1-6-13456-1
+before l begmidword pizza 1234-24-1356-1356-1
+
+# ALL (4.3.5 Einformige Kürzungen, nur mit Erweiterung)
+always all 1-12345
+sufword alle 1-15
+always alledem 1-15-2-12356
+always allee 1-12345-15-15
+# HOMONYM
+always alleen 1-12345-15-14
+sufword allein 1-1246
+endword allein 1-1246
+endword alleine 1-1246-15
+sufword allel 1-12345-13456
+sufword allen 1-14
+sufword allend 1-12345-14-145
+sufword allem 1-12356
+sufword allemal 1-15-134
+always allemand 1-12345-12356-235-145
+sufword aller 1-12456
+sufword alleraller 1-12456-1-12456
+sufword alleralleraller 1-12456-1-12456-1-12456
+sufword zualler 2-1356-1-12456
+sufword zualleraller 2-1356-1-12456-1-12456
+begmidword herzaller 125-12456-1356-1-12456
+sufword alles 1-123456
+word allesamt 1-15-234-1-134-2345
+always alleg 1-12345-15-1245
+prfword allergen 1-12345-12456-1245-14
+prfword allergene 1-12345-12456-1245-14-15
+prfword allergenen 1-12345-12456-1245-14-14
+prfword allergens 1-12345-12456-1245-14-234
+always allergie 1-12345-12456-1245-346
+always allergien 1-12345-12456-1245-24-14
+always allergiker 1-12345-12456-1245-24-13-12456
+always allergisch 1-12345-12456-1245-24-156
+always allergolo 1-12345-12456-1245-135-123-135
+always alley 1-12345-15-6-13456
+# Alte Rechtschreibung
+always balleben 12-25-123-12-14
+# Alte Rechtschreibung
+always ballehr 12-25-123-2356-1235
+# Alte Rechtschreibung
+always ballizenz 12-25-123-24-1356-14-1356
+begmidword modal 134-135-145-25
+begmidword ideal 24-145-15-25
+begmidword real 1235-15-25
+begmidword regal 1235-15-1245-25
+# Alte Rechtschreibung
+sufword schalloch 156-25-123-135-1456
+# Alte Rechtschreibung
+sufword schallöch 156-25-123-246-1456
+begmidword labial 123-1-12-24-25
+begmidword radial 1235-1-145-24-25
+begmidword kollegial 13-135-12345-15-1245-24-25
+begmidword filial 124-24-123-24-25
+begmidword kolonial 13-135-123-135-1345-24-25
+begmidword gymnasial 1245-6-13456-134-1345-1-234-24-25
+begmidword trivial 2345-1235-24-1236-24-25
+begmidword axial 1-6-1346-24-25
+begmidword glazial 1245-123-1-1356-24-25
+begmidword spezial 234-1234-15-1356-24-25
+begmidword fokal 124-135-13-25
+begmidword formal 124-26-134-25
+begmidword maximal 134-1-6-1346-24-134-25
+begmidword minimal 134-35-24-134-25
+begmidword normal 1345-26-134-25
+begmidword final 124-35-25
+begmidword kriminal 13-1235-24-134-35-25
+begmidword kantonal 13-235-2345-135-1345-25
+begmidword kommunal 13-1346-256-25
+begmidword nominal 1345-135-134-35-25
+begmidword original 26-45-35-25
+begmidword personal 1234-1345-25
+begmidword regional 1235-15-1245-24-135-1345-25
+begmidword national 1345-5-1345-25
+begmidword spinal 234-1234-35-25
+begmidword terminal 2345-12456-134-35-25
+begmidword astral 1-23456-1235-25
+begmidword general 1245-14-12456-25
+begmidword lateral 123-1-2345-12456-25
+begmidword natural 1345-2345-25
+begmidword spektral 234-1234-15-13-2345-1235-25
+begmidword spiral 234-1234-24-1235-25
+begmidword oral 26-25
+midword orallür 26-1-12345-1256-1235
+always korall 13-26-1-12345
+begmidword moral 134-26-25
+begmidword zentral 1356-14-2345-1235-25
+begmidword zerebral 1356-12456-15-12-1235-25
+begmidword integral 35-236-1245-1235-25
+begmidword guttural 1245-136-2345-2345-136-1235-25
+begmidword salleist 234-25-123-146-23456
+begmidword dorsal 145-26-234-25
+begmidword nasal 1345-1-234-25
+begmidword universal 256-24-1236-12456-234-25
+begmidword palatal 1234-25-1-2345-25
+# Alte Rechtschreibung
+always metalleiter 134-15-2345-25-123-146-2345-12456
+begmidword dental 145-14-2345-25
+begmidword frontal 124-1235-135-1345-2345-25
+begmidword horizontal 125-26-24-1356-135-1345-2345-25
+begmidword okzipital 135-13-1356-24-1234-24-2345-25
+begmidword dual 145-136-25
+begmidword lingual 123-35-1245-136-25
+begmidword sexual 234-15-6-1346-136-25
+begmidword festival 124-15-23456-24-1236-25
+# Alte Rechtschreibung
+begmidword schallehr 156-25-123-2356-1235
+# Alte Rechtschreibung
+begmidword schalleit 156-25-123-146-2345
+begmidword vokalläng 1236-135-13-25-5-123-1245
+begmidword schmallipp 156-134-25-123-24-1234-1234
+# alte Rechtschreibung
+begmidword kristalleuch 13-1235-24-23456-25-123-126-1456
+# alte Rechtschreibung
+begmidword kristallüst 13-1235-24-23456-25-123-1256-23456
+begmidword wallaus 2456-25-123-16-234
+
+# ALS   (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word als 146
+
+# ALSO (4.4 Zweiformige Kürzungen)
+always also 1-135
+always realsozial 1235-15-25-234-123
+begmidword spezial 234-1234-15-1356-24-25
+begmidword vokalsol 1236-135-13-25-234-135-123
+begmidword kanalsohl 13-235-25-234-135-125-123
+begmidword national 1345-5-1345-25
+begmidword zentral 1356-14-2345-1235-25
+begmidword kontinental 13-135-1345-2345-35-14-2345-25
+begmidword talsohl 2345-25-234-135-125-123
+begmidword orbital 26-12-24-2345-25
+begmidword instrumental 35-23456-1235-136-134-14-2345-25
+
+# AN  (4.1 Lautgruppenkürzungen)
+word an 235
+begmidword an 235
+always an-\s 235-36-0
+always an-,\s 235-36-2-0
+always anistisch 235-5-156
+always anation 1-1345-5-1345
+always afrikaans 1-124-1235-24-13-1-1-1345-234
+always saanen 234-1-1-1345-14
+always emanation 12356-235-5-1345
+always trepanation 2345-1235-15-1234-235-5-1345
+always andromedanebel 235-145-1235-135-134-15-145-1-1345-15-12-13456
+always daneben 145-1-1345-12
+always danieden 145-1-1345-346-145-14
+always danieder 145-1-1345-346-145-12456
+always lambda 123-1-134-12-145-1
+prfword bean 12-15-1-1345
+prfword beans 12-15-1-1345-234
+always clean 6-14-123-15-1-1345
+always orleans 26-123-15-1-1345-234
+always jean 245-15-1-1345
+always peanut 1234-15-1-1345-136-2345
+begmidword liganeu 123-45-1-1345-126
+always liganiveau 123-45-1-1345-24-1236-15-16
+begmidword alphanum 25-1234-125-1-1345-136-134
+always olympia 135-123-6-13456-134-1234-24-1
+always arekanuss 356-15-13-1-1345-136-2346
+begmidword arekanüss 356-15-13-1-1345-1256-2346
+begmidword amerikan 1-134-12456-24-13-235
+always kolanuss 13-135-123-1-1345-136-2346
+begmidword kolanüss 13-135-123-1-1345-1256-2346
+begmidword supranation 234-136-1234-1235-1-1345-5-1345
+begmidword supranatur 234-136-1234-1235-1-1345-2345
+always intranet 35-2345-1235-1-1345-15-2345
+always paranuss 1234-356-1-1345-136-2346
+begmidword paranüss 1234-356-1-1345-1256-2346
+
+# ANDER ÄNDER (4.3.6 Kommakürzungen)
+always ander 2-12456
+always anders 2-12456-234
+always änder 5-12456
+always anderlecht 235-145-12456-123-15-1456-2345
+sufword andersen 235-145-12456-234-14
+always mäander 134-345-235-145-12456
+always banderill 12-235-145-12456-24-12345
+begmidword banderol 12-235-145-12456-135-123
+always bänder 12-345-1345-145-12456
+always abänder 1-12-5-12456
+always erbänderung 12456-12-5-12456-136
+always pfänder 1234-124-345-1345-145-12456
+sufword leander 123-15-235-145-12456
+always oleander 135-123-15-235-145-12456
+begmidword neandert 1345-15-235-145-12456-2345
+always ugander 136-1245-235-145-12456
+always schänder 156-345-1345-145-12456
+always koriander 13-26-24-235-145-12456
+always kander 13-235-145-12456
+prfword lander 123-235-145-12456
+always landerdbeer 123-235-145-12456-145-12-15-15-1235
+always landerecht 123-235-145-15-1235-2345
+always salander 234-25-235-145-12456
+always flandern 124-123-235-145-12456-1345
+midendword llander 12345-235-145-12456
+always länder 123-345-1345-145-12456
+always geländer 12346-123-345-1345-145-12456
+midendword lländer 12345-345-1345-145-12456
+always landerwerb 123-235-145-12456-2456-12456-12
+begmidword landerzieh 123-235-145-12456-1356-346-125
+sufword olander 135-123-235-145-12456
+always neulander 1345-126-123-235-145-12456
+always manderscheid 134-235-145-12456-156-146-145
+always salamander 234-25-1-134-235-145-12456
+always anaximander 235-1-6-1346-24-134-235-145-12456
+always commander 6-14-135-1346-235-145-12456
+sufword expander 1346-1234-235-145-12456
+midendword expander 15-6-1346-1234-235-145-12456
+always ränder 1235-345-1345-145-12456
+always temperatur 2345-12356-1234-12456-1-2345-136-1235
+begmidword randerhol 1235-235-145-12456-125-135-123
+begmidword randerschein 1235-235-145-12456-156-1246
+always brander 12-1235-235-145-12456
+begmidword branderreg 12-1235-235-145-12456-1235-15-1245
+always palisander 1234-25-24-234-235-145-12456
+sufword sander 234-235-145-12456
+always cuandero 6-14-136-235-145-12456-135
+always ruander 1235-136-235-145-12456
+always vander 1236-235-145-12456
+always wander 2456-235-145-12456
+always gewänder 12346-2456-345-1345-145-12456
+always alexander 25-15-6-1346-235-145-12456
+always zander 1356-235-145-12456
+
+# AR  (4.1 Lautgruppenkürzungen)
+begmidword ar 356
+always ar-\s 356-36-0
+always ar-,\s 356-36-2-0
+before r begmidword kuba 13-136-12-1
+always amerika 1-134-12456-24-13-1
+before r always afrika 1-124-1235-24-13-1
+always granola 1245-1235-235-135-123-1
+always panama 1234-235-1-134-1
+always komma 13-1346-1
+begmidword kommand 13-1346-235-145
+always klima 13-123-24-134-1
+always aroma 356-135-134-1
+always china 1456-35-1
+before r always henna 125-14-1345-1
+always europa 126-1235-135-1234-1
+sufword extra 1346-2345-1235-1
+midendword extra 15-6-1346-2345-1235-1
+always kamera 13-1-134-12456-1
+always kassandra 13-1-2346-235-145-1235-1
+sufword areligiös 1-1235-13456-45-24-246-234
+midword areligiös 1-1235-13456-45-24-246-234
+midendword areport 1-1235-15-1234-26-2345
+midword arezep 1-1235-15-1356-15-1234
+begword arhythm 1-1235-125-6-13456-2345-125-134
+midword arhythm 1-1235-125-6-13456-2345-125-134
+always aar 1-1-1235
+always teneriffa 2345-14-12456-24-124-124-1
+midword aarithmet 1-356-24-2345-125-134-15-2345
+prfword aarmee 1-356-134-15-15
+always aarmeen 1-356-134-15-14
+begmidword barbaross 12-356-12-1-1235-135-2346
+always learn 123-15-1-1235-1345
+always clear 6-14-123-15-1-1235
+always hearing 125-15-1-1235-35-1245
+always pearl 1234-15-1-1235-123
+begmidword shakespear 234-125-1-13-123456-1234-15-1-1235
+always search 234-15-1-1235-1456
+sufword sears 234-15-1-1235-234
+always tearoom 2345-15-1-1235-135-135-134
+always wear 2456-15-1-1235
+before r begmidword sofa 234-135-124-1
+always ligarund 123-45-1-1235-256-145
+always diarahm 145-24-1-1235-1-125-134
+begmidword diarähm 145-24-1-1235-345-125-134
+begmidword mafiaroll 134-1-124-24-1-1235-135-12345
+always inkareich 35-13-1-1235-146-1456
+always board 12-135-1-1235-145
+always roaring 1235-135-1-1235-35-1245
+always infrarot 35-124-1235-1-1235-135-2345
+prfword infrarote 35-124-1235-1-1235-135-236
+begmidword toraroll 2345-26-1-1235-135-12345
+begmidword thoraroll 2345-125-26-1-1235-135-12345
+always hurraruf 125-136-1235-1235-1-1235-136-124
+always ultrarot 136-123-2345-1235-1-1235-135-2345
+prfword ultrarote 136-123-2345-1235-1-1235-135-236
+always rosarot 1235-135-234-1-1235-135-2345
+prfword rosarote 1235-135-234-1-1235-135-236
+always metareflex 134-15-2345-1-1235-15-124-123-15-6-1346
+before r begmidword manta 134-235-2345-1
+before r begmidword magenta 134-1-1245-14-2345-1
+begmidword costaric 6-14-135-23456-1-1235-24-6-14
+
+# ARBEIT (4.4 Zweiformige Kürzungen)
+always arbeit 356-12
+syllable beitrag 2-12-2345-1245
+syllable beiträg 2-12-5-2345-1245
+
+# -ATION (4.2.2 b) Nachsilbenkürzungen)
+midendword ation 5-1345
+
+# -ATIV  (4.2.2 b) Nachsilbenkürzungen)
+midendword ativ 5-1236
+
+# AU  (4.1 Lautgruppenkürzungen)
+word au 6-16
+always au 16
+always kapernaum 13-1-1234-12456-1345-1-136-134
+always europa 126-1235-135-1234-1
+before u begword extra 1346-2345-1235-1
+before u midword extra 15-6-1346-2345-1235-1
+always galauniform 1245-25-1-256-24-124-26-134
+always intrauterin 35-2345-1235-1-136-2345-12456-35
+always kamera 13-1-134-12456-1
+always pharma 1234-125-356-134-1
+
+# ÄU  (4.1 Lautgruppenkürzungen)
+always äu 34
+always skarabäus 234-13-356-1-12-345-136-234
+always thaddäus 2345-125-1-145-145-345-136-234
+always zebedäus 1356-15-23-145-345-136-234
+midendword igäum 24-1245-345-136-134
+always apogäum 1-1234-135-1245-345-136-134
+always matthäus 134-1-2345-2345-125-345-136-234
+always trochäus 2345-1235-135-1456-345-136-234
+always jubiläum 245-136-12-24-123-345-136-134
+always ptolemäus 1234-2345-135-123-12356-345-136-234
+always bartimäus 12-356-2345-24-134-345-136-234
+always bartholomäus 12-356-2345-125-135-123-135-134-345-136-234
+always borromäus 12-26-1235-135-134-345-136-234
+always athenäum 1-2345-125-14-345-136-134
+always piräus 1234-24-1235-345-136-234
+
+# AUCH  (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word auch 34
+
+# AUF (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word auf 16
+always auf-\s 2-16-36-0
+always auf 2-16
+sufword bau 12-16
+always baum 12-16-134
+always baumaschin 12-16-134-156
+always baumaterial 12-16-134-123
+always abbau 1-12-12-16
+always ackerbau 1-46-12456-12-16
+always neubau 1345-126-12-16
+syllable aufbau 2-16-12-16
+always aufberei 2-16-23-1235-146
+always kaufberei 13-16-124-23-1235-146
+always laufberei 123-16-124-23-1235-146
+always durchlauf 2-1456-123-16-124
+prfword signal 234-45-1345-1-123
+begmidword signal 234-45-1345-25
+syllable aufbesser 2-16-234-234
+syllable aufbewahr 2-16-23-2456-125
+always aufgebot 2-16-12346-12-135-2345
+prfword aufgebote 2-16-12346-12-135-236
+syllable aufheb 2-16-125-15-12
+syllable aufhäng 2-16-125-345-1345-1245
+syllable aufhänge 2-16-125-345-1345-12346
+syllable aufhängen 2-16-125-345-1345-1245-14
+syllable aufhängenas 2-16-125-345-1345-12346-1345-1-234
+syllable aufhänger 2-16-125-345-1345-1245-12456
+syllable aufklär 2-16-13-123-345-1235
+syllable aufkomm 2-16-13-1346
+syllable auflauf 2-16-123-16-124
+syllable aufläuf 2-16-123-34-124
+syllable aufmach 2-16-134-56
+syllable aufruf 2-16-1235-136-124
+syllable aufruhr 2-16-1235-136-125-1235
+syllable aufschrei 2-16-156-1235-146
+syllable aufschreib 2-16-156-12
+syllable daraufschreib 2-16-156-12
+syllable umlaufschreiben 136-134-123-16-124-156-12-14
+syllable aufschwung 2-16-156-2456-256-1245
+syllable aufschwün 2-16-156-2456-1256-1345
+syllable aufstieg 2-16-23456-346-1245
+prfword aufstiege 2-16-23456-346-12346
+syllable auftrag 2-16-2345-1245
+syllable aufträg 2-16-5-2345-1245
+syllable auftrags 2-16-2345-1245-234
+syllable auftrieb 2-16-2345-1235-346-12
+syllable anbau 235-12-16
+always ärmel 345-1235-134-13456
+begmidword wärmel 2456-345-1235-134-15-123
+begword ausbau 34-12-16
+midendword ausbau 16-234-12-16
+always baufach 12-16-124-56
+always baufähig 12-16-124-345-125-45
+always baufällig 12-16-5-124-12345-45
+always baufehler 12-16-124-2356-123-12456
+always baufertig 12-16-124-45
+always baufest 12-16-124-15-23456
+begmidword baufinanzier 12-16-124-35-235-1356-346-1235
+prfword baufinanzier 12-16-124-35-235-1356-24-12456
+prfword baufinanziers 12-16-124-35-235-1356-24-12456-234
+begmidword baufirm 12-16-124-24-1235-134
+begmidword baufläch 12-16-124-123-345-1456
+always bauflucht 12-16-124-123-136-1456-2345
+begmidword bauförder 12-16-124-246-1235-145-12456
+always bauform 12-16-124-26-134
+begmidword bauforsch 12-16-124-26-156
+begmidword baufort 12-16-124-26-2345
+always baufrei 12-16-124-1235-146
+begmidword bauführ 12-16-124-125
+always beaufort 12-15-16-124-26-2345
+always niveau 1345-24-1236-15-16
+begmidword blaufarb 12-123-16-124-356-12
+begmidword blaufärb 12-123-16-124-345-1235-12
+begmidword blaufäul 12-123-16-124-34-123
+begmidword blaufelch 12-123-16-124-13456-1456
+begmidword blaufich 12-123-16-124-3456
+always blaufilter 12-123-16-124-24-123-2345-12456
+begmidword chauff 1456-16-124-124
+syllable fuchs 124-136-1456-234
+syllable füchs 124-1256-1456-234
+always gaufürst 1245-16-124-1256-1235-23456
+begmidword graufäul 1245-1235-16-124-34-123
+always graufisch 1245-1235-16-124-24-156
+always hauf 125-16-124
+always nahauf 1345-1-125-2-16
+always frühauf 124-1235-1256-125-2-16
+begmidword stehauf 23456-2356-2-16
+begmidword viehauf 1236-346-125-2-16
+always kabeljau 13-1-12-13456-245-16
+always kauf 13-16-124
+always hypothek 125-6-13456-1234-135-2345-125-15-13
+always klinik 13-123-35-24-13
+always logistik 123-135-1245-24-23456-24-13
+always mathematik 134-1-2345-125-12356-1-2345-24-13
+always physik 1234-125-6-13456-234-24-13
+begmidword grafikauf 1245-1235-1-124-24-13-2-16
+begmidword graphikauf 1245-1235-1-1234-125-24-13-2-16
+begmidword bankauf 12-235-13-2-16
+begmidword schwenkauf 156-2456-14-13-2-16
+begmidword denkaufga 145-14-13-2-16-1245-1
+begmidword lenkauf 123-14-13-2-16
+begmidword funkauf 124-256-13-2-16
+begmidword parkauf 1234-356-13-2-16
+begmidword werkauf 2456-12456-13-2-16
+always knauf 13-1345-16-124
+always lauf 123-16-124
+always eilauftrag 146-123-2-16-2345-1245
+always eilaufträg 146-123-2-16-5-2345-1245
+always monopol 134-135-1345-135-1234-135-123
+always stuhlauf 23456-136-125-123-2-16
+always teilauf 2345-146-123-2-16
+always umlauf 136-134-123-16-124
+always schulauf 156-136-123-2-16
+midendword laufbau 123-2-16-12-16
+midendword laufnehm 123-2-16-1345-125
+midendword laufnahm 123-2-16-1345-134
+midendword laufbereitung 123-2-16-23-1235-146-2345-136
+midendword laufklär 123-2-16-13-123-345-1235
+always schallaufnehm 156-1-12345-2-16-1345-125
+always plateauform 1234-123-1-2345-15-16-124-26-134
+begmidword plateauförm 1234-123-1-2345-15-16-124-246-1235-134
+begmidword schauf 156-16-124
+begmidword geschauf 12346-156-16-124
+always mischauf 134-24-156-2-16
+always tischauf 2345-24-156-2-16
+always frischauf 124-1235-24-156-2-16
+always arschauf 356-156-2-16
+always schnauf 156-1345-16-124
+always geschnauf 12346-156-1345-16-124
+# HOMONYM
+always rauf 1235-2-16
+always raufaser 1235-16-124-1-234-12456
+always raufbold 1235-16-124-12-135-123-145
+prfword raufe 1235-16-124-15
+prfword raufen 1235-16-124-14
+always raufend 1235-16-124-14-145
+prfword raufer 1235-16-124-12456
+always rauferei 1235-16-124-12456-146
+always raufhandel 1235-16-124-125-145-13456
+always raufhändel 1235-16-124-5-125-145-13456
+midendword rauflieger 1235-2-16-123-346-1245-12456
+always rauflust 1235-16-124-123-136-23456
+always raufrost 1235-16-124-1235-135-23456
+prfword raufst 1235-16-124-23456
+always rauft 1235-16-124-2345
+always drauf 145-1235-2-16
+after r midendword auftrag 2-16-2345-1245
+after r midendword aufträg 2-16-5-2345-1245
+always lackier 123-1-46-346-1235
+always grammier 1245-1235-1-1346-346-1235
+always reparatur 1235-15-1234-356-1-2345-136-1235
+always gebühr 12346-12-1256-125-1235
+always lehrauf 123-2356-1235-2-16
+prfword raufte 1235-16-124-236
+prfword rauftest 1235-16-124-236-23456
+prfword rauftet 1235-16-124-236-2345
+always raufutter 1235-16-124-136-2345-2345-12456
+always raufuß 1235-16-124-136-2346
+always raufüß 1235-16-124-1256-2346
+begmidword wiederauf 346-145-2-16
+always trauf 2345-1235-16-124
+always sauf 234-16-124
+always glasauf 1245-123-1-234-2-16
+always standsauf 2-23456-234-2-16
+always fondsauf 124-135-1345-145-234-2-16
+always tagsauf 2345-1-1245-234-2-16
+midword ungsauf 136-234-2-16
+always reichsauf 1235-146-1456-234-2-16
+always bereichsauf 23-1235-146-1456-234-2-16
+midword ationsauf 5-1345-234-2-16
+always stücksauf 23456-1256-46-234-2-16
+always flussauf 124-123-136-2346-2-16
+always budgetsauf 12-136-145-12346-2345-234-2-16
+midword schaftsauf 156-234-2-16
+always hausauf 125-16-234-2-16
+always tauf 2345-16-124
+always spätauf 234-1234-345-2345-2-16
+always porträtauf 1234-26-2345-1235-345-2345-2-16
+always etatauf 15-2345-1-2345-2-16
+always privatauf 1234-1235-24-1236-1-2345-2-16
+always stadtauf 23456-1-145-2345-2-16
+always mietauf 134-346-2345-2-16
+always magnetauf 134-1-1245-1345-15-2345-2-16
+always budgetauf 12-136-145-12346-2345-2-16
+always internetauf 35-2345-12456-1345-15-2345-2-16
+always luftauf 123-136-124-2345-2-16
+always machtauf 134-56-2345-2-16
+always nachtauf 1345-56-2345-2-16
+always schichtauf 156-3456-2345-2-16
+always frachtauf 124-1235-56-2345-2-16
+always dichtauf 145-3456-2345-2-16
+begword lichtauf 123-3456-2345-2-16
+midword lichtauf 456-2345-2-16
+always portraitauf 1234-26-2345-1235-1-24-2345-2-16
+always kreditauf 13-1235-15-145-24-2345-2-16
+always aktauf 1-13-2345-2-16
+always nacktauf 1345-1-46-2345-2-16
+midword jektauf 245-15-13-2345-2-16
+always direktauf 145-24-1235-15-13-2345-2-16
+always marktauf 134-356-13-2345-2-16
+always schaltauf 156-25-2345-2-16
+always weltauf 2456-13456-2345-2-16
+always momentauf 134-135-134-14-2345-2-16
+always notauf 1345-135-2345-2-16
+always brotauf 12-1235-135-2345-2-16
+always startauf 23456-356-2345-2-16
+always wertauf 2456-12456-2345-2-16
+always fahrtauf 2-1235-2345-2-16
+always portauf 1234-26-2345-2-16
+always wortauf 2456-26-2345-2-16
+always bettauf 23-2345-2345-2-16
+always mattauf 134-1-2345-2345-2-16
+always ballettauf 12-1-12345-15-2345-2345-2-16
+syllable aufbau 2-16-12-16
+syllable aufsicht 2-16-234-3456-2345
+begmidword stauf 23456-16-124
+midword staufbr 23456-2-16-12-1235
+midword stauflös 23456-2-16-123-246-234
+midendword staufseher 23456-2-16-234-2356-12456
+midendword stauftrag 23456-2-16-2345-1245
+midword staufträg 23456-2-16-5-2345-1245
+begmidword gastauf 1245-1-23456-2-16
+begmidword knastauf 13-1345-1-23456-2-16
+begmidword kindstauf 13-35-145-234-2345-16-124
+begmidword postauf 1234-135-23456-2-16
+begmidword erstauf 12456-23456-2-16
+begmidword wurstauf 2456-136-1235-23456-2-16
+begmidword blutauf 12-123-136-2345-2-16
+begword textauf 2345-15-6-1346-2345-2-16
+midword textauf 236-6-1346-2345-2-16
+
+# AUS- (4.2.1 Vorsilbenkürzungen)
+begword aus 34
+word aus-\s 34-36-0
+always auschwitz 16-156-2456-24-2345-1356
+begmidword auspizi 16-234-1234-24-1356-24
+sufword austen 16-23456-14
+always auster 16-23456-12456
+sufword austin 16-23456-35
+begmidword austral 16-23456-1235-25
+begmidword australi 16-23456-1235-25-24
+always austria 16-23456-1235-24-1
+always austrones 16-23456-1235-135-1345-123456
+
+# BE  (4.1 Lautgruppenkürzungen)
+word be 12-15
+begmidword be 23
+always be-\s 23-36-0
+always be-,\s 23-36-2-0
+sufword beagl 12-15-1-1245-123
+always beamen 12-15-1-134-14
+always beamer 12-15-1-134-12456
+prfword gebeamt 12346-12-15-1-134-2345
+always beatband 12-15-1-2345-12-235-145
+always beatm 23-1-2345-134
+always beatmusik 12-15-1-2345-134-13
+begmidword beatri 23-1-2345-1235-24
+before konsonant begmidword beat 12-15-1-2345
+always offbeat 135-124-124-12-15-1-2345
+midendword stoffbeatmung 23456-135-124-124-23-1-2345-134-136
+always off-beat 135-124-124-36-12-15-1-2345
+always computerbeat 6-14-135-134-1234-136-2345-12456-12-15-1-2345
+prfword beau 12-15-16
+always beaujolais 12-15-16-245-135-123-1-24-234
+always beaulieu 12-15-16-123-24-126
+prfword beaus 12-15-16-234
+always beautiful 12-15-16-2345-24-124-136-123
+always beauty 12-15-16-2345-6-13456
+always farbecht 124-356-12-15-1456-2345
+prfword farbechte 124-356-12-15-1456-236
+always halbedel 125-25-12-15-145-13456
+prfword bee 12-15-15
+prfword beede 12-15-15-145-15
+prfword beeden 12-15-15-145-14
+always beef 12-15-15-124
+always beelz 12-15-15-123-1356
+always beep 12-15-15-1234
+prfword beer 12-15-15-1235
+prfword beere 12-15-15-1235-15
+prfword beeren 12-15-15-1235-14
+prfword beers 12-15-15-1235-234
+prfword bees 12-15-15-234
+always beet 12-15-15-2345
+prfword beete 12-15-15-236
+always beug 12-126-1245
+always halbesel 125-25-12-123456-13456
+prfword beuge 12-126-12346
+always beugebeweg 12-126-12346-23-2456-1245
+before h begmidword beuge 12-126-12346
+before m begmidword beuge 12-126-12346
+before s begmidword beuge 12-126-12346
+always beul 12-126-123
+always beuren 12-126-1235-14
+begmidword beurr 12-126-1235-1235
+always beute 12-126-236
+always beutel 12-126-2345-13456
+always beuten 12-126-2345-14
+always beuter 12-126-2345-12456
+always beutl 12-126-2345-123
+always beutn 12-126-2345-1345
+always beutung 12-126-2345-136
+always beuschel 12-126-156-13456
+always beuys 12-126-6-13456-234
+always abbey 1-12-12-15-6-13456
+always ribeyesteak 1235-24-12-15-6-13456-15-23456-15-1-13
+midword bex 12-15-6-1346
+always abebb 1-12-15-12-12
+sufword abel 1-12-13456
+always frisbee 124-1235-24-234-12-15-15
+# BEh
+always behennuss 12-2356-14-1345-136-2346
+always behennüss 12-2356-14-1345-1256-2346
+always behmlot 12-2356-134-123-135-2345
+always behr 12-2356-1235
+prfword gabbeh 1245-1-12-12-15-125
+begmidword gabbeh 1245-1-12-12-2356
+# BEl
+prfword bel 12-13456
+word bela 12-13456-1
+always belami 12-13456-1-134-24
+always belarus 12-13456-1-1235-136-234
+always belarussisch 12-13456-1-1235-136-2346-24-156
+always belcanto 12-13456-6-14-235-2345-135
+always belchen 12-13456-1456-14
+always belemnit 12-13456-12356-1345-24-2345
+always belesprit 12-13456-123456-1234-1235-24-2345
+always belfast 12-13456-124-1-23456
+always belfer 12-13456-124-12456
+begmidword belgi 12-13456-1245-24
+always belgrad 12-13456-1245-1235-1-145
+prfword belial 12-13456-24-1-123
+begmidword belial 12-13456-24-25
+prfword beliar 12-13456-24-1-1235
+begmidword beliar 12-13456-24-356
+begmidword belind 12-13456-35-145
+begmidword beliz 12-13456-24-1356
+always belkanto 12-13456-13-235-2345-135
+midendword belloch 12-13456-123-135-1456
+sufword belm 12-13456-134
+endword beln 12-13456-1345
+always belorussisch 12-13456-135-1235-136-2346-24-156
+prfword belsazar 12-13456-234-1-1356-1-1235
+begmidword belsazar 12-13456-234-1-1356-356
+sufword belt 12-13456-2345
+always beluga 12-13456-136-1245-1
+always belutsch 12-13456-136-2345-156
+begmidword belved 12-13456-1236-15-145
+always belz 12-13456-1356
+word abel 1-12-13456
+midendword derabel 145-12456-1-12-13456
+always miserabel 134-24-234-12456-1-12-13456
+always babel 12-1-12-13456
+midendword dabel 145-1-12-13456
+always permeabel 1234-12456-134-15-1-12-13456
+always fabel 124-1-12-13456
+always gabel 1245-1-12-13456
+before l begmidword eingabe 1246-1245-1-23
+before l begmidword wiedergabe 346-145-1245-1-23
+before l begword ausgabe 34-1245-1-23
+before l midword ausgabe 16-234-1245-1-23
+always variabel 1236-356-24-1-12-13456
+always justiziabel 245-136-23456-24-1356-24-1-12-13456
+always kabel 13-1-12-13456
+always label 123-1-12-13456
+begmidword flabellin 124-123-1-23-12345-35
+midendword llabel 12345-1-12-13456
+always blamabel 12-123-1-134-1-12-13456
+always nabel 1345-1-12-13456
+always inkunabel 35-13-256-1-12-13456
+always annabell 235-1345-1-23-12345
+always schnabel 156-1345-1-12-13456
+always schnäbel 156-1345-345-12-13456
+always palpabel 1234-25-1234-1-12-13456
+always rabel 1235-1-12-13456
+always parabel 1234-356-1-12-13456
+always parabellum 1234-356-1-23-12345-136-134
+always sabel 234-1-12-13456
+always isabell 24-234-1-23-12345
+always rosabell 1235-135-234-1-23-12345
+always säbel 234-345-12-13456
+always tabel 2345-1-12-13456
+always tabell 2345-1-23-12345
+always schwäbel 156-2456-345-12-13456
+always babbel 12-1-12-12-13456
+always kabbel 13-1-12-12-13456
+always quabbel 6-12345-136-1-12-12-13456
+always brabbel 12-1235-1-12-12-13456
+always grabbel 1245-1235-1-12-12-13456
+always schräbbel 156-1235-345-12-12-13456
+always krabbel 13-1235-1-12-12-13456
+always sabbel 234-1-12-12-13456
+always wabbel 2456-1-12-12-13456
+midendword ibbel 24-12-12-13456
+always goebbels 1245-135-15-12-12-13456-234
+midendword ubbel 136-12-12-13456
+always bebel 23-12-13456
+begword probebelast 12345-23-23-123-1-23456
+always hebel 125-15-12-13456
+always hebelist 125-15-23-123-24-23456
+always giebel 1245-346-12-13456
+always liebel 123-346-12-13456
+always zwiebel 1356-2456-346-12-13456
+always nebel 1345-15-12-13456
+always feldwebel 124-13456-145-2456-15-12-13456
+always bibel 12-24-12-13456
+always deibel 145-146-12-13456
+always weibel 2456-146-12-13456
+always fibel 124-24-12-13456
+always erigibel 12456-45-24-12-13456
+always reagibel 1235-15-1-1245-24-12-13456
+always fallibel 124-1-12345-24-12-13456
+always disponibel 145-24-234-1234-135-1345-24-12-13456
+always penibel 1234-14-24-12-13456
+always sibel 234-24-12-13456
+midendword tibel 2345-24-12-13456
+always flexibel 124-123-15-6-1346-24-12-13456
+always dezibel 145-15-1356-24-12-13456
+always zibel 1356-24-12-13456
+always falbel 124-25-12-13456
+always praeambel 1234-1235-1-15-1-134-12-13456
+always präambel 1234-1235-345-1-134-12-13456
+always pschyrembel 1234-156-6-13456-1235-12356-12-13456
+always zimbel 1356-24-134-12-13456
+always obelisk 135-12-13456-24-234-13
+always obelix 135-12-13456-24-6-1346
+always gobelin 1245-135-12-13456-35
+always hobel 125-135-12-13456
+always kobel 13-135-12-13456
+always möbel 134-246-12-13456
+always nobel 1345-135-12-13456
+always knobel 13-1345-135-12-13456
+always pöbel 1234-246-12-13456
+always zobel 1356-135-12-13456
+always bärbel 12-345-1235-12-13456
+always scherbel 156-12456-12-13456
+always kerbel 13-12456-12-13456
+always hyperbel 125-6-13456-1234-12456-12-13456
+before l begmidword werbe 2456-12456-23
+always schwerbeladen 156-2456-12456-23-123-1-145-14
+always wirbel 2456-24-1235-12-13456
+always zirbel 1356-24-1235-12-13456
+always kurbel 13-136-1235-12-13456
+always übel 1256-12-13456
+always menübeleg 134-14-1256-23-123-15-1245
+prfword menübelege 134-14-1256-23-123-15-12346
+always hugendubel 125-136-1245-14-145-136-12-13456
+always deubel 145-126-12-13456
+always doubel 145-135-136-12-13456
+always hubel 125-136-12-13456
+always jubel 245-136-12-13456
+always rubel 1235-136-12-13456
+always rubella 1235-136-23-12345-1
+# BEm
+endword bem 12-12356
+always bemm 23-1346
+always bemann 23-134-1345
+always bemänn 23-5-134-1345
+midendword bemaschin 23-134-156
+midendword bematerial 23-134-123
+always bemittel 23-134-2345
+midendword bemöglich 23-134-456
+midendword bemusik 23-134-13
+midendword bemuss 23-134-2346
+always bembel 12-12356-12-13456
+midendword bemail 12-12356-1-24-123
+midword bemaill 12-12356-1-24-12345
+midword bemanz 12-12356-235-1356
+midword bemball 12-12356-12-1-12345
+midword bembarg 12-12356-12-356-1245
+midendword bemblem 12-12356-12-123-12356
+midendword bembryo 12-12356-12-1235-6-13456-135
+midendword bement 12-12356-14-2345
+midendword bemerit 12-12356-12456-24-2345
+midword bemigr 12-12356-45-1245-1235
+midendword beminent 12-12356-35-14-2345
+endword beminente 12-12356-35-14-236
+midendword bemission 12-12356-24-2346-245
+midendword bemotion 12-12356-135-2345-245
+midword bempath 12-12356-1234-1-2345-125
+midendword bempfang 12-12356-1234-124-235-1245
+midword bempfäng 12-12356-1234-124-345-1345-1245
+midendword bempfehl 12-12356-1234-124-2356-123
+midendword bempfind 12-12356-1234-124-35-145
+midendword bempfund 12-12356-1234-124-256-145
+midword bemphat 12-12356-1234-125-1-2345
+endword bempor 12-12356-1234-135-1235
+midword bempor 12-12356-1234-26
+midendword bempör 12-12356-1234-246-1235
+midendword bemsig 12-12356-234-45
+midword bemul 12-12356-136-123
+# BEn
+always ben 12-14
+always benach 23-1345-56
+always benag 23-1345-1-1245
+always benahm 23-1345-134
+always benäh 23-1345-345-125
+always benähm 23-5-1345-134
+midendword benähnlich 12-14-345-456
+always benam 23-1345-1-134
+always benann 23-1345-235-1345
+always benarb 23-1345-356-12
+sufword probenarbeit 12345-12-14-356-12
+begmidword probenarbeit 1234-1235-135-12-14-356-12
+always grubenarbeit 1245-1235-136-12-14-356-12
+always benäss 23-1345-345-2346
+always benebel 23-1345-15-12-13456
+always benebel 23-1345-15-12-13456
+always benebl 23-1345-15-12-123
+always benehm 23-1345-125
+always beneid 23-1345-146-145
+always benenn 23-1345-14-1345
+always benetz 23-1345-15-2345-1356
+always benies 23-1345-346-234
+always benimm 23-1345-24-1346
+always benommen 23-1345-1346
+always benot 23-1345-135-2345
+always grubenotter 1245-1235-136-12-14-135-2345-2345-12456
+always benöt 23-1345-246-2345
+prfword benote 23-1345-135-236
+always benotest 23-1345-135-236-23456
+always benotet 23-1345-135-236-2345
+prfword benotete 23-1345-135-236-236
+prfword benotetet 23-1345-135-236-236-2345
+always benotetest 23-1345-135-236-236-23456
+midendword benötig 23-1345-246-2345-45
+midendword benummer 23-1345-136-1346-12456
+always benutz 23-1345-1356
+always benütz 23-5-1345-1356
+# BEr
+always ber 12-12456
+always berand 23-1235-235-145
+always berank 23-1235-235-13
+always berann 23-1235-235-1345
+always berapp 23-1235-1-1234-1234
+always berat 23-1235-1-2345
+always fieber 124-346-12-12456
+always beration 12-12456-5-1345
+always berät 23-1235-345-2345
+prfword berate 23-1235-1-236
+always beratet 23-1235-1-236-2345
+always beratest 23-1235-1-236-23456
+always beraub 23-1235-16-12
+always beräuch 23-1235-34-1456
+always beraum 23-1235-16-134
+always beräum 23-1235-34-134
+always berausch 23-1235-16-156
+always berech 23-1235-15-1456
+always berecht 23-1235-2345
+always schwebereck 156-2456-15-23-1235-15-46
+always bered 23-1235-15-145
+always bereed 23-1235-15-15-145
+always bereg 23-1235-15-1245
+endword berei 12-12456-146
+always berei 23-1235-146
+always berein 23-1235-1246
+endword bereien 12-12456-146-14
+always alberei 25-12-12456-146
+midendword albereich 25-23-1235-146-1456
+always reiberei 1235-146-12-12456-146
+always zauberei 1356-16-12-12456-146
+always berenn 23-1235-14-1345
+always berent 23-1235-14-1345-2345
+endword berente 23-1235-14-1345-236
+always berentet 23-1235-14-1345-236-2345
+always berentest 23-1235-14-1345-236-23456
+always bereu 23-1235-126
+always sperber 234-1234-12456-12-12456
+always bericht 23-2-3456
+always beriech 23-1235-346-1456
+always berieb 23-1235-346-12
+always berief 23-1235-346-124
+always beries 23-1235-346-234
+always beriet 23-1235-346-2345
+prfword beriete 23-1235-346-236
+prfword berietest 23-1235-346-236-23456
+prfword berietet 23-1235-346-236-2345
+always bering 23-1235-35-1245
+always oberingenieur 135-12-12456-35-1245-14-24-126-1235
+always beringmeer 12-12456-35-1245-134-15-15-1235
+always beringsee 12-12456-35-1245-234-15-15
+always beringstr 12-12456-35-1245-23456-1235
+always beritt 23-1235-24-2345-2345
+always berüch 23-1235-1256-1456
+always berück 23-1235-46
+always berüsch 23-1235-1256-156
+always beruf 23-1235-136-124
+always beruh 23-1235-136-125
+always berühm 23-1235-1256-125-134
+always berühr 23-1235-1256-125-1235
+always beruß 23-1235-136-2346
+# BEs
+prfword bes 12-123456
+always besch 23-156
+always beschlag 23-156-1245
+always beschläg 23-5-156-1245
+always beschließ 23-156-2346
+always beschleich 23-156-123-146-1456
+always beschreib 23-156-12
+always beschrieb 23-2-156
+always beschrift 23-156-2345
+always besetz 23-2-15
+always besitz 23-2-24
+always besoll 23-2-234
+always best 23-23456
+always bestimmung 23-23456-24-1346-136
+always bestand 23-2-23456
+always bestands 23-2-23456-234
+always beständ 23-5-23456
+always bestell 23-2-13456
+sufword bestrich 23-23456-1235-3456
+prfword besan 12-123456-1-1345
+always besan 12-123456-235
+always besang 23-234-235-1245
+always besandung 23-234-235-145-136
+always besann 23-234-235-1345
+always besen 12-123456-14
+midendword besendung 23-234-14-145-136
+always beseng 23-234-14-1245
+always besenginster 12-123456-14-1245-35-23456-12456
+word besenge 23-234-14-12346
+always beserl 12-123456-12456-123
+always beskiden 12-123456-13-24-145-14
+always bessarabi 23-2346-356-1-12-24
+always bessemer 23-2346-12356-12456
+always bessrung 23-2346-1235-136
+always arabesk 356-1-12-123456-13
+always arabesqu 356-1-12-123456-6-12345-136
+always grabes 1245-1235-1-12-123456
+always stabes 23456-1-12-123456
+always diebes 145-346-12-123456
+always liebes 123-346-12-123456
+always siebes 234-346-12-123456
+prfword triebes 2345-1235-346-12-123456
+before s midword triebe 2345-1235-346-23
+always leibes 123-146-12-123456
+always weibes 2456-146-12-123456
+always lobes 123-135-12-123456
+always silo 234-24-123-135
+word lobesam 123-135-23-2346
+always lobest 123-135-23-23456
+always klobesuch 13-123-135-23-234-136-1456
+begmidword robespierr 1235-135-12-123456-1234-24-12456-1235
+before s begmidword werbe 2456-12456-23
+prfword werbes 2456-12456-12-123456
+always raubes 1235-16-12-123456
+always graubeschlag 1245-1235-16-23-156-1245
+always staubes 23456-16-12-123456
+
+# BEI (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word bei 12
+always bei-\s 2-12-36-0
+always bei 2-12
+always beich 12-146-1456
+always beier 12-146-12456
+prfword beige 12-146-12346
+always beigebraun 12-146-12346-12-1235-16-1345
+always beigefarb 12-146-12346-124-356-12
+prfword beigem 12-146-1245-12356
+always beigen 12-146-1245-14
+prfword beiger 12-146-1245-12456
+prfword beiges 12-146-1245-123456
+always beigt 12-146-1245-2345
+always beigte 12-146-1245-236
+always beigten 12-146-1245-2345-14
+always beignet 12-146-1245-1345-15-2345
+always beijing 23-24-245-35-1245
+prfword beil 12-146-123
+prfword beile 12-146-123-15
+always beilen 12-146-123-14
+always beiles 12-146-123-123456
+before konsonant begmidword beil 12-146-123
+always bein 12-1246
+always beinah 2-12-1345-1-125
+always beinam 2-12-1345-1-134
+begmidword beinamput 12-1246-1-134-1234-136-2345
+always beinhal 23-35-125-25
+always beirr 23-24-1235-1235
+always beirut 12-146-1235-136-2345
+always beisel 12-146-234-13456
+always treibeis 2345-1235-146-12-146-234
+always stabeisen 23456-1-12-146-234-14
+syllable beitrag 2-12-2345-1245
+syllable beiträg 2-12-5-2345-1245
+always beiß 12-146-2346
+always beisl 12-146-234-123
+always beitel 12-146-2345-13456
+always beiz 12-146-1356
+always beizu 2-12-2-1356
+always herbei 125-12456-2-12
+always reiherbeiz 1235-146-125-12456-12-146-1356
+always beizahl 2-12-1356-123
+always beizähl 2-12-5-1356-123
+always beizäum 2-12-1356-34-134
+always beizeit 2-12-1356-2345
+always beizieh 2-12-1356-346-125
+always beizu 2-12-2-1356
+always beizung 12-146-1356-136
+always schabeisen 156-1-12-146-234-14
+always reibeisen 1235-146-12-146-234-14
+always salbei 234-25-12-146
+before i begmidword werbe 2456-12456-23
+
+# BEID (4.4 Zweiformige Kürzungen)
+always beid 12-145
+always beidräng 2-12-145-1235-345-1345-1245
+endword beidränge 2-12-145-1235-345-1345-12346
+always beidruck 2-12-145-46
+always beidrück 2-12-5-145-46
+always beidreh 2-12-145-1235-2356
+always beidürf 2-12-2-145
+
+# BEIM (4.4 Zweiformige Kürzungen)
+always beim 12-134
+always beimann 2-12-134-1345
+begmidword beimänn 2-12-5-134-1345
+always beimaß 2-12-134-1-2346
+always beimeng 2-12-134-14-1245
+always beimenge 2-12-134-14-12346
+always beimengen 2-12-134-14-1245-14
+begmidword beimess 2-12-134-15-2346
+always beimisch 2-12-134-24-156
+begmidword beimiss 2-12-134-24-2346
+always beimittel 2-12-134-2345
+begmidword beimpf 23-24-134-1234-124
+always farbeimer 124-356-12-146-134-12456
+always vorbei 2-26-2-12
+
+# BESONDER (4.3.5 Einformige Kürzungen, nur mit Erweiterung)
+word besonder 23-234-135-1345-145-12456
+always besonder 23
+begmidword werbesonder 2456-12456-23-234-135-1345-145-12456
+
+# BESSER (4.4 Zweiformige Kürzungen)
+always besser 234-234
+
+# BIS (4.4 Zweiformige Kürzungen)
+always bis 12-234
+always bisam 12-24-234-1-134
+always biscaya 12-24-234-6-14-1-6-13456-1
+always bisch 12-24-156
+always bise 12-24-234-15
+always bisen 12-24-234-14
+always bishop 12-24-234-125-135-1234
+always bisimulation 12-24-234-24-134-136-123-5-1345
+always bisk 12-24-234-13
+always bism 12-24-234-134
+midendword bismus 12-5-24
+always bison 12-24-234-135-1345
+always bisquit 12-24-234-6-12345-136-24-2345
+always biss 12-24-2346
+always biswind 12-24-234-2456-35-145
+prfword abis 1-12-24-234
+always abisolier 1-12-24-234-135-123-346-1235
+always arabisier 356-1-12-24-234-346-1235
+always cannabis 6-14-235-1345-1-12-24-234
+always chabis 1456-1-12-24-234
+always kabis 13-1-12-24-234
+always nabisco 1345-1-12-24-234-6-14-135
+always kohlrabis 13-135-125-123-1235-1-12-24-234
+always trabis 2345-1235-1-12-24-234
+always rabbis 1235-1-12-12-24-234
+prfword ibis 24-12-24-234
+always ibiss 24-12-24-2346
+always alibis 25-24-12-24-234
+always albis 25-12-24-234
+always bambis 12-1-134-12-24-234
+always kombi 13-135-134-12-24
+always kombin 13-135-134-12-35
+always nobis 1345-135-12-24-234
+always snobismus 234-1345-135-12-5-24
+always nairobis 1345-1-24-1235-135-12-24-234
+word verbis 1236-12456-12-24-234
+word corbis 6-14-26-12-24-234
+word vorbis 1236-26-12-24-234
+always kürbis 13-1256-1235-12-24-234
+always kürbisse 13-1256-1235-12-24-2346-15
+always kürbissen 13-1256-1235-12-24-2346-14
+always kürbisses 13-1256-1235-12-24-2346-123456
+always bubis 12-136-12-24-234
+always kubisch 13-136-12-24-156
+always kubismus 13-136-12-5-24
+always anubis 235-136-12-24-234
+always räbisch 1235-345-12-24-156
+always azubis 1-1356-136-12-24-234
+
+# BIST (4.4 Zweiformige Kürzungen)
+always bist 12-23456
+midendword bistisch 12-5-156
+always bistro 12-24-23456-1235-135
+always bistum 12-234-2345-136-134
+always bistüm 12-234-2345-1256-134
+always arabist 356-1-12-24-23456
+always snobistisch 234-1345-135-12-5-156
+always kubist 13-136-12-24-23456
+always kubistisch 13-136-12-5-156
+
+# BLEIB (4.4 Zweiformige Kürzungen)
+always bleib 12-12
+always bleibad 12-123-146-12-1-145
+always bleibäd 12-123-146-12-345-145
+always bleibelast 12-123-146-23-123-1-23456
+always bleibenzin 12-123-146-12-14-1356-35
+always bleiberecht 12-12-15-1235-2345
+always bleibeschwer 12-123-146-23-156-2456-12456
+always bleibüchs 12-123-146-12-1256-1456-234
+
+# BLIND (4.4 Zweiformige Kürzungen)
+always blind 12-123
+always halblind 125-25-12-123-35-145
+
+# BRAUCH BRÄUCH (4.3.6 Kommakürzungen)
+always brauch 2-34
+always bräuch 5-34
+
+# BRIEF (4.4 Zweiformige Kürzungen)
+always brief 12-124
+always briefing 12-1235-346-124-35-1245
+prfword abrief 1-12-1235-346-124
+prfword abriefen 1-12-1235-346-124-14
+prfword abriefst 1-12-1235-346-124-23456
+always schemabrief 156-12356-1-12-124
+
+# BRING (4.4 Zweiformige Kürzungen)
+always bring 12-1245
+begword abring 1-12-1235-35-1245
+prfword abringe 1-12-1235-35-12346
+always schraubring 156-1235-16-12-1235-35-1245
+prfword schraubringe 156-1235-16-12-1235-35-12346
+
+# C   (4.1 Lautgruppenkürzungen)
+word c 6-14
+always c 6-14
+# Grossgeschriebene Wortanfänge erhalten sonst keinen Pt.6!
+noback context ["C"]$u @6-14
+
+# CH  (4.1 Lautgruppenkürzungen)
+word ch 6-1456
+always ch 1456
+
+# CHARAKTER (4.4 Zweiformige Kürzungen)
+syllable charakter 1456-13
+
+# CK  (4.1 Lautgruppenkürzungen)
+word ck 6-14-13
+midendword ck 46
+
+# DABEI (4.4 Zweiformige Kürzungen)
+always dabei 145-12
+
+# DADURCH (4.4 Zweiformige Kürzungen)
+always dadurch 145-145
+
+# DAFÜR (4.4 Zweiformige Kürzungen)
+always dafür 145-124
+
+# DAGEGEN (4.4 Zweiformige Kürzungen)
+always dagegen 145-1245
+
+# DAHER (4.4 Zweiformige Kürzungen)
+always daher 145-125
+
+# DAMIT (4.4 Zweiformige Kürzungen)
+always damit 145-134
+always adamit 1-145-1-134-24-2345
+sufword propaganda 12345-1234-1-1245-235-145-1
+midendword propaganda 1234-1235-135-1234-1-1245-235-145-1
+
+# DANK (4.4 Zweiformige Kürzungen)
+always dank 145-13
+always dankauf 145-235-13-16-124
+always dankäuf 145-235-13-34-124
+begmidword jordank 245-26-145-235-13
+begmidword mordankl 134-26-145-235-13-123
+
+# DAS   (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word das 145
+
+# DASS  (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word dass 2346
+# Alte Rechtschreibung
+word daß 2346
+
+# DARAUF (4.4 Zweiformige Kürzungen)
+always darauf 145-16
+
+# DARÜBER (4.4 Zweiformige Kürzungen)
+always darüber 145-1256
+always radarüber 1235-1-145-356-2-1256
+
+# DAVON (4.4 Zweiformige Kürzungen)
+always davon 145-1236
+
+# DAZU (4.4 Zweiformige Kürzungen)
+always dazu 145-1356
+begmidword dazubehal 145-1-2-1356-23-125-25
+always dazubleib 145-1-2-1356-12-12
+always dazuhab 145-1-2-1356-2-125
+begmidword dazuhal 145-1-2-1356-125-25
+begmidword dazulass 145-1-2-1356-2-123
+# HOMONYM
+begmidword dazulieg 145-1-2-1356-123-346-1245
+word dazumal 145-1-2-1356-134
+# HOMONYM
+begmidword dazusitz 145-1-2-1356-2-24
+# HOMONYM?
+always dazustehen 145-1-2-1356-23456-2356-14
+always pandazucht 1234-235-145-1-1356-136-1456-2345
+
+# DEM (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word dem 12356
+word dem's 12356-6-234
+always dementgegen 2-12356-14-2345-2-1245
+always dementsprechend 2-12356-14-2345-2-2346-14-145
+always demgegenüber 2-12356-1245-1256
+always demgemäß 2-12356-12346-134-345-2346
+always demjenig 2-12356-245-14-45
+always demnach 2-12356-1345-56
+always demnächst 2-12356-1345-23456
+always demselb 2-12356-234-13456-12
+always demzufolge 2-12356-2-1356-124-1245-15
+word ehedem 15-125-15-2-12356
+word alldem 1-12345-2-12356
+word seitdem 234-146-2345-2-12356
+word indem 35-2-12356
+word außerdem 16-2346-12456-2-12356
+word vordem 2-26-2-12356
+word zudem 2-1356-2-12356
+word trotzdem 2345-1356-2-12356
+
+# DEMOKRAT (4.4 Zweiformige Kürzungen)
+always demokrat 145-2345
+
+# DEN   (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word den 15
+word den's 15-6-234
+
+# DENEN (4.4 Zweiformige Kürzungen)
+word denen 15-14
+
+# DENN (4.4 Zweiformige Kürzungen)
+word denn 145-1345
+word dennschon 145-1345-156-135-1345
+
+# DER   (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word der 1235
+word der's 1235-6-234
+
+# DES   (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word des 3
+always des-dur 145-123456-36-145-136-1235
+
+# DESSEN (4.4 Zweiformige Kürzungen)
+always dessen 145-2346
+always abendessen 1-12-14-145-15-2346-14
+always landessend 123-235-145-123456-234-14-145
+always stewardessen 23456-15-2456-356-145-15-2346-14
+
+# DEUTSCH (4.4 Zweiformige Kürzungen)
+always deutsch 145-156
+
+# DIE   (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word die 346
+word die's 346-6-234
+
+# DIES (4.3.5 Einformige Kürzungen, nur mit Erweiterung)
+word dies 145-346-234
+sufword dies 346
+always diesig 145-346-234-45
+always diesseitig 145-346-234-234-146-2345-45
+always diesseits 145-346-234-234-146-2345-234
+always diesbezüglich 145-346-234-23-1356-1256-1245-456
+always diesel 145-346-234-13456
+always diesjährig 145-346-234-5-245-1235-45
+# Diese Schreibweise scheint's auch zu geben ...
+always diestelfink 145-346-23456-13456-124-35-13
+always diesterweg 145-346-23456-12456-2456-15-1245
+
+# DIR (4.4 Zweiformige Kürzungen)
+word dir 145-1235
+word dir's 145-1235-6-234
+
+# DOCH (4.4 Zweiformige Kürzungen)
+word doch 145-1456
+
+# DRUCK DRÜCK (4.4 Zweiformige Kürzungen)
+always druck 145-46
+always drück 5-145-46
+begmidword bildrück 12-24-123-145-1235-46
+begmidword goldrück 1245-135-123-145-1235-46
+begmidword landrück 123-235-145-1235-46
+begmidword handrück 125-145-1235-46
+always rundrücken 1235-256-145-1235-46-14
+midword zidrück 1356-24-145-1235-46
+
+# DURCH (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word durch 1456
+always durch-\s 2-1456-36-0
+word durch's 1456-6-234
+always durch 2-1456
+
+# DÜRF (4.3.6 Kommakürzungen)
+always dürf 2-145
+
+# EBENSO (4.4 Zweiformige Kürzungen)
+always ebenso 15-135
+always ebensolch 15-12-14-234-1456
+word eo 6-15-135
+begmidword lebensord 123-12-14-234-26-145
+begmidword nebensonn 1345-12-234-135-1345-1345
+
+# EH  (4.1 Lautgruppenkürzungen)
+midword eh 2356
+endword eh'n 2356-6-1345
+endword eh's 2356-6-234
+endword eh-\s 2356-36-0
+endword eh-,\s 2356-36-2-0
+midendword ehaar 15-125-1-1-1235
+midendword ehafen 15-125-1-124-14
+midendword ehäfen 15-125-345-124-14
+midendword ehalber 15-125-25-12-12456
+midendword ehalter 15-125-25-2345-12456
+midendword ehaltig 15-125-25-2345-45
+midendword ehaltung 15-125-25-2345-136
+midendword ehammer 15-125-1-1346-12456
+midendword ehämmer 15-125-345-1346-12456
+midendword ehand 15-125-145
+midword ehänd 15-5-125-145
+midendword ehaut 15-125-16-2345
+midword ehäut 15-125-34-2345
+endword ehäute 15-125-34-236
+midword ehebamm 15-125-15-12-1-1346
+midendword eheft 15-125-15-124-2345
+endword ehefte 15-125-15-124-236
+midword ehelf 15-125-13456-124
+midword ehemm 15-125-15-1346
+midendword eherd 15-125-12456-145
+midword steherdrüs 23456-2356-12456-145-1235-1256-234
+midword eherstell 15-125-12456-2-13456
+midendword ehilf 15-125-24-123-124
+midendword ehirt 15-125-24-1235-2345
+endword ehirte 15-125-24-1235-236
+midendword ehobel 15-125-135-12-13456
+midendword ehoch 15-125-135-1456
+midendword ehohl 15-125-135-125-123
+midendword ehöhl 15-125-246-125-123
+midendword eholz 15-125-135-123-1356
+midendword ehölz 15-125-246-123-1356
+midword ehospit 15-125-135-234-1234-24-2345
+midendword ehospiz 15-125-135-234-1234-24-1356
+midendword ehotel 15-125-135-2345-13456
+midendword ehund 15-125-256-145
+midendword ehunger 15-125-256-1245-12456
+midendword ehyd 15-125-6-13456-145
+midendword ehöchst 15-125-246-1456-23456
+endword ehöhe 15-125-246-125-15
+midendword ehöhen 15-125-246-125-14
+midword ehünd 15-125-1256-1345-145
+midword ehüt 15-125-1256-2345
+endword ehüte 15-125-1256-236
+before h begmidword bronce 12-1235-135-1345-6-14-15
+midendword dehaus 145-15-125-16-234
+always dehors 145-15-125-26-234
+midword dehäus 145-15-125-34-234
+before h begmidword gerade 12346-1235-1-145-15
+always radehack 1235-1-145-15-125-1-46
+before h begmidword bade 12-1-145-15
+before h begmidword lade 123-1-145-15
+before h begmidword jade 245-1-145-15
+before h begmidword schmiede 156-134-346-145-15
+before h begmidword siede 234-346-145-15
+always wiedehopf 2456-346-145-15-125-135-1234-124
+before h begmidword getreide 12346-2345-1235-146-145-15
+always tidehub 2345-24-145-15-125-136-12
+before h begmidword gemälde 12346-134-345-123-145-15
+before h begmidword stände 5-23456-15
+before h begmidword wende 2456-14-145-15
+before h always gemeinde 12346-134-1246-145-15
+before h begmidword gesinde 12346-234-145-15
+before h begmidword hunde 125-256-145-15
+before h begmidword freunde 124-145-15
+before h begmidword mode 134-135-145-15
+always rodehack 1235-135-145-15-125-1-46
+before h begmidword pferde 1234-124-12456-145-15
+begmidword sheeh 234-125-15-15-125
+always seehahn 234-15-15-125-1-125-1345
+begmidword seehähn 234-15-15-125-345-125-1345
+begmidword seehall 234-15-15-125-1-12345
+begmidword seehas 234-15-15-125-1-234
+always seehecht 234-15-15-125-15-1456-2345
+prfword seehechte 234-15-15-125-15-1456-236
+always seehei 234-15-15-125-146
+always seeheld 234-15-15-125-13456-145
+always seeherr 234-15-15-1235-1235
+always seeherrschaft 234-15-15-1235-1235-156-1-124-2345
+always seehimmel 234-15-15-125-24-1346-13456
+always seehügel 234-15-15-125-1256-1245-13456
+always teehaub 2345-15-15-125-16-12
+always teehaus 2345-15-15-125-16-234
+begmidword teehäus 2345-15-15-125-34-234
+before h begmidword trage 2345-1245-15
+before h begmidword wache 2456-56-15
+before h begmidword asche 1-156-15
+before h begword ehe 15-125-15
+before h begmidword mathe 134-1-2345-125-15
+before h begmidword goethe 1245-135-15-2345-125-15
+before h begmidword single 234-35-1245-123-15
+before h begmidword kohle 13-135-125-123-15
+before h begmidword vanille 1236-235-24-12345-15
+before h begmidword reklame 1235-15-13-123-1-134-15
+before h begmidword wärme 2456-345-1235-134-15
+before h begmidword sahne 234-1-125-1345-15
+before h begmidword schweine 156-2456-1246-15
+before h begmidword katrine 13-1-2345-1235-35-15
+before h begmidword inne 35-1345-15
+always hinnehm 125-35-1345-125
+prfword stonehenge 23456-135-1345-15-125-14-12346
+always stoneheng 23456-135-1345-15-125-14-1245
+always vorneher 2-26-1345-15-125-12456
+before h begmidword aloe 25-135-15
+always benzoeharz 12-14-1356-135-15-125-356-1356
+always rehaklinik 1235-15-125-1-13-123-35-24-13
+begmidword rehazentr 1235-15-125-1-1356-14-2345-1235
+always sharehold 234-125-356-15-125-135-123-145
+always warehaus 2456-356-15-125-16-234
+begmidword warehäus 2456-356-15-125-34-234
+before h begmidword säure 234-34-1235-15
+before h begmidword käse 13-345-234-15
+always nasehorn 1345-1-234-15-125-26-1345
+always nasehörn 1345-1-234-15-125-246-1235-1345
+before h begmidword speise 234-1234-146-234-15
+before h begmidword gänse 1245-345-1345-234-15
+before h begmidword löse 123-246-234-15
+before h begmidword messe 134-15-2346-15
+begmidword lausehark 123-16-234-15-125-356-13
+before h begmidword gemüse 12346-134-1256-234-15
+before h begmidword watte 2456-1-2345-236
+before h begmidword gewichte 12346-2456-3456-236
+before h begmidword brave 12-1235-1-1236-15
+before h begmidword bronze 12-1235-135-1345-1356-15
+begword itzeho 24-2345-1356-15-125-135
+
+# EI  (4.1 Lautgruppenkürzungen)
+word ei 6-146
+always ei 146
+midendword eideal 15-24-145-15-1-123
+midendword eidee 15-24-145-15-15
+begmidword schneideein 156-1345-146-145-15-1246
+midendword eidentifi 15-24-145-14-2345-24-124-24
+midendword eidentisch 15-24-145-14-2345-24-156
+midendword eidentität 15-24-145-14-2345-5-345
+midendword eideo 15-24-145-15-135
+midendword eidyll 15-24-145-6-13456-12345
+midword eignor 15-45-1345-26
+midword eikon 15-24-13-135-1345
+always reederei 1235-15-15-145-12456-146
+always fischerei 124-24-156-12456-146
+always molkerei 134-135-123-13-12456-146
+always polizei 1234-135-123-24-1356-146
+begmidword freikon 124-1235-146-13-135-1345
+midword eille 15-24-12345-15
+midword eilleus 15-24-12345-126-234
+begmidword marseill 134-356-234-15-24-12345
+midword eilloy 15-24-12345-135-6-13456
+midword eillu 15-24-12345-136
+midword eimag 15-24-134-1-1245
+midendword eimbiss 15-24-134-12-24-2346
+midword eimit 15-24-134-24-2345
+always arzneimittel 356-1356-1345-146-134-2345
+midword eimitgl 146-2-2345-1245-123
+midword eimitt 146-134-24-2345-2345
+midendword eimker 15-24-134-13-12456
+midendword eimm 15-24-1346
+midendword eimp 15-24-134-1234
+always reimpaar 1235-146-134-1234-1-1-1235
+midendword eion 15-24-135-1345
+midendword eirr 15-24-1235-1235
+before s begmidword eis 146-234
+midword eisolat 15-24-234-135-123-1-2345
+midendword eisolier 15-24-234-135-123-346-1235
+midendword eiteration 15-24-2345-12456-1-2345-245
+midendword eiterier 15-24-2345-12456-346-1235
+always beinhalt 23-35-125-25-2345
+prfword beinhalte 23-35-125-25-236
+prfword beinhaltest 23-35-125-25-236-23456
+prfword beinhaltet 23-35-125-25-236-2345
+prfword beinhaltete 23-35-125-25-236-236
+prfword beinhaltetem 23-35-125-25-236-2345-12356
+prfword beinhalteten 23-35-125-25-236-2345-14
+prfword beinhaltetes 23-35-125-25-236-2345-123456
+prfword beinhalteter 23-35-125-25-236-2345-12456
+prfword beinhaltetet 23-35-125-25-236-236-2345
+prfword beinhaltetest 23-35-125-25-236-236-23456
+word dei 145-15-24
+always deifikation 145-15-24-124-24-13-5-1345
+always deindividuation 145-15-35-145-24-1236-24-145-136-5-1345
+always deismus 145-15-5-24
+always deist 145-15-24-23456
+always deistisch 145-15-5-156
+always badeinsel 12-1-145-15-35-234-13456
+sufword fidei 124-24-145-15-24
+always codein 6-14-135-145-15-35
+always kodein 13-135-145-15-35
+midendword eeinsel 15-15-35-234-13456
+always seeigel 234-15-15-45-13456
+midendword seeisch 234-15-15-24-156
+always sightseeing 234-24-1245-125-2345-234-15-15-35-1245
+always coffein 6-14-135-124-124-15-35
+always koffein 13-135-124-124-15-35
+midendword geinhalt 12346-35-125-25-2345
+endword geinhalte 12346-35-125-25-236
+always diagnose 145-24-1-1245-1345-135-234-15
+always diagnosen 145-24-1-1245-1345-135-234-14
+always heim 125-146-134
+begword eheinstitu 15-125-15-35-23456-24-2345-136
+midword eheinstitu 2356-15-35-23456-24-2345-136
+always geheim 12346-125-146-134
+always theismus 2345-125-15-5-24
+always theist 2345-125-15-24-23456
+always theistisch 2345-125-15-5-156
+always prometheisch 1234-1235-135-134-15-2345-125-15-24-156
+always keim 13-146-134
+before i begmidword kohle 13-135-125-123-15
+always leim 123-146-134
+always galilei 1245-25-24-123-15-24
+always nuklein 1345-136-13-123-15-35
+always acrolein 1-6-14-1235-135-123-15-24-1345
+always akrolein 1-13-1235-135-123-15-35
+before i begmidword wärme 2456-345-1235-134-15
+midendword aneität 235-15-5-345
+always äneis 345-1345-15-24-234
+always aeneis 1-15-1345-15-24-234
+sufword alineier 25-35-15-346-1235
+always guineisch 1245-136-35-15-24-156
+always boeing 12-135-15-35-1245
+always nereid 1345-12456-15-24-145
+always barriereinsel 12-356-1235-24-12456-15-35-234-13456
+always kreier 13-1235-15-346-1235
+always pythagoreisch 1234-6-13456-2345-125-1-1245-26-15-24-156
+always epikureisch 15-1234-24-13-136-1235-15-24-156
+always eritreisch 12456-24-2345-1235-15-24-156
+always kureismus 13-136-1235-15-5-24
+always kasein 13-1-234-15-35
+before i begmidword kälte 13-345-123-236
+sufword protein 12345-236-35
+midendword protein 1234-1235-135-236-35
+always weight 2456-15-24-1245-125-2345
+always schweineigel 156-2456-1246-15-45-13456
+
+# EIN (4.1 Lautgruppenkürzungen)
+always ein 1246
+midendword eindex 15-35-145-15-6-1346
+midword eindik 15-35-145-24-13
+midendword eindio 15-35-145-24-135
+midendword eindiz 15-35-145-24-1356
+midword einduk 15-35-145-136-13
+midword eindust 15-35-145-136-23456
+midendword einduzier 15-35-145-136-1356-346-1235
+midword eineff 15-35-15-124-124
+midendword einfant 15-35-124-235-2345
+midword einfark 15-35-124-356-13
+midendword einfekt 15-35-124-15-13-2345
+midendword einfektion 15-35-124-15-13-2345-245
+midword einfer 15-35-124-12456
+midword einfilt 15-35-124-24-123-2345
+midendword einfinit 15-35-124-35-24-2345
+midword einfiz 15-35-124-24-1356
+midword einflat 15-35-124-123-1-2345
+midendword einfo 15-35-124-135
+midword einform 15-35-124-26-134
+midendword einfusion 15-35-124-136-234-245
+midendword eingenieur 15-35-1245-14-24-126-1235
+midword einhab 15-35-2-125
+midword einhala 15-35-125-25-1
+midendword einhalier 15-35-125-25-123-346-1235
+midword einhomo 15-35-125-135-134-135
+endword einhuman 15-35-125-136-134-1-1345
+midword einhuman 15-35-125-136-134-235
+midword einhär 15-35-125-345-1235
+midword einit 15-35-24-2345
+midword einj 15-35-245
+begmidword feinj 124-1246-245
+midword einkarn 15-35-13-356-1345
+midendword einkasso 15-35-13-1-2346-135
+midword einklu 15-35-13-123-136
+midword einkomp 15-35-13-135-134-1234
+midword einkon 15-35-13-135-1345
+midword einkonnt 1246-13-2345
+midword einkub 15-35-13-136-12
+midendword einland 15-35-123-235-145
+midendword einnen 15-35-1345-14
+midendword einner 15-35-1345-12456
+begmidword feinnerv 124-1246-1345-12456-1236
+midword einnov 15-35-1345-135-1236
+midendword einnung 15-35-1345-136
+midendword einput 15-35-1234-136-2345
+midendword einschrift 15-35-156-2345
+midendword einsekt 15-35-234-15-13-2345
+midendword einserat 15-35-234-12456-1-2345
+midendword einserent 15-35-234-12456-14-2345
+midendword einserier 15-35-234-12456-346-1235
+midendword einsert 15-35-234-12456-2345
+midendword einsider 15-35-234-24-145-12456
+midword einsign 15-35-234-45-1345
+midword einsist 15-35-234-24-23456
+midword einsolv 15-35-234-135-123-1236
+midword einspekt 15-35-234-1234-15-13-2345
+midword einspir 15-35-234-1234-24-1235
+midword einspiz 15-35-234-1234-24-1356
+midendword einstabil 15-35-23456-1-12-24-123
+midendword einstall 15-35-23456-1-12345
+midendword einstanz 15-35-23456-235-1356
+midendword einstinkt 15-35-23456-35-13-2345
+midword einstit 15-35-23456-24-2345
+midword einstrum 15-35-23456-1235-136-134
+always feinstrumpf 124-1246-23456-1235-136-134-1234-124
+midword einsul 15-35-234-136-123
+midword einszen 15-35-234-1356-14
+midword eintegr 15-35-236-1245-1235
+midword eintell 15-35-236-12345
+midword eintend 15-35-2345-14-145
+midword eintens 15-35-2345-14-234
+midword eintent 15-35-2345-14-2345
+midendword einter 15-35-2345-12456
+word vereinter 36-1246-2345-12456
+endword vereinter 1236-12456-1246-2345-12456
+word vermeinter 36-134-1246-2345-12456
+endword vermeinter 1236-12456-134-1246-2345-12456
+word verneinter 36-1345-1246-2345-12456
+endword verneinter 1236-12456-1345-1246-2345-12456
+midendword einteress 15-2-35
+midword eintol 15-35-2345-135-123
+midword eintra 15-35-2345-1235-1
+endword eintraust 1246-2345-1235-16-23456
+endword eintraute 1246-2345-1235-16-236
+midendword eintraut 1246-2345-1235-16-2345
+always eintracht 1246-2345-1235-56-2345
+always eintraf 1246-2345-1235-1-124
+always eintrag 1246-2345-1245
+always eintrat 1246-2345-1235-1-2345
+always eintratest 1246-2345-1235-1-236-23456
+always eintratet 1246-2345-1235-1-236-2345
+midword eintrig 15-35-2345-1235-45
+midendword eintro 15-35-2345-1235-135
+always eintrock 1246-2345-1235-135-46
+always eintromm 1246-2345-1235-135-1346
+always eintropf 1246-2345-1235-135-1234-124
+midword eintui 15-35-2345-136-24
+midendword einvalid 15-35-1236-25-24-145
+midendword einvasion 15-35-1236-1-234-245
+midendword einvent 15-35-1236-14-2345
+midendword einvert 15-35-1236-12456-2345
+midendword einvest 15-35-1236-15-23456
+always geeinter 12346-1246-2345-12456
+always feinver 124-1246-1236-12456
+always schein 156-1246
+always rhein 1235-125-1246
+always scheinver 156-1246-1236-12456
+always klein 13-123-1246
+always alleinver 1-1246-1236-12456
+always allgemein 1-12345-12346-134-1246
+always gemein 12346-134-1246
+always khomeini 13-125-135-134-15-35-24
+midendword vermein 1236-12456-134-1246
+midendword vernein 1236-12456-1345-1246
+always speinuss 234-1234-146-1345-136-2346
+begmidword speinüss 234-1234-146-1345-1256-2346
+always reinform 1235-1246-124-26-134
+always reinschrift 1235-1246-156-2345
+always freinahm 124-1235-146-1345-134
+always freinehm 124-1235-146-1345-125
+midendword vereinter 1236-12456-1246-2345-12456
+always datein 145-1-2345-146-1345
+always latein 123-1-2345-1246
+before i begmidword geräte 12346-1235-345-236
+always geräteinheit 12346-1235-345-2345-1246-125
+always partei 1234-356-2345-146
+always stein 23456-1246
+always wein 2456-1246
+
+# EINANDER (4.3.6 Kommakürzungen)
+always einander 2-1246
+
+# EL  (4.1 Lautgruppenkürzungen)
+word el 15-123
+always el 13456
+word elen 15-123-14
+always eel 15-15-123
+midendword eeland 15-15-123-235-145
+midendword eeländ 15-15-123-345-1345-145
+begmidword seelebewes 234-15-15-123-12-15-2456-123456
+always eelili 15-15-123-24-123-24
+always eelini 15-15-123-35-24
+always ell 15-12345
+# Alte Rechtschreibung
+begmidword helleuch 125-13456-123-126-1456
+always eell 15-15-12345
+always abaelard 1-12-1-15-123-356-145
+before l begmidword lebe 123-12-15
+always spacelab 234-1234-1-6-14-15-123-1-12
+always graceland 1245-1235-1-6-14-15-123-235-145
+always facelift 124-1-6-14-15-123-24-124-2345
+before l begmidword service 234-12456-1236-24-6-14-15
+before l begmidword bade 12-1-145-15
+always erbadel 12456-12-1-145-13456
+always stachel 23456-56-13456
+always speichel 234-1234-146-1456-13456
+always geradeleg 12346-1235-1-145-15-123-15-1245
+endword delokal 145-15-123-135-13-1-123
+begmidword delokal 145-15-123-135-13-25
+before l begmidword rede 1235-15-145-15
+before l begmidword schneide 156-1345-146-145-15
+before l begmidword glasschneide 1245-123-1-234-156-1345-146-145-15
+before l begmidword kreide 13-1235-146-145-15
+before l begmidword melde 134-13456-145-15
+before l always lande 123-235-145-15
+before l begmidword gelände 12346-123-345-1345-145-15
+before l always gemeinde 12346-134-1246-145-15
+before l always hunde 125-256-145-15
+always nadel 1345-1-145-13456
+always badelaken 12-1-145-15-123-1-13-14
+always badelatschen 12-1-145-15-123-1-2345-156-14
+begmidword brigadeleit 12-1235-45-1-145-15-123-146-2345
+always schädel 156-345-145-13456
+begmidword ladelini 123-1-145-15-123-35-24
+begmidword ladelist 123-1-145-15-123-24-23456
+before l begmidword tadel 2345-1-145-13456
+always zitadell 1356-24-2345-1-145-15-12345
+always mortadell 134-26-2345-1-145-15-12345
+always ladeluft 123-1-145-15-123-136-124-2345
+always ladeluk 123-1-145-15-123-136-13
+always schmiedelehr 156-134-346-145-15-123-2356-1235
+prfword edelleute 15-145-13456-123-126-236
+always edelleuten 15-145-13456-123-126-2345-14
+begmidword edellupin 15-145-13456-123-136-1234-35
+always heideland 125-146-145-15-123-235-145
+begmidword heidelerch 125-146-145-15-123-12456-1456
+begmidword heidelind 125-146-145-15-123-35-145
+before l begmidword scheide 156-146-145-15
+begmidword schneideleist 156-1345-146-145-15-123-146-23456
+begmidword schneideline 156-1345-146-145-15-123-35-15
+begmidword schneidelini 156-1345-146-145-15-123-35-24
+always treidell 2345-1235-146-145-13456-123
+before l begmidword getreide 12346-2345-1235-146-145-15
+always getreidelt 12346-2345-1235-146-145-13456-2345
+prfword getreidelte 12346-2345-1235-146-145-13456-236
+always weideland 2456-146-145-15-123-235-145
+always weideländ 2456-146-145-15-123-345-1345-145
+always kandelaber 13-235-145-15-13456-1-12-12456
+always pendel 1234-14-145-13456
+always abendelang 1-12-14-145-15-123-1245
+always jahrtausendelang 245-2345-15-123-1245
+begmidword sendeleist 234-14-145-15-123-146-23456
+begmidword sendeleit 234-14-145-15-123-146-2345
+begmidword sendeliz 234-14-145-15-123-24-1356
+always spindel 234-1234-35-145-13456
+always bindelader 12-35-145-15-123-1-145-12456
+always gewindelehr 12346-2456-35-145-15-123-2356-1235
+always gewindeloch 12346-2456-35-145-15-123-135-1456
+always gewindelöch 12346-2456-35-145-15-123-246-1456
+always hundeleb 125-256-145-15-123-12
+always hundelein 125-256-145-15-123-1246
+always kundelehrer 13-256-145-15-123-2356-1235-12456
+always grundeleg 1245-145-15-123-15-1245
+prfword grundelege 1245-145-15-123-15-12346
+always grundelieg 1245-145-15-123-346-1245
+prfword grundeliege 1245-145-15-123-346-12346
+always codelist 6-14-135-145-15-123-24-23456
+always jodel 245-135-145-13456
+always modeladen 134-135-145-15-123-1-145-14
+always modeläden 134-135-145-15-123-345-145-14
+begmidword modelaun 134-135-145-15-123-16-1345
+prfword modelinie 134-135-145-15-123-35-24-15
+always modelinien 134-135-145-15-123-35-24-14
+always rodeland 1235-135-145-15-123-235-145
+always trödel 2345-1235-246-145-13456
+always pferdeläng 1234-124-12456-145-15-5-123-1245
+always pferdeleib 1234-124-12456-145-15-123-146-12
+prfword pferdeleine 1234-124-12456-145-15-123-1246-15
+always pferdeleinen 1234-124-12456-145-15-123-1246-14
+always pferdelieb 1234-124-12456-145-15-123-346-12
+always pferdelotto 1234-124-12456-145-15-123-135-2345-2345-135
+before l begmidword förde 124-246-1235-145-15
+always bürdelast 12-1256-1235-145-15-123-1-23456
+always würdelos 1256-15-123-135-234
+before l begmidword nudel 1345-136-145-13456
+always strudel 23456-1235-136-145-13456
+always freudeleer 124-1235-126-145-15-123-15-15-1235
+always freudelos 124-1235-126-145-15-123-135-234
+begmidword gebäudeleit 12346-12-34-145-15-123-146-2345
+midendword eelicht 15-15-456-2345
+begmidword werbeelemen 2456-12456-23-13456-12356-14
+begmidword ladeelektr 123-1-145-15-13456-15-13-2345-1235
+begmidword codeelemen 6-14-135-145-15-13456-12356-14
+always hundeelend 125-256-145-15-13456-14-145
+begmidword kohleelektr 13-135-125-123-15-13456-15-13-2345-1235
+begmidword masseelektr 134-1-2346-15-13456-15-13-2345-1235
+begmidword werteelektr 2456-12456-236-13456-15-13-2345-1235
+always tafelland 2345-1-124-13456-123-235-145
+always tafelleim 2345-1-124-13456-123-146-134
+always tafelleinen 2345-1-124-13456-123-1246-14
+begmidword tafelleuch 2345-1-124-13456-123-126-1456
+begmidword tafelländ 2345-1-124-13456-123-345-1345-145
+always schwefel 156-2456-15-124-13456
+always stiefel 23456-346-124-13456
+always staffel 23456-1-124-124-13456
+always trüffel 2345-1235-1256-124-124-13456
+always zweifellos 1356-2456-146-124-13456-123-135-234
+begmidword hilfelehr 125-24-123-124-15-123-2356-1235
+begmidword hilfeleist 125-24-123-124-15-123-146-23456
+begmidword hilfeliefer 125-24-123-124-15-123-346-124-12456
+always gipfel 1245-24-1234-124-13456
+always schaufel 156-16-124-13456
+always hufeland 125-136-124-15-123-235-145
+always hufeländ 125-136-124-15-123-345-1345-145
+always legeleist 123-15-12346-123-146-23456
+before l begmidword vorlege 2-26-123-15-12346
+before l begmidword wege 2456-1245-15
+before l begmidword steige 23456-146-12346
+begmidword naheleg 1345-1-125-15-123-15-1245
+prfword nahelege 1345-1-125-15-123-15-12346
+begmidword nahelieg 1345-1-125-15-123-346-1245
+prfword naheliege 1345-1-125-15-123-346-12346
+always rachelust 1235-56-15-123-136-23456
+begmidword rachelüst 1235-56-15-123-1256-23456
+always knöchel 13-1345-246-1456-13456
+always aschelump 1-156-15-123-136-134-1234
+always schellack 156-13456-123-1-46
+begmidword wäschelein 2456-345-156-15-123-1246
+sufword eheleb 15-125-15-123-12
+midword eheleb 2356-15-123-12
+sufword eheleiblich 15-125-15-123-146-12-456
+midendword eheleiblich 2356-15-123-146-12-456
+word eheleute 15-125-15-123-126-236
+midendword eheleute 2356-15-123-126-236
+word eheleuten 15-125-15-123-126-2345-14
+midendword eheleuten 2356-15-123-126-2345-14
+sufword ehelich 15-125-15-456
+midendword ehelich 2356-15-456
+sufword ehelos 15-125-15-123-135-234
+midendword ehelos 2356-15-123-135-234
+always weihelied 2456-146-125-15-123-346-145
+always hohelied 125-135-125-15-123-346-145
+begmidword mathelehr 134-1-2345-125-15-123-2356-1235
+before l begmidword goethe 1245-135-15-2345-125-15
+always mühelos 134-1256-125-15-123-135-234
+before l begmidword ruhe 1235-136-125-15
+always jelieber 245-15-123-346-12-12456
+always jelänger 245-15-5-123-1245-12456
+before l begmidword lake 123-1-13-15
+always makellos 134-1-13-13456-123-135-234
+always fackel 124-1-46-13456
+always sockel 234-135-46-13456
+always spikeloch 234-1234-24-13-15-123-135-1456
+always spikelöch 234-1234-24-13-15-123-246-1456
+begmidword getränkelad 12346-2345-1235-345-1345-13-15-123-1-145
+always bänkellied 12-345-1345-13-13456-123-346-145
+before l begmidword geschenke 12346-156-14-13-15
+always schenkel 156-14-13-13456
+always dunkel 145-256-13-13456
+always schnörkel 156-1345-246-1235-13-13456
+always muskel 134-136-234-13-13456
+always pökel 1234-246-13-13456
+begmidword ensembleleist 14-234-12356-12-123-15-123-146-23456
+always candlelight 6-14-235-145-123-15-123-24-1245-125-2345
+before l begmidword kohle 13-135-125-123-15
+always teilelager 2345-146-123-15-123-1-1245-12456
+begmidword teilelist 2345-146-123-15-123-24-23456
+always emaillelack 12356-1-24-12345-15-123-1-46
+before l begmidword koschenille 13-135-156-14-24-12345-15
+before l begmidword reklame 1235-15-13-123-1-134-15
+always memelland 134-12356-13456-123-235-145
+always memelländ 134-12356-13456-123-345-1345-145
+always nahmelager 1345-134-15-123-1-1245-12456
+always nahmelamp 1345-134-15-123-1-134-1234
+always nahmeland 1345-134-15-123-235-145
+always nahmelauf 1345-134-15-123-16-124
+always nahmeleit 1345-134-15-123-146-2345
+always nahmelicht 1345-134-15-456-2345
+always nahmelini 1345-134-15-123-35-24
+always nahmelist 1345-134-15-123-24-23456
+always nahmeländ 1345-134-15-123-345-1345-145
+always nahmeläuf 1345-134-15-123-34-124
+always sammel 234-1-1346-13456
+always homeland 125-135-134-15-123-235-145
+always armeleute 356-134-15-123-126-236
+before l begmidword ärmel 345-1235-134-13456
+begmidword wärmelehr 2456-345-1235-134-15-123-2356-1235
+begmidword wärmeleist 2456-345-1235-134-15-123-146-23456
+begmidword wärmeleit 2456-345-1235-134-15-123-146-2345
+before l begmidword quarantäne 6-12345-136-356-235-2345-345-1345-15
+before l begmidword szene 234-1356-14-15
+before l begmidword sahne 234-1-125-1345-15
+before l begmidword saigne 234-1-24-1245-1345-15
+always schweinelend 156-2456-1246-15-123-14-145
+before l begmidword marine 134-356-35-15
+always annelies 235-1345-15-123-346-234
+begmidword annelieschen 235-1345-15-123-346-234-1456-14
+always minnelied 134-35-1345-15-123-346-145
+always tunnel 2345-256-1345-13456
+begmidword hannelor 125-235-1345-15-123-26
+begmidword marnelini 134-356-1345-15-123-35-24
+always stapel 23456-1-1234-13456
+begmidword pipelin 1234-24-1234-15-123-35
+always ampel 1-134-1234-13456
+always doppel 145-135-1234-1234-13456
+always stoppel 23456-135-1234-1234-13456
+always skrupel 234-13-1235-136-1234-13456
+before l begmidword software 234-135-124-2345-2456-356-15
+before l begmidword timbre 2345-24-134-12-1235-15
+before l begmidword karriere 13-356-1235-24-12456-15
+always schwerelos 156-2456-12456-15-123-135-234
+always jahrelang 245-1235-15-123-1245
+always ireland 24-1235-15-123-235-145
+always wireless 2456-24-1235-15-123-15-2346
+begmidword irrelei 24-1235-1235-15-123-146
+begmidword säurelös 234-34-1235-15-123-246-234
+before l begmidword türe 2345-1256-1235-15
+before l begmidword venture 1236-14-2345-136-1235-15
+before l begmidword basel 12-1-234-13456
+before l begmidword striptease 23456-1235-24-1234-2345-15-1-234-15
+always faseleber 124-1-234-13456-15-12-12456
+always naselang 1345-1-234-15-123-1245
+begmidword naseläng 1345-1-234-15-5-123-1245
+always leselamp 123-123456-15-123-1-134-1234
+always leselist 123-123456-15-123-24-23456
+always diesellok 145-346-234-13456-123-135-13
+always kiesel 13-346-234-13456
+begmidword leselup 123-123456-15-123-136-1234
+always leselämp 123-123456-15-123-345-134-1234
+before l begmidword wechsel 2456-15-1456-234-13456
+always chaiselong 1456-1-24-234-15-123-135-1345-1245
+before l begmidword speise 234-1234-146-234-15
+before l begmidword reise 1235-146-234-15
+before l begmidword gänse 1245-345-1345-234-15
+before l begmidword insel 35-234-13456
+before l begmidword narkose 1345-356-13-135-234-15
+always mosel 134-135-234-13456
+before l begmidword presse 1234-1235-15-2346-15
+begmidword masseleist 134-1-2346-15-123-146-23456
+always masselos 134-1-2346-15-123-135-234
+begmidword masseleit 134-1-2346-15-123-146-2345
+begmidword messeleit 134-15-2346-15-123-146-2345
+always rosselenker 1235-135-2346-15-123-14-13-12456
+before l begmidword fessel 124-15-2346-13456
+before l begmidword interesse 2-35-15
+before l begmidword sessel 234-15-2346-13456
+always rätsel 1235-345-2345-234-13456
+always brauselimo 12-1235-16-234-15-123-24-134-135
+always mauseloch 134-16-234-15-123-135-1456
+begmidword mauselöch 134-16-234-15-123-246-1456
+always kräusel 13-1235-34-234-13456
+always käselaib 13-345-234-15-123-1-24-12
+before l begmidword gemüse 12346-134-1256-234-15
+before l begmidword analyse 235-25-6-13456-234-15
+before l begmidword gäste 1245-345-23456-15
+begmidword gutelaun 1245-136-236-123-16-1345
+before l begmidword jahrhunderte 245-125-15
+before l begmidword pleuel 1234-123-126-13456
+always reuelos 1235-126-15-123-135-234
+always cleveland 6-14-123-15-1236-15-123-235-145
+always havelland 125-1-1236-13456-123-235-145
+begmidword havelländ 125-1-1236-13456-123-345-1345-145
+always shavelotion 234-125-1-1236-15-123-135-2345-245
+before l begmidword reserve 1235-123456-12456-1236-15
+always eyeliner 15-6-13456-15-123-35-12456
+before l begmidword einzel 1246-1356-13456
+always einzeller 1246-1356-15-12345-12456
+always einzellig 1246-1356-15-12345-45
+before l begmidword bronze 12-1235-135-1345-1356-15
+always herzeleid 125-12456-1356-15-123-146-145
+before l begmidword wurzel 2456-136-1235-1356-13456
+before l begmidword kürzel 5-13-1356-13456
+
+# EM  (4.1 Lautgruppenkürzungen)
+word em 15-134
+always em 12356
+always emm 15-1346
+after e midendword machen 134-56-14
+after e midendword macher 134-56-12456
+after e midendword mädchen 134-345-145-1456-14
+after e midendword magazin 134-1-1245-1-1356-35
+after e endword magnete 134-1-1245-1345-15-236
+after e midendword magnet 134-1-1245-1345-15-2345
+after e midword mähdresch 134-345-125-145-1235-15-156
+after e endword mähne 134-345-125-1345-15
+after e midendword mähnen 134-345-125-1345-14
+after e midendword manager 134-235-1-1245-12456
+after e midendword mangel 134-235-1245-13456
+after e midendword mängel 134-345-1345-1245-13456
+after e midendword manier 134-235-346-1235
+after e midword manipul 134-235-24-1234-136-123
+midendword emann 15-134-1345
+midendword emänn 15-5-134-1345
+after e midendword mantel 134-235-2345-13456
+after e midendword mäntel 134-345-1345-2345-13456
+after e midendword manöver 134-235-246-1236-12456
+after e endword mappe 134-1-1234-1234-15
+after e midendword mappen 134-1-1234-1234-14
+after e midendword marie 134-356-346
+after e midendword marien 134-356-24-14
+after e midendword mark 134-356-13
+after e midword märk 134-345-1235-13
+after e midendword marsch 134-356-156
+after e midword märsch 134-345-1235-156
+after e midword maschin 134-156
+after e midendword maserung 134-1-234-12456-136
+after e endword maske 134-1-234-13-15
+after e midendword masken 134-1-234-13-14
+after e midendword maskottchen 134-1-234-13-135-2345-2345-1456-14
+after e midendword maß 134-1-2346
+after e endword masse 134-1-2346-15
+after e midendword massen 134-1-2346-14
+after e midendword mäßig 134-345-2346-45
+after e midendword mast 134-1-23456
+after e midword mäst 134-345-23456
+after e midendword material 134-123
+after e midendword matrix 134-1-2345-1235-24-6-1346
+after e midendword matriz 134-1-2345-1235-24-1356
+after e endword matte 134-1-2345-236
+after e midendword matten 134-1-2345-2345-14
+after e midendword mauer 134-16-12456
+after e midendword mäuer 134-34-12456
+after e midendword mechanismen 134-15-1456-235-24-234-134-14
+after e midendword mechanismus 134-15-1456-235-5-24
+after e midword medaill 134-15-145-1-24-12345
+after e midendword medizin 134-15-145-24-1356-35
+after e midendword mehl 134-2356-123
+after e midendword meister 134-146-23456-12456
+after e midendword melder 134-13456-145-12456
+after e midendword meldung 134-13456-145-136
+after e midendword melken 134-13456-13-14
+after e midendword melker 134-13456-13-12456
+after e midendword melodie 134-13456-135-145-346
+after e midendword melodien 134-13456-135-145-24-14
+after e midendword merkmal 134-12456-13-134
+after e midendword messer 134-15-2346-12456
+after e midendword messung 134-15-2346-136
+after e midword method 134-15-2345-125-135-145
+after e endword metzg 134-15-2345-1356-1245
+after e midword metzg 134-15-2345-1356-1245
+after e midendword mikro 134-24-13-1235-135
+after e midendword minister 134-35-24-23456-12456
+after e endword minute 134-35-136-236
+after e midendword minuten 134-35-136-2345-14
+after e midendword mischung 134-24-156-136
+after e midendword mitarbeit 2-2345-356-12
+after e midendword mitteil 2-2345-2345-146-123
+after e midendword mittel 134-2345
+after e midendword modell 134-135-145-15-12345
+after e endword modi 134-135-145-24
+after e midword modifi 134-135-145-24-124-24
+after e midendword modul 134-135-145-136-123
+after e midendword modus 134-135-145-136-234
+after e midendword möglich 134-456
+after e midendword moment 134-135-134-14-2345
+after e endword momente 134-135-134-14-236
+after e midendword monat 134-135-1345-1-2345
+after e endword monate 134-135-1345-1-236
+after e midendword moor 134-135-135-1235
+after e endword mord 134-26-145
+after e midendword mords 134-26-145-234
+after e midendword mörder 134-246-1235-145-12456
+after e midendword mörtel 134-246-1235-2345-13456
+after e midendword motiv 134-135-2345-24-1236
+after e endword motor 134-135-2345-135-1235
+after e midword motor 134-135-2345-26
+after e endword motte 134-135-2345-236
+after e midendword motten 134-135-2345-2345-14
+after e midendword motto 134-135-2345-2345-135
+after e midendword müd 134-1256-145
+after e midendword muffel 134-136-124-124-13456
+after e midendword mühl 134-1256-125-123
+after e midendword mund 134-256-145
+after e midword münd 134-1256-1345-145
+after e endword münz 134-1256-1345-1356
+after e midword münz 134-1256-1345-1356
+after e midendword museen 134-136-234-15-14
+after e midendword museum 134-136-234-15-136-134
+after e midendword musik 134-13
+after e midendword muskel 134-136-234-13-13456
+after e midendword muster 134-136-23456-12456
+after e midendword mutter 134-136-2345-2345-12456
+after e midendword mütter 134-1256-2345-2345-12456
+after e endword mütze 134-1256-2345-1356-15
+after e midendword mützen 134-1256-2345-1356-14
+# In der Not ...
+midendword emachen 15-134-56-14
+midendword emacher 15-134-56-12456
+midendword emacht 15-134-56-2345
+endword emachte 15-134-56-236
+always emacho 15-134-1-1456-135
+always emaschin 15-134-156
+before m begmidword reggae 1235-15-1245-1245-1-15
+always anaemia 235-1-15-134-24-1
+before m begmidword werbe 2456-12456-23
+before m begmidword geschiebe 12346-156-346-23
+always lebemann 123-12-15-134-1345
+begmidword lebemänn 123-12-15-5-134-1345
+begmidword klebemod 13-123-15-23-134-135-145
+before m begmidword peace 1234-15-1-6-14-15
+always pacemaker 1234-1-6-14-15-134-1-13-12456
+before m begmidword service 234-12456-1236-24-6-14-15
+before m always renaissance 1235-14-1-24-2346-235-6-14-15
+before m begmidword schmiede 156-134-346-145-15
+before m begmidword rede 1235-15-145-15
+always redempt 1235-15-145-12356-1234-2345
+begmidword modemasch 134-135-145-15-134-1-156
+always modemensch 134-135-145-15-134-14-156
+before m begmidword streiche 23456-1235-146-1456-15
+prfword streichem 23456-1235-146-1456-12356
+sufword dematerial 145-15-134-123
+midword demoorganis 145-12356-135-26-1245-235-24-234
+before m begmidword bade 12-1-145-15
+before m begmidword jade 245-1-145-15
+before m always lade 123-1-145-15
+before m begmidword selfmade 234-13456-124-134-1-145-15
+begmidword rademach 1235-1-145-15-134-56
+before m begmidword parade 1234-356-1-145-15
+before m begmidword gerade 12346-1235-1-145-15
+prfword geradem 12346-1235-1-145-12356
+before m begmidword rede 1235-15-145-15
+always vademecum 1236-1-145-15-134-15-6-14-136-134
+endword demenge 145-15-134-14-12346
+midendword demengen 145-15-134-14-1245-14
+before m begmidword heide 125-146-145-15
+before m begmidword scheide 156-146-145-15
+before m begmidword schneide 156-1345-146-145-15
+before m begmidword kreide 13-1235-146-145-15
+before m begmidword getreide 12346-2345-1235-146-145-15
+before m begmidword weide 2456-146-145-15
+always tidemittel 2345-24-145-15-134-2345
+before m begmidword gilde 1245-24-123-145-15
+before m begmidword lande 123-235-145-15
+before m begmidword gelände 12346-123-345-1345-145-15
+before m begmidword sende 234-14-145-15
+prfword sendem 234-14-145-12356
+before m begmidword wende 2456-14-145-15
+before m begmidword binde 12-35-145-15
+before m begmidword gemeinde 12346-134-1246-145-15
+always hindemith 125-35-145-15-134-24-2345-125
+before m begmidword gesinde 12346-234-145-15
+before m begmidword hunde 125-256-145-15
+before m begmidword kunde 13-256-145-15
+always modemach 134-135-145-15-134-56
+always modemagazin 134-135-145-15-134-1-1245-1-1356-35
+always modemark 134-135-145-15-134-356-13
+always modemess 134-135-145-15-134-15-2346
+before m begmidword garde 1245-356-145-15
+before m begmidword pferde 1234-124-12456-145-15
+before m always gebäude 12346-12-34-145-15
+prfword freeman 124-1235-15-15-134-1-1345
+begmidword freeman 124-1235-15-15-134-235
+always reemtsma 1235-15-15-134-2345-234-134-1
+before m always see 234-15-15
+always freemail 124-1235-15-15-134-1-24-123
+always agreement 1-1245-1235-15-15-134-14-2345
+before m begmidword hilfe 125-24-123-124-15
+before m begmidword sage 234-1245-15
+before m begmidword wege 2456-1245-15
+before m begmidword sprache 234-1234-15
+always sprachempfind 234-1234-12356-1234-124-35-145
+before m begmidword epoche 15-1234-135-1456-15
+before m begmidword recherche 1235-15-1456-12456-1456-15
+before m begmidword wäsche 2456-345-156-15
+before m begmidword tusche 2345-136-156-15
+before m begmidword watsche 2456-1-2345-156-15
+before m begword ehe 15-125-15
+sufword ehemalig 15-125-15-134-45
+midendword ehemalig 2356-15-134-45
+sufword ehemals 15-125-15-134-234
+midendword ehemals 2356-15-134-234
+before m always anleihe 235-123-146-125-15
+before m always ruhe 1235-136-125-15
+begmidword tantiem 2345-235-2345-24-12356
+always jemals 245-15-134-234
+before m begmidword anke 235-13-15
+endword ankem 235-13-12356
+before m begmidword getränke 12346-2345-1235-345-1345-13-15
+before m always stärke 23456-345-1235-13-15
+before m always ensemble 14-234-12356-12-123-15
+always allemal 1-15-134
+before m begmidword gentle 1245-14-2345-123-15
+before m always spiele 2-346-15
+always telemedien 2345-13456-15-134-15-145-24-14
+always telemedium 2345-13456-15-134-15-145-24-136-134
+always telemeter 2345-13456-15-134-15-2345-12456
+always telemetrie 2345-13456-15-134-15-2345-1235-346
+always telemetrisch 2345-13456-15-134-15-2345-1235-24-156
+before m begmidword kohle 13-135-125-123-15
+before m begmidword fälle 5-124-12345-15
+always horlemann 125-26-123-15-134-235-1345
+endword memenge 134-15-134-14-12346
+midendword memengen 134-15-134-14-1245-14
+before m begmidword reklame 1235-15-13-123-1-134-15
+midendword nahmemensch 1345-134-15-134-14-156
+always fememord 124-12356-15-134-26-145
+always fememörder 124-12356-15-134-246-1235-145-12456
+before m begmidword filme 124-24-123-134-15
+begmidword filmempfind 124-24-123-134-12356-1234-124-35-145
+before m begmidword wärme 2456-345-1235-134-15
+always dänemark 145-345-1345-15-134-356-13
+before m begmidword hygiene 125-6-13456-1245-24-14-15
+prfword reinem 1235-1246-12356
+before m begmidword reine 1235-1246-15
+before m begmidword schweine 156-2456-1246-15
+before m begmidword gabardine 1245-1-12-356-145-35-15
+before m begmidword margarine 134-356-1245-356-35-15
+before m begmidword marine 134-356-35-15
+prfword marinem 134-356-35-12356
+before m begmidword sohne 234-135-125-1345-15
+before m begmidword söhne 234-246-125-1345-15
+before m begmidword popeline 1234-135-1234-13456-35-15
+before m begmidword online 135-1345-123-35-15
+before m begmidword routine 1235-135-136-2345-35-15
+before m begmidword sahne 234-1-125-1345-15
+before m begmidword sühne 234-1256-125-1345-15
+midword nemach 1345-15-134-56
+endword nemenge 1345-15-134-14-12346
+midendword nemengen 1345-15-134-14-1245-14
+always annemarie 235-1345-15-134-356-346
+before m begmidword wonne 2456-135-1345-1345-15
+always grönemeyer 1245-1235-246-1345-15-134-15-6-13456-12456
+always warnemünd 2456-356-1345-15-134-1256-1345-145
+always remagen 1235-15-134-1-1245-14
+always remake 1235-15-134-1-13-15
+always remakes 1235-15-134-1-13-123456
+always rematerial 1235-15-134-123
+always remark 1235-15-134-356-13
+before m begmidword hardware 125-356-145-2456-356-15
+before m begmidword karriere 13-356-1235-24-12456-15
+always genremaler 1245-14-1235-15-134-25-12456
+before m begmidword genre 1245-14-1235-15
+always entremet 14-2345-1235-15-134-15-2345
+always outremont 135-136-2345-1235-15-134-135-1345-2345
+before m begmidword ampere 1-134-1234-12456-15
+begmidword irremach 24-1235-1235-15-134-56
+before m begmidword säure 234-34-1235-15
+before m begmidword gebläse 12346-12-123-345-234-15
+begmidword kasemat 13-1-234-15-134-1-2345
+before m begmidword käse 13-345-234-15
+before m begmidword lese 123-123456-15
+before m begmidword geräusche 12346-1235-34-156-15
+begmidword geräuschempfind 12346-1235-34-156-12356-1234-124-35-145
+before m begmidword speise 234-1234-146-234-15
+before m begmidword reise 1235-146-234-15
+prfword greisem 1245-1235-146-234-12356
+before m begmidword gänse 1245-345-1345-234-15
+before m always narkose 1345-356-13-135-234-15
+before m begmidword löse 123-246-234-15
+prfword lösem 123-246-234-12356
+before m begword prognose 12345-1245-1345-135-234-15
+before m midword prognose 1234-1235-135-1245-1345-135-234-15
+begmidword rosemar 1235-135-234-15-134-356
+before m always baisse 12-1-24-2346-15
+before m always crosse 6-14-1235-135-2346-15
+before m always hausse 125-16-2346-15
+before m begmidword gehäuse 12346-125-34-234-15
+before m begmidword läuse 123-34-234-15
+always krauseminz 13-1235-16-234-15-134-35-1356
+before m begmidword gemüse 12346-134-1256-234-15
+before m begmidword schmuse 156-134-136-234-15
+before m begmidword analyse 235-25-6-13456-234-15
+always posemuckel 1234-135-234-15-134-136-46-13456
+endword temal 236-134
+always sitemap 234-24-236-134-1-1234
+before m begmidword geschäfte 1245-124-15
+before m begmidword kräfte 5-13-124-15
+before m begmidword gerüchte 12346-1235-1256-1456-236
+before m begword projekte 12345-245-15-13-236
+before m midword projekte 1234-1235-135-245-15-13-236
+before m always ernte 12456-1345-236
+prfword erntem 12456-1345-2345-12356
+always kerntem 13-12456-1345-2345-12356
+begmidword lerntemp 123-12456-1345-2345-12356-1234
+endword stemal 23456-15-134
+before m begmidword watte 2456-1-2345-236
+before m begmidword motte 134-135-2345-236
+before m begmidword bräute 12-1235-34-236
+before m begmidword leute 123-126-236
+begmidword travemünd 2345-1235-1-1236-15-134-1256-1345-145
+begmidword livemit 123-24-1236-15-2-2345
+before m begmidword parallaxe 1234-356-1-12345-1-6-1346-15
+before m begmidword vize 1236-24-1356-15
+before m begmidword bronze 12-1235-135-1345-1356-15
+before m begmidword katze 13-1-2345-1356-15
+before m begmidword witze 2456-24-2345-1356-15
+before m begmidword krätze 13-1235-345-2345-1356-15
+before m begmidword butze 12-136-2345-1356-15
+
+# EN  (4.1 Lautgruppenkürzungen)
+word en 15-1345
+always en 14
+begmidword werbenach 2456-12456-23-1345-56
+prfword gabename 1245-1-23-1345-1-134-15
+always gabenamen 1245-1-23-1345-1-134-14
+always beneath 23-1345-15-1-2345-125
+always gabeneigung 1245-1-23-1345-146-1245-136
+always werbeneuheit 2456-12456-23-1345-126-125
+always habenichts 2-125-15-1345-234
+sufword probenummer 12345-23-1345-136-1346-12456
+midendword probenummer 1234-1235-135-23-1345-136-1346-12456
+always werbenummer 2456-12456-23-1345-136-1346-12456
+always servicenetz 234-12456-1236-24-6-14-15-1345-15-2345-1356
+begmidword serviceniv 234-12456-1236-24-6-14-15-1345-24-1236
+always denatur 145-15-1345-2345
+always denazifiz 145-15-1345-1-1356-24-124-24-1356
+always sendenetz 234-14-145-15-1345-15-2345-1356
+always denerv 145-15-1345-12456-1236
+begmidword badenix 12-1-145-15-1345-24-6-1346
+always schmiedenagel 156-134-346-145-15-1345-1-1245-13456
+begmidword heidenelk 125-146-145-15-1345-13456-13
+begmidword weidenutz 2456-146-145-15-1345-1356
+always meldenam 134-13456-145-15-1345-1-134
+always meldenetz 134-13456-145-15-1345-15-2345-1356
+always meldenot 134-13456-145-15-1345-135-2345
+always hundenapf 125-256-145-15-1345-1-1234-124
+begmidword hundenam 125-256-145-15-1345-1-134
+always hundenarr 125-256-145-15-1345-356-1235
+begmidword hundenärr 125-256-145-15-1345-345-1235-1235
+begmidword hundenas 125-256-145-15-1345-1-234
+always gemeindeneu 12346-134-1246-145-15-1345-126
+always odenam 135-145-15-1345-1-134
+always modenarr 134-135-145-15-1345-356-1235
+always modenärr 134-135-145-15-1345-345-1235-1235
+begmidword pferdenas 1234-124-12456-145-15-1345-1-234
+always pferdenarr 1234-124-12456-145-15-1345-356-1235
+begmidword pferdenärr 1234-124-12456-145-15-1345-345-1235-1235
+always pferdenatur 1234-124-12456-145-15-1345-2345
+always pferdenüster 1234-124-12456-145-15-1345-1256-23456-12456
+always aberdeen 1-12-12456-145-15-15-1345
+sufword eileen 146-123-15-15-1345
+always spleen 234-1234-123-15-15-1345
+always screen 234-6-14-1235-15-15-1345
+always green 1245-1235-15-15-1345
+always seenadel 234-15-15-1345-1-145-13456
+always seeniveau 234-15-15-1345-24-1236-15-16
+always teenager 2345-15-15-1345-1-1245-12456
+prfword steen 23456-15-15-1345
+prfword steens 23456-15-15-1345-234
+always ideenarm 24-145-15-14-356-134
+always seenartig 234-15-14-356-2345-45
+begmidword ideenassozi 24-145-15-14-1-2346-135-1356-24
+always ideenaustausch 24-145-15-14-16-234-2345-16-156
+always colleen 6-14-135-12345-15-15-1345
+prfword armeen 356-134-15-14
+begmidword seenelk 234-15-15-1345-13456-13
+begmidword peenemünd 1234-15-15-1345-15-134-1256-1345-145
+always freenet 124-1235-15-15-1345-15-2345
+sufword maureen 134-16-1235-15-15-1345
+always seenot 234-15-15-1345-135-2345
+begmidword seenöt 234-15-15-1345-246-2345
+prfword seenöt 234-15-15-1345-246-236
+begmidword seenymph 234-15-15-1345-6-13456-134-1234-125
+always seenäh 234-15-15-1345-345-125
+begmidword seenäh 234-15-15-1345-345-125
+always teenie 2345-15-15-1345-346
+always teeny 2345-15-15-1345-6-13456
+begmidword hilfenahm 125-24-123-124-15-1345-134
+always hilfeniveau 125-24-123-124-15-1345-24-1236-15-16
+always zeigenadel 1356-146-12346-1345-1-145-13456
+prfword hängenase 125-345-1345-12346-1345-1-234-15
+always hängenasen 125-345-1345-12346-1345-1-234-14
+always spionagenetz 234-1234-24-135-1345-1-12346-1345-15-2345-1356
+always wegenetz 2456-1245-15-1345-15-2345-1356
+always taugenichts 2345-16-12346-1345-234
+always patschenass 1234-1-2345-156-15-1345-1-2346
+word ehename 15-125-15-1345-1-134-15
+endword ehename 2356-15-1345-1-134-15
+always ehenamen 2356-15-1345-1-134-14
+prfword mathenote 134-1-2345-125-15-1345-135-236
+always mathenoten 134-1-2345-125-15-1345-135-2345-14
+always leihenehmer 123-146-125-15-1345-125-12456
+sufword siena 234-24-14-1
+always sienesisch 234-24-14-123456-24-156
+prfword theorieneutral 2345-125-15-26-346-1345-126-2345-1235-1-123
+begmidword theorieneutral 2345-125-15-26-346-1345-126-2345-1235-25
+always spuckenass 234-1234-136-46-15-1345-1-2346
+always bottleneck 12-135-2345-2345-123-15-1345-15-46
+always villeneuv 1236-24-12345-15-1345-126-1236
+always telenovela 2345-13456-15-1345-135-1236-13456-1
+always teilenummer 2345-146-123-15-1345-136-1346-12456
+begmidword teilenam 2345-146-123-15-1345-1-134
+always nahmeneigung 1345-134-15-1345-146-1245-136
+always wärmenetz 2456-345-1235-134-15-1345-15-2345-1356
+always wärmenetz 2456-345-1235-134-15-1345-15-2345-1356
+begmidword schweinenier 156-2456-1246-15-1345-346-1235
+always aknen 1-13-1345-15-1345
+always phoenix 1234-125-135-15-1345-24-6-1346
+always aren't 1-1235-15-1345-6-2345
+before n begmidword hardware 125-356-145-2456-356-15
+always renatur 1235-15-1345-2345
+always schwerenot 156-2456-12456-15-1345-135-2345
+always chiffrenummer 1456-24-124-124-1235-15-1345-136-1346-12456
+before n begmidword softwarenutz 234-135-124-2345-2456-356-15-1345-1356
+always schwerenöter 156-2456-12456-15-1345-246-2345-12456
+begmidword kosenam 13-135-234-15-1345-1-134
+begmidword glucosenach 1245-123-136-6-14-135-234-15-1345-56
+begmidword morsenach 134-26-234-15-1345-56
+begmidword messeneu 134-15-2346-15-1345-126
+begmidword pressenach 1234-1235-15-2346-15-1345-56
+always pressenotiz 1234-1235-15-2346-15-1345-135-2345-24-1356
+before n always baisse 12-1-24-2346-15
+always mäusenest 134-34-234-15-1345-15-23456
+always usenet 136-234-15-1345-15-2345
+begmidword städtenam 23456-345-145-236-1345-1-134
+always kräftenach 5-13-124-15-1345-56
+always gutenacht 1245-136-236-1345-56-2345
+prfword haltenase 125-25-236-1345-1-234-15
+always haltenasen 125-25-236-1345-1-234-14
+always gütenorm 1245-1256-236-1345-26-134
+always bytenummer 12-6-13456-236-1345-136-1346-12456
+before n begmidword bronze 12-1235-135-1345-1356-15
+prfword bronzen 12-1235-135-1345-1356-14
+prfword bronzene 12-1235-135-1345-1356-14-15
+prfword bronzenem 12-1235-135-1345-1356-14-12356
+prfword bronzenen 12-1235-135-1345-1356-14-14
+prfword bronzener 12-1235-135-1345-1356-14-12456
+prfword bronzenes 12-1235-135-1345-1356-14-123456
+
+# ENT- (4.2.1 Vorsilbenkürzungen)
+begword ent 2346
+sufword entchen 14-2345-1456-14
+word ente 14-236
+always entelech 14-2345-13456-15-1456
+always enten 14-2345-14
+always hallentennis 125-1-12345-14-2345-14-1345-24-234
+always rasentennis 1235-1-234-14-2345-14-1345-24-234
+always frauentennis 124-1235-16-14-2345-14-1345-24-234
+always entente 14-2345-14-236
+always ententeil 14-2345-14-2345-146-123
+always ententeich 14-2345-14-2345-146-1456
+prfword enter 14-2345-12456
+always enterbeil 14-2345-12456-12-146-123
+always enterbrück 14-2345-12456-12-1235-1256-46
+always enter- 14-2345-12456-36
+always entere 14-2345-12456-15
+always enterem 14-2345-12456-12356
+always enteren 14-2345-12456-14
+always enterer 14-2345-12456-12456
+always enteres 14-2345-12456-123456
+always enterhak 14-2345-12456-125-1-13
+always enterich 14-2345-12456-3456
+always enteritis 14-2345-12456-24-2345-24-234
+always entermesser 14-2345-12456-134-15-2346-12456
+always entern 14-2345-12456-1345
+always entero 14-2345-12456-135
+always enterogen 14-2345-12456-135-1245-14
+always enterpris 14-2345-12456-1234-1235-24-234
+always enterst 14-2345-12456-23456
+always entert 14-2345-12456-2345
+always entertain 14-2345-12456-2345-1-24-1345
+always entertast 14-2345-12456-2345-1-23456
+prfword enterte 14-2345-12456-236
+prfword entertem 14-2345-12456-2345-12356
+prfword enterten 14-2345-12456-2345-14
+prfword enterter 14-2345-12456-2345-12456
+prfword entertes 14-2345-12456-2345-123456
+prfword entertest 14-2345-12456-236-23456
+prfword entertet 14-2345-12456-236-2345
+always enterung 14-2345-12456-136
+always enthusia 14-2345-125-136-234-24-1
+always enthymem 14-2345-125-6-13456-134-12356
+always entität 14-2345-5-345
+always entities 14-2345-24-2345-346-234
+always entity 14-2345-24-2345-6-13456
+always entlein 14-2345-123-1246
+always entoderm 14-2345-135-145-12456-134
+always entomo 14-2345-135-134-135
+midendword entomori 14-2345-135-134-26-24
+always entopisch 14-2345-135-1234-24-156
+always entoptisch 14-2345-135-1234-2345-24-156
+always entotisch 14-2345-135-2345-24-156
+prfword entourage 14-2345-135-136-1235-1-12346
+always entourag 14-2345-135-136-1235-1-1245
+always entrec 14-2345-1235-15-6-14
+always entrecht 2346-1235-2345
+always zentrech 1356-14-2345-1235-15-1456
+always entree 14-2345-1235-15-15
+always entremet 14-2345-1235-15-134-15-2345
+always entrepreneur 14-2345-1235-15-1234-1235-14-126-1235
+always entresol 14-2345-1235-15-234-135-123
+always entrevu 14-2345-1235-15-1236-136
+always entrop 14-2345-1235-135-1234
+
+# ER  (4.1 Lautgruppenkürzungen)
+always er 12456
+always aerobic 1-15-1235-135-12-24-6-14
+before er begword ausgabe 34-1245-1-23
+before er midword ausgabe 16-234-1245-1-23
+before er midword gewölbe 12346-2456-246-123-23
+before e begword probe 12345-23
+before e midword probe 1234-1235-135-23
+before er always gewebe 12346-2456-15-23
+before er always sterbe 23456-12456-23
+always sterberei 23456-12456-12-12456-146
+before er always werbe 2456-12456-23
+prfword werber 2456-12456-12-12456
+always bewerber 23-2456-12456-12-12456
+always erwerber 12456-2456-12456-12-12456
+prfword werberin 2456-12456-12-12456-35
+prfword werberinnen 2456-12456-12-12456-35-1345-14
+always werberisch 2456-12456-12-12456-24-156
+prfword werbern 2456-12456-12-12456-1345
+prfword werbers 2456-12456-12-12456-234
+prfword berundal 12-12456-256-145-1-123
+begmidword berundal 12-12456-256-145-25
+before e always bade 12-1-145-15
+before er begmidword jade 245-1-145-15
+before er always parade 1234-356-1-145-15
+before er begmidword kreide 13-1235-146-145-15
+before er midword ance 235-6-14-15
+prfword ancer 235-6-14-12456
+prfword ancera 235-6-14-12456-1
+prfword ancers 235-6-14-12456-234
+before er begmidword service 234-12456-1236-24-6-14-15
+begmidword deregul 145-15-1235-15-1245-136-123
+begmidword derangier 145-15-1235-235-1245-346-1235
+before er always getreide 12346-2345-1235-146-145-15
+before r always melde 134-13456-145-15
+prfword melder 134-13456-145-12456
+begmidword melderattrapp 134-13456-145-12456-1-2345-2345-1235-1-1234-1234
+prfword meldern 134-13456-145-12456-1345
+prfword melderin 134-13456-145-12456-35
+prfword melderinnen 134-13456-145-12456-35-1345-14
+prfword melders 134-13456-145-12456-234
+before er always gemälde 12346-134-345-123-145-15
+before e always lande 123-235-145-15
+before e always mode 134-135-145-15
+before er always gebäude 12346-12-34-145-15
+always beer 12-15-15-1235
+prfword beerbe 23-12456-12-15
+always beerben 23-12456-12-14
+always beerbst 23-12456-12-23456
+always beerbt 23-12456-12-2345
+prfword beerbte 23-12456-12-236
+always beerbtest 23-12456-12-236-23456
+always beerbung 23-12456-12-136
+always beerdig 23-12456-145-45
+always heferein 125-15-124-15-1235-1246
+before er always hilfe 125-24-123-124-15
+always beruferat 23-1235-136-124-15-1235-1-2345
+before er begmidword trage 2345-1245-15
+before er begmidword prestige 1234-1235-15-23456-45-15
+always heer 125-15-15-1235
+begmidword näheer 1345-345-125-15-12456
+always cheer 1456-15-15-1235
+before e always schwäche 156-2456-345-1456-15
+before e always recherche 1235-15-1456-12456-1456-15
+begmidword ascheroll 1-156-15-1235-135-12345
+begmidword ascheröll 1-156-15-1235-246-12345
+always wäscheraum 2456-345-156-15-1235-16-134
+begmidword wäscheräum 2456-345-156-15-1235-34-134
+always weheruf 2456-2356-15-1235-136-124
+before e always anleihe 235-123-146-125-15
+before er always mathe 134-1-2345-125-15
+always stärkereg 23456-345-1235-13-15-1235-15-1245
+always leer 123-15-15-1235
+always galeer 1245-25-15-15-1235
+always liebeleer 123-346-23-123-15-15-1235
+before er begmidword kohle 13-135-125-123-15
+prfword kohler 13-135-125-123-12456
+before e always klee 13-123-15-15
+before r begmidword koschenille 13-135-156-14-24-12345-15
+always meer 134-15-15-1235
+before er always nahme 1345-134-15
+before e always wärme 2456-345-1235-134-15
+always neer 1345-15-15-1235
+before e always sahne 234-1-125-1345-15
+always guineer 1245-136-35-15-12456
+always peer 1234-15-15-1235
+before e always grippe 1245-1235-24-1234-1234-15
+always speer 234-1234-15-15-1235
+begmidword haarerauf 125-1-1-1235-15-1235-16-124
+before e always software 234-135-124-2345-2456-356-15
+before er begmidword säure 234-34-1235-15
+before er always see 234-15-15
+before e always reise 1235-146-234-15
+before er always diagnose 145-24-1-1245-1345-135-234-15
+before e always presse 1234-1235-15-2346-15
+before er always analyse 235-25-6-13456-234-15
+before e always tee 2345-15-15
+always teer 2345-15-15-1235
+always haltering 125-25-236-1235-35-1245
+prfword halteringe 125-25-236-1235-35-12346
+always halteroll 125-25-236-1235-135-12345
+before e always kälte 13-345-123-236
+always kälteraum 13-345-123-236-1235-16-134
+begmidword kälteräum 13-345-123-236-1235-34-134
+before e always elite 13456-24-236
+before e always ernte 12456-1345-236
+before er begmidword getriebe 12346-2345-1235-346-23
+before er begmidword schiebe 156-346-23
+prfword schieber 156-346-12-12456
+before konsonant begmidword schieber 156-346-12-12456
+prfword schieberei 156-346-12-12456-146
+prfword schiebereien 156-346-12-12456-146-14
+before er begword probe 12345-23
+before er midword probe 1234-1235-135-23
+before er midword bleibe 12-12-15
+always bleiber 12-12-12456
+always bleibers 12-12-12456-234
+before er midword gabe 1245-1-23
+always haberecht 2-125-15-1235-2345
+begmidword heberoll 125-15-23-1235-135-12345
+begmidword kleberoll 13-123-15-23-1235-135-12345
+before er begmidword parforce 1234-356-124-26-6-14-15
+prfword laderampe 123-1-145-15-1235-1-134-1234-15
+always laderampen 123-1-145-15-1235-1-134-1234-14
+before er begmidword hunde 125-256-145-15
+always thunder 2345-125-256-145-12456
+always hundert 125-256-145-12456-2345
+prfword hunderte 125-256-145-12456-236
+before er begmidword gemeinde 12346-134-1246-145-15
+always ständerat 5-23456-15-1235-1-2345
+always ständerät 5-23456-15-1235-345-2345
+always ständeräte 5-23456-15-1235-345-236
+always heiderauch 125-146-145-15-1235-16-1456
+midendword deraum 145-15-1235-16-134
+midword deräum 145-15-1235-34-134
+always derealisation 145-15-1235-15-25-24-234-5-1345
+midendword derecht 145-15-1235-2345
+always ständerecht 5-23456-15-1235-2345
+midendword dereduktion 145-15-1235-15-145-136-13-2345-245
+midword dereduzier 145-15-1235-15-145-136-1356-346-1235
+midendword dereferenz 145-15-1235-15-124-12456-14-1356
+midendword dereform 145-15-1235-15-124-26-134
+after e midword regist 1235-15-1245-24-23456
+midendword deregulation 145-15-1235-15-1245-136-123-5-1345
+midendword deregulier 145-15-1235-15-1245-136-123-346-1235
+prfword badereise 12-1-145-15-1235-146-234-15
+always badereisen 12-1-145-15-1235-146-234-14
+prfword laderunge 123-1-145-15-1235-256-12346
+always laderungen 123-1-145-15-1235-256-1245-14
+always siederohr 234-346-145-15-1235-135-125-1235
+begmidword siederöhr 234-346-145-15-1235-246-125-1235
+begmidword heiderös 125-146-145-15-1235-246-234
+always weiderind 2456-146-145-15-1235-35-145
+always händeringen 5-125-145-15-1235-35-1245-14
+before er begmidword gelände 12346-123-345-1345-145-15
+prfword geländer 12346-123-345-1345-145-12456
+prfword geländern 12346-123-345-1345-145-12456-1345
+always geländers 12346-123-345-1345-145-12456-234
+begmidword geländerst 12346-123-345-1345-145-12456-23456
+prfword sendereihe 234-14-145-15-1235-146-125-15
+always sendereihen 234-14-145-15-1235-146-125-14
+begmidword senderöhr 234-14-145-15-1235-246-125-1235
+before er begmidword gewinde 12346-2456-35-145-15
+begmidword moderedakt 134-135-145-15-1235-15-145-1-13-2345
+begmidword modereis 134-135-145-15-1235-146-234
+always moderessort 134-135-145-15-1235-15-2346-26-2345
+always moderichtung 134-135-145-15-2-3456-136
+before er begmidword garde 1245-356-145-15
+prfword garderobe 1245-356-145-12456-135-12-15
+begmidword garderobe 1245-356-145-12456-135-23
+always garderoben 1245-356-145-12456-135-12-14
+before er begmidword pferde 1234-124-12456-145-15
+before er begmidword gebäude 12346-12-34-145-15
+always engineer 14-1245-35-15-15-1235
+always hilferuf 125-24-123-124-15-1235-136-124
+always schärferelation 156-345-1235-124-15-1235-13456-5-1345
+always spracherecht 234-1234-15-1235-2345
+always ascheregen 1-156-15-1235-15-1245-14
+begmidword wäscheroll 2456-345-156-15-1235-135-12345
+sufword eherecht 15-125-15-1235-2345
+midendword eherecht 2356-15-1235-2345
+sufword eheregister 15-125-15-1235-15-1245-24-23456-12456
+midendword eheregister 2356-15-1235-15-1245-24-23456-12456
+sufword ehering 15-125-15-1235-35-1245
+midendword ehering 2356-15-1235-35-1245
+word eheringe 15-125-15-1235-35-12346
+endword eheringe 2356-15-1235-35-12346
+word eheroman 15-125-15-1235-135-134-1-1345
+begword eheroman 15-125-15-1235-135-134-235
+midword eheroman 2356-15-1235-135-134-235
+endword eheroman 2356-15-1235-135-134-1-1345
+begword eheromän 15-125-15-1235-135-134-345-1345
+midword eheromän 2356-15-1235-135-134-345-1345
+prfword weiherede 2456-146-125-15-1235-15-145-15
+always weihereden 2456-146-125-15-1235-15-145-14
+before er always ruhe 1235-136-125-15
+prfword ruher 1235-136-125-12456
+prfword ruhern 1235-136-125-12456-1345
+prfword ruhers 1235-136-125-12456-234
+before er begmidword knie 13-1345-346
+always sacknier 234-1-46-1345-346-1235
+always schocknier 156-135-46-1345-346-1235
+always taljereep 2345-25-245-15-1235-15-15-1234
+before er begmidword getränke 12346-2345-1235-345-1345-13-15
+always stärkereaktion 23456-345-1235-13-15-1235-15-1-13-2345-245
+always stärkereich 23456-345-1235-13-15-1235-146-1456
+prfword primerate 1234-1235-24-134-15-1235-1-236
+always primerates 1234-1235-24-134-15-1235-1-2345-123456
+always nahmeregel 1345-134-15-1235-15-1245-13456
+always homerun 125-135-134-15-1235-256
+before er begmidword wärme 2456-345-1235-134-15
+prfword wärmer 2456-345-1235-134-12456
+prfword wärmere 2456-345-1235-134-12456-15
+prfword wärmerem 2456-345-1235-134-12456-12356
+prfword wärmeren 2456-345-1235-134-12456-14
+prfword wärmerer 2456-345-1235-134-12456-12456
+prfword wärmeres 2456-345-1235-134-12456-123456
+prfword wärmerin 2456-345-1235-134-12456-35
+# HOMONYM
+prfword wärmerinnen 2456-345-1235-134-12456-35-1345-14
+prfword wärmern 2456-345-1235-134-12456-1345
+prfword wärmers 2456-345-1235-134-12456-234
+always schwärmer 156-2456-345-1235-134-12456
+begmidword sahneroll 234-1-125-1345-15-1235-135-12345
+prfword sühneritual 234-1256-125-1345-15-1235-24-2345-136-1-123
+begmidword sühneritual 234-1256-125-1345-15-1235-24-2345-136-25
+begmidword routinerech 1235-135-136-2345-35-15-1235-15-1456
+before er begmidword schweine 156-2456-1246-15
+always schweinerei 156-2456-1246-12456-146
+before er begmidword sterne 23456-12456-1345-15
+sufword moers 134-135-15-1235-234
+always sparerib 234-1234-356-15-1235-24-12
+always wareries 2456-356-15-1235-346-234
+prfword wareroute 2456-356-15-1235-135-136-236
+begmidword warerout 2456-356-15-1235-135-136-2345
+always irrered 24-1235-1235-15-1235-15-145
+always oxidasereaktion 135-6-1346-24-145-1-234-15-1235-15-1-13-2345-245
+always käserest 13-345-234-15-1235-15-23456
+begmidword käserind 13-345-234-15-1235-35-145
+before er begmidword gebläse 12346-12-123-345-234-15
+begmidword naserümpf 1345-1-234-15-1235-1256-134-1234-124
+begmidword leseratt 123-123456-15-1235-1-2345-2345
+prfword leseratte 123-123456-15-1235-1-2345-236
+always leseraum 123-123456-15-1235-16-134
+always leseregister 123-123456-15-1235-15-1245-24-23456-12456
+prfword lesereise 123-123456-15-1235-146-234-15
+always lesereisen 123-123456-15-1235-146-234-14
+prfword leseringe 123-123456-15-1235-35-12346
+always lesering 123-123456-15-1235-35-1245
+begmidword leseräum 123-123456-15-1235-34-134
+before er begmidword speise 234-1234-146-234-15
+prfword speiser 234-1234-146-234-12456
+prfword speisern 234-1234-146-234-12456-1345
+prfword speisers 234-1234-146-234-12456-234
+begmidword reiserech 1235-146-234-15-1235-15-1456
+always reiseregel 1235-146-234-15-1235-15-1245-13456
+always reisereport 1235-146-234-15-1235-15-1234-26-2345
+prfword reiseroute 1235-146-234-15-1235-135-136-236
+begmidword reiserout 1235-146-234-15-1235-135-136-2345
+always reiseruf 1235-146-234-15-1235-136-124
+before er begword narkose 1345-356-13-135-234-15
+before er begword prognose 12345-1245-1345-135-234-15
+before er midword prognose 1234-1235-135-1245-1345-135-234-15
+always massereich 134-1-2346-15-1235-146-1456
+always rasserein 1235-1-2346-15-1235-1246
+always presserat 1234-1235-15-2346-15-1235-1-2345
+begmidword presserät 1234-1235-15-2346-15-1235-345-2345
+prfword presseräte 1234-1235-15-2346-15-1235-345-236
+always presserecht 1234-1235-15-2346-15-1235-2345
+begmidword presserefer 1234-1235-15-2346-15-1235-15-124-12456
+begmidword presserezen 1234-1235-15-2346-15-1235-15-1356-14
+always presserummel 1234-1235-15-2346-15-1235-136-1346-13456
+always presserundschau 1234-1235-15-2346-15-1235-256-145-156-16
+before er begmidword gehäuse 12346-125-34-234-15
+prfword gehäuser 12346-125-34-234-12456
+prfword gehäusern 12346-125-34-234-12456-1345
+before er begmidword analyse 235-25-6-13456-234-15
+prfword städtereise 23456-345-145-236-1235-146-234-15
+always städtereisen 23456-345-145-236-1235-146-234-14
+before er begmidword kräfte 5-13-124-15
+before er begmidword früchte 124-1235-1256-1456-236
+always halteriegel 125-25-236-1235-346-1245-13456
+always halteriemen 125-25-236-1235-346-134-14
+always haltering 125-25-236-1235-35-1245
+prfword halteringe 125-25-236-1235-35-12346
+always warteraum 2456-356-236-1235-16-134
+begmidword warteräum 2456-356-236-1235-34-134
+before er begmidword gäste 1245-345-23456-15
+always pusterohr 1234-136-23456-15-1235-135-125-1235
+begmidword pusteröhr 1234-136-23456-15-1235-246-125-1235
+begmidword räteregier 1235-345-236-1235-1245
+always räterepublik 1235-345-236-1235-13
+begmidword treuerabat 2345-1235-126-15-1235-1-12-1-2345
+before er always reserve 1235-123456-12456-1236-15
+before er begmidword vize 1236-24-1356-15
+before er begmidword hitze 125-24-2345-1356-15
+prfword hitzer 125-24-2345-1356-12456
+prfword hitzern 125-24-2345-1356-12456-1345
+prfword hitzers 125-24-2345-1356-12456-234
+before er begmidword grütze 1245-1235-1256-2345-1356-15
+
+# ES  (4.1 Lautgruppenkürzungen)
+always es 123456
+midword esammel 15-234-1-1346-13456
+midword esamml 15-234-1-1346-123
+always esch 15-156
+midendword eschrift 15-156-2345
+midendword eshire 15-234-125-24-1235-15
+midendword eshires 15-234-125-24-1235-123456
+midendword eshow 15-234-125-135-2456
+always ess 15-2346
+always essch 123456-156
+endword esschen 15-2346-1456-14
+endword esschens 15-2346-1456-14-234
+always est 15-23456
+midendword estell 15-2-13456
+midendword estund 15-23456-256-145
+prfword caesar 6-14-1-15-234-1-1235
+begmidword caesar 6-14-1-15-234-356
+before s always sterbe 23456-12456-23
+before s always service 234-12456-1236-24-6-14-15
+prfword services 234-12456-1236-24-6-14-123456
+before s always patience 1234-1-2345-24-14-6-14-15
+before s always renaissance 1235-14-1-24-2346-235-6-14-15
+begmidword desensibilis 145-15-234-14-234-24-12-24-123-24-234
+begmidword despektier 145-15-234-1234-15-13-2345-346-1235
+before s always bade 12-1-145-15
+prfword bades 12-1-145-123456
+prfword bades 12-1-145-123456
+prfword badest 12-1-145-15-23456
+always badestell 12-1-145-15-2-13456
+begmidword badest 12-1-145-15-23456
+before s begmidword jade 245-1-145-15
+prfword jades 245-1-145-123456
+before s always lade 123-1-145-15
+prfword blades 12-123-1-145-123456
+prfword glades 1245-123-1-145-123456
+before s always gerade 12346-1235-1-145-15
+always geradeswegs 12346-1235-1-145-123456-2456-1245-234
+prfword gerades 12346-1235-1-145-123456
+before s always parade 1234-356-1-145-15
+before s always schmiede 156-134-346-145-15
+prfword schmiedes 156-134-346-145-123456
+before s always rede 1235-15-145-15
+prfword redes 1235-15-145-123456
+before s always getreide 12346-2345-1235-146-145-15
+prfword getreides 12346-2345-1235-146-145-123456
+before s always eingeweide 1246-12346-2456-146-145-15
+before s always gemälde 12346-134-345-123-145-15
+prfword gemäldes 12346-134-345-123-145-123456
+before s always melde 134-13456-145-15
+before s begmidword gelände 12346-123-345-1345-145-15
+prfword geländes 12346-123-345-1345-145-123456
+before s always stände 5-23456-15
+before s always gemeinde 12346-134-1246-145-15
+before s always gewinde 12346-2456-35-145-15
+prfword gewindes 12346-2456-35-145-123456
+before s always hunde 125-256-145-15
+prfword hundes 125-256-145-123456
+before s always sende 234-14-145-15
+prfword sendes 234-14-145-123456
+always börsendesaster 12-246-1235-234-14-145-123456-1-23456-12456
+always rasend 1235-1-234-14-145
+always lösend 123-246-234-14-145
+before s always wende 2456-14-145-15
+before s always mode 134-135-145-15
+before s always garde 1245-356-145-15
+before s always pferde 1234-124-12456-145-15
+prfword pferdes 1234-124-12456-145-123456
+before s always gebäude 12346-12-34-145-15
+prfword gebäudes 12346-12-34-145-123456
+endword ees 15-15-234
+before s always lee 123-15-15
+before s always klee 13-123-15-15
+always meesenburg 134-15-15-234-14-12-136-1235-1245
+always reesa 1235-15-15-234-1
+before s always see 234-15-15
+prfword sees 234-15-15-234
+prfword gesees 12346-234-15-15-234
+before s always tee 2345-15-15
+before s always hilfe 125-24-123-124-15
+before s always reife 1235-146-124-15
+prfword reifes 1235-146-124-123456
+before s always schärfe 156-345-1235-124-15
+before s always lage 123-1-12346
+prfword lages 123-1-1245-123456
+before s always säge 5-234-1245-15
+before s always präge 1234-1235-345-12346
+always tragesack 2345-1245-15-234-1-46
+begmidword tragesäck 2345-1245-15-234-345-46
+always tragesitz 2345-1245-15-2-24
+before s begmidword prestige 1234-1235-15-23456-45-15
+prfword prestiges 1234-1235-15-23456-45-123456
+before s always rache 1235-56-15
+before s always wäsche 2456-345-156-15
+before s always weihe 2456-146-125-15
+before s always ruhe 1235-136-125-15
+before s always regie 1235-15-1245-346
+begmidword dankestele 145-13-123456-2345-13456-15
+before s always ränke 1235-345-1345-13-15
+prfword ränkes 1235-345-1345-13-123456
+begmidword stinkesock 23456-35-13-15-234-135-46
+before s always stärke 23456-345-1235-13-15
+always bubblesort 12-136-12-12-123-15-234-26-2345
+before s always ensemble 14-234-12356-12-123-15
+prfword ensembles 14-234-12356-12-123-123456
+before s always spiele 2-346-15
+prfword spieles 2-346-123456
+before s always tele 2345-13456-15
+prfword teles 2345-13456-123456
+before s always kohle 13-135-125-123-15
+before s always file 124-24-123-15
+prfword files 124-24-123-123456
+before s begmidword galle 1245-1-12345-15
+before s midword promille 1234-1235-135-134-24-12345-15
+before s sufword promille 12345-134-24-12345-15
+before s always vanille 1236-235-24-12345-15
+before s always emaille 12356-1-24-12345-15
+prfword emailles 12356-1-24-12345-123456
+always stillesein 23456-24-12345-15-234-1246
+before s always schule 156-136-123-15
+before s always puzzle 1234-136-1356-1356-123-15
+prfword puzzles 1234-136-1356-1356-123-123456
+before s always reklame 1235-15-13-123-1-134-15
+before s always creme 6-14-1235-12356-15
+prfword cremes 6-14-1235-12356-123456
+before s always wärme 2456-345-1235-134-15
+always ganesh 1245-235-15-234-125
+before s always hygiene 125-6-13456-1245-24-14-15
+before s always szene 234-1356-14-15
+before s always sahne 234-1-125-1345-15
+before s always schweine 156-2456-1246-15
+prfword schweines 156-2456-1246-123456
+before s always online 135-1345-123-35-15
+before s always marine 134-356-35-15
+prfword marines 134-356-35-123456
+before s always routine 1235-135-136-2345-35-15
+prfword routines 1235-135-136-2345-35-123456
+before s always wonne 2456-135-1345-1345-15
+before s always quarantäne 6-12345-136-356-235-2345-345-1345-15
+before s always pläne 1234-123-345-1345-15
+before s always apnoe 1-1234-1345-135-15
+before s always grippe 1245-1235-24-1234-1234-15
+before s always hardware 125-356-145-2456-356-15
+before s always software 234-135-124-2345-2456-356-15
+before s always schmiere 156-134-346-1235-15
+prfword schmieres 156-134-346-1235-123456
+before s always karriere 13-356-1235-24-12456-15
+prfword amperes 1-134-1234-12456-123456
+before s begmidword ampere 1-134-1234-12456-15
+before s always repertoire 1235-15-1234-12456-2345-135-24-1235-15
+prfword repertoires 1235-15-1234-12456-2345-135-24-1235-123456
+before s always satire 234-1-2345-24-1235-15
+before s begmidword genre 1245-14-1235-15
+prfword genres 1245-14-1235-123456
+before s always folklore 124-135-123-13-123-26-15
+before s always säure 234-34-1235-15
+before s always lektüre 123-15-13-2345-1256-1235-15
+before s always käse 13-345-234-15
+prfword käses 13-345-234-123456
+before s always lese 123-123456-15
+before s always reise 1235-146-234-15
+prfword reises 1235-146-234-123456
+before s always speise 234-1234-146-234-15
+before s always gänse 1245-345-1345-234-15
+before s always diagnose 145-24-1-1245-1345-135-234-15
+before s always narkose 1345-356-13-135-234-15
+before s always glukose 1245-123-136-13-135-234-15
+before s always hirse 125-24-1235-234-15
+before s always baisse 12-1-24-2346-15
+before s always hausse 125-16-2346-15
+before s always masse 134-1-2346-15
+before s always muße 134-136-2346-15
+before s always gehäuse 12346-125-34-234-15
+prfword gehäuses 12346-125-34-234-123456
+before s always gemüse 12346-134-1256-234-15
+prfword gemüses 12346-134-1256-234-123456
+before s always dialyse 145-24-25-6-13456-234-15
+before s always rate 1235-1-236
+prfword rates 1235-1-2345-123456
+before s always städte 23456-345-145-236
+before s always kräfte 5-13-124-15
+before s always mächte 134-345-1456-236
+before s always rendite 1235-14-145-24-236
+before s always punkte 1234-2345-15
+prfword punktes 1234-2345-123456
+before s always kälte 13-345-123-236
+before s always argumente 356-1245-136-134-14-236
+prfword argumentes 356-1245-136-134-14-2345-123456
+endword erntes 12456-1345-2345-123456
+before s always ernte 12456-1345-236
+before s always warte 2456-356-236
+prfword wartes 2456-356-2345-123456
+before s always werte 2456-12456-236
+prfword wertes 2456-12456-2345-123456
+before s always gäste 1245-345-23456-15
+before s always watte 2456-1-2345-236
+before s always jute 245-136-236
+before s always güte 1245-1256-236
+before s always reserve 1235-123456-12456-1236-15
+before s always gaze 1245-1-1356-15
+begmidword pilzesuch 1234-24-123-1356-15-234-136-1456
+begmidword sülzesala 234-1256-123-1356-15-234-25-1
+before s always bronze 12-1235-135-1345-1356-15
+before s always hitze 125-24-2345-1356-15
+midendword ession 15-2346-245
+always praesens 1234-1235-1-15-234-14-234
+begmidword spaceshutt 234-1234-1-6-14-15-234-125-136-2345-2345
+sufword desselb 145-123456-234-13456-12
+always desensibilisier 145-15-234-14-234-24-12-24-123-24-234-346-1235
+always arcadespiel 356-6-14-1-145-15-2-346
+always balladesänger 12-1-12345-1-145-15-234-345-1345-1245-12456
+always mädesüß 134-345-145-15-234-1256-2346
+always redesign 1235-15-145-123456-24-1245-1345
+always kleidespiegel 13-123-146-145-15-234-1234-346-1245-13456
+begmidword schneidescher 156-1345-146-145-15-156-12456
+begmidword scheidestund 156-146-145-15-23456-256-145
+begmidword scheidestünd 156-146-145-15-23456-1256-1345-145
+always waldes 2456-25-145-123456
+always landes 123-235-145-123456
+begmidword landesch 123-235-145-15-156
+always landeschef 123-235-145-123456-1456-15-124
+prfword landest 123-235-145-15-23456
+always landesteg 123-235-145-15-23456-15-1245
+begmidword landestell 123-235-145-15-2-13456
+always standes 2-23456-123456
+always standest 2-23456-15-23456
+always ständest 5-23456-15-23456
+always ständestaat 5-23456-15-23456-2345
+always wendest 2456-14-145-15-23456
+always kindes 13-35-145-123456
+always bundes 12-256-145-123456
+always codeschnipsel 6-14-135-145-15-156-1345-24-1234-234-13456
+always codestück 6-14-135-145-15-23456-1256-46
+always todes 2345-135-145-123456
+begmidword freudestrahl 124-1235-126-145-15-23456-1235-1-125-123
+prfword freesie 124-1235-15-15-234-24-15
+begmidword bungeespr 12-256-1245-15-15-234-1234-1235
+begmidword erdeess 12456-145-15-15-2346
+always heesters 125-15-15-23456-12456-234
+prfword hefesorte 125-15-124-15-234-26-236
+always hefesorten 125-15-124-15-234-26-2345-14
+prfword hefespore 125-15-124-15-234-1234-26-15
+always hefesporen 125-15-124-15-234-1234-26-14
+always hefestück 125-15-124-15-23456-1256-46
+always rufesatz 1235-136-124-15-234-1356
+always rufesätz 1235-136-124-15-5-234-1356
+always sieges 234-346-1245-123456
+always tages 2345-1-1245-123456
+always tageschau 2345-1-12346-156-16
+syllable geschädig 12346-156-345-145-45
+begmidword sageschreib 234-1245-15-156-12
+begmidword legesohl 123-15-12346-234-135-125-123
+always hagestolz 125-1-12346-23456-135-123-1356
+always wagestück 2456-1-12346-23456-1256-46
+always nahestand 1345-1-125-15-2-23456
+always cachespeicher 6-14-56-15-234-1234-146-1456-12456
+midendword ehesach 2356-15-234-56
+sufword ehesach 15-125-15-234-56
+midword ehesakramen 2356-15-234-1-13-1235-1-134-14
+begword ehesakramen 15-125-15-234-1-13-1235-1-134-14
+begword eheschließ 15-125-15-156-2346
+midword eheschließ 2356-15-156-2346
+sufword ehesegen 15-125-15-234-15-1245-14
+midendword ehesegen 2356-15-234-15-1245-14
+begword ehesemin 15-125-15-234-12356-35
+midword ehesemin 2356-15-234-12356-35
+sufword ehestand 15-125-15-2-23456
+midendword ehestand 2356-15-2-23456
+begword eheständ 15-125-15-5-23456
+midendword eheständ 2356-15-5-23456
+always leiheschein 123-146-125-15-156-1246
+always leiheschuld 123-146-125-15-156-136-123-145
+always mathestund 134-1-2345-125-15-23456-256-145
+always vlies 1236-123-346-234
+always geniestreich 1245-14-346-23456-1235-146-1456
+always spezies 234-1234-15-1356-24-123456
+always troubleshoot 2345-1235-135-136-12-123-15-234-125-135-135-2345
+always mühlespiel 134-1256-125-123-15-2-346
+always teileseit 2345-146-123-15-234-146-2345
+prfword teileseite 2345-146-123-15-234-146-236
+always chilesalpeter 1456-24-123-15-234-25-1234-15-2345-12456
+sufword achilles 1-1456-24-12345-123456
+midword achilles 56-24-12345-123456
+always güllesilo 1245-1256-12345-15-234-24-123-135
+always moleskin 134-135-123-15-234-13-35
+always solesalz 234-135-123-15-234-25-1356
+always herkules 125-12456-13-136-123-123456
+always stylesheet 23456-6-13456-123-15-234-125-15-15-2345
+always frameset 124-1235-1-134-15-234-15-2345
+always damespiel 145-1-134-15-2-346
+always damestein 145-1-134-15-23456-1246
+always ruhmes 1235-136-125-134-123456
+always timesharing 2345-24-134-15-234-125-356-35-1245
+always stammes 23456-1-1346-123456
+always stammessen 23456-1-1346-15-2346-14
+always messtechnik 134-15-2346-2345-13
+always messtechnisch 134-15-2346-2345-156
+always homespun 125-135-134-15-234-1234-256
+always armesünder 356-134-15-234-1256-1345-145-12456
+always möhnesee 134-246-125-1345-15-234-15-15
+begmidword inlineskat 35-123-35-15-234-13-1-2345
+always mannes 134-1345-123456
+always sinnes 234-35-1345-123456
+always wonnesam 2456-135-1345-1345-15-2346
+always minnesang 134-35-1345-15-234-235-1245
+begmidword juliennesupp 245-136-123-24-14-1345-15-234-136-1234-1234
+always minnesänger 134-35-1345-15-234-345-1345-1245-12456
+always lonesome 123-135-1345-15-234-135-134-15
+always onestep 135-1345-15-23456-15-1234
+always marneschlacht 134-356-1345-15-156-123-56-2345
+always coesfeld 6-14-135-15-234-124-13456-145
+always soest 234-135-15-23456
+begmidword benzoesäur 12-14-1356-135-15-234-34-1235
+always rippespeer 1235-24-1234-1234-15-234-1234-15-15-1235
+always herpes 125-12456-1234-123456
+always typesatz 2345-6-13456-1234-15-234-1356
+always typeset 2345-6-13456-1234-15-234-15-2345
+always typesetz 2345-6-13456-1234-15-2-15
+always research 1235-15-234-15-1-1235-1456
+prfword reset 1235-15-234-15-2345
+begword reset 1235-15-234-15-2345
+always resozial 1235-15-234-123
+begmidword crescend 6-14-1235-15-234-6-14-14-145
+always heeres 125-15-15-1235-123456
+always meeres 134-15-15-1235-123456
+always schweresinn 156-2456-12456-15-234-35-1345
+always unseresteils 256-234-12456-123456-2345-146-123-234
+always chiffreschrift 1456-24-124-124-1235-15-156-2345
+always kongress 13-135-1345-1245-1235-15-2346
+always jahres 245-1235-123456
+begmidword shiresauc 234-125-24-1235-15-234-16-6-14
+always empirestil 12356-1234-24-1235-15-23456-24-123
+always toresschluss 2345-26-123456-156-123-136-2346
+always preshave 1234-1235-15-234-125-1-1236-15
+always presse 1234-1235-15-2346-15
+prfword pressen 1234-1235-15-2346-14
+prfword pressens 1234-1235-15-2346-14-234
+always zypressen 1356-6-13456-1234-1235-15-2346-14
+always pressend 1234-1235-15-2346-14-145
+always pressengestell 1234-1235-15-2346-14-12346-2-13456
+prfword presser 1234-1235-15-2346-12456
+always erpresser 12456-1234-1235-15-2346-12456
+always presserei 1234-1235-15-2346-12456-146
+prfword pressern 1234-1235-15-2346-12456-1345
+prfword pressers 1234-1235-15-2346-12456-234
+endword presses 1234-1235-15-2346-123456
+prfword pressest 1234-1235-15-2346-15-23456
+always dürreschaden 145-1256-1235-1235-15-156-1-145-14
+always dürreschäden 145-1256-1235-1235-15-156-345-145-14
+always irresein 24-1235-1235-15-234-1246
+always entresol 14-2345-1235-15-234-135-123
+begmidword löseschalt 123-246-234-15-156-25-2345
+always verseschmied 1236-12456-234-15-156-134-346-145
+always sauseschritt 234-16-234-15-156-1235-24-2345-2345
+begmidword löseschwell 123-246-234-15-156-2456-15-12345
+before s begmidword messe 134-15-2346-15
+before s begmidword klasse 13-123-1-2346-15
+always reisessen 1235-146-234-15-2346-14
+always hansestadt 125-235-234-15-23456-1-145-2345
+begmidword hansestäd 125-235-234-15-23456-345-145
+begmidword lösesumm 123-246-234-15-234-136-1346
+always matestrauch 134-1-236-23456-1235-16-1456
+always matesträucher 134-1-236-23456-1235-34-1456-12456
+always diabetes 145-24-1-23-2345-123456
+begmidword whitespac 2456-125-24-236-234-1234-1-6-14
+prfword werteste 2456-12456-236-23456-15
+prfword wertestem 2456-12456-236-23456-12356
+prfword wertesten 2456-12456-236-23456-14
+prfword wertester 2456-12456-236-23456-12456
+prfword wertestes 2456-12456-236-23456-123456
+always geistes 1245-146-23456-123456
+always gottes 1245-135-2345-2345-123456
+always noisetteschoko 1345-135-24-234-15-2345-236-156-135-13-135
+always flötespiel 124-123-246-236-2-346
+always treueschwur 2345-1235-126-15-156-2456-136-1235
+always blues 12-123-136-15-234
+always lovestory 123-135-1236-15-23456-26-6-13456
+begmidword bayessch 12-1-6-13456-123456-156
+always rallyesport 1235-1-12345-6-13456-15-234-1234-26-2345
+sufword prozess 12345-1356-15-2346
+sufword prozession 12345-1356-15-2346-245
+midendword prozess 1234-1235-135-1356-15-2346
+midendword prozession 1234-1235-135-1356-15-2346-245
+always gesetzes 12346-2-15-123456
+before s begmidword lakritze 123-1-13-1235-24-2345-1356-15
+
+# ETWA (4.4 Zweiformige Kürzungen)
+always etwa 15-1
+always sweetwater 234-2456-15-15-2345-2456-1-2345-12456
+always mietwagen 134-346-2345-2456-1-1245-14
+begmidword paketwaa 1234-1-13-15-2345-2456-1-1
+always paketwagen 1234-1-13-15-2345-2456-1-1245-14
+begmidword netwar 1345-15-2345-2456-356
+begmidword wetwar 2456-15-2345-2456-356
+always internet 35-2345-12456-1345-15-2345
+
+# ETWAS (4.4 Zweiformige Kürzungen)
+always etwas 2345-2456
+
+# EU  (4.1 Lautgruppenkürzungen)
+word eu 15-136
+always eu 126
+midendword eunkosten 15-256-13-135-23456-14
+always timaeus 2345-24-134-1-15-136-234
+always glutaeus 1245-123-136-2345-1-15-136-234
+always sterbeuhr 23456-12456-23-136-125-1235
+before u begmidword werbe 2456-12456-23
+always beunruhig 23-256-1235-136-125-45
+always beurkund 23-136-1235-13-256-145
+always beurlaub 23-136-1235-123-16-12
+always beurteil 23-136-1235-2345-146-123
+before u begmidword gewebe 12346-2456-15-23
+before u begword probe 12345-23
+before u midword probe 1234-1235-135-23
+before u begmidword vice 1236-24-6-14-15
+before u begmidword lyce 123-6-13456-6-14-15
+always deus 145-15-136-234
+before u begmidword lade 123-1-145-15
+before u begmidword bade 12-1-145-15
+always amadeus 1-134-1-145-15-136-234
+before u begmidword parade 1234-356-1-145-15
+sufword tedeum 2345-15-145-15-136-134
+always tedeum 236-145-15-136-134
+before u begmidword lande 123-235-145-15
+before u begmidword ländeunter 123-345-1345-145-15
+before u begmidword gemeinde 12346-134-1246-145-15
+always gemeindeutsch 12346-134-1246-145-156
+always spondeus 234-1234-135-1345-145-15-136-234
+before u begmidword kunde 13-256-145-15
+always codeum 6-14-135-145-15-136-134
+always spreeufer 234-1234-1235-15-15-136-124-12456
+always seeufer 234-15-15-136-124-12456
+always seeum 234-15-15-136-134
+always seeun 234-15-15-256
+before u begmidword hilfe 125-24-123-124-15
+before u begmidword beinahe 2-12-1345-1-125-15
+always rechercheur 1235-15-1456-12456-1456-126-1235
+before u begmidword recherche 1235-15-1456-12456-1456-15
+before u begmidword ruhe 1235-136-125-15
+before u begmidword leihe 123-146-125-15
+always theurg 2345-125-15-136-1235-1245
+midendword theus 2345-125-15-136-234
+always makeup 134-1-13-15-136-1234
+always bakkalaure 12-1-13-13-25-16-1235-15
+before u begmidword stärke 23456-345-1235-13-15
+always aleuten 25-15-136-2345-14
+always aleutisch 25-15-136-2345-24-156
+always nucleus 1345-136-6-14-123-15-136-234
+before u begmidword kohle 13-135-125-123-15
+always ileus 24-123-15-136-234
+always nukleus 1345-136-13-123-15-136-234
+always oleum 135-123-15-136-134
+always linoleum 123-35-135-123-15-136-134
+always petroleum 1234-15-2345-1235-135-123-15-136-134
+always mausoleum 134-16-234-135-123-15-136-134
+always herculaneum 125-12456-6-14-136-123-235-15-136-134
+before u begmidword marine 134-356-35-15
+before u begmidword routine 1235-135-136-2345-35-15
+always marneufer 134-356-1345-15-136-124-12456
+always oeuvre 246-136-1236-1235-15
+before u begmidword ware 2456-356-15
+before u begmidword reise 1235-146-234-15
+always themseufer 2345-125-12356-234-15-136-124-12456
+before u begmidword presse 1234-1235-15-2346-15
+always colosseum 6-14-135-123-135-2346-15-136-134
+always kolosseum 13-135-123-135-2346-15-136-134
+always museum 134-136-234-15-136-134
+before u begmidword gehäuse 12346-125-34-234-15
+before u begmidword geräte 12346-1235-345-236
+before u begmidword elite 13456-24-236
+before u begmidword vize 1236-24-1356-15
+always andrözeum 235-145-1235-246-1356-15-136-134
+always lyzeum 123-6-13456-1356-15-136-134
+
+# EX-  (4.2.1 Vorsilbenkürzungen)
+word ex 15-6-1346
+begword ex 1346
+
+# FAHR FÄHR (4.3.6 Kommakürzungen)
+always fahr 2-1235
+always fähr 5-1235
+
+# FALL FÄLL (4.4 Zweiformige Kürzungen)
+always fall 124-12345
+always fäll 5-124-12345
+always fallib 124-1-12345-24-12
+
+# -FALLS 4.2.1 a) Nachsilbenkürzungen
+word falls 124-12345-234
+midendword falls 124
+always fallschirm 124-12345-156-24-1235-134
+always fallspezifisch 124-12345-234-1234-15-1356-24-124-24-156
+always fallstatist 124-12345-23456-1-2345-24-23456
+begmidword fallstr 124-12345-23456-1235
+begmidword fallstudi 124-12345-23456-136-145-24
+always fallsucht 124-12345-234-136-1456-2345
+always fallsüchtig 124-12345-234-1256-1456-2345-45
+always abfall 1-12-124-12345
+always randfall 1235-235-145-124-12345
+always mordfall 134-26-145-124-12345
+always befall 23-124-12345
+always schneefall 156-1345-15-15-124-12345
+always pflegefall 1234-124-123-15-12346-124-12345
+always garantiefall 1245-356-235-2345-346-124-12345
+always kniefall 13-1345-346-124-12345
+sufword ausnahmefall 34-1345-134-15-124-12345
+always ausnahmefall 16-234-1345-134-15-124-12345
+always härtefall 125-345-1235-236-124-12345
+always wegfall 2456-1245-124-12345
+always durchfall 2-1456-124-12345
+always beifall 2-12-124-12345
+always rückfall 1235-46-124-12345
+always idealfall 24-145-15-25-124-12345
+always spezialfall 234-1234-15-1356-24-25-124-12345
+always normalfall 1345-26-134-25-124-12345
+always kriminalfall 13-1235-24-134-35-25-124-12345
+always eventualfall 15-1236-14-2345-136-25-124-12345
+always regelfall 1235-15-1245-13456-124-12345
+always spielfall 2-346-124-12345
+always einzelfall 1246-1356-13456-124-12345
+sufword problemfall 12345-12-123-12356-124-12345
+always problemfall 1234-1235-135-12-123-12356-124-12345
+sufword extremfall 1346-2345-1235-12356-124-12345
+always extremfall 15-6-1346-2345-1235-12356-124-12345
+always heimfall 125-146-134-124-12345
+always anfall 235-124-12345
+always sündenfall 234-1256-1345-145-14-124-12345
+always regenfall 1235-15-1245-14-124-12345
+always zwischenfall 1356-2456-124-12345
+always krisenfall 13-1235-24-234-14-124-12345
+always einfall 1246-124-12345
+always rheinfall 1235-125-1246-124-12345
+always tonfall 2345-135-1345-124-12345
+always unfall 256-124-12345
+always überfall 2-1256-124-12345
+always sonderfall 234-135-1345-145-12456-124-12345
+always fehlerfall 124-2356-123-12456-124-12345
+always wasserfall 2456-1-2346-12456-124-12345
+always musterfall 134-136-23456-12456-124-12345
+always mauerfall 134-16-12456-124-12345
+always trauerfall 2345-1235-16-12456-124-12345
+sufword verfall 36-124-12345
+always verfall 1236-12456-124-12345
+always zerfall 1356-12456-124-12345
+always vorfall 2-26-124-12345
+always störfall 23456-246-1235-124-12345
+always krebsfall 13-1235-15-12-234-124-12345
+always todesfall 2345-135-145-123456-124-12345
+always bedarfsfall 23-145-356-124-234-124-12345
+always scheidungsfall 156-146-145-136-234-124-12345
+always anwendungsfall 235-2456-14-145-136-234-124-12345
+always wiederholungsfall 346-145-125-135-123-136-234-124-12345
+always berechnungsfall 23-1235-15-1456-1345-136-234-124-12345
+sufword versicherungsfall 36-234-3456-12456-136-234-124-12345
+always versicherungsfall 1236-12456-234-3456-12456-136-234-124-12345
+always sanierungsfall 234-235-346-1235-136-234-124-12345
+always glücksfall 1245-46-234-124-12345
+always unglücksfall 256-1245-46-234-124-12345
+always zweifelsfall 1356-2456-146-124-13456-234-124-12345
+always beispielsfall 2-12-2-346-234-124-12345
+always schadensfall 156-1-145-14-234-124-12345
+always rechtsfall 1235-2345-234-124-12345
+always gerichtsfall 12346-2-3456-234-124-12345
+always krankheitsfall 13-1235-235-13-125-234-124-12345
+sufword ausfall 34-124-12345
+always ausfall 16-234-124-12345
+word ausfallstor 34-124-12345-234-2345-135-1235
+begmidword ausfallstor 34-124-12345-234-2345-26
+midword ausfallstor 16-234-124-12345-234-2345-26
+endword ausfallstor 16-234-124-12345-234-2345-135-1235
+always fluchtfall 124-123-136-1456-2345-124-12345
+always kreditfall 13-1235-15-145-24-2345-124-12345
+always streitfall 23456-1235-146-2345-124-12345
+always konfliktfall 13-135-1345-124-123-24-13-2345-124-12345
+always notfall 1345-135-2345-124-12345
+prfword notfalls 1345-135-2345-124 ### Homonym
+always fortfall 124-26-2345-124-12345
+always höchstfall 125-246-1456-23456-124-12345
+sufword testfall 2345-15-23456-124-12345
+always testfall 236-23456-124-12345
+always ernstfall 12456-1345-23456-124-12345
+sufword verlustfall 36-123-136-23456-124-12345
+always verlustfall 1236-12456-123-136-23456-124-12345
+always zufall 2-1356-124-12345
+always präzedenzfall 1234-1235-345-1356-15-145-14-1356-124-12345
+always grenzfall 1245-1235-14-1356-124-12345
+
+# FERTIG (4.4 Zweiformige Kürzungen)
+always fertig 124-45
+always kupfertiger 13-136-1234-124-12456-2345-45-12456
+
+# FOLG (4.4 Zweiformige Kürzungen)
+always folg 124-1245
+always folge 124-1245-15
+always folgen 124-1245-14
+before r begmidword folge 124-1245-15
+prfword folger 124-1245-12456
+midword folgerfrag 124-1245-12456-124-1235
+midendword folgerklausel 124-1245-12456-13-123-16-234-13456
+prfword folgere 124-1245-12456-15
+always folgern 124-1245-12456-1345
+always folgerin 124-1245-12456-35
+midendword folgerpaar 124-1245-12456-1234-1-1-1235
+always folgers 124-1245-12456-234
+always folgerschaft 124-1245-12456-156
+prfword folgerserie 124-1245-12456-234-12456-24-15
+always folgerst 124-1245-12456-23456
+always folgert 124-1245-12456-2345
+prfword folgerte 124-1245-12456-236
+prfword folgertet 124-1245-12456-236-2345
+prfword folgertest 124-1245-12456-236-23456
+always folgerung 124-1245-12456-136
+always thronfolger 2345-125-1235-135-1345-124-1245-12456
+sufword verfolger 36-124-1245-12456
+prfword folges 124-1245-123456
+prfword folgest 124-1245-15-23456
+prfword folgst 124-1245-23456
+
+# FRAG (4.4 Zweiformige Kürzungen)
+always frag 124-1235
+always frage 124-1235-15
+always fragen 124-1235-14
+prfword frager 124-1235-12456
+always fragerei 124-1235-12456-146
+prfword fragern 124-1235-12456-1345
+prfword fragers 124-1235-12456-234
+always fragil 124-1235-1-1245-24-123
+begmidword fragmen 124-1235-1-1245-134-14
+begmidword suffraget 234-136-124-124-1235-1-12346-2345
+
+# FREUND (4.4 Zweiformige Kürzungen)
+always freund 124-145
+always freundes 124-145-123456
+prfword freundest 124-145-15-23456
+
+# FÜHR (4.4 Zweiformige Kürzungen)
+always führ 124-125
+
+# FÜR (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word für 124
+always für-\s 2-124-36-0
+word für's 124-6-234
+always für 2-124
+always fürchte 124-1256-1235-1456-236
+always fürchten 124-1256-1235-1456-2345-14
+always fürchter 124-1256-1235-1456-2345-12456
+always fürchtig 124-1256-1235-1456-2345-45
+always fürchtung 124-1256-1235-1456-2345-136
+always fürst 124-1256-1235-23456
+
+# GANZ (4.4 Zweiformige Kürzungen)
+always ganz 1245-1356
+always gänz 5-1245-1356
+begmidword analoganzei 235-25-135-1245-235-1356-146
+always arroganz 356-1235-135-1245-235-1356
+always eleganz 13456-15-1245-235-1356
+begmidword jogginganz 245-135-1245-1245-35-1245-235-1356
+always organza 26-1245-235-1356-1
+always vaganz 1236-1-1245-235-1356
+
+# GE  (4.1 Lautgruppenkürzungen)
+word ge 1245-15
+always ge 12346
+always bungee 12-256-1245-15-15
+always dragee 145-1235-1-1245-15-15
+always neglig 1345-15-1245-123-24-1245
+begmidword flugech 124-123-136-1245-15-1456
+begmidword fluger 124-123-136-1245-12456
+always geysir 1245-15-6-13456-234-24-1235
+before u begmidword folge 124-1245-15
+before u begmidword sorge 234-26-12346
+sufword vergeud 36-1245-126-145
+midendword vergeud 1236-12456-1245-126-145
+sufword ausgeufer 34-12346-136-124-12456
+always ausgeufer 16-234-12346-136-124-12456
+always geupdated 12346-136-1234-145-1-236-145
+endword geur 1245-126-1235
+always geurteil 12346-136-1235-2345-146-123
+endword geure 1245-126-1235-15
+endword geurs 1245-126-1235-234
+endword geuze 1245-126-1356-15
+midword gex 1245-15-6-1346
+
+# GEh
+prfword geh 1245-15-125
+midendword gehabend 1245-2356-1-12-14-145
+begmidword gehanz 1245-2356-235-1356
+always gehbahn 1245-2356-12-1-125-1345
+prfword gehbar 1245-2356-12-1-1235
+begmidword gehbar 1245-2356-12-356
+always gehbelag 1245-2356-23-123-1-1245
+begmidword gehbeläg 1245-2356-23-123-345-1245
+always gehbehind 1245-2356-23-125-35-145
+prfword gehe 1245-2356-15
+always gehen 1245-2356-14
+always gehenk 12346-125-14-13
+begmidword legehenn 123-15-12346-125-14-1345
+always geher 1245-2356-12456
+always geherrsch 12346-1235-1235-156
+always geherrschaft 12346-1235-1235-156-1-124-2345
+before konsonant begmidword geh 1245-2356
+always gehunfähig 1245-2356-256-124-345-125-45
+always gehuni 1245-2356-256-24
+always gehung 1245-2356-136
+# GEi
+always gei 1245-146
+begmidword geirr 12346-24-1235-1235
+begmidword geimpf 12346-24-134-1234-124
+begmidword folgeimpf 124-1245-15-24-134-1234-124
+# GEin
+always gein 1245-1246
+midword geinhal 12346-35-125-25
+midword geinit 12346-35-24-2345
+midword geinstit 12346-35-23456-24-2345
+midword geinstrum 12346-35-23456-1235-136-134
+midword geintens 12346-35-2345-14-234
+midword geintent 12346-35-2345-14-2345
+# GEl
+prfword gel 1245-13456
+before konsonant begword gel 1245-13456
+always gelatin 1245-13456-1-2345-35
+always geln 1245-13456-1345
+prfword gels 1245-13456-234
+always gelchen 1245-13456-1456-14
+always gelb 1245-13456-12
+prfword gelbe 1245-13456-12-15
+always geld 1245-13456-145
+always gelee 1245-13456-15-15
+prfword geleerte 12346-123-15-15-1235-236
+always geleert 12346-123-15-15-1235-2345
+after g midword elektr 13456-15-13-2345-1235
+midword gelektr 1245-13456-15-13-2345-1235
+syllable gelier 1245-13456-346-1235
+always gell 12346-12345
+always gelnhaus 1245-13456-1345-125-16-234
+always gels 1245-13456-234
+prfword gelst 1245-13456-23456
+always gelt 1245-13456-2345
+prfword gelte 1245-13456-236
+prfword geltet 1245-13456-236-2345
+always gelynch 12346-123-6-13456-1345-1456
+always gelz 1245-13456-1356
+before l midendword drainage 145-1235-1-24-1345-1-12346
+before l midendword dränage 145-1235-345-1345-1-12346
+always hagel 125-1-1245-13456
+always nagel 1345-1-1245-13456
+always nägel 1345-345-1245-13456
+always wägel 2456-345-1245-13456
+always zagel 1356-1-1245-13456
+always egel 15-1245-13456
+syllable gelübd 12346-123-1256-12-145
+always badegelegen 12-1-145-15-1245-1245
+always zugrundegeleg 2-1356-1245-145-15-12346-123-15-1245
+always zugrundegelegen 2-1356-1245-145-15-1245-1245
+always nahegeleg 1345-1-125-15-12346-123-15-1245
+always nahegelegen 1345-1-125-15-1245-1245
+always rachege 1235-56-15-12346
+always rachegeist 1235-56-15-1245-146-23456
+always treuege 2345-1235-126-15-12346
+always treuegeld 2345-1235-126-15-1245-13456-145
+begmidword messegeländ 134-15-2346-15-12346-123-345-1345-145
+always schniegel 156-1345-346-1245-13456
+always spiegel 234-1234-346-1245-13456
+always riegel 1235-346-1245-13456
+always siegel 234-346-1245-13456
+always tiegel 2345-346-1245-13456
+always wiegel 2456-346-1245-13456
+always ziegel 1356-346-1245-13456
+always kegel 13-15-1245-13456
+always flegel 124-123-15-1245-13456
+before l begmidword pflege 1234-124-123-15-12346
+always schlegel 156-123-15-1245-13456
+before l begmidword college 6-14-135-12345-15-12346
+always pegel 1234-15-1245-13456
+always regel 1235-15-1245-13456
+begmidword irrege 24-1235-1235-15-12346
+begmidword irregeh 24-1235-1235-15-1245-2356
+always segel 234-15-1245-13456
+always schmuggel 156-134-136-1245-1245-13456
+always duschgel 145-136-156-1245-13456
+always duschgelegenheit 145-136-156-1245-1245-125
+sufword igel 24-1245-13456
+midendword igel 45-13456
+always eigel 146-1245-13456
+always fejgel 124-15-245-1245-13456
+before l begmidword zeige 1356-146-12346
+before l begmidword freige 124-1235-146-12346
+always freigelegen 124-1235-146-1245-1245
+before l begmidword zweige 1356-2456-146-12346
+always seeigel 234-15-15-45-13456
+always angel 235-1245-13456
+begmidword angelach 235-12346-123-56
+begmidword angeläch 235-12346-123-345-1456
+always angelager 235-12346-123-1-1245-12456
+always angeland 235-12346-123-235-145
+always angelang 235-12346-123-1245
+always angelass 235-12346-2-123
+always angelast 235-12346-123-1-23456
+always angelatsch 235-12346-123-1-2345-156
+always angelauf 235-12346-123-16-124
+always angelautet 235-12346-123-16-236-2345
+prfword angelautete 235-12346-123-16-236-236
+always angeläutet 235-12346-123-34-236-2345
+prfword angeläutete 235-12346-123-34-236-236
+always angelegen 235-1245-1245
+always angelegt 235-12346-123-15-1245-2345
+prfword angelegte 235-12346-123-15-1245-236
+always angelegtest 235-12346-123-15-1245-236-23456
+begmidword angelehn 235-12346-123-2356-1345
+begmidword angeleier 235-12346-123-146-12456
+always angeleimt 235-12346-123-146-134-2345
+prfword angeleimte 235-12346-123-146-134-236
+always angeleint 235-12346-123-1246-2345
+prfword angeleinte 235-12346-123-1246-236
+always angeleitet 235-12346-123-146-236-2345
+prfword angeleitete 235-12346-123-146-236-236
+always angelenk 235-12346-123-14-13
+always angelernt 235-12346-123-12456-1345-2345
+prfword angelernte 235-12346-123-12456-1345-236
+always angelesen 235-12346-123-123456-14
+begmidword angeleuch 235-12346-123-126-1456
+always evangeli 15-1236-235-1245-13456-24
+always evangelistisch 15-1236-235-1245-13456-5-156
+always angeliefert 235-12346-123-346-124-12456-2345
+prfword angelieferte 235-12346-123-346-124-12456-236
+always angelob 235-12346-123-135-12
+always angelock 235-12346-123-135-46
+always angelog 235-12346-123-135-1245
+always angelötet 235-12346-123-246-236-2345
+prfword angelötete 235-12346-123-246-236-236
+always gängel 1245-345-1345-1245-13456
+always mangel 134-235-1245-13456
+always mängel 134-345-1345-1245-13456
+always drängel 145-1235-345-1345-1245-13456
+always stängel 23456-345-1345-1245-13456
+always engel 14-1245-13456
+always stuben 23456-136-12-14
+always kirchen 13-24-1235-1456-14
+always glocken 1245-123-135-46-14
+always trocken 2345-1235-135-46-14
+always offen 135-124-124-14
+always schellen 156-15-12345-14
+always rollen 1235-135-12345-14
+always tengel 2345-14-1245-13456
+begmidword totenge 2345-135-2345-14-12346
+begmidword wüstenge 2456-1256-23456-14-12346
+always kettengelenk 13-15-2345-2345-14-12346-123-14-13
+always spitzen 234-1234-24-2345-1356-14
+midword engelächt 14-12346-123-345-1456-2345
+midword engeländ 14-12346-123-345-1345-145
+always engelass 14-12346-2-123
+always engelaut 14-12346-123-16-2345
+prfword engelaute 14-12346-123-16-236
+midendword engeleit 14-12346-123-146-2345
+midendword engelenk 14-12346-123-14-13
+midword engelern 14-12346-123-12456-1345
+always bengel 12-14-1245-13456
+prfword gemengelage 12346-134-14-12346-123-1-12346
+prfword gemengelagen 12346-134-14-12346-123-1-1245-14
+begmidword außengeländ 16-2346-14-12346-123-345-1345-145
+always stengel 23456-14-1245-13456
+always ingelheim 35-1245-13456-125-146-134
+always schlingel 156-123-35-1245-13456
+always klingel 13-123-35-1245-13456
+always pingel 1234-35-1245-13456
+always ringel 1235-35-1245-13456
+always tingel 2345-35-1245-13456
+always zingel 1356-35-1245-13456
+always klüngel 13-123-1256-1345-1245-13456
+always züngel 1356-1256-1345-1245-13456
+always kogel 13-135-1245-13456
+always mogel 134-135-1245-13456
+always vogel 1236-135-1245-13456
+always vögel 1236-246-1245-13456
+always spargel 234-1234-356-1245-13456
+always mergel 134-12456-1245-13456
+always pergel 1234-12456-1245-13456
+always orgel 26-1245-13456
+before l midword fürsorge 2-124-234-26-12346
+before l midword vorsorge 2-26-234-26-12346
+always torgelegen 2345-26-1245-1245
+always nörgel 1345-246-1235-1245-13456
+always spörgel 234-1234-246-1235-1245-13456
+always gurgel 1245-136-1235-1245-13456
+always äugel 34-1245-13456
+always bügel 12-1256-1245-13456
+always hügel 125-1256-1245-13456
+always gugel 1245-136-1245-13456
+always kugel 13-136-1245-13456
+always kügel 13-1256-1245-13456
+always klügel 13-123-1256-1245-13456
+always flügel 124-123-1256-1245-13456
+always prügel 1234-1235-1256-1245-13456
+always zügel 1356-1256-1245-13456
+# GEm
+prfword gem 1245-12356
+always gement 1245-12356-14-2345
+always geminat 1245-12356-35-1-2345
+always gemination 1245-12356-35-5-1345
+always gemini 1245-12356-35-24
+always geminier 1245-12356-35-346-1235
+always trigeminus 2345-1235-24-1245-12356-35-136-234
+always hegemon 125-15-1245-12356-135-1345
+syllable gems 1245-12356-234
+# GEn
+always gen 1245-14
+always genabel 12346-1345-1-12-13456
+prfword genadelte 12346-1345-1-145-13456-236
+always genadelt 12346-1345-1-145-13456-2345
+begmidword genäch 12346-1345-345-1456
+begmidword genag 12346-1345-1-1245
+begmidword genagent 1245-14-1-1245-14-2345
+begmidword genäh 12346-1345-345-125
+midendword genähnlich 1245-14-345-456
+always genannt 12346-1345-235-1345-2345
+prfword genannte 12346-1345-235-1345-236
+always genanntest 12346-1345-235-1345-236-23456
+begmidword genarb 12346-1345-356-12
+midendword genarbeit 1245-14-356-12
+begmidword genarr 12346-1345-356-1235
+prfword genas 12346-1345-1-234
+always genäs 12346-1345-345-234
+always genäss 12346-1345-345-2346
+always genäschig 12346-1345-345-156-45
+always genascht 12346-1345-1-156-2345
+prfword genaschte 12346-1345-1-156-236
+prfword genasen 12346-1345-1-234-14
+always genasführ 12346-1345-1-234-124-125
+always genatur 12346-1345-2345
+always genatürlich 12346-1345-456
+always genau 12346-1345-16
+always garagen 1245-356-1-1245-14
+always lagenauf 123-1-1245-14-2-16
+always lagenaus 123-1-1245-14-16-234
+always magenauf 134-1-1245-14-2-16
+always magenaus 134-1-1245-14-16-234
+always regenauf 1235-15-1245-14-2-16
+always regenaus 1235-15-1245-14-16-234
+always eigenauf 146-1245-14-2-16
+always eigenaus 146-1245-14-16-234
+always felgenaus 124-13456-1245-14-16-234
+always stangenauf 23456-235-1245-14-2-16
+always stangenaus 23456-235-1245-14-16-234
+always mengenauf 134-14-1245-14-2-16
+always mengenaus 134-14-1245-14-16-234
+always zwergen 1356-2456-12456-1245-14
+always morgenauf 134-26-1245-14-2-16
+always morgenaus 134-26-1245-14-16-234
+always röntgen 1235-246-1345-2345-1245-14
+always augenauf 16-1245-14-2-16
+always augenaus 16-1245-14-16-234
+always zeugen 1356-126-1245-14
+always zeugeneid 1356-126-12346-1345-146-145
+always geneckt 12346-1345-15-46-2345
+prfword geneckte 12346-1345-15-46-236
+always genehm 12346-1345-125
+always geneidet 12346-1345-146-145-15-2345
+prfword geneidete 12346-1345-146-145-15-236
+always geneig 12346-1345-146-1245
+always geneppt 12346-1345-15-1234-1234-2345
+prfword geneppte 12346-1345-15-1234-1234-236
+always generv 12346-1345-12456-1236
+# HOMONYM
+sufword genes 1245-14-123456
+# HOMONYM
+prfword genesen 12346-1345-123456-14
+prfword genesene 12346-1345-123456-14-15
+prfword genesenem 12346-1345-123456-14-12356
+prfword genesenen 12346-1345-123456-14-14
+prfword genesener 12346-1345-123456-14-12456
+prfword genesenes 12346-1345-123456-14-123456
+always genesend 12346-1345-123456-14-145
+always genest 12346-1345-15-23456
+always genesung 12346-1345-123456-136
+always wiedergenes 346-145-12346-1345-123456
+always wiedergenest 346-145-12346-1345-15-23456
+always wiederzugenes 346-145-2-1356-12346-1345-123456
+always genesis 1245-14-123456-24-234
+always genesung 12346-1345-123456-136
+always genick 12346-1345-24-46
+word genien 1245-14-24-14
+always geniesel 12346-1345-346-234-13456
+prfword geniest 12346-1345-346-23456
+always genieß 12346-1345-346-2346
+always genietet 12346-1345-346-236-2345
+prfword genietete 12346-1345-346-236-236
+always genipp 12346-1345-24-1234-1234
+always genistet 12346-1345-24-23456-15-2345
+prfword genistete 12346-1345-24-23456-15-236
+always genöl 12346-1345-246-123
+always orangenöl 26-235-1245-14-246-123
+always genommen 12346-1345-1346
+always genopp 12346-1345-135-1234-1234
+always genörgel 12346-1345-246-1235-1245-13456
+always genordet 12346-1345-26-145-15-2345
+prfword genordete 12346-1345-26-145-15-236
+always genormt 12346-1345-26-134-2345
+prfword genormte 12346-1345-26-134-236
+always genötig 12346-1345-246-2345-45
+syllable genoss 12346-1345-135-2346
+syllable genöss 12346-1345-246-2346
+always genuckel 12346-1345-136-46-13456
+always genudel 12346-1345-136-145-13456
+always genug 12346-1345-136-1245
+always genüg 12346-1345-1256-1245
+always genüge 12346-1345-1256-12346
+always genügen 12346-1345-1256-1245-14
+always genüchter 12346-1345-1256-1456-2345-12456
+always genuschel 12346-1345-136-156-13456
+always genuss 12346-1345-136-2346
+# Alte Rechtschreibung
+always genuß 12346-1345-136-2346
+syllable genüss 12346-1345-1256-2346
+always genutz 12346-1345-1356
+always genütz 12346-5-1345-1356
+# GEr
+prfword ger 1245-12456
+after g midendword erlaubnis 12456-123-16-12-1346
+sufword gerd 1245-12456-145
+prfword gere 1245-12456-15
+prfword gerei 1245-12456-146
+prfword gereien 1245-12456-146-14
+prfword geren 1245-12456-14
+always gers 1245-12456-234
+always gersund 1245-12456-234-256-145
+sufword gert 1245-12456-2345
+word gerte 1245-12456-236
+always gern 1245-12456-1345
+midendword gerlich 1245-12456-456
+always gerald 1245-12456-25-145
+always gerani 1245-12456-235-24
+always gerant 1245-12456-235-2345
+always gerard 1245-12456-356-145
+always gerb 1245-12456-12
+midword gerbe 1245-12456-23
+midendword gerberg 1245-12456-12-12456-1245
+endword gerberge 1245-12456-12-12456-12346
+prfword gerben 1245-12456-12-14
+prfword gerber 1245-12456-12-12456
+always gerbera 1245-12456-12-12456-1
+always gerberei 1245-12456-12-12456-146
+always gerberin 1245-12456-12-12456-35
+prfword gerbern 1245-12456-12-12456-1345
+prfword gerbers 1245-12456-12-12456-234
+always gerbrück 1245-12456-12-1235-1256-46
+always gerecht 12346-1235-2345
+always folgerecht 124-1245-15-1235-2345
+syllable gerfalk 1245-12456-124-25-13
+midword gergeb 1245-12456-12346-12
+always gerh 1245-12456-125
+always prediger 1234-1235-15-145-45-12456
+always geria 1245-12456-24-1
+always niger 1345-45-12456
+prfword gerie 1245-12456-346
+prfword gerien 1245-12456-24-14
+sufword gerier 1245-12456-346-1235
+always suggerier 234-136-1245-1245-12456-346-1235
+always sengerig 234-14-1245-12456-45
+midendword ggerli 1245-1245-12456-123-24
+syllable gerlind 1245-12456-123-35-145
+always germ 1245-12456-134
+always angermund 235-1245-12456-134-256-145
+always igerm 45-12456-134
+always gern 1245-12456-1345
+word gero 1245-12456-135
+word geros 1245-12456-135-234
+always gerold 1245-12456-135-123-145
+always gerolf 1245-12456-135-123-124
+always geroni 1245-12456-135-1345-24
+always geront 1245-12456-135-1345-2345
+always gerr 1245-12456-1235
+always skagerak 234-13-1-1245-12456-1-13
+always skagerrak 234-13-1-1245-12456-1235-1-13
+begmidword seegerrin 234-15-15-1245-12456-1235-35
+always gershwin 1245-12456-234-125-2456-35
+always gerst 1245-12456-23456
+always gerstand 1245-12456-2-23456
+always gerständ 1245-12456-5-23456
+prfword gert 1245-12456-2345
+always gertrud 1245-12456-2345-1235-136-145
+prfword gerte 1245-12456-236
+prfword gertest 1245-12456-236-23456
+prfword gertet 1245-12456-236-2345
+always gertel 1245-12456-2345-13456
+endword gertem 1245-12456-2345-12356
+endword gerten 1245-12456-2345-14
+endword gerter 1245-12456-2345-12456
+endword gertes 1245-12456-2345-123456
+always gerten 1245-12456-2345-14
+prfword gerts 1245-12456-2345-234
+midendword gertrag 1245-12456-2345-1245
+midword gerträg 1245-12456-5-2345-1245
+syllable gerundi 1245-12456-256-145-24
+midendword gerung 1245-12456-136
+syllable gerusi 1245-12456-136-234-24
+syllable gervasi 1245-12456-1236-1-234-24
+syllable gerwig 1245-12456-2456-45
+syllable gerwin 1245-12456-2456-35
+always haager 125-1-1-1245-12456
+always hager 125-1-1245-12456
+always häger 125-345-1245-12456
+always jäger 245-345-1245-12456
+always lager 123-1-1245-12456
+always lagerichtig 123-1-12346-2-3456-45
+always lagereg 123-1-12346-1235-15-1245
+always läger 123-345-1245-12456
+always lageraum 123-1-12346-1235-16-134
+always lageräum 123-1-12346-1235-34-134
+before er begmidword anlage 235-123-1-12346
+prfword anlagern 235-123-1-1245-12456-1345
+always anlagert 235-123-1-1245-12456-2345
+always anlagerst 235-123-1-1245-12456-23456
+prfword anlagerte 235-123-1-1245-12456-236
+always anlagerung 235-123-1-1245-12456-136
+before er begmidword klage 13-123-1-12346
+prfword klager 13-123-1-1245-12456
+prfword klagern 13-123-1-1245-12456-1345
+prfword klagers 13-123-1-1245-12456-234
+always kläger 13-123-345-1245-12456
+always einlieger 1246-123-346-1245-12456
+always mager 134-1-1245-12456
+always klimagerät 13-123-24-134-1-12346-1235-345-2345
+prfword klimageräte 13-123-24-134-1-12346-1235-345-236
+begmidword spermage 234-1234-12456-134-1-12346
+always nager 1345-1-1245-12456
+always manager 134-235-1-1245-12456
+always drainagerohr 145-1235-1-24-1345-1-12346-1235-135-125-1235
+always spionagering 234-1234-24-135-1345-1-12346-1235-35-1245
+prfword spionageringe 234-1234-24-135-1345-1-12346-1235-35-12346
+always spionageroman 234-1234-24-135-1345-1-12346-1235-135-134-1-1345
+begmidword spionageroman 234-1234-24-135-1345-1-12346-1235-135-134-235
+always teenager 2345-15-15-1345-1-1245-12456
+always schräger 156-1235-345-1245-12456
+always prager 1234-1235-1-1245-12456
+always vager 1236-1-1245-12456
+always schwager 156-2456-1-1245-12456
+always schwäger 156-2456-345-1245-12456
+always voyager 1236-135-6-13456-1-1245-12456
+always cambridger 6-14-1-134-12-1235-24-145-1245-12456
+always ludger 123-136-145-1245-12456
+always feger 124-15-1245-12456
+always heger 125-15-1245-12456
+always hegereiter 125-15-12346-1235-146-2345-12456
+syllable gerüch 12346-1235-1256-1456
+always nahegerück 1345-1-125-15-12346-1235-46
+always bieger 12-346-1245-12456
+always flieger 124-123-346-1245-12456
+always auflieger 2-16-123-346-1245-12456
+always umlieger 136-134-123-346-1245-12456
+always anlieger 235-123-346-1245-12456
+always krieger 13-1235-346-1245-12456
+always sieger 234-346-1245-12456
+always schwieger 156-2456-346-1245-12456
+always wieger 2456-346-1245-12456
+always leger 123-15-1245-12456
+prfword ablegeregal 1-12-123-15-12346-1235-15-1245-1-123
+always ablegeregal 1-12-123-15-12346-1235-15-1245-25
+always legerohr 123-15-12346-1235-135-125-1235
+always legeröhr 123-15-12346-1235-246-125-1235
+always neger 1345-15-1245-12456
+always sühne 234-1256-125-1345-15
+prfword sühnel 234-1256-125-1345-13456
+always sühnen 234-1256-125-1345-14
+always reger 1235-15-1245-12456
+always integer 35-236-1245-12456
+before er begmidword wege 2456-1245-15
+prfword weger 2456-1245-12456
+prfword wegern 2456-1245-12456-1345
+prfword wegers 2456-1245-12456-234
+always wegerung 2456-1245-12456-136
+always norweger 1345-26-2456-15-1245-12456
+always wegerecht 2456-1245-15-1235-2345
+always bagger 12-1-1245-1245-12456
+always jagger 245-1-1245-1245-12456
+always egger 15-1245-1245-12456
+always digger 145-45-1245-12456
+always jigger 245-45-1245-12456
+always nigger 1345-45-1245-12456
+always trigger 2345-1235-45-1245-12456
+always jogger 245-135-1245-1245-12456
+always logger 123-135-1245-1245-12456
+always debugger 145-15-12-136-1245-1245-12456
+always fugger 124-136-1245-1245-12456
+always feiger 124-146-1245-12456
+always steiger 23456-146-1245-12456
+always geiger 1245-146-1245-12456
+always weiger 2456-146-1245-12456
+always schweigerecht 156-2456-146-12346-1235-2345
+always schwelger 156-2456-13456-1245-12456
+always schwelgeruch 156-2456-13456-12346-1235-136-1456
+always schwelgerüch 156-2456-13456-12346-1235-1256-1456
+always zeiger 1356-146-1245-12456
+always zeigeregister 1356-146-12346-1235-15-1245-24-23456-12456
+always pilger 1234-24-123-1245-12456
+always tilger 2345-24-123-1245-12456
+always holger 125-135-123-1245-12456
+begmidword mentholge 134-14-2345-125-135-123-12346
+prfword anger 235-1245-12456
+sufword angerdorf 235-1245-12456-145-26-124
+sufword angerdörfer 235-1245-12456-145-246-1235-124-12456
+prfword angern 235-1245-12456-1345
+prfword angern 235-1245-12456-234
+always fänger 124-345-1345-1245-12456
+always gänger 1245-345-1345-1245-12456
+always hanger 125-235-1245-12456
+always hänger 125-345-1345-1245-12456
+always hängereck 125-345-1345-12346-1235-15-46
+always hängereg 125-345-1345-12346-1235-15-1245
+always orangerie 26-235-1245-12456-346
+always orangerien 26-235-1245-12456-24-14
+always pranger 1234-1235-235-1245-12456
+always sänger 234-345-1345-1245-12456
+always tanger 2345-235-1245-12456
+always vanger 1236-235-1245-12456
+always wanger 2456-235-1245-12456
+prfword enger 14-1245-12456
+prfword engere 14-1245-12456-15
+prfword engerem 14-1245-12456-12356
+prfword engeren 14-1245-12456-14
+prfword engerer 14-1245-12456-12456
+prfword engeres 14-1245-12456-123456
+always engerling 14-1245-12456-123-35-1245
+prfword engerlinge 14-1245-12456-123-35-12346
+always inger 35-1245-12456
+midword ingerä 35-12346-1235-345
+midendword ingeruch 35-12346-1235-136-1456
+midword ingerüch 35-12346-1235-1256-1456
+always kerosin 13-12456-135-234-35
+always einge 1246-12346
+before r begmidword hinge 125-35-12346
+always vaihinger 1236-1-24-125-35-1245-12456
+prfword eingehe 1246-1245-2356-15
+always eingehen 1246-1245-2356-14
+always eingehst 1246-1245-2356-23456
+always eingeht 1246-1245-2356-2345
+always eingehung 1246-1245-2356-136
+always eingelb 1246-1245-13456-12
+always koffeingehalt 13-135-124-124-15-35-12346-125-25-2345
+always chemieingenieur 1456-12356-346-35-1245-14-24-126-1235
+always softwareingenieur 234-135-124-2345-2456-356-15-35-1245-14-24-126-1235
+always steingeiß 23456-1246-1245-146-2346
+always weingeist 2456-1246-1245-146-23456
+always termin 2345-12456-134-35
+always hongkonger 125-135-1345-1245-13-135-1345-1245-12456
+always hunger 125-256-1245-12456
+always junger 245-256-1245-12456
+always dünger 145-1256-1345-1245-12456
+always jünger 245-1256-1345-1245-12456
+always analoger 235-25-135-1245-12456
+always homologer 125-135-134-135-123-135-1245-12456
+always roger 1235-135-1245-12456
+always mikro 134-24-13-1235-135
+always elektro 13456-15-13-2345-1235-135
+always büro 12-1256-1235-135
+always dröger 145-1235-246-1245-12456
+always zöger 1356-246-1245-12456
+always arger 356-1245-12456
+begmidword polar 1234-135-123-356
+prfword nachbar 1345-56-12-1-1235
+begmidword nachbar 1345-56-12-356
+begmidword darge 145-356-12346
+prfword formular 124-26-134-136-123-1-1235
+begmidword formular 124-26-134-136-123-356
+begmidword disziplinar 145-24-234-1356-24-1234-123-35-356
+prfword sonar 234-135-1345-1-1235
+begmidword sonar 234-135-1345-356
+prfword altar 25-2345-1-1235
+begmidword altar 25-2345-356
+always faltarbeit 124-25-2345-356-12
+always ärger 345-1235-1245-12456
+always militär 134-24-123-24-2345-345-1235
+always berger 12-12456-1245-12456
+midendword bergeräusch 12-12456-12346-1235-34-156
+always silber 234-24-123-12-12456
+always oberge 135-12-12456-12346
+begmidword obergerman 135-12-12456-1245-12456-134-235
+always birger 12-24-1235-1245-12456
+always sorger 234-26-1245-12456
+always sorgerecht 234-26-12346-1235-2345
+always burger 12-136-1235-1245-12456
+always bürger 12-1256-1235-1245-12456
+always würger 2456-1256-1235-1245-12456
+always böttger 12-246-2345-2345-1245-12456
+always sauger 234-16-1245-12456
+always säuger 234-34-1245-12456
+always beuger 12-126-1245-12456
+always beugere 12-126-12346-1235-15
+always zeuger 1356-126-1245-12456
+always kluger 13-123-136-1245-12456
+always klüger 13-123-1256-1245-12456
+always pflüger 1234-124-123-1256-1245-12456
+always trüger 2345-1235-1256-1245-12456
+always krüger 13-1235-1256-1245-12456
+prfword zuger 1356-136-1245-12456
+always züger 1356-1256-1245-12456
+always metzger 134-15-2345-1356-1245-12456
+
+# GEs
+prfword ges 1245-123456
+always sagesatz 234-1245-15-234-1356
+always sagesätz 234-1245-15-5-234-1356
+always tages 2345-1-1245-123456
+always valuta 1236-25-136-2345-1
+always montage 134-135-1345-2345-1-12346
+prfword montagen 134-135-1345-2345-1-1245-14
+always sieges 234-346-1245-123456
+begword exeges 1346-15-1245-123456
+midword exeges 15-6-1346-15-1245-123456
+always ganges 1245-235-1245-123456
+prfword contergan 6-14-135-1345-2345-12456-1245-1-1345
+begmidword contergan 6-14-135-1345-2345-12456-1245-235
+always organgesellschaft 26-1245-235-1245-156
+always sanges 234-235-1245-123456
+always vogesen 1236-135-1245-123456-14
+always bergesh 12-12456-1245-123456-125
+always gess 12346-2346
+always gesag 12346-234-1245
+always gesäbel 12346-234-345-12-13456
+always gesäg 12346-5-234-1245
+always gesatz 12346-234-1356
+always gesätz 12346-5-234-1356
+always geschlag 12346-156-1245
+always geschläg 12346-5-156-1245
+always geschlängel 12346-156-123-345-1345-1245-13456
+always geschließ 12346-5-156-2346
+always geschnurr 12346-156-1345-136-1235-1235
+always geschreib 12346-156-12
+always geschrieb 12346-2-156
+always geschrift 12346-156-2345
+always geschunden 12346-156-256-145-14
+always gesetz 12346-2-15
+always algesie 25-1245-123456-346
+midendword gesima 1245-123456-24-134-1
+always gesind 12346-234-145
+always gesitz 12346-2-24
+always gesoll 12346-2-234
+always gest 12346-23456
+always gestaat 12346-23456-2345
+always gestand 12346-2-23456
+always geständ 12346-5-23456
+always gestion 12346-23456-245
+begmidword gestund 12346-23456-256-145
+always gesund 12346-234-256-145
+begmidword gesünd 12346-234-1256-1345-145
+word gesa 1245-123456-1
+word gesas 1245-123456-1-234
+word gese 1245-123456-15
+word geses 1245-123456-123456
+always gesozial 12346-234-123
+midword gesprach 12346-234-1234
+always gespräch 12346-5-234-1234
+midendword gesprung 12346-234-1234-1235-256-1245
+midword gesprüng 12346-234-1234-1235-1256-1345-1245
+endword gesprünge 12346-234-1234-1235-1256-1345-12346
+always gestell 12346-2-13456
+
+# GEGEN (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word gegen 1245
+always gegen-\s 2-1245-36-0
+always gegen 2-1245
+prfword gegend 12346-1245-14-145
+prfword gegenden 12346-1245-14-145-14
+midword gegenüg 12346-12346-1345-1256-1245
+
+# GEGENÜBER (4.4 Zweiformige Kürzungen)
+always gegenüber 1245-1256
+always gegenübertrag 2-1245-2-1256-2345-1245
+always gegenüberträg 2-1245-2-1256-5-2345-1245
+
+# GEGENWART GEGENWÄRT (4.4 Zweiformige Kürzungen)
+always gegenwart 1245-2456
+always gegenwärt 5-1245-2456
+
+# GELEGEN (4.4 Zweiformige Kürzungen)
+# HOMONYM
+always gelegen 1245-1245
+
+# GESCHÄFT (4.4 Zweiformige Kürzungen)
+always geschäft 1245-124
+
+# GESELLSCHAFT (4.4 Zweiformige Kürzungen)
+always gesellschaft 1245-156
+always gesellschafts 1245-156-234
+
+# GEWESEN (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word gewesen 12346
+always gewesen 2-12346
+always spionagewesen 234-1234-24-135-1345-1-12346-2456-123456-14
+
+# GEWORDEN (4.4 Zweiformige Kürzungen)
+always geworden 12346-2456
+
+# GIBT (4.4 Zweiformige Kürzungen)
+always gibt 1245-12
+word gibt's 1245-12-6-234
+
+# GLEICH (4.4 Zweiformige Kürzungen)
+always gleich 1245-1456
+
+# GLÜCK (4.4 Zweiformige Kürzungen)
+always glück 1245-46
+always unglück 256-1245-46
+
+# GROß GRÖß (4.4 Zweiformige Kürzungen)
+always groß 1245-2346
+always größ 5-1245-2346
+
+# GRUND GRÜND (4.4 Zweiformige Kürzungen)
+always grund 1245-145
+always gründ 5-1245-145
+word grundig 1245-1235-256-145-45
+always gründonnerstag 1245-1235-1256-1345-145-135-1345-1345-12456-234-2345-1-1245
+always gründüng 1245-1235-1256-1345-145-1256-1345-1245
+always joggingrund 245-135-1245-1245-35-1245-1235-256-145
+
+# HAB HÄB (4.3.6 Kommakürzungen)
+always hab 2-125
+always häb 5-125
+always habakuk 125-1-12-1-13-136-13
+always habanero 125-1-12-235-12456-135
+always habergeiß 125-1-12-12456-1245-146-2346
+sufword habermas 125-1-12-12456-134-1-234
+always habsburg 125-1-12-234-12-136-1235-1245
+sufword ahab 1-125-1-12
+sufword cahab 6-14-1-125-1-12
+sufword dhabi 145-125-1-12-24
+always viehab 1236-346-125-1-12
+always piranha 1234-24-1235-235-125-1
+always rohab 1235-135-125-1-12
+always alphabet 25-1234-125-1-23-2345
+prfword alphabete 25-1234-125-1-23-236
+always alphablock 25-1234-125-1-12-123-135-46
+always rhabarber 1235-125-1-12-356-12-12456
+always schuhab 156-136-125-1-12
+always frühab 124-1235-1256-125-1-12
+
+# HAFT HÄFT (4.4 Zweiformige Kürzungen)
+always haft 125-124
+always häft 5-125-124
+always behaft 23-125-124
+sufword shaft 234-125-1-124-2345
+
+# HAND HÄND (4.4 Zweiformige Kürzungen)
+always hand 125-145
+always händ 5-125-145
+word händels 125-345-1345-145-13456-234
+word handke 125-235-145-13-15
+word handkes 125-235-145-13-123456
+midendword ehand 15-125-145
+midword ehänd 15-5-125-145
+midendword tehand 236-125-145
+midword tehänd 236-5-125-145
+sufword luchterhand 123-136-1456-2345-12456-125-235-145
+
+# HAST (4.4 Zweiformige Kürzungen)
+always hast 125-23456
+always hastings 125-1-23456-35-1245-234
+always buddha 12-136-145-145-125-1
+always alphastrahl 25-1234-125-1-23456-1235-1-125-123
+
+# HAT (4.4 Zweiformige Kürzungen)
+always hat 125-2345
+begmidword aliphat 25-24-1234-125-1-2345
+prfword aliphate 25-24-1234-125-1-236
+begmidword alphat 25-1234-125-1-2345
+always daihatsu 145-1-24-125-1-2345-234-136
+sufword hatch 125-1-2345-1456
+always hatschi 125-1-2345-156-24
+always hatz 125-1-2345-1356
+always mahatma 134-1-125-1-2345-134-1
+prfword phatisch 1234-125-1-2345-24-156
+begmidword phatisch 1234-125-1-2345-24-156
+always phosphat 1234-125-135-234-1234-125-1-2345
+prfword phosphate 1234-125-135-234-1234-125-1-236
+always shatoo 234-125-1-2345-135-135
+sufword that 2345-125-1-2345
+always triumphat 2345-1235-24-136-134-1234-125-1-2345
+sufword verhatsch 36-125-1-2345-156
+midendword verhatsch 1236-12456-125-1-2345-156
+sufword what 2456-125-1-2345
+
+# HATT (4.3.4 Einformige Kürzungen, alleinstehend, mit Endungen oder in Wortverbindungen)
+always hatt 125
+always hattingen 125-1-2345-2345-35-1245-14
+always hattrick 125-1-2345-2345-1235-24-46
+begmidword trollhätt 2345-1235-135-12345-125-345-2345-2345
+prfword manhattan 134-235-125-1-2345-2345-1-1345
+begmidword manhattan 134-235-125-1-2345-2345-235
+always shatterhand 234-125-1-2345-2345-12456-125-235-145
+
+# HÄTT (4.3.4 Einformige Kürzungen, alleinstehend, mit Endungen oder in Wortverbindungen)
+always hätt 345
+
+# HAUPT HÄUPT (4.4 Zweiformige Kürzungen)
+always haupt 125-1234
+always häupt 5-125-1234
+
+# -HEIT  4.2.1 a) Nachsilbenkürzungen
+midendword heit 125
+midendword heits 125-234
+always heiter 125-146-2345-12456
+always hoheit 125-135-125-146-2345
+
+# HERR (4.4 Zweiformige Kürzungen)
+always herr 1235-1235
+always herrann 125-12456-1235-235-1345
+always herräum 125-12456-1235-34-134
+always herred 125-12456-1235-15-145
+always herreich 125-12456-1235-146-1456
+always herreis 125-12456-1235-146-234
+always herreist 125-12456-1235-146-23456
+always herreit 125-12456-1235-146-2345
+endword herreite 125-12456-1235-146-236
+always herreiß 125-12456-1235-146-2346
+always herrenn 125-12456-1235-14-1345
+always herricht 125-12456-2-3456
+always herrief 125-12456-1235-346-124
+always herrief 125-12456-1235-346-124
+always herrliberg 125-12456-1235-123-24-12-12456-1245
+always herroll 125-12456-1235-135-12345
+always herruf 125-12456-1235-136-124
+always herrück 125-12456-1235-46
+always herrühr 125-12456-1235-1256-125-1235
+always herrutsch 125-12456-1235-136-2345-156
+always daherr 145-125-1235
+always einherr 1246-125-12456-1235
+always höherr 125-246-125-12456-1235
+always sherry 234-125-12456-1235-6-13456
+always äther 345-2345-125-12456
+always luther 123-136-2345-125-12456
+
+# HIER (4.4 Zweiformige Kürzungen)
+always hier 125-1235
+always hierarch 125-24-12456-356-1456
+always hiero 125-24-12456-135
+always hierorts 125-1235-26-2345-234
+always cahier 6-14-1-125-24-12456
+midendword trahier 2345-1235-1-125-346-1235
+midendword strahier 23456-1235-1-125-346-1235
+sufword extrahier 1346-2345-1235-1-125-346-1235
+midendword extrahier 15-6-1346-2345-1235-1-125-346-1235
+always paraphier 1234-356-1-1234-125-346-1235
+always graphier 1245-1235-1-1234-125-346-1235
+always triumphier 2345-1235-24-136-134-1234-125-346-1235
+always trophier 2345-1235-135-1234-125-346-1235
+always strophier 23456-1235-135-1234-125-346-1235
+always morphierel 134-26-1234-125-346-1235-13456
+always thierr 2345-125-24-12456-1235
+
+# HOFF HÖFF (4.4 Zweiformige Kürzungen)
+always hoff 124-124
+always höff 5-124-124
+always hoffenster 125-135-124-124-14-23456-12456
+always hofflatter 125-135-124-124-123-1-2345-2345-12456
+always hofflimmer 125-135-124-124-123-24-1346-12456
+prfword hoffman 125-135-124-124-134-1-1345
+begmidword hoffman 125-135-124-124-134-235
+always hoffmann 125-135-124-124-134-235-1345
+always hoffrei 125-135-124-124-1235-146
+always hoffähig 125-135-124-124-345-125-45
+always kerckhoff 13-12456-46-125-135-124-124
+syllable öffnung 246-124-124-1345-136
+always steinhoff 23456-1246-125-135-124-124
+always drohoffesiv 145-1235-135-125-135-124-124-14-234-24-1236
+always hülshoff 125-1256-123-234-125-135-124-124
+
+# ICH (4.1 Lautgruppenkürzungen)
+word ich 3456
+midendword ich 3456
+word ich, 24-1456-2
+word ich; 24-1456-23
+word ich: 24-1456-25
+word ich? 24-1456-26
+word ich! 24-1456-235
+word ich) 24-1456-2356
+word ich" 24-1456-356
+word ich« 24-1456-356
+word ich» 24-1456-356
+prfword dichlor 145-24-1456-123-135-1235
+begmidword dichlor 145-24-1456-123-26
+before c begmidword anti 235-2345-24
+always lavichord 123-1-1236-24-1456-26-145
+always comic 6-14-135-134-24-6-14
+before c begmidword taxi 2345-1-6-1346-24
+
+# IE  (4.1 Lautgruppenkürzungen)
+midendword ie 346
+# IEll
+midendword iell 24-15-12345
+begmidword schiellies 156-346-123-123-346-234
+always ziellaser 1356-346-123-123-1-234-12456
+midendword ieuw 24-126-2456
+midendword ieux 24-126-6-1346
+always kiellini 13-346-123-123-35-24
+always spiell 2-346-123
+always stiell 23456-346-123-123
+always zielland 1356-346-123-123-235-145
+always zielländ 1356-346-123-123-345-1345-145
+always ziellini 1356-346-123-123-35-24
+always zielloch 1356-346-123-123-135-1456
+always ziellöch 1356-346-123-123-246-1456
+always ziellos 1356-346-123-123-135-234
+# aIE
+always ai 1-24
+always ainsel 1-35-234-13456
+always aismus 1-5-24
+always aistisch 1-5-156
+always aität 1-5-345
+always deltainsel 145-13456-2345-1-35-234-13456
+
+# bIE
+always amphibi 1-134-1234-125-24-12-24
+always adverbi 1-145-1236-12456-12-24
+# HOMONYM
+word bien 12-24-14
+sufword bien 12-346-1345
+begword bienfai 12-24-14-124-1-24
+midendword bien 12-24-14
+prfword bienchen 12-346-1345-1456-14
+prfword biene 12-346-1345-15
+prfword bienen 12-346-1345-14
+always bienn 12-24-14-1345
+always skabies 234-13-1-12-24-123456
+begmidword honigbien 125-135-1345-45-12-346-1345
+begmidword mörtelbien 134-246-1235-2345-13456-12-346-1345
+begmidword kolumbi 13-135-123-136-134-12-24
+always kolumbin 13-135-123-136-134-12-35
+begmidword wespenbien 2456-123456-1234-14-12-346-1345
+begmidword hosenbien 125-135-234-14-12-346-1345
+always snobiety 234-1345-135-12-24-15-2345-6-13456
+always anaerobier 235-1-12456-135-12-24-12456
+always garderobier 1245-356-145-12456-135-12-24-12456
+begmidword killerbien 13-24-12345-12456-12-346-1345
+begmidword mauerbien 134-16-12456-12-346-1345
+begmidword trauerbien 2345-1235-16-12456-12-346-1345
+begmidword feuerbien 124-126-12456-12-346-1345
+begmidword arbeiterbien 356-12-12456-12-346-1345
+begmidword futterbien 124-136-2345-2345-12456-12-346-1345
+begmidword arbeitsbien 356-12-234-12-346-1345
+always lesbier 123-123456-12-24-12456
+begmidword trachtbien 2345-1235-56-2345-12-346-1345
+begmidword nubi 1345-136-12-24
+begmidword pelzbien 1234-13456-1356-12-346-1345
+begmidword holzbien 125-135-123-1356-12-346-1345
+# cIE
+always ciego 6-14-24-15-1245-135
+always galici 1245-25-24-6-14-24
+begmidword sufficien 234-136-124-124-24-6-14-24-14
+always ancien 235-6-14-24-14
+always ancier 235-6-14-24-12456
+always lancier 123-235-6-14-346-1235
+always balancier 12-25-235-6-14-346-1235
+always nuancier 1345-136-235-6-14-346-1235
+always avancier 1-1236-235-6-14-346-1235
+always rencier 1235-14-6-14-24-12456
+always ferencier 124-12456-14-6-14-24-12456
+always concierge 6-14-135-1345-6-14-24-12456-12346
+always socie 234-135-6-14-24-15
+always scien 234-6-14-24-14
+always saucier 234-16-6-14-24-12456
+# dIE
+always diego 145-24-15-1245-135
+always dielektr 145-24-13456-15-13-2345-1235
+word dien 145-346-1345
+midendword dien 145-24-14
+prfword diene 145-346-1345-15
+always dienen 145-346-1345-14
+always diener 145-346-1345-12456
+always dienlich 145-346-1345-456
+always dienst 145-346-1345-23456
+always dienstag 145-346-1345-234-2345-1-1245
+prfword dienstage 145-346-1345-234-2345-1-12346
+always dient 145-346-1345-2345
+prfword diente 145-346-1345-236
+always dientest 145-346-1345-236-23456
+always dientet 145-346-1345-236-2345
+always medien 134-15-145-24-14
+word diet 145-24-15-2345
+always diethyl 145-24-15-2345-125-6-13456-123
+always barbadier 12-356-12-1-145-24-12456
+always brigadier 12-1235-45-1-145-24-12456
+always arkadier 356-13-1-145-24-12456
+always kanadier 13-235-1-145-24-12456
+always gradien 1245-1235-1-145-24-14
+always bedien 23-145-346-1345
+always gedient 12346-145-346-1345-2345
+prfword gediente 12346-145-346-1345-236
+begword expedien 1346-1234-15-145-24-14
+midword expedien 15-6-1346-1234-15-145-24-14
+always andien 235-145-346-1345
+begmidword indientin 35-145-24-14-2345-35
+always latifundi 123-1-2345-24-124-256-145-24
+always burundier 12-136-1235-256-145-24-12456
+always komödi 13-135-134-246-145-24
+always tragödi 2345-1245-246-145-24
+always tragödin 2345-1245-246-145-35
+sufword verdien 36-145-346-1345
+midendword verdien 1236-12456-145-346-1345
+always kapverdier 13-1-1234-1236-12456-145-24-12456
+prfword studie 23456-136-145-24-15
+always studien 23456-136-145-24-14
+always studier 23456-136-145-346-1235
+prfword dieu 145-24-126
+# eIE
+# fIE
+always fiesta 124-24-15-23456-1
+endword grafien 1245-1235-1-124-24-14
+always golfier 1245-135-123-124-24-12456
+sufword profierfahr 12345-124-24-12456-2-1235
+midword profierfahr 1234-1235-135-124-24-12456-2-1235
+endword graphien 1245-1235-1-1234-125-24-14
+# gIE
+midendword gien 1245-24-14
+endword gieneutral 1245-346-1345-126-2345-1235-1-123
+midword gieneutral 1245-346-1345-126-2345-1235-25
+midendword gienetz 1245-346-1345-15-2345-1356
+midendword gieniveau 1245-346-1345-24-1236-15-16
+midendword gienutz 1245-346-1345-1356
+midendword gienütz 1245-346-5-1345-1356
+always magier 134-1-1245-24-12456
+prfword orgie 26-1245-24-15
+always orgien 26-1245-24-14
+always georgi 12346-26-1245-24
+# hIE
+always hierarch 125-24-12456-356-1456
+always hierarchie 125-24-12456-356-1456-346
+always hierarchien 125-24-12456-356-1456-24-14
+always hieroglyph 125-24-12456-135-1245-123-6-13456-1234-125
+always hieronymus 125-24-12456-135-1345-6-13456-134-136-234
+always chien 1456-24-14
+always schien 156-346-1345
+always alighieri 25-45-125-24-12456-24
+endword graphien 1245-1235-1-1234-125-24-14
+always sophien 234-135-1234-125-24-14
+prfword philosophien 1234-125-24-14
+prfword thieu 2345-125-24-126
+always pathien 1234-1-2345-125-24-14
+begmidword forsythi 124-26-234-6-13456-2345-125-24
+# iIE
+# jIE
+# kIE
+always bankier 12-235-13-24-12456
+always kiew 13-24-15-2456
+sufword skier 234-13-24-12456
+always abfahrtsskier 1-12-2-1235-2345-234-234-13-24-12456
+always laufskier 123-16-124-234-13-24-12456
+always tourenskier 2345-135-136-1235-14-234-13-24-12456
+always wasserskier 2456-1-2346-12456-234-13-24-12456
+begmidword thraki 2345-125-1235-1-13-24
+# lIE
+midendword lien 123-24-14
+always lieutenant 123-24-126-2345-14-235-2345
+sufword alien 25-24-14
+endword alien 25-24-14
+always alienhand 25-24-14-125-145
+begword calien 6-14-25-24-14
+word alalie 25-25-24-15
+always regali 1235-15-1245-25-24
+always personalien 1234-1345-25-24-14
+always mineralien 134-35-12456-25-24-14
+always pastoralien 1234-1-23456-26-25-24-14
+always naturalien 1345-2345-25-24-14
+begmidword versali 1236-12456-234-25-24
+begmidword universalinstr 256-24-1236-12456-234-25-35-23456-1235
+always universalismus 256-24-1236-12456-234-25-5-24
+always universalistisch 256-24-1236-12456-234-25-5-156
+always universalität 256-24-1236-12456-234-25-5-345
+always realien 1235-15-25-24-14
+always materialien 134-123-24-14
+begmidword nationalien 1345-5-1345-25-24-14
+begmidword zereali 1356-12456-15-25-24
+always minerialien 134-35-12456-25-24-14
+begmidword chemikali 1456-12356-24-13-25-24
+begmidword somali 234-135-134-25-24
+begmidword formali 124-26-134-25-24
+always formalin 124-26-134-25-35
+always formalismus 124-26-134-25-5-24
+always formalistisch 124-26-134-25-5-156
+always formalität 124-26-134-25-5-345
+begmidword marginali 134-356-1245-35-25-24
+always marginalität 134-356-1245-35-25-5-345
+begmidword lappali 123-1-1234-1234-25-24
+begmidword arali 356-25-24
+always australi 16-23456-1235-25-24
+always salieri 234-25-24-12456-24
+always rosali 1235-135-234-25-24
+always rosalind 1235-135-234-25-35-145
+begmidword thessali 2345-125-15-2346-25-24
+begmidword repressali 1235-15-1234-1235-15-2346-25-24
+always italien 24-2345-25-24-14
+always viktuali 1236-24-13-2345-136-25-24
+always chevalier 1456-15-1236-25-24-12456
+always richelieu 1235-3456-13456-24-126
+prfword kamelie 13-1-134-13456-24-15
+always kamelien 13-1-134-13456-24-14
+always sommelier 234-135-1346-13456-24-12456
+always bromeli 12-1235-135-134-13456-24
+# HOMONYM
+always relief 1235-13456-24-15-124
+always atelier 1-2345-13456-24-12456
+always hotelier 125-135-2345-13456-24-12456
+always pellier 1234-15-12345-24-12456
+always interpellier 35-2345-12456-1234-15-12345-346-1235
+always appellier 1-1234-1234-15-12345-346-1235
+prfword dahlie 145-1-125-123-24-15
+always dahlien 145-1-125-123-24-14
+begmidword immobili 24-1346-135-12-24-123-24
+always immobilität 24-1346-135-12-24-123-5-345
+prfword lilie 123-24-123-24-15
+always lilien 123-24-123-24-14
+begmidword emili 12356-24-123-24
+begmidword famili 124-1-134-24-123-24
+always milieu 134-24-123-24-126
+begmidword petersili 1234-15-2345-12456-234-24-123-24
+begmidword ottili 135-2345-2345-24-123-24
+always galli 1245-1-12345-24
+always gallig 1245-1-12345-45
+always collier 6-14-135-12345-24-12456
+always kollier 13-135-12345-24-12456
+always tokollier 2345-135-13-135-12345-346-1235
+always banlieu 12-235-123-24-126
+always gondolier 1245-135-1345-145-135-123-24-12456
+prfword folie 124-135-123-24-15
+always folien 124-135-123-24-14
+begmidword magnoli 134-1-1245-1345-135-123-24
+always anatoli 235-1-2345-135-123-24
+always volier 1236-135-123-24-12456
+always juliet 245-136-123-24-15-2345
+begmidword apuli 1-1234-136-123-24
+# mIE
+midendword mien 134-24-14
+prfword miene 134-346-1345-15
+always mienen 134-346-1345-14
+always prämi 1234-1235-345-134-24
+always prämier 1234-1235-345-134-346-1235
+begmidword mesopotami 134-123456-135-1234-135-2345-1-134-24
+midendword emien 12356-24-14
+always akademien 1-13-1-145-12356-24-14
+always premier 1234-1235-12356-24-12456
+always krimieck 13-1235-24-134-24-15-46
+begmidword mumi 134-136-134-24
+# nIE
+midendword nien 1345-24-14
+prfword niente 1345-24-14-236
+prfword teniendo 2345-14-24-14-145-135
+prfword teniente 2345-14-24-14-236
+begmidword albani 25-12-235-24
+begmidword jordani 245-26-145-235-24
+always daniel 145-235-24-13456
+begmidword ozeani 135-1356-15-235-24
+always nathaniel 1345-1-2345-125-235-24-13456
+begmidword bethani 23-2345-125-235-24
+prfword manien 134-235-24-14
+always germanien 1245-12456-134-235-24-14
+always tasmani 2345-1-234-134-235-24
+prfword kompanien 13-135-134-1234-235-24-14
+begmidword spani 234-1234-235-24
+always spaniel 234-1234-235-24-13456
+always hispanismus 125-24-234-1234-235-5-24
+begmidword akrani 1-13-1235-235-24
+midendword akranich 1-13-1235-235-3456
+begmidword orani 26-235-24
+begmidword gerani 1245-12456-235-24
+begmidword turani 2345-136-1235-235-24
+begmidword tansani 2345-235-234-235-24
+begmidword mauretani 134-16-1235-15-2345-235-24
+begmidword aquitani 1-6-12345-136-24-2345-235-24
+begmidword kastani 13-1-23456-235-24
+begmidword silvani 234-24-123-1236-235-24
+always ingenieur 35-1245-14-24-126-1235
+always tschetscheni 2345-156-15-2345-156-14-24
+always tschetschenin 2345-156-15-2345-156-14-35
+always turkmeni 2345-136-1235-13-134-14-24
+always armeni 356-134-14-24
+always phrenien 1234-125-1235-14-24-14
+midendword venience 1236-14-24-14-6-14-15
+midendword venient 1236-14-24-14-2345
+midendword venienz 1236-14-24-14-1356
+always konvenier 13-135-1345-1236-14-346-1235
+begmidword sloweni 234-123-135-2456-14-24
+begmidword xeni 6-1346-14-24
+begmidword insigni 35-234-45-1345-24
+always carabinier 6-14-356-1-12-35-24-12456
+always robini 1235-135-12-35-24
+always jardinier 245-356-145-35-24-12456
+begmidword sardini 234-356-145-35-24
+begmidword finien 124-35-24-14
+begmidword lini 123-35-24
+begmidword pollini 1234-135-123-123-35-24
+always apollinisch 1-1234-135-12345-35-24-156
+word pollini 1234-135-12345-35-24
+word pollinis 1234-135-12345-35-24-234
+always linier 123-35-346-1235
+midendword linig 123-35-45
+always miniechs 134-35-24-15-1456-234
+always minieis 134-35-24-146-234
+prfword pinie 1234-35-24-15
+always pinien 1234-35-24-14
+begmidword abessini 1-23-2346-35-24
+begmidword grusini 1245-1235-136-234-35-24
+begmidword argentini 356-1245-14-2345-35-24
+begmidword aktini 1-13-2345-35-24
+always aktinin 1-13-2345-35-35
+prfword routinier 1235-135-136-2345-35-24-12456
+prfword routiniers 1235-135-136-2345-35-24-12456-234
+prfword zinie 1356-35-24-15
+always zinien 1356-35-24-14
+prfword zinnie 1356-35-1345-24-15
+always zinnien 1356-35-1345-24-14
+always insomnien 35-234-135-134-1345-24-14
+begmidword bonbonier 12-135-1345-12-135-1345-24-12456
+begmidword bonbonnier 12-135-1345-12-135-1345-1345-24-12456
+always saisonnier 234-1-24-234-135-1345-1345-24-12456
+always chansonnier 1456-235-234-135-1345-1345-24-12456
+begmidword kaledoni 13-25-15-145-135-1345-24
+begmidword makedoni 134-1-13-15-145-135-1345-24
+begmidword mazedoni 134-1-1356-15-145-135-1345-24
+always chiffonier 1456-24-124-124-135-1345-24-12456
+begmidword aragoni 356-1-1245-135-1345-24
+always begoni 23-1245-135-1345-24
+begmidword babyloni 12-1-12-6-13456-123-135-1345-24
+begmidword kataloni 13-1-2345-25-135-1345-24
+begmidword slawoni 234-123-1-2456-135-1345-24
+always dernier 145-12456-1345-24-12456
+begmidword indernier 35-145-12456-1345-346-1235
+begmidword spendernier 234-1234-14-145-12456-1345-346-1235
+begmidword wandernier 2456-235-145-12456-1345-346-1235
+prfword hernie 125-12456-1345-24-15
+always hernien 125-12456-1345-24-14
+begmidword kaliforni 13-25-24-124-26-1345-24
+always bosnien 12-135-234-1345-24-14
+always bosnier 12-135-234-1345-24-12456
+begmidword puni 1234-256-24
+always harpunier 125-356-1234-256-346-1235
+begmidword petuni 1234-15-2345-256-24
+begmidword bithyni 12-24-2345-125-6-13456-1345-24
+# oIE
+prfword boie 12-135-24-15
+always boien 12-135-24-14
+word foie 124-135-24-15
+always voien 1236-135-24-14
+# pIE
+word pie 1234-24-15
+sufword piedra 1234-24-15-145-1235-1
+always piemont 1234-24-15-134-135-1345-2345
+midendword pien 1234-24-14
+sufword piensa 1234-24-14-234-1
+sufword piero 1234-24-12456-135
+always pierre 1234-24-12456-1235-15
+always pierres 1234-24-12456-1235-123456
+always papier 1234-1-1234-346-1235
+always pierrot 1234-24-12456-1235-135-2345
+always kopier 13-135-1234-346-1235
+prfword pies 1234-24-15-234
+prfword hippies 125-24-1234-1234-346-234
+prfword yuppies 6-13456-136-1234-1234-346-234
+always pieta 1234-24-15-2345-1
+always pietismus 1234-24-15-2345-5-24
+always pietist 1234-24-15-2345-24-23456
+always pietistisch 1234-24-15-2345-5-156
+always pietro 1234-24-15-2345-1235-135
+always pietät 1234-24-15-2345-345-2345
+always piezo 1234-24-15-1356-135
+always kneipier 13-1345-146-1234-24-12456
+always olympier 135-123-6-13456-134-1234-24-12456
+begmidword äthiopi 345-2345-125-24-135-1234-24
+always croupier 6-14-1235-135-136-1234-24-12456
+prfword rupie 1235-136-1234-24-15
+always rupien 1235-136-1234-24-14
+# qIE
+# rIE
+word rien 1235-24-14
+midendword rien 1235-24-14
+prfword arie 356-24-15
+sufword ariel 356-24-13456
+prfword arielle 356-24-15-12345-15
+prfword arielles 356-24-15-12345-123456
+always marie 134-356-346
+prfword mariette 134-356-24-15-2345-236
+always mariett 134-356-24-15-2345-2345
+prfword parietal 1234-356-24-15-2345-1-123
+always parietal 1234-356-24-15-2345-25
+always havarie 125-1-1236-356-346
+always arien 356-24-14
+always marien 134-356-24-14
+always havarien 125-1-1236-356-24-14
+always arier 356-24-12456
+always karier 13-356-346-1235
+always karies 13-356-24-123456
+always klarier 13-123-356-346-1235
+always parier 1234-356-346-1235
+always tarier 2345-356-346-1235
+always ozetarier 135-1356-15-2345-356-24-12456
+always rotarier 1235-135-2345-356-24-12456
+always vegetarier 1236-15-12346-2345-356-24-12456
+midendword letarier 123-15-2345-356-24-12456
+always unitarier 256-24-2345-356-24-12456
+always trinitarier 2345-1235-35-24-2345-356-24-12456
+always parlamentarier 1234-356-123-1-134-14-2345-356-24-12456
+begmidword variet 1236-356-24-15-2345
+prfword variete 1236-356-24-15-236
+always gabriel 1245-1-12-1235-24-13456
+always erien 12456-24-14
+always iberien 24-12-12456-24-14
+always drogerien 145-1235-135-1245-12456-24-14
+prfword serie 234-12456-24-15
+always terien 2345-12456-24-14
+begmidword algeri 25-1245-12456-24
+prfword serie 234-12456-24-15
+midendword onfiserie 135-1345-124-24-234-12456-346
+prfword onfiserien 135-1345-124-24-234-12456-24-14
+always chinoiserie 1456-35-135-24-234-12456-346
+prfword chinoiserien 1456-35-135-24-234-12456-24-14
+always inserier 35-234-12456-346-1235
+always komparserie 13-135-134-1234-356-234-12456-346
+prfword komparserien 13-135-134-1234-356-234-12456-24-14
+always asserier 1-2346-12456-346-1235
+always brasserie 12-1235-1-2346-12456-346
+always tapisserie 2345-1-1234-24-2346-12456-346
+prfword tapisserien 2345-1-1234-24-2346-12456-24-14
+always patisserie 1234-1-2345-24-2346-12456-346
+prfword patisserien 1234-1-2345-24-2346-12456-24-14
+always karosserie 13-356-135-2346-12456-346
+prfword karosserien 13-356-135-2346-12456-24-14
+begmidword materi 134-1-2345-12456-24
+begmidword bakteri 12-1-13-2345-12456-24
+always interieur 35-2345-12456-24-126-1235
+before e begmidword arteri 356-2345-12456-24
+always grien 1245-1235-346-1345
+begmidword sangrien 234-235-1245-1235-24-14
+begmidword sibiri 234-24-12-24-1235-24
+begmidword henriett 125-14-1235-24-15-2345-2345
+prfword henriette 125-14-1235-24-15-2345-236
+endword orien 26-24-14
+always kategorien 13-1-236-1245-26-24-14
+always kalorien 13-25-26-24-14
+always theorie 2345-125-15-26-346
+always theorien 2345-125-15-26-24-14
+always orient 26-24-14-2345
+begmidword glori 1245-123-26-24
+always moriend 134-26-24-14-145
+begmidword akzessori 1-13-1356-15-2346-26-24
+begmidword histori 125-24-23456-26-24
+always historismus 125-24-23456-26-5-24
+begmidword zichori 1356-3456-26-24
+begmidword tutorien 2345-136-2345-26-24-14
+begword propriet 12345-1234-1235-24-15-2345
+always propriet 1234-1235-135-1234-1235-24-15-2345
+always carrier 6-14-356-1235-24-12456
+always barrier 12-356-1235-24-12456
+always harriet 125-356-1235-24-15-2345
+always karrier 13-356-1235-24-12456
+always perrier 1234-12456-1235-24-12456
+always terrier 2345-12456-1235-24-12456
+begmidword corrier 6-14-26-1235-24-12456
+always triest 2345-1235-24-15-23456
+always industrie 35-145-136-23456-1235-346
+always industriell 35-145-136-23456-1235-24-15-12345
+prfword industrien 35-145-136-23456-1235-24-14
+always saurier 234-16-1235-24-12456
+prfword furie 124-136-1235-24-15
+always furien 124-136-1235-24-14
+always furier 124-136-1235-346-1235
+prfword injurie 35-245-136-1235-24-15
+always injurien 35-245-136-1235-24-14
+always injurier 35-245-136-1235-346-1235
+prfword kurie 13-136-1235-24-15
+always kurien 13-136-1235-24-14
+always kurier 13-136-1235-346-1235
+always dekurie 145-15-13-136-1235-24-15
+prfword muriel 134-136-1235-24-13456
+prfword muriels 134-136-1235-24-13456-234
+always courier 6-14-135-136-1235-24-12456
+begmidword zenturi 1356-14-2345-136-1235-24
+always couturier 6-14-135-136-2345-136-1235-24-12456
+begmidword kyri 13-6-13456-1235-24
+always illyrier 24-12345-6-13456-1235-24-12456
+begmidword syri 234-6-13456-1235-24
+begmidword syrin 234-6-13456-1235-35
+begmidword assyri 1-2346-6-13456-1235-24
+# sIE
+midendword sien 234-24-14
+begword sierr 234-24-12456-1235
+always sierra 234-24-12456-1235-1
+always sterilisier 23456-12456-24-123-24-234-346-1235
+always siesta 234-24-15-23456-1
+midendword sieur 234-24-126-1235
+word messieurs 134-15-2346-24-126-1235-234
+begmidword kaukasi 13-16-13-1-234-24
+begmidword douglasi 145-135-136-1245-123-1-234-24
+begmidword austrasi 16-23456-1235-1-234-24
+begmidword eurasi 126-1235-1-234-24
+midendword antasie 235-2345-1-234-346
+endword antasien 235-2345-1-234-24-14
+endword esien 123456-24-14
+begmidword rhodesi 1235-125-135-145-123456-24
+begmidword freesi 124-1235-15-15-234-24
+begmidword schlesi 156-123-123456-24
+always milesier 134-24-123-123456-24-12456
+begmidword melanesi 134-13456-235-123456-24
+begmidword indonesi 35-145-135-1345-123456-24
+begmidword mikronesi 134-24-13-1235-135-1345-123456-24
+begmidword tunesi 2345-256-123456-24
+begmidword polynesi 1234-135-123-6-13456-1345-123456-24
+always theresien 2345-125-12456-123456-24-14
+begmidword fuchsi 124-136-1456-234-24
+always fuchsig 124-136-1456-234-45
+always chemisier 1456-12356-24-234-24-12456
+always lavoisier 123-1-1236-135-24-234-24-12456
+begmidword hortensi 125-26-2345-14-234-24
+midendword ssien 2346-24-14
+midendword messieur 134-15-2346-24-126-1235
+always jurassier 245-136-1235-1-2346-24-12456
+always patissier 1234-1-2345-24-2346-24-12456
+always dossier 145-135-2346-24-12456
+always dossierung 145-135-2346-346-1235-136
+prfword haussier 125-16-2346-24-12456
+prfword haussiers 125-16-2346-24-12456-234
+always arkebusier 356-13-15-12-136-234-24-12456
+always corbusier 6-14-26-12-136-234-24-12456
+begmidword andalusi 235-145-25-136-234-24
+always malaysier 134-25-1-6-13456-234-24-12456
+# tIE
+midendword tien 2345-24-14
+prfword tiende 2345-24-14-145-15
+prfword tiende 2345-24-14-145-15
+midendword atien 1-2345-24-14
+prfword tiens 2345-24-14-234
+prfword tient 2345-24-14-2345
+always poitiers 1234-135-24-2345-24-12456-234
+always chocolatier 1456-135-6-14-135-123-1-2345-24-12456
+prfword demokratien 145-2345-24-14
+always privatier 1234-1235-24-1236-1-2345-24-12456
+always cafetier 6-14-1-124-15-2345-24-12456
+always metier 134-15-2345-24-12456
+begmidword helveti 125-13456-1236-15-2345-24
+always helvetismus 125-13456-1236-15-2345-5-24
+always helvetismen 125-13456-1236-15-2345-24-234-134-14
+always pleitier 1234-123-146-2345-24-12456
+always poitiers 1234-135-24-2345-24-12456-234
+prfword aktie 1-13-2345-24-15
+always aktien 1-13-2345-24-14
+always paktier 1234-1-13-2345-346-1235
+always traktier 2345-1235-1-13-2345-346-1235
+always taktier 2345-1-13-2345-346-1235
+always multi 134-136-123-2345-24
+before e begmidword anti 235-2345-24
+prfword antie 235-2345-346
+always orkantief 26-13-235-2345-346-124
+always hantier 125-235-2345-346-1235
+always garantie 1245-356-235-2345-346
+always garantien 1245-356-235-2345-24-14
+sufword proviantier 12345-1236-24-235-2345-346-1235
+midendword proviantier 1234-1235-135-1236-24-235-2345-346-1235
+always kantier 13-235-2345-346-1235
+always plantier 1234-123-235-2345-346-1235
+always tantiem 2345-235-2345-24-12356
+always cartier 6-14-356-2345-24-12456
+# HOMONYM
+always portier 1234-26-2345-24-12456
+prfword portierbar 1234-26-2345-346-1235-12-1-1235
+begmidword portierbar 1234-26-2345-346-1235-12-356
+# HOMONYM
+prfword portiere 1234-26-2345-346-1235-15
+prfword portieren 1234-26-2345-346-1235-14
+always portierend 1234-26-2345-346-1235-14-145
+prfword portierst 1234-26-2345-346-1235-23456
+always portiert 1234-26-2345-346-1235-2345
+prfword portierte 1234-26-2345-346-1235-236
+prfword portiertest 1234-26-2345-346-1235-236-23456
+prfword portiertet 1234-26-2345-346-1235-236-2345
+always portierung 1234-26-2345-346-1235-136
+begmidword portierungsauf 1234-26-2345-346-1235-136-234-2-16
+always deportier 145-15-1234-26-2345-346-1235
+always kolportier 13-135-123-1234-26-2345-346-1235
+always importier 24-134-1234-26-2345-346-1235
+always apportier 1-1234-1234-26-2345-346-1235
+sufword exportier 1346-1234-26-2345-346-1235
+midendword exportier 15-6-1346-1234-26-2345-346-1235
+always transportier 2345-1235-235-234-1234-26-2345-346-1235
+midendword stien 23456-24-14
+midendword estien 15-23456-24-14
+prfword bestie 23-23456-24-15
+always bestien 23-23456-24-14
+begmidword hosti 125-135-23456-24
+always hosting 125-135-23456-35-1245
+always hostinter 125-135-23456-35-2345-12456
+always bustier 12-136-23456-24-12456
+always büfettier 12-1256-124-15-2345-2345-24-12456
+always spaghettiess 234-1234-1-1245-125-15-2345-2345-24-15-2346
+always gautier 1245-16-2345-24-12456
+always bijoutier 12-24-245-135-136-2345-24-12456
+always moutier 134-135-136-2345-24-12456
+# uIE
+always quietismus 6-12345-136-24-15-2345-5-24
+always quietistisch 6-12345-136-24-15-2345-5-156
+always quieu 6-12345-136-24-126
+always kolloqui 13-135-12345-135-6-12345-136-24
+always requi 1235-15-6-12345-136-24
+begmidword reliqui 1235-13456-24-6-12345-136-24
+# vIE
+begmidword vienn 1236-24-14-1345
+always viet 1236-24-15-2345
+always view 1236-24-15-2456
+always javier 245-1-1236-24-12456
+begmidword skandinavi 234-13-235-145-35-1-1236-24
+always xavier 6-1346-1-1236-24-12456
+begmidword endivi 14-145-24-1236-24
+begmidword bolivi 12-135-123-24-1236-24
+always riviera 1235-24-1236-24-12456-1
+always vivien 1236-24-1236-24-14
+# wIE
+always jugoslawi 245-136-1245-135-234-123-1-2456-24
+always jugoslawin 245-136-1245-135-234-123-1-2456-35
+always moldawi 134-135-123-145-1-2456-24
+# xIE
+always galaxien 1245-25-1-6-1346-24-14
+always sexier 234-15-6-1346-24-12456
+always sexiest 234-15-6-1346-24-15-23456
+always paradoxien 1234-356-1-145-135-6-1346-24-14
+begmidword gloxini 1245-123-135-6-1346-35-24
+# yIE
+begmidword harpyi 125-356-1234-6-13456-24
+# zIE
+midendword zien 1356-24-14
+begmidword akazi 1-13-1-1356-24
+begmidword grazi 1245-1235-1-1356-24
+begmidword pistazi 1234-24-23456-1-1356-24
+begmidword allochezi 1-12345-135-1456-15-1356-24
+begmidword alopezi 25-135-1234-15-1356-24
+always spezies 234-1234-15-1356-24-123456
+begmidword phönizi 1234-125-246-1345-24-1356-24
+always patrizier 1234-1-2345-1235-24-1356-24-12456
+begmidword alkylanzi 25-13-6-13456-123-235-1356-24
+begmidword koagulanzi 13-135-1-1245-136-123-235-1356-24
+prfword finanzier 124-35-235-1356-24-12456
+prfword finanziers 124-35-235-1356-24-12456-234
+always soziet 234-135-1356-24-15-2345
+
+# IG  (4.1 Lautgruppenkürzungen)
+midendword ig 45
+midendword igebiet 24-12346-12-346-2345
+endword igebiete 24-12346-12-346-236
+midword igebäud 24-12346-12-34-145
+midendword igegner 24-12346-1245-1345-12456
+midendword igehalt 24-12346-125-25-2345
+midendword igeist 24-1245-146-23456
+midword igeländ 24-12346-123-345-1345-145
+endword igenre 24-1245-14-1235-15
+endword igenres 24-1245-14-1235-123456
+midendword igeschoss 24-12346-156-135-2346
+midendword igeschäft 24-1245-124
+midword igess 45-15-2346
+midword igewerbe 24-12346-2456-12456-23
+endword igewerbe 24-12346-2456-12456-12-15
+midendword igewinn 24-12346-2456-35-1345
+midword ignor 24-1245-1345-26
+endword ignor 24-1245-1345-135-1235
+midendword igold 24-1245-135-123-145
+midendword igolf 24-1245-135-123-124
+midword igrupp 24-1245-1235-136-1234-1234
+midword igymn 24-1245-6-13456-134-1345
+always aig 1-24-1245
+always hai 125-1-24
+always kaigebühr 13-1-24-12346-12-1256-125-1235
+always sinai 234-35-1-24
+always bonsai 12-135-1345-234-1-24
+always alibi 25-24-12-24
+always kombi 13-135-134-12-24
+always digamma 145-24-1245-1-1346-1
+word digest 145-24-1245-15-23456
+always digestif 145-45-15-23456-24-124
+begmidword digitiz 145-24-1245-24-2345-24-1356
+always fight 124-24-1245-125-2345
+before g begword profi 12345-124-24
+before g midword profi 1234-1235-135-124-24
+always rigigrat 1235-24-1245-24-1245-1235-1-2345
+always high 125-24-1245-125
+always khaki 13-125-1-13-24
+always light 123-24-1245-125-2345
+always align 1-123-24-1245-1345
+always alignier 25-45-1345-346-1235
+always alkaliglasur 25-13-1-123-24-1245-123-1-234-136-1235
+always psaligraf 1234-234-25-24-1245-1235-1-124
+always psaligraph 1234-234-25-24-1245-1235-1-1234-125
+always negligee 1345-15-1245-123-24-1245-15-15
+always kalligraf 13-1-12345-24-1245-1235-1-124
+always kalligrafien 13-1-12345-24-1245-1235-1-124-24-14
+always kalligraph 13-1-12345-24-1245-1235-1-1234-125
+always milligramm 134-24-12345-24-1245-1235-1-1346
+always mignon 134-24-1245-1345-135-1345
+always talmiglanz 2345-25-134-24-1245-123-235-1356
+always night 1345-24-1245-125-2345
+always armani 356-134-235-24
+always organigramm 26-1245-235-24-1245-1235-1-1346
+always soignier 234-135-24-1245-1345-346-1235
+always epigraf 15-1234-24-1245-1235-1-124
+always epigramm 15-1234-24-1245-1235-1-1346
+always epigraph 15-1234-24-1245-1235-1-1234-125
+always champignon 1456-1-134-1234-24-1245-1345-135-1345
+always right 1235-24-1245-125-2345
+always rigips 1235-24-1245-24-1234-234
+always lollobrigida 123-135-12345-135-12-1235-24-1245-24-145-1
+always serigraf 234-12456-24-1245-1235-1-124
+always serigraph 234-12456-24-1245-1235-1-1234-125
+always aborigine 1-12-26-45-35-15
+always aborigines 1-12-26-45-35-123456
+always trigeminus 2345-1235-24-1245-12356-35-136-234
+always sight 234-24-1245-125-2345
+prfword sign 234-24-1245-1345
+prfword signs 234-24-1245-1345-234
+always design 145-123456-24-1245-1345
+always designation 145-123456-45-1345-5-1345
+always designat 145-123456-45-1345-1-2345
+always designier 145-123456-45-1345-346-1235
+always unsigned 256-234-24-1245-1345-15-145
+begmidword gassigeh 1245-1-2346-24-1245-2356
+always altigraf 25-2345-24-1245-1235-1-124
+always altigraph 25-2345-24-1245-1235-1-1234-125
+always antigen 235-2345-24-1245-14
+always kantigen 13-235-2345-45-14
+always grantigen 1245-1235-235-2345-45-14
+always antigestalt 235-2345-24-12346-23456-25-2345
+begmidword antiglob 235-2345-24-1245-123-135-12
+begmidword antigrav 235-2345-24-1245-1235-1-1236
+always zentigrad 1356-14-2345-24-1245-1235-1-145
+always zentigramm 1356-14-2345-24-1245-1235-1-1346
+always szintigraf 234-1356-35-2345-24-1245-1235-1-124
+always szintigramm 234-1356-35-2345-24-1245-1235-1-1346
+always szintigraph 234-1356-35-2345-24-1245-1235-1-1234-125
+begmidword spontigrupp 234-1234-135-1345-2345-24-1245-1235-136-1234-1234
+always antipasti 235-2345-24-1234-1-23456-24
+always luigi 123-136-24-1245-24
+prfword vignette 1236-24-1245-1345-15-2345-236
+always vignetten 1236-24-1245-1345-15-2345-2345-14
+always avignon 1-1236-24-1245-1345-135-1345
+always savigny 234-1-1236-24-1245-1345-6-13456
+always sauvignon 234-16-1236-24-1245-1345-135-1345
+always dwight 145-2456-24-1245-125-2345
+before g begmidword plexi 1234-123-15-6-1346-24
+always dezigramm 145-15-1356-24-1245-1235-1-1346
+
+# IHM   (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word ihm 236
+
+# IHN (4.4 Zweiformige Kürzungen)
+word ihn 24-125
+word ihnen 24-125-14
+
+# IHR (4.3.3 Einformige Kürzungen, alleinstehend oder am Wortanfang)
+sufword ihr 24
+word ihr's 24-6-234
+
+# IM    (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word im 36
+
+# IMMER (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word immer 1346
+always immer 2-1346
+always immersion 24-1346-12456-234-245
+always dimmer 145-24-1346-12456
+always schimmer 156-24-1346-12456
+always limmer 123-24-1346-12456
+always nimmer 1345-24-1346-12456
+always trimmer 2345-1235-24-1346-12456
+always simmer 234-24-1346-12456
+always stimmer 23456-24-1346-12456
+always bestimmer 23-23456-24-1346-12456
+always wimmer 2456-24-1346-12456
+always zimmer 1356-24-1346-12456
+
+# IN  (4.1 Lautgruppenkürzungen)
+always in 35
+always cain 6-14-1-24-1345
+always novocain 1345-135-1236-135-6-14-1-35
+always bougain 12-135-136-1245-1-24-1345
+begmidword bermudain 12-12456-134-136-145-1-35
+always hain 125-1-24-1345
+always mokka 134-135-13-13-1
+always kain 13-1-24-1345
+always kokain 13-135-13-1-35
+always chamberlain 1456-1-134-12-12456-123-1-24-1345
+always plain 1234-123-1-24-1345
+always main 134-1-24-1345
+always pharma 1234-125-356-134-1
+always klima 13-123-24-134-1
+begmidword bahama 12-1-125-1-134-1
+always paint 1234-1-24-1345-2345
+always rain 1235-1-24-1345
+begmidword cholerain 1456-135-123-12456-1-35
+begmidword kamerain 13-1-134-12456-1-35
+begmidword ukrain 136-13-1235-1-35
+begmidword kontrain 13-135-1345-2345-1235-1-35
+always trainee 2345-1235-1-24-1345-15-15
+always trainer 2345-1235-1-24-1345-12456
+always rainier 1235-1-24-1345-24-12456
+always drainier 145-1235-1-24-1345-346-1235
+always trainier 2345-1235-1-24-1345-346-1235
+always training 2345-1235-1-24-1345-35-1245
+prfword saint 234-1-24-1345-2345
+prfword sainte 234-1-24-1345-236
+always tain 2345-1-24-1345
+always mountain 134-135-136-1345-2345-1-24-1345
+begmidword metain 134-15-2345-1-35
+always stainless 23456-1-24-1345-123-15-2346
+always twain 2345-2456-1-24-1345
+prfword binational 12-24-1345-5-1345-1-123
+always binational 12-24-1345-5-1345-25
+begmidword gumminier 1245-136-1346-24-1345-346-1235
+before n begmidword juli 245-136-123-24
+before n begmidword juni 245-256-24
+always cointreau 6-14-135-24-1345-2345-1235-15-16
+always joint 245-135-24-1345-2345
+always point 1234-135-24-1345-2345
+prfword pointe 1234-135-35-236
+always pointen 1234-135-35-2345-14
+always pointier 1234-135-35-2345-346-1235
+begmidword pointill 1234-135-35-2345-24-12345
+always antoin 235-2345-135-24-1345
+always allantoin 1-12345-235-2345-135-35
+always multination 134-136-123-2345-24-1345-5-1345
+always antinazi 235-2345-24-1345-1-1356-24
+begmidword antineuralg 235-2345-24-1345-126-1235-25-1245
+always antineutron 235-2345-24-1345-126-2345-1235-135-1345
+always antinomie 235-2345-24-1345-135-134-346
+always antinomien 235-2345-24-1345-135-134-24-14
+begmidword antinukle 235-2345-24-1345-136-13-123-15
+begmidword multinukle 134-136-123-2345-24-1345-136-13-123-15
+always aschantinuss 1-156-235-2345-24-1345-136-2346
+always aschantinüss 1-156-235-2345-24-1345-1256-2346
+always mannequin 134-235-1345-15-6-12345-136-35
+
+# INTERESS (4.3.6 Kommakürzungen)
+always interess 2-35
+always hinteressen 125-35-2345-12456-15-2346-14
+
+# -ION  (4.2.2 b) Nachsilbenkürzungen)
+midendword tion 2345-245
+midendword tions 2345-245-234
+word sion 234-24-135-1345
+midendword sion 234-245
+midendword sions 234-245-234
+midendword kursion 13-136-1235-234-245
+midendword ession 15-2346-245
+midendword essions 15-2346-245-234
+midendword estion 15-23456-245
+midendword estions 15-23456-245-234
+midendword ssion 2346-245
+midendword ssions 2346-245-234
+midendword ßion 2346-245
+midendword ßions 2346-245-234
+midendword stion 23456-245
+midendword stions 23456-245-234
+always punktion 1234-2345-245
+
+# IRGEND (4.4 Zweiformige Kürzungen)
+sufword irgend 24-1245
+always irgendwas 24-1245-2456-1-234
+
+# -ISMUS (4.2.2 b) Nachsilbenkürzungen)
+midendword ismus 5-24
+always gratismuster 1245-1235-1-2345-24-234-134-136-23456-12456
+always kürbismus 13-1256-1235-12-24-234-134-136-234
+
+# IST   (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word ist 23456
+
+# -ISTISCH (4.2.2 b) Nachsilbenkürzungen)
+midendword istisch 5-156
+always tischtennistisch 2345-24-156-2345-14-1345-24-234-2345-24-156
+
+# -ITÄT  (4.2.2 b) Nachsilbenkürzungen)
+midendword ität 5-345
+midword itäts 5-345-234
+
+# JAHR JÄHR (4.4 Zweiformige Kürzungen)
+always jahr 245-1235
+always jähr 5-245-1235
+
+# JAHRHUNDERT (4.4 Zweiformige Kürzungen)
+always jahrhundert 245-125
+
+# JAHRTAUSEND (4.4 Zweiformige Kürzungen)
+always jahrtausend 245-2345
+
+# JAHRZEHNT (4.4 Zweiformige Kürzungen)
+always jahrzehnt 245-1356
+
+# JED (4.4 Zweiformige Kürzungen)
+begword jed 245-145
+sufword jedi 245-15-145-24
+
+# JEDOCH (4.4 Zweiformige Kürzungen)
+always jedoch 245-1456
+
+# JETZIG (4.4 Zweiformige Kürzungen)
+always jetzig 245-45
+
+# JETZT (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word jetzt 245
+always jetzt 2-245
+
+# KANN  (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word kann 13
+
+# KANNST (4.4 Zweiformige Kürzungen)
+always kannst 13-23456
+
+# KAPITAL KAPITÄL (4.4 Zweiformige Kürzungen)
+always kapital 13-1234
+always kapitalien 13-1234-24-14
+always kapitäl 5-13-1234
+
+# -KEIT  4.2.1 a) Nachsilbenkürzungen
+midendword keit 13
+midendword keits 13-234
+
+# KOMM KÖMM (4.4 Zweiformige Kürzungen)
+always komm 13-1346
+always kömm 5-13-1346
+
+# KÖNN (4.3.6 Kommakürzungen)
+always könn 2-13
+
+# KONNT (4.4 Zweiformige Kürzungen)
+always konnt 13-2345
+
+# KRAFT KRÄFT (4.4 Zweiformige Kürzungen)
+always kraft 13-124
+always kräft 5-13-124
+
+# KURZ KÜRZ (4.4 Zweiformige Kürzungen)
+always kurz 13-1356
+always kürz 5-13-1356
+always kurzeit 13-136-1235-1356-2345
+begmidword kurzentr 13-136-1235-1356-14-2345-1235
+
+# LANG LÄNG (4.4 Zweiformige Kürzungen)
+always lang 123-1245
+always läng 5-123-1245
+prfword langabe 123-235-1245-1-12-15
+prfword angabe 235-1245-1-12-15
+always langabe 123-235-1245-1-23
+always angabe 235-1245-1-23
+always langaben 123-235-1245-1-12-14
+always angaben 235-1245-1-12-14
+syllable angehörig 235-12346-125-246-1235-45
+always längelang 5-123-1245-15-123-1245
+syllable angelegenheit 235-1245-1245-125
+syllable angleich 235-1245-1456
+syllable angestell 235-12346-2-13456
+syllable angebot 235-12346-12-135-2345
+syllable angebote 235-12346-12-135-236
+syllable angebotes 235-12346-12-135-2345-123456
+syllable angeboten 235-12346-12-135-2345-14
+always langenberg 123-235-1245-14-12-12456-1245
+always langenfeld 123-235-1245-14-124-13456-145
+always langenscheidt 123-235-1245-14-156-146-145-2345
+always langerhans 123-235-1245-12456-125-235-234
+always langnes 123-235-1245-1345-123456
+always langobard 123-235-1245-135-12-356-145
+always languag 123-235-1245-136-1-1245
+prfword language 123-235-1245-136-1-12346
+always langue 123-235-1245-136-15
+always langues 123-235-1245-136-123456
+always langust 123-235-1245-136-23456
+always falange 124-25-235-12346
+always falangist 124-25-235-1245-24-23456
+always generalangriff 1245-14-12456-25-235-1245-1235-24-124-124
+midendword tralang 2345-1235-1-123-1245
+midendword traläng 2345-1235-1-5-123-1245
+always frontalangriff 124-1235-135-1345-2345-25-235-1245-1235-24-124-124
+always tagelang 2345-1-12346-123-1245
+always michelangelo 134-3456-13456-235-1245-13456-135
+always melang 134-13456-235-1245
+prfword melange 134-13456-235-12346
+always himmelangst 125-24-1346-13456-235-1245-23456
+always himmelängst 125-24-1346-13456-345-1345-1245-23456
+midendword telang 236-123-1245
+always titelanga 2345-24-2345-13456-235-1245-1
+midendword teläng 236-5-123-1245
+always schlang 156-123-235-1245
+prfword schlange 156-123-235-12346
+begmidword schlangesteh 156-123-235-12346-23456-2356
+always schläng 156-123-345-1345-1245
+prfword schlänge 156-123-345-1345-12346
+always eilangebo 146-123-235-12346-12-135
+always klang 13-123-235-1245
+always kläng 13-123-345-1345-1245
+prfword klänge 13-123-345-1345-12346
+always stinklang 23456-35-13-123-1245
+syllable knöchel 13-1345-246-1456-13456
+midendword tellang 2345-13456-123-1245
+midendword telläng 2345-13456-5-123-1245
+always stellangel 2-13456-235-1245-13456
+syllable porzell 1234-26-1356-15-12345
+sufword plang 1234-123-235-1245
+prfword plange 1234-123-235-12346
+syllable plangl 1234-123-235-1245-123
+sufword slang 234-123-235-1245
+always gebietsslang 12346-12-346-2345-234-234-123-235-1245
+always werbeslang 2456-12456-23-234-123-235-1245
+
+# LASS LÄSS (4.3.6 Kommakürzungen)
+always lass 2-123
+always läss 5-123
+# Alte Rechtschreibung
+always läß 5-123
+always lassist 123-1-2346-24-23456
+always rassistisch 1235-1-2346-5-156
+always lassa 123-1-2346-1
+always nachlass 1345-56-2-123
+always lasso 123-1-2346-135
+always thalasso 2345-125-25-1-2346-135
+always blass 12-123-1-2346
+# Alte Rechtschreibung
+always blaß 12-123-1-2346
+always bläss 12-123-345-2346
+# Alte Rechtschreibung
+always bläß 12-123-345-2346
+always ablass 1-12-2-123
+# Alte Rechtschreibung
+always ablaß 1-12-2-123
+always abläss 1-12-5-123
+# Alte Rechtschreibung
+always abläß 1-12-5-123
+# Homonym
+always erblasser 12456-12-2-123-12456
+always class 6-14-123-1-2346
+always melass 134-13456-1-2346
+always glassch 1245-123-1-234-156
+always glasseid 1245-123-1-234-234-146-145
+always glassp 1245-123-1-234-234-1234
+always glasspiel 1245-123-1-234-2-346
+always glasst 1245-123-1-234-23456
+always weglasst 2456-1245-2-123-2345
+always glasständ 1245-123-1-234-5-23456
+always glasscheib 1245-123-1-234-156-146-12
+always klasse 13-123-1-2346-15
+always klassement 13-123-1-2346-12356-14-2345
+always klassen 13-123-1-2346-14
+always klasser 13-123-1-2346-12456
+always klassig 13-123-1-2346-45
+always klassik 13-123-1-2346-24-13
+prfword klassier 13-123-1-2346-346-1235
+begmidword klassier 13-123-1-2346-346-1235
+always klassifikation 13-123-1-2346-24-124-24-13-5-1345
+begmidword klassifikat 13-123-1-2346-24-124-24-13-1-2345
+prfword klassifizier 13-123-1-2346-24-124-24-1356-346-1235
+always klassifizier 13-123-1-2346-24-124-24-1356-346-1235
+prfword klassisch 13-123-1-2346-24-156
+always klassisch 13-123-1-2346-24-156
+always klassiz 13-123-1-2346-24-1356
+always klassler 13-123-1-2346-123-12456
+always klässler 13-123-345-2346-123-12456
+always klässer 13-123-345-2346-12456
+always molass 134-135-123-1-2346
+always atlasses 1-2345-123-1-2346-123456
+
+# LÄSST (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word lässt 123
+# Alte Rechtschreibung
+word läßt 123
+
+# LEB (4.4 Zweiformige Kürzungen)
+always leb 123-12
+always lebens 123-12-14-234
+always leberecht 123-12-15-1235-2345
+always leberegel 123-12-12456-15-1245-13456
+always kalebass 13-25-15-12-1-2346
+always tangentialeben 2345-235-1245-14-2345-24-25-15-12-14
+always spinaleben 234-1234-35-25-15-12-14
+always terminaleben 2345-12456-134-35-25-15-12-14
+always transversaleben 2345-1235-235-234-1236-12456-234-25-15-12-14
+always frontaleben 124-1235-135-1345-2345-25-15-12-14
+always horizontaleben 125-26-24-1356-135-1345-2345-25-15-12-14
+always individualeben 35-145-24-1236-24-145-136-25-15-12-14
+always zieleben 1356-346-123-15-12-14
+always faseleber 124-1-234-13456-15-12-12456
+always telebank 2345-13456-15-12-235-13
+always telebild 2345-13456-15-12-24-123-145
+always telebox 2345-13456-15-12-135-6-1346
+always telebrief 2345-13456-15-12-124
+begmidword zelebr 1356-13456-15-12-1235
+begmidword kohleb 13-135-125-123-15-12
+begmidword kohlebe 13-135-125-123-15-23
+begmidword kohlebei 13-135-125-123-15-2-12
+always kohlebenzin 13-135-125-123-15-12-14-1356-35
+always kohleberg 13-135-125-123-15-12-12456-1245
+always phlebit 1234-125-123-15-12-24-2345
+always ventileben 1236-14-2345-24-123-15-12-14
+always stileben 23456-24-123-15-12-14
+always kleb 13-123-15-12
+begmidword klebe 13-123-15-23
+always kleben 13-123-15-12-14
+always kleber 13-123-15-12-12456
+always huckleberry 125-136-46-123-15-12-12456-1235-6-13456
+always solebad 234-135-123-15-12-1-145
+always solebäd 234-135-123-15-12-345-145
+always solebecken 234-135-123-15-23-46-14
+begmidword plebej 1234-123-15-23-245
+begmidword plebisz 1234-123-15-12-24-234-1356
+always plebs 1234-123-15-12-234
+before b begmidword triple 2345-1235-24-1234-123-15
+always gorleben 1245-26-123-15-12-14
+always fallersleben 124-1-12345-12456-234-123-15-12-14
+before b begmidword turtle 2345-136-1235-2345-123-15
+before b begmidword shuttle 234-125-136-2345-2345-123-15
+
+# LEICHT (4.4 Zweiformige Kürzungen)
+always leicht 123-1456
+always bleicht 12-123-146-1456-2345
+always bleichte 12-123-146-1456-236
+always bleichten 12-123-146-1456-2345-14
+always bleichtem 12-123-146-1456-2345-12356
+always bleichter 12-123-146-1456-2345-12456
+always bleichtes 12-123-146-1456-2345-123456
+always bleichtest 12-123-146-1456-236-23456
+always halbleicht 125-25-12-123-1456
+always schleicht 156-123-146-1456-2345
+
+# LETZT (4.4 Zweiformige Kürzungen)
+always letzt 123-2345
+always letztemal 123-2345-15-134
+always schletzt 156-123-15-2345-1356-2345
+prfword schletzte 156-123-15-2345-1356-236
+always schletzten 156-123-15-2345-1356-2345-14
+
+# LICH (4.1 Lautgruppenkürzungen)
+midendword lich 456
+
+# LL  (4.1 Lautgruppenkürzungen)
+midendword ll 12345
+# Alte Rechtschreibung
+always modellösung 134-135-145-13456-123-246-234-136
+always büffel 12-1256-124-124-13456
+always schlängel 156-123-345-1345-1245-13456
+always parallel 1234-356-1-12345-13456
+always artikel 356-2345-24-13-13456
+always henkelloch 125-14-13-13456-123-135-1456
+begmidword henkellöch 125-14-13-13456-123-246-1456
+always schunkel 156-256-13-13456
+always bummel 12-136-1346-13456
+always murmel 134-136-1235-134-13456
+always kessel 13-15-2346-13456
+always schüssel 156-1256-2346-13456
+always schlüssel 156-123-1256-2346-13456
+before l midword hl 125-123
+before l begmidword fehl 124-2356-123
+before l begmidword kehl 13-2356-123
+always emaillack 12356-1-24-123-123-1-46
+always krokodil 13-1235-135-13-135-145-24-123
+before l begmidword heil 125-146-123
+always seillinie 234-146-123-123-35-24-15
+always seillinien 234-146-123-123-35-24-14
+always seillitz 234-146-123-123-24-2345-1356
+before l begmidword teil 2345-146-123
+before l begmidword steil 23456-146-123
+always bouteill 12-135-136-2345-15-24-12345
+before l begword profil 12345-124-24-123
+before l midword profil 1234-1235-135-124-24-123
+always stilliegen 23456-24-123-123-346-1245-14
+always stillos 23456-24-123-123-135-234
+before l begmidword april 1-1234-1235-24-123
+always ventil 1236-14-2345-24-123
+before l begmidword zivil 1356-24-1236-24-123
+before l begword exil 1346-24-123
+before l midword exil 15-6-1346-24-123
+before l begmidword öl 246-123
+sufword böll 12-246-12345
+always böller 12-246-12345-12456
+always höll 125-246-12345
+before l begmidword rohöl 1235-135-125-246-123
+always schöllkraut 156-246-12345-13-1235-16-2345
+always kölln 13-246-12345-1345
+sufword möller 134-246-12345-12456
+always schmölln 156-134-246-12345-1345
+begword nöll 1345-246-12345
+always knöll 13-1345-246-12345
+always pollauf 1234-135-123-123-16-124
+always polläuf 1234-135-123-123-34-124
+always röll 1235-246-12345
+always söller 234-246-12345-12456
+always quöll 6-12345-136-246-12345
+always zöll 1356-246-12345
+before l begmidword symbol 234-6-13456-134-12-135-123
+always wollust 2456-135-123-123-136-23456
+begmidword wollüst 2456-135-123-123-1256-23456
+before l begmidword heul 125-126-123
+before l begmidword schul 156-136-123
+# Alte Rechtschreibung
+always nulleiter 1345-136-123-123-146-2345-12456
+always spüllappen 234-1234-1256-123-123-1-1234-1234-14
+
+# -MAL   4.2.1 a) Nachsilbenkürzungen
+midendword mal 134
+prfword malabar 134-25-1-12-1-1235
+always malabar 134-25-1-12-356
+always malabo 134-25-1-12-135
+always malachi 134-25-56-24
+always malad 134-25-1-145
+always malaga 134-25-1-1245-1
+always malai 134-25-1-24
+always malaria 134-25-356-24-1
+always malawi 134-25-1-2456-24
+always malaxi 134-25-1-6-1346-24
+always malay 134-25-1-6-13456
+always malbuch 134-25-12-136-1456
+always malbüch 134-25-12-1256-1456
+always malediv 134-25-15-145-24-1236
+always malefiz 134-25-15-124-24-1356
+always malend 134-25-14-145
+always maler 134-25-12456
+always malesch 134-25-15-156
+always malfarb 134-25-124-356-12
+always einmalfarb 1246-134-124-356-12
+always malfeld 134-25-124-13456-145
+begmidword malfläch 134-25-124-123-345-1456
+always malformation 134-25-124-26-134-5-1345
+always malgrund 134-25-1245-145
+always malheur 134-25-125-126-1235
+begmidword malhonet 134-25-125-135-1345-15-2345
+always mali 134-25-24
+always malig 134-45
+always malign 134-25-45-1345
+always malin 134-25-35
+always malinteress 134-25-2-35
+always maliziös 134-25-24-1356-24-246-234
+always malkarton 134-25-13-356-2345-135-1345
+always malkast 134-25-13-1-23456
+always malkunst 134-25-13-256-23456
+always malkäst 134-25-13-345-23456
+always malkünst 134-25-13-1256-1345-23456
+begword mall 134-1-12345
+prfword mall 134-1-12345
+prfword malls 134-1-12345-234
+prfword malm 134-25-134
+prfword malms 134-25-134-234
+always malmittel 134-25-134-2345
+always malocchi 134-25-135-6-14-1456-24
+always maloch 134-25-135-1456
+always maloja 134-25-135-245-1
+always malossol 134-25-135-2346-135-123
+always malpinsel 134-25-1234-35-234-13456
+always malposition 134-25-1234-135-234-24-2345-245
+always malprogramm 134-25-1234-1235-135-1245-1235-1-1346
+always malproper 134-25-1234-1235-135-1234-12456
+always malrotation 134-25-1235-135-2345-5-1345
+endword malst 134-25-23456
+always malst 134-25-23456
+begmidword malsäul 134-25-234-34-123
+always malta 134-25-2345-1
+prfword maltalente 134-25-2345-25-14-236
+always maltalent 134-25-2345-25-14-2345
+always einmaltarif 1246-134-2345-356-24-124
+always maltechnik 134-25-2345-13
+always maltechnisch 134-25-2345-156
+always malter 134-25-2345-12456
+always malteser 134-25-2345-123456-12456
+always maltesisch 134-25-2345-123456-24-156
+always malthus 134-25-2345-125-136-234
+always maltos 134-25-2345-135-234
+always malträtier 134-25-2345-1235-345-2345-346-1235
+always malus 134-25-136-234
+always malutensil 134-25-136-2345-14-234-24-123
+always malvasier 134-25-1236-1-234-346-1235
+always malve 134-25-1236-15
+always malven 134-25-1236-14
+always malverbot 134-25-1236-12456-12-135-2345
+always malvin 134-25-1236-35
+begmidword malwar 134-25-2456-356
+always malweis 134-25-2-146
+always neunmalweis 1345-126-1345-134-2-146
+always malwerk 134-25-2456-12456-13
+always malz 134-25-1356
+midendword malzahl 134-1356-123
+begmidword maläs 134-25-345-234
+always alamala 25-1-134-25-1
+always amalgam 1-134-25-1245-1-134
+begword abmal 1-12-134-25
+prfword bemal 23-134-1-123
+always bemal 23-134-25
+word gemal 1245-12356-1-123
+begmidword gemal 1245-12356-25
+prfword gemalt 12346-134-25-2345
+always gemalt 12346-134-25-2345
+prfword gemalte 12346-134-25-236
+prfword würgemal 2456-1256-1235-12346-134-1-123
+begmidword würgemal 2456-1256-1235-12346-134-25
+always atemalkohol 1-2345-12356-25-13-135-125-135-123
+begmidword guatemal 1245-136-1-2345-12356-25
+begword aufmal 2-16-134-25
+begmidword pragmalingu 1234-1235-1-1245-134-1-123-35-1245-136
+prfword saugmal 234-16-1245-134-1-123
+begmidword saugmal 234-16-1245-134-25
+begmidword nachmal 1345-56-134-25
+always nachmalig 1345-56-134-45
+word nachmals 1345-56-134-234
+prfword schmal 156-134-1-123
+always schmal 156-134-25
+always marshmallow 134-356-234-125-134-1-12345-135-2456
+always himalaja 125-24-134-25-1-245-1
+always himalaya 125-24-134-25-1-6-13456-1
+prfword animal 235-24-134-1-123
+always animal 235-24-134-25
+prfword minimal 134-35-24-134-1-123
+always minimal 134-35-24-134-25
+prfword sexagesimal 234-15-6-1346-1-1245-123456-24-134-1-123
+always sexagesimal 234-15-6-1346-1-1245-123456-24-134-25
+prfword infinitesimal 35-124-35-24-2345-123456-24-134-1-123
+always infinitesimal 35-124-35-24-2345-123456-24-134-25
+prfword optimal 135-1234-2345-24-134-1-123
+always optimal 135-1234-2345-24-134-25
+prfword maximal 134-1-6-1346-24-134-1-123
+always maximal 134-1-6-1346-24-134-25
+prfword dezimal 145-15-1356-24-134-1-123
+always dezimal 145-15-1356-24-134-25
+begmidword vollmal 2-12345-134-25
+sufword herummal 125-12456-136-134-134-25
+begmidword anmal 235-134-25
+sufword peitschenmal 1234-146-2345-156-14-134-25
+begmidword schriftenmal 156-2345-14-134-25
+always omalgie 135-134-25-1245-346
+prfword anomal 235-135-134-1-123
+always anomal 235-135-134-25
+always anomalien 235-135-134-25-24-14
+always chromalaun 1456-1235-135-134-25-16-1345
+always somali 234-135-134-25-24
+prfword autosomal 16-2345-135-234-135-134-1-123
+begmidword autosomal 16-2345-135-234-135-134-25
+begmidword pharmalab 1234-125-356-134-1-123-1-12
+# HOMONYM
+word dermal 145-12456-134-1-123
+# HOMONYM
+always dermal 145-12456-134-25
+word dermaleinst 145-12456-134-1246-23456
+# HOMONYM
+word dermalen 145-12456-134-14
+always dermalig 145-12456-134-45
+prfword übermal 2-1256-134-1-123
+always übermal 2-1256-134-25
+begmidword fingermal 124-35-1245-12456-134-25
+prfword thermal 2345-125-12456-134-1-123
+always thermal 2345-125-12456-134-25
+prfword untermal 2-256-134-1-123
+always untermal 2-256-134-25
+begmidword pflasermal 1234-124-123-1-23456-12456-134-25
+word vermal 36-134-1-123
+sufword vermal 36-134-25
+midword vermal 1236-12456-134-25
+always zermalm 1356-12456-134-25-134
+prfword formal 124-26-134-1-123
+always formal 124-26-134-25
+prfword normal 1345-26-134-1-123
+begmidword normal 1345-26-134-25
+prfword anormal 235-26-134-1-123
+begmidword anormal 235-26-134-25
+prfword paranormal 1234-356-1-1345-26-134-1-123
+begmidword paranormal 1234-356-1-1345-26-134-25
+begword ausmal 34-134-25
+midword ausmal 16-234-134-25
+always turmalin 2345-136-1235-134-25-35
+always small 234-134-1-12345
+begmidword wachsmal 2456-56-234-134-25
+begmidword lautmal 123-16-2345-134-25
+begmidword rumalber 1235-136-134-25-12-12456
+begmidword aufzumal 2-16-2-1356-134-25
+begword rumzumal 1235-136-134-2-1356-134-25
+begword herumzumal 125-12456-136-134-2-1356-134-25
+begmidword anzumal 235-2-1356-134-25
+begword auszumal 34-2-1356-134-25
+midword auszumal 16-234-2-1356-134-25
+always herumalber 125-12456-136-134-25-12-12456
+begmidword serumallerg 234-12456-136-134-1-12345-12456-1245
+begmidword schwarzmal 156-2456-356-1356-134-25
+
+# MAN   (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word man 134
+
+# MANN MÄNN (4.4 Zweiformige Kürzungen)
+always mann 134-1345
+always männ 5-134-1345
+always manna 134-235-1345-1
+always mannequin 134-235-1345-15-6-12345-136-35
+always mannesmann 134-235-1345-123456-134-235-1345
+always mannheim 134-235-1345-125-146-134
+always mannit 134-235-1345-24-2345
+always mannomann 134-235-1345-135-134-235-1345
+always mannus 134-235-1345-136-234
+always hamann 125-1-134-235-1345
+always lindemann 123-35-145-15-134-235-1345
+always bangemann 12-235-12346-134-235-1345
+always thiemann 2345-125-346-134-235-1345
+always riemann 1235-346-134-235-1345
+always alemann 25-15-134-235-1345
+always telemann 2345-13456-15-134-235-1345
+always dörlemann 145-246-1235-123-15-134-235-1345
+always thienemann 2345-125-346-1345-15-134-235-1345
+always heinemann 125-1246-15-134-235-1345
+always hannemann 125-235-1345-15-134-235-1345
+always spannemann 234-1234-235-1345-15-134-235-1345
+always stresemann 23456-1235-123456-15-134-235-1345
+always hoffmann 125-135-124-124-134-235-1345
+always hofmannsthal 125-135-124-134-235-1345-234-2345-125-1-123
+always bachmann 12-56-134-235-1345
+always eichmann 146-1456-134-235-1345
+always fleischmann 124-123-146-156-134-235-1345
+always lehmann 123-2356-134-235-1345
+always lohmann 123-135-125-134-235-1345
+always luhmann 123-136-125-134-235-1345
+always beckmann 23-46-134-235-1345
+always bruckmann 12-1235-136-46-134-235-1345
+always henkelmann 125-14-13-13456-134-235-1345
+always brinkmann 12-1235-35-13-134-235-1345
+always volkmann 1236-135-123-13-134-235-1345
+always thälmann 2345-125-345-123-134-235-1345
+always engelmann 14-1245-13456-134-235-1345
+always fielmann 124-346-123-134-235-1345
+always nickelmann 1345-24-46-13456-134-235-1345
+always mümmelmann 134-1256-1346-13456-134-235-1345
+always bühlmann 12-1256-125-123-134-235-1345
+always ammann 1-134-134-1345
+always dobermann 145-135-12-12456-134-235-1345
+always hermann 125-12456-134-235-1345
+always heiermann 125-146-12456-134-235-1345
+# HOMONYM
+always ackermann 1-46-12456-134-235-1345
+always eckermann 15-46-12456-134-235-1345
+always neckermann 1345-15-46-12456-134-235-1345
+always ballermann 12-1-12345-12456-134-235-1345
+always mustermann 134-136-23456-12456-134-235-1345
+always scheuermann 156-126-12456-134-235-1345
+always drewermann 145-1235-15-2456-12456-134-235-1345
+always normann 1345-26-134-235-1345
+always schürmann 156-1256-1235-134-235-1345
+always bertelsmann 12-12456-2345-13456-234-134-235-1345
+always hartmann 125-356-2345-134-235-1345
+always mettmann 134-15-2345-2345-134-235-1345
+always naumann 1345-16-134-235-1345
+always neumann 1345-126-134-235-1345
+always schumann 156-136-134-235-1345
+always schwarzmann 156-2456-356-1356-134-235-1345
+
+# MASCHIN (4.4 Zweiformige Kürzungen)
+always maschin 134-156
+always parmaschinken 1234-356-134-1-156-35-13-14
+
+# MATERIAL (4.4 Zweiformige Kürzungen)
+always material 134-123
+
+# MATERIELL (4.4 Zweiformige Kürzungen)
+always materiell 134-12345
+
+# MEHR (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word mehr 2356
+always mehr-\s 2-2356-36-0
+always mehr 2-2356
+
+# MIR (4.4 Zweiformige Kürzungen)
+always mir 134-1235
+always mir's 134-1235-6-234
+always mira 134-24-1235-1
+always miranda 134-24-1235-235-145-1
+sufword mirek 134-24-1235-15-13
+always miriam 134-24-1235-24-1-134
+always mirjam 134-24-1235-245-1-134
+sufword mirka 134-24-1235-13-1
+sufword mirko 134-24-1235-13-135
+sufword miro 134-24-1235-135
+prfword mirror 134-24-1235-1235-135-1235
+begmidword mirror 134-24-1235-1235-26
+always mirza 134-24-1235-1356-1
+always pamir 1234-1-134-24-1235
+always ramirez 1235-1-134-24-1235-15-1356
+always samir 234-1-134-24-1235
+prfword admiral 1-145-134-24-1235-1-123
+begmidword admiral 1-145-134-24-1235-25
+always admiräl 1-145-134-24-1235-345-123
+always emir 12356-24-1235
+always schmirgel 156-134-24-1235-1245-13456
+begmidword schmirg 156-134-24-1235-1245
+always kaschmir 13-1-156-134-24-1235
+always vladimir 1236-123-1-145-24-134-24-1235
+always wladimir 2456-123-1-145-24-134-24-1235
+always kasimir 13-1-234-24-134-24-1235
+always krimireih 13-1235-24-134-24-1235-146-125
+always gummir 1245-136-1346-24-1235
+always jaromir 245-356-135-134-24-1235
+always dobromir 145-135-12-1235-135-134-24-1235
+always dormir 145-26-134-24-1235
+always smirno 234-134-24-1235-1345-135
+always herumirr 125-12456-136-134-24-1235-1235
+always taymir 2345-1-6-13456-134-24-1235
+always izmir 24-1356-134-24-1235
+
+# MIT (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word mit 2345
+always mit-\s 2-2345-36-0
+always mit 2-2345
+word mitch 134-24-2345-1456
+sufword mitchum 134-24-2345-1456-136-134
+sufword mitchell 134-24-2345-1456-15-12345
+begmidword mithr 134-24-2345-125-1235
+always mitil 134-24-2345-24-123
+always mitochond 134-24-2345-135-1456-135-1345-145
+always mitos 134-24-2345-135-234
+always mitra 134-24-2345-1235-1
+always mitraill 134-24-2345-1235-1-24-12345
+always mitrauch 2-2345-1235-16-1456
+begword mitrida 134-24-2345-1235-24-145-1
+always mitropa 134-24-2345-1235-135-1234-1
+always mitsubishi 134-24-2345-234-136-12-24-234-125-24
+always mitt 134-24-2345-2345
+always mittag 134-24-2345-2345-1-1245
+prfword mittage 134-24-2345-2345-1-12346
+always mittanz 2-2345-2345-235-1356
+always mittänz 2-2345-2345-345-1345-1356
+always mittäter 2-2345-2345-345-2345-12456
+prfword mitte 134-24-2345-236
+always mitteil 2-2345-2345-146-123
+always mitten 134-24-2345-2345-14
+always mitter 134-24-2345-2345-12456
+always mittet 134-24-2345-236-2345
+always mittler 134-24-2345-2345-123-12456
+always mittrag 2-2345-2345-1245
+always mittrauer 2-2345-2345-1235-16-12456
+always mittreu 2-2345-2345-1235-126
+always mittrink 2-2345-2345-1235-35-13
+always mittrug 2-2345-2345-1235-136-1245
+always mittun 2-2345-2345-256
+always mittäg 134-24-2345-2345-345-1245
+word mitzi 134-24-2345-1356-24
+word mitzis 134-24-2345-1356-24-234
+begmidword amitos 1-134-24-2345-135-234
+always amitotisch 1-134-24-2345-135-2345-24-156
+always adamit 1-145-1-134-24-2345
+always hamitisch 125-1-134-24-2345-24-156
+always kalamit 13-25-1-134-24-2345
+always kalamität 13-25-1-134-5-345
+always salamitaktik 234-25-1-134-24-2345-1-13-2345-24-13
+always salamitechnik 234-25-1-134-24-2345-13
+always islamit 24-234-123-1-134-24-2345
+always annamit 235-1345-1-134-24-2345
+always dynamit 145-6-13456-1345-1-134-24-2345
+always admittanz 1-145-134-24-2345-2345-235-1356
+begmidword emitt 12356-24-2345-2345
+always endemit 14-145-15-134-24-2345
+always hindemith 125-35-145-15-134-24-2345-125
+always remittend 1235-12356-24-2345-2345-14-145
+always remittent 1235-12356-24-2345-2345-14-2345
+always remittier 1235-12356-24-2345-2345-346-1235
+always eremit 12456-12356-24-2345
+sufword extremität 1346-2345-1235-12356-5-345
+always extremität 15-6-1346-2345-1235-12356-5-345
+endword semit 234-12356-24-2345
+always semiten 234-12356-24-2345-14
+always semitin 234-12356-24-2345-35
+always semitisch 234-12356-24-2345-24-156
+always semitismus 234-12356-24-2345-5-24
+always semitist 234-12356-24-2345-24-23456
+prfword philosemit 1234-125-24-123-135-234-12356-24-2345
+begmidword philosemit 1234-125-24-123-135-234-12356-24-2345
+always stalagmit 23456-25-1-1245-134-24-2345
+always schmitt 156-134-24-2345-2345
+prfword schmitte 156-134-24-2345-236
+always schmittel 156-134-2345
+always schmitz 156-134-24-2345-1356
+always imitat 24-134-24-2345-1-2345
+prfword imitate 24-134-24-2345-1-236
+always imitation 24-134-24-2345-5-1345
+always imitier 24-134-24-2345-346-1235
+begmidword dimitr 145-24-134-24-2345-1235
+always limit 123-24-134-24-2345
+begmidword limit 123-24-134-24-2345
+prfword limite 123-24-134-24-236
+always limits 123-24-134-24-2345-234
+always nimita 1345-24-134-24-2345-1
+always primitiv 1234-1235-24-134-24-2345-24-1236
+always legitimität 123-15-1245-24-2345-24-134-5-345
+begmidword antimitoti 235-2345-24-134-24-2345-135-2345-24
+always intimität 35-2345-24-134-5-345
+always gummi 1245-136-1346-24
+always gummier 1245-136-1346-346-1235
+always sodomit 234-135-145-135-134-24-2345
+always sodomitisch 234-135-145-135-134-24-2345-24-156
+always sodomitisch 234-135-145-135-134-24-2345-24-156
+always komitee 13-135-134-24-2345-15-15
+always dolomit 145-135-123-135-134-24-2345
+always bromit 12-1235-135-134-24-2345
+always kompromittier 13-135-134-1234-1235-135-134-24-2345-2345-346-1235
+always neurodermitis 1345-126-1235-135-145-12456-134-24-2345-24-234
+sufword kermit 13-12456-134-24-2345
+sufword permit 1234-12456-134-24-2345
+prfword termite 2345-12456-134-24-236
+always termiten 2345-12456-134-24-2345-14
+always intermittier 35-2345-12456-134-24-2345-2345-346-1235
+always dormitori 145-26-134-24-2345-26-24
+always deformität 145-15-124-26-134-5-345
+always uniformität 256-24-124-26-134-5-345
+always konformität 13-135-1345-124-26-134-5-345
+always abnormität 1-12-1345-26-134-5-345
+sufword smith 234-134-24-2345-125
+prfword smith 234-134-24-2345-125
+prfword smiths 234-134-24-2345-125-234
+sufword smitja 234-134-24-2345-245-1
+always transmit 2345-1235-235-234-134-24-2345
+always anonymität 235-135-1345-6-13456-134-5-345
+always zmittag 1356-134-24-2345-2345-1-1245
+always zmitzt 1356-134-24-2345-1356-2345
+
+# MITTEL (4.4 Zweiformige Kürzungen)
+always mittel 134-2345
+
+# MM  (4.1 Lautgruppenkürzungen)
+midendword mm 1346
+word mmh 134-134-125
+word mmm 134-134-134
+always mmmh 134-134-134-125
+always mmmmh 134-134-134-134-125
+before m always team 2345-15-1-134
+always schrämmaschin 156-1235-345-134-134-156
+always tandem 2345-235-145-12356
+sufword problem 12345-12-123-12356
+midendword problem 1234-1235-135-12-123-12356
+always einemmal 1246-12356-134
+before m always atem 1-2345-12356
+always system 234-6-13456-23456-12356
+before m always hm 125-134
+word hmm 125-134-134
+always hmmm 125-134-134-134
+always hmmmm 125-134-134-134-134
+before m midword ehm 2356-134
+before m begmidword intim 35-2345-24-134
+always immaterial 24-134-134-123
+always immateriell 24-134-134-12345
+before m begmidword heim 125-146-134
+before m begmidword leim 123-146-134
+before m begmidword lm 123-134
+before m begmidword alm 25-134
+before m begmidword elm 13456-134
+always diplom 145-24-1234-123-135-134
+always genommut 1245-14-135-134-134-136-2345
+before m begmidword strom 23456-1235-135-134
+before m begmidword atom 1-2345-135-134
+before m begmidword rm 1235-134
+before m begmidword arm 356-134
+before m begmidword orm 26-134
+before m begmidword aum 16-134
+before m begmidword äum 34-134
+before m begmidword ium 24-136-134
+begmidword ummagn 136-134-134-1-1245-1345
+always ummantel 136-134-134-235-2345-13456
+always ummauer 136-134-134-16-12456
+always ummeld 136-134-134-13456-145
+always ummobil 136-134-134-135-12-24-123
+begmidword ummöb 136-134-134-246-12
+always ummodel 136-134-134-135-145-13456
+always ummodell 136-134-134-135-145-15-12345
+begmidword ummodl 136-134-134-135-145-123
+always ummont 136-134-134-135-1345-2345
+always ummünz 136-134-134-1256-1345-1356
+before m begword rum 1235-136-134
+prfword rumm 1235-136-1346
+always rummel 1235-136-1346-13456
+always rumml 1235-136-1346-123
+prfword rumms 1235-136-1346-234
+always rummy 1235-136-1346-6-13456
+always krumm 13-1235-136-1346
+always krummesser 13-1235-136-134-134-15-2346-12456
+before m always herum 125-12456-136-134
+begmidword herummal 125-12456-136-134-134-25
+before m always konsum 13-135-1345-234-136-134
+always vakuum 1236-1-13-136-136-134
+always enzym 14-1356-6-13456-134
+
+# MÖCHT (4.3.5 Einformige Kürzungen, nur mit Erweiterung)
+word möcht 134-246-1456-2345
+always möcht's 134-246-1456-2345-6-234
+always möcht 1456
+
+# MÖG (4.3.6 Kommakürzungen)
+always mög 2-246
+
+# MÖGLICH (4.4 Zweiformige Kürzungen)
+always möglich 134-456
+
+# MUSIK (4.4 Zweiformige Kürzungen)
+always musik 134-13
+always musikalien 134-13-25-24-14
+
+# MUSS (4.4 Zweiformige Kürzungen)
+always muss 134-2346
+# Alte Rechtschreibung
+always muß 134-2346
+# Daher auch nötig:
+word muße 134-136-2346-15
+always musselin 134-136-2346-13456-35
+always mussolini 134-136-2346-135-123-35-24
+always rhythmus 1235-125-6-13456-2345-125-134-136-234
+always orgasmus 26-1245-1-234-134-136-234
+always rasmussen 1235-1-234-134-136-2346-14
+always humusschicht 125-136-134-136-234-156-3456-2345
+
+# MÜSS (4.3.6 Kommakürzungen)
+always müss 2-134
+# Alte Rechtschreibung
+always müß 2-134
+always müßig 134-1256-2346-45
+
+# NACHDEM (4.4 Zweiformige Kürzungen)
+always nachdem 1345-145
+
+# NÄCHST (4.4 Zweiformige Kürzungen)
+always nächst 1345-23456
+
+# NAHM (4.4 Zweiformige Kürzungen)
+always nahm 1345-134
+always nähm 5-1345-134
+always nähmaschin 1345-345-125-134-156
+always nahme 1345-134-15
+always nahmen 1345-134-14
+# Ausnahmen bei nahmen?
+
+# NATUR (4.4 Zweiformige Kürzungen)
+always natur 1345-2345
+begmidword natural 1345-2345-25
+always signatur 234-45-1345-1-2345-136-1235
+
+# NATÜRLICH (4.4 Zweiformige Kürzungen)
+always natürlich 1345-456
+
+# NEBEN (4.4 Zweiformige Kürzungen)
+always neben 1345-12
+always medianeben 134-15-145-24-235-15-12-14
+always beckeneben 23-46-14-15-12-14
+always bedieneben 23-145-346-1345-15-12-14
+always dateneben 145-1-2345-14-15-12-14
+always etageneben 15-2345-1-1245-14-15-12-14
+sufword experteneben 1346-1234-12456-2345-14-15-12-14
+midendword experteneben 15-6-1346-1234-12456-2345-14-15-12-14
+always kosteneben 13-135-23456-14-15-12-14
+always koordinateneben 13-135-26-145-35-1-2345-14-15-12-14
+always küsteneben 13-1256-23456-14-15-12-14
+always maschineneben 134-156-14-15-12-14
+always platineneben 1234-123-1-2345-35-14-15-12-14
+always zeicheneben 1356-146-1456-14-15-12-14
+always rheineben 1235-125-1246-15-12-14
+always brenneben 12-1235-14-1345-15-12-14
+always uneben 256-15-12-14
+
+# NEHM (4.4 Zweiformige Kürzungen)
+always nehm 1345-125
+
+# NICHT (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word nicht 1345
+always nicht-\s 2-1345-36-0
+always nicht 2-1345
+word nichte 1345-3456-236
+word nichten 1345-3456-2345-14
+endword ingsnichte 35-1245-234-1345-3456-236
+endword ingsnichten 35-1245-234-1345-3456-2345-14
+word großnichte 1245-2346-1345-3456-236
+word großnichten 1245-2346-1345-3456-2345-14
+
+# NICHTIG (4.4 Zweiformige Kürzungen)
+always nichtig 1345-45
+
+# NICHTS (4.4 Zweiformige Kürzungen)
+always nichts 1345-234
+always nichtschrumpf 2-1345-156-1235-136-134-1234-124
+always nichtschwimm 2-1345-156-2456-24-1346
+always nichtsein 2-1345-234-1246
+always nichtselb 2-1345-234-13456-12
+always nichtselbstständig 2-1345-234-23456-5-23456-45
+always nichtsehen 2-1345-234-2356-14
+always nichtsequentiell 2-1345-234-15-6-12345-136-14-2345-24-15-12345
+always nichtsequenziell 2-1345-234-15-6-12345-136-14-1356-24-15-12345
+always nichtsess 2-1345-234-15-2346
+always nichtspezialisier 2-1345-234-1234-15-1356-24-25-24-234-346-1235
+always nichtsportler 2-1345-234-1234-26-2345-123-12456
+always nichtsprach 2-1345-234-1234
+always nichtstaat 2-1345-23456-2345
+
+# -NIS   4.2.1 a) Nachsilbenkürzungen
+midendword nis 1346
+midendword nisation 1345-24-234-5-1345
+always nisch 1345-24-156
+begmidword minischlang 134-35-24-156-123-235-1245
+prfword minischlange 134-35-24-156-123-235-12346
+midendword nisier 1345-24-234-346-1235
+midendword nismen 1345-24-234-134-14
+always nist 1345-24-23456
+always ergebnis 12456-12346-12-1346
+midendword ängnis 345-1345-1245-1346
+midendword ächtnis 345-1456-2345-1346
+always kenntnis 13-14-1345-2345-1346
+midword nistheor 1346-2345-125-15-26
+always nistisch 1345-5-156
+always inistisch 35-5-156
+always anis 235-24-234
+begmidword vaniss 1236-235-24-2346
+begmidword pianissi 1234-24-235-24-2346-24
+always änis 345-1345-24-234
+always anisch 235-24-156
+always änisch 345-1345-24-156
+midendword anisier 235-24-234-346-1235
+midendword anismen 235-24-234-134-14
+midendword anismus 235-5-24
+always anist 235-24-23456
+begmidword organisat 26-1245-235-24-234-1-2345
+always organisation 26-1245-235-24-234-5-1345
+begmidword organisationsauf 26-1245-235-24-234-5-1345-234-2-16
+always organisier 26-1245-235-24-234-346-1235
+always mechanismus 134-15-1456-235-5-24
+midendword enisch 14-24-156
+midendword enismus 14-5-24
+midword enisol 14-24-234-135-123
+word benis 12-14-24-234
+always denise 145-14-24-234-15
+always denises 145-14-24-234-123456
+midendword genisier 1245-14-24-234-346-1235
+always hygienisch 125-6-13456-1245-24-14-24-156
+always hygienisier 125-6-13456-1245-24-14-24-234-346-1235
+always italienisch 24-2345-25-24-14-24-156
+always hellenisier 125-15-12345-14-24-234-346-1235
+always menisk 134-14-24-234-13
+always penis 1234-14-24-234
+endword enisch 14-24-156
+endword enische 14-24-156-15
+endword enischem 14-24-156-12356
+endword enischen 14-24-156-14
+endword enischer 14-24-156-12456
+endword enisches 14-24-156-123456
+always penisse 1234-14-24-2346-15
+always penissen 1234-14-24-2346-14
+always penisses 1234-14-24-2346-123456
+begmidword serenissim 234-12456-14-24-2346-24-134
+midendword inisch 35-24-156
+midendword inisier 35-24-234-346-1235
+midendword inismen 35-24-234-134-14
+midendword inismus 35-5-24
+midendword inist 35-24-23456
+always puccinis 1234-136-6-14-6-14-35-24-234
+always einisch 1246-24-156
+always lateinisch 123-1-2345-1246-24-156
+always steinisch 23456-1246-24-156
+always finis 124-35-24-234
+always bikinis 12-24-13-35-24-234
+always fellinis 124-15-12345-35-24-234
+always mussolinis 134-136-2346-135-123-35-24-234
+always minist 134-35-24-23456
+always reminiszenz 1235-12356-35-24-234-1356-14-1356
+always paganinis 1234-1-1245-235-35-24-234
+always abessinisch 1-23-2346-35-24-156
+always rossinis 1235-135-2346-35-24-234
+always martinis 134-356-2345-35-24-234
+always lemniska 123-12356-1345-24-234-13-1
+always annis 235-1345-24-234
+always annisch 235-1345-24-156
+always alemannisch 25-15-134-235-1345-24-156
+always normannisch 1345-26-134-235-1345-24-156
+always dennis 145-14-1345-24-234
+always tennis 2345-14-1345-24-234
+always ronnis 1235-135-1345-1345-24-234
+word draconis 145-1235-1-6-14-135-1345-24-234
+always berlusconis 12-12456-123-136-234-6-14-135-1345-24-234
+always onismus 135-1345-5-24
+always adonis 1-145-135-1345-24-234
+always adonisch 1-145-135-1345-24-156
+always mahagoni 134-1-125-1-1245-135-1345-24
+always diakoniss 145-24-1-13-135-1345-24-2346
+word monis 134-135-1345-24-234
+always simonis 234-24-134-135-1345-24-234
+prfword tonis 2345-135-1345-24-234
+always tönisvorst 2345-246-1345-24-234-1236-26-23456
+always garnison 1245-356-1345-24-234-135-1345
+always vernissa 1236-12456-1345-24-2346-1
+always modernismus 134-135-145-12456-1345-5-24
+always firnis 124-24-1235-1345-24-234
+always firnisse 124-24-1235-1345-24-2346-15
+always firnissen 124-24-1235-1345-24-2346-14
+always horniss 125-26-1345-24-2346
+always unis 256-24-234
+midendword unisch 256-24-156
+midendword unismus 256-5-24
+midendword unist 256-24-23456
+midendword unistisch 256-5-156
+always junis 245-256-24-234
+always immunisier 24-1346-256-24-234-346-1235
+always punisch 1234-256-24-156
+always zynismus 1356-6-13456-1345-5-24
+
+# NOCH (4.4 Zweiformige Kürzungen)
+always noch 1345-1456
+always adrenochrom 1-145-1235-14-135-1456-1235-135-134
+always knoch 13-1345-135-1456
+always monochemo 134-135-1345-135-1456-12356-135
+always monochrom 134-135-1345-135-1456-1235-135-134
+always hornochs 125-26-1345-135-1456-234
+
+# NOMMEN (4.4 Zweiformige Kürzungen)
+always nommen 1345-1346
+
+# NOTWENDIG (4.4 Zweiformige Kürzungen)
+always notwendig 1345-2456
+
+# NUR (4.4 Zweiformige Kürzungen)
+always nur 1345-1235
+sufword nurejew 1345-136-1235-15-245-15-2456
+sufword nurgon 1345-136-1235-1245-135-1345
+midendword nurheb 1345-136-1235-125-15-12
+midendword nurkund 1345-136-1235-13-256-145
+midendword nurlaub 1345-136-1235-123-16-12
+midendword nursach 1345-136-1235-234-56
+midendword nursäch 1345-1235-234-345-1456
+always nurse 1345-136-1235-234-15
+prfword nurse 1345-136-1235-234-123456
+midendword nursprung 1345-136-1235-234-1234-1235-256-1245
+midendword nursprüng 1345-136-1235-234-1234-1235-1256-1345-1245
+midendword nursäch 1345-136-1235-234-345-1456
+midendword nurteil 1345-136-1235-2345-146-123
+sufword nuruddin 1345-136-1235-136-145-145-35
+always anura 235-136-1235-1
+always anuren 235-136-1235-14
+always anurie 235-136-1235-346
+always anurien 235-136-1235-24-14
+begmidword kanuregat 13-235-136-1235-15-1245-1-2345
+begmidword kanurenn 13-235-136-1235-14-1345
+midendword enurheb 14-136-1235-125-15-12
+midendword enurkund 14-136-1235-13-256-145
+midendword enurlaub 14-136-1235-123-16-12
+midendword enursach 14-136-1235-234-56
+midendword enursprung 14-136-1235-234-1234-1235-256-1245
+midendword enursprüng 14-136-1235-234-1234-1235-1256-1345-1245
+midendword enursäch 14-136-1235-234-345-1456
+midendword enurteil 14-136-1235-2345-146-123
+begmidword totenurn 2345-135-2345-14-136-1235-1345
+always schnur 156-1345-136-1235
+midendword inurie 35-136-1235-346
+midendword inurien 35-136-1235-24-14
+always knurr 13-1345-136-1235-1235
+always baikonur 12-1-24-13-135-1345-136-1235
+midendword tonurie 2345-135-1345-136-1235-346
+midendword tonurien 2345-135-1345-136-1235-24-14
+
+# NUTZ NÜTZ (4.4 Zweiformige Kürzungen)
+always nutz 1345-1356
+always nütz 5-1345-1356
+midendword anutz 1-1345-1356
+midendword anütz 1-5-1345-1356
+midendword enutz 15-1345-1356
+midendword enütz 15-5-1345-1356
+always benutz 23-1345-1356
+always benütz 23-5-1345-1356
+always genutz 12346-1345-1356
+always genütz 12346-5-1345-1356
+midendword inutz 24-1345-1356
+midendword inütz 24-5-1345-1356
+always einutz 146-1345-1356
+always einütz 146-5-1345-1356
+midendword unutz 136-1345-1356
+midendword unütz 136-5-1345-1356
+
+# ODER  (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word oder 135
+
+# ÖFFENTLICH (4.4 Zweiformige Kürzungen)
+always öffentlich 246-456
+
+# OHNE (4.4 Zweiformige Kürzungen)
+always ohne 135-15
+always bohn 12-135-125-1345
+always hohn 125-135-125-1345
+always john 245-135-125-1345
+always lohn 123-135-125-1345
+always mohn 134-135-125-1345
+always rohn 1235-135-125-1345
+always frohnatur 124-1235-135-125-1345-2345
+always sohn 234-135-125-1345
+always wohn 2456-135-125-1345
+
+# OR  (4.1 Lautgruppenkürzungen)
+begmidword or 26
+endword or-\s 26-36-0
+endword or-,\s 26-36-2-0
+always kakao 13-1-13-1-135
+always disco 145-24-234-6-14-135
+always discount 145-24-234-6-14-135-136-1345-2345
+always kommando 13-1346-235-145-135
+always pseudo 1234-234-126-145-135
+before r begmidword judo 245-136-145-135
+begmidword deoroll 145-15-135-1235-135-12345
+always video 1236-24-145-15-135
+always rodeo 1235-135-145-15-135
+always georelief 12346-135-1235-13456-24-15-124
+prfword neoreal 1345-15-135-1235-15-1-123
+begmidword neoreal 1345-15-135-1235-15-25
+begmidword neorenaiss 1345-15-135-1235-14-1-24-2346
+always stereo 23456-12456-15-135
+always indigo 35-145-45-135
+always kongo 13-135-1345-1245-135
+always jericho 245-12456-3456-135
+always bio 12-24-135
+always radio 1235-1-145-24-135
+always inforadio 35-124-135-1235-1-145-24-135
+always audio 16-145-24-135
+always studio 23456-136-145-24-135
+always risiko 1235-24-234-24-13-135
+always schoko 156-135-13-135
+always disko 145-24-234-13-135
+always hallo 125-1-12345-135
+begmidword beloru 12-13456-135-1235-136
+begmidword kloroll 13-123-135-1235-135-12345
+always gallo 1245-1-12345-135
+always solo 234-135-123-135
+always chemo 1456-12356-135
+always eskimo 123456-13-24-134-135
+always thermo 2345-125-12456-134-135
+always kino 13-35-135
+always mono 134-135-1345-135
+always porno 1234-26-1345-135
+always oor 135-135-1235
+begmidword koor 13-135-26
+begmidword nanoor 1345-235-135-26
+begword poritz 1234-135-1235-24-2345-1356
+begmidword poros 1234-135-1235-135-234
+begmidword porosität 1234-26-135-234-5-345
+midword oporos 135-1234-26-135-234
+always sapporo 234-1-1234-1234-26-135
+always tempo 2345-12356-1234-135
+always tempora 2345-12356-1234-26-1
+prfword temporal 2345-12356-1234-26-1-123
+begmidword temporal 2345-12356-1234-26-25
+always temporär 2345-12356-1234-26-345-1235
+always temporier 2345-12356-1234-26-346-1235
+always rororo 1235-135-1235-135-1235-135
+always libero 123-24-12-12456-135
+always makro 134-1-13-1235-135
+always mikro 134-24-13-1235-135
+always repro 1235-15-1234-1235-135
+always büro 12-1256-1235-135
+always neuro 1345-126-1235-135
+always veto 1236-15-2345-135
+always foto 124-135-2345-135
+always photo 1234-125-135-2345-135
+always puerto 1234-136-12456-2345-135
+always netto 1345-15-2345-2345-135
+always brutto 12-1235-136-2345-2345-135
+midword orhythm 135-1235-125-6-13456-2345-125-134
+always auto 16-2345-135
+prfword autor 16-2345-135-1235
+before konsonant begmidword autor 16-2345-26
+always autoren 16-2345-26-14
+always autorennbahn 16-2345-135-1235-14-1345-12-1-125-1345
+always autorennen 16-2345-135-1235-14-1345-14
+always autorennfahr 16-2345-135-1235-14-1345-2-1235
+always autorin 16-2345-26-35
+always autorisation 16-2345-26-24-234-5-1345
+always autorisier 16-2345-26-24-234-346-1235
+always autoritär 16-2345-26-24-2345-345-1235
+always autorität 16-2345-26-5-345
+always autoritativ 16-2345-26-24-2345-5-1236
+always autors 16-2345-26-234
+always autorschaft 16-2345-26-156
+always rätorom 1235-345-2345-135-1235-135-134
+always bravo 12-1235-1-1236-135
+
+# PARAGRAPH (4.4 Zweiformige Kürzungen)
+always paragraph 1234-1245
+
+# PERSON (4.4 Zweiformige Kürzungen)
+always person 1234-1345
+always persön 5-1234-1345
+prfword personalie 1234-1345-25-24-15
+always personalien 1234-1345-25-24-14
+
+# PHILOSOPH (4.4 Zweiformige Kürzungen)
+always philosoph 1234-125
+
+# PLATZ PLÄTZ (4.4 Zweiformige Kürzungen)
+always platz 1234-1356
+always plätz 5-1234-1356
+
+# PLÖTZLICH (4.4 Zweiformige Kürzungen)
+always plötzlich 1234-456
+
+# POLITIK (4.4 Zweiformige Kürzungen)
+always politik 1234-13
+
+# POLITISCH (4.4 Zweiformige Kürzungen)
+always politisch 1234-156
+
+# PRO- (4.2.1 Vorsilbenkürzungen)
+begword pro 12345
+sufword prokofjew 1234-1235-135-13-135-124-245-15-2456
+always prometh 1234-1235-135-134-15-2345-125
+sufword proust 1234-1235-135-136-23456
+sufword protasius 1234-1235-135-2345-1-234-24-136-234
+begmidword provenc 1234-1235-135-1236-14-6-14
+begmidword provenz 1234-1235-135-1236-14-1356
+
+# PUNKT PÜNKT (4.4 Zweiformige Kürzungen)
+always punkt 1234-2345
+always pünkt 5-1234-2345
+
+# Q   (4.1 Lautgruppenkürzungen)
+word q 6-12345
+always q 6-12345
+# Grossgeschriebene Wortanfänge erhalten sonst keinen Pt.6!
+noback context ["Q"]$u @6-12345
+
+# RECHT (4.4 Zweiformige Kürzungen)
+always recht 1235-2345
+always rechts 1235-2345-234
+always rechtschaffen 1235-2345-156-1-124-124-14
+always rechtsetz 1235-2345-2-15
+always rechtsprech 1235-2345-2-2346
+begmidword rechtsteh 1235-2345-23456-2356
+always rechtstell 1235-2345-2-13456
+always rechtstutz 1235-2345-23456-136-2345-1356
+always europarecht 126-1235-135-1234-1-1235-2345
+always brecht 12-1235-15-1456-2345
+prfword brechte 12-1235-15-1456-236
+always schreibrecht 156-12-1235-2345
+always halbrecht 125-25-12-1235-2345
+# HOMNYM
+always erbrecht 12456-12-1235-2345
+always zerbrecht 1356-12456-12-1235-15-1456-2345
+always dordrecht 145-26-145-1235-15-1456-2345
+midendword erecht 15-1235-2345
+always berecht 23-1235-2345
+always haberecht 2-125-15-1235-2345
+always gerecht 12346-1235-2345
+midendword ierecht 346-1235-2345
+midendword terecht 236-1235-2345
+always senkrecht 234-14-13-1235-2345
+always vetorecht 1236-15-2345-135-1235-2345
+always ruprecht 1235-136-1234-1235-15-1456-2345
+always utrecht 136-2345-1235-15-1456-2345
+
+# REGIER (4.4 Zweiformige Kürzungen)
+always regier 1235-1245
+always regieraum 1235-15-1245-346-1235-16-134
+always regieräum 1235-15-1245-346-1235-34-134
+always segregier 234-15-1245-1235-15-1245-346-1235
+always aggregier 1-1245-1245-1235-15-1245-346-1235
+
+# REHABILIT (4.4 Zweiformige Kürzungen)
+always rehabilit 1235-12
+
+# REPUBLIK (4.4 Zweiformige Kürzungen)
+always republik 1235-13
+
+# RICHT (4.3.6 Kommakürzungen)
+always richt 2-3456
+always bricht 12-1235-3456-2345
+always abricht 1-12-2-3456
+always schreibricht 156-12-2-3456
+always halbricht 125-25-12-2-3456
+always schubricht 156-136-12-2-3456
+always crichton 6-14-1235-3456-2345-135-1345
+always bericht 23-2-3456
+always ericht 15-2-3456
+always gericht 12346-2-3456
+always kehricht 13-2356-1235-3456-2345
+always röhricht 1235-246-125-1235-3456-2345
+always töricht 2345-246-1235-3456-2345
+prfword törichte 2345-246-1235-3456-236
+always törichtest 2345-246-1235-3456-236-23456
+always trichter 2345-1235-3456-2345-12456
+prfword stricht 23456-1235-3456-2345
+always maastricht 134-1-1-23456-1235-3456-2345
+
+# RÜCK (4.4 Zweiformige Kürzungen)
+always rück 1235-46
+always arück 1-1235-46
+always brück 12-1235-1256-46
+always abrück 1-12-1235-46
+always osnabrück 135-234-1345-1-12-1235-1256-46
+midendword erück 15-1235-46
+always berück 23-1235-46
+always gerück 12346-1235-46
+always perück 1234-12456-1256-46
+midendword terück 236-1235-46
+begword frück 124-1235-1256-46
+always krück 13-1235-1256-46
+always druckrücken 145-46-1235-1256-46-14
+always orück 135-1235-46
+always herrück 125-12456-1235-46
+always hunsrück 125-256-234-1235-1256-46
+
+# SAG (4.4 Zweiformige Kürzungen)
+always sag 234-1245
+always säg 5-234-1245
+before l begmidword säge 5-234-1245-15
+before m begmidword säge 5-234-1245-15
+always sag's 234-1245-6-234
+midendword sagent 234-1-1245-14-2345
+always sägerest 5-234-1245-15-1235-15-23456
+always sägerochen 5-234-1245-15-1235-135-1456-14
+midword saggreg 234-1-1245-1245-1235-15-1245
+always sägeunfall 5-234-1245-15-256-124-12345
+begmidword sägeunfäll 5-234-1245-15-256-5-124-12345
+always sagit 234-1-1245-24-2345
+always sago 234-1-1245-135
+always sagrada 234-1-1245-1235-1-145-1
+always lasagn 123-1-234-1-1245-1345
+midendword esagent 123456-1-1245-14-2345
+always disagio 145-24-234-1-1245-24-135
+always visag 1236-24-234-1-1245
+prfword visage 1236-24-234-1-12346
+always canossa 6-14-235-135-2346-1
+always corsag 6-14-26-234-1-1245
+prfword corsage 6-14-26-234-1-12346
+always korsag 13-26-234-1-1245
+prfword korsage 13-26-234-1-12346
+always kanossa 13-235-135-2346-1
+always assagai 1-2346-1-1245-1-24
+always massage 134-1-2346-1-12346
+always massagen 134-1-2346-1-1245-14
+always passage 1234-1-2346-1-12346
+always passagen 1234-1-2346-1-1245-14
+always passagier 1234-1-2346-1-1245-346-1235
+always messag 134-15-2346-1-1245
+prfword message 134-15-2346-1-12346
+always vernissag 1236-12456-1345-24-2346-1-1245
+prfword vernissage 1236-12456-1345-24-2346-1-12346
+midendword ausagier 16-234-1-1245-346-1235
+
+# -SAM   4.2.1 a) Nachsilbenkürzungen
+midendword sam 2346
+always samariter 234-1-134-356-24-2345-12456
+always samarkand 234-1-134-356-13-235-145
+always samba 234-1-134-12-1
+always sambation 234-1-134-12-5-1345
+always sambesi 234-1-134-12-123456-24
+always sambia 234-1-134-12-24-1
+always sambuc 234-1-134-12-136-6-14
+always samisch 234-1-134-24-156
+always samm 234-1-1346
+midword sammach 2346-134-56
+always samo 234-1-134-135
+always sampl 234-1-134-1234-123
+midword samplitud 234-1-134-1234-123-24-2345-136-145
+always samson 234-1-134-234-135-1345
+always samstag 234-1-134-234-2345-1-1245
+prfword samstage 234-1-134-234-2345-1-12346
+always samstäg 234-1-134-234-2345-345-1245
+always samsung 234-1-134-234-256-1245
+always samt 234-1-134-2345
+sufword verlangsam 36-123-1245-2346
+midword verlangsam 1236-12456-123-1245-2346
+always samuel 234-1-134-136-13456
+always samurai 234-1-134-136-1235-1-24
+always betriebsam 23-2345-1235-346-12-2346
+always rübsamen 1235-1256-12-234-1-134-14
+always windsamen 2456-35-145-234-1-134-14
+always fischmondsamen 124-24-156-134-135-1345-145-234-1-134-14
+midendword esamt 123456-1-134-2345
+always besam 23-234-1-134
+always besamm 23-234-1-1346
+always desambiguier 145-123456-1-134-12-45-136-346-1235
+always gesamt 12346-234-1-134-2345
+prfword gesamte 12346-234-1-134-236
+begmidword heeresameis 125-15-15-1235-123456-1-134-146-234
+sufword sesam 234-123456-1-134
+always gemüsesamen 12346-134-1256-234-15-234-1-134-14
+begmidword hanfsam 125-235-124-234-1-134
+before m begmidword langsam 123-1245-2346
+midendword ungsamt 136-234-1-134-2345
+always lauchsamen 123-16-1456-234-1-134-14
+always bisam 12-24-234-1-134
+always kürbisamen 13-1256-1235-12-24-234-234-1-134-14
+always chilisamen 1456-24-123-24-234-1-134-14
+always balsam 12-25-234-1-134
+before m begmidword salsa 234-25-234-1
+always baumsamen 12-16-134-234-1-134-14
+begword ansam 235-234-1-134
+always ansamm 235-234-1-1346
+always mensamahl 134-14-234-1-134-1-125-123
+always blumensamen 12-123-136-134-14-234-1-134-14
+always anemonensamen 235-12356-135-1345-14-234-1-134-14
+always rasensamen 1235-1-234-14-234-1-134-14
+always erbsensamen 12456-12-234-14-234-1-134-14
+always finkensamen 124-35-13-14-234-1-134-14
+always pflanzensamen 1234-124-123-235-1356-14-234-1-134-14
+always pillensamen 1234-24-12345-14-234-1-134-14
+always erbsensamen 12456-12-234-14-234-1-134-14
+always tomatensamen 2345-135-134-1-2345-14-234-1-134-14
+always blütensamen 12-123-1256-2345-14-234-1-134-14
+always löwenzahnsamen 123-246-2456-14-1356-1-125-1345-234-1-134-14
+always mohnsamen 134-135-125-1345-234-1-134-14
+always leinsamen 123-1246-234-1-134-14
+always mosambik 134-135-234-1-134-12-24-13
+always posamentier 1234-135-234-1-134-14-2345-346-1235
+always rosamund 1235-135-234-1-134-256-145
+sufword osama 135-234-1-134-1
+always brosam 12-1235-135-234-1-134
+always nitrosamin 1345-24-2345-1235-135-234-1-134-35
+always bärlappsamen 12-345-1235-123-1-1234-1234-234-1-134-14
+sufword verkehrsam 36-13-2356-1235-234-1-134
+midendword verkehrsam 1236-12456-13-2356-1235-234-1-134
+always assam 1-2346-1-134
+always grassamen 1245-1235-1-234-234-1-134-14
+always flachssamen 124-123-56-234-234-1-134-14
+always indossamen 35-145-135-2346-1-134-14
+begmidword unratssamm 256-1235-1-2345-234-234-1-1346
+always staatsamateur 23456-2345-234-1-134-1-2345-126-1235
+midendword schaftsamt 156-234-1-134-2345
+midendword sichtsamt 234-3456-2345-234-1-134-2345
+always arbeitsam 356-12-2346
+always arbeitsameis 356-12-234-1-134-146-234
+always arbeitsamt 356-12-234-1-134-2345
+begmidword bedecktsam 23-145-15-46-2345-234-1-134
+begmidword nacktsam 1345-1-46-2345-234-1-134
+sufword entsam 2346-234-1-134
+always entsam 14-2345-234-1-134
+midendword fahrtsamt 2-1235-2345-234-1-134-2345
+always unkrautsamen 256-13-1235-16-2345-234-1-134-14
+always usambara 136-234-1-134-12-356-1
+
+# SATZ SÄTZ (4.4 Zweiformige Kürzungen)
+always satz 234-1356
+always sätz 5-234-1356
+always glasätzung 1245-123-1-234-345-2345-1356-136
+
+# SCH (4.1 Lautgruppenkürzungen)
+word sch 6-156
+always sch 156
+midword schanc 234-1456-235-6-14
+midword schao 234-1456-1-135
+midendword scharakter 234-1456-13
+midendword schef 234-1456-15-124
+before f begmidword asche 1-156-15
+before f begmidword wäsche 2456-345-156-15
+before f begmidword fische 124-24-156-15
+always scheffel 156-15-124-124-13456
+always scheffl 156-15-124-124-123
+always tuschefüll 2345-136-156-15-124-1256-12345
+midendword schemie 234-1456-12356-346
+midword schemik 234-1456-12356-134-24-13
+always scherzando 234-1456-12456-1356-235-145-135
+always scherzo 234-1456-12456-1356-135
+midendword schirurg 234-1456-24-1235-136-1235-1245
+always schlösschen 156-123-246-2346-1456-14
+always schnäpschen 156-1345-345-1234-234-1456-14
+always school 234-1456-135-135-123
+midendword schromat 234-1456-1235-135-134-1-2345
+midendword schromo 234-1456-1235-135-134-135
+midendword schronik 234-1456-1235-135-1345-24-13
+midword schrono 234-1456-1235-135-1345-135
+midendword schüechli 234-1456-1256-15-1456-123-24
+always maraschino 134-356-1-234-1456-35-135
+begmidword eschatolo 123456-1456-1-2345-135-123-135
+always radieschen 1235-1-145-346-234-1456-14
+always lieschen 123-346-234-1456-14
+always brieschen 12-1235-346-234-1456-14
+always wieschen 2456-346-234-1456-14
+endword folgschor 124-1245-234-1456-135-1235
+midword folgschor 124-1245-234-1456-26
+midword folgschör 124-1245-234-1456-246-1235
+endword angschor 235-1245-234-1456-135-1235
+midword angschor 235-1245-234-1456-26
+midword angschör 235-1245-234-1456-246-1235
+always lieblingschat 123-346-12-123-35-1245-234-1456-1-2345
+midendword üchschen 1256-1456-234-1456-14
+endword ungschor 136-234-1456-135-1235
+midword ungschor 136-234-1456-26
+midword ungschör 136-234-1456-246-1235
+always ischia 24-234-1456-24-1
+always ischämie 24-234-1456-345-134-346
+always ischämien 24-234-1456-345-134-24-14
+always maischip 134-1-24-234-1456-24-1234
+always reischen 1235-146-234-1456-14
+always mischief 134-24-234-1456-346-124
+always prischen 1234-1235-24-234-1456-14
+always hälschen 125-345-123-234-1456-14
+prfword engelschor 14-1245-13456-234-1456-135-1235
+always engelschor 14-1245-13456-234-1456-26
+always engelschör 14-1245-13456-234-1456-246-1235
+prfword teufelschor 2345-126-124-13456-234-1456-135-1235
+always teufelschor 2345-126-124-13456-234-1456-26
+always teufelschör 2345-126-124-13456-234-1456-246-1235
+always hülschen 125-1256-123-234-1456-14
+always gänschen 1245-345-1345-234-1456-14
+always hänschen 125-345-1345-234-1456-14
+endword enschor 14-234-1456-135-1235
+midword enschor 14-234-1456-26
+midword enschör 14-234-1456-246-1235
+always möpschen 134-246-1234-234-1456-14
+endword sschen 2346-1456-14
+always bisschen 12-24-2346-1456-14
+always fässchen 124-345-2346-1456-14
+always gässchen 1245-345-2346-1456-14
+always tässchen 2345-345-2346-1456-14
+always klösschen 13-123-246-2346-1456-14
+always flüsschen 124-123-1256-2346-1456-14
+always küsschen 13-1256-2346-1456-14
+always nüsschen 1345-1256-2346-1456-14
+always heitscheck 125-234-1456-15-46
+always kabäuschen 13-1-12-34-234-1456-14
+always häuschen 125-34-234-1456-14
+always läuschen 123-34-234-1456-14
+always mäuschen 134-34-234-1456-14
+always knäuschen 13-1345-34-234-1456-14
+always päuschen 1234-34-234-1456-14
+always bläschen 12-123-345-234-1456-14
+always gläschen 1245-123-345-234-1456-14
+always häschen 125-345-234-1456-14
+always käschen 13-345-234-1456-14
+always näschen 1345-345-234-1456-14
+always väschen 1236-345-234-1456-14
+always döschen 145-246-234-1456-14
+always höschen 125-246-234-1456-14
+always röschen 1235-246-234-1456-14
+prfword fröschen 124-1235-246-156-14
+always blüschen 12-123-1256-234-1456-14
+
+# -SCHAFT 4.2.1 a) Nachsilbenkürzungen
+midendword schaft 156
+midendword schafts 156-234
+always gschaftl 1245-156-1-124-2345-123
+always mahagonischaft 134-1-125-1-1245-135-1345-24-156-1-124-2345
+always stiefelschaft 23456-346-124-13456-156-1-124-2345
+always barschaft 12-356-156-1-124-2345
+always nachbarschaft 1345-56-12-356-156
+always speerschaft 234-1234-15-15-1235-156-1-124-2345
+always herrschaft 1235-1235-156-1-124-2345
+always herrschafts 1235-1235-156-1-124-2345-234
+
+# SCHLAG SCHLÄG (4.4 Zweiformige Kürzungen)
+always schlag 156-1245
+always schläg 5-156-1245
+always flanschlager 124-123-235-156-123-1-1245-12456
+
+# SCHLIEß (4.4 Zweiformige Kürzungen)
+syllable schließ 156-2346
+
+# SCHON (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word schon 156
+
+# SCHREIB (4.4 Zweiformige Kürzungen)
+syllable schreib 156-12
+before m begmidword schreibe 156-12-15
+before s begmidword schreibe 156-12-15
+
+# SCHRIEB (4.3.6 Kommakürzungen)
+always schrieb 2-156
+
+# SCHRIFT (4.4 Zweiformige Kürzungen)
+always schrift 156-2345
+always schriftsteil 156-2345-234-2345-146-123
+
+# SCHWIERIG (4.4 Zweiformige Kürzungen)
+always schwierig 156-45
+
+# SEHR (4.4 Zweiformige Kürzungen)
+always sehr 234-1235
+always sehrest 234-2356-1235-15-23456
+always sehrind 234-2356-1235-35-145
+always sehrohr 234-2356-1235-135-125-1235
+always standesehr 2-23456-123456-2356-1235
+begmidword fernseh 124-12456-1345-234-2356
+midword dersehr 145-12456-234-2356-1235
+midword iersehr 346-1235-234-2356-1235
+always hausehr 125-16-234-2356-1235
+
+# SEIN (4.3.3 Einformige Kürzungen, alleinstehend oder am Wortanfang)
+sufword sein 246
+always seineufer 234-1246-15-136-124-12456
+
+# SELBST (4.4 Zweiformige Kürzungen)
+always selbst 234-23456
+# Alte Rechtschreibung
+always selbständig 234-13456-12-5-23456-45
+
+# SETZ (4.3.6 Kommakürzungen)
+always setz 2-15
+
+# SICH  (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word sich 14
+word sich's 14-6-234
+# sind die apostrophierten 4.3 nötig?: auf's ist's etc.
+
+# SIE   (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word sie 234
+word sie's 234-6-234
+
+# SIND (4.4 Zweiformige Kürzungen)
+always sind 234-145
+always sindbad 234-35-145-12-1-145
+midword sindefin 234-35-145-15-124-35
+always sindelfin 234-35-145-13456-124-35
+midendword sinder 234-35-145-12456
+midendword sindern 234-35-145-12456-1345
+midendword sinderin 234-35-145-12456-35
+midendword sinderinnen 234-35-145-12456-35-1345-14
+midendword sindex 234-35-145-15-6-1346
+midendword sindik 234-35-145-24-13
+midendword sindiz 234-35-145-24-1356
+midword sindoss 234-35-145-135-2346
+midword sindukt 234-35-145-136-13-2345
+midendword sindustrie 234-35-145-136-23456-1235-346
+midendword sindustrien 234-35-145-136-23456-1235-24-14
+midword sindustri 234-35-145-136-23456-1235-24
+
+# SITZ (4.3.6 Kommakürzungen)
+always sitz 2-24
+always lausitz 123-16-234-24-2345-1356
+
+# SO (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word so 1234
+always sobald 2-1234-12-25-145
+always sodann 2-1234-145-235-1345
+always sodass 2-1234-145-1-2346
+always soeben 2-1234-15-12-14
+always sofern 2-1234-124-12456-1345
+always sofort 2-1234-124-26-2345
+prfword sogar 2-1234-1245-1-1235
+always sogenannt 2-1234-12346-1345-235-1345-2345
+prfword sogenannte 2-1234-12346-1345-235-1345-236
+always sogleich 2-1234-1245-1456
+always solang 2-1234-123-1245
+always somit 2-1234-2-2345
+always sonach 2-1234-1345-56
+always sooft 2-1234-135-124-2345
+always sosehr 2-1234-234-1235
+always sosein 2-1234-234-1246
+always soso 2-1234-2-1234
+sufword soundso 2-1234-2-136-2-1234
+always soviel 2-1234-1236-123
+always soweit 2-1234-2456-2345
+always sowenig 2-1234-2456-45
+always sowie 2-1234-2-126
+always sowieso 2-1234-2-126-2-1234
+always sowohl 2-1234-2456-123
+always sozusagen 2-1234-2-1356-234-1245-14
+always allsogleich 1-12345-2-1234-1245-1456
+always genauso 12346-1345-16-2-1234
+always geradeso 12346-1235-1-145-15-2-1234
+always wieso 2-126-2-1234
+sufword umso 136-134-2-1234
+always umsonst 136-134-234-135-1345-23456
+always umsorg 136-134-234-26-1245
+prfword umsorge 136-134-234-26-12346
+always umsort 136-134-234-26-2345
+
+# SOLCH (4.4 Zweiformige Kürzungen)
+always solch 234-1456
+
+# SOLL (4.3.6 Kommakürzungen)
+always soll 2-234
+
+# SONDERN (4.4 Zweiformige Kürzungen)
+always sondern 234-1345
+begmidword sondernach 234-135-1345-145-12456-1345-56
+always sondernummer 234-135-1345-145-12456-1345-136-1346-12456
+always sondernutz 234-135-1345-145-12456-1345-1356
+
+# SOZIAL (4.4 Zweiformige Kürzungen)
+always sozial 234-123
+
+# SPIEL (4.3.6 Kommakürzungen)
+syllable spiel 2-346
+
+# SPRACH SPRÄCH (4.4 Zweiformige Kürzungen)
+always sprach 234-1234
+always spräch 5-234-1234
+always spracheck 234-1234-1235-56-15-46
+
+# SPRECH (4.3.6 Kommakürzungen)
+always sprech 2-2346
+
+# ß   (4.1 Lautgruppenkürzungen)
+always ß 2346
+
+# SS  (4.1 Lautgruppenkürzungen)
+midendword ss 2346
+midword ssch 234-156
+midendword sschnee 234-156-1345-15-15
+midword sssch 2346-156
+midendword ssschnee 2346-156-1345-15-15
+midendword ssschnur 2346-156-1345-136-1235
+midendword ssschrift 2346-156-2345
+syllable saison 234-1-24-234-135-1345
+syllable saitig 234-1-24-2345-45
+syllable sakramen 234-1-13-1235-1-134-14
+syllable sammellager 234-1-1346-13456-123-1-1245-12456
+syllable sammlung 234-1-1346-123-136
+syllable sammlungs 234-1-1346-123-136-234
+syllable sanierung 234-235-346-1235-136
+syllable sanktion 234-235-13-2345-245
+syllable satellit 234-1-236-12345-24-2345
+syllable sattel 234-1-2345-2345-13456
+syllable savann 234-1-1236-235-1345
+always segment 234-15-1245-134-14-2345
+prfword segmente 234-15-1245-134-14-236
+syllable sehnsuch 234-2356-1345-234-136-1456
+syllable sehnsüch 234-2356-1345-234-1256-1456
+syllable seidenmat 234-146-145-14-134-1-2345
+syllable sekretari 234-15-13-1235-15-2345-356-24
+syllable sekretär 234-15-13-1235-15-2345-345-1235
+syllable sektierer 234-15-13-2345-346-1235-12456
+syllable semester 234-12356-15-23456-12456
+syllable semestrig 234-12356-15-23456-1235-45
+syllable sepsis 234-15-1234-234-24-234
+syllable sequenz 234-15-6-12345-136-14-1356
+begmidword sexual 234-15-6-1346-136-25
+syllable sexuell 234-15-6-1346-136-15-12345
+syllable situation 234-24-2345-136-5-1345
+syllable skizz 234-13-24-1356-1356
+syllable sklave 234-13-123-1-1236-15
+syllable sklaven 234-13-123-1-1236-14
+syllable sklaverei 234-13-123-1-1236-12456-146
+syllable skorbut 234-13-26-12-136-2345
+syllable skrupel 234-13-1235-136-1234-13456
+syllable software 234-135-124-2345-2456-356-15
+syllable sohl 234-135-125-123
+syllable soldat 234-135-123-145-1-2345
+syllable solidarität 234-135-123-24-145-356-5-345
+always solist 234-135-123-24-23456
+always solistisch 234-135-123-5-156
+syllable souverän 234-135-136-1236-12456-345-1345
+syllable soziolo 234-135-1356-24-135-123-135
+syllable sparkass 234-1234-356-13-1-2346
+syllable spektakel 234-1234-15-13-2345-1-13-13456
+always spektr 234-1234-15-13-2345-1235
+syllable spekul 234-1234-15-13-136-123
+syllable spezialität 234-1234-15-1356-24-25-5-345
+syllable spezifi 234-1234-15-1356-24-124-24
+syllable spezifität 234-1234-15-1356-24-124-5-345
+syllable sphär 234-1234-125-345-1235
+syllable splitter 234-1234-123-24-2345-2345-12456
+syllable spricht 234-1234-1235-3456-2345
+syllable stadien 23456-1-145-24-14
+syllable stadion 23456-1-145-24-135-1345
+syllable stadium 23456-1-145-24-136-134
+syllable staffel 23456-1-124-124-13456
+syllable stahl 23456-1-125-123
+syllable statist 23456-1-2345-24-23456
+syllable statistisch 23456-1-2345-5-156
+syllable stausee 23456-16-234-15-15
+syllable stauseen 23456-16-234-15-14
+syllable stauung 23456-16-136
+syllable stipendi 23456-24-1234-14-145-24
+syllable stornierung 23456-26-1345-346-1235-136
+syllable strahl 23456-1235-1-125-123
+syllable strahlemann 23456-1235-1-125-123-15-134-1345
+syllable struktur 23456-1235-136-13-2345-136-1235
+syllable strähn 23456-1235-345-125-1345
+syllable student 23456-136-145-14-2345
+syllable städte 23456-345-145-236
+syllable städten 23456-345-145-2345-14
+syllable städter 23456-345-145-2345-12456
+syllable stämm 23456-345-1346
+syllable stärk 23456-345-1235-13
+syllable stöck 23456-246-46
+syllable störend 23456-246-1235-14-145
+syllable störer 23456-246-1235-12456
+syllable störung 23456-246-1235-136
+syllable störungs 23456-246-1235-136-234
+syllable stöß 23456-246-2346
+syllable stünd 23456-1256-1345-145
+always subjekt 234-136-12-245-15-13-2345
+prfword subjekte 234-136-12-245-15-13-236
+syllable subvention 234-136-12-1236-14-2345-245
+syllable sylvani 234-6-13456-123-1236-235-24
+syllable symbol 234-6-13456-134-12-135-123
+syllable symptom 234-6-13456-134-1234-2345-135-134
+syllable syndrom 234-6-13456-1345-145-1235-135-134
+syllable synkre 234-6-13456-1345-13-1235-15
+syllable synod 234-6-13456-1345-135-145
+syllable system 234-6-13456-23456-12356
+syllable szenarien 234-1356-14-356-24-14
+syllable säckel 234-345-46-13456
+syllable transfer 2345-1235-235-234-124-12456
+midendword ssaal 234-234-1-1-123
+always flussaal 124-123-136-2346-1-1-123
+midendword ssach 234-234-56
+begmidword missach 134-24-2346-56
+always sissach 234-24-2346-56
+always massachusetts 134-1-2346-56-136-234-15-2345-2345-234
+begmidword sprossachs 234-1234-1235-135-2346-56-234
+midendword ssaft 234-234-1-124-2345
+endword ssage 234-234-1245-15
+midendword ssagen 234-234-1245-14
+midendword ssalat 234-234-25-1-2345
+endword ssalate 234-234-25-1-236
+endword ssalbe 234-234-25-12-15
+midendword ssalben 234-234-25-12-14
+midendword ssaldo 234-234-25-145-135
+midendword ssalon 234-234-25-135-1345
+midendword ssalut 234-234-25-136-2345
+endword ssalute 234-234-25-136-236
+midendword ssamen 234-234-1-134-14
+midendword ssatir 234-234-1-2345-24-1235
+midendword ssatz 234-234-1356
+midendword ssätz 234-5-234-1356
+midendword ssaum 234-234-16-134
+midendword sschlag 234-156-1245
+midendword sschläg 234-5-156-1245
+midendword sschnur 234-156-1345-136-1235
+midendword sschul 234-156-136-123
+midword sschül 234-156-1256-123
+midendword sschrift 234-156-2345
+midendword ssee 234-234-15-15
+always chaussee 1456-16-2346-15-15
+prfword chausseen 1456-16-2346-15-14
+always odyssee 135-145-6-13456-2346-15-15
+prfword odysseen 135-145-6-13456-2346-15-14
+midendword sseel 234-234-15-15-123
+midendword sseen 234-234-15-14
+before e begmidword baisse 12-1-24-2346-15
+midendword ssegel 234-234-15-1245-13456
+midendword ssehen 234-234-2356-14
+midendword sseher 234-234-2356-12456
+endword ssehne 234-234-2356-1345-15
+midendword ssehnen 234-234-2356-1345-14
+midendword sseide 234-234-146-145-15
+midendword ssein 234-234-1246
+always passein 1234-1-2346-1246
+always hussein 125-136-2346-15-35
+always schlussein 156-123-136-2346-1246
+endword sseite 234-234-146-236
+midendword sseiten 234-234-146-2345-14
+midendword sseitig 234-234-146-2345-45
+midendword sseits 234-234-146-2345-234
+midword ssektor 234-234-15-13-2345-26
+endword ssektor 234-234-15-13-2345-135-1235
+midendword sselig 234-234-13456-45
+always fisselig 124-24-2346-13456-45
+always dusselig 145-136-2346-13456-45
+always fusselig 124-136-2346-13456-45
+always schusselig 156-136-2346-13456-45
+always pusselig 1234-136-2346-13456-45
+midword sseminar 234-234-12356-35-356
+endword sseminar 234-234-12356-35-1-1235
+midendword ssenat 234-234-14-1-2345
+midendword ssender 234-234-14-145-12456
+always peterssen 1234-15-2345-12456-234-234-14
+always fassender 124-1-2346-14-145-12456
+always prassender 1234-1235-1-2346-14-145-12456
+always hassender 125-1-2346-14-145-12456
+always schassender 156-1-2346-14-145-12456
+always nässender 1345-345-2346-14-145-12456
+always passender 1234-1-2346-14-145-12456
+always hissender 125-24-2346-14-145-12456
+always pissender 1234-24-2346-14-145-12456
+always küssender 13-1256-2346-14-145-12456
+always flussender 124-123-136-2346-14-145-12456
+always missender 134-24-2346-14-145-12456
+midendword ssendung 234-234-14-145-136
+midendword ssenken 234-234-14-13-14
+midendword ssenkung 234-234-14-13-136
+midword ssensor 234-234-14-234-26
+endword ssensor 234-234-14-234-135-1235
+midendword sserie 234-234-12456-24-15
+midendword sserien 234-234-12456-24-14
+midendword sserver 234-234-12456-1236-12456
+begmidword wasserver 2456-1-2346-12456-1236-12456
+always gewässer 12346-2456-345-2346-12456
+midendword ssetz 234-2-15
+endword sseuche 234-234-126-1456-15
+midendword sseuche 234-234-126-1456-14
+midendword ssheriff 234-234-125-12456-24-124-124
+midendword sshow 234-234-125-135-2456
+midendword ssibirisch 234-234-24-12-24-1235-24-156
+midendword ssicher 234-234-3456-12456
+midendword ssicht 234-234-3456-2345
+midendword ssiedlung 234-234-346-145-123-136
+midendword ssieg 234-234-346-1245
+endword ssiege 234-234-346-12346
+midendword ssiegen 234-234-346-1245-14
+midendword ssiegel 234-234-346-1245-13456
+midword ssignal 234-234-45-1345-25
+endword ssignal 234-234-45-1345-1-123
+midendword ssignatur 234-234-45-1345-1-2345-136-1235
+midendword ssilbig 234-234-24-123-12-45
+midendword ssilvani 234-234-24-123-1236-235-24
+midendword ssinn 234-234-35-1345
+always insass 35-234-1-2346
+always schloss 156-123-135-2346
+always russin 1235-136-2346-35
+always äbtissin 345-12-2345-24-2346-35
+midendword ssinus 234-234-35-136-234
+endword ssitte 234-234-24-2345-236
+midendword ssitten 234-234-24-2345-2345-14
+midendword ssitz 234-2-24
+midendword sskala 234-234-13-25-1
+midendword sskalen 234-234-13-25-14
+midendword sskat 234-234-13-1-2345
+midendword sskilauf 234-234-13-24-123-16-124
+midendword sskript 234-234-13-1235-24-1234-2345
+endword sskripte 234-234-13-1235-24-1234-236
+endword ssocke 234-234-135-46-15
+midendword ssockel 234-234-135-46-13456
+midendword ssocken 234-234-135-46-14
+endword ssode 234-234-135-145-15
+midendword ssoden 234-234-135-145-14
+midendword ssohn 234-234-135-125-1345
+after konsonant midendword sson 234-234-135-1345
+midendword ssonder 234-234-135-1345-145-12456
+midendword ssondern 234-234-1345
+endword ssonne 234-234-135-1345-1345-15
+midendword ssonnen 234-234-135-1345-1345-14
+endword ssorge 234-234-26-12346
+midendword ssorgen 234-234-26-1245-14
+midendword ssozial 234-234-123
+midendword sspalt 234-234-1234-25-2345
+endword sspalte 234-234-1234-25-236
+endword sspange 234-234-1234-235-12346
+midendword sspangen 234-234-1234-235-1245-14
+midendword sspannung 234-234-1234-235-1345-136
+midendword ssparen 234-234-1234-356-14
+endword ssparte 234-234-1234-356-236
+midendword ssparten 234-234-1234-356-2345-14
+midendword sspatel 234-234-1234-1-2345-13456
+midendword sspazier 234-234-1234-1-1356-346-1235
+midendword sspaß 234-234-1234-1-2346
+midendword sspeck 234-234-1234-15-46
+midendword sspediteur 234-234-1234-15-145-24-2345-126-1235
+midendword sspedition 234-234-1234-15-145-24-2345-245
+midendword sspeed 234-234-1234-15-15-145
+midendword sspeich 234-234-1234-146-1456
+midendword sspeis 234-234-1234-146-234
+endword sspende 234-234-1234-14-145-15
+midendword sspenden 234-234-1234-14-145-14
+midendword sspender 234-234-1234-14-145-12456
+midendword ssperr 234-234-1234-12456-1235
+midendword sspesen 234-234-1234-123456-14
+midendword sspiegel 234-234-1234-346-1245-13456
+midendword sspiel 234-2-346
+midendword sspindel 234-234-1234-35-145-13456
+midendword sspinn 234-234-1234-35-1345
+midendword sspion 234-234-1234-24-135-1345
+midword sspiral 234-234-1234-24-1235-25
+midword sspital 234-234-1234-24-2345-25
+endword sspital 234-234-1234-24-2345-1-123
+midendword sspitz 234-234-1234-24-2345-1356
+midendword ssport 234-234-1234-26-2345
+always passport 1234-1-2346-1234-26-2345
+midendword ssprach 234-234-1234
+midendword sspring 234-234-1234-1235-35-1245
+endword sspringe 234-234-1234-1235-35-12346
+midendword ssprint 234-234-1234-1235-35-2345
+midendword sspritz 234-234-1234-1235-24-2345-1356
+midendword sspross 234-234-1234-1235-135-2346
+midendword sspruch 234-234-1234-1235-136-1456
+midendword ssprung 234-234-1234-1235-256-1245
+midendword ssprüch 234-234-1234-1235-1256-1456
+midword ssprüng 234-234-1234-1235-1256-1345-1245
+endword ssprünge 234-234-1234-1235-1256-1345-12346
+midendword sspur 234-234-1234-136-1235
+midendword sspänner 234-234-1234-345-1345-1345-12456
+midendword sspännig 234-234-1234-345-1345-1345-45
+midendword sspül 234-234-1234-1256-123
+midendword sspür 234-234-1234-1256-1235
+before s begmidword steins 23456-1246-234
+before s begmidword gesteins 12346-23456-1246-234
+midword ations 5-1345-234
+midword ationsauf 5-1345-234-2-16
+always aronsstab 356-135-1345-234-23456-1-12
+midendword rsstab 1235-234-23456-1-12
+always sstachel 234-23456-56-13456
+always sstapel 234-23456-1-1234-13456
+midword ssst 2346-23456
+midword ssstell 2346-2-13456
+before s begmidword boots 12-135-135-2345-234
+midendword sstaat 234-23456-2345
+midendword sstabes 234-23456-1-12-123456
+midendword sstabil 234-23456-1-12-24-123
+midendword sstabs 234-23456-1-12-234
+midendword sstadt 234-23456-1-145-2345
+midendword sstäd 234-23456-345-145
+midendword sstall 234-23456-1-12345
+midendword sstamm 234-23456-1-1346
+midendword sstamperl 234-23456-1-134-1234-12456-123
+midendword sstand 234-2-23456
+endword sstange 234-23456-235-12346
+midendword sstangen 234-23456-235-1245-14
+endword sstar 234-23456-1-1235
+midendword sstars 234-23456-356-234
+midendword sstark 234-23456-356-13
+midendword sstarr 234-23456-356-1235
+midendword sstart 234-23456-356-2345
+midendword sstation 234-23456-5-1345
+midendword sstatt 234-23456-1-2345-2345
+endword sstatue 234-23456-1-2345-136-15
+midendword sstatuen 234-23456-1-2345-136-14
+midendword sstatus 234-23456-1-2345-136-234
+midendword sstatut 234-23456-1-2345-136-2345
+endword sstaude 234-23456-16-145-15
+midendword sstauden 234-23456-16-145-14
+midendword ssteak 234-23456-15-1-13
+midendword sstehend 234-23456-2356-14-145
+midendword ssteigern 234-23456-146-1245-12456-1345
+midendword ssteigerung 234-23456-146-1245-12456-136
+midendword sstein 234-23456-1246
+endword sstele 234-23456-13456-15
+midendword sstelen 234-23456-13456-14
+endword sstelle 234-2-13456-15
+midendword sstellen 234-2-13456-14
+midendword sstellig 234-2-13456-45
+midendword sstellreflex 234-2-13456-1235-15-124-123-15-6-1346
+midendword sstellung 234-2-13456-136
+midendword sstelz 234-23456-13456-1356
+midendword sstempel 234-23456-12356-1234-13456
+endword ssteppe 234-23456-15-1234-1234-15
+midendword ssteppen 234-23456-15-1234-1234-14
+endword ssterbe 234-23456-12456-12-15
+midendword ssterben 234-23456-12456-12-14
+midendword ssteril 234-23456-12456-24-123
+midendword sstern 234-23456-12456-1345
+midendword ssteuer 234-23456-126-12456
+midendword sstich 234-23456-3456
+midendword sstift 234-23456-24-124-2345
+midendword sstil 234-23456-24-123
+midendword sstill 234-23456-24-12345
+midendword sstimm 234-23456-24-1346
+midendword sstock 234-23456-135-46
+midendword sstoff 234-23456-135-124-124
+midendword sstollen 234-23456-135-12345-14
+midendword sstolz 234-23456-135-123-1356
+midendword sstop 234-23456-135-1234
+midendword sstopp 234-23456-135-1234-1234
+midendword sstory 234-23456-26-6-13456
+midendword sstoß 234-23456-135-2346
+midendword sstraf 234-23456-1235-1-124
+midendword sstrand 234-23456-1235-235-145
+midendword sstrang 234-23456-1235-235-1245
+midendword sstrauch 234-23456-1235-16-1456
+midendword sstraß 234-23456-1235-1-2346
+midendword sstreb 234-23456-1235-15-12
+endword sstrebe 234-23456-1235-15-12-15
+endword sstreck 234-23456-1235-15-46
+midendword sstreich 234-23456-1235-146-1456
+midendword sstreif 234-23456-1235-146-124
+midendword sstreik 234-23456-1235-146-13
+midendword sstreit 234-23456-1235-146-2345
+endword sstreite 234-23456-1235-146-236
+midendword sstreuung 234-23456-1235-126-136
+midendword sstrich 234-23456-1235-3456
+midendword sstrichter 2346-2345-1235-3456-2345-12456
+midendword sstroh 234-23456-1235-135-125
+midendword sstrom 234-23456-1235-135-134
+midendword sstroph 234-23456-1235-135-1234-125
+midendword sstrotzend 234-23456-1235-135-2345-1356-14-145
+endword sstube 234-23456-136-12-15
+midendword sstuben 234-23456-136-12-14
+endword sstufe 234-23456-136-124-15
+midendword sstufen 234-23456-136-124-14
+midendword sstuhl 234-23456-136-125-123
+endword sstunde 234-23456-256-145-15
+midendword sstunden 234-23456-256-145-14
+midendword ssturm 234-23456-136-1235-134
+midendword ssturz 234-23456-136-1235-1356
+endword sstute 234-23456-136-236
+midendword sstuten 234-23456-136-2345-14
+midendword sstutz 234-23456-136-2345-1356
+endword sstäbe 234-23456-345-12-15
+midendword sstäben 234-23456-345-12-14
+midendword sständ 234-5-23456
+midendword sstück 234-23456-1256-46
+midendword sstülp 234-23456-1256-123-1234
+midendword sstürm 234-23456-1256-1235-134
+midendword sstürz 234-23456-1256-1235-1356
+midendword sstütz 234-23456-1256-2345-1356
+endword ssuche 234-234-136-1456-15
+midendword ssuchen 234-234-136-1456-14
+midendword ssucher 234-234-136-1456-12456
+midendword ssucht 234-234-136-1456-2345
+midendword ssud 234-234-136-145
+midendword ssumm 234-234-136-1346
+midendword ssumpf 234-234-136-134-1234-124
+endword ssuppe 234-234-136-1234-1234-15
+midendword ssuppen 234-234-136-1234-1234-14
+endword sszene 234-234-1356-14-15
+midendword sszenen 234-234-1356-14-14
+endword ssäfte 234-234-345-124-236
+midendword ssäften 234-234-345-124-2345-14
+endword ssäge 234-5-234-1245-15
+midendword ssägemaschin 234-5-234-1245-15-134-156
+midendword ssägen 234-5-234-1245-14
+endword ssäle 234-234-345-123-15
+midendword ssälen 234-234-345-123-14
+endword ssätz 234-5-234-1356
+midendword ssäufer 234-234-34-124-12456
+midendword ssäuger 234-234-34-1245-12456
+midendword ssäugetier 234-234-34-12346-2345-346-1235
+endword ssäule 234-234-34-123-15
+midendword ssäulen 234-234-34-123-14
+midendword ssüchtig 234-234-1256-1456-2345-45
+midendword ssünd 234-234-1256-1345-145
+always dasselbe 145-1-234-234-13456-12-15
+always dasselbig 145-1-234-234-13456-12-45
+always abgas 1-12-1245-1-234
+always niklas 1345-24-13-123-1-234
+always nicklas 1345-24-46-123-1-234
+prfword grassorte 1245-1235-1-234-234-26-236
+begmidword grassort 1245-1235-1-234-234-26-2345
+begmidword grasst 1245-1235-1-234-23456
+before s begmidword diebs 145-346-12-234
+always antriebs 235-2345-1235-346-12-234
+prfword antriebst 235-2345-1235-346-12-23456
+always betriebs 23-2345-1235-346-12-234
+always betriebsetz 23-2345-1235-346-12-2-15
+prfword betriebst 23-2345-1235-346-12-23456
+begmidword betriebstätt 23-2345-1235-346-12-23456-345-2345-2345
+prfword betriebstätte 23-2345-1235-346-12-23456-345-2345-236
+always krebs 13-1235-15-12-234
+sufword vertriebs 36-2345-1235-346-12-234
+word vertriebst 36-2345-1235-346-12-23456
+midendword vertriebs 1236-12456-2345-1235-346-12-234
+endword vertriebst 1236-12456-2345-1235-346-12-23456
+before s begmidword leibs 123-146-12-234
+always weibs 2456-146-12-234
+always kalbs 13-25-12-234
+always jakobs 245-1-13-135-12-234
+always jakobstraß 245-1-13-135-12-23456-1235-1-2346
+always wettbewerbs 2456-15-2345-2345-23-2456-12456-12-234
+always wettbewerbstell 2456-15-2345-2345-23-2456-12456-12-2-13456
+always erwerbs 12456-2456-12456-12-234
+always urlaubs 136-1235-123-16-12-234
+always ericsson 12456-24-6-14-234-234-135-1345
+always schieds 156-346-145-234
+prfword schiedst 156-346-145-23456
+always mitglieds 2-2345-1245-123-346-145-234
+always mitgliedstaat 2-2345-1245-123-346-145-23456-2345
+always mitgliedschaft 2-2345-1245-123-346-145-156
+always herolds 125-12456-135-123-145-234
+always heroldstab 125-12456-135-123-145-23456-1-12
+always gedulds 12346-145-136-123-145-234
+sufword auslands 34-123-235-145-234
+midendword auslands 16-234-123-235-145-234
+sufword auslandsch 34-123-235-145-156
+midendword auslandsch 16-234-123-235-145-156
+sufword auslandschef 34-123-235-145-234-1456-15-124
+midendword auslandschef 16-234-123-235-145-234-1456-15-124
+always inlands 35-123-235-145-234
+always rolands 1235-135-123-235-145-234
+always hunds 125-256-145-234
+always hundschnell 125-256-145-156-1345-15-12345
+always hundstock 125-256-145-23456-135-46
+always mords 134-26-145-234
+begmidword mordseri 134-26-145-234-12456-24
+always mordsch 134-26-145-156
+always pfunds 1234-124-256-145-234
+always pfundsch 1234-124-256-145-156
+sufword verbands 36-12-235-145-234
+begword verbandsch 36-12-235-145-156
+sufword verbandschef 36-12-235-145-234-1456-15-124
+word verbandst 36-12-235-145-23456
+sufword verbandstoff 36-12-235-145-23456-135-124-124
+midendword verbands 1236-12456-12-235-145-234
+midword verbandsch 1236-12456-12-235-145-156
+midendword verbandschef 1236-12456-12-235-145-234-1456-15-124
+endword verbands 1236-12456-12-235-145-23456
+midendword verbandstoff 1236-12456-12-235-145-23456-135-124-124
+before s begmidword lands 123-235-145-234
+always leibes 123-146-12-123456
+always diebes 145-346-12-123456
+always liebes 123-346-12-123456
+always waldes 2456-25-145-123456
+always landes 123-235-145-123456
+begmidword landestreif 123-235-145-15-23456-1235-146-124
+always standes 2-23456-123456
+always bundes 12-256-145-123456
+always todes 2345-135-145-123456
+always tages 2345-1-1245-123456
+always metageschäft 134-15-2345-1-1245-124
+always sieges 234-346-1245-123456
+always kies 13-346-234
+always kiest 13-346-23456
+always vlies 1236-123-346-234
+always spezies 234-1234-15-1356-24-123456
+always achilles 1-1456-24-12345-123456
+always herkules 125-12456-13-136-123-123456
+always stammes 23456-1-1346-123456
+always mannes 134-1345-123456
+always sinnes 234-35-1345-123456
+always herpes 125-12456-1234-123456
+always heeres 125-15-15-1235-123456
+always meeres 134-15-15-1235-123456
+always jahres 245-1235-123456
+always diabetes 145-24-1-23-2345-123456
+always geistes 1245-146-23456-123456
+always gottes 1245-135-2345-2345-123456
+always gesetzes 12346-2-15-123456
+always schiffs 156-24-124-124-234
+always schiffschaukel 156-24-124-124-156-16-13-13456
+begmidword schiffschrau 156-24-124-124-156-1235-16
+prfword schiffst 156-24-124-124-23456
+always griffs 1245-1235-24-124-124-234
+always griffsch 1245-1235-24-124-124-156
+always griffschrift 1245-1235-24-124-124-156-2345
+always griffstück 1245-1235-24-124-124-23456-1256-46
+always griffstutz 1245-1235-24-124-124-23456-136-2345-1356
+prfword griffst 1245-1235-24-124-124-23456
+always behelfs 23-125-13456-124-234
+always hilfs 125-24-123-124-234
+prfword hilfst 125-24-123-124-23456
+always wolfs 2456-135-123-124-234
+always bischofs 12-24-156-135-124-234
+always friedhofs 124-1235-346-145-125-135-124-234
+always friedhofstill 124-1235-346-145-125-135-124-23456-24-12345
+always bahnhofs 12-1-125-1345-125-135-124-234
+always bahnhofstr 12-1-125-1345-125-135-124-23456-1235
+always bedarfs 23-145-356-124-234
+prfword bedarfst 23-145-356-124-23456
+sufword entwurfs 2346-2456-136-1235-124-234
+midendword entwurfs 14-2345-2456-136-1235-124-234
+always einkaufs 1246-13-16-124-234
+prfword einkaufst 1246-13-16-124-23456
+sufword verkaufs 36-13-16-124-234
+word verkaufst 36-13-16-124-23456
+sufword verkaufstand 36-13-16-124-2-23456
+sufword verkaufständ 36-13-16-124-5-23456
+midendword verkaufs 1236-12456-13-16-124-234
+endword verkaufst 1236-12456-13-16-124-23456
+midendword verkaufstand 1236-12456-13-16-124-2-23456
+midendword verkaufständ 1236-12456-13-16-124-5-23456
+always berufs 23-1235-136-124-234
+prfword berufst 23-1235-136-124-23456
+always durchschlags 2-1456-156-1245-234
+sufword verlags 36-123-1-1245-234
+midendword verlags 1236-12456-123-1-1245-234
+always auftrags 2-16-2345-1245-234
+prfword auftragst 2-16-2345-1245-23456
+always auftragsch 2-16-2345-1245-156
+always beitrags 2-12-2345-1245-234
+always betrags 23-2345-1245-234
+always ertrags 12456-2345-1245-234
+always ertragsteiger 12456-2345-1245-23456-146-1245-12456
+always ertragsteuer 12456-2345-1245-23456-126-12456
+sufword vertrags 36-2345-1245-234
+sufword vertragsch 36-2345-1245-156
+sufword vertragschließ 36-2345-1245-156-2346
+midendword vertrags 1236-12456-2345-1245-234
+midendword vertragsch 1236-12456-2345-1245-156
+midendword vertragschließ 1236-12456-2345-1245-156-2346
+always vortrags 2-26-2345-1245-234
+always alltags 1-12345-2345-1-1245-234
+always halbtags 125-25-12-2345-1-1245-234
+always montags 134-135-1345-2345-1-1245-234
+always feiertags 124-146-12456-2345-1-1245-234
+always mittags 134-24-2345-2345-1-1245-234
+always mittagsch 134-24-2345-2345-1-1245-156
+always festtags 124-15-23456-2345-1-1245-234
+always ganztags 1245-1356-2345-1-1245-234
+always sonntags 234-135-1345-1345-2345-1-1245-234
+always kriegs 13-1235-346-1245-234
+before a begmidword kriegst 13-1235-346-1245-234-2345
+before r begmidword kriegst 13-1235-346-1245-234-2345
+always kriegstüchtig 13-1235-346-1245-234-2345-1256-1456-2345-45
+always kriegst 13-1235-346-1245-23456
+always abstiegs 1-12-23456-346-1245-234
+prfword abstiegst 1-12-23456-346-1245-23456
+always aufstiegs 2-16-23456-346-1245-234
+prfword aufstiegst 2-16-23456-346-1245-23456
+always königs 13-246-1345-45-234
+always königstein 13-246-1345-45-23456-1246
+always erfolgs 12456-124-1245-234
+always erfolgst 12456-124-1245-23456
+always erfolgsträg 12456-124-1245-234-5-2345-1245
+begmidword erfolgstrain 12456-124-1245-234-2345-1235-1-24-1345
+always erfolgstyp 12456-124-1245-234-2345-6-13456-1234
+always empfangs 12356-1234-124-235-1245-234
+always gangs 1245-235-1245-234
+always gangsch 1245-235-1245-156
+begmidword gangschanc 1245-235-1245-234-1456-235-6-14
+always gangsetz 1245-235-1245-2-15
+prfword gangst 1245-235-1245-23456
+always gangster 1245-235-1245-23456-12456
+always anfangs 235-124-235-1245-234
+always gesangs 12346-234-235-1245-234
+always gesangschul 12346-234-235-1245-156-136-123
+always gesangst 12346-234-235-1245-23456
+always gesangstund 12346-234-235-1245-23456-256-145
+always zwangs 1356-2456-235-1245-234
+always zwangsch 1356-2456-235-1245-156
+prfword zwangst 1356-2456-235-1245-23456
+always lieblings 123-346-12-123-35-1245-234
+always säuglings 234-34-1245-123-35-1245-234
+always frühlings 124-1235-1256-125-123-35-1245-234
+always zwillings 1356-2456-24-12345-35-1245-234
+always lehrlings 123-2356-1235-123-35-1245-234
+always schmetterlings 156-134-15-2345-2345-12456-123-35-1245-234
+always flüchtlings 124-123-1256-1456-2345-123-35-1245-234
+always trainings 2345-1235-1-24-1345-35-1245-234
+always herings 125-12456-35-1245-234
+always gebirgs 12346-12-24-1235-1245-234
+always betrugs 23-2345-1235-136-1245-234
+prfword betrugst 23-2345-1235-136-1245-23456
+always bezugs 23-1356-136-1245-234
+always bezugschein 23-1356-136-1245-156-1246
+always einzugs 1246-1356-136-1245-234
+always einzugsch 1246-1356-136-1245-156
+always vorzugs 2-26-1356-136-1245-234
+sufword entzugs 2346-1356-136-1245-234
+midendword entzugs 14-2345-1356-136-1245-234
+begmidword lachss 123-56-234-234
+always flachs 124-123-56-234
+always flachsch 124-123-56-156
+always flachschaber 124-123-56-156-1-12-12456
+always flachst 124-123-56-23456
+always gesprächs 12346-5-234-1234-234
+before s midword chs 1456-234
+before s midword achs 56-234
+always wachs 2456-56-234
+always wachsam 2456-56-2346
+always wachschiff 2456-56-156-24-124-124
+always wachschlaf 2456-56-156-123-1-124
+always wachschutz 2456-56-156-136-2345-1356
+always wachssch 2456-56-234-156
+prfword wachst 2456-56-23456
+always wachstation 2456-56-23456-5-1345
+prfword wachste 2456-56-23456-15
+prfword wachstem 2456-56-23456-12356
+prfword wachsten 2456-56-23456-14
+prfword wachster 2456-56-23456-12456
+prfword wachstes 2456-56-23456-123456
+# HOMONYM
+always wachstub 2456-56-23456-136-12
+always schwach 156-2456-56
+always sechs 234-15-1456-234
+prfword sechst 234-15-1456-23456
+before konsonant begmidword sechst 234-15-1456-23456
+prfword sechste 234-15-1456-23456-15
+always sechstel 234-15-1456-23456-13456
+prfword sechstem 234-15-1456-23456-12356
+prfword sechsten 234-15-1456-23456-14
+prfword sechstens 234-15-1456-23456-14-234
+prfword sechster 234-15-1456-23456-12456
+prfword sechstes 234-15-1456-23456-123456
+sufword ausgleichs 34-1245-1456-234
+midendword ausgleichs 16-234-1245-1456-234
+sufword ausgleichsch 34-1245-1456-156
+midendword ausgleichsch 16-234-1245-1456-156
+begword ausgleichschanc 34-1245-1456-234-1456-235-6-14
+midword ausgleichschanc 16-234-1245-1456-234-1456-235-6-14
+sufword ausgleichst 34-1245-1456-23456
+midendword ausgleichst 16-234-1245-1456-23456
+word ausgleichstor 34-1245-1456-234-2345-135-1235
+begword ausgleichstor 34-1245-1456-234-2345-26
+midword ausgleichstor 16-234-1245-1456-234-2345-26
+endword ausgleichstor 16-234-1245-1456-234-2345-135-1235
+begword ausgleichstreff 34-1245-1456-234-2345-124
+midword ausgleichstreff 16-234-1245-1456-234-2345-124
+sufword vergleichs 36-1245-1456-234
+word vergleichst 36-1245-1456-23456
+midendword vergleichs 1236-12456-1245-1456-234
+endword vergleichst 1236-12456-1245-1456-23456
+always reichs 1235-146-1456-234
+always streich 23456-1235-146-1456
+prfword reichst 1235-146-1456-23456
+prfword reichste 1235-146-1456-23456-15
+prfword reichstem 1235-146-1456-23456-12356
+prfword reichsten 1235-146-1456-23456-14
+prfword reichster 1235-146-1456-23456-12456
+prfword reichstes 1235-146-1456-23456-123456
+always mönchs 134-246-1345-1456-234
+always brauchs 2-34-234
+prfword brauchst 2-34-23456
+always brauchsteuer 2-34-23456-126-12456
+always fuchs 124-136-1456-234
+always fuchst 124-136-1456-23456
+always fuchsteufel 124-136-1456-234-2345-126-124-13456
+always aufbruchs 2-16-12-1235-136-1456-234
+always aufbruchst 2-16-12-1235-136-1456-23456
+sufword ausbruchs 34-12-1235-136-1456-234
+begword ausbruchstell 34-12-1235-136-1456-2-13456
+midendword ausbruchs 16-234-12-1235-136-1456-234
+midword ausbruchstell 16-234-12-1235-136-2-13456
+always einbruchs 1246-12-1235-136-1456-234
+begmidword einbruchstell 1246-12-1235-136-1456-2-13456
+always einbruchsch 1246-12-1235-136-1456-156
+always geruchs 12346-1235-136-1456-234
+sufword besuchs 23-234-136-1456-234
+word besuchst 23-234-136-1456-23456
+sufword versuchs 36-234-136-1456-234
+word versuchst 36-234-136-1456-23456
+midendword versuchs 1236-12456-234-136-1456-234
+endword versuchs 1236-12456-234-136-1456-23456
+always wuchs 2456-136-1456-234
+prfword wuchst 2456-136-1456-23456
+always relais 1235-13456-1-24-234
+always mais 134-1-24-234
+always maisch 134-1-24-156
+always gleis 1245-123-146-234
+prfword gleist 1245-123-146-23456
+prfword gleiste 1245-123-146-23456-15
+prfword gleistem 1245-123-146-23456-12356
+prfword gleisten 1245-123-146-23456-14
+prfword gleister 1245-123-146-23456-12456
+prfword gleistes 1245-123-146-23456-123456
+# HOMONYM
+prfword gleistest 1245-123-146-23456-15-23456
+prfword gleistet 1245-123-146-23456-15-2345
+always steigleistung 23456-146-1245-123-146-23456-136
+always kreis 13-1235-146-234
+prfword kreist 13-1235-146-23456
+prfword kreiste 13-1235-146-23456-15
+prfword kreistem 13-1235-146-23456-12356
+prfword kreisten 13-1235-146-23456-14
+prfword kreister 13-1235-146-23456-12456
+prfword kreistes 13-1235-146-23456-123456
+prfword kreistest 13-1235-146-23456-15-23456
+prfword kreistet 13-1235-146-23456-15-2345
+always kreisch 13-1235-146-156
+always preis 1234-1235-146-234
+prfword preist 1234-1235-146-23456
+prfword preiste 1234-1235-146-23456-15
+prfword preistem 1234-1235-146-23456-12356
+prfword preisten 1234-1235-146-23456-14
+prfword preister 1234-1235-146-23456-12456
+prfword preistes 1234-1235-146-23456-123456
+always anissamen 235-24-234-234-1-134-14
+always johannis 245-135-125-235-1345-24-234
+always tennis 2345-14-1345-24-234
+always basis 12-1-234-24-234
+always basisch 12-1-234-24-156
+always gratis 1245-1235-1-2345-24-234
+always praxis 1234-1235-1-6-1346-24-234
+always geschmacks 12346-156-134-1-46-234
+always geschmackstoff 12346-156-134-1-46-23456-135-124-124
+always dreiecks 145-1235-146-15-46-234
+always dreiecksch 145-1235-146-15-46-156
+always augenblicks 16-1245-14-12-123-24-46-234
+sufword ausdrucks 34-145-46-234
+sufword ausdruckst 34-145-46-23456
+midendword ausdrucks 16-234-145-46-234
+midendword ausdruckst 16-234-145-46-23456
+always glücks 1245-46-234
+# HOMONYM
+always glücksam 1245-46-2346
+prfword glückst 1245-46-23456
+prfword glückstadt 1245-46-23456-1-145-2345
+always unglücks 256-1245-46-234
+prfword unglückst 256-1245-46-23456
+always stücks 23456-1256-46-234
+always stücksteuer 23456-1256-46-23456-126-12456
+prfword stückst 23456-1256-46-23456
+always bibliotheks 12-24-12-123-24-135-2345-125-15-13-234
+always volks 1236-13-234
+always links 123-35-13-234
+prfword linkst 123-35-13-23456
+prfword flinkste 124-123-35-13-23456-15
+always flinkst 124-123-35-13-23456
+always bezirks 23-1356-24-1235-13-234
+always werks 2456-12456-13-234
+always werksch 2456-12456-13-156
+always werkschrift 2456-12456-13-156-2345
+always gewerkschaft 12346-2456-12456-13-156
+always gewerkschafts 12346-2456-12456-13-156-234
+prfword werkst 2456-12456-13-23456
+always werkstatt 2456-12456-13-23456-1-2345-2345
+always werkstätt 2456-12456-13-23456-345-2345-2345
+always werkstätte 2456-12456-13-23456-345-2345-236
+always werkstätten 2456-12456-13-23456-345-2345-2345-14
+always werkstein 2456-12456-13-23456-1246
+always werkstell 2456-12456-13-2-13456
+always werksteuer 2456-12456-13-23456-126-12456
+always werkstoff 2456-12456-13-23456-135-124-124
+always werkstoll 2456-12456-13-23456-135-12345
+always werkstück 2456-12456-13-23456-1256-46
+always hals 125-25-234
+always halst 125-25-23456
+begmidword halstabl 125-25-234-2345-1-12-123
+always halstuch 125-25-234-2345-136-1456
+begmidword halstüch 125-25-234-2345-1256-1456
+always generals 1245-14-12456-25-234
+always generalsch 1245-14-12456-25-156
+always generalst 1245-14-12456-25-23456
+always generalstaat 1245-14-12456-25-23456-2345
+always generalstab 1245-14-12456-25-23456-1-12
+always generalstäb 1245-14-12456-25-23456-345-12
+always generalstand 1245-14-12456-25-2-23456
+always generalständ 1245-14-12456-25-5-23456
+always grals 1245-1235-25-234
+always quartals 6-12345-136-356-2345-25-234
+always karnevals 13-356-1345-15-1236-25-234
+always adels 1-145-13456-234
+prfword adelst 1-145-13456-23456
+always handels 125-145-13456-234
+always handelsch 125-145-13456-156
+prfword handelst 125-145-13456-23456
+always fels 124-13456-234
+prfword ffelst 124-124-13456-23456
+after f midendword elster 13456-23456-12456
+always schwafel 156-2456-1-124-13456
+always tafel 2345-1-124-13456
+always täfel 2345-345-124-13456
+always gaffel 1245-1-124-124-13456
+always waffel 2456-1-124-124-13456
+always löffel 123-246-124-124-13456
+always pantoffel 1234-235-2345-135-124-124-13456
+always kartoffel 13-356-2345-135-124-124-13456
+always schnüffel 156-1345-1256-124-124-13456
+prfword zweifelst 1356-2456-146-124-13456-23456
+always tröpfel 2345-1235-246-1234-124-13456
+always würfel 2456-1256-1235-124-13456
+always apfelsch 1-1234-124-13456-156
+always apfelst 1-1234-124-13456-23456
+midendword äufelst 34-124-13456-23456
+always himmels 125-24-1346-13456-234
+prfword himmelst 125-24-1346-13456-23456
+always himmelschlüssel 125-24-1346-13456-156-123-1256-2346-13456
+always himmelschrei 125-24-1346-13456-156-1235-146
+always himmelstreb 125-24-1346-13456-23456-1235-15-12
+always himmelstürm 125-24-1346-13456-23456-1256-1235-134
+always befehls 23-124-2356-123-234
+always gefühls 12346-124-1256-125-123-234
+always urteils 136-1235-2345-146-123-234
+prfword urteilst 136-1235-2345-146-123-23456
+always konzils 13-135-1345-1356-24-123-234
+always beifalls 2-12-124-12345-234
+always einfalls 1246-124-12345-234
+always einfallstraß 1246-124-12345-23456-1235-1-2346
+always zufalls 2-1356-124-12345-234
+always marschalls 134-356-156-1-12345-234
+always marschallstab 134-356-156-1-12345-23456-1-12
+always karls 13-356-123-234
+always karlstad 13-356-123-23456-1-145
+begmidword karlstraß 13-356-123-23456-1235-1-2346
+always impuls 24-134-1234-136-123-234
+always brems 12-1235-12356-234
+prfword bremst 12-1235-12356-23456
+prfword bremste 12-1235-12356-23456-15
+prfword bremstem 12-1235-12356-23456-12356
+prfword bremsten 12-1235-12356-23456-14
+prfword bremster 12-1235-12356-23456-12456
+prfword bremstes 12-1235-12356-23456-123456
+# HOMONYM
+prfword bremstest 12-1235-12356-23456-15-23456
+prfword bremstet 12-1235-12356-23456-15-2345
+always übernahms 2-1256-1345-134-234
+prfword übernahmst 2-1256-1345-134-23456
+always brahms 12-1235-1-125-134-234
+always bims 12-24-134-234
+always bimste 12-24-134-23456-15
+always bimsten 12-24-134-23456-14
+always gesims 12346-234-24-134-234
+always gesimst 12346-234-24-134-23456
+always jubiläums 245-136-12-24-123-345-136-134-234
+always museums 134-136-234-15-136-134-234
+always datums 145-1-2345-136-134-234
+always eigentums 146-1245-14-2345-136-134-234
+always präsidiums 1234-1235-345-234-24-145-24-136-134-234
+always imperiums 24-134-1234-12456-24-136-134-234
+always ministeriums 134-35-24-23456-12456-24-136-134-234
+always jeans 245-15-1-1345-234
+always trans 2345-1235-235-234
+always transchier 2345-1235-235-156-346-1235
+always sanssouci 234-235-234-234-135-136-6-14-24
+always glaubens 1245-123-16-12-14-234
+always schadens 156-1-145-14-234
+always schadenstift 156-1-145-14-23456-24-124-2345
+always friedens 124-1235-346-145-14-234
+prfword friedenste 124-1235-346-145-14-23456-15
+always friedenstell 124-1235-346-145-14-2-13456
+prfword friedenstem 124-1235-346-145-14-23456-12356
+prfword friedensten 124-1235-346-145-14-23456-14
+prfword friedenster 124-1235-346-145-14-23456-12456
+prfword friedenstes 124-1235-346-145-14-23456-123456
+always friedenstift 124-1235-346-145-14-23456-24-124-2345
+always kondens 13-135-1345-145-14-234
+always ordens 26-145-14-234
+always tangens 2345-235-1245-14-234
+sufword vermögens 36-2-246-14-234
+midendword vermögens 1236-12456-2-246-14-234
+always darlehens 145-356-123-2356-14-234
+always schreckens 156-1235-15-46-14-234
+always schreckensch 156-1235-15-46-14-156
+always schreckenstarr 156-1235-15-46-14-23456-356-1235
+always willens 2456-12345-14-234
+always namens 1345-1-134-14-234
+always namensch 1345-1-134-14-156
+always namenstempel 1345-1-134-14-23456-12356-1234-13456
+always siemens 234-346-134-14-234
+always unternehmens 2-256-1345-125-14-234
+always einkommens 1246-13-1346-14-234
+always einkommensteuer 1246-13-1346-14-23456-126-12456
+sufword verfahrens 36-2-1235-14-234
+midendword verfahrens 1236-12456-2-1235-14-234
+always ermessens 12456-134-15-2346-14-234
+always wissens 2456-2346-14-234
+always wissenschaft 2456-2346-14-156
+always wissenschaftsauf 2456-2346-14-156-234-2-16
+always wissenstand 2456-2346-14-2-23456
+sufword verhaltens 36-125-25-2345-14-234
+word verhaltenste 36-125-25-2345-14-23456-15
+word verhaltenstem 36-125-25-2345-14-23456-12356
+word verhaltensten 36-125-25-2345-14-23456-14
+word verhaltenster 36-125-25-2345-14-23456-12456
+word verhaltenstes 36-125-25-2345-14-23456-123456
+midendword verhaltens 1236-12456-125-25-2345-14-234
+endword verhaltenste 1236-12456-125-25-2345-14-23456-15
+endword verhaltenstem 1236-12456-125-25-2345-14-23456-12356
+endword verhaltensten 1236-12456-125-25-2345-14-23456-14
+endword verhaltenster 1236-12456-125-25-2345-14-23456-12456
+endword verhaltenstes 1236-12456-125-25-2345-14-23456-123456
+sufword vertrauens 36-2345-1235-16-14-234
+midendword vertrauens 1236-12456-2345-1235-16-14-234
+always herzens 125-12456-1356-14-234
+sufword vereins 36-1246-234
+sufword vereinsam 36-1246-2346
+word vereinst 36-1246-23456
+midendword vereins 1236-12456-1246-234
+midendword vereinsam 1236-12456-1246-2346
+endword vereinst 1236-12456-1246-23456
+before s begmidword steins 23456-1246-234
+always schweins 156-2456-1246-234
+always zins 1356-35-234
+always finanz 124-35-235-1356
+always justiz 245-136-23456-24-1356
+always magazin 134-1-1245-1-1356-35
+always medizin 134-15-145-24-1356-35
+always benzin 12-14-1356-35
+always kratz 13-1235-1-2345-1356
+prfword zinst 1356-35-23456
+prfword zinste 1356-35-23456-15
+prfword zinstem 1356-35-23456-12356
+prfword zinsten 1356-35-23456-14
+prfword zinster 1356-35-23456-12456
+prfword zinstes 1356-35-23456-123456
+prfword zinstest 1356-35-23456-15-23456
+prfword zinstet 1356-35-23456-15-2345
+before s begmidword manns 134-1345-234
+always seemanns 234-15-15-134-1345-234
+always seemannschaft 234-15-15-134-1345-156
+always kaufmanns 13-16-124-134-1345-234
+always kaufmannschaft 13-16-124-134-1345-156
+always bergmanns 12-12456-1245-134-1345-234
+before s midword ions 24-135-1345-234
+always garnisons 1245-356-1345-24-234-135-1345-234
+always kantons 13-235-2345-135-1345-234
+before s begword kokos 13-135-13-135-234
+always kosmos 13-135-234-134-135-234
+before s begword los 123-135-234
+always erlös 12456-123-246-234
+always erlösch 12456-123-246-156
+always erlöst 12456-123-246-23456
+before s begmidword moos 134-135-135-234
+always lotos 123-135-2345-135-234
+always gips 1245-24-1234-234
+always gipst 1245-24-1234-23456
+always schnaps 156-1345-1-1234-234
+always korps 13-26-1234-234
+always alters 25-2345-12456-234
+prfword alterst 25-2345-12456-23456
+always halterschaft 125-25-2345-12456-156
+always schalter 156-25-2345-12456
+before s begmidword mars 134-356-234
+always neujahrs 1345-126-245-1235-234
+sufword verkehrs 36-13-2356-1235-234
+word verkehrst 36-13-2356-1235-23456
+midendword verkehrs 1236-12456-13-2356-1235-234
+endword verkehrst 1236-12456-13-2356-1235-23456
+always kurs 13-136-1235-234
+always kurschatten 13-136-1235-156-1-2345-2345-14
+prfword kurst 13-136-1235-23456
+always kurstadt 13-136-1235-23456-1-145-2345
+always kurstäd 13-136-1235-23456-345-145
+always velours 1236-13456-135-136-1235-234
+always merkur 134-12456-13-136-1235
+always staats 23456-2345-234
+always senats 234-14-1-2345-234
+always monats 134-135-1345-1-2345-234
+always rats 1235-1-2345-234
+always heirats 125-146-1235-1-2345-234
+always ratsam 1235-1-2345-2346
+always ratsamt 1235-1-2345-234-1-134-2345
+always ratsch 1235-1-2345-156
+always ratschef 1235-1-2345-234-1456-15-124
+always ratschlag 1235-1-2345-156-1245
+always ratschläg 1235-1-2345-5-156-1245
+always ratschluss 1235-1-2345-156-123-136-2346
+always ratschlüss 1235-1-2345-156-123-1256-2346
+always ratsitz 1235-1-2345-2-24
+always ratsprach 1235-1-2345-234-1234
+always ratstoff 1235-1-2345-23456-135-124-124
+always ratstück 1235-1-2345-23456-1256-46
+prfword tratst 2345-1235-1-2345-23456
+midword itäts 1-2345-2345-14-2345-1-2345-234
+always attentats 1-2345-2345-14-2345-1-2345-234
+always pubertäts 1234-136-12-12456-2345-345-2345-234
+always abts 1-12-2345-234
+always gebiets 12346-12-346-2345-234
+always miets 134-346-2345-234
+always mietsch 134-346-2345-156
+always mietst 134-346-2345-23456
+always mietstand 134-346-2345-2-23456
+always geschäfts 1245-124-234
+always unterschrifts 2-256-156-2345-234
+always unterschriftstempel 2-256-156-2345-23456-12356-1234-13456
+always kunfts 13-256-124-2345-234
+always kunftsch 13-256-124-2345-156
+always kunftschanc 13-256-124-2345-234-1456-235-6-14
+always wehrmachts 2456-2356-1235-134-56-2345-234
+always fastnachts 124-1-23456-1345-56-2345-234
+always weihnachts 2456-146-125-1345-56-2345-234
+always gefechts 12346-124-15-1456-2345-234
+always geschlechts 12346-156-123-15-1456-2345-234
+always geschichts 12346-156-3456-2345-234
+always gerichts 12346-2-3456-234
+always unterrichts 2-256-2-3456-234
+always unterrichtstoff 2-256-2-3456-23456-135-124-124
+midword sichts 234-3456-2345-234
+begmidword sichtsch 234-3456-2345-156
+always gewichts 12346-2456-3456-2345-234
+always zufluchts 2-1356-124-123-136-1456-2345-234
+always arbeits 356-12-234
+always abseits 1-12-234-146-2345-234
+always hochzeits 125-135-1456-1356-2345-234
+always gehalts 12346-125-25-2345-234
+always inhalts 35-125-25-2345-234
+always inhaltschwer 35-125-25-2345-156-2456-12456
+always unterhalts 2-256-125-25-2345-234
+always unterhaltsam 2-256-125-25-2345-2346
+always haushalts 125-16-234-125-25-2345-234
+always amts 1-134-2345-234
+always kamtsch 13-1-134-2345-156
+always parlaments 1234-356-123-1-134-14-2345-234
+always temperaments 2345-12356-1234-12456-1-134-14-2345-234
+always regiments 1235-15-1245-24-134-14-2345-234
+always advents 1-145-1236-14-2345-234
+always angebots 235-12346-12-135-2345-234
+sufword verbots 36-12-135-2345-234
+word verbotst 36-12-135-2345-23456
+midendword verbots 1236-12456-12-135-2345-234
+endword verbotst 1236-12456-12-135-2345-23456
+always fahrts 2-1235-2345-234
+always fahrtsch 2-1235-2345-156
+always fahrtstraß 2-1235-2345-23456-1235-1-2346
+always fahrtsträß 2-1235-2345-23456-1235-345-2346
+always fahrtstreck 2-1235-2345-23456-1235-15-46
+always fahrtstund 2-1235-2345-23456-256-145
+always fahrtstag 2-1235-2345-234-2345-1-1245
+prfword fahrtstage 2-1235-2345-234-2345-1-12346
+always gegenwarts 1245-2456-234
+always wirts 2456-24-1235-2345-234
+always geburts 12346-12-136-1235-2345-234
+prfword geburtstätte 12346-12-136-1235-2345-23456-345-2345-236
+prfword geburtstätten 12346-12-136-1235-2345-23456-345-2345-2345-14
+always kabinetts 13-1-12-35-15-2345-2345-234
+always kabinettstück 13-1-12-35-15-2345-2345-23456-1256-46
+always durchtritts 2-1456-2345-1235-24-2345-2345-234
+always eintritts 1246-2345-1235-24-2345-2345-234
+prfword eintrittst 1246-2345-1235-24-2345-2345-23456
+sufword austritts 34-2345-1235-24-2345-2345-234
+word austrittst 34-2345-1235-24-2345-2345-23456
+midendword austritts 16-234-2345-1235-24-2345-2345-234
+midendword austrittst 16-234-2345-1235-24-2345-2345-23456
+always durchschnitts 2-1456-156-1345-24-2345-2345-234
+always querschnitts 6-12345-136-12456-156-1345-24-2345-2345-234
+always gemüts 12346-134-1256-2345-234
+midendword aussag 16-234-234-1245
+midendword aussaat 16-234-234-1-1-2345
+midendword aussend 16-234-234-14-145
+midword aussied 16-234-234-346-145
+midword ausspar 16-234-234-1234-356
+always haussegen 125-16-234-234-15-1245-14
+begmidword haussipp 125-16-234-234-24-1234-1234
+begmidword haussperlin 125-16-234-234-1234-12456-123-35
+begmidword haussprech 125-16-234-2-2346
+always hausstadt 125-16-234-23456-1-145-2345
+begmidword hausstäd 125-16-234-23456-345-145
+always hausstaub 125-16-234-23456-16-12
+begmidword hausstreck 125-16-234-23456-1235-15-46
+begmidword haussuch 125-16-234-234-136-1456
+always hinaus 125-35-16-234
+always unaus 256-16-234
+before s begmidword raus 1235-16-234
+always heraus 125-12456-16-234
+always voraus 2-26-16-234
+always bambus 12-1-134-12-136-234
+always kubus 13-136-12-136-234
+always arcus 356-6-14-136-234
+always pyrrhus 1234-6-13456-1235-1235-125-136-234
+always sozius 234-135-1356-24-136-234
+always jus 245-136-234
+always jusch 245-136-156
+always just 245-136-23456
+always sympathikus 234-6-13456-134-1234-1-2345-125-24-13-136-234
+always arkus 356-13-136-234
+always zirkus 1356-24-1235-13-136-234
+prfword zirkusse 1356-24-1235-13-136-2346-15
+always zirkussen 1356-24-1235-13-136-2346-14
+always gallus 1245-1-12345-136-234
+always phallus 1234-125-1-12345-136-234
+always plus 1234-123-136-234
+always pluster 1234-123-136-23456-12456
+always rhythmus 1235-125-6-13456-2345-125-134-136-234
+always orgasmus 26-1245-1-234-134-136-234
+sufword tetanus 2345-15-2345-235-136-234
+midendword tetanus 236-2345-235-136-234
+always venus 1236-14-136-234
+always konus 13-135-1345-136-234
+always minus 134-35-136-234
+always kosinus 13-135-234-35-136-234
+always tonus 2345-135-1345-136-234
+always taunus 2345-16-1345-136-234
+always papyrus 1234-1-1234-6-13456-1235-136-234
+always kasus 13-1-234-136-234
+always status 23456-1-2345-136-234
+always luxus 123-136-6-1346-136-234
+always news 1345-15-2456-234
+
+# ST  (4.1 Lautgruppenkürzungen)
+word st 234-2345
+always st 23456
+syllable talkshow 2345-25-13-234-125-135-2456
+syllable thorax 2345-125-26-1-6-1346
+syllable trainings 2345-1235-1-24-1345-35-1245-234
+word sta 234-2345-1
+# HOMONYM
+midendword stabell 234-2345-1-23-12345
+midendword stablet 234-2345-1-12-123-15-2345
+midendword stabu 234-2345-1-12-136
+midendword stafel 234-2345-1-124-13456
+midendword stag 234-2345-1-1245
+midendword stagegeld 234-2345-1-12346-1245-13456-145
+endword stage 234-2345-1-12346
+always stagnation 23456-1-1245-1345-5-1345
+always stagnier 23456-1-1245-1345-346-1235
+always stagsegel 23456-1-1245-234-15-1245-13456
+midendword stakt 234-2345-1-13-2345
+always herbst 125-12456-12-23456
+endword stakte 234-2345-1-13-236
+endword stalar 234-2345-25-1-1235
+midword stalar 234-2345-25-356
+midendword stalent 234-2345-25-14-2345
+midendword staler 234-2345-25-12456
+always standstanz 2-23456-234-2345-235-1356
+midword stangent 234-2345-235-1245-14-2345
+endword stangente 234-2345-235-1245-14-236
+endword stanne 234-2345-235-1345-15
+midendword stannen 234-2345-235-1345-14
+midendword stapezier 234-2345-1-1234-15-1356-346-1235
+sufword austarier 34-2345-356-346-1235
+midendword starier 234-2345-356-346-1235
+midendword starif 234-2345-356-24-124
+endword stasche 234-2345-1-156-15
+midendword staschen 234-2345-1-156-14
+endword stasse 234-2345-1-2346-15
+midendword stassen 234-2345-1-2346-14
+endword staste 234-2345-1-23456-15
+endword stasten 234-2345-1-23456-14
+midendword statbestand 234-2345-1-2345-23-2-23456
+midendword statbeständ 234-2345-1-2345-23-5-23456
+midendword stätig 234-2345-345-2345-45
+always bestätig 23-23456-345-2345-45
+midendword stauglich 234-2345-16-1245-456
+midendword staumel 234-2345-16-134-13456
+midendword stausend 234-2345-16-234-14-145
+endword staxe 234-2345-1-6-1346-15
+midendword staxen 234-2345-1-6-1346-14
+word ste 234-2345-15
+midendword steam 234-2345-15-1-134
+begword steam 23456-15-1-134
+always steamen 23456-15-1-134-14
+always steamer 23456-15-1-134-12456
+always steamt 23456-15-1-134-2345
+endword steamte 23456-15-1-134-236
+midendword stechnik 234-2345-13
+midendword stechnisch 234-2345-156
+midendword stechnolog 234-236-1456-1345-135-123-135-1245
+endword stechnologe 234-236-1456-1345-135-123-135-12346
+midendword stee 234-2345-15-15
+always steelband 23456-15-15-123-12-235-145
+midendword steich 234-2345-146-1456
+midword steilnahm 234-2345-146-123-1345-134
+midendword eisteil 146-234-2345-146-123
+midword steilnehm 234-2345-146-123-1345-125
+midendword steils 234-2345-146-123-234
+always steilst 23456-146-123-23456
+midendword steilzeit 234-2345-146-123-1356-2345
+midendword stelefon 234-2345-13456-15-124-135-1345
+midendword stelegraf 234-2345-13456-15-1245-1235-1-124
+midendword estelegraf 123456-2345-13456-15-1245-1235-1-124
+midendword stelegramm 234-2345-13456-15-1245-1235-1-1346
+midendword stemperatur 234-2345-12356-1234-12456-1-2345-136-1235
+midendword stempo 234-2345-12356-1234-135
+midendword stendenz 234-2345-14-145-14-1356
+endword stensor 234-2345-14-234-135-1235
+midword stensor 234-2345-14-234-26
+midendword steppich 234-236-1234-1234-3456
+midendword sterm 234-2345-12456-134
+always läster 123-345-23456-12456
+always pflaster 1234-124-123-1-23456-12456
+always raster 1235-1-23456-12456
+always priester 1234-1235-346-23456-12456
+always meister 134-146-23456-12456
+always geschwister 12346-156-2456-24-23456-12456
+always fenster 124-14-23456-12456
+always polster 1234-135-123-23456-12456
+always oster 135-23456-12456
+always östermalm 246-23456-12456-134-25-134
+always kloster 13-123-135-23456-12456
+always schuster 156-136-23456-12456
+always flüster 124-123-1256-23456-12456
+always muster 134-136-23456-12456
+midword sterrass 234-2345-12456-1235-1-2346
+midword sterrin 234-2345-12456-1235-35
+midword sterritori 234-2345-12456-1235-24-2345-26-24
+midendword ationstest 5-1345-234-236-23456
+sufword aussteuer 34-23456-126-12456
+midendword aussteuer 16-234-23456-126-12456
+always auftragssteuerung 2-16-2345-1245-234-23456-126-12456-136
+midendword niersteuerung 1345-346-1235-23456-126-12456-136
+always baggersteuerung 12-1-1245-1245-12456-23456-126-12456-136
+always bausteuerung 12-16-23456-126-12456-136
+midendword steufel 234-2345-126-124-13456
+midendword stext 234-236-6-1346-2345
+endword stexte 234-236-6-1346-236
+midword stheat 234-2345-125-15-1-2345
+midendword stheke 234-2345-125-15-13-15
+midendword stheken 234-2345-125-15-13-14
+midendword sthema 234-2345-125-12356-1
+midendword sthemen 234-2345-125-12356-14
+midword stheni 234-2345-125-14-24
+endword sthenie 234-2345-125-14-346
+midword stheno 234-2345-125-14-135
+midendword stheo 234-2345-125-15-135
+midword stheor 234-2345-125-15-26
+midword stherap 234-2345-125-12456-1-1234
+midendword stherm 234-2345-125-12456-134
+midendword sthese 234-2345-125-123456-15
+midendword sthesen 234-2345-125-123456-14
+midendword sthron 234-2345-125-1235-135-1345
+midendword sticket 234-2345-24-46-15-2345
+midendword stief 234-2345-346-124
+always stief 23456-346-124
+always stiefbruder 23456-346-124-12-1235-136-145-12456
+always stiefbrüder 23456-346-124-12-1235-1256-145-12456
+always stiefel 23456-346-124-13456
+always stiefgeschwister 23456-346-124-12346-156-2456-24-23456-12456
+always stiefkind 23456-346-124-13-35-145
+always stiefmutter 23456-346-124-134-136-2345-2345-12456
+always stiefmütter 23456-346-124-134-1256-2345-2345-12456
+always stiefschwester 23456-346-124-156-2456-15-23456-12456
+always stiefsohn 23456-346-124-234-135-125-1345
+always stiefsöhn 23456-346-124-234-246-125-1345
+always stieftochter 23456-346-124-2345-135-1456-2345-12456
+always stieftöchter 23456-346-124-2345-246-1456-2345-12456
+always stiefvater 23456-346-124-1236-1-2345-12456
+always stiefväter 23456-346-124-1236-345-2345-12456
+endword stilge 234-2345-24-123-12346
+midendword stilgen 234-2345-24-123-1245-14
+midendword stilger 234-2345-24-123-1245-12456
+midendword stilgung 234-2345-24-123-1245-136
+endword stinte 234-2345-35-236
+midendword stinten 234-2345-35-2345-14
+midendword stip 234-2345-24-1234
+always stipend 23456-24-1234-14-145
+always stippbesuch 23456-24-1234-1234-23-234-136-1456
+always stippchen 23456-24-1234-1234-1456-14
+always stippe 23456-24-1234-1234-15
+always stippen 23456-24-1234-1234-14
+always stippmilch 23456-24-1234-1234-134-24-123-1456
+always stippvisi 23456-24-1234-1234-1236-24-234-24
+always stipulation 23456-24-1234-136-123-5-1345
+always stipulier 23456-24-1234-136-123-346-1235
+midendword stitel 234-2345-24-2345-13456
+midendword stiter 234-2345-24-2345-12456
+midendword stoast 234-2345-135-1-23456
+midendword stochter 234-2345-135-1456-2345-12456
+midendword stod 234-2345-135-145
+begmidword mastodon 134-1-23456-135-145-135-1345
+midendword estod 123456-2345-135-145
+midword stoleran 234-2345-135-123-12456-235
+midendword stool 234-2345-135-135-123
+midendword stopo 234-2345-135-1234-135
+midendword storkel 234-2345-26-13-13456
+midendword storte 234-2345-26-236
+midendword storten 234-2345-26-2345-14
+midendword stour 234-2345-135-136-1235
+midendword stown 234-2345-135-2456-1345
+midendword stracht 234-2345-1235-56-2345
+midendword stradition 234-2345-1235-1-145-24-2345-245
+midendword strag 234-2345-1245
+midendword stragödi 234-2345-1245-246-145-24
+midendword strain 234-2345-1235-1-24-1345
+midword strak 234-2345-1235-1-13
+midword stranch 234-2345-1235-235-1456
+midendword strank 234-2345-1235-235-13
+midendword strans 234-2345-1235-235-234
+midendword stratsch 234-2345-1235-1-2345-156
+midendword strauer 234-2345-1235-16-12456
+midendword straum 234-2345-1235-16-134
+midendword sträum 234-2345-1235-34-134
+always gastraum 1245-1-23456-1235-16-134
+begmidword gasträum 1245-1-23456-1235-34-134
+always lastraum 123-1-23456-1235-16-134
+begmidword lasträum 123-1-23456-1235-34-134
+always kunst 13-256-23456
+midendword ostraum 135-23456-1235-16-134
+midendword osträum 135-23456-1235-34-134
+midendword straurig 234-2345-1235-16-1235-45
+midendword strauung 234-2345-1235-16-136
+midendword streff 234-2345-124
+midendword streib 234-2345-1235-146-12
+midendword strend 234-2345-1235-14-145
+endword strendite 23456-1235-14-145-24-236
+midendword strenditen 23456-1235-14-145-24-2345-14
+midword strenn 234-2345-1235-14-1345
+midword streppe 234-2345-1235-15-1234-1234
+midword stret 234-2345-1235-15-2345
+endword strete 234-2345-1235-15-236
+midendword stribun 234-2345-1235-24-12-256
+midendword strieb 234-2345-1235-346-12
+midendword striller 234-2345-1235-24-12345-12456
+midendword strink 234-2345-1235-35-13
+midendword strog 234-2345-1235-135-1245
+always gastrogel 1245-1-23456-1235-135-1245-13456
+always gastrogen 1245-1-23456-1235-135-1245-14
+begmidword astrogl 1-23456-1235-135-1245-123
+begmidword astrogn 1-23456-1235-135-1245-1345
+always astrograf 1-23456-1235-135-1245-1235-1-124
+always astrograph 1-23456-1235-135-1245-1235-1-1234-125
+always östrogen 246-23456-1235-135-1245-14
+midendword strommel 234-2345-1235-135-1346-13456
+midword strompet 234-2345-1235-135-134-1234-15-2345
+endword strompete 234-2345-1235-135-134-1234-15-236
+midendword strompetet 234-2345-1235-135-134-1234-15-236-2345
+endword strompetete 234-2345-1235-135-134-1234-15-236-236
+midendword stropf 234-2345-1235-135-1234-124
+midword strophä 234-2345-1235-135-1234-125-345
+midendword stross 234-2345-1235-135-2346
+midendword strost 234-2345-1235-135-23456
+midword strot 234-2345-1235-135-2345
+always rostrot 1235-135-23456-1235-135-2345
+prfword rostrote 1235-135-23456-1235-135-236
+midendword strug 234-2345-1235-136-1245
+midendword struthahn 234-2345-1235-136-2345-125-1-125-1345
+midword struthähn 234-2345-1235-136-2345-125-345-125-1345
+midendword strächtig 234-2345-1235-345-1456-2345-45
+midendword sträg 234-5-2345-1245
+midword strän 234-2345-1235-345-1345
+prfword strände 23456-1235-345-1345-145-15
+always stränden 23456-1235-345-1345-145-14
+always ostränder 135-23456-1235-345-1345-145-12456
+prfword stränge 23456-1235-345-1345-12346
+always strängen 23456-1235-345-1345-1245-14
+always strängig 23456-1235-345-1345-1245-45
+midendword sträum 234-2345-1235-34-134
+midword sträum 234-2345-1235-34-134
+endword strög 234-2345-1235-246-12346
+midword strög 234-2345-1235-246-1245
+midword ströpf 234-2345-1235-246-1234-124
+midendword strüb 234-2345-1235-1256-12
+midendword strümmer 234-2345-1235-1256-1346-12456
+midword stuberk 234-2345-136-12-12456-13
+midendword stuch 234-2345-136-1456
+endword stumor 234-2345-136-134-135-1235
+midword stumor 234-2345-136-134-26
+midword sturbin 234-2345-136-1235-12-35
+midendword sturbo 234-2345-136-1235-12-135
+midword sturbul 234-2345-136-1235-12-136-123
+midendword sturn 234-2345-136-1235-1345
+midendword styp 234-2345-6-13456-1234
+midendword styrann 234-2345-6-13456-1235-235-1345
+midword stäfel 234-2345-345-124-13456
+midendword stägig 234-2345-345-1245-45
+midendword stäglich 234-2345-345-1245-456
+midendword stäler 234-2345-345-123-12456
+midword stänz 234-2345-345-1345-1356
+midendword stäter 234-2345-345-2345-12456
+midword stäusch 234-2345-34-156
+midendword stöchter 234-2345-246-1456-2345-12456
+midendword stöne 234-2345-246-1345-15
+midendword stönen 234-2345-246-1345-14
+midendword stöter 234-2345-246-2345-12456
+midendword stötung 234-2345-246-2345-136
+midword stüch 234-2345-1256-1456
+always stücksteil 23456-1256-46-234-2345-146-123
+midword stüft 234-2345-1256-124-2345
+midword stüll 234-2345-1256-12345
+midword stümel 234-2345-1256-134-13456
+midendword stümlich 234-2345-1256-134-456
+midendword stür 234-2345-1256-1235
+always stürb 23456-1256-1235-12
+always stürm 23456-1256-1235-134
+always stürz 23456-1256-1235-1356
+midendword stüte 234-2345-1256-236
+midendword estüte 123456-2345-1256-236
+prfword gestüte 12346-23456-1256-236
+midendword stüten 234-2345-1256-2345-14
+midendword estüten 123456-2345-1256-2345-14
+prfword gestüten 12346-23456-1256-2345-14
+always sthm 234-2345-125-134
+always ästhesie 345-234-2345-125-123456-346
+always ästhet 345-234-2345-125-15-2345
+syllable abgas 1-12-1245-1-234
+always gastank 1245-1-234-2345-235-13
+always gästeelf 1245-345-23456-15-13456-124
+always gasturm 1245-1-234-2345-136-1235-134
+always gastürm 1245-1-234-2345-1256-1235-134
+always kastagnet 13-1-23456-1-1245-1345-15-2345
+always glasteil 1245-123-1-234-2345-146-123
+always glastisch 1245-123-1-234-2345-24-156
+always glasturm 1245-123-1-234-2345-136-1235-134
+always glastürm 1245-123-1-234-2345-1256-1235-134
+always mastermind 134-1-23456-12456-134-35-145
+always anästh 235-345-234-2345-125
+always pastagericht 1234-1-23456-1-12346-2-3456
+always pastagrinsen 1234-1-23456-1-1245-1235-35-234-14
+always frästisch 124-1235-345-234-2345-24-156
+begmidword abstrak 1-12-23456-1235-1-13
+always betriebsteil 23-2345-1235-346-12-234-2345-146-123
+always betriebstreu 23-2345-1235-346-12-234-2345-1235-126
+always krebstier 13-1235-15-12-234-2345-346-1235
+always obstipation 135-12-23456-24-1234-5-1345
+always wettbewerbsteil 2456-15-2345-2345-23-2456-12456-12-234-2345-146-123
+always erwerbstätig 12456-2456-12456-12-234-2345-345-2345-45
+always abschiedstrunk 1-12-156-346-145-234-2345-1235-256-13
+always aidstest 1-24-145-234-236-23456
+sufword verbandstisch 36-12-235-145-234-2345-24-156
+midendword verbandstisch 1236-12456-12-235-145-234-2345-24-156
+always kindstauf 13-35-145-234-2345-16-124
+always kindstäuf 13-35-145-234-2345-34-124
+always rindstalg 1235-35-145-234-2345-25-1245
+always hundsteuer 125-256-145-234-2345-126-12456
+always mordsteuer 134-26-145-234-2345-126-12456
+always mordsteur 134-26-145-234-2345-126-1235
+always esther 123456-2345-125-12456
+always pestherd 1234-15-23456-125-12456-145
+always aesthet 1-15-234-2345-125-15-2345
+always liebestat 123-346-12-123456-2345-1-2345
+always liebestoll 123-346-12-123456-2345-135-12345
+always liebestrunk 123-346-12-123456-2345-1235-256-13
+always landesteil 123-235-145-123456-2345-146-123
+always bundestrupp 12-256-145-123456-2345-1235-136-1234-1234
+always gestippt 12346-23456-24-1234-1234-2345
+prfword gestippte 12346-23456-24-1234-1234-236
+midendword gestüt 12346-23456-1256-2345
+midendword gestüte 12346-23456-1256-236
+always frühstücksteller 124-1235-1256-125-23456-1256-46-234-236-12345-12456
+always tagesteller 2345-1-1245-123456-236-12345-12456
+always siegestrunk 234-346-1245-123456-2345-1235-256-13
+always ruhmestat 1235-136-125-134-123456-2345-1-2345
+before t begmidword pommes 1234-135-1346-123456
+always kirmestanz 13-24-1235-134-123456-2345-235-1356
+always einesteils 1246-123456-2345-146-123-234
+always heeresteil 125-15-15-1235-123456-2345-146-123
+always meerestier 134-15-15-1235-123456-2345-346-1235
+always gottestreu 1245-135-2345-2345-123456-2345-1235-126
+begmidword westempor 2456-15-23456-12356-1234-26
+always gesetzestreu 12346-2-15-123456-2345-1235-126
+# HOMONYM
+always schiffstau 156-24-124-124-234-2345-16
+always schiffstäuf 156-24-124-124-234-2345-34-124
+prfword schiffstonnage 156-24-124-124-234-2345-135-1345-1345-1-12346
+always schiffstonnage 156-24-124-124-234-2345-135-1345-1345-1-1245
+always hilfstaucher 125-24-123-124-234-2345-16-1456-12456
+always hilfstätig 125-24-123-124-234-2345-345-2345-45
+always hilfstrupp 125-24-123-124-234-2345-1235-136-1234-1234
+prfword hofstor 125-135-124-234-2345-135-1235
+begmidword hofstor 125-135-124-234-2345-26
+midendword kaufstresen 13-16-124-234-2345-1235-123456-14
+midendword kaufstrick 13-16-124-234-2345-1235-24-46
+midendword kaufstrip 13-16-124-234-2345-1235-24-1234
+sufword verkaufstisch 36-13-16-124-234-2345-24-156
+midendword verkaufstisch 1236-12456-13-16-124-234-2345-24-156
+always berufstätig 23-1235-136-124-234-2345-345-2345-45
+midendword gstresen 1245-234-2345-1235-15-234-15-1345
+sufword vertragsteil 36-2345-1245-234-2345-146-123
+midendword vertragsteil 1236-12456-2345-1245-234-2345-146-123
+sufword vertragstreu 36-2345-1245-234-2345-1235-126
+midendword vertragstreu 1236-12456-2345-1245-234-2345-1235-126
+always tagstisch 2345-1-1245-234-2345-24-156
+syllable alltags 1-12345-2345-1-1245-234
+always mittagstrunk 134-24-2345-2345-1-1245-234-2345-1235-256-13
+always kriegstalk 13-1235-346-1245-234-2345-25-13
+always kriegstanz 13-1235-346-1245-234-2345-235-1356
+always kriegsteil 13-1235-346-1245-234-2345-146-123
+always kriegstheater 13-1235-346-1245-234-2345-125-15-1-2345-12456
+always kriegsto 13-1235-346-1245-234-2345-135
+always königstreu 13-246-1345-45-234-2345-1235-126
+always anfangsteil 235-124-235-1245-234-2345-146-123
+always empfangsteil 12356-1234-124-235-1245-234-2345-146-123
+prfword längstal 5-123-1245-234-2345-1-123
+always längstal 5-123-1245-234-2345-25
+always zwangstauf 1356-2456-235-1245-234-2345-16-124
+always zwangstäuf 1356-2456-235-1245-234-2345-34-124
+always lieblingst 123-346-12-123-35-1245-234-2345
+always zwillingsturm 1356-2456-24-12345-35-1245-234-2345-136-1235-134
+always zwillingstürm 1356-2456-24-12345-35-1245-234-2345-1256-1235-134
+always flüchtlingstreck 124-123-1256-1456-2345-123-35-1245-234-2345-1235-15-46
+midendword ungstank 136-234-2345-235-13
+midendword ungstat 136-234-2345-1-2345
+midendword ungsteil 136-234-2345-146-123
+midendword ungstisch 136-234-2345-24-156
+midendword ungstresen 136-234-2345-1235-15-234-15-1345
+midendword ungstreu 136-234-2345-1235-126
+midendword ungstrick 136-234-2345-1235-24-46
+midendword ungstrupp 136-234-2345-1235-136-1234-1234
+midendword ungsturm 136-234-2345-136-1235-134
+midendword ungstät 136-234-2345-345-2345
+prfword brandungstor 12-1235-235-145-136-234-2345-135-1235
+always brandungstor 12-1235-235-145-136-234-2345-26
+always mündungstrichter 134-1256-1345-145-136-234-2345-1235-3456-2345-12456
+always spannungston 234-1234-235-1345-136-234-2345-135-1345
+always spannungstön 234-1234-235-1345-136-234-2345-246-1345
+sufword versöhnungstrunk 36-234-246-125-1345-136-234-2345-1235-256-13
+midendword versöhnungstrunk 1236-12456-234-246-125-1345-136-234-2345-1235-256-13
+prfword führungstor 124-125-136-234-2345-135-1235
+always führungstor 124-125-136-234-2345-26
+always führungstrupp 124-125-136-234-2345-1235-136-1234-1234
+always beobachtungstürm 23-135-12-56-2345-136-234-2345-1256-1235-134
+always begrüßungstrunk 23-1245-1235-1256-2346-136-234-2345-1235-256-13
+always zeitungstisch 1356-2345-136-234-2345-24-156
+always gebirgstrupp 12346-12-24-1235-1245-234-2345-1235-136-1234-1234
+always zugsteil 1356-136-1245-234-2345-146-123
+always gesprächsteil 12346-5-234-1234-234-2345-146-123
+always wachstum 2456-56-234-2345-136-134
+always sechsteil 234-15-1456-234-2345-146-123
+sufword ausgleichs 34-1245-1456-234
+midword ausgleichs 16-234-1245-1456-234
+always reichsteil 1235-146-1456-234-2345-146-123
+always reichstrupp 1235-146-1456-234-2345-1235-136-1234-1234
+always mönchstum 134-246-1345-1456-234-2345-136-134
+prfword durchbruchstal 2-1456-12-1235-136-1456-234-2345-1-123
+always durchbruchstal 2-1456-12-1235-136-1456-234-2345-25
+prfword einbruchstal 1246-12-1235-136-1456-234-2345-1-123
+always einbruchstal 1246-12-1235-136-1456-234-2345-25
+sufword versuchstier 36-234-136-1456-234-2345-346-1235
+midendword versuchstier 1236-12456-234-136-1456-234-2345-346-1235
+always frühstücksteller 124-1235-1256-125-23456-1256-46-234-2345-15-12345-12456
+always frühstückstisch 124-1235-1256-125-23456-1256-46-234-2345-24-156
+always hephaistostempel 125-15-1234-125-1-24-23456-135-234-2345-12356-1234-13456
+always distorsion 145-24-234-2345-26-234-245
+always eistanz 146-234-2345-235-1356
+begmidword eistort 146-234-2345-26-2345
+prfword eistorte 146-234-2345-26-236
+begmidword eistört 146-234-2345-246-1235-2345
+always reisteig 1235-146-234-2345-146-1245
+always reistopf 1235-146-234-2345-135-1234-124
+always kreisteil 13-1235-146-234-2345-146-123
+always beweisteil 23-2-146-2345-146-123
+syllable geheimnis 12346-125-146-134-1346
+always tischtennistisch 2345-24-156-2345-14-1345-24-234-2345-24-156
+always bündnistreu 12-1256-1345-145-1346-2345-1235-126
+always eucharistiefeier 126-1456-356-24-23456-346-124-146-12456
+begmidword elvistoll 13456-1236-24-234-2345-135-12345
+always backstage 12-1-46-23456-1-12346
+always speckstipp 234-1234-15-46-23456-24-1234-1234
+always fockstag 124-135-46-23456-1-1245
+prfword glückstor 1245-46-234-2345-135-1235
+always glückstor 1245-46-234-2345-26
+sufword ausdruckstanz 34-145-46-234-2345-235-1356
+always ausdruckstanz 16-234-145-46-234-2345-235-1356
+always volkstanz 1236-13-234-2345-235-1356
+always volkstänz 1236-13-234-2345-345-1345-1356
+always volkstum 1236-13-234-2345-136-134
+always bezirkstier 23-1356-24-1235-13-234-2345-346-1235
+always karnevalstrubel 13-356-1345-15-1236-25-234-2345-1235-136-12-13456
+always handelsteil 125-145-13456-234-2345-146-123
+always himmelstanz 125-24-1346-13456-234-2345-235-1356
+always himmelstempel 125-24-1346-13456-234-2345-12356-1234-13456
+prfword himmelstor 125-24-1346-13456-234-2345-135-1235
+always himmelstor 125-24-1346-13456-234-2345-26
+syllable befehls 23-124-2356-123-234
+prfword fallstor 124-12345-234-2345-135-1235
+always fallstor 124-12345-234-2345-26
+prfword hadrianstor 125-1-145-1235-24-235-234-2345-135-1235
+always hadrianstor 125-1-145-1235-24-235-234-2345-26
+always kapitänstisch 13-1-1234-24-2345-345-1345-234-2345-24-156
+always friedenstaub 124-1235-346-145-14-234-2345-16-12
+prfword friedenstaube 124-1235-346-145-14-234-2345-16-12-15
+always friedenstrupp 124-1235-346-145-14-234-2345-1235-136-1234-1234
+always kondenstopf 13-135-1345-145-14-234-2345-135-1234-124
+always kondenstöpf 13-135-1345-145-14-234-2345-246-1234-124
+sufword vermögensteil 36-2-246-14-234-2345-146-123
+midendword vermögensteil 1236-12456-2-246-14-234-2345-146-123
+always dienstagent 145-346-1345-23456-1-1245-14-2345
+always schreckenstat 156-1235-15-46-14-234-2345-1-2345
+always namensteil 1345-1-134-14-234-2345-146-123
+always unternehmensteil 2-256-1345-125-14-234-2345-146-123
+always willkommenstrunk 2456-12345-13-1346-14-234-2345-1235-256-13
+always wissenstempel 2456-2346-14-234-2345-12356-1234-13456
+always einstipp 1246-23456-24-1234-1234
+always mannstoll 134-1345-234-2345-135-12345
+always wahnsinnstat 2456-1-125-1345-234-35-1345-234-2345-1-2345
+always wahnsinnstät 2456-1-125-1345-234-35-1345-234-2345-345-2345
+always irrsinnstat 24-1235-1235-234-35-1345-234-2345-1-2345
+always ionsteil 24-135-1345-234-2345-146-123
+always ionstisch 24-135-1345-234-2345-24-156
+midendword ionstreu 24-135-1345-234-2345-1235-126
+always legionstrupp 123-15-1245-24-135-1345-234-2345-1235-136-1234-1234
+always unionstrupp 256-24-135-1345-234-2345-1235-136-1234-1234
+always invasionstrupp 35-1236-1-234-245-234-2345-1235-136-1234-1234
+always formationstanz 124-26-134-5-1345-234-2345-235-1356
+always rezitationston 1235-15-1356-24-2345-5-1345-234-2345-135-1345
+always aktionstrupp 1-13-2345-245-234-2345-1235-136-1234-1234
+always revolutionstrupp 1235-15-1236-135-123-136-2345-245-234-2345-1235-136-1234-1234
+always ostagent 135-23456-1-1245-14-2345
+always lostrab 123-135-234-2345-1235-1-12
+always moostier 134-135-135-234-2345-346-1235
+word pst 1234-234-2345
+sufword verkehrsteil 36-13-2356-1235-234-2345-146-123
+midendword verkehrsteil 1236-12456-13-2356-1235-234-2345-146-123
+begword verkehrsto 36-13-2356-1235-234-2345-135
+midword verkehrsto 1236-12456-13-2356-1235-234-2345-135
+always kursteil 13-136-1235-234-2345-146-123
+sufword ausstieg 34-23456-346-1245
+midendword ausstieg 16-234-23456-346-1245
+word ausstiege 34-23456-346-12346
+endword ausstiege 16-234-23456-346-12346
+always sstell 234-2-13456
+always fasst 124-1-2346-2345
+prfword fasste 124-1-2346-236
+prfword fasstest 124-1-2346-236-23456
+prfword fasstet 124-1-2346-236-2345
+always hasst 125-1-2346-2345
+always agulhasstrom 1-1245-136-123-125-1-234-23456-1235-135-134
+prfword hasste 125-1-2346-236
+always hasstest 125-1-2346-236-23456
+always schasst 156-1-2346-2345
+prfword schasste 156-1-2346-236
+prfword schasstest 156-1-2346-236-23456
+prfword schasstet 156-1-2346-236-2345
+midendword blasst 12-123-1-2346-2345
+endword blasste 12-123-1-2346-236
+midendword blasstest 12-123-1-2346-236-23456
+endword blasstet 12-123-1-2346-236-2345
+always thomasst 2345-125-135-134-1-234-23456
+always eidesstatt 146-145-123456-23456-1-2345-2345
+always kongressteil 13-135-1345-1245-1235-15-2346-2345-146-123
+word isst 24-2346-2345
+always beißt 12-146-2346-2345
+sufword vergisst 36-1245-24-2346-2345
+always hisst 125-24-2346-2345
+prfword hisste 125-24-2346-236
+prfword hisstest 125-24-2346-236-23456
+prfword hisstet 125-24-2346-236-2345
+word wisst 2456-2346-2345
+word psst 1234-234-234-2345
+midendword ssst 234-234-234-2345
+before s begmidword mess 134-15-2346
+before s begmidword miss 134-24-2346
+word pssst 1234-234-234-234-2345
+word psssst 1234-234-234-234-234-2345
+always gussteil 1245-136-2346-2345-146-123
+always küsst 13-1256-2346-2345
+prfword küsste 13-1256-2346-236
+prfword küsstest 13-1256-2346-236-23456
+prfword küsstet 13-1256-2346-236-2345
+prfword flusstal 124-123-136-2346-2345-1-123
+begmidword flusstal 124-123-136-2346-2345-25
+always schlussteil 156-123-136-2346-2345-146-123
+always wusst 2456-136-2346-2345
+prfword wusste 2456-136-2346-236
+always wusstest 2456-136-2346-236-23456
+prfword wusstet 2456-136-2346-236-2345
+always wüsst 2456-1256-2346-2345
+prfword wüsste 2456-1256-2346-236
+prfword wüsstest 2456-1256-2346-236-23456
+prfword wüsstet 2456-1256-2346-236-2345
+always ratstisch 1235-1-2345-234-2345-24-156
+midendword itätstreu 5-345-234-2345-1235-126
+always sanitätstrupp 234-235-5-345-234-2345-1235-136-1234-1234
+always gebietsteil 12346-12-346-2345-234-2345-146-123
+always gesellschaftstanz 1245-156-234-2345-235-1356
+always schaftsteil 156-234-2345-146-123
+midendword schaftstreu 156-234-2345-1235-126
+always geschäftsteil 1245-124-234-2345-146-123
+always anschriftsteil 235-156-2345-234-2345-146-123
+prfword stiftstor 23456-24-124-2345-234-2345-135-1235
+begmidword stiftstor 23456-24-124-2345-234-2345-26
+midendword kunftstrick 13-256-124-2345-234-2345-1235-24-46
+always machtsteil 134-56-2345-234-2345-146-123
+always weihnachtsteller 2456-146-125-1345-56-2345-234-236-12345-12456
+always weihnachtstisch 2456-146-125-1345-56-2345-234-2345-24-156
+always gefechtsturm 12346-124-15-1456-2345-234-2345-136-1235-134
+always geschlechtsteil 12346-156-123-15-1456-2345-234-2345-146-123
+syllable gesichts 12346-234-3456-2345-234
+always nichtstuer 1345-234-2345-136-12456
+always nichtstun 1345-234-2345-256
+sufword aussichtsturm 34-234-3456-2345-234-2345-136-1235-134
+always aussichtsturm 16-234-234-3456-2345-234-2345-136-1235-134
+begword aussichtstürm 34-234-3456-2345-234-2345-1256-1235-134
+always aussichtstürm 16-234-234-3456-2345-234-2345-1256-1235-134
+always arbeitsteil 356-12-234-2345-146-123
+midendword heitstick 125-234-2345-24-46
+midendword heitstrunk 125-234-2345-1235-256-13
+always gewohnheitstier 12346-2456-135-125-1345-125-234-2345-346-1235
+always sicherheitstrupp 234-3456-12456-125-234-2345-1235-136-1234-1234
+always keitsteil 13-234-2345-146-123
+midendword keitstreu 13-234-2345-1235-126
+prfword abseitstor 1-12-234-146-2345-234-2345-135-1235
+always abseitstor 1-12-234-146-2345-234-2345-26
+always veitstanz 1236-146-2345-234-2345-235-1356
+always veitstänz 1236-146-2345-234-2345-345-1345-1356
+always amtston 1-134-2345-234-2345-135-1345
+word auswärtstor 34-2456-2345-135-1235
+begword auswärtstor 34-2456-2345-26
+midword auswärtstor 16-234-2456-2345-26
+endword auswärtstor 16-234-2456-2345-135-1235
+always wirtstier 2456-24-1235-2345-234-2345-346-1235
+always ortsteil 26-2345-234-2345-146-123
+always geburtstaub 12346-12-136-1235-2345-234-2345-16-12
+always kabinettstisch 13-1-12-35-15-2345-2345-234-2345-24-156
+always blutstrunk 12-123-136-2345-234-2345-1235-256-13
+sufword austausch 34-2345-16-156
+always austausch 16-234-2345-16-156
+sufword austeil 34-2345-146-123
+always austeil 16-234-2345-146-123
+sufword austob 34-2345-135-12
+always austob 16-234-2345-135-12
+word austobe 34-2345-135-12-15
+midword austobe 16-234-2345-135-23
+endword austobe 16-234-2345-135-12-15
+word austoben 34-2345-135-12-14
+midendword austoben 16-234-2345-135-12-14
+sufword austoll 34-2345-135-12345
+always austoll 16-234-2345-135-12345
+sufword austonn 34-2345-135-1345-1345
+always austonn 16-234-2345-135-1345-1345
+midword stonn 234-2345-135-1345-1345
+sufword austramp 34-2345-1235-1-134-1234
+always austramp 16-234-2345-1235-1-134-1234
+sufword austrat 34-2345-1235-1-2345
+word austratet 34-2345-1235-1-236-2345
+word austratest 34-2345-1235-1-236-23456
+always austrat 16-234-2345-1235-1-2345
+endword austratet 16-234-2345-1235-1-236-2345
+endword austratest 16-234-2345-1235-1-236-23456
+sufword austrick 34-2345-1235-24-46
+always austrick 16-234-2345-1235-24-46
+sufword austritt 34-2345-1235-24-2345-2345
+always austritt 16-234-2345-1235-24-2345-2345
+word austritte 34-2345-1235-24-2345-236
+endword austritte 16-234-2345-1235-24-2345-236
+sufword austrock 34-2345-1235-135-46
+always austrock 16-234-2345-1235-135-46
+sufword austun 34-2345-256
+always austun 16-234-2345-256
+sufword austupf 34-2345-136-1234-124
+always austupf 16-234-2345-136-1234-124
+sufword austusch 34-2345-136-156
+always austusch 16-234-2345-136-156
+always haustaub 125-16-234-2345-16-12
+prfword haustaube 125-16-234-2345-16-12-15
+always haustempel 125-16-234-2345-12356-1234-13456
+always haustier 125-16-234-2345-346-1235
+always haustisch 125-16-234-2345-24-156
+prfword haustor 125-16-234-2345-135-1235
+always haustor 125-16-234-2345-26
+begmidword haustrepp 125-16-234-2345-1235-15-1234-1234
+always haustrunk 125-16-234-2345-1235-256-13
+always hausturm 125-16-234-2345-136-1235-134
+always voraustrupp 2-26-16-234-2345-1235-136-1234-1234
+always sausteil 234-16-23456-146-123
+always moschustier 134-135-156-136-234-2345-346-1235
+always juliusturm 245-136-123-24-136-234-2345-136-1235-134
+always konfuziustempel 13-135-1345-124-136-1356-24-136-234-2345-12356-1234-13456
+always adjustage 1-145-245-136-23456-1-12346
+always kustode 13-136-23456-135-145-15
+always kustoden 13-136-23456-135-145-14
+always zirkustier 1356-24-1235-13-136-234-2345-346-1235
+always kursusteil 13-136-1235-234-136-234-2345-146-123
+before t begmidword dys 145-6-13456-234
+always body 12-135-145-6-13456
+always nystagmus 1345-6-13456-23456-1-1245-134-136-234
+
+# STAAT (4.4 Zweiformige Kürzungen)
+always staat 23456-2345
+
+# STAND STÄND (4.3.6 Kommakürzungen)
+always stand 2-23456
+always ständ 5-23456
+always stands 2-23456-234
+always standschaft 2-23456-156
+always standsetz 2-23456-2-15
+always standsprach 2-23456-234-1234
+always standsprung 2-23456-234-1234-1235-256-1245
+prfword standst 2-23456-23456
+always standstreif 2-23456-23456-1235-146-124
+
+# STELL (4.3.6 Kommakürzungen)
+always stell 2-13456
+always bruchstell 12-1235-136-1456-2-13456
+
+# STETS (4.4 Zweiformige Kürzungen)
+always stets 23456-234
+always stetson 23456-15-2345-234-135-1345
+
+# TE  (4.1 Lautgruppenkürzungen)
+midendword te 236
+always teakbaum 2345-15-1-13-12-16-134
+always teakholz 2345-15-1-13-125-135-123-1356
+always teakhölz 2345-15-1-13-125-246-123-1356
+always teakwald 2345-15-1-13-2456-25-145
+always teakwäld 2345-15-1-13-2456-345-123-145
+always team 2345-15-1-134
+always tearoom 2345-15-1-1235-135-135-134
+always teaser 2345-15-1-234-12456
+endword teditor 2345-15-145-24-2345-135-1235
+midword teditor 2345-15-145-24-2345-26
+always tee 2345-15-15
+always güteein 1245-1256-236-1246
+midword teffek 2345-15-124-124-15-13
+midword teffizien 2345-15-124-124-24-1356-24-14
+midendword tehirn 236-125-24-1235-1345
+midendword tei 2345-146
+midendword tein 2345-1246
+always jutein 245-136-236-35
+midendword tekzem 2345-15-13-1356-12356
+midword tepidem 2345-15-1234-24-145-12356
+midword tepilep 2345-15-1234-24-123-15-1234
+midword tepoch 2345-15-1234-135-1456
+midendword tetat 2345-15-2345-1-2345
+midendword tethik 2345-15-2345-125-24-13
+midendword tethisch 2345-15-2345-125-24-156
+always teuer 2345-126-12456
+always teuf 2345-126-124
+always teupitz 2345-126-1234-24-2345-1356
+always teur 2345-126-1235
+always teutoburg 2345-126-2345-135-12-136-1235-1245
+always teuton 2345-126-2345-135-1345
+midword tevaku 2345-15-1236-1-13-136
+midword tevalu 2345-15-1236-25-136
+midword tex 2345-15-6-1346
+midword texan 236-6-1346-235
+always latex 123-1-236-6-1346
+midendword text 236-6-1346-2345
+midendword textra 2345-15-6-1346-2345-1235-1
+sufword textrand 2345-15-6-1346-2345-1235-235-145
+midendword textrand 236-6-1346-2345-1235-235-145
+endword texte 236-6-1346-236
+midendword textet 236-6-1346-236-2345
+endword textete 236-6-1346-236-236
+midword texemp 2345-15-6-1346-12356-1234
+midword texpand 2345-15-6-1346-1234-235-145
+midendword texpansion 2345-15-6-1346-1234-235-234-245
+midword texper 2345-15-6-1346-1234-12456
+midword texplo 2345-15-6-1346-1234-123-135
+midword texpor 2345-15-6-1346-1234-26
+midendword texpress 2345-15-6-1346-1234-1235-15-2346
+midendword texzess 2345-15-6-1346-1356-15-2346
+always saateul 234-1-1-2345-126-123
+midendword teau 2345-15-16
+always raterund 1235-1-236-1235-256-145
+before s begmidword karate 13-356-1-236
+prfword karates 13-356-1-2345-123456
+before a begmidword geräte 12346-1235-345-236
+before a begmidword elite 13456-24-236
+before a begmidword härte 125-345-1235-236
+begmidword spinatess 234-1234-35-1-2345-15-2346
+always geräteeigen 12346-1235-345-236-146-1245-14
+begmidword geräteein 12346-1235-345-236-1246
+begmidword geräteent 12346-1235-345-236-14-2345
+always pentateuch 1234-14-2345-1-2345-126-1456
+always cocteau 6-14-135-6-14-2345-15-16
+begmidword kräfteein 5-13-124-15-1246
+always beeftea 12-15-15-124-2345-15-1
+always giftefeu 1245-24-124-2345-15-124-126
+always duftessenz 145-136-124-2345-15-2346-14-1356
+sufword achteck 1-1456-2345-15-46
+always achteck 56-2345-15-46
+always nachteul 1345-56-2345-126-123
+sufword lichtecht 123-3456-2345-15-1456-2345
+midendword lichtecht 456-2345-15-1456-2345
+word lichtechte 123-3456-2345-15-1456-236
+midendword lichtechte 456-2345-15-1456-236
+always zuchteber 1356-136-1456-2345-15-12-12456
+always drahtextension 145-1235-1-125-2345-15-6-1346-2345-14-234-245
+begmidword eliteein 13456-24-236-1246
+always eliteelf 13456-24-236-13456-124
+begmidword friteus 124-1235-24-2345-126-234
+always kakteen 13-1-13-236-14
+always distrikteben 145-24-23456-1235-24-13-2345-15-12-14
+begmidword halteein 125-25-236-1246
+begmidword kälteein 13-345-123-236-1246
+begmidword kälteempfind 13-345-123-236-12356-1234-124-35-145
+begmidword kälteerzeug 13-345-123-236-12456-1356-126-1245
+begmidword kälteex 13-345-123-236-15-6-1346
+always zelteck 1356-13456-2345-15-46
+always gesamtetat 12346-234-1-134-2345-15-2345-1-2345
+always gesamtex 12346-234-1-134-2345-15-6-1346
+always montezuma 134-135-1345-236-1356-136-134-1
+begmidword ernteameis 12456-1345-236-1-134-146-234
+begmidword ernteaus 12456-1345-236-16-234
+begmidword ernteein 12456-1345-236-1246
+begmidword ernteer 12456-1345-236-12456
+always proteus 1234-1235-135-2345-126-234
+always stripteas 23456-1235-24-1234-2345-15-1-234
+always stripteus 23456-1235-24-1234-2345-126-234
+begmidword dompteus 145-135-134-1234-2345-126-234
+always hunderteck 125-256-145-12456-2345-15-46
+begmidword werteein 2456-12456-236-1246
+begmidword werteel 2456-12456-236-13456
+always wertethik 2456-12456-2345-15-2345-125-24-13
+always wertethisch 2456-12456-2345-15-2345-125-24-156
+always fortexist 124-26-2345-15-6-1346-24-23456
+begmidword portefeuill 1234-26-236-124-126-24-12345
+always steelband 23456-15-15-123-12-235-145
+begmidword gersteein 1245-12456-23456-15-1246
+always glattechs 1245-123-1-2345-2345-15-1456-234
+always bretteffekt 12-1235-15-2345-2345-15-124-124-15-13-2345
+prfword bretteffekte 12-1235-15-2345-2345-15-124-124-15-13-236
+begmidword balletteus 12-1-12345-15-2345-2345-126-234
+begmidword wettess 2456-15-2345-2345-15-2346
+always schnitteben 156-1345-24-2345-2345-15-12-14
+begmidword fritteus 124-1235-24-2345-2345-126-234
+always fauteuil 124-16-2345-126-24-123
+begmidword leuteess 123-126-236-15-2346
+always gutedel 1245-136-2345-15-145-13456
+begmidword güteeigen 1245-1256-236-146-1245-14
+always blutegel 12-123-136-2345-15-1245-13456
+
+# TEh
+begmidword teh 2345-2356
+before h begmidword geräte 12346-1235-345-236
+begmidword geschäftehalber 1245-124-15-125
+always rechtehand 1235-2345-15-125-145
+always früchtehändler 124-1235-1256-1456-236-5-125-145-123-12456
+before h begmidword white 2456-125-24-236
+before h begmidword elite 13456-24-236
+before h begmidword ernte 12456-1345-236
+always remotehost 1235-12356-135-236-125-135-23456
+before h begmidword warte 2456-356-236
+before h begmidword gäste 1245-345-23456-15
+begmidword restehauf 1235-15-23456-15-125-16-124
+before h begmidword zugute 2-1356-1245-136-236
+always hütehund 125-1256-236-125-256-145
+always buxtehud 12-136-6-1346-236-125-136-145
+begmidword ärztehon 345-1235-1356-236-125-135-1345
+
+# TEl
+always tel 2345-13456
+midendword telang 236-123-1245
+midword teläng 236-5-123-1245
+midword teleist 236-123-146-23456
+midword teliefer 236-123-346-124-12456
+midword telini 236-123-35-24
+sufword tell 2345-15-12345
+midendword tell 236-12345
+midendword tellang 2345-13456-123-1245
+midendword telläng 2345-13456-5-123-1245
+midendword telliter 2345-13456-123-24-2345-12456
+midendword tellos 2345-13456-123-135-234
+begmidword kräftel 5-13-124-15-123
+always wachtel 2456-56-2345-13456
+always scheitel 156-146-2345-13456
+before l begmidword seite 234-146-236
+always whitelist 2456-125-24-236-123-24-23456
+always kapitellang 13-1-1234-24-2345-13456-123-1245
+always kapitelläng 13-1-1234-24-2345-13456-5-123-1245
+always titel 2345-24-2345-13456
+begmidword kältel 13-345-123-236-123
+always mantel 134-235-2345-13456
+always jahrzehntelang 245-1356-15-123-1245
+always hotel 125-135-2345-13456
+always hoteller 125-135-236-12345-12456
+before l begmidword warte 2456-356-236
+always jahrhundertelang 245-125-15-123-1245
+before l begmidword werte 2456-12456-236
+always gürtel 1245-1256-1235-2345-13456
+always debattelos 145-15-12-1-2345-236-123-135-234
+always sattel 234-1-2345-2345-13456
+always schüttel 156-1256-2345-2345-13456
+always beutelust 12-126-236-123-136-23456
+always beutelüst 12-126-236-123-1256-23456
+begmidword jutel 245-136-236-123
+# TEm
+always tem 2345-12356
+midword temanipul 236-134-235-24-1234-136-123
+midendword temann 236-134-1345
+midendword temänn 236-5-134-1345
+midendword temaschin 236-134-156
+midword temechan 236-134-15-1456-235
+midendword temedizin 236-134-15-145-24-1356-35
+midendword temess 236-134-15-2346
+midendword temilieu 236-134-24-123-24-126
+midendword temittel 236-134-2345
+endword temmal 2345-12356-134
+before m midendword apparate 1-1234-1234-356-1-236
+before m midendword geräte 12346-1235-345-236
+before m midendword geschäfte 1245-124-15
+before m midendword kräfte 5-13-124-15
+before m midendword rechte 1235-2345-15
+prfword rechtem 1235-2345-12356
+before m midendword gerüchte 12346-1235-1256-1456-236
+always sitemap 234-24-236-134-1-1234
+begmidword haltem 125-25-236-134
+before m begmidword kälte 13-345-123-236
+before m begmidword warte 2456-356-236
+always portemonnaie 1234-26-236-134-135-1345-1345-1-24-15
+prfword portemonnaies 1234-26-236-134-135-1345-1345-1-24-123456
+before m begmidword gäste 1245-345-23456-15
+before m begmidword leute 123-126-236
+before m begmidword güte 1245-1256-236
+prfword ärztem 345-1235-1356-2345-12356
+before m begmidword ärzte 345-1235-1356-236
+# TEn
+always ten 2345-14
+endword tename 236-1345-1-134-15
+midendword tenamen 236-1345-1-134-14
+midendword tenummer 236-1345-136-1346-12456
+always kräftenach 5-13-124-15-1345-56
+begmidword seitenahm 234-146-236-1345-134
+begmidword seitenehm 234-146-236-1345-125
+always monteneg 134-135-1345-236-1345-15-1245
+always gutenacht 1245-136-236-1345-56-2345
+always gütenorm 1245-1256-236-1345-26-134
+# TEr
+always ter 2345-12456
+always räterepublik 1235-345-236-1235-13
+before r midendword geräte 12346-1235-345-236
+always städtereis 23456-345-145-236-1235-146-234
+begmidword früchter 124-1235-1256-1456-236-1235
+always halteraum 125-25-236-1235-16-134
+always kältereg 13-345-123-236-1235-15-1245
+always kälteresist 13-345-123-236-1235-123456-24-23456
+always halteriegel 125-25-236-1235-346
+always haltering 125-25-236-1235-35-1245
+prfword halteringe 125-25-236-1235-35-12346
+always halteräum 125-25-236-1235-34-134
+always erntereif 12456-1345-236-1235-146-124
+always warteraum 2456-356-236-1235-16-134
+always warteräum 2456-356-236-1235-34-134
+always werterechn 2456-12456-236-1235-15-1456-1345
+before r begmidword gäste 1245-345-23456-15
+always pusterohr 1234-136-23456-15-1235-135-125-1235
+always pusteröhr 1234-136-23456-15-1235-246-125-1235
+always beuterecht 12-126-236-1235-2345
+always güteregelung 1245-1256-236-1235-15-1245-13456-136
+begmidword ärzter 345-1235-1356-236-1235
+# TEs
+always tes 2345-123456
+midendword tesaal 236-234-1-1-123
+midendword tesegen 236-234-15-1245-14
+midendword teseil 236-234-146-123
+endword teseite 236-234-146-236
+midendword teseiten 236-234-146-2345-14
+midendword teseriell 236-234-12456-24-15-12345
+midendword tesetz 236-2-15
+midendword tesiegel 236-234-346-1245-13456
+endword tesignal 236-234-45-1345-1-123
+midword tesignal 236-234-45-1345-25
+midendword tesilo 236-234-24-123-135
+midendword teskala 236-234-13-25-1
+midendword teskalation 2345-123456-13-25-5-1345
+midword tesoftwar 236-234-135-124-2345-2456-356
+midendword tesoldat 236-234-135-123-145-1-2345
+midendword tespannung 236-234-1234-235-1345-136
+midword tespektr 236-234-1234-15-13-2345-1235
+midendword tespezifisch 236-234-1234-15-1356-24-124-24-156
+midendword tespiel 236-2-346
+midendword tespray 236-234-1234-1235-1-6-13456
+midendword tesystem 236-234-6-13456-23456-12356
+endword tesäle 236-234-345-123-15
+midendword tesälen 236-234-345-123-14
+always ratesendung 1235-1-236-234-14-145-136
+always kräftespiel 5-13-124-15-2-346
+always rechtesystem 1235-2345-15-234-6-13456-23456-12356
+always whitespac 2456-125-24-236-234-1234-1-6-14
+always punktesamm 1234-2345-15-234-1-1346
+always punktespiel 1234-2345-15-2-346
+always punktesystem 1234-2345-15-234-6-13456-23456-12356
+begmidword montesin 134-135-1345-236-234-35
+always jutesack 245-136-236-234-1-46
+always jutespinn 245-136-236-234-1234-35-1345
+always jutesäck 245-136-236-234-345-46
+# TEsch
+always tesch 236-156
+midendword teschaft 236-156
+midendword teschlag 236-156-1245
+midendword teschlang 236-156-123-235-1245
+endword teschlange 236-156-123-235-12346
+midendword teschrift 236-156-2345
+midendword teschwung 236-156-2456-256-1245
+prfword weltesche 2456-13456-2345-15-156-15
+prfword welteschen 2456-13456-2345-15-156-14
+# TEss
+midendword tess 236-2346
+sufword tess 2345-15-2346
+always acetessig 1-6-14-15-2345-15-2346-45
+prfword diabetesstar 145-24-1-23-2345-123456-23456-1-1235
+always diabetesstar 145-24-1-23-2345-123456-23456-356
+always nachtessen 1345-56-2345-15-2346-14
+always fruchtessenz 124-1235-136-1456-2345-15-2346-14-1356
+always quintessenz 6-12345-136-35-2345-15-2346-14-1356
+always obstessig 135-12-23456-15-2346-45
+always festessen 124-15-23456-15-2346-14
+begmidword geistessch 1245-146-23456-123456-156
+begmidword geistesst 1245-146-23456-123456-23456
+# TEst
+sufword test 2345-15-23456
+midendword test 236-23456
+midendword testand 236-2-23456
+midendword teständ 236-5-23456
+midendword testell 236-2-13456
+midendword testund 236-23456-256-145
+midendword testünd 236-23456-1256-1345-145
+always asphaltestrich 1-234-1234-125-25-2345-15-23456-1235-3456
+always zementestrich 1356-12356-14-2345-15-23456-1235-3456
+
+# TECHNIK (4.4 Zweiformige Kürzungen)
+syllable technik 2345-13
+
+# TECHNISCH (4.4 Zweiformige Kürzungen)
+syllable technisch 2345-156
+
+# TRAG (4.4 Zweiformige Kürzungen)
+always trag 2345-1245
+always träg 5-2345-1245
+sufword tetragon 2345-15-2345-1235-1-1245-135-1345
+midendword tetragon 236-2345-1235-1-1245-135-1345
+always arbitr 356-12-24-2345-1235
+before g begmidword ultra 136-123-2345-1235-1
+prfword astragal 1-23456-1235-1-1245-1-123
+always astragal 1-23456-1235-1-1245-25
+always estragon 15-23456-1235-1-1245-135-1345
+before g begword extra 1346-2345-1235-1
+before g midword extra 15-6-1346-2345-1235-1
+
+# TREFF (4.4 Zweiformige Kürzungen)
+always treff 2345-124
+
+# TROTZ (4.4 Zweiformige Kürzungen)
+always trotz 2345-1356
+always trotzki 2345-1235-135-2345-1356-13-24
+always trotzkismus 2345-1235-135-2345-1356-13-5-24
+always trotzkistisch 2345-1235-135-2345-1356-13-5-156
+always strotz 23456-1235-135-2345-1356
+
+# ÜBER (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word über 1256
+always über-\s 2-1256-36-0
+word über'm 1256-6-134
+word über'n 1256-6-1345
+word über's 1256-6-234
+always über 2-1256
+always büberei 12-1256-12-12456-146
+always trüber 2345-1235-1256-12-12456
+sufword stüber 23456-1256-12-12456
+prfword stüber 23456-1256-12-12456
+
+# ÜBERHAUPT (4.4 Zweiformige Kürzungen)
+always überhaupt 1256-125
+
+# ÜBRIG (4.4 Zweiformige Kürzungen)
+always übrig 1256-45
+
+# UN  (4.1 Lautgruppenkürzungen)
+word un 136-1345
+always un-\s 256-36-0
+always un 256
+always un-\s 256-36-0
+always un-,\s 256-36-2-0
+sufword ausbaunummer 34-12-16-1345-136-1346-12456
+midendword ausbaunummer 16-234-12-16-1345-136-1346-12456
+always werbeun 2456-12456-23-256
+always werbeunter 2456-12456-23-2-256
+always reunier 1235-15-256-346-1235
+always council 6-14-135-136-1345-6-14-24-123
+always count 6-14-135-136-1345-2345
+always mount 134-135-136-1345-2345
+prfword mounte 134-135-136-1345-236
+prfword mountest 134-135-136-1345-236-23456
+always mountet 134-135-136-1345-236-2345
+prfword mountete 134-135-136-1345-236-236
+always mountetet 134-135-136-1345-236-236-2345
+always mountetest 134-135-136-1345-236-236-23456
+always thermounter 2345-125-12456-134-135-2-256
+always tunichtgut 2345-136-2-1345-1245-136-2345
+always bantuneger 12-235-2345-136-1345-15-1245-12456
+always neuunter 1345-126-2-256
+
+# UND (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word und 136
+always und 2-136
+always undank 256-145-13
+always undatier 256-145-1-2345-346-1235
+begmidword undefin 256-145-15-124-35
+always undehn 256-145-2356-1345
+always undekl 256-145-15-13-123
+always undeklarier 256-145-15-13-123-356-346-1235
+always undemokrat 256-145-2345
+always undenk 256-145-14-13
+always under 256-145-12456
+always undestillier 256-145-15-23456-24-12345-346-1235
+prfword undeutbar 256-145-126-2345-12-1-1235
+begmidword undeutbar 256-145-126-2345-12-356
+always undeutlich 256-145-126-2345-456
+always undeutsch 256-145-156
+always undezim 256-145-15-1356-24-134
+always undialekt 256-145-24-25-15-13-2345
+always undicht 256-145-3456-2345
+prfword undichte 256-145-3456-236
+always undichtest 256-145-3456-236-23456
+always undifferenzier 256-145-24-124-124-12456-14-1356-346-1235
+sufword undin 256-145-35
+always unding 256-145-35-1245
+prfword undinge 256-145-35-12346
+always undiplomatisch 256-145-24-1234-123-135-134-1-2345-24-156
+begmidword undiszi 256-145-24-234-1356-24
+always undogmatisch 256-145-135-1245-134-1-2345-24-156
+begmidword undokumentier 256-145-135-13-136-134-14-2345-346-1235
+begmidword undotier 256-145-135-2345-346-1235
+always undramatisch 256-145-1235-1-134-1-2345-24-156
+always undulier 256-145-136-123-346-1235
+always unduldsam 256-145-136-123-145-2346
+always undurch 256-2-1456
+always undynamisch 256-145-6-13456-1345-1-134-24-156
+always bund 12-256-145
+always secund 234-15-6-14-256-145
+begmidword redundan 1235-15-145-256-145-235
+always redundantwort 1235-15-145-2-136-235-2345-2456-26-2345
+always dundee 145-256-145-15-15
+always fund 124-256-145
+always fünfund 124-1256-1345-124-2-136
+sufword gund 1245-256-145
+sufword gunda 1245-256-145-1
+sufword gunde 1245-256-145-15
+always gundel 1245-256-145-13456
+always gunder 1245-256-145-12456
+always gundula 1245-256-145-136-123-1
+begmidword segund 234-15-1245-256-145
+always kunigund 13-256-24-1245-256-145
+always burgund 12-136-1235-1245-256-145
+always hund 125-256-145
+always schund 156-256-145
+always kund 13-256-145
+always lund 123-256-145
+always kalundborg 13-25-256-145-12-26-1245
+always alundum 25-256-145-136-134
+always mund 134-256-145
+always immund 24-1346-256-145
+always bound 12-135-136-1345-145
+always found 124-135-136-1345-145
+sufword mound 134-135-136-1345-145
+sufword pound 1234-135-136-1345-145
+always round 1235-135-136-1345-145
+always around 356-135-136-1345-145
+always sound 234-135-136-1345-145
+always spund 234-1234-256-145
+always rund 1235-256-145
+always korund 13-26-256-145
+always vierund 1236-346-1235-2-136
+always sund 234-256-145
+midendword esund 15-234-256-145
+always sechsund 234-15-1456-234-2-136
+always stund 23456-256-145
+always tund 2345-256-145
+always tundurch 2345-256-2-1456
+begword achtund 1-1456-2345-2-136
+midendword achtund 56-2345-2-136
+always kattun 13-1-2345-2345-256
+always wund 2456-256-145
+begword yund 6-13456-256-145
+always hyundai 125-6-13456-256-145-1-24
+
+# -UNG    4.2.1 a) Nachsilbenkürzungen
+midendword ung 136
+midendword ungs 136-234
+midword ungsauf 136-234-2-16
+midendword ungstell 136-2-13456
+begmidword ungeach 256-12346-56
+always ungebunden 256-12346-12-256-145-14
+always ungeheuer 256-12346-125-126-12456
+always ungenau 256-12346-1345-16
+always ungetüm 256-12346-2345-1256-134
+always ungezogen 256-12346-1356-135-1245-14
+always ungleich 256-1245-1456
+always unglimpf 256-1245-123-24-134-1234-124
+always ungültig 256-1245-1256-123-2345-45
+begmidword braung 12-1235-16-1345-1245
+begmidword braunge 12-1235-16-1345-12346
+always braungelb 12-1235-16-1345-1245-13456-12
+always bungalow 12-256-1245-25-135-2456
+always bungee 12-256-1245-15-15
+sufword dung 145-256-1245
+always bedungen 23-145-256-1245-14
+always pferdedung 1234-124-12456-145-15-145-256-1245
+always gedungen 12346-145-256-1245-14
+always schweinedung 156-2456-1246-15-145-256-1245
+always schafdung 156-1-124-145-256-1245
+always kuhdung 13-136-125-145-256-1245
+always viehdung 1236-346-125-145-256-1245
+always kameldung 13-1-134-13456-145-256-1245
+always stalldung 23456-1-12345-145-256-1245
+always ziegendung 1356-346-1245-14-145-256-1245
+always elefantendung 13456-15-124-235-2345-14-145-256-1245
+sufword verdungen 36-145-256-1245-14
+always verdungen 1236-12456-145-256-1245-14
+always fungier 124-256-1245-346-1235
+always fungizid 124-256-1245-24-1356-24-145
+syllable hunger 125-256-1245-12456
+syllable hungrig 125-256-1245-1235-45
+syllable hungry 125-256-1245-1235-6-13456
+always dschungel 145-156-256-1245-13456
+always jung 245-256-1245
+prfword junge 245-256-12346
+always jungem 245-256-1245-12356
+always jungen 245-256-1245-14
+always junger 245-256-1245-12456
+always junges 245-256-1245-123456
+always jungfer 245-256-1245-124-12456
+prfword jungs 245-256-1245-234
+sufword kung 13-256-1245
+always kungel 13-256-1245-13456
+prfword lunge 123-256-12346
+sufword lungen 123-256-1245-14
+always lungenmaschin 123-256-1245-14-134-156
+always lunger 123-256-1245-12456
+begmidword staublun 23456-16-12-123-256
+always nibelung 1345-24-12-13456-256-1245
+prfword nibelunge 1345-24-12-13456-256-12346
+always gelungen 12346-123-256-1245-14
+always schlungen 156-123-256-1245-14
+always geschlungen 12346-156-123-256-1245-14
+word exilungar 1346-24-123-256-1245-1-1235
+begword exilungar 1346-24-123-256-1245-356
+midword exilungar 15-6-1346-24-123-256-1245-356
+endword exilungar 15-6-1346-24-123-256-1245-1-1235
+always geklungen 12346-13-123-256-1245-14
+always erklungen 12456-13-123-256-1245-14
+sufword verklungen 36-13-123-256-1245-14
+begmidword taucherlun 2345-16-1456-12456-123-256
+always misslungen 134-24-2346-123-256-1245-14
+begword mung 134-256-1245
+always immun 24-1346-256
+always immung 24-1346-136
+prfword lounge 123-135-136-1345-12346
+prfword lounges 123-135-136-1345-1245-123456
+always young 6-13456-135-136-1345-1245
+always pungier 1234-256-1245-346-1235
+prfword runge 1235-256-12346
+always rungentasch 1235-256-1245-14-2345-1-156
+always rungenwagen 1235-256-1245-14-2456-1-1245-14
+always drungen 145-1235-256-1245-14
+always gerungen 12346-1235-256-1245-14
+always steigerungen 23456-146-1245-12456-136-14
+word verengerungen 36-14-1245-12456-136-14
+midendword verengerungen 1236-12456-14-1245-12456-136-14
+always sprung 234-1234-1235-256-1245
+always errungen 12456-1235-256-1245-14
+always zerrungen 1356-12456-1235-136-14
+always sperrungen 234-1234-12456-1235-136-14
+sufword entrungen 2346-1235-256-1245-14
+always entrungen 14-2345-1235-256-1245-14
+always wrungen 2456-1235-256-1245-14
+sufword sung 234-256-1245
+always besungen 23-234-256-1245-14
+always gesungen 12346-234-256-1245-14
+always samsung 234-1-134-234-256-1245
+begword tungst 2345-256-1245-23456
+always zuungunsten 2-1356-256-1245-256-23456-14
+always schwung 156-2456-256-1245
+always geschwung 12346-156-2456-256-1245
+always zwungen 1356-2456-256-1245-14
+prfword zunge 1356-256-12346
+always zung 1356-136
+sufword zungen 1356-256-1245-14
+always landzungen 123-235-145-1356-256-1245-14
+always pferdzungen 1234-124-12456-145-1356-256-1245-14
+endword dezungen 145-15-1356-256-1245-14
+always seezungen 234-15-15-1356-256-1245-14
+always betonzungen 23-2345-135-1345-1356-256-1245-14
+always flammenzungen 124-123-1-1346-14-1356-256-1245-14
+always ochsenzungen 135-1456-234-14-1356-256-1245-14
+always lästerzungen 123-345-23456-12456-1356-256-1245-14
+midendword erzungen 12456-1356-256-1245-14
+midendword sabberzungen 234-1-12-12-12456-1356-256-1245-14
+always unterzungen 2-256-1356-256-1245-14
+midendword eszungen 123456-1356-256-1245-14
+midendword sszungen 2346-1356-256-1245-14
+midendword szungen 234-1356-256-1245-14
+always kreuzunglücklich 13-1235-126-1356-256-1245-46-456
+midword zungs 1356-136-234
+
+# UNTER (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word unter 256
+always unter-\s 2-256-36-0
+always unter 2-256
+always gelaunter 12346-123-16-1345-2345-12456
+always geraunter 12346-1235-16-1345-2345-12456
+always bräunter 12-1235-34-1345-2345-12456
+always staunter 23456-16-1345-2345-12456
+always zäunter 1356-34-1345-2345-12456
+always bunter 12-256-2345-12456
+always siebunter 234-346-12-2-256
+always schreibunter 156-12-2-256
+begmidword farbunter 124-356-12-2-256
+always erbuntertänig 12456-12-2-256-2345-345-1345-45
+always subunter 234-136-12-2-256
+always neunter 1345-126-1345-2345-12456
+always routineunter 1235-135-136-2345-35-15-2-256
+sufword gunter 1245-256-2345-12456
+always hunter 125-256-2345-12456
+always schuhunter 156-136-125-2-256
+always kunterbun 13-256-2345-12456-12-256
+always munter 134-256-2345-12456
+always islamunter 24-234-123-1-134-2-256
+always systemunter 234-6-13456-23456-12356-2-256
+always heimunter 125-146-134-2-256
+always geheimunter 12346-125-146-134-2-256
+always filmunter 124-24-123-134-2-256
+begword programmunter 12345-1245-1235-1-1346-2-256
+midword programmunter 1234-1235-135-1245-1235-1-1346-2-256
+always schwimmunter 156-2456-24-1346-2-256
+always stromunter 23456-1235-135-134-2-256
+always atomunter 1-2345-135-134-2-256
+always schirmunter 156-24-1235-134-2-256
+always counter 6-14-135-136-1345-2345-12456
+after z midendword unter 2-256
+always zunter 1356-2-256
+
+# VER- (4.2.1 Vorsilbenkürzungen)
+begword ver 36
+always -ver 36-1236-12456
+always -verhältnis 36-1236-125
+word vera 1236-12456-1
+sufword veracruz 1236-12456-1-6-14-1235-136-1356
+sufword veranda 1236-12456-235-145-1
+sufword veranden 1236-12456-235-145-14
+word veras 1236-12456-1-234
+word verb 1236-12456-12
+word verba 1236-12456-12-1
+word verbal 1236-12456-12-1-123
+begword verbal 1236-12456-12-25
+begword verball 36-12-1-12345
+sufword verbatim 1236-12456-12-1-2345-24-134
+word verben 1236-12456-12-14
+begword verbf 1236-12456-12-124
+begword verbg 1236-12456-12-1245
+word verbis 1236-12456-12-24-234
+begword verbk 1236-12456-12-13
+begword verbm 1236-12456-12-134
+word verbs 1236-12456-12-234
+begword verbstell 1236-12456-12-2-13456
+word verbum 1236-12456-12-136-134
+word verbums 1236-12456-12-136-134-234
+begword verbw 1236-12456-12-2456
+begword verbwieder 1236-12456-12-346-145
+sufword verbzusatz 1236-12456-12-2-1356-234-1356
+begword verbzusätz 1236-12456-12-2-1356-5-234-1356
+sufword vercingetorix 1236-12456-6-14-35-12346-2345-26-24-6-1346
+word verdi 1236-12456-145-24
+sufword verdikt 1236-12456-145-24-13-2345
+word verdikte 1236-12456-145-24-13-236
+word verdis 1236-12456-145-24-234
+word verdun 1236-12456-145-256
+word verduns 1236-12456-145-256-234
+sufword verena 1236-12456-14-1
+sufword vergil 1236-12456-1245-24-123
+sufword vergilb 36-1245-24-123-12
+sufword vergilt 36-1245-24-123-2345
+word vergine 1236-12456-1245-35-15
+sufword verifikation 1236-12456-24-124-24-13-5-1345
+sufword verifizier 1236-12456-24-124-24-1356-346-1235
+sufword verita 1236-12456-24-2345-1
+sufword verlain 1236-12456-123-1-24-1345
+sufword vermeer 1236-12456-134-15-15-1235
+sufword vermont 1236-12456-134-135-1345-2345
+begword veron 1236-12456-135-1345
+word vers 1236-12456-234
+word versace 1236-12456-234-1-6-14-15
+word versaces 1236-12456-234-1-6-14-123456
+begword versaill 1236-12456-234-1-24-12345
+word versal 1236-12456-234-1-123
+begword versal 1236-12456-234-25
+begword versalz 36-234-25-1356
+always versanf 1236-12456-234-235-124
+always versart 1236-12456-234-356-2345
+begword versb 1236-12456-234-12
+begword versd 1236-12456-234-145
+word verse 1236-12456-234-15
+begword versemach 1236-12456-234-15-134-56
+word versen 1236-12456-234-14
+word versepos 1236-12456-234-15-1234-135-234
+word versepen 1236-12456-234-15-1234-14
+begword verserzähl 1236-12456-234-12456-5-1356-123
+word verses 1236-12456-234-123456
+sufword verseschmied 1236-12456-234-15-156-134-346-145
+begword versf 1236-12456-234-124
+begword versier 1236-12456-234-346-1235
+sufword version 1236-12456-234-245
+begword versläng 1236-12456-234-5-123-1245
+begword verslehr 1236-12456-234-123-2356-1235
+begword versk 1236-12456-234-13
+sufword versklav 36-234-13-123-1-1236
+begword verskomödi 1236-12456-234-13-135-134-246-145-24
+begword versm 1236-12456-234-134
+begword versn 1236-12456-234-1345
+begword versniff 36-234-1345-24-124-124
+begword versnob 36-234-1345-135-12
+sufword verspaar 1236-12456-234-1234-1-1-1235
+word versroman 1236-12456-234-1235-135-134-1-1345
+begword versroman 1236-12456-234-1235-135-134-235
+sufword versspiel 1236-12456-234-2-346
+word versus 1236-12456-234-136-234
+always vertebrat 1236-12456-236-12-1235-1-2345
+always vertigo 1236-12456-2345-24-1245-135
+word vertikal 1236-12456-2345-24-13-1-123
+begword vertikal 1236-12456-2345-24-13-25
+word verum 1236-12456-136-134
+word verve 1236-12456-1236-15
+
+# VERHÄLTNIS (4.4 Zweiformige Kürzungen)
+always verhältnis 1236-125
+
+# VIEL (4.4 Zweiformige Kürzungen)
+always viel 1236-123
+
+# VIELLEICHT (4.4 Zweiformige Kürzungen)
+always vielleicht 1236-2345
+
+# VOLK VÖLK (4.4 Zweiformige Kürzungen)
+always volk 1236-13
+always völk 5-1236-13
+word volker 1236-135-123-13-12456
+word volkers 1236-135-123-13-12456-234
+always volketswil 1236-135-123-13-15-2345-234-2456-24-123
+sufword volkhard 1236-135-123-13-125-356-145
+sufword volkmann 1236-135-123-13-134-235-1345
+word volkmar 1236-135-123-13-134-1-1235
+word volkmars 1236-135-123-13-134-356-234
+
+# VOLL (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word voll 12345
+always voll-\s 2-12345-36-0
+always voll 2-12345
+always völl 5-12345
+always volley 1236-135-12345-15-6-13456
+
+# VOM (4.4 Zweiformige Kürzungen)
+always vom 1236-134
+word servomotor 234-12456-1236-135-134-135-2345-135-1235
+begword servomotor 234-12456-1236-135-134-135-2345-26
+always ovomalt 135-1236-135-134-25-2345
+
+# VON (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word von 1236
+always von-\s 2-1236-36-0
+always von 2-1236
+sufword avon 1-1236-135-1345
+sufword savona 234-1-1236-135-1345-1
+sufword devon 145-15-1236-135-1345
+syllable yvonn 6-13456-1236-135-1345-1345
+
+# VOR (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word vor 26
+always vor-\s 2-26-36-0
+always vor 2-26
+always voraus 2-26-16-234
+always favorisier 124-1-1236-26-24-234-346-1235
+always favorit 124-1-1236-26-24-2345
+word flavor 124-123-1-1236-135-1235
+always flavor 124-123-1-1236-26
+always bravoruf 12-1235-1-1236-135-1235-136-124
+always ivorer 24-1236-26-12456
+always ivory 24-1236-26-6-13456
+begmidword herbivor 125-12456-12-24-1236-26
+begword livorn 123-24-1236-26-1345
+begword omnivor 135-134-1345-24-1236-26
+begword karnivor 13-356-1345-24-1236-26
+midword tivor 2345-24-1236-26
+always yvorn 6-13456-1236-26-1345
+
+# WAHR WÄHR (4.4 Zweiformige Kürzungen)
+always wahr 2456-125
+always währ 5-2456-125
+
+# WÄHREND (4.4 Zweiformige Kürzungen)
+always während 345-145
+
+# WAR WÄR (4.3.3 Einformige Kürzungen, alleinstehend oder am Wortanfang)
+word war 356
+word wär 5-356
+word ware 356-15
+word wäre 5-356-15
+sufword waren 356-14
+word wären 5-356-14
+word wärest 5-356-15-23456
+word wäret 5-356-15-2345
+word warst 356-23456
+word wärst 5-356-23456
+word wärt 5-356-2345
+word are 1-1235-15
+word aren 1-1235-14
+
+# -WÄRTS  4.2.1 a) Nachsilbenkürzungen
+midendword wärts 2456
+
+# WAS   (4.3.1 Einformige Wortkürzungen, nur alleinstehend)
+word was 2456
+
+# WEG (4.4 Zweiformige Kürzungen)
+always weg 2456-1245
+word wega 2456-15-1245-1
+word wegas 2456-15-1245-1-234
+before h midword wege 2456-1245-15
+prfword weggen 2456-15-1245-1245-14
+prfword weggens 2456-15-1245-1245-14-234
+always schwegler 156-2456-15-1245-123-12456
+always nimwegen 1345-24-134-2456-15-1245-14
+always norwegen 1345-26-2456-15-1245-14
+always norweger 1345-26-2456-15-1245-12456
+always norwegisch 1345-26-2456-15-1245-24-156
+always wegerich 2456-15-1245-12456-3456
+
+# WEIT (4.4 Zweiformige Kürzungen)
+always weit 2456-2345
+always schweitzer 156-2456-146-2345-1356-12456
+always zweit 1356-2456-146-2345
+always reizweiter 1235-146-1356-2456-2345-12456
+always schweizweit 156-2456-146-1356-2456-2345
+prfword zweite 1356-2456-146-236
+always zweitemal 1356-2456-146-236-134
+
+# WENIG (4.4 Zweiformige Kürzungen)
+always wenig 2456-45
+
+# WENN (4.4 Zweiformige Kürzungen)
+always wenn 2456-1345
+sufword wenner 2456-14-1345-12456
+always schwenning 156-2456-14-1345-35-1245
+always löwen 123-246-2456-14
+
+# WESENTLICH (4.4 Zweiformige Kürzungen)
+always wesentlich 2456-456
+
+# WEIS (4.3.6 Kommakürzungen)
+always weis 2-146
+always weisel 2456-146-234-13456
+always budweiser 12-136-145-2456-146-234-12456
+always zweisait 1356-2456-146-234-1-24-2345
+always zweisam 1356-2456-146-2346
+always zweiseit 1356-2456-146-234-146-2345
+always zweisemest 1356-2456-146-234-12356-15-23456
+always zweisilb 1356-2456-146-234-24-123-12
+always zweisch 1356-2456-146-156
+begmidword zweisimm 1356-2456-146-234-24-1346
+always zweisitz 1356-2456-146-2-24
+always zweisprach 1356-2456-146-234-1234
+always zweisp 1356-2456-146-234-1234
+begmidword zweist 1356-2456-146-23456
+prfword zweist 1356-2456-146-23456
+always zweistand 1356-2456-146-2-23456
+always zweiständ 1356-2456-146-5-23456
+always zweistell 1356-2456-146-2-13456
+always zweistund 1356-2456-146-23456-256-145
+sufword entzwei 2346-1356-2456-146
+always entzwei 14-2345-1356-2456-146
+
+# WELCH (4.3.4 Einformige Kürzungen, alleinstehend, mit Endungen oder in Wortverbindungen)
+always welch 13456
+
+# WERD (4.3.6 Kommakürzungen)
+always werd 2-2456
+word werder 2456-12456-145-12456
+word werdern 2456-12456-145-12456-1345
+word werders 2456-12456-145-12456-234
+begword schwerd 156-2456-12456-145
+syllable beschwerd 23-156-2456-12456-145
+always friedrichswerder 124-1235-346-145-1235-3456-234-2456-12456-145-12456
+always hoyerswerda 125-135-6-13456-12456-234-2456-12456-145-1
+
+# WIE (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word wie 126
+word wie's 126-6-234
+always wieso 2-126-2-1234
+always wieviel 2-126-1236-123
+always wieweit 2-126-2456-2345
+always wiewohl 2-126-2456-123
+always irgendwie 24-1245-2-126
+always gleichwie 1245-1456-2-126
+always inwiefern 35-2-126-124-12456-1345
+always sowie 2-1234-2-126
+always sowieso 2-1234-2-126-2-1234
+always anderswie 2-12456-234-2-126
+always sonstwie 234-135-1345-23456-2-126
+
+# WIEDER (4.4 Zweiformige Kürzungen)
+always wieder 346-145
+
+# WILL (4.4 Zweiformige Kürzungen)
+always will 2456-12345
+always willard 2456-24-12345-356-145
+always willebrand 2456-24-12345-15-12-1235-235-145
+sufword willem 2456-24-12345-12356
+word willi 2456-24-12345-24
+always william 2456-24-12345-24-1-134
+always willibald 2456-24-12345-24-12-25-145
+sufword willie 2456-24-12345-346
+word willis 2456-24-12345-24-234
+word willy 2456-24-12345-6-13456
+word willys 2456-24-12345-6-13456-234
+always goodwill 1245-135-135-145-2456-24-12345
+always schwill 156-2456-24-12345
+begword swill 234-2456-24-12345
+word zwille 1356-2456-24-12345-15
+word zwillen 1356-2456-24-12345-14
+always zwillich 1356-2456-24-12345-3456
+prfword zwillinge 1356-2456-24-12345-35-12346
+always zwilling 1356-2456-24-12345-35-1245
+
+# WIR (4.4 Zweiformige Kürzungen)
+word wir 2456-1235
+word wir's 2456-1235-6-234
+
+# WIRD (4.4 Zweiformige Kürzungen)
+always wird 2456-145
+
+# WIRK (4.4 Zweiformige Kürzungen)
+always wirk 2456-13
+
+# WIRST (4.4 Zweiformige Kürzungen)
+always wirst 2456-23456
+
+# WIRTSCHAFT (4.4 Zweiformige Kürzungen)
+always wirtschaft 2456-156
+always wirtschafts 2456-156-234
+
+# WISS (4.4 Zweiformige Kürzungen)
+always wiss 2456-2346
+# Alte Rechtschreibung
+always wiß 2456-2346
+sufword swiss 234-2456-24-2346
+
+# WOHL (4.4 Zweiformige Kürzungen)
+always wohl 2456-123
+sufword rowohlt 1235-135-2456-135-125-123-2345
+sufword grotewohl 1245-1235-135-236-2456-135-125-123
+
+# WOLL WÖLL (4.3.6 Kommakürzungen)
+always woll 2-135
+always wöll 5-135
+begmidword wollespinn 2-135-15-234-1234-35-1345
+always wollust 2456-135-123-123-136-23456
+always wollüst 2456-135-123-123-1256-23456
+always schwoll 156-2456-135-12345
+begmidword geschwoll 12346-156-2456-135-12345
+always schwöll 156-2456-246-12345
+begword zwoll 1356-2456-135-12345
+
+# WORDEN (4.4 Zweiformige Kürzungen)
+always worden 135-14
+
+# WURD (4.3.5 Einformige Kürzungen, nur mit Erweiterung)
+word wurd 2456-136-1235-145
+begword wurd 136
+begword innewurd 35-1345-15-136
+
+# WÜRD (4.3.5 Einformige Kürzungen, nur mit Erweiterung)
+word würd 2456-1256-1235-145
+always würd 1256
+always würd's 1256-6-234
+always würdig 2456-1256-1235-145-45
+
+# X   (4.1 Lautgruppenkürzungen)
+word x 6-1346
+always x 6-1346
+# Grossgeschriebene Wortanfänge erhalten sonst keinen Pt.6!
+noback context ["X"]$u @6-1346
+
+# Y   (4.1 Lautgruppenkürzungen)
+word y 6-13456
+always y 6-13456
+# Grossgeschriebene Wortanfänge erhalten sonst keinen Pt.6!
+noback context ["Y"]$u @6-13456
+
+# ZAHL ZÄHL (4.4 Zweiformige Kürzungen)
+always zahl 1356-123
+always zähl 5-1356-123
+always zählebig 1356-345-125-123-12-45
+always rübezahl 1235-1256-23-1356-1-125-123
+
+# ZEIT (4.4 Zweiformige Kürzungen)
+always zeit 1356-2345
+word zeiter 1356-146-2345-12456
+word zeiters 1356-146-2345-12456-234
+sufword prophezei 12345-1234-125-15-1356-146
+midendword prophezei 1234-1235-135-1234-125-15-1356-146
+
+# ZU (4.3.2 Einformige Kürzungen, alleinstehend oder in Wortverbindungen)
+word zu 1356
+always zu-\s 2-1356-36-0
+always zu 2-1356
+prfword zuber 1356-136-12-12456
+sufword zuberbühler 1356-136-12-12456-12-1256-125-123-12456
+prfword zubers 1356-136-12-12456-234
+always azubi 1-1356-136-12-24
+always zucc 1356-136-6-14-6-14
+always zucch 1356-136-6-14-1456
+always zucht 1356-136-1456-2345
+always zuck 1356-136-46
+begmidword venezuel 1236-14-15-1356-136-13456
+always salzuflen 234-25-1356-136-124-123-14
+prfword zug 1356-136-1245
+begmidword zugb 1356-136-1245-12
+always zugrabauk 1356-136-1245-1235-1-12-16-13
+begmidword zugreinig 1356-136-1245-1235-1246-45
+begmidword herumzu 125-12456-136-134-2-1356
+begmidword herumzupf 125-12456-136-134-1356-136-1234-124
+always anzugärmel 235-1356-136-1245-345-1235-134-13456
+always eilzug 146-123-1356-136-1245
+always sattelzug 234-1-2345-2345-13456-1356-136-1245
+always bevorzug 23-2-26-1356-136-1245
+prfword bevorzuge 23-2-26-1356-136-12346
+before s begmidword zugs 1356-136-1245-234
+begmidword zugaukel 2-1356-1245-16-13-13456
+begmidword zugeb 2-1356-12346-12
+begmidword zugebet 2-1356-12346-23-2345
+# HOMONYM
+begmidword zugreif 2-1356-1245-1235-146-124
+prfword zugst 1356-136-1245-23456
+always zugabteil 1356-136-1245-1-12-2345-146-123
+always zugabfahr 1356-136-1245-1-12-2-1235
+always zuganschluss 1356-136-1245-235-156-123-136-2346
+always zuganschlüss 1356-136-1245-235-156-123-1256-2346
+begmidword zugbalk 1356-136-1245-12-25-13
+always zugband 1356-136-1245-12-235-145
+begmidword zugbänd 1356-136-1245-12-345-1345-145
+begmidword zugbr 1356-136-1245-12-1235
+always zugbügel 1356-136-1245-12-1256-1245-13456
+begmidword zugbe 1356-136-1245-23
+before d begmidword zug 1356-136-1245
+prfword zuge 1356-136-12346
+begmidword zuge 2-1356-12346
+always zugebunden 2-1356-12346-12-256-145-14
+always zugegen 2-1356-2-1245
+begmidword zugeh 2-1356-1245-2356
+begmidword zugehab 2-1356-12346-2-125
+begmidword zugehak 2-1356-12346-125-1-13
+always zugehalten 2-1356-12346-125-25-2345-14
+begmidword zugehämmer 2-1356-12346-125-345-1346-12456
+begmidword zugehäng 2-1356-12346-125-345-1345-1245
+begmidword zugehef 2-1356-12346-125-15-124
+begmidword zugeheil 2-1356-12346-125-146-123
+begmidword zugehopp 2-1356-12346-125-135-1234-1234
+always zugehör 2-1356-12346-125-246-1235
+begmidword zugehump 2-1356-12346-125-136-134-1234
+begmidword zugent 1356-136-1245-14-2345
+always lastzug 123-1-23456-1356-136-1245
+begmidword zugemal 2-1356-12346-134-25
+prfword zugehe 2-1356-1245-2356-15
+prfword zugehen 2-1356-1245-2356-14
+always zugehend 2-1356-1245-2356-14-145
+prfword zugeher 2-1356-1245-2356-12456
+always zugehfrau 2-1356-1245-2356-124-1235-16
+prfword zugehst 2-1356-1245-2356-23456
+prfword zugeht 2-1356-1245-2356-2345
+prfword zugeinricht 1356-136-1245-1246-2-3456
+prfword zuger 1356-136-1245-12456
+sufword zugerin 1356-136-1245-12456-35
+always zugerland 1356-136-1245-12456-123-235-145
+begmidword zugerländ 1356-136-1245-12456-123-345-1345-145
+always zugersee 1356-136-1245-12456-234-15-15
+prfword zuges 1356-136-1245-123456
+before f begmidword zug 1356-136-1245
+before g begmidword zug 1356-136-1245
+before h begmidword zug 1356-136-1245
+before j begmidword zug 1356-136-1245
+always zugig 1356-136-1245-45
+before k begmidword zug 1356-136-1245
+always zugkräft 1356-136-1245-5-13-124
+always zuglang 1356-136-1245-123-1245
+always zugläng 1356-136-1245-5-123-1245
+always zuglast 1356-136-1245-123-1-23456
+always zuglein 1356-136-1245-123-1246
+always zugloch 1356-136-1245-123-135-1456
+always zuglöch 1356-136-1245-123-246-1456
+always zugluft 1356-136-1245-123-136-124-2345
+before m begmidword zug 1356-136-1245
+before n begmidword zug 1356-136-1245
+always zugober 1356-136-1245-135-12-12456
+always zugochs 1356-136-1245-135-1456-234
+always zugraub 1356-136-1245-1235-16-12
+always zugräub 1356-136-1245-1235-34-12
+always zugrecht 1356-136-1245-1235-2345
+always zugreis 1356-136-1245-1235-146-234
+begmidword zugrestaur 1356-136-1245-1235-15-23456-16-1235
+always zugroll 1356-136-1245-1235-135-12345
+before s begmidword zug 1356-136-1245
+before s begmidword zugs 1356-136-1245-234
+before t begmidword zug 1356-136-1245
+always bezug 23-1356-136-1245
+always zugüber 1356-136-1245-2-1256
+always zugunglück 1356-136-1245-256-1245-46
+before kpvw begmidword zug 1356-136-1245
+before z begmidword zug 1356-136-1245
+
+after z midendword uhr 136-125-1235
+always zuhr 1356-136-125-1235
+always zuider 1356-136-24-145-12456
+always suzuki 234-136-1356-136-13-24
+always lapislazuli 123-1-1234-24-234-123-1-1356-136-123-24
+always zull 1356-136-12345
+always zulp 1356-136-123-1234
+always zulu 1356-136-123-136
+begmidword abzuluchs 1-12-2-1356-123-136-1456-234
+begmidword abzulutsch 1-12-2-1356-123-136-2345-156
+always zuluft 2-1356-123-136-124-2345
+always zulugen 2-1356-123-136-1245-14
+begmidword pelzum 1234-13456-1356-136-134
+midendword zunabhängig 1356-256-1-12-125-345-1345-1245-45
+always zunder 1356-256-145-12456
+begmidword schmerzun 156-134-12456-1356-256
+always zunft 1356-256-124-2345
+# siehe -ung           zunge
+# siehe -ung           zungen
+always münzunion 134-1256-1345-1356-256-24-135-1345
+always zupf 1356-136-1234-124
+begmidword zupfeif 2-1356-1234-124-146-124
+begmidword zupferch 2-1356-1234-124-12456-1456
+begmidword zupflanz 2-1356-1234-124-123-235-1356
+begmidword zupflüg 2-1356-1234-124-123-1256-1245
+prfword zupflüge 2-1356-1234-124-123-1256-12346
+begmidword zupfropf 2-1356-1234-124-1235-135-1234-124
+begmidword putzutensi 1234-136-2345-1356-136-2345-14-234-24
+always zutsch 1356-136-2345-156
+always zuzel 1356-136-1356-13456
+always frequenz 124-1235-15-6-12345-136-14-1356
+
+# ZUM (4.4 Zweiformige Kürzungen)
+word zum 1356-134
+always zumal 2-1356-134
+word kurzum 13-1356-136-134
+begmidword lizenzum 123-24-1356-14-1356-136-134
+begmidword blitzum 12-123-24-2345-1356-136-134
+begmidword schutzum 156-136-2345-1356-136-134
+
+# ZUNÄCHST (4.4 Zweiformige Kürzungen)
+always zunächst 1356-1345
+
+# ZUR (4.4 Zweiformige Kürzungen)
+word zur 1356-1235
+always zurecht 2-1356-1235-2345
+always zurr 1356-136-1235-1235
+begmidword zurred 1356-1235-1235-15-145
+begmidword zurruh 1356-1235-1235-136-125
+begmidword zurruhesetz 1356-1235-1235-136-125-15-2-15
+begmidword zurschau 1356-1235-156-16
+begmidword zurver 1356-1235-1236-12456
+word zurzeit 1356-1235-1356-2345
+sufword azur 1-1356-136-1235
+begmidword mazurk 134-1-1356-136-1235-13
+begmidword karenzur 13-356-14-1356-136-1235
+begmidword lizenzur 123-24-1356-14-1356-136-1235
+begmidword kurzur 13-1356-136-1235
+begmidword sturzursach 23456-136-1235-1356-136-1235-234-56
+
+# ZURÜCK (4.4 Zweiformige Kürzungen)
+always zurück 1356-46
+prfword zurücken 2-1