From 7f4534c42265d0943e87068d0c59b2e2da2a6ff7 Mon Sep 17 00:00:00 2001
From: Luigi Scarso <luigi.scarso@gmail.com>
Date: Sat, 1 Apr 2023 09:47:44 +0200
Subject: [PATCH] Sync with TeX Live revision 66716.

---
 source/build-aux/texinfo.tex                  |  151 +-
 source/configure                              |    4 +-
 source/libs/README                            |    8 +-
 source/libs/configure                         |   20 +-
 source/libs/harfbuzz/ChangeLog                |    5 +
 source/libs/harfbuzz/Makefile.am              |    3 +-
 source/libs/harfbuzz/Makefile.in              |    1 +
 source/libs/harfbuzz/TLpatches/ChangeLog      |    5 +
 source/libs/harfbuzz/TLpatches/TL-Changes     |    4 +-
 source/libs/harfbuzz/configure                |   26 +-
 source/libs/harfbuzz/harfbuzz-src/ChangeLog   |  533 +++++
 source/libs/harfbuzz/harfbuzz-src/NEWS        |   10 +
 .../libs/harfbuzz/harfbuzz-src/configure.ac   |    2 +-
 source/libs/harfbuzz/harfbuzz-src/meson.build |    2 +-
 .../harfbuzz-src/src/Makefile.sources         |    1 +
 .../src/OT/Layout/GPOS/MarkLigPosFormat1.hh   |   14 +-
 .../src/OT/Layout/GPOS/SinglePosFormat1.hh    |    8 +
 .../src/OT/Layout/GSUB/SingleSubstFormat1.hh  |   10 +-
 .../harfbuzz-src/src/OT/glyf/path-builder.hh  |   39 +-
 .../libs/harfbuzz/harfbuzz-src/src/gen-def.py |    3 +-
 .../libs/harfbuzz/harfbuzz-src/src/hb-algs.hh |   88 +-
 .../libs/harfbuzz/harfbuzz-src/src/hb-blob.h  |    2 +-
 .../src/hb-buffer-deserialize-text-glyphs.hh  |   10 +-
 .../harfbuzz/harfbuzz-src/src/hb-config.hh    |    4 +
 .../harfbuzz/harfbuzz-src/src/hb-debug.hh     |    4 +
 .../libs/harfbuzz/harfbuzz-src/src/hb-font.cc |   73 +
 .../libs/harfbuzz/harfbuzz-src/src/hb-font.h  |    5 +
 .../libs/harfbuzz/harfbuzz-src/src/hb-ft.cc   |    2 +-
 .../libs/harfbuzz/harfbuzz-src/src/hb-map.cc  |    4 +-
 .../libs/harfbuzz/harfbuzz-src/src/hb-map.hh  |   10 -
 .../harfbuzz-src/src/hb-ot-face-table-list.hh |    1 +
 .../harfbuzz-src/src/hb-ot-post-table.hh      |    8 +-
 .../src/hb-ot-shaper-myanmar-machine.hh       |   14 +-
 .../harfbuzz-src/src/hb-ot-var-common.hh      |  327 +++
 .../harfbuzz-src/src/hb-ot-var-cvar-table.hh  |  158 ++
 .../harfbuzz-src/src/hb-ot-var-gvar-table.hh  |  309 +--
 .../harfbuzz/harfbuzz-src/src/hb-outline.cc   |    4 +-
 .../harfbuzz/harfbuzz-src/src/hb-outline.hh   |    2 +-
 .../harfbuzz/harfbuzz-src/src/hb-sanitize.hh  |   12 +
 .../harfbuzz/harfbuzz-src/src/hb-shape.cc     |  234 ++
 .../libs/harfbuzz/harfbuzz-src/src/hb-shape.h |   12 +
 .../harfbuzz-src/src/hb-shaper-list.hh        |    2 +-
 .../harfbuzz-src/src/hb-subset-input.cc       |    1 -
 .../harfbuzz/harfbuzz-src/src/hb-subset.cc    |   11 +
 source/libs/harfbuzz/harfbuzz-src/src/hb.hh   |   10 +-
 .../harfbuzz/harfbuzz-src/src/meson.build     |    1 +
 .../harfbuzz/harfbuzz-src/src/test-map.cc     |    4 +-
 source/libs/harfbuzz/version.ac               |    2 +-
 source/texk/configure                         |   20 +-
 source/texk/kpathsea/c-auto.in                |    2 +-
 source/texk/kpathsea/configure                |   26 +-
 source/texk/kpathsea/version.ac               |    7 +-
 source/texk/texlive/configure                 |   20 +-
 source/texk/web2c/ChangeLog                   |    7 +
 source/texk/web2c/configure                   |   24 +-
 source/texk/web2c/lib/ChangeLog               |    4 +
 source/texk/web2c/lib/texmfmp.c               |    2 +-
 .../texk/web2c/luatexdir/luatex_svnversion.h  |    2 +-
 source/texk/web2c/web2c/configure             |   20 +-
 source/utils/configure                        | 1998 +----------------
 source/version.ac                             |    4 +-
 61 files changed, 1819 insertions(+), 2480 deletions(-)
 create mode 100644 source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-cvar-table.hh

diff --git a/source/build-aux/texinfo.tex b/source/build-aux/texinfo.tex
index 1ddfef4b8..a32c84197 100644
--- a/source/build-aux/texinfo.tex
+++ b/source/build-aux/texinfo.tex
@@ -3,7 +3,7 @@
 % Load plain if necessary, i.e., if running under initex.
 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
 %
-\def\texinfoversion{2023-03-04.12}
+\def\texinfoversion{2023-03-27.21}
 %
 % Copyright 1985, 1986, 1988, 1990-2023 Free Software Foundation, Inc.
 %
@@ -1102,27 +1102,33 @@ where each line of input produces a line of output.}
 
 % Output page labels information.
 % See PDF reference v.1.7 p.594, section 8.3.1.
+% Page label ranges must be increasing.
 \ifpdf
 \def\pagelabels{%
   \def\title{0 << /P (T-) /S /D >>}%
-  \edef\roman{\the\romancount << /S /r >>}%
-  \edef\arabic{\the\arabiccount << /S /D >>}%
   %
-  % Page label ranges must be increasing.  Remove any duplicates.
-  % (There is a slight chance of this being wrong if e.g. there is
-  % a @contents but no @titlepage, etc.)
-  %
-  \ifnum\romancount=0 \def\roman{}\fi
-  \ifnum\arabiccount=0 \def\title{}%
-  \else
-    \ifnum\romancount=\arabiccount \def\roman{}\fi
-  \fi
-  %
-  \ifnum\romancount<\arabiccount
-    \pdfcatalog{/PageLabels << /Nums [\title \roman \arabic ] >> }\relax
+  % support @contents at very end of document
+  \ifnum\contentsendcount=\pagecount
+    \ifnum\arabiccount<\romancount
+      \pdfcatalog{/PageLabels << /Nums
+                  [\title
+                   \the\arabiccount << /S /D >>
+                   \the\romancount << /S /r >>
+                  ] >> }\relax
+    \fi
+  % no contents in document
+  \else\ifnum\contentsendcount=0
+    \pdfcatalog{/PageLabels << /Nums
+                [\title
+                 \the\arabiccount << /S /D >>
+                ] >> }\relax
   \else
-    \pdfcatalog{/PageLabels << /Nums [\title \arabic \roman ] >> }\relax
-  \fi
+    \pdfcatalog{/PageLabels << /Nums
+                [\title
+                 \the\romancount << /S /r >>
+                 \the\contentsendcount << /S /D >>
+                ] >> }\relax
+  \fi\fi
 }
 \else
   \let\pagelabels\relax
@@ -1131,6 +1137,8 @@ where each line of input produces a line of output.}
 \newcount\pagecount \pagecount=0
 \newcount\romancount \romancount=0
 \newcount\arabiccount \arabiccount=0
+\newcount\contentsendcount \contentsendcount=0
+
 \ifpdf
   \let\ptxadvancepageno\advancepageno
   \def\advancepageno{%
@@ -4102,7 +4110,6 @@ $$%
     \nobreak\kern\dimen0
     \endgroup
     \itemxneedsnegativevskiptrue
-    \penalty 10021 % for \indexpar
   \fi
 }
 
@@ -4219,7 +4226,6 @@ $$%
    % We can be in inner vertical mode in a footnote, although an
    % @itemize looks awful there.
   }%
-  \penalty 10021 % for \indexpar
   \flushcr
 }
 
@@ -4784,17 +4790,11 @@ $$%
 % and it is the two-letter name of the index.
 
 \def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx}
-\def\doindexxxx #1{\indexpar\doind{\indexname}{#1}}
+\def\doindexxxx #1{\doind{\indexname}{#1}}
 
 % like the previous two, but they put @code around the argument.
 \def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx}
-\def\docodeindexxxx #1{\indexpar\docind{\indexname}{#1}}
-
-% End any open paragraph, unless we are immediately after @item in
-% @itemize or @enumerate.
-\def\indexpar{%
-\ifnum\lastpenalty=10021 \else\endgraf\fi
-}
+\def\docodeindexxxx #1{\docind{\indexname}{#1}}
 
 
 % \definedummyword defines \#1 as \string\#1\space, thus effectively
@@ -5351,9 +5351,7 @@ $$%
 % ..., ready, GO:
 %
 \def\safewhatsit#1{\ifhmode
-  \whatsitpenalty = \lastpenalty
   #1%
-  \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
  \else
   % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
   \whatsitskip = \lastskip
@@ -6819,12 +6817,8 @@ might help (with 'rm \jobname.?? \jobname.??s')%
 % Get ready to use Arabic numerals again
 \def\contentsendroman{%
   \lastnegativepageno = \pageno
-  \global\pageno = \savepageno
-  %
-  % If \romancount > \arabiccount, the contents are at the end of the
-  % document.  Otherwise, advance where the Arabic numerals start for
-  % the page numbers.
-  \ifnum\romancount>\arabiccount\else\global\arabiccount=\pagecount\fi
+  \global\pageno=1
+  \contentsendcount = \pagecount
 }
 
 % Typeset the label for a chapter or appendix for the short contents.
@@ -7597,7 +7591,7 @@ might help (with 'rm \jobname.?? \jobname.??s')%
   \parseargusing\activeparens{\printdefunline\deflineheader}%
 }
 \def\deflineheader#1 #2 #3\endheader{%
