{/if}
+
+
{/if}
diff --git a/static/pyodide/cycler-0.12.1-py3-none-any.whl b/static/pyodide/cycler-0.12.1-py3-none-any.whl
new file mode 100644
index 000000000..eb8cdb753
Binary files /dev/null and b/static/pyodide/cycler-0.12.1-py3-none-any.whl differ
diff --git a/static/pyodide/cycler-0.12.1-py3-none-any.whl.metadata b/static/pyodide/cycler-0.12.1-py3-none-any.whl.metadata
new file mode 100644
index 000000000..e81ab4fa3
--- /dev/null
+++ b/static/pyodide/cycler-0.12.1-py3-none-any.whl.metadata
@@ -0,0 +1,78 @@
+Metadata-Version: 2.1
+Name: cycler
+Version: 0.12.1
+Summary: Composable style cycles
+Author-email: Thomas A Caswell
+License: Copyright (c) 2015, matplotlib project
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ * Neither the name of the matplotlib project nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+Project-URL: homepage, https://matplotlib.org/cycler/
+Project-URL: repository, https://github.com/matplotlib/cycler
+Keywords: cycle kwargs
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Development Status :: 4 - Beta
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3 :: Only
+Requires-Python: >=3.8
+Description-Content-Type: text/x-rst
+License-File: LICENSE
+Provides-Extra: docs
+Requires-Dist: ipython ; extra == 'docs'
+Requires-Dist: matplotlib ; extra == 'docs'
+Requires-Dist: numpydoc ; extra == 'docs'
+Requires-Dist: sphinx ; extra == 'docs'
+Provides-Extra: tests
+Requires-Dist: pytest ; extra == 'tests'
+Requires-Dist: pytest-cov ; extra == 'tests'
+Requires-Dist: pytest-xdist ; extra == 'tests'
+
+|PyPi|_ |Conda|_ |Supported Python versions|_ |GitHub Actions|_ |Codecov|_
+
+.. |PyPi| image:: https://img.shields.io/pypi/v/cycler.svg?style=flat
+.. _PyPi: https://pypi.python.org/pypi/cycler
+
+.. |Conda| image:: https://img.shields.io/conda/v/conda-forge/cycler
+.. _Conda: https://anaconda.org/conda-forge/cycler
+
+.. |Supported Python versions| image:: https://img.shields.io/pypi/pyversions/cycler.svg
+.. _Supported Python versions: https://pypi.python.org/pypi/cycler
+
+.. |GitHub Actions| image:: https://github.com/matplotlib/cycler/actions/workflows/tests.yml/badge.svg
+.. _GitHub Actions: https://github.com/matplotlib/cycler/actions
+
+.. |Codecov| image:: https://codecov.io/github/matplotlib/cycler/badge.svg?branch=main&service=github
+.. _Codecov: https://codecov.io/github/matplotlib/cycler?branch=main
+
+cycler: composable cycles
+=========================
+
+Docs: https://matplotlib.org/cycler/
diff --git a/static/pyodide/fonttools-4.48.1-py3-none-any.whl b/static/pyodide/fonttools-4.48.1-py3-none-any.whl
new file mode 100644
index 000000000..8aacc161d
Binary files /dev/null and b/static/pyodide/fonttools-4.48.1-py3-none-any.whl differ
diff --git a/static/pyodide/fonttools-4.48.1-py3-none-any.whl.metadata b/static/pyodide/fonttools-4.48.1-py3-none-any.whl.metadata
new file mode 100644
index 000000000..b335b936d
--- /dev/null
+++ b/static/pyodide/fonttools-4.48.1-py3-none-any.whl.metadata
@@ -0,0 +1,3237 @@
+Metadata-Version: 2.1
+Name: fonttools
+Version: 4.48.1
+Summary: Tools to manipulate font files
+Home-page: http://github.com/fonttools/fonttools
+Author: Just van Rossum
+Author-email: just@letterror.com
+Maintainer: Behdad Esfahbod
+Maintainer-email: behdad@behdad.org
+License: MIT
+Platform: Any
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Console
+Classifier: Environment :: Other Environment
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: End Users/Desktop
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Natural Language :: English
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Text Processing :: Fonts
+Classifier: Topic :: Multimedia :: Graphics
+Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
+Requires-Python: >=3.8
+License-File: LICENSE
+Provides-Extra: all
+Requires-Dist: fs <3,>=2.2.0 ; extra == 'all'
+Requires-Dist: lxml >=4.0 ; extra == 'all'
+Requires-Dist: zopfli >=0.1.4 ; extra == 'all'
+Requires-Dist: lz4 >=1.7.4.2 ; extra == 'all'
+Requires-Dist: pycairo ; extra == 'all'
+Requires-Dist: matplotlib ; extra == 'all'
+Requires-Dist: sympy ; extra == 'all'
+Requires-Dist: skia-pathops >=0.5.0 ; extra == 'all'
+Requires-Dist: uharfbuzz >=0.23.0 ; extra == 'all'
+Requires-Dist: brotlicffi >=0.8.0 ; (platform_python_implementation != "CPython") and extra == 'all'
+Requires-Dist: scipy ; (platform_python_implementation != "PyPy") and extra == 'all'
+Requires-Dist: brotli >=1.0.1 ; (platform_python_implementation == "CPython") and extra == 'all'
+Requires-Dist: munkres ; (platform_python_implementation == "PyPy") and extra == 'all'
+Requires-Dist: unicodedata2 >=15.1.0 ; (python_version <= "3.12") and extra == 'all'
+Requires-Dist: xattr ; (sys_platform == "darwin") and extra == 'all'
+Provides-Extra: graphite
+Requires-Dist: lz4 >=1.7.4.2 ; extra == 'graphite'
+Provides-Extra: interpolatable
+Requires-Dist: pycairo ; extra == 'interpolatable'
+Requires-Dist: scipy ; (platform_python_implementation != "PyPy") and extra == 'interpolatable'
+Requires-Dist: munkres ; (platform_python_implementation == "PyPy") and extra == 'interpolatable'
+Provides-Extra: lxml
+Requires-Dist: lxml >=4.0 ; extra == 'lxml'
+Provides-Extra: pathops
+Requires-Dist: skia-pathops >=0.5.0 ; extra == 'pathops'
+Provides-Extra: plot
+Requires-Dist: matplotlib ; extra == 'plot'
+Provides-Extra: repacker
+Requires-Dist: uharfbuzz >=0.23.0 ; extra == 'repacker'
+Provides-Extra: symfont
+Requires-Dist: sympy ; extra == 'symfont'
+Provides-Extra: type1
+Requires-Dist: xattr ; (sys_platform == "darwin") and extra == 'type1'
+Provides-Extra: ufo
+Requires-Dist: fs <3,>=2.2.0 ; extra == 'ufo'
+Provides-Extra: unicode
+Requires-Dist: unicodedata2 >=15.1.0 ; (python_version <= "3.12") and extra == 'unicode'
+Provides-Extra: woff
+Requires-Dist: zopfli >=0.1.4 ; extra == 'woff'
+Requires-Dist: brotlicffi >=0.8.0 ; (platform_python_implementation != "CPython") and extra == 'woff'
+Requires-Dist: brotli >=1.0.1 ; (platform_python_implementation == "CPython") and extra == 'woff'
+
+|CI Build Status| |Coverage Status| |PyPI| |Gitter Chat|
+
+What is this?
+~~~~~~~~~~~~~
+
+| fontTools is a library for manipulating fonts, written in Python. The
+ project includes the TTX tool, that can convert TrueType and OpenType
+ fonts to and from an XML text format, which is also called TTX. It
+ supports TrueType, OpenType, AFM and to an extent Type 1 and some
+ Mac-specific formats. The project has an `MIT open-source
+ licence `__.
+| Among other things this means you can use it free of charge.
+
+`User documentation `_ and
+`developer documentation `_
+are available at `Read the Docs `_.
+
+Installation
+~~~~~~~~~~~~
+
+FontTools requires `Python `__ 3.8
+or later. We try to follow the same schedule of minimum Python version support as
+NumPy (see `NEP 29 `__).
+
+The package is listed in the Python Package Index (PyPI), so you can
+install it with `pip `__:
+
+.. code:: sh
+
+ pip install fonttools
+
+If you would like to contribute to its development, you can clone the
+repository from GitHub, install the package in 'editable' mode and
+modify the source code in place. We recommend creating a virtual
+environment, using `virtualenv `__ or
+Python 3 `venv `__ module.
+
+.. code:: sh
+
+ # download the source code to 'fonttools' folder
+ git clone https://github.com/fonttools/fonttools.git
+ cd fonttools
+
+ # create new virtual environment called e.g. 'fonttools-venv', or anything you like
+ python -m virtualenv fonttools-venv
+
+ # source the `activate` shell script to enter the environment (Unix-like); to exit, just type `deactivate`
+ . fonttools-venv/bin/activate
+
+ # to activate the virtual environment in Windows `cmd.exe`, do
+ fonttools-venv\Scripts\activate.bat
+
+ # install in 'editable' mode
+ pip install -e .
+
+Optional Requirements
+---------------------
+
+The ``fontTools`` package currently has no (required) external dependencies
+besides the modules included in the Python Standard Library.
+However, a few extra dependencies are required by some of its modules, which
+are needed to unlock optional features.
+The ``fonttools`` PyPI distribution also supports so-called "extras", i.e. a
+set of keywords that describe a group of additional dependencies, which can be
+used when installing via pip, or when specifying a requirement.
+For example:
+
+.. code:: sh
+
+ pip install fonttools[ufo,lxml,woff,unicode]
+
+This command will install fonttools, as well as the optional dependencies that
+are required to unlock the extra features named "ufo", etc.
+
+- ``Lib/fontTools/misc/etree.py``
+
+ The module exports a ElementTree-like API for reading/writing XML files, and
+ allows to use as the backend either the built-in ``xml.etree`` module or
+ `lxml `__. The latter is preferred whenever present,
+ as it is generally faster and more secure.
+
+ *Extra:* ``lxml``
+
+- ``Lib/fontTools/ufoLib``
+
+ Package for reading and writing UFO source files; it requires:
+
+ * `fs `__: (aka ``pyfilesystem2``) filesystem
+ abstraction layer.
+
+ * `enum34 `__: backport for the built-in ``enum``
+ module (only required on Python < 3.4).
+
+ *Extra:* ``ufo``
+
+- ``Lib/fontTools/ttLib/woff2.py``
+
+ Module to compress/decompress WOFF 2.0 web fonts; it requires:
+
+ * `brotli `__: Python bindings of
+ the Brotli compression library.
+
+ *Extra:* ``woff``
+
+- ``Lib/fontTools/ttLib/sfnt.py``
+
+ To better compress WOFF 1.0 web fonts, the following module can be used
+ instead of the built-in ``zlib`` library:
+
+ * `zopfli `__: Python bindings of
+ the Zopfli compression library.
+
+ *Extra:* ``woff``
+
+- ``Lib/fontTools/unicode.py``
+
+ To display the Unicode character names when dumping the ``cmap`` table
+ with ``ttx`` we use the ``unicodedata`` module in the Standard Library.
+ The version included in there varies between different Python versions.
+ To use the latest available data, you can install:
+
+ * `unicodedata2 `__:
+ ``unicodedata`` backport for Python 3.x updated to the latest Unicode
+ version 15.0.
+
+ *Extra:* ``unicode``
+
+- ``Lib/fontTools/varLib/interpolatable.py``
+
+ Module for finding wrong contour/component order between different masters.
+ It requires one of the following packages in order to solve the so-called
+ "minimum weight perfect matching problem in bipartite graphs", or
+ the Assignment problem:
+
+ * `scipy `__: the Scientific Library
+ for Python, which internally uses `NumPy `__
+ arrays and hence is very fast;
+ * `munkres `__: a pure-Python
+ module that implements the Hungarian or Kuhn-Munkres algorithm.
+
+ To plot the results to a PDF or HTML format, you also need to install:
+
+ * `pycairo `__: Python bindings for the
+ Cairo graphics library. Note that wheels are currently only available for
+ Windows, for other platforms see pycairo's `installation instructions
+ `__.
+
+ *Extra:* ``interpolatable``
+
+- ``Lib/fontTools/varLib/plot.py``
+
+ Module for visualizing DesignSpaceDocument and resulting VariationModel.
+
+ * `matplotlib `__: 2D plotting library.
+
+ *Extra:* ``plot``
+
+- ``Lib/fontTools/misc/symfont.py``
+
+ Advanced module for symbolic font statistics analysis; it requires:
+
+ * `sympy `__: the Python library for
+ symbolic mathematics.
+
+ *Extra:* ``symfont``
+
+- ``Lib/fontTools/t1Lib.py``
+
+ To get the file creator and type of Macintosh PostScript Type 1 fonts
+ on Python 3 you need to install the following module, as the old ``MacOS``
+ module is no longer included in Mac Python:
+
+ * `xattr `__: Python wrapper for
+ extended filesystem attributes (macOS platform only).
+
+ *Extra:* ``type1``
+
+- ``Lib/fontTools/ttLib/removeOverlaps.py``
+
+ Simplify TrueType glyphs by merging overlapping contours and components.
+
+ * `skia-pathops `__: Python
+ bindings for the Skia library's PathOps module, performing boolean
+ operations on paths (union, intersection, etc.).
+
+ *Extra:* ``pathops``
+
+- ``Lib/fontTools/pens/cocoaPen.py`` and ``Lib/fontTools/pens/quartzPen.py``
+
+ Pens for drawing glyphs with Cocoa ``NSBezierPath`` or ``CGPath`` require:
+
+ * `PyObjC `__: the bridge between
+ Python and the Objective-C runtime (macOS platform only).
+
+- ``Lib/fontTools/pens/qtPen.py``
+
+ Pen for drawing glyphs with Qt's ``QPainterPath``, requires:
+
+ * `PyQt5 `__: Python bindings for
+ the Qt cross platform UI and application toolkit.
+
+- ``Lib/fontTools/pens/reportLabPen.py``
+
+ Pen to drawing glyphs as PNG images, requires:
+
+ * `reportlab `__: Python toolkit
+ for generating PDFs and graphics.
+
+- ``Lib/fontTools/pens/freetypePen.py``
+
+ Pen to drawing glyphs with FreeType as raster images, requires:
+
+ * `freetype-py `__: Python binding
+ for the FreeType library.
+
+- ``Lib/fontTools/ttLib/tables/otBase.py``
+
+ Use the Harfbuzz library to serialize GPOS/GSUB using ``hb_repack`` method, requires:
+
+ * `uharfbuzz `__: Streamlined Cython
+ bindings for the harfbuzz shaping engine
+
+ *Extra:* ``repacker``
+
+How to make a new release
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1) Update ``NEWS.rst`` with all the changes since the last release. Write a
+ changelog entry for each PR, with one or two short sentences summarizing it,
+ as well as links to the PR and relevant issues addressed by the PR. Do not
+ put a new title, the next command will do it for you.
+2) Use semantic versioning to decide whether the new release will be a 'major',
+ 'minor' or 'patch' release. It's usually one of the latter two, depending on
+ whether new backward compatible APIs were added, or simply some bugs were fixed.
+3) Run ``python setup.py release`` command from the tip of the ``main`` branch.
+ By default this bumps the third or 'patch' digit only, unless you pass ``--major``
+ or ``--minor`` to bump respectively the first or second digit.
+ This bumps the package version string, extracts the changes since the latest
+ version from ``NEWS.rst``, and uses that text to create an annotated git tag
+ (or a signed git tag if you pass the ``--sign`` option and your git and Github
+ account are configured for `signing commits `__
+ using a GPG key).
+ It also commits an additional version bump which opens the main branch for
+ the subsequent developmental cycle
+4) Push both the tag and commit to the upstream repository, by running the command
+ ``git push --follow-tags``. Note: it may push other local tags as well, be
+ careful.
+5) Let the CI build the wheel and source distribution packages and verify both
+ get uploaded to the Python Package Index (PyPI).
+6) [Optional] Go to fonttools `Github Releases `__
+ page and create a new release, copy-pasting the content of the git tag
+ message. This way, the release notes are nicely formatted as markdown, and
+ users watching the repo will get an email notification. One day we shall
+ automate that too.
+
+
+Acknowledgements
+~~~~~~~~~~~~~~~~
+
+In alphabetical order:
+
+aschmitz, Olivier Berten, Samyak Bhuta, Erik van Blokland, Petr van Blokland,
+Jelle Bosma, Sascha Brawer, Tom Byrer, Antonio Cavedoni, Frédéric Coiffier,
+Vincent Connare, David Corbett, Simon Cozens, Dave Crossland, Simon Daniels,
+Peter Dekkers, Behdad Esfahbod, Behnam Esfahbod, Hannes Famira, Sam Fishman,
+Matt Fontaine, Takaaki Fuji, Rob Hagemans, Yannis Haralambous, Greg Hitchcock,
+Jeremie Hornus, Khaled Hosny, John Hudson, Denis Moyogo Jacquerye, Jack Jansen,
+Tom Kacvinsky, Jens Kutilek, Antoine Leca, Werner Lemberg, Tal Leming, Peter
+Lofting, Cosimo Lupo, Olli Meier, Masaya Nakamura, Dave Opstad, Laurence Penney,
+Roozbeh Pournader, Garret Rieger, Read Roberts, Colin Rofls, Guido van Rossum,
+Just van Rossum, Andreas Seidel, Georg Seifert, Chris Simpkins, Miguel Sousa,
+Adam Twardoch, Adrien Tétar, Vitaly Volkov, Paul Wise.
+
+Copyrights
+~~~~~~~~~~
+
+| Copyright (c) 1999-2004 Just van Rossum, LettError
+ (just@letterror.com)
+| See `LICENSE `__ for the full license.
+
+Copyright (c) 2000 BeOpen.com. All Rights Reserved.
+
+Copyright (c) 1995-2001 Corporation for National Research Initiatives.
+All Rights Reserved.
+
+Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam. All
+Rights Reserved.
+
+Have fun!
+
+.. |CI Build Status| image:: https://github.com/fonttools/fonttools/workflows/Test/badge.svg
+ :target: https://github.com/fonttools/fonttools/actions?query=workflow%3ATest
+.. |Coverage Status| image:: https://codecov.io/gh/fonttools/fonttools/branch/main/graph/badge.svg
+ :target: https://codecov.io/gh/fonttools/fonttools
+.. |PyPI| image:: https://img.shields.io/pypi/v/fonttools.svg
+ :target: https://pypi.org/project/FontTools
+.. |Gitter Chat| image:: https://badges.gitter.im/fonttools-dev/Lobby.svg
+ :alt: Join the chat at https://gitter.im/fonttools-dev/Lobby
+ :target: https://gitter.im/fonttools-dev/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
+
+Changelog
+~~~~~~~~~
+
+4.48.1 (released 2024-02-06)
+----------------------------
+
+- Fixed uploading wheels to PyPI, no code changes since v4.48.0.
+
+4.48.0 (released 2024-02-06)
+----------------------------
+
+- [varLib] Do not log when there are no OTL tables to be merged.
+- [setup.py] Do not restrict lxml<5 any more, tests pass just fine with lxml>=5.
+- [feaLib] Remove glyph and class names length restrictions in FEA (#3424).
+- [roundingPens] Added ``transformRoundFunc`` parameter to the rounding pens to allow
+ for custom rounding of the components' transforms (#3426).
+- [feaLib] Keep declaration order of ligature components within a ligature set, instead
+ of sorting by glyph name (#3429).
+- [feaLib] Fixed ordering of alternates in ``aalt`` lookups, following the declaration
+ order of feature references within the ``aalt`` feature block (#3430).
+- [varLib.instancer] Fixed a bug in the instancer's IUP optimization (#3432).
+- [sbix] Support sbix glyphs with new graphicType "flip" (#3433).
+- [svgPathPen] Added ``--glyphs`` option to dump the SVG paths for the named glyphs
+ in the font (0572f78).
+- [designspaceLib] Added "description" attribute to ```` and ````
+ elements, and allow multiple ```` elements to group ```` elements
+ that are logically related (#3435, #3437).
+- [otlLib] Correctly choose the most compact GSUB contextual lookup format (#3439).
+
+4.47.2 (released 2024-01-11)
+----------------------------
+
+Minor release to fix uploading wheels to PyPI.
+
+4.47.1 (released 2024-01-11)
+----------------------------
+
+- [merge] Improve help message and add standard command line options (#3408)
+- [otlLib] Pass ``ttFont`` to ``name.addName`` in ``buildStatTable`` (#3406)
+- [featureVars] Re-use ``FeatureVariationRecord``'s when possible (#3413)
+
+4.47.0 (released 2023-12-18)
+----------------------------
+
+- [varLib.models] New API for VariationModel: ``getMasterScalars`` and
+ ``interpolateFromValuesAndScalars``.
+- [varLib.interpolatable] Various bugfixes and rendering improvements. In particular,
+ add a Summary page in the front, and an Index and Table-of-Contents in the back.
+ Change the page size to Letter.
+- [Docs/designspaceLib] Defined a new ``public.fontInfo`` lib key, not used anywhere yet (#3358).
+
+4.46.0 (released 2023-12-02)
+----------------------------
+
+- [featureVars] Allow to register the same set of substitution rules to multiple features.
+ The ``addFeatureVariations`` function can now take a list of featureTags; similarly, the
+ lib key 'com.github.fonttools.varLib.featureVarsFeatureTag' can now take a
+ comma-separateed string of feature tags (e.g. "salt,ss01") instead of a single tag (#3360).
+- [featureVars] Don't overwrite GSUB FeatureVariations, but append new records to it
+ for features which are not already there. But raise ``VarLibError`` if the feature tag
+ already has feature variations associated with it (#3363).
+- [varLib] Added ``addGSUBFeatureVariations`` function to add GSUB Feature Variations
+ to an existing variable font from rules defined in a DesignSpace document (#3362).
+- [varLib.interpolatable] Various bugfixes and rendering improvements. In particular,
+ a new test for "underweight" glyphs. The new test reports quite a few false-positives
+ though. Please send feedback.
+
+4.45.1 (released 2023-11-23)
+----------------------------
+
+- [varLib.interpolatable] Various bugfixes and improvements, better reporting, reduced
+ false positives.
+- [ttGlyphSet] Added option to not recalculate glyf bounds (#3348).
+
+4.45.0 (released 2023-11-20)
+----------------------------
+
+- [varLib.interpolatable] Vastly improved algorithms. Also available now is ``--pdf``
+ and ``--html`` options to generate a PDF or HTML report of the interpolation issues.
+ The PDF/HTML report showcases the problematic masters, the interpolated broken
+ glyph, as well as the proposed fixed version.
+
+4.44.3 (released 2023-11-15)
+----------------------------
+
+- [subset] Only prune codepage ranges for OS/2.version >= 1, ignore otherwise (#3334).
+- [instancer] Ensure hhea vertical metrics stay in sync with OS/2 ones after instancing
+ MVAR table containing 'hasc', 'hdsc' or 'hlgp' tags (#3297).
+
+4.44.2 (released 2023-11-14)
+----------------------------
+
+- [glyf] Have ``Glyph.recalcBounds`` skip empty components (base glyph with no contours)
+ when computing the bounding box of composite glyphs. This simply restores the existing
+ behavior before some changes were introduced in fonttools 4.44.0 (#3333).
+
+4.44.1 (released 2023-11-14)
+----------------------------
+
+- [feaLib] Ensure variable mark anchors are deep-copied while building since they
+ get modified in-place and later reused (#3330).
+- [OS/2|subset] Added method to ``recalcCodePageRanges`` to OS/2 table class; added
+ ``--prune-codepage-ranges`` to `fonttools subset` command (#3328, #2607).
+
+4.44.0 (released 2023-11-03)
+----------------------------
+
+- [instancer] Recalc OS/2 AvgCharWidth after instancing if default changes (#3317).
+- [otlLib] Make ClassDefBuilder class order match varLib.merger's, i.e. large
+ classes first, then glyph lexicographic order (#3321, #3324).
+- [instancer] Allow not specifying any of min:default:max values and let be filled
+ up with fvar's values (#3322, #3323).
+- [instancer] When running --update-name-table ignore axes that have no STAT axis
+ values (#3318, #3319).
+- [Debg] When dumping to ttx, write the embedded JSON as multi-line string with
+ indentation (92cbfee0d).
+- [varStore] Handle > 65535 items per encoding by splitting VarData subtable (#3310).
+- [subset] Handle null-offsets in MarkLigPos subtables.
+- [subset] Keep East Asian spacing fatures vhal, halt, chws, vchw by default (#3305).
+- [instancer.solver] Fixed case where axisDef < lower and upper < axisMax (#3304).
+- [glyf] Speed up compilation, mostly around ``recalcBounds`` (#3301).
+- [varLib.interpolatable] Speed it up when working on variable fonts, plus various
+ micro-optimizations (#3300).
+- Require unicodedata2 >= 15.1.0 when installed with 'unicode' extra, contains UCD 15.1.
+
+4.43.1 (released 2023-10-06)
+----------------------------
+
+- [EBDT] Fixed TypeError exception in `_reverseBytes` method triggered when dumping
+ some bitmap fonts with `ttx -z bitwise` option (#3162).
+- [v/hhea] Fixed UnboundLocalError exception in ``recalc`` method when no vmtx or hmtx
+ tables are present (#3290).
+- [bezierTools] Fixed incorrectly typed cython local variable leading to TypeError when
+ calling ``calcQuadraticArcLength`` (#3288).
+- [feaLib/otlLib] Better error message when building Coverage table with missing glyph (#3286).
+
+4.43.0 (released 2023-09-29)
+----------------------------
+
+- [subset] Set up lxml ``XMLParser(resolve_entities=False)`` when parsing OT-SVG documents
+ to prevent XML External Entity (XXE) attacks (9f61271dc):
+ https://codeql.github.com/codeql-query-help/python/py-xxe/
+- [varLib.iup] Added workaround for a Cython bug in ``iup_delta_optimize`` that was
+ leading to IUP tolerance being incorrectly initialised, resulting in sub-optimal deltas
+ (60126435d, cython/cython#5732).
+- [varLib] Added new command-line entry point ``fonttools varLib.avar`` to add an
+ ``avar`` table to an existing VF from axes mappings in a .designspace file (0a3360e52).
+- [instancer] Fixed bug whereby no longer used variation regions were not correctly pruned
+ after VarData optimization (#3268).
+- Added support for Python 3.12 (#3283).
+
+4.42.1 (released 2023-08-20)
+----------------------------
+
+- [t1Lib] Fixed several Type 1 issues (#3238, #3240).
+- [otBase/packer] Allow sharing tables reached by different offset sizes (#3241, #3236).
+- [varLib/merger] Fix Cursive attachment merging error when all anchors are NULL (#3248, #3247).
+- [ttLib] Fixed warning when calling ``addMultilingualName`` and ``ttFont`` parameter was not
+ passed on to ``findMultilingualName`` (#3253).
+
+4.42.0 (released 2023-08-02)
+----------------------------
+
+- [varLib] Use sentinel value 0xFFFF to mark a glyph advance in hmtx/vmtx as non
+ participating, allowing sparse masters to contain glyphs for variation purposes other
+ than {H,V}VAR (#3235).
+- [varLib/cff] Treat empty glyphs in non-default masters as missing, thus not participating
+ in CFF2 delta computation, similarly to how varLib already treats them for gvar (#3234).
+- Added varLib.avarPlanner script to deduce 'correct' avar v1 axis mappings based on
+ glyph average weights (#3223).
+
+4.41.1 (released 2023-07-21)
+----------------------------
+
+- [subset] Fixed perf regression in v4.41.0 by making ``NameRecordVisitor`` only visit
+ tables that do contain nameID references (#3213, #3214).
+- [varLib.instancer] Support instancing fonts containing null ConditionSet offsets in
+ FeatureVariationRecords (#3211, #3212).
+- [statisticsPen] Report font glyph-average weight/width and font-wide slant.
+- [fontBuilder] Fixed head.created date incorrectly set to 0 instead of the current
+ timestamp, regression introduced in v4.40.0 (#3210).
+- [varLib.merger] Support sparse ``CursivePos`` masters (#3209).
+
+4.41.0 (released 2023-07-12)
+----------------------------
+
+- [fontBuilder] Fixed bug in setupOS2 with default panose attribute incorrectly being
+ set to a dict instead of a Panose object (#3201).
+- [name] Added method to ``removeUnusedNameRecords`` in the user range (#3185).
+- [varLib.instancer] Fixed issue with L4 instancing (moving default) (#3179).
+- [cffLib] Use latin1 so we can roundtrip non-ASCII in {Full,Font,Family}Name (#3202).
+- [designspaceLib] Mark as optional in docs (as it is in the code).
+- [glyf-1] Fixed drawPoints() bug whereby last cubic segment becomes quadratic (#3189, #3190).
+- [fontBuilder] Propagate the 'hidden' flag to the fvar Axis instance (#3184).
+- [fontBuilder] Update setupAvar() to also support avar 2, fixing ``_add_avar()`` call
+ site (#3183).
+- Added new ``voltLib.voltToFea`` submodule (originally Tiro Typeworks' "Volto") for
+ converting VOLT OpenType Layout sources to FEA format (#3164).
+
+4.40.0 (released 2023-06-12)
+----------------------------
+
+- Published native binary wheels to PyPI for all the python minor versions and platform
+ and architectures currently supported that would benefit from this. They will include
+ precompiled Cython-accelerated modules (e.g. cu2qu) without requiring to compile them
+ from source. The pure-python wheel and source distribution will continue to be
+ published as always (pip will automatically chose them when no binary wheel is
+ available for the given platform, e.g. pypy). Use ``pip install --no-binary=fonttools fonttools``
+ to expliclity request pip to install from the pure-python source.
+- [designspaceLib|varLib] Add initial support for specifying axis mappings and build
+ ``avar2`` table from those (#3123).
+- [feaLib] Support variable ligature caret position (#3130).
+- [varLib|glyf] Added option to --drop-implied-oncurves; test for impliable oncurve
+ points either before or after rounding (#3146, #3147, #3155, #3156).
+- [TTGlyphPointPen] Don't error with empty contours, simply ignore them (#3145).
+- [sfnt] Fixed str vs bytes remnant of py3 transition in code dealing with de/compiling
+ WOFF metadata (#3129).
+- [instancer-solver] Fixed bug when moving default instance with sparse masters (#3139, #3140).
+- [feaLib] Simplify variable scalars that don’t vary (#3132).
+- [pens] Added filter pen that explicitly emits closing line when lastPt != movePt (#3100).
+- [varStore] Improve optimize algorithm and better document the algorithm (#3124, #3127).
+ Added ``quantization`` option (#3126).
+- Added CI workflow config file for building native binary wheels (#3121).
+- [fontBuilder] Added glyphDataFormat=0 option; raise error when glyphs contain cubic
+ outlines but glyphDataFormat was not explicitly set to 1 (#3113, #3119).
+- [subset] Prune emptied GDEF.MarkGlyphSetsDef and remap indices; ensure GDEF is
+ subsetted before GSUB and GPOS (#3114, #3118).
+- [xmlReader] Fixed issue whereby DSIG table data was incorrectly parsed (#3115, #2614).
+- [varLib/merger] Fixed merging of SinglePos with pos=0 (#3111, #3112).
+- [feaLib] Demote "Feature has not been defined" error to a warning when building aalt
+ and referenced feature is empty (#3110).
+- [feaLib] Dedupe multiple substitutions with classes (#3105).
+
+4.39.4 (released 2023-05-10)
+----------------------------
+
+- [varLib.interpolatable] Allow for sparse masters (#3075)
+- [merge] Handle differing default/nominalWidthX in CFF (#3070)
+- [ttLib] Add missing main.py file to ttLib package (#3088)
+- [ttx] Fix missing composite instructions in XML (#3092)
+- [ttx] Fix split tables option to work on filenames containing '%' (#3096)
+- [featureVars] Process lookups for features other than rvrn last (#3099)
+- [feaLib] support multiple substitution with classes (#3103)
+
+4.39.3 (released 2023-03-28)
+----------------------------
+
+- [sbix] Fixed TypeError when compiling empty glyphs whose imageData is None, regression
+ was introduced in v4.39 (#3059).
+- [ttFont] Fixed AttributeError on python <= 3.10 when opening a TTFont from a tempfile
+ SpooledTemporaryFile, seekable method only added on python 3.11 (#3052).
+
+4.39.2 (released 2023-03-16)
+----------------------------
+
+- [varLib] Fixed regression introduced in 4.39.1 whereby an incomplete 'STAT' table
+ would be built even though a DesignSpace v5 did contain 'STAT' definitions (#3045, #3046).
+
+4.39.1 (released 2023-03-16)
+----------------------------
+
+- [avar2] Added experimental support for reading/writing avar version 2 as specified in
+ this draft proposal: https://github.com/harfbuzz/boring-expansion-spec/blob/main/avar2.md
+- [glifLib] Wrap underlying XML library exceptions with GlifLibError when parsing GLIFs,
+ and also print the name and path of the glyph that fails to be parsed (#3042).
+- [feaLib] Consult avar for normalizing user-space values in ConditionSets and in
+ VariableScalars (#3042, #3043).
+- [ttProgram] Handle string input to Program.fromAssembly() (#3038).
+- [otlLib] Added a config option to emit GPOS 7 lookups, currently disabled by default
+ because of a macOS bug (#3034).
+- [COLRv1] Added method to automatically compute ClipBoxes (#3027).
+- [ttFont] Fixed getGlyphID to raise KeyError on missing glyphs instead of returning
+ None. The regression was introduced in v4.27.0 (#3032).
+- [sbix] Fixed UnboundLocalError: cannot access local variable 'rawdata' (#3031).
+- [varLib] When building VF, do not overwrite a pre-existing ``STAT`` table that was built
+ with feaLib from FEA feature file. Also, added support for building multiple VFs
+ defined in Designspace v5 from ``fonttools varLib`` script (#3024).
+- [mtiLib] Only add ``Debg`` table with lookup names when ``FONTTOOLS_LOOKUP_DEBUGGING``
+ env variable is set (#3023).
+
+4.39.0 (released 2023-03-06)
+----------------------------
+
+- [mtiLib] Optionally add `Debg` debug info for MTI feature builds (#3018).
+- [ttx] Support reading input file from standard input using special `-` character,
+ similar to existing `-o -` option to write output to standard output (#3020).
+- [cython] Prevent ``cython.compiled`` raise AttributeError if cython not installed
+ properly (#3017).
+- [OS/2] Guard against ZeroDivisionError when calculating xAvgCharWidth in the unlikely
+ scenario no glyph has non-zero advance (#3015).
+- [subset] Recompute xAvgCharWidth independently of --no-prune-unicode-ranges,
+ previously the two options were involuntarily bundled together (#3012).
+- [fontBuilder] Add ``debug`` parameter to addOpenTypeFeatures method to add source
+ debugging information to the font in the ``Debg`` private table (#3008).
+- [name] Make NameRecord `__lt__` comparison not fail on Unicode encoding errors (#3006).
+- [featureVars] Fixed bug in ``overlayBox`` (#3003, #3005).
+- [glyf] Added experimental support for cubic bezier curves in TrueType glyf table, as
+ outlined in glyf v1 proposal (#2988):
+ https://github.com/harfbuzz/boring-expansion-spec/blob/main/glyf1-cubicOutlines.md
+- Added new qu2cu module and related qu2cuPen, the reverse of cu2qu for converting
+ TrueType quadratic splines to cubic bezier curves (#2993).
+- [glyf] Added experimental support for reading and writing Variable Composites/Components
+ as defined in glyf v1 spec proposal (#2958):
+ https://github.com/harfbuzz/boring-expansion-spec/blob/main/glyf1-varComposites.md.
+- [pens]: Added `addVarComponent` method to pen protocols' base classes, which pens can implement
+ to handle varcomponents (by default they get decomposed) (#2958).
+- [misc.transform] Added DecomposedTransform class which implements an affine transformation
+ with separate translate, rotation, scale, skew, and transformation-center components (#2598)
+- [sbix] Ensure Glyph.referenceGlyphName is set; fixes error after dumping and
+ re-compiling sbix table with 'dupe' glyphs (#2984).
+- [feaLib] Be cleverer when merging chained single substitutions into same lookup
+ when they are specified using the inline notation (#2150, #2974).
+- [instancer] Clamp user-inputted axis ranges to those of fvar (#2959).
+- [otBase/subset] Define ``__getstate__`` for BaseTable so that a copied/pickled 'lazy'
+ object gets its own OTTableReader to read from; incidentally fixes a bug while
+ subsetting COLRv1 table containing ClipBoxes on python 3.11 (#2965, #2968).
+- [sbix] Handle glyphs with "dupe" graphic type on compile correctly (#2963).
+- [glyf] ``endPointsOfContours`` field should be unsigned! Kudos to behdad for
+ spotting one of the oldest bugs in FT. Probably nobody has ever dared to make
+ glyphs with more than 32767 points... (#2957).
+- [feaLib] Fixed handling of ``ignore`` statements with unmarked glyphs to match
+ makeotf behavior, which assumes the first glyph is marked (#2950).
+- Reformatted code with ``black`` and enforce new code style via CI check (#2925).
+- [feaLib] Sort name table entries following OT spec prescribed order in the builder (#2927).
+- [cu2quPen] Add Cu2QuMultiPen that converts multiple outlines at a time in
+ interpolation compatible way; its methods take a list of tuples arguments
+ that would normally be passed to individual segment pens, and at the end it
+ dispatches the converted outlines to each pen (#2912).
+- [reverseContourPen/ttGlyphPen] Add outputImpliedClosingLine option (#2913, #2914,
+ #2921, #2922, #2995).
+- [gvar] Avoid expanding all glyphs unnecessarily upon compile (#2918).
+- [scaleUpem] Fixed bug whereby CFF2 vsindex was scaled; it should not (#2893, #2894).
+- [designspaceLib] Add DS.getAxisByTag and refactor getAxis (#2891).
+- [unicodedata] map Zmth<->math in ot_tag_{to,from}_script (#1737, #2889).
+- [woff2] Support encoding/decoding OVERLAP_SIMPLE glyf flags (#2576, #2884).
+- [instancer] Update OS/2 class and post.italicAngle when default moved (L4)
+- Dropped support for Python 3.7 which reached EOL, fontTools requires 3.8+.
+- [instancer] Fixed instantiateFeatureVariations logic when a rule range becomes
+ default-applicable (#2737, #2880).
+- [ttLib] Add main to ttFont and ttCollection that just decompile and re-compile the
+ input font (#2869).
+- [featureVars] Insert 'rvrn' lookup at the beginning of LookupList, to work around bug
+ in Apple implementation of 'rvrn' feature which the spec says it should be processed
+ early whereas on macOS 10.15 it follows lookup order (#2140, #2867).
+- [instancer/mutator] Remove 'DSIG' table if present.
+- [svgPathPen] Don't close path in endPath(), assume open unless closePath() (#2089, #2865).
+
+4.38.0 (released 2022-10-21)
+----------------------------
+
+- [varLib.instancer] Added support for L4 instancing, i.e. moving the default value of
+ an axis while keeping it variable. Thanks Behdad! (#2728, #2861).
+ It's now also possible to restrict an axis min/max values beyond the current default
+ value, e.g. a font wght has min=100, def=400, max=900 and you want a partial VF that
+ only varies between 500 and 700, you can now do that.
+ You can either specify two min/max values (wght=500:700), and the new default will be
+ set to either the minimum or maximum, depending on which one is closer to the current
+ default (e.g. 500 in this case). Or you can specify three values (e.g. wght=500:600:700)
+ to specify the new default value explicitly.
+- [otlLib/featureVars] Set a few Count values so one doesn't need to compile the font
+ to update them (#2860).
+- [varLib.models] Make extrapolation work for 2-master models as well where one master
+ is at the default location (#2843, #2846).
+ Add optional extrapolate=False to normalizeLocation() (#2847, #2849).
+- [varLib.cff] Fixed sub-optimal packing of CFF2 deltas by no longer rounding them to
+ integer (#2838).
+- [scaleUpem] Calculate numShorts in VarData after scale; handle CFF hintmasks (#2840).
+
+4.37.4 (released 2022-09-30)
+----------------------------
+
+- [subset] Keep nameIDs used by CPAL palette entry labels (#2837).
+- [varLib] Avoid negative hmtx values when creating font from variable CFF2 font (#2827).
+- [instancer] Don't prune stat.ElidedFallbackNameID (#2828).
+- [unicodedata] Update Scripts/Blocks to Unicode 15.0 (#2833).
+
+4.37.3 (released 2022-09-20)
+----------------------------
+
+- Fix arguments in calls to (glyf) glyph.draw() and drawPoints(), whereby offset wasn't
+ correctly passed down; this fix also exposed a second bug, where lsb and tsb were not
+ set (#2824, #2825, adobe-type-tools/afdko#1560).
+
+4.37.2 (released 2022-09-15)
+----------------------------
+
+- [subset] Keep CPAL table and don't attempt to prune unused color indices if OT-SVG
+ table is present even if COLR table was subsetted away; OT-SVG may be referencing the
+ CPAL table; for now we assume that's the case (#2814, #2815).
+- [varLib.instancer] Downgrade GPOS/GSUB version if there are no more FeatureVariations
+ after instancing (#2812).
+- [subset] Added ``--no-lazy`` to optionally load fonts eagerly (mostly to ease
+ debugging of table lazy loading, no practical effects) (#2807).
+- [varLib] Avoid building empty COLR.DeltaSetIndexMap with only identity mappings (#2803).
+- [feaLib] Allow multiple value record types (by promoting to the most general format)
+ within the same PairPos subtable; e.g. this allows variable and non variable kerning
+ rules to share the same subtable. This also fixes a bug whereby some kerning pairs
+ would become unreachable while shapiong because of premature subtable splitting (#2772, #2776).
+- [feaLib] Speed up ``VarScalar`` by caching models for recurring master locations (#2798).
+- [feaLib] Optionally cythonize ``feaLib.lexer``, speeds up parsing FEA a bit (#2799).
+- [designspaceLib] Avoid crash when handling unbounded rule conditions (#2797).
+- [post] Don't crash if ``post`` legacy format 1 is malformed/improperly used (#2786)
+- [gvar] Don't be "lazy" (load all glyph variations up front) when TTFont.lazy=False (#2771).
+- [TTFont] Added ``normalizeLocation`` method to normalize a location dict from the
+ font's defined axes space (also known as "user space") into the normalized (-1..+1)
+ space. It applies ``avar`` mapping if the font contains an ``avar`` table (#2789).
+- [TTVarGlyphSet] Support drawing glyph instances from CFF2 variable glyph set (#2784).
+- [fontBuilder] Do not error when building cmap if there are zero code points (#2785).
+- [varLib.plot] Added ability to plot a variation model and set of accompaning master
+ values corresponding to the model's master locations into a pyplot figure (#2767).
+- [Snippets] Added ``statShape.py`` script to draw statistical shape of a glyph as an
+ ellips (requires pycairo) (baecd88).
+- [TTVarGlyphSet] implement drawPoints natively, avoiding going through
+ SegmentToPointPen (#2778).
+- [TTVarGlyphSet] Fixed bug whereby drawing a composite glyph multiple times, its
+ components would shif; needed an extra copy (#2774).
+
+4.37.1 (released 2022-08-24)
+----------------------------
+
+- [subset] Fixed regression introduced with v4.37.0 while subsetting the VarStore of
+ ``HVAR`` and ``VVAR`` tables, whereby an ``AttributeError: subset_varidxes`` was
+ thrown because an apparently unused import statement (with the side-effect of
+ dynamically binding that ``subset_varidxes`` method to the VarStore class) had been
+ accidentally deleted in an unrelated PR (#2679, #2773).
+- [pens] Added ``cairoPen`` (#2678).
+- [gvar] Read ``gvar`` more lazily by not parsing all of the ``glyf`` table (#2771).
+- [ttGlyphSet] Make ``drawPoints(pointPen)`` method work for CFF fonts as well via
+ adapter pen (#2770).
+
+4.37.0 (released 2022-08-23)
+----------------------------
+
+- [varLib.models] Reverted PR #2717 which added support for "narrow tents" in v4.36.0,
+ as it introduced a regression (#2764, #2765). It will be restored in upcoming release
+ once we found a solution to the bug.
+- [cff.specializer] Fixed issue in charstring generalizer with the ``blend`` operator
+ (#2750, #1975).
+- [varLib.models] Added support for extrapolation (#2757).
+- [ttGlyphSet] Ensure the newly added ``_TTVarGlyphSet`` inherits from ``_TTGlyphSet``
+ to keep backward compatibility with existing API (#2762).
+- [kern] Allow compiling legacy kern tables with more than 64k entries (d21cfdede).
+- [visitor] Added new visitor API to traverse tree of objects and dispatch based
+ on the attribute type: cf. ``fontTools.misc.visitor`` and ``fontTools.ttLib.ttVisitor``. Added ``fontTools.ttLib.scaleUpem`` module that uses the latter to
+ change a font's units-per-em and scale all the related fields accordingly (#2718,
+ #2755).
+
+4.36.0 (released 2022-08-17)
+----------------------------
+
+- [varLib.models] Use a simpler model that generates narrower "tents" (regions, master
+ supports) whenever possible: specifically when any two axes that actively "cooperate"
+ (have masters at non-zero positions for both axes) have a complete set of intermediates.
+ The simpler algorithm produces fewer overlapping regions and behaves better with
+ respect to rounding at the peak positions than the generic solver, always matching
+ intermediate masters exactly, instead of maximally 0.5 units off. This may be useful
+ when 100% metrics compatibility is desired (#2218, #2717).
+- [feaLib] Remove warning when about ``GDEF`` not being built when explicitly not
+ requested; don't build one unconditonally even when not requested (#2744, also works
+ around #2747).
+- [ttFont] ``TTFont.getGlyphSet`` method now supports selecting a location that
+ represents an instance of a variable font (supports both user-scale and normalized
+ axes coordinates via the ``normalized=False`` parameter). Currently this only works
+ for TrueType-flavored variable fonts (#2738).
+
+4.35.0 (released 2022-08-15)
+----------------------------
+
+- [otData/otConverters] Added support for 'biased' PaintSweepGradient start/end angles
+ to match latest COLRv1 spec (#2743).
+- [varLib.instancer] Fixed bug in ``_instantiateFeatureVariations`` when at the same
+ time pinning one axis and restricting the range of a subsequent axis; the wrong axis
+ tag was being used in the latter step (as the records' axisIdx was updated in the
+ preceding step but looked up using the old axes order in the following step) (#2733,
+ #2734).
+- [mtiLib] Pad script tags with space when less than 4 char long (#1727).
+- [merge] Use ``'.'`` instead of ``'#'`` in duplicate glyph names (#2742).
+- [gvar] Added support for lazily loading glyph variations (#2741).
+- [varLib] In ``build_many``, we forgot to pass on ``colr_layer_reuse`` parameter to
+ the ``build`` method (#2730).
+- [svgPathPen] Add a main that prints SVG for input text (6df779fd).
+- [cffLib.width] Fixed off-by-one in optimized values; previous code didn't match the
+ code block above it (2963fa50).
+- [varLib.interpolatable] Support reading .designspace and .glyphs files (via optional
+ ``glyphsLib``).
+- Compile some modules with Cython when available and building/installing fonttools
+ from source: ``varLib.iup`` (35% faster), ``pens.momentsPen`` (makes
+ ``varLib.interpolatable`` 3x faster).
+- [feaLib] Allow features to be built for VF without also building a GDEF table (e.g.
+ only build GSUB); warn when GDEF would be needed but isn't requested (#2705, 2694).
+- [otBase] Fixed ``AttributeError`` when uharfbuzz < 0.23.0 and 'repack' method is
+ missing (32aa8eaf). Use new ``uharfbuzz.repack_with_tag`` when available (since
+ uharfbuzz>=0.30.0), enables table-specific optimizations to be performed during
+ repacking (#2724).
+- [statisticsPen] By default report all glyphs (4139d891). Avoid division-by-zero
+ (52b28f90).
+- [feaLib] Added missing required argument to FeatureLibError exception (#2693)
+- [varLib.merge] Fixed error during error reporting (#2689). Fixed undefined
+ ``NotANone`` variable (#2714).
+
+4.34.4 (released 2022-07-07)
+----------------------------
+
+- Fixed typo in varLib/merger.py that causes NameError merging COLR glyphs
+ containing more than 255 layers (#2685).
+
+4.34.3 (released 2022-07-07)
+----------------------------
+
+- [designspaceLib] Don't make up bad PS names when no STAT data (#2684)
+
+4.34.2 (released 2022-07-06)
+----------------------------
+
+- [varStore/subset] fixed KeyError exception to do with NO_VARIATION_INDEX while
+ subsetting varidxes in GPOS/GDEF (a08140d).
+
+4.34.1 (released 2022-07-06)
+----------------------------
+
+- [instancer] When optimizing HVAR/VVAR VarStore, use_NO_VARIATION_INDEX=False to avoid
+ including NO_VARIATION_INDEX in AdvWidthMap, RsbMap, LsbMap mappings, which would
+ push the VarIdx width to maximum (4bytes), which is not desirable. This also fixes
+ a hard crash when attempting to subset a varfont after it had been partially instanced
+ with use_NO_VARIATION_INDEX=True.
+
+4.34.0 (released 2022-07-06)
+----------------------------
+
+- [instancer] Set RIBBI bits in head and OS/2 table when cutting instances and the
+ subfamily nameID=2 contains strings like 'Italic' or 'Bold' (#2673).
+- [otTraverse] Addded module containing methods for traversing trees of otData tables
+ (#2660).
+- [otTables] Made DeltaSetIndexMap TTX dump less verbose by omitting no-op entries
+ (#2660).
+- [colorLib.builder] Added option to disable PaintColrLayers's reuse of layers from
+ LayerList (#2660).
+- [varLib] Added support for merging multiple master COLRv1 tables into a variable
+ COLR table (#2660, #2328). Base color glyphs of same name in different masters must have
+ identical paint graph structure (incl. number of layers, palette indices, number
+ of color line stops, corresponding paint formats at each level of the graph),
+ but can differ in the variable fields (e.g. PaintSolid.Alpha). PaintVar* tables
+ are produced when this happens and a VarStore/DeltaSetIndexMap is added to the
+ variable COLR table. It is possible for non-default masters to be 'sparse', i.e.
+ omit some of the color glyphs present in the default master.
+- [feaLib] Let the Parser set nameIDs 1 through 6 that were previously reserved (#2675).
+- [varLib.varStore] Support NO_VARIATION_INDEX in optimizer and instancer.
+- [feaLib] Show all missing glyphs at once at end of parsing (#2665).
+- [varLib.iup] Rewrite force-set conditions and limit DP loopback length (#2651).
+ For Noto Sans, IUP time drops from 23s down to 9s, with only a slight size increase
+ in the final font. This basically turns the algorithm from O(n^3) into O(n).
+- [featureVars] Report about missing glyphs in substitution rules (#2654).
+- [mutator/instancer] Added CLI flag to --no-recalc-timestamp (#2649).
+- [SVG] Allow individual SVG documents in SVG OT table to be compressed on uncompressed,
+ and remember that when roundtripping to/from ttx. The SVG.docList is now a list
+ of SVGDocument namedtuple-like dataclass containing an extra ``compressed`` field,
+ and no longer a bare 3-tuple (#2645).
+- [designspaceLib] Check for descriptor types with hasattr() to allow custom classes
+ that don't inherit the default descriptors (#2634).
+- [subset] Enable sharing across subtables of extension lookups for harfbuzz packing
+ (#2626). Updated how table packing falls back to fontTools from harfbuzz (#2668).
+- [subset] Updated default feature tags following current Harfbuzz (#2637).
+- [svgLib] Fixed regex for real number to support e.g. 1e-4 in addition to 1.0e-4.
+ Support parsing negative rx, ry on arc commands (#2596, #2611).
+- [subset] Fixed subsetting SinglePosFormat2 when ValueFormat=0 (#2603).
+
+4.33.3 (released 2022-04-26)
+----------------------------
+
+- [designspaceLib] Fixed typo in ``deepcopyExceptFonts`` method, preventing font
+ references to be transferred (#2600). Fixed another typo in the name of ``Range``
+ dataclass's ``__post_init__`` magic method (#2597).
+
+4.33.2 (released 2022-04-22)
+----------------------------
+
+- [otBase] Make logging less verbose when harfbuzz fails to serialize. Do not exit
+ at the first failure but continue attempting to fix offset overflow error using
+ the pure-python serializer even when the ``USE_HARFBUZZ_REPACKER`` option was
+ explicitly set to ``True``. This is normal with fonts with relatively large
+ tables, at least until hb.repack implements proper table splitting.
+
+4.33.1 (released 2022-04-22)
+----------------------------
+
+- [otlLib] Put back the ``FONTTOOLS_GPOS_COMPACT_MODE`` environment variable to fix
+ regression in ufo2ft (and thus fontmake) introduced with v4.33.0 (#2592, #2593).
+ This is deprecated and will be removed one ufo2ft gets updated to use the new
+ config setup.
+
+4.33.0 (released 2022-04-21)
+----------------------------
+
+- [OS/2 / merge] Automatically recalculate ``OS/2.xAvgCharWidth`` after merging
+ fonts with ``fontTools.merge`` (#2591, #2538).
+- [misc/config] Added ``fontTools.misc.configTools`` module, a generic configuration
+ system (#2416, #2439).
+ Added ``fontTools.config`` module, a fontTools-specific configuration
+ system using ``configTools`` above.
+ Attached a ``Config`` object to ``TTFont``.
+- [otlLib] Replaced environment variable for GPOS compression level with an
+ equivalent option using the new config system.
+- [designspaceLib] Incremented format version to 5.0 (#2436).
+ Added discrete axes, variable fonts, STAT information, either design- or
+ user-space location on instances.
+ Added ``fontTools.designspaceLib.split`` module to split a designspace
+ into sub-spaces that interpolate and that represent the variable fonts
+ listed in the document.
+ Made instance names optional and allow computing them from STAT data instead.
+ Added ``fontTools.designspaceLib.statNames`` module.
+ Allow instances to have the same location as a previously defined STAT label.
+ Deprecated some attributes:
+ ``SourceDescriptor``: ``copyLib``, ``copyInfo``, ``copyGroups``, ``copyFeatures``.
+ ``InstanceDescriptor``: ``kerning``, ``info``; ``glyphs``: use rules or sparse
+ sources.
+ For both, ``location``: use the more explicit designLocation.
+ Note: all are soft deprecations and existing code should keep working.
+ Updated documentation for Python methods and the XML format.
+- [varLib] Added ``build_many`` to build several variable fonts from a single
+ designspace document (#2436).
+ Added ``fontTools.varLib.stat`` module to build STAT tables from a designspace
+ document.
+- [otBase] Try to use the Harfbuzz Repacker for packing GSUB/GPOS tables when
+ ``uharfbuzz`` python bindings are available (#2552). Disable it by setting the
+ "fontTools.ttLib.tables.otBase:USE_HARFBUZZ_REPACKER" config option to ``False``.
+ If the option is set explicitly to ``True`` but ``uharfbuzz`` can't be imported
+ or fails to serialize for any reasons, an error will be raised (ImportError or
+ uharfbuzz errors).
+- [CFF/T2] Ensure that ``pen.closePath()`` gets called for CFF2 charstrings (#2577).
+ Handle implicit CFF2 closePath within ``T2OutlineExtractor`` (#2580).
+
+4.32.0 (released 2022-04-08)
+----------------------------
+
+- [otlLib] Disable GPOS7 optimization to work around bug in Apple CoreText.
+ Always force Chaining GPOS8 for now (#2540).
+- [glifLib] Added ``outputImpliedClosingLine=False`` parameter to ``Glyph.draw()``,
+ to control behaviour of ``PointToSegmentPen`` (6b4e2e7).
+- [varLib.interpolatable] Check for wrong contour starting point (#2571).
+- [cffLib] Remove leftover ``GlobalState`` class and fix calls to ``TopDictIndex()``
+ (#2569, #2570).
+- [instancer] Clear ``AxisValueArray`` if it is empty after instantiating (#2563).
+
+4.31.2 (released 2022-03-22)
+----------------------------
+
+- [varLib] fix instantiation of GPOS SinglePos values (#2555).
+
+4.31.1 (released 2022-03-18)
+----------------------------
+
+- [subset] fix subsetting OT-SVG when glyph id attribute is on the root ``