-  \defname{#1}{}{#2}\magicamp\defunargs{#3\unskip}%
+  \printdefname{#1}{}{#2}\magicamp\defunargs{#3\unskip}%
 }
 \def\deftypeline{%
   \doingtypefntrue
@@ -7660,14 +7654,14 @@ might help (with 'rm \jobname.?? \jobname.??s')%
 % @deffn category name args
 \makedefun{deffn}#1 #2 #3\endheader{%
   \doind{fn}{\code{#2}}%
-  \defname{#1}{}{#2}\magicamp\defunargs{#3\unskip}%
+  \printdefname{#1}{}{#2}\magicamp\defunargs{#3\unskip}%
 }
 
 % @defop category class name args
 \makedefun{defop}#1 {\defopheaderx{#1\ \putwordon}}
 \def\defopheaderx#1#2 #3 #4\endheader{%
   \doind{fn}{\code{#3}\space\putwordon\ \code{#2}}%
-  \defname{#1\ \code{#2}}{}{#3}\magicamp\defunargs{#4\unskip}%
+  \printdefname{#1\ \code{#2}}{}{#3}\magicamp\defunargs{#4\unskip}%
 }
 
 % Typed functions:
@@ -7676,7 +7670,7 @@ might help (with 'rm \jobname.?? \jobname.??s')%
 \makedefun{deftypefn}#1 #2 #3 #4\endheader{%
   \doind{fn}{\code{#3}}%
   \doingtypefntrue
-  \defname{#1}{#2}{#3}\defunargs{#4\unskip}%
+  \printdefname{#1}{#2}{#3}\defunargs{#4\unskip}%
 }
 
 % @deftypeop category class type name args
@@ -7684,7 +7678,7 @@ might help (with 'rm \jobname.?? \jobname.??s')%
 \def\deftypeopheaderx#1#2 #3 #4 #5\endheader{%
   \doind{fn}{\code{#4}\space\putwordon\ \code{#1\ \code{#2}}}%
   \doingtypefntrue
-  \defname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}%
+  \printdefname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}%
 }
 
 % Typed variables:
@@ -7692,14 +7686,14 @@ might help (with 'rm \jobname.?? \jobname.??s')%
 % @deftypevr category type var args
 \makedefun{deftypevr}#1 #2 #3 #4\endheader{%
   \doind{vr}{\code{#3}}%
-  \defname{#1}{#2}{#3}\defunargs{#4\unskip}%
+  \printdefname{#1}{#2}{#3}\defunargs{#4\unskip}%
 }
 
 % @deftypecv category class type var args
 \makedefun{deftypecv}#1 {\deftypecvheaderx{#1\ \putwordof}}
 \def\deftypecvheaderx#1#2 #3 #4 #5\endheader{%
   \doind{vr}{\code{#4}\space\putwordof\ \code{#2}}%
-  \defname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}%
+  \printdefname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}%
 }
 
 % Untyped variables:
@@ -7716,7 +7710,7 @@ might help (with 'rm \jobname.?? \jobname.??s')%
 % @deftp category name args
 \makedefun{deftp}#1 #2 #3\endheader{%
   \doind{tp}{\code{#2}}%
-  \defname{#1}{}{#2}\defunargs{#3\unskip}%
+  \printdefname{#1}{}{#2}\defunargs{#3\unskip}%
 }
 
 % Remaining @defun-like shortcuts:
@@ -7732,14 +7726,14 @@ might help (with 'rm \jobname.?? \jobname.??s')%
 \makedefun{defivar}{\defcvheaderx\putwordInstanceVariableof}
 \makedefun{deftypeivar}{\deftypecvheaderx\putwordInstanceVariableof}
 
-% \defname, which formats the name of the @def (not the args).
+% \printdefname, which formats the name of the @def (not the args).
 % #1 is the category, such as "Function".
 % #2 is the return type, if any.
 % #3 is the function name.
 %
 % We are followed by (but not passed) the arguments, if any.
 %
-\def\defname#1#2#3{%
+\def\printdefname#1#2#3{%
   \par
   % Get the values of \leftskip and \rightskip as they were outside the @def...
   \advance\leftskip by -\defbodyindent
@@ -7864,7 +7858,7 @@ might help (with 'rm \jobname.?? \jobname.??s')%
 
 % If we encounter &foo, then turn on ()-hacking afterwards
 \newif\ifampseen
-\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+\def\amprm#1 {\ampseentrue{\rm\&#1 }}
 
 \def\parenfont{%
   \ifampseen
@@ -8188,12 +8182,12 @@ might help (with 'rm \jobname.?? \jobname.??s')%
 %
 % We are in \macrobodyctxt, and the \xdef causes backslashshes in the macro
 % body to be transformed.
-% Set \macrobody to the body of the macro, and call \defmacro.
+% Set \macrobody to the body of the macro, and call \macrodef.
 %
 {\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{%
-\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
+\xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}%
 {\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{%
-\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
+\xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}%
 
 % Make @ a letter, so that we can make private-to-Texinfo macro names.
 \edef\texiatcatcode{\the\catcode`\@}
@@ -8412,16 +8406,17 @@ might help (with 'rm \jobname.?? \jobname.??s')%
 % \xdef is used so that macro definitions will survive the file
 % they're defined in: @include reads the file inside a group.
 %
-\def\defmacro{%
+\def\macrodef{%
   \let\hash=##% convert placeholders to macro parameter chars
   \ifnum\paramno=1
-    \def\xeatspaces##1{##1}%
-    % This removes the pair of braces around the argument.  We don't
-    % use \eatspaces, because this can cause ends of lines to be lost
-    % when the argument to \eatspaces is read, leading to line-based
-    % commands like "@itemize" not being read correctly.
+    \long\def\xeatspaces##1{##1}%
+    % We don't use \xeatspaces for single-argument macros, because we
+    % want to keep ends of lines.  This definition removes \xeatspaces
+    % when \macrobody is expanded below.
   \else
-    \let\xeatspaces\relax % suppress expansion
+    \def\xeatspaces{\string\xeatspaces}%
+    % This expands \xeatspaces as a sequence of character tokens, which
+    % stops \scantokens inserting an extra space after the control sequence.
   \fi
   \ifcase\paramno
   % 0
@@ -8590,40 +8585,35 @@ might help (with 'rm \jobname.?? \jobname.??s')%
 % @linemacro
 
 \parseargdef\linemacro{%
-  \linegetargs#1 \linegetargs
-  \expandafter\linegetparamlist\argl;%
+  \getargs{#1}% now \macname is the macname and \argl the arglist
+  \ifx\argl\empty
+    \paramno=0
+    \let\hash\relax
+    \def\paramlist{\hash 1\endlinemacro}%
+  \else
+    \expandafter\linegetparamlist\argl;%
+  \fi
   \begingroup \macrobodyctxt \usembodybackslash
   \parselinemacrobody
 }
 
-% Parse the arguments to a @linemacro line.  Set \macname to the name
-% of the macro and \argl to the list of arguments.
-\def\linegetargs#1 #2\linegetargs{%
-  \macname={#1}%
-  \def\argl{#2}%
-}
-
 % Build up \paramlist which will be used as the parameter text for the macro.
 % At the end it will be like "#1 #2 #3\endlinemacro".
 \def\linegetparamlist#1;{%
   \paramno=0\def\paramlist{}%
-  \let\hash\relax \let\xeatspaces\relax
-  \linegetparamlistxxx#1; %
+  \let\hash\relax
+  \linegetparamlistxxx#1,;,%
 }
-\def\linegetparamlistxxx#1 {%
+\def\linegetparamlistxxx#1,{%
   \if#1;\let\next=\linegetparamlistxxxx
   \else \let\next=\linegetparamlistxxx
     \advance\paramno by 1
     \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
-        {\noexpand\xeatspaces{\hash\the\paramno}}%
+        {\hash\the\paramno}%
     \edef\paramlist{\paramlist\hash\the\paramno\space}%
   \fi\next}
 \def\linegetparamlistxxxx{%
-  \ifx\paramlist\empty
-     \def\paramlist{\hash 1\endlinemacro}%
-  \else
-    \expandafter\fixparamlist\paramlist\fixparamlist
-  \fi
+  \expandafter\fixparamlist\paramlist\fixparamlist
 }
 % Replace final space token
 \def\fixparamlist#1 \fixparamlist{%
@@ -8633,7 +8623,6 @@ might help (with 'rm \jobname.?? \jobname.??s')%
 % Read the body of the macro, replacing backslash-surrounded variables
 %
 {\catcode`\ =\other\long\gdef\parselinemacrobody#1@end linemacro{%
-\let\xeatspaces\relax
 \xdef\macrobody{#1}%
 \endgroup
 \linemacrodef
@@ -8642,26 +8631,20 @@ might help (with 'rm \jobname.?? \jobname.??s')%
 % Make the definition
 \def\linemacrodef{%
   \let\hash=##%
-  \let\xeatspaces\relax
   \expandafter\xdef\csname\the\macname\endcsname{%
     \bgroup
-    \noexpand\scanctxt
     \noexpand\parsearg
     \expandafter\noexpand\csname\the\macname @@\endcsname
   }
   \expandafter\xdef\csname\the\macname @@\endcsname##1{%
     \egroup
     \expandafter\noexpand
-    \csname\the\macname @@@\endcsname##1 \noexpand\endlinemacro
-    % Note that we append a space to the macro line to terminate the last
-    % argument in case the final argument is empty.  @xeatspaces may be needed
-    % to remove this space.
+    \csname\the\macname @@@\endcsname##1\noexpand\endlinemacro
   }
   \expandafter\expandafter
   \expandafter\xdef
   \expandafter\expandafter\csname\the\macname @@@\endcsname\paramlist{%
     \newlinechar=13 % split \macrobody into lines
-    \let\noexpand\xeatspaces\noexpand\eatspaces
     \noexpand\scantokens{\macrobody}%
   }
 }
@@ -9659,8 +9642,8 @@ might help (with 'rm \jobname.?? \jobname.??s')%
 %
 \def\caption{\docaption\thiscaption}
 \def\shortcaption{\docaption\thisshortcaption}
-\def\docaption{\checkenv\float \bgroup\scanctxt\defcaption}
-\def\defcaption#1#2{\egroup \def#1{#2}}
+\def\docaption{\checkenv\float \bgroup\scanctxt\docaptionz}
+\def\docaptionz#1#2{\egroup \def#1{#2}}
 
 % The parameter is the control sequence identifying the counter we are
 % going to use.  Create it if it doesn't exist and assign it to \floatno.
diff --git a/source/configure b/source/configure
index 81d00c61b..046037f8a 100755
--- a/source/configure
+++ b/source/configure
@@ -24278,11 +24278,11 @@ msg_compiling="$msg_compiling
 test "x$srcdir" = x. || msg_compiling="$msg_compiling
       from sources in $kpse_src"
 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result:
-** Configuration summary for $PACKAGE_STRING (2023$with_banner_add):
+** Configuration summary for $PACKAGE_STRING (2024$with_banner_add):
 
    $msg_compiling" >&5
 printf "%s\n" "
-** Configuration summary for $PACKAGE_STRING (2023$with_banner_add):
+** Configuration summary for $PACKAGE_STRING (2024$with_banner_add):
 
    $msg_compiling" >&6; }
 case $kpse_src$kpse_bld in
diff --git a/source/libs/README b/source/libs/README
index 04503a894..31b0362e3 100644
--- a/source/libs/README
+++ b/source/libs/README
@@ -1,4 +1,4 @@
-$Id: README 65992 2023-02-20 23:13:30Z kakuto $
+$Id: README 66694 2023-03-28 06:08:03Z kakuto $
 Public domain.  Originally created by Karl Berry, 2005.
 
 Libraries we compile for TeX Live.
@@ -25,10 +25,10 @@ graphite2 1.3.14 - checked 10apr20
   http://sourceforge.net/projects/silgraphite/files/graphite2/
   (requires C++11)
 
-harfbuzz 7.0.1 - checked 21feb23
-  https://github.com/harfbuzz/harfbuzz/releases/tag/7.0.1
+harfbuzz 7.1.0 - checked 28mar23
+  https://github.com/harfbuzz/harfbuzz/releases/tag/7.1.0
 
-icu 70.1 - checked 16jan22
+icu 72.1 - checked 07jan23
   https://github.com/unicode-org/icu/releases/
 
 libpaper 1.1.28 - checked 10sep22
diff --git a/source/libs/configure b/source/libs/configure
index 053d69e90..5afa27a7f 100755
--- a/source/libs/configure
+++ b/source/libs/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for TeX Live libs 2023.
+# Generated by GNU Autoconf 2.71 for TeX Live libs 2024.
 #
 # Report bugs to <tex-k@tug.org>.
 #
@@ -610,8 +610,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='TeX Live libs'
 PACKAGE_TARNAME='tex-live-libs'
-PACKAGE_VERSION='2023'
-PACKAGE_STRING='TeX Live libs 2023'
+PACKAGE_VERSION='2024'
+PACKAGE_STRING='TeX Live libs 2024'
 PACKAGE_BUGREPORT='tex-k@tug.org'
 PACKAGE_URL=''
 
@@ -1355,7 +1355,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures TeX Live libs 2023 to adapt to many kinds of systems.
+\`configure' configures TeX Live libs 2024 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1426,7 +1426,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of TeX Live libs 2023:";;
+     short | recursive ) echo "Configuration of TeX Live libs 2024:";;
    esac
   cat <<\_ACEOF
 
@@ -1611,7 +1611,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-TeX Live libs configure 2023
+TeX Live libs configure 2024
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -1734,7 +1734,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by TeX Live libs $as_me 2023, which was
+It was created by TeX Live libs $as_me 2024, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -5242,7 +5242,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='tex-live-libs'
- VERSION='2023'
+ VERSION='2024'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -6211,7 +6211,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by TeX Live libs $as_me 2023, which was
+This file was extended by TeX Live libs $as_me 2024, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -6270,7 +6270,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-TeX Live libs config.status 2023
+TeX Live libs config.status 2024
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
diff --git a/source/libs/harfbuzz/ChangeLog b/source/libs/harfbuzz/ChangeLog
index c22536bc5..b023344e0 100644
--- a/source/libs/harfbuzz/ChangeLog
+++ b/source/libs/harfbuzz/ChangeLog
@@ -1,3 +1,8 @@
+2023-03-28  Akira Kakuto  <kakuto@jcom.zaq.ne.jp>
+
+	Import harfbuzz-7.1.0.
+	* version.ac, Makefile.am: Adjusted.
+
 2023-02-21  Akira Kakuto  <kakuto@jcom.zaq.ne.jp>
 
 	Import harfbuzz-7.0.1.
diff --git a/source/libs/harfbuzz/Makefile.am b/source/libs/harfbuzz/Makefile.am
index 2c990f24a..5e41f52d3 100644
--- a/source/libs/harfbuzz/Makefile.am
+++ b/source/libs/harfbuzz/Makefile.am
@@ -1,4 +1,4 @@
-## $Id: Makefile.am 65798 2023-02-12 04:02:23Z kakuto $
+## $Id: Makefile.am 66694 2023-03-28 06:08:03Z kakuto $
 ## Proxy Makefile.am to build harfbuzz for TeX Live.
 ##
 ##   Copyright 2016-2017 Karl Berry <tex-live@tug.org>
@@ -112,6 +112,7 @@ libharfbuzz_a_SOURCES =  \
 	@HARFBUZZ_TREE@/src/hb-ot-tag.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-tag-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-var-common.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-var-cvar-table.hh \
 	@HARFBUZZ_TREE@/src/hb-outline.cc \
 	@HARFBUZZ_TREE@/src/hb-outline.hh \
 	@HARFBUZZ_TREE@/src/hb-paint-extents.cc \
diff --git a/source/libs/harfbuzz/Makefile.in b/source/libs/harfbuzz/Makefile.in
index c1eee96ea..2b2a13fbb 100644
--- a/source/libs/harfbuzz/Makefile.in
+++ b/source/libs/harfbuzz/Makefile.in
@@ -797,6 +797,7 @@ libharfbuzz_a_SOURCES = @HARFBUZZ_TREE@/src/hb-algs.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-tag.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-tag-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-var-common.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-var-cvar-table.hh \
 	@HARFBUZZ_TREE@/src/hb-outline.cc \
 	@HARFBUZZ_TREE@/src/hb-outline.hh \
 	@HARFBUZZ_TREE@/src/hb-paint-extents.cc \
diff --git a/source/libs/harfbuzz/TLpatches/ChangeLog b/source/libs/harfbuzz/TLpatches/ChangeLog
index 3a45c3048..f59e55f50 100644
--- a/source/libs/harfbuzz/TLpatches/ChangeLog
+++ b/source/libs/harfbuzz/TLpatches/ChangeLog
@@ -1,3 +1,8 @@
+2023-03-28  Akira Kakuto  <kakuto@jcom.zaq.ne.jp>
+
+	Imported harfbuzz-7.1.0 source tree from:
+	https://github.com/harfbuzz/harfbuzz/releases/download/7.1.0/
+
 2023-02-21  Akira Kakuto  <kakuto@jcom.zaq.ne.jp>
 
 	Imported harfbuzz-7.0.1 source tree from:
diff --git a/source/libs/harfbuzz/TLpatches/TL-Changes b/source/libs/harfbuzz/TLpatches/TL-Changes
index 383772522..a22b47ec0 100644
--- a/source/libs/harfbuzz/TLpatches/TL-Changes
+++ b/source/libs/harfbuzz/TLpatches/TL-Changes
@@ -1,5 +1,5 @@
-Changes applied to the harfbuzz-7.0.1/ tree as obtained from:
-	https://github.com/harfbuzz/harfbuzz/releases/download/7.0.1/
+Changes applied to the harfbuzz-7.1.0/ tree as obtained from:
+	https://github.com/harfbuzz/harfbuzz/releases/download/7.1.0/
 
 Removed:
 	COPYING
diff --git a/source/libs/harfbuzz/configure b/source/libs/harfbuzz/configure
index cc3ba6db2..fd8ba8ff0 100755
--- a/source/libs/harfbuzz/configure
+++ b/source/libs/harfbuzz/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for harfbuzz (TeX Live) 7.0.1.
+# Generated by GNU Autoconf 2.71 for harfbuzz (TeX Live) 7.1.0.
 #
 # Report bugs to <tex-k@tug.org>.
 #
@@ -611,8 +611,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='harfbuzz (TeX Live)'
 PACKAGE_TARNAME='harfbuzz--tex-live-'
-PACKAGE_VERSION='7.0.1'
-PACKAGE_STRING='harfbuzz (TeX Live) 7.0.1'
+PACKAGE_VERSION='7.1.0'
+PACKAGE_STRING='harfbuzz (TeX Live) 7.1.0'
 PACKAGE_BUGREPORT='tex-k@tug.org'
 PACKAGE_URL=''
 
@@ -1346,7 +1346,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures harfbuzz (TeX Live) 7.0.1 to adapt to many kinds of systems.
+\`configure' configures harfbuzz (TeX Live) 7.1.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1418,7 +1418,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of harfbuzz (TeX Live) 7.0.1:";;
+     short | recursive ) echo "Configuration of harfbuzz (TeX Live) 7.1.0:";;
    esac
   cat <<\_ACEOF
 
@@ -1523,7 +1523,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-harfbuzz (TeX Live) configure 7.0.1
+harfbuzz (TeX Live) configure 7.1.0
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -2064,7 +2064,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by harfbuzz (TeX Live) $as_me 7.0.1, which was
+It was created by harfbuzz (TeX Live) $as_me 7.1.0, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -4823,7 +4823,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='harfbuzz--tex-live-'
- VERSION='7.0.1'
+ VERSION='7.1.0'
 
 
 # Some tools Automake needs.
@@ -5034,9 +5034,9 @@ WARNING_CFLAGS=$kpse_cv_warning_cflags
 
 
 HB_VERSION_MAJOR=7
-HB_VERSION_MINOR=0
-HB_VERSION_MICRO=1
-HB_VERSION=7.0.1
+HB_VERSION_MINOR=1
+HB_VERSION_MICRO=0
+HB_VERSION=7.1.0
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -8817,7 +8817,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by harfbuzz (TeX Live) $as_me 7.0.1, which was
+This file was extended by harfbuzz (TeX Live) $as_me 7.1.0, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -8885,7 +8885,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-harfbuzz (TeX Live) config.status 7.0.1
+harfbuzz (TeX Live) config.status 7.1.0
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
diff --git a/source/libs/harfbuzz/harfbuzz-src/ChangeLog b/source/libs/harfbuzz/harfbuzz-src/ChangeLog
index 759594e33..1111f5130 100644
--- a/source/libs/harfbuzz/harfbuzz-src/ChangeLog
+++ b/source/libs/harfbuzz/harfbuzz-src/ChangeLog
@@ -1,3 +1,536 @@
+commit 60841e26187576bff477c1a09ee2ffe544844abc
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Fri Mar 3 01:01:49 2023 +0200
+
+    7.1.0
+
+ NEWS                   | 10 ++++++++++
+ configure.ac           |  2 +-
+ docs/harfbuzz-docs.xml |  1 +
+ meson.build            |  2 +-
+ src/hb-font.cc         |  2 +-
+ src/hb-version.h       |  6 +++---
+ 6 files changed, 17 insertions(+), 6 deletions(-)
+
+commit e471ef77f93eeafff2701a31e6c042054ea4f7e1
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Mar 2 12:40:16 2023 -0800
+
+    [instancer] fix a runtime error
+    
+    runtime error: -1 is outside the range of representable values of type 'unsigned int'
+
+ src/hb-ot-var-cvar-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 43dbdd9db6abda31d41d06f4c33a826e1b791bd2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 2 13:42:52 2023 -0700
+
+    [justify] Document algorithm
+
+ src/hb-shape.cc | 26 ++++++++++++++++++++++++++
+ 1 file changed, 26 insertions(+)
+
+commit c98bb4cf9c2d73a78773ea9547865fbeaa1ecaff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 2 13:18:06 2023 -0700
+
+    [justify] Fix up after recent changes
+    
+    Oops.
+
+ src/hb-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit fb067390e422d79b092d9cfe8abb84f0ef8cae05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 2 11:40:45 2023 -0700
+
+    [docs] Fix a warning
+
+ docs/harfbuzz-sections.txt | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit fe83736e2608eb4697ce1194a69a55234561b620
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 2 11:35:42 2023 -0700
+
+    [sanitize] Protect against an underflow
+
+ src/hb-sanitize.hh | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 08784baf101aea472c133dcd67604b475ace3772
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 2 10:48:30 2023 -0700
+
+    [GSUB/GPOS] Fix sanitization in Format1
+    
+    Fixes https://oss-fuzz.com/testcase-detail/5120727025319936
+
+ src/OT/Layout/GPOS/SinglePosFormat1.hh   | 14 ++++++++------
+ src/OT/Layout/GSUB/SingleSubstFormat1.hh | 14 ++++++++------
+ 2 files changed, 16 insertions(+), 12 deletions(-)
+
+commit 789717387042ae7855cb61af2ef4b91ee32866a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 2 10:38:12 2023 -0700
+
+    [justify] Fix compiler warnings
+
+ src/hb-shape.cc | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit be64cae16489406147848e4613d11de8303e1513
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 2 09:50:38 2023 -0700
+
+    [map] Another try at fixing old Mac builds
+    
+    Maybe fixes https://github.com/harfbuzz/harfbuzz/issues/4138
+
+ src/hb-map.cc   |  4 ++--
+ src/hb-map.hh   | 12 ------------
+ src/test-map.cc |  4 ++--
+ 3 files changed, 4 insertions(+), 16 deletions(-)
+
+commit 67e01c1292821e7b6fc2ab13acddb84ab41b2187
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 1 20:07:38 2023 -0700
+
+    [map] Try to work around old Mac compiler bug
+    
+    Maybe fixes https://github.com/harfbuzz/harfbuzz/issues/4138
+
+ src/hb-map.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit e359f46a202899e0ee6dab1fec3c4cc325b9509c
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Mar 2 03:06:53 2023 +0200
+
+    Fix build
+
+ src/hb-shape.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit e8f94f9e1249fd1374fa282685ae93aba3b8fcdd
+Merge: c67c0086e 6de9d2b89
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 1 16:34:01 2023 -0700
+
+    Merge pull request #4144 from harfbuzz/justify
+    
+    Justify
+
+commit 6de9d2b89fb10ce69ebf501b3e77bd95da5b1792
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 1 14:32:06 2023 -0700
+
+    [justify] Rename hb-view --width to hb-view --justify-to
+
+ util/shape-options.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 25c66d633d58dcdd1e59095abf673a9ef08a612c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 1 14:16:08 2023 -0700
+
+    [justify] Wrap in HB_EXPERIMENTAL_API
+
+ src/gen-def.py        | 3 ++-
+ src/hb-shape.cc       | 8 +++++++-
+ util/shape-options.hh | 4 ++++
+ 3 files changed, 13 insertions(+), 2 deletions(-)
+
+commit 96d4ed093123293114d65800e8629deb1fff2218
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 1 14:08:16 2023 -0700
+
+    [justify] Document API
+
+ docs/harfbuzz-sections.txt |  1 +
+ src/hb-shape.cc            | 78 ++++++++++++++++++++++++++++++----------------
+ src/hb-shape.h             |  6 ++--
+ 3 files changed, 56 insertions(+), 29 deletions(-)
+
+commit d29d7b7a3dd2cfca151ce667a3290359d028911c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 1 13:10:11 2023 -0700
+
+    [algs] Adjust solve_itp
+
+ src/hb-algs.hh  | 11 +++++++----
+ src/hb-shape.cc |  4 ----
+ 2 files changed, 7 insertions(+), 8 deletions(-)
+
+commit aa10deaf4283822f8c368ecbdebd01330dd76fe5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 1 11:08:32 2023 -0700
+
+    [justify] Print default buffer width in hb-shape --width=-1
+
+ util/shape-options.hh | 25 ++++++++++++++++++++++---
+ 1 file changed, 22 insertions(+), 3 deletions(-)
+
+commit 93252c6fc3585f6c226514e9c476af82b7c55d86
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 1 10:59:04 2023 -0700
+
+    [justify] Debug output
+
+ src/hb-debug.hh |  4 ++++
+ src/hb-shape.cc | 11 ++++++++---
+ 2 files changed, 12 insertions(+), 3 deletions(-)
+
+commit b937edfb148d28421f97db7c3c81e2253019e469
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 1 10:44:57 2023 -0700
+
+    [justify] Add min/max target_width
+    
+    Speeds up solving when some slack available.
+
+ src/hb-algs.hh        |  8 +++++---
+ src/hb-shape.cc       | 32 ++++++++++++++++++--------------
+ src/hb-shape.h        |  3 ++-
+ util/shape-options.hh |  6 ++++--
+ 4 files changed, 29 insertions(+), 20 deletions(-)
+
+commit 6e483c4061b526c6c22db198194d4f8b2cfb3a86
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 28 12:25:32 2023 -0700
+
+    [shape] Add hb_shape_justify() and hb-view --width
+
+ src/hb-algs.hh        |   2 +-
+ src/hb-shape.cc       | 173 ++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-shape.h        |  11 ++++
+ util/shape-options.hh |  30 +++++++--
+ 4 files changed, 210 insertions(+), 6 deletions(-)
+
+commit ee4822f9696d2a40351a26d73257667a77af78ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 28 09:39:32 2023 -0700
+
+    [algs] Add solve_itp method
+    
+    Port from kurbo.
+
+ src/hb-algs.hh | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 53 insertions(+)
+
+commit c67c0086ef66e05228f9cc1f4c169f690e130511
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 1 13:32:44 2023 -0700
+
+    [GPOS] Fix indexing in MarkLigPos
+    
+    This was broken in 8708b9e081.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/4142
+
+ src/OT/Layout/GPOS/MarkLigPosFormat1.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 01d34763f06f0c513406dc14db6d496a08ecf4fa
+Author: Matthias Clasen <mclasen@redhat.com>
+Date:   Tue Feb 28 20:16:39 2023 -0500
+
+    Typo fix
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2d33a6b4dfdcd751eba242637c863d810a4a803c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 28 15:31:45 2023 -0700
+
+    [subset-fuzzer] Protect against overflow
+    
+    Fixes
+    https://github.com/harfbuzz/harfbuzz/issues/4137#issuecomment-1448994447
+
+ test/fuzzing/hb-subset-fuzzer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5226d697338756e661c951af28c19b9a69b4ff93
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 28 14:49:44 2023 -0700
+
+    [font] Make set_variation() respect currently-set variations
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/4143
+
+ src/hb-font.cc | 27 ++++++++++++++++++---------
+ 1 file changed, 18 insertions(+), 9 deletions(-)
+
+commit 91627daee2970b26666d8d9d47161387511667d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 28 14:31:25 2023 -0700
+
+    [outline] Rename internal function
+
+ src/hb-outline.cc | 4 ++--
+ src/hb-outline.hh | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 5c462865920681246422a1d23d38cc62a94f1870
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 28 12:16:46 2023 -0700
+
+    Revert "."
+    
+    This reverts commit 59434578cd453d9dcdcaf5d010d5f5686c17717e.
+
+ src/hb-shape.cc | 84 ---------------------------------------------------------
+ src/hb-shape.h  |  9 -------
+ 2 files changed, 93 deletions(-)
+
+commit 59434578cd453d9dcdcaf5d010d5f5686c17717e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 28 12:13:55 2023 -0700
+
+    .
+
+ src/hb-shape.cc | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-shape.h  |  9 +++++++
+ 2 files changed, 93 insertions(+)
+
+commit bbb9d6d436b7fb5aba771c63378aa4daa231b8c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 28 12:07:48 2023 -0700
+
+    [font] Add hb_font_set_variation()
+
+ docs/harfbuzz-sections.txt |  1 +
+ src/hb-font.cc             | 64 ++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-font.h              |  5 ++++
+ 3 files changed, 70 insertions(+)
+
+commit a975ec4842468e574484bdc310095fad780978fc
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Feb 14 13:26:59 2023 -0800
+
+    [instancer] apply cvar deltas
+
+ src/hb-ot-face-table-list.hh                       |   1 +
+ src/hb-ot-var-cvar-table.hh                        |  27 +++++++++++++--------
+ src/hb-subset-input.cc                             |   1 -
+ src/hb-subset.cc                                   |  11 +++++++++
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...r-new.default.retain-all-codepoint.wght=300.ttf | Bin 0 -> 131712 bytes
+ ...r-new.default.retain-all-codepoint.wght=700.ttf | Bin 0 -> 131588 bytes
+ test/subset/data/tests/apply_cvar_delta.tests      |  12 +++++++++
+ test/subset/meson.build                            |   1 +
+ 10 files changed, 44 insertions(+), 11 deletions(-)
+
+commit 8b0c7b9554cc75d499bc0aa9c25f45e53a1f2ce9
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri Feb 10 09:49:09 2023 -0800
+
+    [instance] Add struct definition for cvar table
+    
+    Also add functions to add cvt tables with cvar deltas applied
+
+ src/Makefile.sources        |   1 +
+ src/hb-ot-var-common.hh     |  19 ++++++
+ src/hb-ot-var-cvar-table.hh | 151 ++++++++++++++++++++++++++++++++++++++++++++
+ src/meson.build             |   1 +
+ 4 files changed, 172 insertions(+)
+
+commit 22cc73f3e9b941be47330a574599cddd79811168
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Mon Feb 6 12:36:05 2023 -0800
+
+    Move common structs for TupleVariation from gvar to var-common.hh
+    
+    Also added a table_base in the iterator and related function to handle
+    different start address for dataoffset in cvar and gvar
+
+ src/hb-ot-var-common.hh     | 308 +++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-var-gvar-table.hh | 309 +-------------------------------------------
+ 2 files changed, 312 insertions(+), 305 deletions(-)
+
+commit c0fac016dc017596e2d979e19e1eb8f88df38ea3
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 22 20:54:20 2023 +0000
+
+    [subset] update the subset fuzzer to be able to reach instancing code.
+
+ test/fuzzing/fonts/AdobeVFPrototype.ABC.otf | Bin 0 -> 4724 bytes
+ test/fuzzing/fonts/Roboto-Variable.ABC.ttf  | Bin 0 -> 13480 bytes
+ test/fuzzing/hb-subset-fuzzer.cc            |  49 +++++++++++++++++++++++-----
+ 3 files changed, 41 insertions(+), 8 deletions(-)
+
+commit 62fc27f372779d363cb6ba46cfaca6433a42504b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 27 11:20:47 2023 -0700
+
+    [ft] Enlarge glyph-cache value-size again
+    
+    8bits just doesn't do it. It has caused cache-hammering and high
+    CPU usage when the font is hinted.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/4139
+
+ src/hb-ft.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 921eca3e79df93af8ee16a47994150d1f4845bfc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 24 17:06:43 2023 -0700
+
+    [autotools] Fix hb-info chafa build
+
+ util/Makefile.am | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit 209f63b7850f836e5e3628523f6f740e25008409
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 24 16:03:23 2023 -0700
+
+    [TINY] Fix config issue
+
+ src/hb-config.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 605aed0544e51fa2534a3324262f3935d4dcfe99
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri Feb 24 10:17:32 2023 -0800
+
+    [instancer] bug fix in post table applying mvar deltas
+
+ src/hb-ot-post-table.hh                                 |   8 ++++----
+ test/subset/data/Makefile.am                            |   1 +
+ test/subset/data/Makefile.sources                       |   1 +
+ ...l-codepoint.wght=400,CASL=0,CRSV=0,MONO=0,slnt=0.ttf | Bin 0 -> 1884 bytes
+ test/subset/data/fonts/Recursive-ABC.ttf                | Bin 0 -> 20332 bytes
+ test/subset/data/tests/post_apply_mvar_delta.tests      |  11 +++++++++++
+ test/subset/meson.build                                 |   1 +
+ 7 files changed, 18 insertions(+), 4 deletions(-)
+
+commit 918193ebf908d35c88bb71d02dfc14bc41ffc31d
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 22 23:11:29 2023 +0000
+
+    [subset] fix a class of fuzzer timeouts caused by large shared coverage tables.
+    
+    More acurately estimates the op count for CoverageFormat2 tables as the population size instead of the size in bytes.
+
+ src/OT/Layout/GPOS/SinglePosFormat1.hh                  |   8 +++++++-
+ src/OT/Layout/GSUB/SingleSubstFormat1.hh                |   8 +++++++-
+ src/hb-sanitize.hh                                      |   8 ++++++++
+ ...testcase-minimized-hb-subset-fuzzer-5192684970311680 | Bin 0 -> 67697 bytes
+ 4 files changed, 22 insertions(+), 2 deletions(-)
+
+commit ddd0f7f40b5cae71271fcfa7b6143066d8e465df
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 22 20:23:34 2023 +0000
+
+    [subset] Add a test for CFF2 instancing.
+    
+    Adds option to disable the fonttools comparison check in the test. This is needed since CFF2 instancing is not yet supported in fonttools.
+
+ test/subset/data/Makefile.am                        |   1 +
+ test/subset/data/Makefile.sources                   |   1 +
+ ...efault.retain-all-codepoint.wght=650,CNTR=50.otf | Bin 0 -> 41760 bytes
+ test/subset/data/tests/instantiate_cff2.tests       |  14 ++++++++++++++
+ test/subset/generate-expected-outputs.py            |  20 +++++++++++---------
+ test/subset/meson.build                             |   1 +
+ test/subset/subset_test_suite.py                    |  13 ++++++++-----
+ 7 files changed, 36 insertions(+), 14 deletions(-)
+
+commit 33cc3121d457b415f3fac2374af7df5cd4fd704e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 22 12:03:30 2023 -0700
+
+    Comment
+
+ src/hb-shaper-list.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5bc6ab006da7dbab993867c3d7d24cefaa81b51c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 22 08:08:11 2023 -0700
+
+    Use __has_builtin for builtin checks instead of compiler versions
+    
+    https://github.com/harfbuzz/harfbuzz/issues/4066#issuecomment-1439510188
+
+ src/hb-algs.hh | 30 ++++++++++++++++++++++--------
+ src/hb.hh      | 10 +++++++++-
+ 2 files changed, 31 insertions(+), 9 deletions(-)
+
+commit 6b286cfabf23c93ecec6d65f83d8c1291cd46cf6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 21 16:15:45 2023 -0700
+
+    [cubic-glyf] Remove stale comment
+
+ src/OT/glyf/path-builder.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 22b93156281dae8772b15e68b2553a2a9a5c8367
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 21 15:50:55 2023 -0700
+
+    [cubic-glyf] Handle wrap-around cubic off-curves
+
+ src/OT/glyf/path-builder.hh | 30 ++++++++++++++++++++----------
+ 1 file changed, 20 insertions(+), 10 deletions(-)
+
+commit 050f5a58fe182f8f2bf85c95fc2ddc13bc784699
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 21 15:25:59 2023 -0700
+
+    [cubic-glyf] Handle contour-initial cubic offcurves
+
+ src/OT/glyf/path-builder.hh | 15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+commit 9c27fe625f592fdb97dc94c4006f928877e7cb61
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Feb 21 23:25:14 2023 +0200
+
+    Revert "[doc] Fix a couple of gtk-doc warnings"
+    
+    This reverts commit ed42b2fcb556a1d47a620f77cc98069123d1670c.
+
+ docs/harfbuzz-sections.txt | 1 -
+ src/hb-gobject-structs.cc  | 2 +-
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit ed42b2fcb556a1d47a620f77cc98069123d1670c
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Feb 21 23:08:15 2023 +0200
+
+    [doc] Fix a couple of gtk-doc warnings
+
+ docs/harfbuzz-sections.txt | 1 +
+ src/hb-gobject-structs.cc  | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 0575229477006a51f85eee10c9490db92972d60a
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Feb 21 18:07:53 2023 +0200
+
+    [blob] Typo in documentation
+
+ src/hb-blob.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 424f5f2c0d10596abc79d98bc165cd9e86680597
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Feb 20 16:05:53 2023 +0200
+
+    [ci] Don’t build docs while building Windows binaries
+
+ .circleci/config.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
 commit 1d1f93a612ed071b703abab7deb0951f46a12433
 Author: Khaled Hosny <khaled@aliftype.com>
 Date:   Mon Feb 20 15:54:12 2023 +0200
diff --git a/source/libs/harfbuzz/harfbuzz-src/NEWS b/source/libs/harfbuzz/harfbuzz-src/NEWS
index 9a5914525..5ed287822 100644
--- a/source/libs/harfbuzz/harfbuzz-src/NEWS
+++ b/source/libs/harfbuzz/harfbuzz-src/NEWS
@@ -1,3 +1,13 @@
+Overview of changes leading to 7.1.0
+Friday, March 3, 2023
+====================================
+- New experimental hb_shape_justify() API that uses font variations to expand
+  or shrink the text to a given advance. (Behdad Esfahbod)
+- Various build and bug fixes. (Behdad Esfahbod, Garret Rieger, Qunxin Liu)
+
+- New API:
++hb_font_set_variation()
+
 Overview of changes leading to 7.0.1
 Monday, February 20, 2023
 ====================================
diff --git a/source/libs/harfbuzz/harfbuzz-src/configure.ac b/source/libs/harfbuzz/harfbuzz-src/configure.ac
index 099259a27..c863ab83b 100644
--- a/source/libs/harfbuzz/harfbuzz-src/configure.ac
+++ b/source/libs/harfbuzz/harfbuzz-src/configure.ac
@@ -1,6 +1,6 @@
 AC_PREREQ([2.64])
 AC_INIT([HarfBuzz],
-        [7.0.1],
+        [7.1.0],
         [https://github.com/harfbuzz/harfbuzz/issues/new],
         [harfbuzz],
         [http://harfbuzz.org/])
diff --git a/source/libs/harfbuzz/harfbuzz-src/meson.build b/source/libs/harfbuzz/harfbuzz-src/meson.build
index 1515257c9..6bf8d05da 100644
--- a/source/libs/harfbuzz/harfbuzz-src/meson.build
+++ b/source/libs/harfbuzz/harfbuzz-src/meson.build
@@ -1,6 +1,6 @@
 project('harfbuzz', 'c', 'cpp',
   meson_version: '>= 0.55.0',
-  version: '7.0.1',
+  version: '7.1.0',
   default_options: [
     'cpp_eh=none',          # Just to support msvc, we are passing -fno-exceptions also anyway
     'cpp_rtti=false',       # Just to support msvc, we are passing -fno-rtti also anyway
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources b/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources
index 9a96ad69f..fd7c3b55e 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources
+++ b/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources
@@ -225,6 +225,7 @@ HB_BASE_sources = \
 	hb-ot-tag.cc \
 	hb-ot-var-avar-table.hh \
 	hb-ot-var-common.hh \
+	hb-ot-var-cvar-table.hh \
 	hb-ot-var-fvar-table.hh \
 	hb-ot-var-gvar-table.hh \
 	hb-ot-var-hvar-table.hh \
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkLigPosFormat1.hh b/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkLigPosFormat1.hh
index 7e7b438aa..92e83a0e9 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkLigPosFormat1.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkLigPosFormat1.hh
@@ -126,15 +126,15 @@ struct MarkLigPosFormat1_2
       return_trace (false);
     }
 
-    j = (unsigned) c->last_base;
+    unsigned idx = (unsigned) c->last_base;
 
     /* Checking that matched glyph is actually a ligature by GDEF is too strong; disabled */
-    //if (!_hb_glyph_info_is_ligature (&buffer->info[j])) { return_trace (false); }
+    //if (!_hb_glyph_info_is_ligature (&buffer->info[idx])) { return_trace (false); }
 
-    unsigned int lig_index = (this+ligatureCoverage).get_coverage  (buffer->info[j].codepoint);
+    unsigned int lig_index = (this+ligatureCoverage).get_coverage  (buffer->info[idx].codepoint);
     if (lig_index == NOT_COVERED)
     {
-      buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1);
+      buffer->unsafe_to_concat_from_outbuffer (idx, buffer->idx + 1);
       return_trace (false);
     }
 
@@ -145,7 +145,7 @@ struct MarkLigPosFormat1_2
     unsigned int comp_count = lig_attach.rows;
     if (unlikely (!comp_count))
     {
-      buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1);
+      buffer->unsafe_to_concat_from_outbuffer (idx, buffer->idx + 1);
       return_trace (false);
     }
 
@@ -154,7 +154,7 @@ struct MarkLigPosFormat1_2
      * can directly use the component index.  If not, we attach the mark
      * glyph to the last component of the ligature. */
     unsigned int comp_index;
-    unsigned int lig_id = _hb_glyph_info_get_lig_id (&buffer->info[j]);
+    unsigned int lig_id = _hb_glyph_info_get_lig_id (&buffer->info[idx]);
     unsigned int mark_id = _hb_glyph_info_get_lig_id (&buffer->cur());
     unsigned int mark_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
     if (lig_id && lig_id == mark_id && mark_comp > 0)
@@ -162,7 +162,7 @@ struct MarkLigPosFormat1_2
     else
       comp_index = comp_count - 1;
 
-    return_trace ((this+markArray).apply (c, mark_index, comp_index, lig_attach, classCount, j));
+    return_trace ((this+markArray).apply (c, mark_index, comp_index, lig_attach, classCount, idx));
   }
 
   bool subset (hb_subset_context_t *c) const
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/SinglePosFormat1.hh b/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/SinglePosFormat1.hh
index f7a170f34..623e4e66b 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/SinglePosFormat1.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/SinglePosFormat1.hh
@@ -28,7 +28,15 @@ struct SinglePosFormat1
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
                   coverage.sanitize (c, this) &&
+                  /* The coverage  table may use a range to represent a set
+                   * of glyphs, which means a small number of bytes can
+                   * generate a large glyph set. Manually modify the
+                   * sanitizer max ops to take this into account.
+                   *
+                   * Note: This check *must* be right after coverage sanitize. */
+                  c->check_ops ((this + coverage).get_population () >> 1) &&
                   valueFormat.sanitize_value (c, this, values));
+
   }
 
   bool intersects (const hb_set_t *glyphs) const
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubstFormat1.hh b/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubstFormat1.hh
index 78725352c..5b54fdb07 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubstFormat1.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubstFormat1.hh
@@ -25,7 +25,15 @@ struct SingleSubstFormat1_3
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (coverage.sanitize (c, this) && deltaGlyphID.sanitize (c));
+    return_trace (c->check_struct (this) &&
+                  coverage.sanitize (c, this) &&
+                  /* The coverage  table may use a range to represent a set
+                   * of glyphs, which means a small number of bytes can
+                   * generate a large glyph set. Manually modify the
+                   * sanitizer max ops to take this into account.
+                   *
+                   * Note: This check *must* be right after coverage sanitize. */
+                  c->check_ops ((this + coverage).get_population () >> 1));
   }
 
   hb_codepoint_t get_mask () const
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/path-builder.hh b/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/path-builder.hh
index e35a4dafd..8916241f7 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/path-builder.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/path-builder.hh
@@ -26,13 +26,13 @@ struct path_builder_t
 
     optional_point_t lerp (optional_point_t p, float t)
     { return optional_point_t (x + t * (p.x - x), y + t * (p.y - y)); }
-  } first_oncurve, first_offcurve, last_offcurve, last_offcurve2;
+  } first_oncurve, first_offcurve, first_offcurve2, last_offcurve, last_offcurve2;
 
   path_builder_t (hb_font_t *font_, hb_draw_session_t &draw_session_)
   {
     font = font_;
     draw_session = &draw_session_;
-    first_oncurve = first_offcurve = last_offcurve = last_offcurve2 = optional_point_t ();
+    first_oncurve = first_offcurve = first_offcurve2 = last_offcurve = last_offcurve2 = optional_point_t ();
   }
 
   /* based on https://github.com/RazrFalcon/ttf-parser/blob/4f32821/src/glyf.rs#L287
@@ -40,7 +40,7 @@ struct path_builder_t
      * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM01/Chap1.html
      * https://stackoverflow.com/a/20772557
      *
-     * Cubic support added (incomplete). */
+     * Cubic support added. */
   void consume_point (const contour_point_t &point)
   {
     bool is_on_curve = point.flag & glyf_impl::SimpleGlyph::FLAG_ON_CURVE;
@@ -59,7 +59,12 @@ struct path_builder_t
       }
       else
       {
-	if (first_offcurve)
+	if (is_cubic && !first_offcurve2)
+	{
+	  first_offcurve2 = first_offcurve;
+	  first_offcurve = p;
+	}
+	else if (first_offcurve)
 	{
 	  optional_point_t mid = first_offcurve.lerp (p, .5f);
 	  first_oncurve = mid;
@@ -126,16 +131,30 @@ struct path_builder_t
     {
       if (first_offcurve && last_offcurve)
       {
-	optional_point_t mid = last_offcurve.lerp (first_offcurve, .5f);
-	draw_session->quadratic_to (last_offcurve.x, last_offcurve.y,
-				   mid.x, mid.y);
+	optional_point_t mid = last_offcurve.lerp (first_offcurve2 ?
+						   first_offcurve2 :
+						   first_offcurve, .5f);
+	if (last_offcurve2)
+	  draw_session->cubic_to (last_offcurve2.x, last_offcurve2.y,
+				  last_offcurve.x, last_offcurve.y,
+				  mid.x, mid.y);
+	else
+	  draw_session->quadratic_to (last_offcurve.x, last_offcurve.y,
+				     mid.x, mid.y);
 	last_offcurve = optional_point_t ();
-	/* now check the rest */
       }
+      /* now check the rest */
 
       if (first_offcurve && first_oncurve)
-	draw_session->quadratic_to (first_offcurve.x, first_offcurve.y,
-				   first_oncurve.x, first_oncurve.y);
+      {
+        if (first_offcurve2)
+	  draw_session->cubic_to (first_offcurve2.x, first_offcurve2.y,
+				  first_offcurve.x, first_offcurve.y,
+				  first_oncurve.x, first_oncurve.y);
+	else
+	  draw_session->quadratic_to (first_offcurve.x, first_offcurve.y,
+				     first_oncurve.x, first_oncurve.y);
+      }
       else if (last_offcurve && first_oncurve)
       {
 	if (last_offcurve2)
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py b/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py
index 9b4efd4f3..6011817bc 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py
+++ b/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py
@@ -19,7 +19,8 @@ symbols = sorted (re.findall (r"^hb_\w+(?= \()", "\n".join (headers_content), re
 if '--experimental-api' not in sys.argv:
 	# Move these to harfbuzz-sections.txt when got stable
 	experimental_symbols = \
-"""hb_subset_repack_or_fail
+"""hb_shape_justify
+hb_subset_repack_or_fail
 hb_subset_input_override_name_table
 """.splitlines ()
 	symbols = [x for x in symbols if x not in experimental_symbols]
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-algs.hh b/source/libs/harfbuzz/harfbuzz-src/src/hb-algs.hh
index e98645e3e..13587eac0 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-algs.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-algs.hh
@@ -110,9 +110,10 @@ struct BEInt<Type, 2>
   constexpr operator Type () const
   {
 #if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \
-    ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \
     defined(__BYTE_ORDER) && \
-    (__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN)
+    (__BYTE_ORDER == __BIG_ENDIAN || \
+     (__BYTE_ORDER == __LITTLE_ENDIAN && \
+      hb_has_builtin(__builtin_bswap16)))
     /* Spoon-feed the compiler a big-endian integer with alignment 1.
      * https://github.com/harfbuzz/harfbuzz/pull/1398 */
 #if __BYTE_ORDER == __LITTLE_ENDIAN
@@ -155,9 +156,10 @@ struct BEInt<Type, 4>
   struct __attribute__((packed)) packed_uint32_t { uint32_t v; };
   constexpr operator Type () const {
 #if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \
-    ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \
     defined(__BYTE_ORDER) && \
-    (__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN)
+    (__BYTE_ORDER == __BIG_ENDIAN || \
+     (__BYTE_ORDER == __LITTLE_ENDIAN && \
+      hb_has_builtin(__builtin_bswap32)))
     /* Spoon-feed the compiler a big-endian integer with alignment 1.
      * https://github.com/harfbuzz/harfbuzz/pull/1398 */
 #if __BYTE_ORDER == __LITTLE_ENDIAN
@@ -598,13 +600,17 @@ template <typename T>
 static inline unsigned int
 hb_popcount (T v)
 {
-#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__)
+#if hb_has_builtin(__builtin_popcount)
   if (sizeof (T) <= sizeof (unsigned int))
     return __builtin_popcount (v);
+#endif
 
+#if hb_has_builtin(__builtin_popcountl)
   if (sizeof (T) <= sizeof (unsigned long))
     return __builtin_popcountl (v);
+#endif
 
+#if hb_has_builtin(__builtin_popcountll)
   if (sizeof (T) <= sizeof (unsigned long long))
     return __builtin_popcountll (v);
 #endif
@@ -641,13 +647,17 @@ hb_bit_storage (T v)
 {
   if (unlikely (!v)) return 0;
 
-#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__)
+#if hb_has_builtin(__builtin_clz)
   if (sizeof (T) <= sizeof (unsigned int))
     return sizeof (unsigned int) * 8 - __builtin_clz (v);
+#endif
 
+#if hb_has_builtin(__builtin_clzl)
   if (sizeof (T) <= sizeof (unsigned long))
     return sizeof (unsigned long) * 8 - __builtin_clzl (v);
+#endif
 
+#if hb_has_builtin(__builtin_clzll)
   if (sizeof (T) <= sizeof (unsigned long long))
     return sizeof (unsigned long long) * 8 - __builtin_clzll (v);
 #endif
@@ -715,13 +725,17 @@ hb_ctz (T v)
 {
   if (unlikely (!v)) return 8 * sizeof (T);
 
-#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__)
+#if hb_has_builtin(__builtin_ctz)
   if (sizeof (T) <= sizeof (unsigned int))
     return __builtin_ctz (v);
+#endif
 
+#if hb_has_builtin(__builtin_ctzl)
   if (sizeof (T) <= sizeof (unsigned long))
     return __builtin_ctzl (v);
+#endif
 
+#if hb_has_builtin(__builtin_ctzll)
   if (sizeof (T) <= sizeof (unsigned long long))
     return __builtin_ctzll (v);
 #endif
@@ -875,7 +889,7 @@ hb_in_ranges (T u, T lo1, T hi1, Ts... ds)
 static inline bool
 hb_unsigned_mul_overflows (unsigned int count, unsigned int size, unsigned *result = nullptr)
 {
-#if (defined(__GNUC__) && (__GNUC__ >= 4)) || (defined(__clang__) && (__clang_major__ >= 8))
+#if hb_has_builtin(__builtin_mul_overflow)
   unsigned stack_result;
   if (!result)
     result = &stack_result;
@@ -1330,4 +1344,62 @@ struct
 HB_FUNCOBJ (hb_dec);
 
 
+/* Adapted from kurbo implementation with extra parameters added,
+ * and finding for a particular range instead of 0.
+ *
+ * For documentation and implementation see:
+ *
+ * [ITP method]: https://en.wikipedia.org/wiki/ITP_Method
+ * [An Enhancement of the Bisection Method Average Performance Preserving Minmax Optimality]: https://dl.acm.org/doi/10.1145/3423597
+ * https://docs.rs/kurbo/0.8.1/kurbo/common/fn.solve_itp.html
+ * https://github.com/linebender/kurbo/blob/fd839c25ea0c98576c7ce5789305822675a89938/src/common.rs#L162-L248
+ */
+template <typename func_t>
+double solve_itp (func_t f,
+		  double a, double b,
+		  double epsilon,
+		  double min_y, double max_y,
+		  double &ya, double &yb, double &y)
+{
+  unsigned n1_2 = (unsigned) (hb_max (ceil (log2 ((b - a) / epsilon)) - 1.0, 0.0));
+  const unsigned n0 = 1; // Hardwired
+  const double k1 = 0.2 / (b - a); // Hardwired.
+  unsigned nmax = n0 + n1_2;
+  double scaled_epsilon = epsilon * double (1llu << nmax);
+  double _2_epsilon = 2.0 * epsilon;
+  while (b - a > _2_epsilon)
+  {
+    double x1_2 = 0.5 * (a + b);
+    double r = scaled_epsilon - 0.5 * (b - a);
+    double xf = (yb * a - ya * b) / (yb - ya);
+    double sigma = x1_2 - xf;
+    double b_a = b - a;
+    // This has k2 = 2 hardwired for efficiency.
+    double b_a_k2 = b_a * b_a;
+    double delta = k1 * b_a_k2;
+    int sigma_sign = sigma >= 0 ? +1 : -1;
+    double xt = delta <= fabs (x1_2 - xf) ? xf + delta * sigma_sign : x1_2;
+    double xitp = fabs (xt - x1_2) <= r ? xt : x1_2 - r * sigma_sign;
+    double yitp = f (xitp);
+    if (yitp > max_y)
+    {
+      b = xitp;
+      yb = yitp;
+    }
+    else if (yitp < min_y)
+    {
+      a = xitp;
+      ya = yitp;
+    }
+    else
+    {
+      y = yitp;
+      return xitp;
+    }
+    scaled_epsilon *= 0.5;
+  }
+  return 0.5 * (a + b);
+}
+
+
 #endif /* HB_ALGS_HH */
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h b/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h
index 4eb42314d..db50067e1 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h
@@ -63,7 +63,7 @@ HB_BEGIN_DECLS
  *   HarfBuzz and doing that just once (no reuse!),
  *
  * - If the font is mmap()ed, it's okay to use
- *   @HB_MEMORY_READONLY_MAY_MAKE_WRITABLE, however, using that mode
+ *   @HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, however, using that mode
  *   correctly is very tricky.  Use @HB_MEMORY_MODE_READONLY instead.
  **/
 typedef enum {
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text-glyphs.hh b/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text-glyphs.hh
index ea81273b3..5fe75659b 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text-glyphs.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text-glyphs.hh
@@ -32,7 +32,7 @@
 #include "hb.hh"
 
 
-#line 36 "hb-buffer-deserialize-text-glyphs.hh"
+#line 33 "hb-buffer-deserialize-text-glyphs.hh"
 static const unsigned char _deserialize_text_glyphs_trans_keys[] = {
 	0u, 0u, 48u, 57u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 
 	48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 43u, 124u, 9u, 124u, 9u, 124u, 
@@ -349,12 +349,12 @@ _hb_buffer_deserialize_text_glyphs (hb_buffer_t *buffer,
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
   
-#line 353 "hb-buffer-deserialize-text-glyphs.hh"
+#line 346 "hb-buffer-deserialize-text-glyphs.hh"
 	{
 	cs = deserialize_text_glyphs_start;
 	}
 
-#line 358 "hb-buffer-deserialize-text-glyphs.hh"
+#line 349 "hb-buffer-deserialize-text-glyphs.hh"
 	{
 	int _slen;
 	int _trans;
@@ -550,7 +550,7 @@ _resume:
 	*end_ptr = p;
 }
 	break;
-#line 554 "hb-buffer-deserialize-text-glyphs.hh"
+#line 516 "hb-buffer-deserialize-text-glyphs.hh"
 	}
 
 _again:
@@ -667,7 +667,7 @@ _again:
 	*end_ptr = p;
 }
 	break;
-#line 671 "hb-buffer-deserialize-text-glyphs.hh"
+#line 616 "hb-buffer-deserialize-text-glyphs.hh"
 	}
 	}
 
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-config.hh b/source/libs/harfbuzz/harfbuzz-src/src/hb-config.hh
index 047518b87..52adaad43 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-config.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-config.hh
@@ -136,6 +136,10 @@
 #define HB_NO_SUBSET_CFF
 #endif
 
+#ifdef HB_NO_DRAW
+#define HB_NO_OUTLINE
+#endif
+
 #ifdef HB_NO_GETENV
 #define HB_NO_UNISCRIBE_BUG_COMPATIBLE
 #endif
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh b/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh
index efab37464..0ac4515fa 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh
@@ -373,6 +373,10 @@ struct hb_no_trace_t {
 #define HB_DEBUG_FT (HB_DEBUG+0)
 #endif
 
+#ifndef HB_DEBUG_JUSTIFY
+#define HB_DEBUG_JUSTIFY (HB_DEBUG+0)
+#endif
+
 #ifndef HB_DEBUG_OBJECT
 #define HB_DEBUG_OBJECT (HB_DEBUG+0)
 #endif
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc b/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc
index 386886310..1b345a944 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc
@@ -2649,6 +2649,79 @@ hb_font_set_variations (hb_font_t            *font,
   _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length);
 }
 
+/**
+ * hb_font_set_variation:
+ * @font: #hb_font_t to work upon
+ * @tag: The #hb_tag_t tag of the variation-axis name
+ * @value: The value of the variation axis
+ *
+ * Change the value of one variation axis on the font.
+ *
+ * Note: This function is expensive to be called repeatedly.
+ *   If you want to set multiple variation axes at the same time,
+ *   use hb_font_set_variations() instead.
+ *
+ * Since: 7.1.0
+ */
+void
+hb_font_set_variation (hb_font_t *font,
+		       hb_tag_t tag,
+		       float    value)
+{
+  if (hb_object_is_immutable (font))
+    return;
+
+  font->serial_coords = ++font->serial;
+
+  // TODO Share some of this code with set_variations()
+
+  const OT::fvar &fvar = *font->face->table.fvar;
+  auto axes = fvar.get_axes ();
+  const unsigned coords_length = axes.length;
+
+  int *normalized = coords_length ? (int *) hb_calloc (coords_length, sizeof (int)) : nullptr;
+  float *design_coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (float)) : nullptr;
+
+  if (unlikely (coords_length && !(normalized && design_coords)))
+  {
+    hb_free (normalized);
+    hb_free (design_coords);
+    return;
+  }
+
+  /* Initialize design coords. */
+  if (font->design_coords)
+  {
+    assert (coords_length == font->num_coords);
+    for (unsigned int i = 0; i < coords_length; i++)
+      design_coords[i] = font->design_coords[i];
+  }
+  else
+  {
+    for (unsigned int i = 0; i < coords_length; i++)
+      design_coords[i] = axes[i].get_default ();
+    if (font->instance_index != HB_FONT_NO_VAR_NAMED_INSTANCE)
+    {
+      unsigned count = coords_length;
+      /* This may fail if index is out-of-range;
+       * That's why we initialize design_coords from fvar above
+       * unconditionally. */
+      hb_ot_var_named_instance_get_design_coords (font->face, font->instance_index,
+						  &count, design_coords);
+    }
+  }
+
+  for (unsigned axis_index = 0; axis_index < coords_length; axis_index++)
+    if (axes[axis_index].axisTag == tag)
+      design_coords[axis_index] = value;
+
+  font->face->table.avar->map_coords (normalized, coords_length);
+
+  hb_ot_var_normalize_coords (font->face, coords_length, design_coords, normalized);
+  _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length);
+
+}
+
 /**
  * hb_font_set_var_coords_design:
  * @font: #hb_font_t to work upon
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h b/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h
index 69457da57..f3b589bd0 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h
@@ -1150,6 +1150,11 @@ hb_font_set_variations (hb_font_t *font,
 			const hb_variation_t *variations,
 			unsigned int variations_length);
 
+HB_EXTERN void
+hb_font_set_variation (hb_font_t *font,
+		       hb_tag_t tag,
+		       float    value);
+
 HB_EXTERN void
 hb_font_set_var_coords_design (hb_font_t *font,
 			       const float *coords,
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc b/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc
index 4bc10e062..1105862fb 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc
@@ -85,7 +85,7 @@
  */
 
 
-using hb_ft_advance_cache_t = hb_cache_t<16, 8, 8, false>;
+using hb_ft_advance_cache_t = hb_cache_t<16, 24, 8, false>;
 
 struct hb_ft_font_t
 {
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-map.cc b/source/libs/harfbuzz/harfbuzz-src/src/hb-map.cc
index 0014570e8..5d67cd9a1 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-map.cc
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-map.cc
@@ -399,7 +399,7 @@ void
 hb_map_keys (const hb_map_t *map,
 	     hb_set_t *keys)
 {
-  map->keys (*keys);
+  hb_copy (map->keys() , *keys);
 }
 
 /**
@@ -415,5 +415,5 @@ void
 hb_map_values (const hb_map_t *map,
 	       hb_set_t *values)
 {
-  map->values (*values);
+  hb_copy (map->values() , *values);
 }
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh b/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh
index 615d1825e..552b40665 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh
@@ -317,16 +317,6 @@ struct hb_hashmap_t
     hb_copy (other, *this);
   }
 
-  void keys (hb_set_t &keys_) const
-  {
-    hb_copy (keys() , keys_);
-  }
-
-  void values (hb_set_t &values_) const
-  {
-    hb_copy (values() , values_);
-  }
-
   /*
    * Iterator
    */
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face-table-list.hh b/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face-table-list.hh
index c9da36c1b..b552dfdd9 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face-table-list.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face-table-list.hh
@@ -93,6 +93,7 @@ HB_OT_ACCELERATOR (OT, cff2)
 #ifndef HB_NO_VAR
 HB_OT_CORE_TABLE (OT, fvar)
 HB_OT_CORE_TABLE (OT, avar)
+HB_OT_CORE_TABLE (OT, cvar)
 HB_OT_ACCELERATOR (OT, gvar)
 HB_OT_CORE_TABLE (OT, MVAR)
 #endif
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh b/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh
index e0eb77094..042fa611a 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh
@@ -99,6 +99,10 @@ struct post
     post *post_prime = c->serializer->start_embed<post> ();
     if (unlikely (!post_prime)) return_trace (false);
 
+    bool glyph_names = c->plan->flags & HB_SUBSET_FLAGS_GLYPH_NAMES;
+    if (!serialize (c->serializer, glyph_names))
+      return_trace (false);
+
 #ifndef HB_NO_VAR
     if (c->plan->normalized_coords)
     {
@@ -110,10 +114,6 @@ struct post
     }
 #endif
 
-    bool glyph_names = c->plan->flags & HB_SUBSET_FLAGS_GLYPH_NAMES;
-    if (!serialize (c->serializer, glyph_names))
-      return_trace (false);
-
     if (c->plan->user_axes_location.has (HB_TAG ('s','l','n','t')) &&
         !c->plan->pinned_at_default)
     {
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shaper-myanmar-machine.hh b/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shaper-myanmar-machine.hh
index f7b456b11..809f6eefb 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shaper-myanmar-machine.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shaper-myanmar-machine.hh
@@ -50,7 +50,7 @@ enum myanmar_syllable_type_t {
 };
 
 
-#line 54 "hb-ot-shaper-myanmar-machine.hh"
+#line 51 "hb-ot-shaper-myanmar-machine.hh"
 #define myanmar_syllable_machine_ex_A 9u
 #define myanmar_syllable_machine_ex_As 32u
 #define myanmar_syllable_machine_ex_C 1u
@@ -77,7 +77,7 @@ enum myanmar_syllable_type_t {
 #define myanmar_syllable_machine_ex_ZWNJ 5u
 
 
-#line 81 "hb-ot-shaper-myanmar-machine.hh"
+#line 76 "hb-ot-shaper-myanmar-machine.hh"
 static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
 	1u, 41u, 3u, 41u, 5u, 39u, 5u, 8u, 3u, 41u, 3u, 39u, 3u, 39u, 5u, 39u, 
 	5u, 39u, 3u, 39u, 3u, 39u, 3u, 41u, 5u, 39u, 1u, 15u, 3u, 39u, 3u, 39u, 
@@ -443,7 +443,7 @@ find_syllables_myanmar (hb_buffer_t *buffer)
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 447 "hb-ot-shaper-myanmar-machine.hh"
+#line 436 "hb-ot-shaper-myanmar-machine.hh"
 	{
 	cs = myanmar_syllable_machine_start;
 	ts = 0;
@@ -459,7 +459,7 @@ find_syllables_myanmar (hb_buffer_t *buffer)
 
   unsigned int syllable_serial = 1;
   
-#line 463 "hb-ot-shaper-myanmar-machine.hh"
+#line 448 "hb-ot-shaper-myanmar-machine.hh"
 	{
 	int _slen;
 	int _trans;
@@ -473,7 +473,7 @@ _resume:
 #line 1 "NONE"
 	{ts = p;}
 	break;
-#line 477 "hb-ot-shaper-myanmar-machine.hh"
+#line 460 "hb-ot-shaper-myanmar-machine.hh"
 	}
 
 	_keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
@@ -519,7 +519,7 @@ _eof_trans:
 #line 113 "hb-ot-shaper-myanmar-machine.rl"
 	{te = p;p--;{ found_syllable (myanmar_non_myanmar_cluster); }}
 	break;
-#line 523 "hb-ot-shaper-myanmar-machine.hh"
+#line 498 "hb-ot-shaper-myanmar-machine.hh"
 	}
 
 _again:
@@ -528,7 +528,7 @@ _again:
 #line 1 "NONE"
 	{ts = 0;}
 	break;
-#line 532 "hb-ot-shaper-myanmar-machine.hh"
+#line 505 "hb-ot-shaper-myanmar-machine.hh"
 	}
 
 	if ( ++p != pe )
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-common.hh b/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-common.hh
index 4997c2e2e..cdc6a274c 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-common.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-common.hh
@@ -237,6 +237,333 @@ struct VarStoreInstancer
   hb_array_t<int> coords;
 };
 
+/* https://docs.microsoft.com/en-us/typography/opentype/spec/otvarcommonformats#tuplevariationheader */
+struct TupleVariationHeader
+{
+  unsigned get_size (unsigned axis_count) const
+  { return min_size + get_all_tuples (axis_count).get_size (); }
+
+  unsigned get_data_size () const { return varDataSize; }
+
+  const TupleVariationHeader &get_next (unsigned axis_count) const
+  { return StructAtOffset<TupleVariationHeader> (this, get_size (axis_count)); }
+
+  float calculate_scalar (hb_array_t<int> coords, unsigned int coord_count,
+                          const hb_array_t<const F2DOT14> shared_tuples) const
+  {
+    hb_array_t<const F2DOT14> peak_tuple;
+
+    if (has_peak ())
+      peak_tuple = get_peak_tuple (coord_count);
+    else
+    {
+      unsigned int index = get_index ();
+      if (unlikely (index * coord_count >= shared_tuples.length))
+        return 0.f;
+      peak_tuple = shared_tuples.sub_array (coord_count * index, coord_count);
+    }
+
+    hb_array_t<const F2DOT14> start_tuple;
+    hb_array_t<const F2DOT14> end_tuple;
+    if (has_intermediate ())
+    {
+      start_tuple = get_start_tuple (coord_count);
+      end_tuple = get_end_tuple (coord_count);
+    }
+
+    float scalar = 1.f;
+    for (unsigned int i = 0; i < coord_count; i++)
+    {
+      int v = coords[i];
+      int peak = peak_tuple[i].to_int ();
+      if (!peak || v == peak) continue;
+
+      if (has_intermediate ())
+      {
+        int start = start_tuple[i].to_int ();
+        int end = end_tuple[i].to_int ();
+        if (unlikely (start > peak || peak > end ||
+                      (start < 0 && end > 0 && peak))) continue;
+        if (v < start || v > end) return 0.f;
+        if (v < peak)
+        { if (peak != start) scalar *= (float) (v - start) / (peak - start); }
+        else
+        { if (peak != end) scalar *= (float) (end - v) / (end - peak); }
+      }
+      else if (!v || v < hb_min (0, peak) || v > hb_max (0, peak)) return 0.f;
+      else
+        scalar *= (float) v / peak;
+    }
+    return scalar;
+  }
+
+  bool           has_peak () const { return tupleIndex & TuppleIndex::EmbeddedPeakTuple; }
+  bool   has_intermediate () const { return tupleIndex & TuppleIndex::IntermediateRegion; }
+  bool has_private_points () const { return tupleIndex & TuppleIndex::PrivatePointNumbers; }
+  unsigned      get_index () const { return tupleIndex & TuppleIndex::TupleIndexMask; }
+
+  protected:
+  struct TuppleIndex : HBUINT16
+  {
+    enum Flags {
+      EmbeddedPeakTuple   = 0x8000u,
+      IntermediateRegion  = 0x4000u,
+      PrivatePointNumbers = 0x2000u,
+      TupleIndexMask      = 0x0FFFu
+    };
+
+    DEFINE_SIZE_STATIC (2);
+  };
+
+  hb_array_t<const F2DOT14> get_all_tuples (unsigned axis_count) const
+  { return StructAfter<UnsizedArrayOf<F2DOT14>> (tupleIndex).as_array ((has_peak () + has_intermediate () * 2) * axis_count); }
+  hb_array_t<const F2DOT14> get_peak_tuple (unsigned axis_count) const
+  { return get_all_tuples (axis_count).sub_array (0, axis_count); }
+  hb_array_t<const F2DOT14> get_start_tuple (unsigned axis_count) const
+  { return get_all_tuples (axis_count).sub_array (has_peak () * axis_count, axis_count); }
+  hb_array_t<const F2DOT14> get_end_tuple (unsigned axis_count) const
+  { return get_all_tuples (axis_count).sub_array (has_peak () * axis_count + axis_count, axis_count); }
+
+  HBUINT16      varDataSize;    /* The size in bytes of the serialized
+                                 * data for this tuple variation table. */
+  TuppleIndex   tupleIndex;     /* A packed field. The high 4 bits are flags (see below).
+                                   The low 12 bits are an index into a shared tuple
+                                   records array. */
+  /* UnsizedArrayOf<F2DOT14> peakTuple - optional */
+                                /* Peak tuple record for this tuple variation table — optional,
+                                 * determined by flags in the tupleIndex value.
+                                 *
+                                 * Note that this must always be included in the 'cvar' table. */
+  /* UnsizedArrayOf<F2DOT14> intermediateStartTuple - optional */
+                                /* Intermediate start tuple record for this tuple variation table — optional,
+                                   determined by flags in the tupleIndex value. */
+  /* UnsizedArrayOf<F2DOT14> intermediateEndTuple - optional */
+                                /* Intermediate end tuple record for this tuple variation table — optional,
+                                 * determined by flags in the tupleIndex value. */
+  public:
+  DEFINE_SIZE_MIN (4);
+};
+
+struct TupleVariationData
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    // here check on min_size only, TupleVariationHeader and var data will be
+    // checked while accessing through iterator.
+    return_trace (c->check_struct (this));
+  }
+
+  unsigned get_size (unsigned axis_count) const
+  {
+    unsigned total_size = min_size;
+    unsigned count = tupleVarCount;
+    const TupleVariationHeader& tuple_var_header = get_tuple_var_header();
+    for (unsigned i = 0; i < count; i++)
+      total_size += tuple_var_header.get_size (axis_count) + tuple_var_header.get_data_size ();
+
+    return total_size;
+  }
+
+  const TupleVariationHeader &get_tuple_var_header (void) const
+  { return StructAfter<TupleVariationHeader> (data); }
+
+  struct tuple_iterator_t
+  {
+    void init (hb_bytes_t var_data_bytes_, unsigned int axis_count_, const void *table_base_)
+    {
+      var_data_bytes = var_data_bytes_;
+      var_data = var_data_bytes_.as<TupleVariationData> ();
+      index = 0;
+      axis_count = axis_count_;
+      current_tuple = &var_data->get_tuple_var_header ();
+      data_offset = 0;
+      table_base = table_base_;
+    }
+
+    bool get_shared_indices (hb_vector_t<unsigned int> &shared_indices /* OUT */)
+    {
+      if (var_data->has_shared_point_numbers ())
+      {
+        const HBUINT8 *base = &(table_base+var_data->data);
+        const HBUINT8 *p = base;
+        if (!unpack_points (p, shared_indices, (const HBUINT8 *) (var_data_bytes.arrayZ + var_data_bytes.length))) return false;
+        data_offset = p - base;
+      }
+      return true;
+    }
+
+    bool is_valid () const
+    {
+      return (index < var_data->tupleVarCount.get_count ()) &&
+             var_data_bytes.check_range (current_tuple, TupleVariationHeader::min_size) &&
+             var_data_bytes.check_range (current_tuple, hb_max (current_tuple->get_data_size (),
+                                                                current_tuple->get_size (axis_count)));
+    }
+
+    bool move_to_next ()
+    {
+      data_offset += current_tuple->get_data_size ();
+      current_tuple = &current_tuple->get_next (axis_count);
+      index++;
+      return is_valid ();
+    }
+
+    const HBUINT8 *get_serialized_data () const
+    { return &(table_base+var_data->data) + data_offset; }
+
+    private:
+    const TupleVariationData *var_data;
+    unsigned int index;
+    unsigned int axis_count;
+    unsigned int data_offset;
+    const void *table_base;
+
+    public:
+    hb_bytes_t var_data_bytes;
+    const TupleVariationHeader *current_tuple;
+  };
+
+  static bool get_tuple_iterator (hb_bytes_t var_data_bytes, unsigned axis_count,
+                                  const void *table_base,
+                                  hb_vector_t<unsigned int> &shared_indices /* OUT */,
+                                  tuple_iterator_t *iterator /* OUT */)
+  {
+    iterator->init (var_data_bytes, axis_count, table_base);
+    if (!iterator->get_shared_indices (shared_indices))
+      return false;
+    return iterator->is_valid ();
+  }
+
+  bool has_shared_point_numbers () const { return tupleVarCount.has_shared_point_numbers (); }
+
+  static bool unpack_points (const HBUINT8 *&p /* IN/OUT */,
+                             hb_vector_t<unsigned int> &points /* OUT */,
+                             const HBUINT8 *end)
+  {
+    enum packed_point_flag_t
+    {
+      POINTS_ARE_WORDS     = 0x80,
+      POINT_RUN_COUNT_MASK = 0x7F
+    };
+
+    if (unlikely (p + 1 > end)) return false;
+
+    unsigned count = *p++;
+    if (count & POINTS_ARE_WORDS)
+    {
+      if (unlikely (p + 1 > end)) return false;
+      count = ((count & POINT_RUN_COUNT_MASK) << 8) | *p++;
+    }
+    if (unlikely (!points.resize (count, false))) return false;
+
+    unsigned n = 0;
+    unsigned i = 0;
+    while (i < count)
+    {
+      if (unlikely (p + 1 > end)) return false;
+      unsigned control = *p++;
+      unsigned run_count = (control & POINT_RUN_COUNT_MASK) + 1;
+      if (unlikely (i + run_count > count)) return false;
+      unsigned j;
+      if (control & POINTS_ARE_WORDS)
+      {
+        if (unlikely (p + run_count * HBUINT16::static_size > end)) return false;
+        for (j = 0; j < run_count; j++, i++)
+        {
+          n += *(const HBUINT16 *)p;
+          points.arrayZ[i] = n;
+          p += HBUINT16::static_size;
+        }
+      }
+      else
+      {
+        if (unlikely (p + run_count > end)) return false;
+        for (j = 0; j < run_count; j++, i++)
+        {
+          n += *p++;
+          points.arrayZ[i] = n;
+        }
+      }
+    }
+    return true;
+  }
+
+  static bool unpack_deltas (const HBUINT8 *&p /* IN/OUT */,
+                             hb_vector_t<int> &deltas /* IN/OUT */,
+                             const HBUINT8 *end)
+  {
+    enum packed_delta_flag_t
+    {
+      DELTAS_ARE_ZERO      = 0x80,
+      DELTAS_ARE_WORDS     = 0x40,
+      DELTA_RUN_COUNT_MASK = 0x3F
+    };
+
+    unsigned i = 0;
+    unsigned count = deltas.length;
+    while (i < count)
+    {
+      if (unlikely (p + 1 > end)) return false;
+      unsigned control = *p++;
+      unsigned run_count = (control & DELTA_RUN_COUNT_MASK) + 1;
+      if (unlikely (i + run_count > count)) return false;
+      unsigned j;
+      if (control & DELTAS_ARE_ZERO)
+      {
+        for (j = 0; j < run_count; j++, i++)
+          deltas.arrayZ[i] = 0;
+      }
+      else if (control & DELTAS_ARE_WORDS)
+      {
+        if (unlikely (p + run_count * HBUINT16::static_size > end)) return false;
+        for (j = 0; j < run_count; j++, i++)
+        {
+          deltas.arrayZ[i] = * (const HBINT16 *) p;
+          p += HBUINT16::static_size;
+        }
+      }
+      else
+      {
+        if (unlikely (p + run_count > end)) return false;
+        for (j = 0; j < run_count; j++, i++)
+        {
+          deltas.arrayZ[i] = * (const HBINT8 *) p++;
+        }
+      }
+    }
+    return true;
+  }
+
+  bool has_data () const { return tupleVarCount; }
+
+  protected:
+  struct TupleVarCount : HBUINT16
+  {
+    bool has_shared_point_numbers () const { return ((*this) & SharedPointNumbers); }
+    unsigned int get_count () const { return (*this) & CountMask; }
+
+    protected:
+    enum Flags
+    {
+      SharedPointNumbers= 0x8000u,
+      CountMask         = 0x0FFFu
+    };
+    public:
+    DEFINE_SIZE_STATIC (2);
+  };
+
+  TupleVarCount tupleVarCount;  /* A packed field. The high 4 bits are flags, and the
+                                 * low 12 bits are the number of tuple variation tables
+                                 * for this glyph. The number of tuple variation tables
+                                 * can be any number between 1 and 4095. */
+  Offset16To<HBUINT8>
+                data;           /* Offset from the start of the base table
+                                 * to the serialized data. */
+  /* TupleVariationHeader tupleVariationHeaders[] *//* Array of tuple variation headers. */
+  public:
+  DEFINE_SIZE_MIN (4);
+};
 
 } /* namespace OT */
 
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-cvar-table.hh b/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-cvar-table.hh
new file mode 100644
index 000000000..bdb2b6b23
--- /dev/null
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-cvar-table.hh
@@ -0,0 +1,158 @@
+/*
+ * Copyright © 2023  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ */
+
+#ifndef HB_OT_VAR_CVAR_TABLE_HH
+#define HB_OT_VAR_CVAR_TABLE_HH
+
+#include "hb-ot-var-common.hh"
+
+
+namespace OT {
+/*
+ * cvar -- control value table (CVT) Variations
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/cvar
+ */
+#define HB_OT_TAG_cvar HB_TAG('c','v','a','r')
+
+struct cvar
+{
+  static constexpr hb_tag_t tableTag = HB_OT_TAG_cvar;
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  version.sanitize (c) && likely (version.major == 1) &&
+		  tupleVariationData.sanitize (c));
+  }
+
+  const TupleVariationData* get_tuple_var_data (void) const
+  { return &tupleVariationData; }
+
+  static bool calculate_cvt_deltas (unsigned axis_count,
+                                    hb_array_t<int> coords,
+                                    unsigned num_cvt_item,
+                                    const TupleVariationData *tuple_var_data,
+                                    const void *base,
+                                    hb_vector_t<float>& cvt_deltas /* OUT */)
+  {
+    if (!coords) return true;
+    hb_vector_t<unsigned> shared_indices;
+    TupleVariationData::tuple_iterator_t iterator;
+    unsigned var_data_length = tuple_var_data->get_size (axis_count);
+    hb_bytes_t var_data_bytes = hb_bytes_t (reinterpret_cast<const char*> (tuple_var_data), var_data_length);
+    if (!TupleVariationData::get_tuple_iterator (var_data_bytes, axis_count, base,
+                                                 shared_indices, &iterator))
+      return true; /* isn't applied at all */
+
+    hb_array_t<const F2DOT14> shared_tuples = hb_array<F2DOT14> ();
+    hb_vector_t<unsigned> private_indices;
+    hb_vector_t<int> unpacked_deltas;
+
+    do
+    {
+      float scalar = iterator.current_tuple->calculate_scalar (coords, axis_count, shared_tuples);
+      if (scalar == 0.f) continue;
+      const HBUINT8 *p = iterator.get_serialized_data ();
+      unsigned int length = iterator.current_tuple->get_data_size ();
+      if (unlikely (!iterator.var_data_bytes.check_range (p, length)))
+        return false;
+
+      const HBUINT8 *end = p + length;
+
+      bool has_private_points = iterator.current_tuple->has_private_points ();
+      if (has_private_points &&
+          !TupleVariationData::unpack_points (p, private_indices, end))
+        return false;
+      const hb_vector_t<unsigned int> &indices = has_private_points ? private_indices : shared_indices;
+
+      bool apply_to_all = (indices.length == 0);
+      unsigned num_deltas = apply_to_all ? num_cvt_item : indices.length;
+      if (unlikely (!unpacked_deltas.resize (num_deltas, false))) return false;
+      if (unlikely (!TupleVariationData::unpack_deltas (p, unpacked_deltas, end))) return false;
+
+      for (unsigned int i = 0; i < num_deltas; i++)
+      {
+        unsigned int idx = apply_to_all ? i : indices[i];
+        if (unlikely (idx >= num_cvt_item)) continue;
+        if (scalar != 1.0f) cvt_deltas[idx] += unpacked_deltas[i] * scalar ;
+        else cvt_deltas[idx] += unpacked_deltas[i];
+      }
+    } while (iterator.move_to_next ());
+
+    return true;
+  }
+
+  static bool add_cvt_and_apply_deltas (hb_subset_plan_t *plan,
+                                        const TupleVariationData *tuple_var_data,
+                                        const void *base)
+  {
+    const hb_tag_t cvt = HB_TAG('c','v','t',' ');
+    hb_blob_t *cvt_blob = hb_face_reference_table (plan->source, cvt);
+    hb_blob_t *cvt_prime_blob = hb_blob_copy_writable_or_fail (cvt_blob);
+    hb_blob_destroy (cvt_blob);
+  
+    if (unlikely (!cvt_prime_blob))
+      return false;
+ 
+    unsigned cvt_blob_length = hb_blob_get_length (cvt_prime_blob);
+    unsigned num_cvt_item = cvt_blob_length / FWORD::static_size;
+
+    hb_vector_t<float> cvt_deltas;
+    if (unlikely (!cvt_deltas.resize (num_cvt_item)))
+    {
+      hb_blob_destroy (cvt_prime_blob);
+      return false;
+    }
+    hb_memset (cvt_deltas.arrayZ, 0, cvt_deltas.get_size ());
+
+    if (!calculate_cvt_deltas (plan->normalized_coords.length, plan->normalized_coords.as_array (),
+                               num_cvt_item, tuple_var_data, base, cvt_deltas))
+    {
+      hb_blob_destroy (cvt_prime_blob);
+      return false;
+    }
+
+    FWORD *cvt_prime = (FWORD *) hb_blob_get_data_writable (cvt_prime_blob, nullptr);
+    for (unsigned i = 0; i < num_cvt_item; i++)
+      cvt_prime[i] += (int) roundf (cvt_deltas[i]);
+    
+    bool success = plan->add_table (cvt, cvt_prime_blob);
+    hb_blob_destroy (cvt_prime_blob);
+    return success;
+  }
+
+  protected:
+  FixedVersion<>version;		/* Version of the CVT variation table
+					 * initially set to 0x00010000u */
+  TupleVariationData tupleVariationData; /* TupleVariationDate for cvar table */
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_VAR_CVAR_TABLE_HH */
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-gvar-table.hh b/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-gvar-table.hh
index 1eae6a353..d707a4633 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-gvar-table.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-gvar-table.hh
@@ -29,6 +29,7 @@
 #define HB_OT_VAR_GVAR_TABLE_HH
 
 #include "hb-open-type.hh"
+#include "hb-ot-var-common.hh"
 
 /*
  * gvar -- Glyph Variation Table
@@ -90,311 +91,8 @@ struct contour_point_vector_t : hb_vector_t<contour_point_t>
   }
 };
 
-/* https://docs.microsoft.com/en-us/typography/opentype/spec/otvarcommonformats#tuplevariationheader */
-struct TupleVariationHeader
-{
-  unsigned get_size (unsigned axis_count) const
-  { return min_size + get_all_tuples (axis_count).get_size (); }
-
-  unsigned get_data_size () const { return varDataSize; }
-
-  const TupleVariationHeader &get_next (unsigned axis_count) const
-  { return StructAtOffset<TupleVariationHeader> (this, get_size (axis_count)); }
-
-  float calculate_scalar (hb_array_t<int> coords, unsigned int coord_count,
-			  const hb_array_t<const F2DOT14> shared_tuples) const
-  {
-    hb_array_t<const F2DOT14> peak_tuple;
-
-    if (has_peak ())
-      peak_tuple = get_peak_tuple (coord_count);
-    else
-    {
-      unsigned int index = get_index ();
-      if (unlikely (index * coord_count >= shared_tuples.length))
-	return 0.f;
-      peak_tuple = shared_tuples.sub_array (coord_count * index, coord_count);
-    }
-
-    hb_array_t<const F2DOT14> start_tuple;
-    hb_array_t<const F2DOT14> end_tuple;
-    if (has_intermediate ())
-    {
-      start_tuple = get_start_tuple (coord_count);
-      end_tuple = get_end_tuple (coord_count);
-    }
-
-    float scalar = 1.f;
-    for (unsigned int i = 0; i < coord_count; i++)
-    {
-      int v = coords[i];
-      int peak = peak_tuple[i].to_int ();
-      if (!peak || v == peak) continue;
-
-      if (has_intermediate ())
-      {
-	int start = start_tuple[i].to_int ();
-	int end = end_tuple[i].to_int ();
-	if (unlikely (start > peak || peak > end ||
-		      (start < 0 && end > 0 && peak))) continue;
-	if (v < start || v > end) return 0.f;
-	if (v < peak)
-	{ if (peak != start) scalar *= (float) (v - start) / (peak - start); }
-	else
-	{ if (peak != end) scalar *= (float) (end - v) / (end - peak); }
-      }
-      else if (!v || v < hb_min (0, peak) || v > hb_max (0, peak)) return 0.f;
-      else
-	scalar *= (float) v / peak;
-    }
-    return scalar;
-  }
-
-  bool           has_peak () const { return tupleIndex & TuppleIndex::EmbeddedPeakTuple; }
-  bool   has_intermediate () const { return tupleIndex & TuppleIndex::IntermediateRegion; }
-  bool has_private_points () const { return tupleIndex & TuppleIndex::PrivatePointNumbers; }
-  unsigned      get_index () const { return tupleIndex & TuppleIndex::TupleIndexMask; }
-
-  protected:
-  struct TuppleIndex : HBUINT16
-  {
-    enum Flags {
-      EmbeddedPeakTuple   = 0x8000u,
-      IntermediateRegion  = 0x4000u,
-      PrivatePointNumbers = 0x2000u,
-      TupleIndexMask      = 0x0FFFu
-    };
-
-    DEFINE_SIZE_STATIC (2);
-  };
-
-  hb_array_t<const F2DOT14> get_all_tuples (unsigned axis_count) const
-  { return StructAfter<UnsizedArrayOf<F2DOT14>> (tupleIndex).as_array ((has_peak () + has_intermediate () * 2) * axis_count); }
-  hb_array_t<const F2DOT14> get_peak_tuple (unsigned axis_count) const
-  { return get_all_tuples (axis_count).sub_array (0, axis_count); }
-  hb_array_t<const F2DOT14> get_start_tuple (unsigned axis_count) const
-  { return get_all_tuples (axis_count).sub_array (has_peak () * axis_count, axis_count); }
-  hb_array_t<const F2DOT14> get_end_tuple (unsigned axis_count) const
-  { return get_all_tuples (axis_count).sub_array (has_peak () * axis_count + axis_count, axis_count); }
-
-  HBUINT16	varDataSize;	/* The size in bytes of the serialized
-				 * data for this tuple variation table. */
-  TuppleIndex	tupleIndex;	/* A packed field. The high 4 bits are flags (see below).
-				   The low 12 bits are an index into a shared tuple
-				   records array. */
-  /* UnsizedArrayOf<F2DOT14> peakTuple - optional */
-				/* Peak tuple record for this tuple variation table — optional,
-				 * determined by flags in the tupleIndex value.
-				 *
-				 * Note that this must always be included in the 'cvar' table. */
-  /* UnsizedArrayOf<F2DOT14> intermediateStartTuple - optional */
-				/* Intermediate start tuple record for this tuple variation table — optional,
-				   determined by flags in the tupleIndex value. */
-  /* UnsizedArrayOf<F2DOT14> intermediateEndTuple - optional */
-				/* Intermediate end tuple record for this tuple variation table — optional,
-				 * determined by flags in the tupleIndex value. */
-  public:
-  DEFINE_SIZE_MIN (4);
-};
-
-struct GlyphVariationData
-{
-  const TupleVariationHeader &get_tuple_var_header (void) const
-  { return StructAfter<TupleVariationHeader> (data); }
-
-  struct tuple_iterator_t
-  {
-    void init (hb_bytes_t var_data_bytes_, unsigned int axis_count_)
-    {
-      var_data_bytes = var_data_bytes_;
-      var_data = var_data_bytes_.as<GlyphVariationData> ();
-      index = 0;
-      axis_count = axis_count_;
-      current_tuple = &var_data->get_tuple_var_header ();
-      data_offset = 0;
-    }
-
-    bool get_shared_indices (hb_vector_t<unsigned int> &shared_indices /* OUT */)
-    {
-      if (var_data->has_shared_point_numbers ())
-      {
-	const HBUINT8 *base = &(var_data+var_data->data);
-	const HBUINT8 *p = base;
-	if (!unpack_points (p, shared_indices, (const HBUINT8 *) (var_data_bytes.arrayZ + var_data_bytes.length))) return false;
-	data_offset = p - base;
-      }
-      return true;
-    }
-
-    bool is_valid () const
-    {
-      return (index < var_data->tupleVarCount.get_count ()) &&
-	     var_data_bytes.check_range (current_tuple, TupleVariationHeader::min_size) &&
-	     var_data_bytes.check_range (current_tuple, hb_max (current_tuple->get_data_size (),
-								current_tuple->get_size (axis_count)));
-    }
-
-    bool move_to_next ()
-    {
-      data_offset += current_tuple->get_data_size ();
-      current_tuple = &current_tuple->get_next (axis_count);
-      index++;
-      return is_valid ();
-    }
-
-    const HBUINT8 *get_serialized_data () const
-    { return &(var_data+var_data->data) + data_offset; }
-
-    private:
-    const GlyphVariationData *var_data;
-    unsigned int index;
-    unsigned int axis_count;
-    unsigned int data_offset;
-
-    public:
-    hb_bytes_t var_data_bytes;
-    const TupleVariationHeader *current_tuple;
-  };
-
-  static bool get_tuple_iterator (hb_bytes_t var_data_bytes, unsigned axis_count,
-				  hb_vector_t<unsigned int> &shared_indices /* OUT */,
-				  tuple_iterator_t *iterator /* OUT */)
-  {
-    iterator->init (var_data_bytes, axis_count);
-    if (!iterator->get_shared_indices (shared_indices))
-      return false;
-    return iterator->is_valid ();
-  }
-
-  bool has_shared_point_numbers () const { return tupleVarCount.has_shared_point_numbers (); }
-
-  static bool unpack_points (const HBUINT8 *&p /* IN/OUT */,
-			     hb_vector_t<unsigned int> &points /* OUT */,
-			     const HBUINT8 *end)
-  {
-    enum packed_point_flag_t
-    {
-      POINTS_ARE_WORDS     = 0x80,
-      POINT_RUN_COUNT_MASK = 0x7F
-    };
-
-    if (unlikely (p + 1 > end)) return false;
-
-    unsigned count = *p++;
-    if (count & POINTS_ARE_WORDS)
-    {
-      if (unlikely (p + 1 > end)) return false;
-      count = ((count & POINT_RUN_COUNT_MASK) << 8) | *p++;
-    }
-    if (unlikely (!points.resize (count, false))) return false;
-
-    unsigned n = 0;
-    unsigned i = 0;
-    while (i < count)
-    {
-      if (unlikely (p + 1 > end)) return false;
-      unsigned control = *p++;
-      unsigned run_count = (control & POINT_RUN_COUNT_MASK) + 1;
-      if (unlikely (i + run_count > count)) return false;
-      unsigned j;
-      if (control & POINTS_ARE_WORDS)
-      {
-	if (unlikely (p + run_count * HBUINT16::static_size > end)) return false;
-	for (j = 0; j < run_count; j++, i++)
-	{
-	  n += *(const HBUINT16 *)p;
-	  points.arrayZ[i] = n;
-	  p += HBUINT16::static_size;
-	}
-      }
-      else
-      {
-	if (unlikely (p + run_count > end)) return false;
-	for (j = 0; j < run_count; j++, i++)
-	{
-	  n += *p++;
-	  points.arrayZ[i] = n;
-	}
-      }
-    }
-    return true;
-  }
-
-  static bool unpack_deltas (const HBUINT8 *&p /* IN/OUT */,
-			     hb_vector_t<int> &deltas /* IN/OUT */,
-			     const HBUINT8 *end)
-  {
-    enum packed_delta_flag_t
-    {
-      DELTAS_ARE_ZERO      = 0x80,
-      DELTAS_ARE_WORDS     = 0x40,
-      DELTA_RUN_COUNT_MASK = 0x3F
-    };
-
-    unsigned i = 0;
-    unsigned count = deltas.length;
-    while (i < count)
-    {
-      if (unlikely (p + 1 > end)) return false;
-      unsigned control = *p++;
-      unsigned run_count = (control & DELTA_RUN_COUNT_MASK) + 1;
-      if (unlikely (i + run_count > count)) return false;
-      unsigned j;
-      if (control & DELTAS_ARE_ZERO)
-      {
-	for (j = 0; j < run_count; j++, i++)
-	  deltas.arrayZ[i] = 0;
-      }
-      else if (control & DELTAS_ARE_WORDS)
-      {
-	if (unlikely (p + run_count * HBUINT16::static_size > end)) return false;
-	for (j = 0; j < run_count; j++, i++)
-	{
-	  deltas.arrayZ[i] = * (const HBINT16 *) p;
-	  p += HBUINT16::static_size;
-	}
-      }
-      else
-      {
-	if (unlikely (p + run_count > end)) return false;
-	for (j = 0; j < run_count; j++, i++)
-	{
-	  deltas.arrayZ[i] = * (const HBINT8 *) p++;
-	}
-      }
-    }
-    return true;
-  }
-
-  bool has_data () const { return tupleVarCount; }
-
-  protected:
-  struct TupleVarCount : HBUINT16
-  {
-    bool has_shared_point_numbers () const { return ((*this) & SharedPointNumbers); }
-    unsigned int get_count () const { return (*this) & CountMask; }
-
-    protected:
-    enum Flags
-    {
-      SharedPointNumbers= 0x8000u,
-      CountMask		= 0x0FFFu
-    };
-    public:
-    DEFINE_SIZE_STATIC (2);
-  };
-
-  TupleVarCount	tupleVarCount;  /* A packed field. The high 4 bits are flags, and the
-				 * low 12 bits are the number of tuple variation tables
-				 * for this glyph. The number of tuple variation tables
-				 * can be any number between 1 and 4095. */
-  Offset16To<HBUINT8>
-		data;		/* Offset from the start of the GlyphVariationData table
-				 * to the serialized data. */
-  /* TupleVariationHeader tupleVariationHeaders[] *//* Array of tuple variation headers. */
-  public:
-  DEFINE_SIZE_MIN (4);
-};
+struct GlyphVariationData : TupleVariationData
+{};
 
 struct gvar
 {
@@ -561,6 +259,7 @@ struct gvar
       hb_vector_t<unsigned int> shared_indices;
       GlyphVariationData::tuple_iterator_t iterator;
       if (!GlyphVariationData::get_tuple_iterator (var_data_bytes, table->axisCount,
+						   var_data_bytes.arrayZ,
 						   shared_indices, &iterator))
 	return true; /* so isn't applied at all */
 
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-outline.cc b/source/libs/harfbuzz/harfbuzz-src/src/hb-outline.cc
index 184e48cfb..0657e0e1d 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-outline.cc
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-outline.cc
@@ -85,7 +85,7 @@ void hb_outline_t::replay (hb_draw_funcs_t *pen, void *pen_data) const
   }
 }
 
-float hb_outline_t::area () const
+float hb_outline_t::control_area () const
 {
   float a = 0;
   unsigned first = 0;
@@ -118,7 +118,7 @@ void hb_outline_t::embolden (float x_strength, float y_strength,
   x_strength /= 2.f;
   y_strength /= 2.f;
 
-  bool orientation_negative = area () < 0;
+  bool orientation_negative = control_area () < 0;
 
   signed first = 0;
   for (unsigned c = 0; c < contours.length; c++)
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-outline.hh b/source/libs/harfbuzz/harfbuzz-src/src/hb-outline.hh
index c463993cf..c43c06596 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-outline.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-outline.hh
@@ -68,7 +68,7 @@ struct hb_outline_t
   void reset () { points.shrink (0, false); contours.resize (0); }
 
   HB_INTERNAL void replay (hb_draw_funcs_t *pen, void *pen_data) const;
-  HB_INTERNAL float area () const;
+  HB_INTERNAL float control_area () const;
   HB_INTERNAL void embolden (float x_strength, float y_strength,
 			     float x_shift, float y_shift);
 
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-sanitize.hh b/source/libs/harfbuzz/harfbuzz-src/src/hb-sanitize.hh
index eb907c6b2..5259891b7 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-sanitize.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-sanitize.hh
@@ -228,6 +228,18 @@ struct hb_sanitize_context_t :
 
   unsigned get_edit_count () { return edit_count; }
 
+
+  bool check_ops(unsigned count)
+  {
+    /* Avoid underflow */
+    if (unlikely (this->max_ops < 0 || count >= (unsigned) this->max_ops))
+    {
+      this->max_ops = -1;
+      return false;
+    }
+    return (this->max_ops -= (int) count) > 0;
+  }
+
   bool check_range (const void *base,
 		    unsigned int len) const
   {
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc b/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc
index 7b5bf2c5e..89d354fc0 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc
@@ -196,4 +196,238 @@ hb_shape (hb_font_t           *font,
 }
 
 
+#ifdef HB_EXPERIMENTAL_API
+
+static float
+buffer_advance (hb_buffer_t *buffer)
+{
+  float a = 0;
+  auto *pos = buffer->pos;
+  unsigned count = buffer->len;
+  if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
+    for (unsigned i = 0; i < count; i++)
+      a += pos[i].x_advance;
+  else
+    for (unsigned i = 0; i < count; i++)
+      a += pos[i].y_advance;
+  return a;
+}
+
+static void
+reset_buffer (hb_buffer_t *buffer,
+	      hb_array_t<const hb_glyph_info_t> text)
+{
+  assert (buffer->ensure (text.length));
+  buffer->have_positions = false;
+  buffer->len = text.length;
+  memcpy (buffer->info, text.arrayZ, text.length * sizeof (buffer->info[0]));
+  hb_buffer_set_content_type (buffer, HB_BUFFER_CONTENT_TYPE_UNICODE);
+}
+
+/**
+ * hb_shape_justify:
+ * @font: a mutable #hb_font_t to use for shaping
+ * @buffer: an #hb_buffer_t to shape
+ * @features: (array length=num_features) (nullable): an array of user
+ *    specified #hb_feature_t or `NULL`
+ * @num_features: the length of @features array
+ * @shaper_list: (array zero-terminated=1) (nullable): a `NULL`-terminated
+ *    array of shapers to use or `NULL`
+ * @min_target_advance: Minimum advance width/height to aim for.
+ * @max_target_advance: Maximum advance width/height to aim for.
+ * @advance: (inout): Input/output advance width/height of the buffer.
+ * @var_tag: (out): Variation-axis tag used for justification.
+ * @var_value: (out): Variation-axis value used to reach target justification.
+ *
+ * See hb_shape_full() for basic details. If @shaper_list is not `NULL`, the specified
+ * shapers will be used in the given order, otherwise the default shapers list
+ * will be used.
+ *
+ * In addition, justify the shaping results such that the shaping results reach
+ * the target advance width/height, depending on the buffer direction.
+ *
+ * If the advance of the buffer shaped with hb_shape_full() is already known,
+ * put that in *advance. Otherwise set *advance to zero.
+ *
+ * This API is currently experimental and will probably change in the future.
+ *
+ * Return value: false if all shapers failed, true otherwise
+ *
+ * XSince: EXPERIMENTAL
+ **/
+hb_bool_t
+hb_shape_justify (hb_font_t          *font,
+		  hb_buffer_t        *buffer,
+		  const hb_feature_t *features,
+		  unsigned int        num_features,
+		  const char * const *shaper_list,
+		  float               min_target_advance,
+		  float               max_target_advance,
+		  float              *advance, /* IN/OUT */
+		  hb_tag_t           *var_tag, /* OUT */
+		  float              *var_value /* OUT */)
+{
+  // TODO Negative font scales?
+
+  /* If default advance already matches target, nothing to do. Shape and return. */
+  if (min_target_advance <= *advance && *advance <= max_target_advance)
+    return hb_shape_full (font, buffer,
+			  features, num_features,
+			  shaper_list);
+
+  hb_face_t *face = font->face;
+
+  /* Choose variation tag to use for justification. */
+
+  hb_tag_t tag = HB_TAG_NONE;
+  hb_ot_var_axis_info_t axis_info;
+
+  hb_tag_t tags[] =
+  {
+    HB_TAG ('j','s','t','f'),
+    HB_TAG ('w','d','t','h'),
+  };
+  for (unsigned i = 0; i < ARRAY_LENGTH (tags); i++)
+    if (hb_ot_var_find_axis_info (face, tags[i], &axis_info))
+    {
+      tag = *var_tag = tags[i];
+      break;
+    }
+
+  /* If no suitable variation axis found, can't justify.  Just shape and return. */
+  if (!tag)
+  {
+    if (hb_shape_full (font, buffer,
+		       features, num_features,
+		       shaper_list))
+    {
+      *advance = buffer_advance (buffer);
+      return true;
+    }
+    else
+      return false;
+  }
+
+  /* Copy buffer text as we need it so we can shape multiple times. */
+  unsigned text_len = buffer->len;
+  auto *text_info = (hb_glyph_info_t *) hb_malloc (text_len * sizeof (buffer->info[0]));
+  if (unlikely (text_len && !text_info))
+    return false;
+  hb_memcpy (text_info, buffer->info, text_len * sizeof (buffer->info[0]));
+  auto text = hb_array<const hb_glyph_info_t> (text_info, text_len);
+
+  /* If default advance was not provided to us, calculate it. */
+  if (!*advance)
+  {
+    hb_font_set_variation (font, tag, axis_info.default_value);
+    if (!hb_shape_full (font, buffer,
+			features, num_features,
+			shaper_list))
+      return false;
+    *advance = buffer_advance (buffer);
+  }
+
+  /* If default advance already matches target, nothing to do. Shape and return.
+   * Do this again, in case advance was just calculated.
+   */
+  if (min_target_advance <= *advance && *advance <= max_target_advance)
+    return true;
+
+  /* Prepare for running the solver. */
+  double a, b, ya, yb;
+  if (*advance < min_target_advance)
+  {
+    /* Need to expand. */
+    ya = (double) *advance;
+    a = (double) axis_info.default_value;
+    b = (double) axis_info.max_value;
+
+    /* Shape buffer for maximum expansion to use as other
+     * starting point for the solver. */
+    hb_font_set_variation (font, tag, (float) b);
+    reset_buffer (buffer, text);
+    if (!hb_shape_full (font, buffer,
+			features, num_features,
+			shaper_list))
+      return false;
+    yb = (double) buffer_advance (buffer);
+    /* If the maximum expansion is less than max target,
+     * there's nothing to solve for. Just return it. */
+    if (yb <= (double) max_target_advance)
+    {
+      *advance = (float) yb;
+      return true;
+    }
+  }
+  else
+  {
+    /* Need to shrink. */
+    yb = (double) *advance;
+    a = (double) axis_info.min_value;
+    b = (double) axis_info.default_value;
+
+    /* Shape buffer for maximum shrinkate to use as other
+     * starting point for the solver. */
+    hb_font_set_variation (font, tag, (float) a);
+    reset_buffer (buffer, text);
+    if (!hb_shape_full (font, buffer,
+			features, num_features,
+			shaper_list))
+      return false;
+    ya = (double) buffer_advance (buffer);
+    /* If the maximum shrinkate is more than min target,
+     * there's nothing to solve for. Just return it. */
+    if (ya >= (double) min_target_advance)
+    {
+      *advance = (float) ya;
+      return true;
+    }
+  }
+
+  /* Run the solver to find a var axis value that hits
+   * the desired width. */
+
+  double epsilon = (b - a) / (1<<14);
+  bool failed = false;
+
+  auto f = [&] (double x)
+  {
+    hb_font_set_variation (font, tag, (float) x);
+    reset_buffer (buffer, text);
+    if (unlikely (!hb_shape_full (font, buffer,
+				  features, num_features,
+				  shaper_list)))
+    {
+      failed = true;
+      return (double) min_target_advance;
+    }
+
+    double w = (double) buffer_advance (buffer);
+    DEBUG_MSG (JUSTIFY, nullptr, "Trying '%c%c%c%c' axis parameter %f. Advance %g. Target: min %g max %g",
+	       HB_UNTAG (tag), x, w,
+	       (double) min_target_advance, (double) max_target_advance);
+    return w;
+  };
+
+  double y = 0;
+  double itp = solve_itp (f,
+			  a, b,
+			  epsilon,
+			  (double) min_target_advance, (double) max_target_advance,
+			  ya, yb, y);
+
+  hb_free (text_info);
+
+  if (failed)
+    return false;
+
+  *var_value = (float) itp;
+  *advance = (float) y;
+
+  return true;
+}
+
+#endif
+
+
 #endif
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.h b/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.h
index 922f8c011..d4d4fdfd2 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.h
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.h
@@ -53,6 +53,18 @@ hb_shape_full (hb_font_t          *font,
 	       unsigned int        num_features,
 	       const char * const *shaper_list);
 
+HB_EXTERN hb_bool_t
+hb_shape_justify (hb_font_t          *font,
+		  hb_buffer_t        *buffer,
+		  const hb_feature_t *features,
+		  unsigned int        num_features,
+		  const char * const *shaper_list,
+		  float               min_target_advance,
+		  float               max_target_advance,
+		  float              *advance, /* IN/OUT */
+		  hb_tag_t           *var_tag, /* OUT */
+		  float              *var_value /* OUT */);
+
 HB_EXTERN const char **
 hb_shape_list_shapers (void);
 
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper-list.hh b/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper-list.hh
index 0d63933a7..4158b7094 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper-list.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper-list.hh
@@ -39,7 +39,7 @@ HB_SHAPER_IMPLEMENT (graphite2)
 #endif
 
 #ifndef HB_NO_OT_SHAPE
-HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main OpenType shaper. */
+HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main shaper. */
 #endif
 
 #ifdef HAVE_UNISCRIBE
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc b/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc
index ca59de79a..5f001ac25 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc
@@ -71,7 +71,6 @@ hb_subset_input_t::hb_subset_input_t ()
   hb_tag_t default_no_subset_tables[] = {
     HB_TAG ('a', 'v', 'a', 'r'),
     HB_TAG ('g', 'a', 's', 'p'),
-    HB_TAG ('c', 'v', 't', ' '),
     HB_TAG ('f', 'p', 'g', 'm'),
     HB_TAG ('p', 'r', 'e', 'p'),
     HB_TAG ('V', 'D', 'M', 'X'),
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc b/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc
index 82df3386f..e0b1ed644 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc
@@ -50,6 +50,7 @@
 #include "hb-ot-name-table.hh"
 #include "hb-ot-layout-gsub-table.hh"
 #include "hb-ot-layout-gpos-table.hh"
+#include "hb-ot-var-cvar-table.hh"
 #include "hb-ot-var-fvar-table.hh"
 #include "hb-ot-var-gvar-table.hh"
 #include "hb-ot-var-hvar-table.hh"
@@ -478,6 +479,16 @@ _subset_table (hb_subset_plan_t *plan,
     if (plan->all_axes_pinned) return _subset<const OT::STAT> (plan, buf);
     else return _passthrough (plan, tag);
 
+  case HB_TAG ('c', 'v', 't', ' '):
+#ifndef HB_NO_VAR
+    if (_is_table_present (plan->source, HB_OT_TAG_cvar) &&
+        plan->normalized_coords && !plan->pinned_at_default)
+    {
+      auto &cvar = *plan->source->table.cvar;
+      return OT::cvar::add_cvt_and_apply_deltas (plan, cvar.get_tuple_var_data (), &cvar);
+    }
+#endif
+    return _passthrough (plan, tag);
   default:
     if (plan->flags & HB_SUBSET_FLAGS_PASSTHROUGH_UNRECOGNIZED)
       return _passthrough (plan, tag);
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/hb.hh b/source/libs/harfbuzz/harfbuzz-src/src/hb.hh
index 857571b42..d09849e56 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/hb.hh
+++ b/source/libs/harfbuzz/harfbuzz-src/src/hb.hh
@@ -246,7 +246,15 @@ extern "C" void  hb_free_impl(void *ptr);
  * Compiler attributes
  */
 
-#if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE__)
+// gcc 10 has __has_builtin but not earlier versions. Sanction any gcc >= 5
+// clang defines it so no need.
+#ifdef __has_builtin
+#define hb_has_builtin __has_builtin
+#else
+#define hb_has_builtin(x) ((defined(__GNUC__) && __GNUC__ >= 5))
+#endif
+
+#if defined(__OPTIMIZE__) && hb_has_builtin(__builtin_expect)
 #define likely(expr) (__builtin_expect (!!(expr), 1))
 #define unlikely(expr) (__builtin_expect (!!(expr), 0))
 #else
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/meson.build b/source/libs/harfbuzz/harfbuzz-src/src/meson.build
index 435201c28..93991abd9 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/meson.build
+++ b/source/libs/harfbuzz/harfbuzz-src/src/meson.build
@@ -226,6 +226,7 @@ hb_base_sources = files(
   'hb-ot-tag.cc',
   'hb-ot-var-avar-table.hh',
   'hb-ot-var-common.hh',
+  'hb-ot-var-cvar-table.hh',
   'hb-ot-var-fvar-table.hh',
   'hb-ot-var-gvar-table.hh',
   'hb-ot-var-hvar-table.hh',
diff --git a/source/libs/harfbuzz/harfbuzz-src/src/test-map.cc b/source/libs/harfbuzz/harfbuzz-src/src/test-map.cc
index a0a59cbcd..61cc8bfb3 100644
--- a/source/libs/harfbuzz/harfbuzz-src/src/test-map.cc
+++ b/source/libs/harfbuzz/harfbuzz-src/src/test-map.cc
@@ -344,8 +344,8 @@ main (int argc, char **argv)
     hb_set_t keys;
     hb_set_t values;
 
-    m.keys (keys);
-    m.values (values);
+    hb_copy (m.keys (), keys);
+    hb_copy (m.values (), values);
 
     assert (keys.is_equal (hb_set_t ({1, 2, 3, 4, 5, 6})));
     assert (values.is_equal (hb_set_t ({1, 1, 2, 3, 5, 8})));
diff --git a/source/libs/harfbuzz/version.ac b/source/libs/harfbuzz/version.ac
index c5ecaabc8..8d98b1fa3 100644
--- a/source/libs/harfbuzz/version.ac
+++ b/source/libs/harfbuzz/version.ac
@@ -8,4 +8,4 @@ dnl
 dnl --------------------------------------------------------
 dnl
 dnl  m4-include this file to define the current harfbuzz version
-m4_define([harfbuzz_version], [7.0.1])
+m4_define([harfbuzz_version], [7.1.0])
diff --git a/source/texk/configure b/source/texk/configure
index b13d5ff4a..255c0c560 100755
--- a/source/texk/configure
+++ b/source/texk/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for TeX Live texk 2023.
+# Generated by GNU Autoconf 2.71 for TeX Live texk 2024.
 #
 # Report bugs to <tex-live@tug.org>.
 #
@@ -610,8 +610,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='TeX Live texk'
 PACKAGE_TARNAME='tex-live-texk'
-PACKAGE_VERSION='2023'
-PACKAGE_STRING='TeX Live texk 2023'
+PACKAGE_VERSION='2024'
+PACKAGE_STRING='TeX Live texk 2024'
 PACKAGE_BUGREPORT='tex-live@tug.org'
 PACKAGE_URL=''
 
@@ -1355,7 +1355,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures TeX Live texk 2023 to adapt to many kinds of systems.
+\`configure' configures TeX Live texk 2024 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1426,7 +1426,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of TeX Live texk 2023:";;
+     short | recursive ) echo "Configuration of TeX Live texk 2024:";;
    esac
   cat <<\_ACEOF
 
@@ -1611,7 +1611,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-TeX Live texk configure 2023
+TeX Live texk configure 2024
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -1734,7 +1734,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by TeX Live texk $as_me 2023, which was
+It was created by TeX Live texk $as_me 2024, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -5242,7 +5242,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='tex-live-texk'
- VERSION='2023'
+ VERSION='2024'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -6175,7 +6175,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by TeX Live texk $as_me 2023, which was
+This file was extended by TeX Live texk $as_me 2024, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -6234,7 +6234,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-TeX Live texk config.status 2023
+TeX Live texk config.status 2024
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
diff --git a/source/texk/kpathsea/c-auto.in b/source/texk/kpathsea/c-auto.in
index d011f8d24..dc3154b19 100644
--- a/source/texk/kpathsea/c-auto.in
+++ b/source/texk/kpathsea/c-auto.in
@@ -23,7 +23,7 @@
 #define KPATHSEA_C_AUTO_H
 
 /* kpathsea: the version string. */
-#define KPSEVERSION "kpathsea version 6.3.5"
+#define KPSEVERSION "kpathsea version 6.3.6/dev"
 
 /* Define to 1 if the `closedir' function returns void instead of int. */
 #undef CLOSEDIR_VOID
diff --git a/source/texk/kpathsea/configure b/source/texk/kpathsea/configure
index 1ff71e82e..b227dc324 100755
--- a/source/texk/kpathsea/configure
+++ b/source/texk/kpathsea/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for Kpathsea 6.3.5.
+# Generated by GNU Autoconf 2.71 for Kpathsea 6.3.6/dev.
 #
 # Report bugs to <tex-k@tug.org>.
 #
@@ -621,8 +621,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='Kpathsea'
 PACKAGE_TARNAME='kpathsea'
-PACKAGE_VERSION='6.3.5'
-PACKAGE_STRING='Kpathsea 6.3.5'
+PACKAGE_VERSION='6.3.6/dev'
+PACKAGE_STRING='Kpathsea 6.3.6/dev'
 PACKAGE_BUGREPORT='tex-k@tug.org'
 PACKAGE_URL=''
 
@@ -1377,7 +1377,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures Kpathsea 6.3.5 to adapt to many kinds of systems.
+\`configure' configures Kpathsea 6.3.6/dev to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1448,7 +1448,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of Kpathsea 6.3.5:";;
+     short | recursive ) echo "Configuration of Kpathsea 6.3.6/dev:";;
    esac
   cat <<\_ACEOF
 
@@ -1576,7 +1576,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-Kpathsea configure 6.3.5
+Kpathsea configure 6.3.6/dev
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -2332,7 +2332,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by Kpathsea $as_me 6.3.5, which was
+It was created by Kpathsea $as_me 6.3.6/dev, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -3092,14 +3092,14 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
-KPSEVERSION=6.3.5
+KPSEVERSION=6.3.6/dev
 
 
-KPSE_LT_VERSINFO=9:5:3
+KPSE_LT_VERSINFO=9:6:3
 
 
 
- WEB2CVERSION=" (TeX Live 2023)"
+ WEB2CVERSION=" (TeX Live 2024)"
 
 
 am__api_version='1.16'
@@ -8783,7 +8783,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='kpathsea'
- VERSION='6.3.5'
+ VERSION='6.3.6/dev'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -15549,7 +15549,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by Kpathsea $as_me 6.3.5, which was
+This file was extended by Kpathsea $as_me 6.3.6/dev, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -15617,7 +15617,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-Kpathsea config.status 6.3.5
+Kpathsea config.status 6.3.6/dev
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
diff --git a/source/texk/kpathsea/version.ac b/source/texk/kpathsea/version.ac
index ada0b816d..b2c000396 100644
--- a/source/texk/kpathsea/version.ac
+++ b/source/texk/kpathsea/version.ac
@@ -1,4 +1,4 @@
-dnl $Id: version.ac 65770 2023-02-09 21:26:50Z karl $
+dnl $Id: version.ac 66596 2023-03-19 22:16:03Z karl $
 dnl   Copyright 2016-2023 Karl Berry <tex-live@tug.org>
 dnl   Copyright 2011-2015 Peter Breitenlohner <tex-live@tug.org>
 dnl
@@ -16,8 +16,9 @@ dnl   Modifying or revoking interfaces (not backwards compatible)
 dnl     a.b.c => a+1.0.0
 dnl
 dnl   After a release:
-dnl     append "dev", to distinguish binaries built between releases.
+dnl   increment and append "dev", to distinguish binaries built between
+dnl   releases.
 dnl --------------------------------------------------------
 dnl
 dnl This file is m4-included from configure.ac.
-m4_define([kpse_version], [6.3.5])
+m4_define([kpse_version], [6.3.6/dev])
diff --git a/source/texk/texlive/configure b/source/texk/texlive/configure
index efe8a7097..4cb1d4cd7 100755
--- a/source/texk/texlive/configure
+++ b/source/texk/texlive/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for TeX Live Scripts 2023.
+# Generated by GNU Autoconf 2.71 for TeX Live Scripts 2024.
 #
 # Report bugs to <tex-k@tug.org>.
 #
@@ -610,8 +610,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='TeX Live Scripts'
 PACKAGE_TARNAME='tex-live-scripts'
-PACKAGE_VERSION='2023'
-PACKAGE_STRING='TeX Live Scripts 2023'
+PACKAGE_VERSION='2024'
+PACKAGE_STRING='TeX Live Scripts 2024'
 PACKAGE_BUGREPORT='tex-k@tug.org'
 PACKAGE_URL=''
 
@@ -1281,7 +1281,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures TeX Live Scripts 2023 to adapt to many kinds of systems.
+\`configure' configures TeX Live Scripts 2024 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1349,7 +1349,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of TeX Live Scripts 2023:";;
+     short | recursive ) echo "Configuration of TeX Live Scripts 2024:";;
    esac
   cat <<\_ACEOF
 
@@ -1445,7 +1445,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-TeX Live Scripts configure 2023
+TeX Live Scripts configure 2024
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -1521,7 +1521,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by TeX Live Scripts $as_me 2023, which was
+It was created by TeX Live Scripts $as_me 2024, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -2786,7 +2786,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='tex-live-scripts'
- VERSION='2023'
+ VERSION='2024'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -4914,7 +4914,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by TeX Live Scripts $as_me 2023, which was
+This file was extended by TeX Live Scripts $as_me 2024, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -4973,7 +4973,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-TeX Live Scripts config.status 2023
+TeX Live Scripts config.status 2024
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
diff --git a/source/texk/web2c/ChangeLog b/source/texk/web2c/ChangeLog
index bda62667c..a341eb42d 100644
--- a/source/texk/web2c/ChangeLog
+++ b/source/texk/web2c/ChangeLog
@@ -1,3 +1,10 @@
+2023-03-29  TANAKA Takuji  <ttk@t-lab.opal.ne.jp>
+
+	* tests/fn-generate.perl:
+	Skip tests for Shift_JIS & EUC-JP if conversion failed.
+	Report from Ken Moffat.
+	https://tug.org/pipermail/tex-k/2023-March/003911.html
+
 2023-02-14  Hironori Kitagawa  <h_kitagawa2001@yahoo.co.jp>
 
 	* tests/fn-generate.perl:
diff --git a/source/texk/web2c/configure b/source/texk/web2c/configure
index f9606de43..eeed7fc18 100755
--- a/source/texk/web2c/configure
+++ b/source/texk/web2c/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for Web2C 2023.
+# Generated by GNU Autoconf 2.71 for Web2C 2024.
 #
 # Report bugs to <tex-k@tug.org>.
 #
@@ -629,8 +629,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='Web2C'
 PACKAGE_TARNAME='web2c'
-PACKAGE_VERSION='2023'
-PACKAGE_STRING='Web2C 2023'
+PACKAGE_VERSION='2024'
+PACKAGE_STRING='Web2C 2024'
 PACKAGE_BUGREPORT='tex-k@tug.org'
 PACKAGE_URL=''
 
@@ -1676,7 +1676,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures Web2C 2023 to adapt to many kinds of systems.
+\`configure' configures Web2C 2024 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1751,7 +1751,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of Web2C 2023:";;
+     short | recursive ) echo "Configuration of Web2C 2024:";;
    esac
   cat <<\_ACEOF
 
@@ -1977,7 +1977,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-Web2C configure 2023
+Web2C configure 2024
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -2967,7 +2967,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by Web2C $as_me 2023, which was
+It was created by Web2C $as_me 2024, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -3943,7 +3943,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
-WEB2CVERSION=2023
+WEB2CVERSION=2024
 
 
 am__api_version='1.16'
@@ -9627,7 +9627,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='web2c'
- VERSION='2023'
+ VERSION='2024'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -25512,7 +25512,7 @@ Usage: $0 [OPTIONS]
 Report bugs to <bug-libtool@gnu.org>."
 
 lt_cl_version="\
-Web2C config.lt 2023
+Web2C config.lt 2024
 configured by $0, generated by GNU Autoconf 2.71.
 
 Copyright (C) 2011 Free Software Foundation, Inc.
@@ -29275,7 +29275,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by Web2C $as_me 2023, which was
+This file was extended by Web2C $as_me 2024, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -29347,7 +29347,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-Web2C config.status 2023
+Web2C config.status 2024
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
diff --git a/source/texk/web2c/lib/ChangeLog b/source/texk/web2c/lib/ChangeLog
index 3856f75fc..4163e1687 100644
--- a/source/texk/web2c/lib/ChangeLog
+++ b/source/texk/web2c/lib/ChangeLog
@@ -1,3 +1,7 @@
+2023-03-20  Akira Kakuto  <kakuto@jcom.zaq.ne.jp>
+
+	* texmfmp.c: Typo, missing !IS_pTeX in ipcpage().
+
 2023-03-09  Karl Berry  <karl@tug.org>
 
 	* TL'23 release.
diff --git a/source/texk/web2c/lib/texmfmp.c b/source/texk/web2c/lib/texmfmp.c
index 5bb703224..e7379c60c 100644
--- a/source/texk/web2c/lib/texmfmp.c
+++ b/source/texk/web2c/lib/texmfmp.c
@@ -1505,7 +1505,7 @@ ipcpage (int is_eof)
             strstartar[outputfilename - 65536L];
 #endif
     name = xmalloc (len + 1);
-#if !defined(Aleph)
+#if !defined(Aleph) && !IS_pTeX
     strncpy (name, (string)&strpool[strstart[outputfilename]], len);
 #else
     {
diff --git a/source/texk/web2c/luatexdir/luatex_svnversion.h b/source/texk/web2c/luatexdir/luatex_svnversion.h
index 76d929807..01365ad68 100644
--- a/source/texk/web2c/luatexdir/luatex_svnversion.h
+++ b/source/texk/web2c/luatexdir/luatex_svnversion.h
@@ -1,4 +1,4 @@
 #ifndef luatex_svn_revision_h
 #define luatex_svn_revision_h
-#define luatex_svn_revision 7569
+#define luatex_svn_revision 7570
 #endif
diff --git a/source/texk/web2c/web2c/configure b/source/texk/web2c/web2c/configure
index c7459e66b..0d567016d 100755
--- a/source/texk/web2c/web2c/configure
+++ b/source/texk/web2c/web2c/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for Web2C Tools 2023.
+# Generated by GNU Autoconf 2.71 for Web2C Tools 2024.
 #
 # Report bugs to <tex-k@tug.org>.
 #
@@ -621,8 +621,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='Web2C Tools'
 PACKAGE_TARNAME='web2c-tools'
-PACKAGE_VERSION='2023'
-PACKAGE_STRING='Web2C Tools 2023'
+PACKAGE_VERSION='2024'
+PACKAGE_STRING='Web2C Tools 2024'
 PACKAGE_BUGREPORT='tex-k@tug.org'
 PACKAGE_URL=''
 
@@ -1366,7 +1366,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures Web2C Tools 2023 to adapt to many kinds of systems.
+\`configure' configures Web2C Tools 2024 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1437,7 +1437,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of Web2C Tools 2023:";;
+     short | recursive ) echo "Configuration of Web2C Tools 2024:";;
    esac
   cat <<\_ACEOF
 
@@ -1560,7 +1560,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-Web2C Tools configure 2023
+Web2C Tools configure 2024
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -2316,7 +2316,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by Web2C Tools $as_me 2023, which was
+It was created by Web2C Tools $as_me 2024, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -8757,7 +8757,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='web2c-tools'
- VERSION='2023'
+ VERSION='2024'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -15504,7 +15504,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by Web2C Tools $as_me 2023, which was
+This file was extended by Web2C Tools $as_me 2024, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -15572,7 +15572,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-Web2C Tools config.status 2023
+Web2C Tools config.status 2024
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
diff --git a/source/utils/configure b/source/utils/configure
index 50cfa7885..7d69229ee 100755
--- a/source/utils/configure
+++ b/source/utils/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for TeX Live utils 2023.
+# Generated by GNU Autoconf 2.71 for TeX Live utils 2024.
 #
 # Report bugs to <tex-k@tug.org>.
 #
@@ -610,8 +610,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='TeX Live utils'
 PACKAGE_TARNAME='tex-live-utils'
-PACKAGE_VERSION='2023'
-PACKAGE_STRING='TeX Live utils 2023'
+PACKAGE_VERSION='2024'
+PACKAGE_STRING='TeX Live utils 2024'
 PACKAGE_BUGREPORT='tex-k@tug.org'
 PACKAGE_URL=''
 
@@ -729,23 +729,6 @@ enable_native_texlive_build
 enable_multiplatform
 enable_cxx_runtime_hack
 enable_libtool_hack
-enable_autosp
-enable_axodraw2
-enable_devnag
-enable_lacheck
-enable_m_tx
-enable_pmx
-enable_ps2eps
-enable_t1utils
-enable_texdoctk
-enable_tpic2pdftex
-enable_vlna
-enable_xindy
-enable_xindy_rules
-enable_xindy_docs
-with_clisp_runtime
-enable_xml2pmx
-enable_xpdfopen
 enable_web2c
 with_banner_add
 with_editor
@@ -794,84 +777,15 @@ enable_tektronixwin
 enable_unitermwin
 enable_web_progs
 enable_synctex
-enable_afm2pl
-enable_bibtex_x
-enable_bibtex8
-enable_bibtexu
-enable_chktex
-enable_cjkutils
-enable_detex
-enable_dtl
-enable_dvi2tty
-enable_dvidvi
-enable_dviljk
-enable_dviout_util
-enable_dvipdfm_x
-enable_dvipng
-enable_debug
-enable_timing
-with_gs
-enable_dvipos
-enable_dvipsk
-enable_dvisvgm
-enable_gregorio
-enable_gsftopk
-enable_lcdf_typetools
-enable_cfftot1
-enable_mmafm
-enable_mmpfb
-enable_otfinfo
-enable_otftotfm
-enable_t1dotlessj
-enable_t1lint
-enable_t1rawafm
-enable_t1reencode
-enable_t1testpage
-enable_ttftotype42
-enable_updmap
-enable_makeindexk
-enable_makejvf
-enable_mendexk
-enable_musixtnt
-enable_ps2pk
-enable_psutils
-enable_seetexk
-enable_tex4htk
-enable_ttf2pk2
-enable_ttfdump
-enable_upmendex
-enable_xdvik
-with_xdvi_x_toolkit
 enable_texlive
 enable_linked_scripts
 with_system_harfbuzz
-with_system_icu
-with_system_teckit
 with_system_graphite2
 with_system_zziplib
-with_system_mpfr
-with_mpfr_includes
-with_mpfr_libdir
-with_system_gmp
-with_gmp_includes
-with_gmp_libdir
-with_system_cairo
-with_system_pixman
-with_system_gd
-with_gd_includes
-with_gd_libdir
-with_system_potrace
-with_potrace_includes
-with_potrace_libdir
-with_system_freetype2
 with_system_libpng
-with_system_libpaper
-with_libpaper_includes
-with_libpaper_libdir
 with_system_zlib
 with_zlib_includes
 with_zlib_libdir
-with_system_ptexenc
 with_system_kpathsea
 enable_mktexmf_default
 enable_mktexpk_default
@@ -1441,7 +1355,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures TeX Live utils 2023 to adapt to many kinds of systems.
+\`configure' configures TeX Live utils 2024 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1512,7 +1426,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of TeX Live utils 2023:";;
+     short | recursive ) echo "Configuration of TeX Live utils 2024:";;
    esac
   cat <<\_ACEOF
 
@@ -1529,22 +1443,6 @@ Optional Features:
                           lib/PLATFORM
   --enable-cxx-runtime-hack  link C++ runtime statically
   --enable-libtool-hack   ignore libtool dependency_libs
-  --disable-autosp        do not build the autosp package
-  --disable-axodraw2      do not build the axodraw2 package
-  --disable-devnag        do not build the devnag package
-  --disable-lacheck       do not build the lacheck package
-  --disable-m-tx          do not build the m-tx package
-  --disable-pmx           do not build the pmx package
-  --disable-ps2eps        do not build the ps2eps package
-  --disable-t1utils       do not build the t1utils package
-  --disable-texdoctk      do not build the texdoctk package
-  --disable-tpic2pdftex   do not build the tpic2pdftex package
-  --disable-vlna          do not build the vlna package
-  --enable-xindy          build the xindy package
-  --enable-xindy-rules      build and install make-rules package
-  --enable-xindy-docs       build and install documentation
-  --disable-xml2pmx       do not build the xml2pmx package
-  --disable-xpdfopen      do not build the xpdfopen package
   --disable-web2c         do not build the web2c (TeX & Co.) package
   --enable-auto-core        cause TeX&MF to dump core, given a certain
                             filename
@@ -1593,57 +1491,6 @@ Optional Features:
   --enable-unitermwin         include Uniterm window support
   --disable-web-progs       do not build WEB programs bibtex ... weave
   --disable-synctex         do not build the SyncTeX library and tool
-  --disable-afm2pl        do not build the afm2pl package
-  --disable-bibtex-x      do not build the bibtex-x package
-  --disable-bibtex8         do not build the bibtex8 program
-  --disable-bibtexu         do not build the bibtexu program
-  --disable-chktex        do not build the chktex package
-  --disable-cjkutils      do not build the cjkutils package
-  --disable-detex         do not build the detex package
-  --disable-dtl           do not build the dtl package
-  --disable-dvi2tty       do not build the dvi2tty package
-  --disable-dvidvi        do not build the dvidvi package
-  --disable-dviljk        do not build the dviljk package
-  --disable-dviout-util   do not build the dviout-util package
-  --disable-dvipdfm-x     do not build the dvipdfm-x package
-  --disable-dvipng        do not build the dvipng package
-  --disable-debug           Compile without debug (-d) option
-  --enable-timing           Output execution time of dvipng
-  --disable-dvipos        do not build the dvipos package
-  --disable-dvipsk        do not build the dvipsk package
-  --disable-dvisvgm       do not build the dvisvgm package
-  --disable-gregorio      do not build the gregorio package
-  --disable-gsftopk       do not build the gsftopk package
-  --disable-lcdf-typetools
-                          do not build the lcdf-typetools package
-  --disable-cfftot1         do not build the cfftot1 program
-  --disable-mmafm           do not build the mmafm program
-  --disable-mmpfb           do not build the mmpfb program
-  --disable-otfinfo         do not build the otfinfo program
-  --disable-otftotfm        do not build the otftotfm program
-  --disable-t1dotlessj      do not build the t1dotlessj program
-  --disable-t1lint          do not build the t1lint program
-  --disable-t1rawafm        do not build the t1rawafm program
-  --disable-t1reencode      do not build the t1reencode program
-  --disable-t1testpage      do not build the t1testpage program
-  --disable-ttftotype42     do not build the ttftotype42 program
-  --disable-auto-cfftot1    disable running cfftot1 from otftotfm
-  --disable-auto-t1dotlessj disable running t1dotlessj from otftotfm
-  --disable-auto-ttftotype42
-                            disable running ttftotype42 from otftotfm
-  --disable-auto-updmap     disable running updmap from otftotfm
-  --disable-makeindexk    do not build the makeindexk package
-  --disable-makejvf       do not build the makejvf package
-  --disable-mendexk       do not build the mendexk package
-  --disable-musixtnt      do not build the musixtnt package
-  --disable-ps2pk         do not build the ps2pk package
-  --disable-psutils       do not build the psutils package
-  --disable-seetexk       do not build the seetexk package
-  --disable-tex4htk       do not build the tex4htk package
-  --disable-ttf2pk2       do not build the ttf2pk2 package
-  --disable-ttfdump       do not build the ttfdump package
-  --disable-upmendex      do not build the upmendex package
-  --disable-xdvik         do not build the xdvik package
   --disable-texlive       do not build the texlive (TeX Live scripts) package
   --disable-linked-scripts  do not install the linked scripts
   --disable-mktexmf-default   do not run mktexmf if MF source missing
@@ -1669,62 +1516,22 @@ Optional Features:
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-clisp-runtime=PATH
-                          pathname of clisp runtime to install for `xindy',
-                          `default' to derive from clisp, or `system' to use
-                          installed version
   --with-banner-add=STR   add STR to version string appended to banner lines
   --with-editor=CMD       invoke CMD from the `e' option [vi +%d '%s'] or
                           [texworks --position=%d "%s"]
   --with-mf-x-toolkit     use X toolkit for METAFONT
-  --with-gs=/PATH/TO/gs   Hard-wire the location of GhostScript
-  --with-xdvi-x-toolkit=KIT
-                          Use toolkit KIT (xaw/motif/xaw3d/neXtaw) for xdvi
-                          [default: Xaw]
   --with-system-harfbuzz  use installed harfbuzz headers and library (requires
                           pkg-config)
-  --with-system-icu       use installed ICU headers and libraries (requires
-                          pkg-config or icu-config)
-  --with-system-teckit    use installed teckit headers and library (requires
-                          pkg-config)
   --with-system-graphite2 use installed graphite2 headers and library
                           (requires pkg-config)
   --with-system-zziplib   use installed zziplib headers and library (requires
                           pkg-config)
-  --with-system-mpfr      use installed mpfr headers and library
-  --with-mpfr-includes=DIR
-                          mpfr headers installed in DIR
-  --with-mpfr-libdir=DIR  mpfr library installed in DIR
-  --with-system-gmp       use installed gmp headers and library
-  --with-gmp-includes=DIR gmp headers installed in DIR
-  --with-gmp-libdir=DIR   gmp library installed in DIR
-  --with-system-cairo     use installed cairo headers and library (requires
-                          pkg-config)
-  --with-system-pixman    use installed pixman headers and library (requires
-                          pkg-config)
-  --with-system-gd        use installed gd headers and library
-  --with-gd-includes=DIR  gd headers installed in DIR
-  --with-gd-libdir=DIR    gd library installed in DIR
-  --with-system-potrace   use installed potrace headers and library
-  --with-potrace-includes=DIR
-                          potrace headers installed in DIR
-  --with-potrace-libdir=DIR
-                          potrace library installed in DIR
-  --with-system-freetype2 use installed freetype2 headers and library
-                          (requires freetype-config)
   --with-system-libpng    use installed libpng headers and library (requires
                           pkg-config)
-  --with-system-libpaper  use installed libpaper headers and library
-  --with-libpaper-includes=DIR
-                          libpaper headers installed in DIR
-  --with-libpaper-libdir=DIR
-                          libpaper library installed in DIR
   --with-system-zlib      use installed zlib headers and library
   --with-zlib-includes=DIR
                           zlib headers installed in DIR
   --with-zlib-libdir=DIR  zlib library installed in DIR
-  --with-system-ptexenc   use installed ptexenc headers and library (requires
-                          pkg-config)
   --with-system-kpathsea  use installed kpathsea headers and library (requires
                           pkg-config)
 
@@ -1804,7 +1611,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-TeX Live utils configure 2023
+TeX Live utils configure 2024
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -1927,7 +1734,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by TeX Live utils $as_me 2023, which was
+It was created by TeX Live utils $as_me 2024, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -4052,332 +3859,6 @@ printf "%s\n" "$as_me: $host -> \`--disable-mfluajit-nowin'" >&6;}
 esac ;;
 esac
 
-## utils/autosp/ac/withenable.ac: configure.ac fragment for Tl subdir
-## configure options and TL libraries required for autosp.
-# Check whether --enable-autosp was given.
-if test ${enable_autosp+y}
-then :
-  enableval=$enable_autosp;
-fi
-case $enable_autosp in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_autosp=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-autosp=$enable_autosp'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-autosp=$enable_autosp'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-autosp=$enable_autosp'"
-    ;;
-esac
-
-## utils/axodraw2/ac/withenable.ac: configure.ac fragment for TL subdir
-## configure options and TL libraries for axodraw2.
-# Check whether --enable-axodraw2 was given.
-if test ${enable_axodraw2+y}
-then :
-  enableval=$enable_axodraw2;
-fi
-case $enable_axodraw2 in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_axodraw2=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-axodraw2=$enable_axodraw2'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-axodraw2=$enable_axodraw2'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-axodraw2=$enable_axodraw2'"
-    ;;
-esac
-
-## utils/devnag/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory utils/devnag/
-## configure options and TL libraries required for devnag
-# Check whether --enable-devnag was given.
-if test ${enable_devnag+y}
-then :
-  enableval=$enable_devnag;
-fi
-case $enable_devnag in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_devnag=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-devnag=$enable_devnag'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-devnag=$enable_devnag'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-devnag=$enable_devnag'"
-    ;;
-esac
-
-## utils/lacheck/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory utils/lacheck/
-## configure options and TL libraries required for lacheck
-# Check whether --enable-lacheck was given.
-if test ${enable_lacheck+y}
-then :
-  enableval=$enable_lacheck;
-fi
-case $enable_lacheck in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_lacheck=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-lacheck=$enable_lacheck'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-lacheck=$enable_lacheck'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-lacheck=$enable_lacheck'"
-    ;;
-esac
-
-## utils/m-tx/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory utils/m-tx/
-## configure options and TL libraries required for mtx
-# Check whether --enable-m-tx was given.
-if test ${enable_m_tx+y}
-then :
-  enableval=$enable_m_tx;
-fi
-case $enable_m_tx in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_m_tx=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-m-tx=$enable_m_tx'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-m-tx=$enable_m_tx'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-m-tx=$enable_m_tx'"
-    ;;
-esac
-
-## utils/pmx/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory utils/pmx/
-## configure options and TL libraries required for pmx
-# Check whether --enable-pmx was given.
-if test ${enable_pmx+y}
-then :
-  enableval=$enable_pmx;
-fi
-case $enable_pmx in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_pmx=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-pmx=$enable_pmx'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-pmx=$enable_pmx'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-pmx=$enable_pmx'"
-    ;;
-esac
-
-## utils/ps2eps/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory utils/ps2eps/
-## configure options and TL libraries required for ps2eps
-# Check whether --enable-ps2eps was given.
-if test ${enable_ps2eps+y}
-then :
-  enableval=$enable_ps2eps;
-fi
-case $enable_ps2eps in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_ps2eps=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-ps2eps=$enable_ps2eps'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-ps2eps=$enable_ps2eps'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-ps2eps=$enable_ps2eps'"
-    ;;
-esac
-
-## utils/t1utils/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory utils/t1utils/
-## configure options and TL libraries required for t1utils
-# Check whether --enable-t1utils was given.
-if test ${enable_t1utils+y}
-then :
-  enableval=$enable_t1utils;
-fi
-case $enable_t1utils in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_t1utils=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-t1utils=$enable_t1utils'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-t1utils=$enable_t1utils'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-t1utils=$enable_t1utils'"
-    ;;
-esac
-
-## utils/texdoctk/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory utils/texdoctk/
-## configure options and TL libraries required for texdoctk
-# Check whether --enable-texdoctk was given.
-if test ${enable_texdoctk+y}
-then :
-  enableval=$enable_texdoctk;
-fi
-case $enable_texdoctk in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_texdoctk=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-texdoctk=$enable_texdoctk'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-texdoctk=$enable_texdoctk'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-texdoctk=$enable_texdoctk'"
-    ;;
-esac
-
-## utils/tpic2pdftex/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory utils/tpic2pdftex/
-## configure options and TL libraries required for tpic2pdftex
-# Check whether --enable-tpic2pdftex was given.
-if test ${enable_tpic2pdftex+y}
-then :
-  enableval=$enable_tpic2pdftex;
-fi
-case $enable_tpic2pdftex in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_tpic2pdftex=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-tpic2pdftex=$enable_tpic2pdftex'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-tpic2pdftex=$enable_tpic2pdftex'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-tpic2pdftex=$enable_tpic2pdftex'"
-    ;;
-esac
-
-## utils/vlna/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory utils/vlna/
-## configure options and TL libraries required for vlna
-# Check whether --enable-vlna was given.
-if test ${enable_vlna+y}
-then :
-  enableval=$enable_vlna;
-fi
-case $enable_vlna in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_vlna=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-vlna=$enable_vlna'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-vlna=$enable_vlna'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-vlna=$enable_vlna'"
-    ;;
-esac
-
-## utils/xindy/ac/withenable.ac: configure.ac fragment for TL subdir
-## configure options and TL libraries required for xindy.
-# Check whether --enable-xindy was given.
-if test ${enable_xindy+y}
-then :
-  enableval=$enable_xindy;
-fi
-case $enable_xindy in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_xindy=no
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-xindy=$enable_xindy'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-xindy=$enable_xindy'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-xindy=$enable_xindy'"
-    ;;
-esac
-
-## utils/xindy/ac/xindy.ac: configure.ac fragment for the TeX Live subdirectory utils/xindy/
-## configure options for xindy
-# Check whether --enable-xindy-rules was given.
-if test ${enable_xindy_rules+y}
-then :
-  enableval=$enable_xindy_rules;
-fi
-# Check whether --enable-xindy-docs was given.
-if test ${enable_xindy_docs+y}
-then :
-  enableval=$enable_xindy_docs;
-fi
-
-# Check whether --with-clisp-runtime was given.
-if test ${with_clisp_runtime+y}
-then :
-  withval=$with_clisp_runtime;
-fi
-
-## utils/xindy/ac/clisp.ac: configure.ac fragment for the TeX Live subdirectory utils/xindy/
-## configure checks for xindy and clisp
-case $with_clisp_runtime in #(
-  default) :
-     ;; #(
-  system) :
-    if test "x$enable_native_texlive_build" = xyes
-then :
-  as_fn_error $? "you can not use the installed clisp for a native TeX Live build" "$LINENO" 5
-fi ;; #(
-  "") :
-    if test "x$enable_native_texlive_build" = xyes
-then :
-  with_clisp_runtime=default
-else $as_nop
-  with_clisp_runtime=system
-fi
-               { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--with-clisp-runtime=$with_clisp_runtime'" >&5
-printf "%s\n" "$as_me: Assuming \`--with-clisp-runtime=$with_clisp_runtime'" >&6;}
-               ac_configure_args="$ac_configure_args '--with-clisp-runtime=$with_clisp_runtime'" ;; #(
-  *) :
-    if test ! -f "$with_clisp_runtime"
-then :
-  as_fn_error $? "no such file: \"$with_clisp_runtime\"" "$LINENO" 5
-fi ;;
-esac
-
-## utils/xml2pmx/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory utils/xml2pmx/
-## configure options and TL libraries required for xml2pmx
-# Check whether --enable-xml2pmx was given.
-if test ${enable_xml2pmx+y}
-then :
-  enableval=$enable_xml2pmx;
-fi
-case $enable_xml2pmx in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_xml2pmx=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-xml2pmx=$enable_xml2pmx'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-xml2pmx=$enable_xml2pmx'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-xml2pmx=$enable_xml2pmx'"
-    ;;
-esac
-
-## utils/xpdfopen/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory utils/xpdfopen/
-## configure options and TL libraries required for xpdfopen
-# Check whether --enable-xpdfopen was given.
-if test ${enable_xpdfopen+y}
-then :
-  enableval=$enable_xpdfopen;
-fi
-if test "x$with_x" = xno
-then :
-  case $enable_xpdfopen in #(
-  "") :
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \`--without-x' -> \`--disable-xpdfopen'" >&5
-printf "%s\n" "$as_me: \`--without-x' -> \`--disable-xpdfopen'" >&6;}
-                      enable_xpdfopen=no
-                      ac_configure_args="$ac_configure_args '--disable-xpdfopen'" ;; #(
-  yes) :
-    as_fn_error $? "Sorry, incompatible options \`--without-x' and \`--enable-xpdfopen'" "$LINENO" 5 ;; #(
-  *) :
-     ;;
-esac
-fi
-case $enable_xpdfopen in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_xpdfopen=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-xpdfopen=$enable_xpdfopen'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-xpdfopen=$enable_xpdfopen'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-xpdfopen=$enable_xpdfopen'"
-    ;;
-esac
-
 
 ## texk/web2c/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/web2c/
 ## configure options and TL libraries required for web2c
@@ -4900,999 +4381,88 @@ then :
 fi
 
 
-## texk/afm2pl/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/afm2pl/
-## configure options and TL libraries required for afm2pl
-# Check whether --enable-afm2pl was given.
-if test ${enable_afm2pl+y}
+## texk/texlive/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/texlive/
+## configure options and TL libraries required for texlive
+# Check whether --enable-texlive was given.
+if test ${enable_texlive+y}
 then :
-  enableval=$enable_afm2pl;
+  enableval=$enable_texlive;
 fi
-case $enable_afm2pl in #(
+case $enable_texlive in #(
   yes|no) :
      ;; #(
   *) :
 
-   enable_afm2pl=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-afm2pl=$enable_afm2pl'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-afm2pl=$enable_afm2pl'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-afm2pl=$enable_afm2pl'"
+   enable_texlive=$enable_all_pkgs
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-texlive=$enable_texlive'" >&5
+printf "%s\n" "$as_me: Assuming \`--enable-texlive=$enable_texlive'" >&6;}
+     ac_configure_args="$ac_configure_args '--enable-texlive=$enable_texlive'"
     ;;
 esac
 
-test "x$enable_afm2pl" = xno || {
-  need_kpathsea=yes
-}
-
-## texk/bibtex-x/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/bibtex-x/
-## configure options and TL libraries required for bibtex-x
-# Check whether --enable-bibtex-x was given.
-if test ${enable_bibtex_x+y}
+## texk/texlive/ac/texlive.ac: configure.ac fragment for the TeX Live subdirectory texk/texlive/
+## configure options for texlive
+# Check whether --enable-linked-scripts was given.
+if test ${enable_linked_scripts+y}
 then :
-  enableval=$enable_bibtex_x;
+  enableval=$enable_linked_scripts;
 fi
-case $enable_bibtex_x in #(
-  yes|no) :
-     ;; #(
-  *) :
 
-   enable_bibtex_x=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-bibtex-x=$enable_bibtex_x'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-bibtex-x=$enable_bibtex_x'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-bibtex-x=$enable_bibtex_x'"
-    ;;
-esac
 
-test "x$enable_bibtex_x" = xno || {
-  need_kpathsea=yes
-}
+## libs/pplib/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/pplib/
+## configure options and TL libraries required for pplib
 
-## texk/bibtex-x/ac/bibtex-x.ac: configure.ac fragment for the TeX Live subdirectory texk/bibtex-x/
-## configure options for bibtex-x
-# Check whether --enable-bibtex8 was given.
-if test ${enable_bibtex8+y}
-then :
-  enableval=$enable_bibtex8;
-fi
+## libs/harfbuzz/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/harfbuzz/
+## configure options and TL libraries required for harfbuzz
 
-case $enable_bibtex8 in #(
-  yes | no) :
-     ;; #(
-  *) :
-    enable_bibtex8=yes ;;
-esac
-# Check whether --enable-bibtexu was given.
-if test ${enable_bibtexu+y}
+# Check whether --with-system-harfbuzz was given.
+if test ${with_system_harfbuzz+y}
 then :
-  enableval=$enable_bibtexu;
+  withval=$with_system_harfbuzz;
 fi
-
-case $enable_bibtexu in #(
-  yes | no) :
-     ;; #(
-  *) :
-    enable_bibtexu=yes ;;
-esac
-
-test "x$enable_bibtex_x:$enable_bibtexu" = xyes:yes && need_icu=yes
-
-## texk/chktex/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/chktex/
-## configure options and TL libraries required for chktex
-# Check whether --enable-chktex was given.
-if test ${enable_chktex+y}
-then :
-  enableval=$enable_chktex;
+if test "x$with_system_harfbuzz" = x; then
+  if test -f $srcdir/../libs/harfbuzz/configure; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`harfbuzz' headers and library from TL tree" >&5
+printf "%s\n" "$as_me: Assuming \`harfbuzz' headers and library from TL tree" >&6;}
+    with_system_harfbuzz=no
+  else
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming installed \`harfbuzz' headers and library" >&5
+printf "%s\n" "$as_me: Assuming installed \`harfbuzz' headers and library" >&6;}
+    with_system_harfbuzz=yes
+  fi
+  ac_configure_args="$ac_configure_args '--with-system-harfbuzz=$with_system_harfbuzz'"
+fi
+if test "x$with_system_harfbuzz" = xyes; then
+  if test "x$with_system_graphite2" = x; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ->  installed \`graphite2' headers and library" >&5
+printf "%s\n" "$as_me:   ->  installed \`graphite2' headers and library" >&6;}
+    with_system_graphite2=yes
+    ac_configure_args="$ac_configure_args '--with-system-graphite2'"
+  elif test "x$with_system_graphite2" != xyes; then
+    as_fn_error $? "Sorry, \`--with-system-harfbuzz' requires \`--with-system-graphite2'" "$LINENO" 5
+  fi
+  if test "x$with_system_icu" = x; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ->  installed \`icu' headers and library" >&5
+printf "%s\n" "$as_me:   ->  installed \`icu' headers and library" >&6;}
+    with_system_icu=yes
+    ac_configure_args="$ac_configure_args '--with-system-icu'"
+  elif test "x$with_system_icu" != xyes; then
+    as_fn_error $? "Sorry, \`--with-system-harfbuzz' requires \`--with-system-icu'" "$LINENO" 5
+  fi
 fi
-case $enable_chktex in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_chktex=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-chktex=$enable_chktex'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-chktex=$enable_chktex'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-chktex=$enable_chktex'"
-    ;;
-esac
 
-test "x$enable_chktex" = xno || {
-  need_kpathsea=yes
+test "x$need_harfbuzz" = xyes && {
+  need_graphite2=yes
+  need_icu=yes
 }
 
-## texk/cjkutils/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/cjkutils/
-## configure options and TL libraries required for cjkutils
-# Check whether --enable-cjkutils was given.
-if test ${enable_cjkutils+y}
+## libs/graphite2/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/graphite2/
+## configure options and TL libraries required for graphite2
+
+# Check whether --with-system-graphite2 was given.
+if test ${with_system_graphite2+y}
 then :
-  enableval=$enable_cjkutils;
-fi
-case $enable_cjkutils in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_cjkutils=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-cjkutils=$enable_cjkutils'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-cjkutils=$enable_cjkutils'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-cjkutils=$enable_cjkutils'"
-    ;;
-esac
-
-test "x$enable_cjkutils" = xno || {
-  need_kpathsea=yes
-}
-
-## texk/detex/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/detex/
-## configure options and TL libraries required for detex
-# Check whether --enable-detex was given.
-if test ${enable_detex+y}
-then :
-  enableval=$enable_detex;
-fi
-case $enable_detex in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_detex=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-detex=$enable_detex'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-detex=$enable_detex'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-detex=$enable_detex'"
-    ;;
-esac
-
-test "x$enable_detex" = xno || {
-  need_kpathsea=yes
-}
-
-## texk/dtl/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/dtl/
-## configure options and TL libraries required for dtl
-# Check whether --enable-dtl was given.
-if test ${enable_dtl+y}
-then :
-  enableval=$enable_dtl;
-fi
-case $enable_dtl in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_dtl=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-dtl=$enable_dtl'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-dtl=$enable_dtl'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-dtl=$enable_dtl'"
-    ;;
-esac
-
-test "x$enable_dtl" = xno || {
-  need_kpathsea=yes
-}
-
-## texk/dvi2tty/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/dvi2tty/
-## configure options and TL libraries required for dvi2tty
-# Check whether --enable-dvi2tty was given.
-if test ${enable_dvi2tty+y}
-then :
-  enableval=$enable_dvi2tty;
-fi
-case $enable_dvi2tty in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_dvi2tty=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-dvi2tty=$enable_dvi2tty'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-dvi2tty=$enable_dvi2tty'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-dvi2tty=$enable_dvi2tty'"
-    ;;
-esac
-
-test "x$enable_dvi2tty" = xno || {
-  need_ptexenc=yes
-}
-
-## texk/dvidvi/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/dvidvi/
-## configure options and TL libraries required for dvidvi
-# Check whether --enable-dvidvi was given.
-if test ${enable_dvidvi+y}
-then :
-  enableval=$enable_dvidvi;
-fi
-case $enable_dvidvi in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_dvidvi=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-dvidvi=$enable_dvidvi'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-dvidvi=$enable_dvidvi'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-dvidvi=$enable_dvidvi'"
-    ;;
-esac
-
-test "x$enable_dvidvi" = xno || {
-  need_kpathsea=yes
-}
-
-## texk/dviljk/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/dviljk/
-## configure options and TL libraries required for dviljk
-# Check whether --enable-dviljk was given.
-if test ${enable_dviljk+y}
-then :
-  enableval=$enable_dviljk;
-fi
-case $enable_dviljk in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_dviljk=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-dviljk=$enable_dviljk'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-dviljk=$enable_dviljk'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-dviljk=$enable_dviljk'"
-    ;;
-esac
-
-test "x$enable_dviljk" = xno || {
-  need_kpathsea=yes
-}
-
-## texk/dviout-util/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/dviout-util/
-## configure options and TL libraries required for dviout-util
-# Check whether --enable-dviout-util was given.
-if test ${enable_dviout_util+y}
-then :
-  enableval=$enable_dviout_util;
-fi
-case $enable_dviout_util in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_dviout_util=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-dviout-util=$enable_dviout_util'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-dviout-util=$enable_dviout_util'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-dviout-util=$enable_dviout_util'"
-    ;;
-esac
-
-test "x$enable_dviout_util" = xno || {
-  need_ptexenc=yes
-}
-
-## texk/dvipdfm-x/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/dvipdfm-x/
-## configure options and TL libraries required for dvipdfm-x
-# Check whether --enable-dvipdfm-x was given.
-if test ${enable_dvipdfm_x+y}
-then :
-  enableval=$enable_dvipdfm_x;
-fi
-case $enable_dvipdfm_x in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_dvipdfm_x=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-dvipdfm-x=$enable_dvipdfm_x'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-dvipdfm-x=$enable_dvipdfm_x'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-dvipdfm-x=$enable_dvipdfm_x'"
-    ;;
-esac
-
-test "x$enable_dvipdfm_x" = xno || {
-  need_kpathsea=yes
-  need_libpng=yes
-  need_libpaper=yes
-}
-
-## texk/dvipng/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/dvipng/
-## configure options and TL libraries required for dvipng
-# Check whether --enable-dvipng was given.
-if test ${enable_dvipng+y}
-then :
-  enableval=$enable_dvipng;
-fi
-case $enable_dvipng in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_dvipng=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-dvipng=$enable_dvipng'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-dvipng=$enable_dvipng'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-dvipng=$enable_dvipng'"
-    ;;
-esac
-
-test "x$enable_dvipng" = xno || {
-  need_kpathsea=yes
-  need_gd=yes
-}
-
-## texk/dvipng/ac/dvipng.ac: configure.ac fragment for the TeX Live subdirectory texk/dvipng/
-## configure options for dvipng
-# Check whether --enable-debug was given.
-if test ${enable_debug+y}
-then :
-  enableval=$enable_debug;
-fi
-
-# Check whether --enable-timing was given.
-if test ${enable_timing+y}
-then :
-  enableval=$enable_timing;
-fi
-
-
-# Check whether --with-gs was given.
-if test ${with_gs+y}
-then :
-  withval=$with_gs;
-fi
-
-
-## texk/dvipos/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/dvipos/
-## configure options and TL libraries required for dvipos
-# Check whether --enable-dvipos was given.
-if test ${enable_dvipos+y}
-then :
-  enableval=$enable_dvipos;
-fi
-case $enable_dvipos in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_dvipos=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-dvipos=$enable_dvipos'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-dvipos=$enable_dvipos'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-dvipos=$enable_dvipos'"
-    ;;
-esac
-
-test "x$enable_dvipos" = xno || {
-  need_kpathsea=yes
-}
-
-## texk/dvipsk/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/dvipsk/
-## configure options and TL libraries required for dvipsk
-# Check whether --enable-dvipsk was given.
-if test ${enable_dvipsk+y}
-then :
-  enableval=$enable_dvipsk;
-fi
-case $enable_dvipsk in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_dvipsk=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-dvipsk=$enable_dvipsk'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-dvipsk=$enable_dvipsk'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-dvipsk=$enable_dvipsk'"
-    ;;
-esac
-
-test "x$enable_dvipsk" = xno || {
-  need_kpathsea=yes
-}
-
-# texk/dvisvgm/ac/withenable.ac: configure.ac fragment
-## configure options and TL libraries required for dvisvgm
-# Check whether --enable-dvisvgm was given.
-if test ${enable_dvisvgm+y}
-then :
-  enableval=$enable_dvisvgm;
-fi
-case $enable_dvisvgm in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_dvisvgm=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-dvisvgm=$enable_dvisvgm'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-dvisvgm=$enable_dvisvgm'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-dvisvgm=$enable_dvisvgm'"
-    ;;
-esac
-
-test "x$enable_dvisvgm" = xno || {
-  need_kpathsea=yes
-  need_potrace=yes
-  need_freetype2=yes
-  need_zlib=yes
-}
-
-## texk/gregorio/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/gregorio/
-## configure options and TL libraries required for gregorio
-# Check whether --enable-gregorio was given.
-if test ${enable_gregorio+y}
-then :
-  enableval=$enable_gregorio;
-fi
-case $enable_gregorio in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_gregorio=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-gregorio=$enable_gregorio'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-gregorio=$enable_gregorio'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-gregorio=$enable_gregorio'"
-    ;;
-esac
-
-test "x$enable_gregorio" = xno || {
-  need_kpathsea=yes
-}
-
-## texk/gsftopk/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/gsftopk/
-## configure options and TL libraries required for gsftopk
-# Check whether --enable-gsftopk was given.
-if test ${enable_gsftopk+y}
-then :
-  enableval=$enable_gsftopk;
-fi
-case $enable_gsftopk in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_gsftopk=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-gsftopk=$enable_gsftopk'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-gsftopk=$enable_gsftopk'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-gsftopk=$enable_gsftopk'"
-    ;;
-esac
-
-test "x$enable_gsftopk" = xno || {
-  need_kpathsea=yes
-}
-
-## texk/lcdf-typetools/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/lcdf-typetools/
-## configure options and TL libraries required for lcdf-typetools
-# Check whether --enable-lcdf-typetools was given.
-if test ${enable_lcdf_typetools+y}
-then :
-  enableval=$enable_lcdf_typetools;
-fi
-case $enable_lcdf_typetools in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_lcdf_typetools=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-lcdf-typetools=$enable_lcdf_typetools'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-lcdf-typetools=$enable_lcdf_typetools'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-lcdf-typetools=$enable_lcdf_typetools'"
-    ;;
-esac
-
-test "x$enable_lcdf_typetools" = xno || {
-  need_kpathsea=yes
-}
-
-## Define configure options for lcdf-typetools.  Extracted from configure.ac
-## for ease of building TeX Live.
-# Check whether --enable-cfftot1 was given.
-if test ${enable_cfftot1+y}
-then :
-  enableval=$enable_cfftot1;
-fi
-# Check whether --enable-mmafm was given.
-if test ${enable_mmafm+y}
-then :
-  enableval=$enable_mmafm;
-fi
-# Check whether --enable-mmpfb was given.
-if test ${enable_mmpfb+y}
-then :
-  enableval=$enable_mmpfb;
-fi
-# Check whether --enable-otfinfo was given.
-if test ${enable_otfinfo+y}
-then :
-  enableval=$enable_otfinfo;
-fi
-# Check whether --enable-otftotfm was given.
-if test ${enable_otftotfm+y}
-then :
-  enableval=$enable_otftotfm;
-fi
-# Check whether --enable-t1dotlessj was given.
-if test ${enable_t1dotlessj+y}
-then :
-  enableval=$enable_t1dotlessj;
-fi
-# Check whether --enable-t1lint was given.
-if test ${enable_t1lint+y}
-then :
-  enableval=$enable_t1lint;
-fi
-# Check whether --enable-t1rawafm was given.
-if test ${enable_t1rawafm+y}
-then :
-  enableval=$enable_t1rawafm;
-fi
-# Check whether --enable-t1reencode was given.
-if test ${enable_t1reencode+y}
-then :
-  enableval=$enable_t1reencode;
-fi
-# Check whether --enable-t1testpage was given.
-if test ${enable_t1testpage+y}
-then :
-  enableval=$enable_t1testpage;
-fi
-# Check whether --enable-ttftotype42 was given.
-if test ${enable_ttftotype42+y}
-then :
-  enableval=$enable_ttftotype42;
-fi
-
-# Check whether --enable-cfftot1 was given.
-if test ${enable_cfftot1+y}
-then :
-  enableval=$enable_cfftot1;
-fi
-# Check whether --enable-t1dotlessj was given.
-if test ${enable_t1dotlessj+y}
-then :
-  enableval=$enable_t1dotlessj;
-fi
-# Check whether --enable-ttftotype42 was given.
-if test ${enable_ttftotype42+y}
-then :
-  enableval=$enable_ttftotype42;
-fi
-# Check whether --enable-updmap was given.
-if test ${enable_updmap+y}
-then :
-  enableval=$enable_updmap;
-fi
-
-
-## texk/makeindexk/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/makeindexk/
-## configure options and TL libraries required for makeindexk
-# Check whether --enable-makeindexk was given.
-if test ${enable_makeindexk+y}
-then :
-  enableval=$enable_makeindexk;
-fi
-case $enable_makeindexk in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_makeindexk=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-makeindexk=$enable_makeindexk'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-makeindexk=$enable_makeindexk'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-makeindexk=$enable_makeindexk'"
-    ;;
-esac
-
-test "x$enable_makeindexk" = xno || {
-  need_kpathsea=yes
-}
-
-## texk/makejvf/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/makejvf/
-## configure options and TL libraries required for makejvf
-# Check whether --enable-makejvf was given.
-if test ${enable_makejvf+y}
-then :
-  enableval=$enable_makejvf;
-fi
-case $enable_makejvf in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_makejvf=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-makejvf=$enable_makejvf'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-makejvf=$enable_makejvf'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-makejvf=$enable_makejvf'"
-    ;;
-esac
-
-test "x$enable_makejvf" = xno || {
-  need_ptexenc=yes
-}
-
-## texk/mendexk/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/mendexk/
-## configure options and TL libraries required for mendexk
-# Check whether --enable-mendexk was given.
-if test ${enable_mendexk+y}
-then :
-  enableval=$enable_mendexk;
-fi
-case $enable_mendexk in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_mendexk=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-mendexk=$enable_mendexk'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-mendexk=$enable_mendexk'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-mendexk=$enable_mendexk'"
-    ;;
-esac
-
-test "x$enable_mendexk" = xno || {
-  need_ptexenc=yes
-}
-
-## texk/musixtnt/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/musixtnt/
-## configure options and TL libraries required for musixtnt
-# Check whether --enable-musixtnt was given.
-if test ${enable_musixtnt+y}
-then :
-  enableval=$enable_musixtnt;
-fi
-case $enable_musixtnt in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_musixtnt=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-musixtnt=$enable_musixtnt'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-musixtnt=$enable_musixtnt'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-musixtnt=$enable_musixtnt'"
-    ;;
-esac
-
-test "x$enable_musixtnt" = xno || {
-  need_kpathsea=yes
-}
-
-## texk/ps2pk/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/ps2pk/
-## configure options and TL libraries required for ps2pk
-# Check whether --enable-ps2pk was given.
-if test ${enable_ps2pk+y}
-then :
-  enableval=$enable_ps2pk;
-fi
-case $enable_ps2pk in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_ps2pk=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-ps2pk=$enable_ps2pk'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-ps2pk=$enable_ps2pk'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-ps2pk=$enable_ps2pk'"
-    ;;
-esac
-
-test "x$enable_ps2pk" = xno || {
-  need_kpathsea=yes
-}
-
-## texk/psutils/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/psutils/
-## configure options and TL libraries required for psutils
-# Check whether --enable-psutils was given.
-if test ${enable_psutils+y}
-then :
-  enableval=$enable_psutils;
-fi
-case $enable_psutils in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_psutils=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-psutils=$enable_psutils'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-psutils=$enable_psutils'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-psutils=$enable_psutils'"
-    ;;
-esac
-
-test "x$enable_psutils" = xno || {
-  need_kpathsea=yes
-  need_libpaper=yes
-}
-
-## texk/seetexk/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/seetexk/
-## configure options and TL libraries required for seetexk
-# Check whether --enable-seetexk was given.
-if test ${enable_seetexk+y}
-then :
-  enableval=$enable_seetexk;
-fi
-case $enable_seetexk in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_seetexk=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-seetexk=$enable_seetexk'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-seetexk=$enable_seetexk'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-seetexk=$enable_seetexk'"
-    ;;
-esac
-
-test "x$enable_seetexk" = xno || {
-  need_kpathsea=yes
-}
-
-## texk/tex4htk/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/tex4htk/
-## configure options and TL libraries required for tex4htk
-# Check whether --enable-tex4htk was given.
-if test ${enable_tex4htk+y}
-then :
-  enableval=$enable_tex4htk;
-fi
-case $enable_tex4htk in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_tex4htk=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-tex4htk=$enable_tex4htk'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-tex4htk=$enable_tex4htk'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-tex4htk=$enable_tex4htk'"
-    ;;
-esac
-
-test "x$enable_tex4htk" = xno || {
-  need_kpathsea=yes
-}
-
-## texk/ttf2pk2/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/ttf2pk2/
-## configure options and TL libraries required for ttf2pk
-# Check whether --enable-ttf2pk2 was given.
-if test ${enable_ttf2pk2+y}
-then :
-  enableval=$enable_ttf2pk2;
-fi
-case $enable_ttf2pk2 in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_ttf2pk2=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-ttf2pk2=$enable_ttf2pk2'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-ttf2pk2=$enable_ttf2pk2'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-ttf2pk2=$enable_ttf2pk2'"
-    ;;
-esac
-
-test "x$enable_ttf2pk2" = xno || {
-  need_kpathsea=yes
-  need_freetype2=yes
-}
-
-## texk/ttfdump/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/ttfdump/
-## configure options and TL libraries required for ttfdump
-# Check whether --enable-ttfdump was given.
-if test ${enable_ttfdump+y}
-then :
-  enableval=$enable_ttfdump;
-fi
-case $enable_ttfdump in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_ttfdump=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-ttfdump=$enable_ttfdump'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-ttfdump=$enable_ttfdump'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-ttfdump=$enable_ttfdump'"
-    ;;
-esac
-
-test "x$enable_ttfdump" = xno || {
-  need_kpathsea=yes
-}
-
-## texk/upmendex/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/upmendex/
-## configure options and TL libraries required for upmendex
-# Check whether --enable-upmendex was given.
-if test ${enable_upmendex+y}
-then :
-  enableval=$enable_upmendex;
-fi
-case $enable_upmendex in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_upmendex=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-upmendex=$enable_upmendex'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-upmendex=$enable_upmendex'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-upmendex=$enable_upmendex'"
-    ;;
-esac
-
-test "x$enable_upmendex" = xno || {
-  need_kpathsea=yes
-  need_icu=yes
-}
-
-## texk/xdvik/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/xdvik/
-## configure options and TL libraries required for xdvik
-# Check whether --enable-xdvik was given.
-if test ${enable_xdvik+y}
-then :
-  enableval=$enable_xdvik;
-fi
-if test "x$with_x" = xno
-then :
-  case $enable_xdvik in #(
-  "") :
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \`--without-x' -> \`--disable-xdvik'" >&5
-printf "%s\n" "$as_me: \`--without-x' -> \`--disable-xdvik'" >&6;}
-                      enable_xdvik=no
-                      ac_configure_args="$ac_configure_args '--disable-xdvik'" ;; #(
-  yes) :
-    as_fn_error $? "Sorry, incompatible options \`--without-x' and \`--enable-xdvik'" "$LINENO" 5 ;; #(
-  *) :
-     ;;
-esac
-fi
-case $enable_xdvik in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_xdvik=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-xdvik=$enable_xdvik'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-xdvik=$enable_xdvik'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-xdvik=$enable_xdvik'"
-    ;;
-esac
-
-test "x$enable_xdvik" = xno || {
-  need_kpathsea=yes
-  need_freetype2=yes
-}
-
-## texk/xdvik/ac/xdvik.ac: configure.ac fragment for the TeX Live subdirectory texk/xdvik/
-## configure options for xdvik
-
-# Check whether --with-xdvi-x-toolkit was given.
-if test ${with_xdvi_x_toolkit+y}
-then :
-  withval=$with_xdvi_x_toolkit;
-fi
-
-
-## texk/texlive/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/texlive/
-## configure options and TL libraries required for texlive
-# Check whether --enable-texlive was given.
-if test ${enable_texlive+y}
-then :
-  enableval=$enable_texlive;
-fi
-case $enable_texlive in #(
-  yes|no) :
-     ;; #(
-  *) :
-
-   enable_texlive=$enable_all_pkgs
-     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`--enable-texlive=$enable_texlive'" >&5
-printf "%s\n" "$as_me: Assuming \`--enable-texlive=$enable_texlive'" >&6;}
-     ac_configure_args="$ac_configure_args '--enable-texlive=$enable_texlive'"
-    ;;
-esac
-
-## texk/texlive/ac/texlive.ac: configure.ac fragment for the TeX Live subdirectory texk/texlive/
-## configure options for texlive
-# Check whether --enable-linked-scripts was given.
-if test ${enable_linked_scripts+y}
-then :
-  enableval=$enable_linked_scripts;
-fi
-
-
-## libs/pplib/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/pplib/
-## configure options and TL libraries required for pplib
-
-## libs/harfbuzz/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/harfbuzz/
-## configure options and TL libraries required for harfbuzz
-
-# Check whether --with-system-harfbuzz was given.
-if test ${with_system_harfbuzz+y}
-then :
-  withval=$with_system_harfbuzz;
-fi
-if test "x$with_system_harfbuzz" = x; then
-  if test -f $srcdir/../libs/harfbuzz/configure; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`harfbuzz' headers and library from TL tree" >&5
-printf "%s\n" "$as_me: Assuming \`harfbuzz' headers and library from TL tree" >&6;}
-    with_system_harfbuzz=no
-  else
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming installed \`harfbuzz' headers and library" >&5
-printf "%s\n" "$as_me: Assuming installed \`harfbuzz' headers and library" >&6;}
-    with_system_harfbuzz=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-harfbuzz=$with_system_harfbuzz'"
-fi
-if test "x$with_system_harfbuzz" = xyes; then
-  if test "x$with_system_graphite2" = x; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ->  installed \`graphite2' headers and library" >&5
-printf "%s\n" "$as_me:   ->  installed \`graphite2' headers and library" >&6;}
-    with_system_graphite2=yes
-    ac_configure_args="$ac_configure_args '--with-system-graphite2'"
-  elif test "x$with_system_graphite2" != xyes; then
-    as_fn_error $? "Sorry, \`--with-system-harfbuzz' requires \`--with-system-graphite2'" "$LINENO" 5
-  fi
-  if test "x$with_system_icu" = x; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ->  installed \`icu' headers and library" >&5
-printf "%s\n" "$as_me:   ->  installed \`icu' headers and library" >&6;}
-    with_system_icu=yes
-    ac_configure_args="$ac_configure_args '--with-system-icu'"
-  elif test "x$with_system_icu" != xyes; then
-    as_fn_error $? "Sorry, \`--with-system-harfbuzz' requires \`--with-system-icu'" "$LINENO" 5
-  fi
-fi
-
-test "x$need_harfbuzz" = xyes && {
-  need_graphite2=yes
-  need_icu=yes
-}
-
-## libs/icu/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/icu/
-## configure options and TL libraries required for icu (modified for XeTeX)
-
-# Check whether --with-system-icu was given.
-if test ${with_system_icu+y}
-then :
-  withval=$with_system_icu;
-fi
-if test "x$with_system_icu" = x; then
-  if test -f $srcdir/../libs/icu/configure; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`icu' headers and library from TL tree" >&5
-printf "%s\n" "$as_me: Assuming \`icu' headers and library from TL tree" >&6;}
-    with_system_icu=no
-  else
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming installed \`icu' headers and library" >&5
-printf "%s\n" "$as_me: Assuming installed \`icu' headers and library" >&6;}
-    with_system_icu=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-icu=$with_system_icu'"
-fi
-
-## libs/teckit/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/teckit/
-## configure options and TL libraries required for teckit
-
-# Check whether --with-system-teckit was given.
-if test ${with_system_teckit+y}
-then :
-  withval=$with_system_teckit;
-fi
-if test "x$with_system_teckit" = x; then
-  if test -f $srcdir/../libs/teckit/configure; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`teckit' headers and library from TL tree" >&5
-printf "%s\n" "$as_me: Assuming \`teckit' headers and library from TL tree" >&6;}
-    with_system_teckit=no
-  else
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming installed \`teckit' headers and library" >&5
-printf "%s\n" "$as_me: Assuming installed \`teckit' headers and library" >&6;}
-    with_system_teckit=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-teckit=$with_system_teckit'"
-fi
-if test "x$with_system_teckit" = xyes; then
-  if test "x$with_system_zlib" = x; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ->  installed \`zlib' headers and library" >&5
-printf "%s\n" "$as_me:   ->  installed \`zlib' headers and library" >&6;}
-    with_system_zlib=yes
-    ac_configure_args="$ac_configure_args '--with-system-zlib'"
-  elif test "x$with_system_zlib" != xyes; then
-    as_fn_error $? "Sorry, \`--with-system-teckit' requires \`--with-system-zlib'" "$LINENO" 5
-  fi
-fi
-
-test "x$need_teckit" = xyes && {
-  need_zlib=yes
-}
-
-## libs/graphite2/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/graphite2/
-## configure options and TL libraries required for graphite2
-
-# Check whether --with-system-graphite2 was given.
-if test ${with_system_graphite2+y}
-then :
-  withval=$with_system_graphite2;
+  withval=$with_system_graphite2;
 fi
 if test "x$with_system_graphite2" = x; then
   if test -f $srcdir/../libs/graphite2/configure; then
@@ -5942,282 +4512,6 @@ test "x$need_zziplib" = xyes && {
   need_zlib=yes
 }
 
-## libs/xpdf/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/xpdf/
-## configure options and TL libraries required for xpdf
-: "kpse_xpdf_options - no-op"
-if test "x$with_system_xpdf" = x; then
-  if test -f $srcdir/../libs/xpdf/configure; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`xpdf' headers and library from TL tree" >&5
-printf "%s\n" "$as_me: Assuming \`xpdf' headers and library from TL tree" >&6;}
-    with_system_xpdf=no
-  else
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming installed \`xpdf' headers and library" >&5
-printf "%s\n" "$as_me: Assuming installed \`xpdf' headers and library" >&6;}
-    with_system_xpdf=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-xpdf=$with_system_xpdf'"
-fi
-
-## libs/mpfr/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/mpfr/
-## configure options and TL libraries required for mpfr
-
-# Check whether --with-system-mpfr was given.
-if test ${with_system_mpfr+y}
-then :
-  withval=$with_system_mpfr;
-fi
-
-# Check whether --with-mpfr-includes was given.
-if test ${with_mpfr_includes+y}
-then :
-  withval=$with_mpfr_includes;
-fi
-
-# Check whether --with-mpfr-libdir was given.
-if test ${with_mpfr_libdir+y}
-then :
-  withval=$with_mpfr_libdir;
-fi
-if test "x$with_system_mpfr" = x; then
-  if test -f $srcdir/../libs/mpfr/configure; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`mpfr' headers and library from TL tree" >&5
-printf "%s\n" "$as_me: Assuming \`mpfr' headers and library from TL tree" >&6;}
-    with_system_mpfr=no
-  else
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming installed \`mpfr' headers and library" >&5
-printf "%s\n" "$as_me: Assuming installed \`mpfr' headers and library" >&6;}
-    with_system_mpfr=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-mpfr=$with_system_mpfr'"
-fi
-if test "x$with_system_mpfr" = xyes; then
-  if test "x$with_system_gmp" = x; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ->  installed \`gmp' headers and library" >&5
-printf "%s\n" "$as_me:   ->  installed \`gmp' headers and library" >&6;}
-    with_system_gmp=yes
-    ac_configure_args="$ac_configure_args '--with-system-gmp'"
-  elif test "x$with_system_gmp" != xyes; then
-    as_fn_error $? "Sorry, \`--with-system-mpfr' requires \`--with-system-gmp'" "$LINENO" 5
-  fi
-fi
-
-test "x$need_mpfr" = xyes && {
-  need_gmp=yes
-}
-
-## libs/gmp/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/gmp/
-## configure options and TL libraries required for gmp
-
-# Check whether --with-system-gmp was given.
-if test ${with_system_gmp+y}
-then :
-  withval=$with_system_gmp;
-fi
-
-# Check whether --with-gmp-includes was given.
-if test ${with_gmp_includes+y}
-then :
-  withval=$with_gmp_includes;
-fi
-
-# Check whether --with-gmp-libdir was given.
-if test ${with_gmp_libdir+y}
-then :
-  withval=$with_gmp_libdir;
-fi
-if test "x$with_system_gmp" = x; then
-  if test -f $srcdir/../libs/gmp/configure; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`gmp' headers and library from TL tree" >&5
-printf "%s\n" "$as_me: Assuming \`gmp' headers and library from TL tree" >&6;}
-    with_system_gmp=no
-  else
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming installed \`gmp' headers and library" >&5
-printf "%s\n" "$as_me: Assuming installed \`gmp' headers and library" >&6;}
-    with_system_gmp=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-gmp=$with_system_gmp'"
-fi
-
-## libs/cairo/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/cairo/
-## configure options and TL libraries required for cairo
-
-# Check whether --with-system-cairo was given.
-if test ${with_system_cairo+y}
-then :
-  withval=$with_system_cairo;
-fi
-if test "x$with_system_cairo" = x; then
-  if test -f $srcdir/../libs/cairo/configure; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`cairo' headers and library from TL tree" >&5
-printf "%s\n" "$as_me: Assuming \`cairo' headers and library from TL tree" >&6;}
-    with_system_cairo=no
-  else
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming installed \`cairo' headers and library" >&5
-printf "%s\n" "$as_me: Assuming installed \`cairo' headers and library" >&6;}
-    with_system_cairo=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-cairo=$with_system_cairo'"
-fi
-if test "x$with_system_cairo" = xyes; then
-  if test "x$with_system_pixman" = x; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ->  installed \`pixman' headers and library" >&5
-printf "%s\n" "$as_me:   ->  installed \`pixman' headers and library" >&6;}
-    with_system_pixman=yes
-    ac_configure_args="$ac_configure_args '--with-system-pixman'"
-  elif test "x$with_system_pixman" != xyes; then
-    as_fn_error $? "Sorry, \`--with-system-cairo' requires \`--with-system-pixman'" "$LINENO" 5
-  fi
-fi
-
-test "x$need_cairo" = xyes && {
-  need_pixman=yes
-}
-
-## libs/pixman/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/pixman/
-## configure options and TL libraries required for pixman
-
-# Check whether --with-system-pixman was given.
-if test ${with_system_pixman+y}
-then :
-  withval=$with_system_pixman;
-fi
-if test "x$with_system_pixman" = x; then
-  if test -f $srcdir/../libs/pixman/configure; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`pixman' headers and library from TL tree" >&5
-printf "%s\n" "$as_me: Assuming \`pixman' headers and library from TL tree" >&6;}
-    with_system_pixman=no
-  else
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming installed \`pixman' headers and library" >&5
-printf "%s\n" "$as_me: Assuming installed \`pixman' headers and library" >&6;}
-    with_system_pixman=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-pixman=$with_system_pixman'"
-fi
-
-## libs/gd/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/gd/
-## configure options and TL libraries required for gd
-
-# Check whether --with-system-gd was given.
-if test ${with_system_gd+y}
-then :
-  withval=$with_system_gd;
-fi
-
-# Check whether --with-gd-includes was given.
-if test ${with_gd_includes+y}
-then :
-  withval=$with_gd_includes;
-fi
-
-# Check whether --with-gd-libdir was given.
-if test ${with_gd_libdir+y}
-then :
-  withval=$with_gd_libdir;
-fi
-if test "x$with_system_gd" = x; then
-  if test -f $srcdir/../libs/gd/configure; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`gd' headers and library from TL tree" >&5
-printf "%s\n" "$as_me: Assuming \`gd' headers and library from TL tree" >&6;}
-    with_system_gd=no
-  else
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming installed \`gd' headers and library" >&5
-printf "%s\n" "$as_me: Assuming installed \`gd' headers and library" >&6;}
-    with_system_gd=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-gd=$with_system_gd'"
-fi
-if test "x$with_system_gd" = xyes; then
-  if test "x$with_system_libpng" = x; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ->  installed \`libpng' headers and library" >&5
-printf "%s\n" "$as_me:   ->  installed \`libpng' headers and library" >&6;}
-    with_system_libpng=yes
-    ac_configure_args="$ac_configure_args '--with-system-libpng'"
-  elif test "x$with_system_libpng" != xyes; then
-    as_fn_error $? "Sorry, \`--with-system-gd' requires \`--with-system-libpng'" "$LINENO" 5
-  fi
-  if test "x$with_system_freetype2" = x; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ->  installed \`freetype2' headers and library" >&5
-printf "%s\n" "$as_me:   ->  installed \`freetype2' headers and library" >&6;}
-    with_system_freetype2=yes
-    ac_configure_args="$ac_configure_args '--with-system-freetype2'"
-  elif test "x$with_system_freetype2" != xyes; then
-    as_fn_error $? "Sorry, \`--with-system-gd' requires \`--with-system-freetype2'" "$LINENO" 5
-  fi
-fi
-
-test "x$need_gd" = xyes && {
-  need_libpng=yes
-  need_freetype2=yes
-}
-
-## libs/potrace/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/potrace/
-## configure options and TL libraries required for potrace
-
-# Check whether --with-system-potrace was given.
-if test ${with_system_potrace+y}
-then :
-  withval=$with_system_potrace;
-fi
-
-# Check whether --with-potrace-includes was given.
-if test ${with_potrace_includes+y}
-then :
-  withval=$with_potrace_includes;
-fi
-
-# Check whether --with-potrace-libdir was given.
-if test ${with_potrace_libdir+y}
-then :
-  withval=$with_potrace_libdir;
-fi
-if test "x$with_system_potrace" = x; then
-  if test -f $srcdir/../libs/potrace/configure; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`potrace' headers and library from TL tree" >&5
-printf "%s\n" "$as_me: Assuming \`potrace' headers and library from TL tree" >&6;}
-    with_system_potrace=no
-  else
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming installed \`potrace' headers and library" >&5
-printf "%s\n" "$as_me: Assuming installed \`potrace' headers and library" >&6;}
-    with_system_potrace=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-potrace=$with_system_potrace'"
-fi
-
-## libs/freetype2/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/freetype2/
-## configure options and TL libraries required for freetype2
-
-# Check whether --with-system-freetype2 was given.
-if test ${with_system_freetype2+y}
-then :
-  withval=$with_system_freetype2;
-fi
-if test "x$with_system_freetype2" = x; then
-  if test -f $srcdir/../libs/freetype2/configure; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`freetype2' headers and library from TL tree" >&5
-printf "%s\n" "$as_me: Assuming \`freetype2' headers and library from TL tree" >&6;}
-    with_system_freetype2=no
-  else
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming installed \`freetype2' headers and library" >&5
-printf "%s\n" "$as_me: Assuming installed \`freetype2' headers and library" >&6;}
-    with_system_freetype2=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-freetype2=$with_system_freetype2'"
-fi
-if test "x$with_system_freetype2" = xyes; then
-  if test "x$with_system_zlib" = x; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ->  installed \`zlib' headers and library" >&5
-printf "%s\n" "$as_me:   ->  installed \`zlib' headers and library" >&6;}
-    with_system_zlib=yes
-    ac_configure_args="$ac_configure_args '--with-system-zlib'"
-  elif test "x$with_system_zlib" != xyes; then
-    as_fn_error $? "Sorry, \`--with-system-freetype2' requires \`--with-system-zlib'" "$LINENO" 5
-  fi
-fi
-
-test "x$need_freetype2" = xyes && {
-  need_zlib=yes
-}
-
 ## libs/libpng/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/libpng/
 ## configure options and TL libraries required for libpng
 
@@ -6253,39 +4547,6 @@ test "x$need_libpng" = xyes && {
   need_zlib=yes
 }
 
-## libs/libpaper/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/libpaper/
-## configure options and TL libraries required for libpaper
-
-# Check whether --with-system-libpaper was given.
-if test ${with_system_libpaper+y}
-then :
-  withval=$with_system_libpaper;
-fi
-
-# Check whether --with-libpaper-includes was given.
-if test ${with_libpaper_includes+y}
-then :
-  withval=$with_libpaper_includes;
-fi
-
-# Check whether --with-libpaper-libdir was given.
-if test ${with_libpaper_libdir+y}
-then :
-  withval=$with_libpaper_libdir;
-fi
-if test "x$with_system_libpaper" = x; then
-  if test -f $srcdir/../libs/libpaper/configure; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`libpaper' headers and library from TL tree" >&5
-printf "%s\n" "$as_me: Assuming \`libpaper' headers and library from TL tree" >&6;}
-    with_system_libpaper=no
-  else
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming installed \`libpaper' headers and library" >&5
-printf "%s\n" "$as_me: Assuming installed \`libpaper' headers and library" >&6;}
-    with_system_libpaper=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-libpaper=$with_system_libpaper'"
-fi
-
 ## libs/luajit/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/luajit/
 ## configure options and TL libraries required for luajit
 
@@ -6326,41 +4587,6 @@ printf "%s\n" "$as_me: Assuming installed \`zlib' headers and library" >&6;}
 fi
 
 
-## texk/ptexenc/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/ptexenc/
-## configure options and TL libraries required for ptexenc
-
-# Check whether --with-system-ptexenc was given.
-if test ${with_system_ptexenc+y}
-then :
-  withval=$with_system_ptexenc;
-fi
-if test "x$with_system_ptexenc" = x; then
-  if test -f $srcdir/../texk/ptexenc/configure; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming \`ptexenc' headers and library from TL tree" >&5
-printf "%s\n" "$as_me: Assuming \`ptexenc' headers and library from TL tree" >&6;}
-    with_system_ptexenc=no
-  else
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming installed \`ptexenc' headers and library" >&5
-printf "%s\n" "$as_me: Assuming installed \`ptexenc' headers and library" >&6;}
-    with_system_ptexenc=yes
-  fi
-  ac_configure_args="$ac_configure_args '--with-system-ptexenc=$with_system_ptexenc'"
-fi
-if test "x$with_system_ptexenc" = xyes; then
-  if test "x$with_system_kpathsea" = x; then
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ->  installed \`kpathsea' headers and library" >&5
-printf "%s\n" "$as_me:   ->  installed \`kpathsea' headers and library" >&6;}
-    with_system_kpathsea=yes
-    ac_configure_args="$ac_configure_args '--with-system-kpathsea'"
-  elif test "x$with_system_kpathsea" != xyes; then
-    as_fn_error $? "Sorry, \`--with-system-ptexenc' requires \`--with-system-kpathsea'" "$LINENO" 5
-  fi
-fi
-
-test "x$need_ptexenc" = xyes && {
-  need_kpathsea=yes
-}
-
 ## texk/kpathsea/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/kpathsea/
 ## configure options and TL libraries required for kpathsea
 
@@ -7016,7 +5242,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='tex-live-utils'
- VERSION='2023'
+ VERSION='2024'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -7367,90 +5593,6 @@ printf %s "checking for Utils programs to build... " >&6; }
 echo 'tldbg:_KPSE_RECURSE called: list=utils, text=Utils programs, cond=test "x$enable_[]Kpse_pkg" = xyes, prefix=.' >&5
 MAKE_SUBDIRS=
 CONF_SUBDIRS=
-if test -x $srcdir/autosp/configure; then
-  test "x$enable_autosp" = xyes && MAKE_SUBDIRS="$MAKE_SUBDIRS autosp"
-  CONF_SUBDIRS="$CONF_SUBDIRS autosp"
-else
-  echo 'tldbg:_KPSE_RECURSE skipping subdir, no (executable) configure: '"$srcdir"'/autosp/configure' >&5
-fi
-if test -x $srcdir/axodraw2/configure; then
-  test "x$enable_axodraw2" = xyes && MAKE_SUBDIRS="$MAKE_SUBDIRS axodraw2"
-  CONF_SUBDIRS="$CONF_SUBDIRS axodraw2"
-else
-  echo 'tldbg:_KPSE_RECURSE skipping subdir, no (executable) configure: '"$srcdir"'/axodraw2/configure' >&5
-fi
-if test -x $srcdir/devnag/configure; then
-  test "x$enable_devnag" = xyes && MAKE_SUBDIRS="$MAKE_SUBDIRS devnag"
-  CONF_SUBDIRS="$CONF_SUBDIRS devnag"
-else
-  echo 'tldbg:_KPSE_RECURSE skipping subdir, no (executable) configure: '"$srcdir"'/devnag/configure' >&5
-fi
-if test -x $srcdir/lacheck/configure; then
-  test "x$enable_lacheck" = xyes && MAKE_SUBDIRS="$MAKE_SUBDIRS lacheck"
-  CONF_SUBDIRS="$CONF_SUBDIRS lacheck"
-else
-  echo 'tldbg:_KPSE_RECURSE skipping subdir, no (executable) configure: '"$srcdir"'/lacheck/configure' >&5
-fi
-if test -x $srcdir/m-tx/configure; then
-  test "x$enable_m_tx" = xyes && MAKE_SUBDIRS="$MAKE_SUBDIRS m-tx"
-  CONF_SUBDIRS="$CONF_SUBDIRS m-tx"
-else
-  echo 'tldbg:_KPSE_RECURSE skipping subdir, no (executable) configure: '"$srcdir"'/m-tx/configure' >&5
-fi
-if test -x $srcdir/pmx/configure; then
-  test "x$enable_pmx" = xyes && MAKE_SUBDIRS="$MAKE_SUBDIRS pmx"
-  CONF_SUBDIRS="$CONF_SUBDIRS pmx"
-else
-  echo 'tldbg:_KPSE_RECURSE skipping subdir, no (executable) configure: '"$srcdir"'/pmx/configure' >&5
-fi
-if test -x $srcdir/ps2eps/configure; then
-  test "x$enable_ps2eps" = xyes && MAKE_SUBDIRS="$MAKE_SUBDIRS ps2eps"
-  CONF_SUBDIRS="$CONF_SUBDIRS ps2eps"
-else
-  echo 'tldbg:_KPSE_RECURSE skipping subdir, no (executable) configure: '"$srcdir"'/ps2eps/configure' >&5
-fi
-if test -x $srcdir/t1utils/configure; then
-  test "x$enable_t1utils" = xyes && MAKE_SUBDIRS="$MAKE_SUBDIRS t1utils"
-  CONF_SUBDIRS="$CONF_SUBDIRS t1utils"
-else
-  echo 'tldbg:_KPSE_RECURSE skipping subdir, no (executable) configure: '"$srcdir"'/t1utils/configure' >&5
-fi
-if test -x $srcdir/texdoctk/configure; then
-  test "x$enable_texdoctk" = xyes && MAKE_SUBDIRS="$MAKE_SUBDIRS texdoctk"
-  CONF_SUBDIRS="$CONF_SUBDIRS texdoctk"
-else
-  echo 'tldbg:_KPSE_RECURSE skipping subdir, no (executable) configure: '"$srcdir"'/texdoctk/configure' >&5
-fi
-if test -x $srcdir/tpic2pdftex/configure; then
-  test "x$enable_tpic2pdftex" = xyes && MAKE_SUBDIRS="$MAKE_SUBDIRS tpic2pdftex"
-  CONF_SUBDIRS="$CONF_SUBDIRS tpic2pdftex"
-else
-  echo 'tldbg:_KPSE_RECURSE skipping subdir, no (executable) configure: '"$srcdir"'/tpic2pdftex/configure' >&5
-fi
-if test -x $srcdir/vlna/configure; then
-  test "x$enable_vlna" = xyes && MAKE_SUBDIRS="$MAKE_SUBDIRS vlna"
-  CONF_SUBDIRS="$CONF_SUBDIRS vlna"
-else
-  echo 'tldbg:_KPSE_RECURSE skipping subdir, no (executable) configure: '"$srcdir"'/vlna/configure' >&5
-fi
-if test -x $srcdir/xindy/configure; then
-  test "x$enable_xindy" = xyes && MAKE_SUBDIRS="$MAKE_SUBDIRS xindy"
-  CONF_SUBDIRS="$CONF_SUBDIRS xindy"
-else
-  echo 'tldbg:_KPSE_RECURSE skipping subdir, no (executable) configure: '"$srcdir"'/xindy/configure' >&5
-fi
-if test -x $srcdir/xml2pmx/configure; then
-  test "x$enable_xml2pmx" = xyes && MAKE_SUBDIRS="$MAKE_SUBDIRS xml2pmx"
-  CONF_SUBDIRS="$CONF_SUBDIRS xml2pmx"
-else
-  echo 'tldbg:_KPSE_RECURSE skipping subdir, no (executable) configure: '"$srcdir"'/xml2pmx/configure' >&5
-fi
-if test -x $srcdir/xpdfopen/configure; then
-  test "x$enable_xpdfopen" = xyes && MAKE_SUBDIRS="$MAKE_SUBDIRS xpdfopen"
-  CONF_SUBDIRS="$CONF_SUBDIRS xpdfopen"
-else
-  echo 'tldbg:_KPSE_RECURSE skipping subdir, no (executable) configure: '"$srcdir"'/xpdfopen/configure' >&5
-fi
 
 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAKE_SUBDIRS" >&5
 printf "%s\n" "$MAKE_SUBDIRS" >&6; }
@@ -8021,7 +6163,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by TeX Live utils $as_me 2023, which was
+This file was extended by TeX Live utils $as_me 2024, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -8080,7 +6222,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-TeX Live utils config.status 2023
+TeX Live utils config.status 2024
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
diff --git a/source/version.ac b/source/version.ac
index 8e83756c3..06139bc23 100644
--- a/source/version.ac
+++ b/source/version.ac
@@ -1,4 +1,4 @@
-dnl $Id: version.ac 65770 2023-02-09 21:26:50Z karl $
+dnl $Id: version.ac 66596 2023-03-19 22:16:03Z karl $
 dnl   Copyright 2016-2023 Karl Berry <tex-live@tug.org>
 dnl   Copyright 2010-2015 Peter Breitenlohner <tex-live@tug.org>
 dnl
@@ -9,4 +9,4 @@ dnl
 dnl --------------------------------------------------------
 dnl
 dnl  m4-include this file to define the current TeX Live version
-m4_define([tex_live_version], [2023])
+m4_define([tex_live_version], [2024])
-- 
GitLab