texlive[55860] Master/texmf-dist: l3 (17jul20)

commits+karl at tug.org commits+karl at tug.org
Fri Jul 17 23:45:53 CEST 2020


Revision: 55860
          http://tug.org/svn/texlive?view=revision&revision=55860
Author:   karl
Date:     2020-07-17 23:45:53 +0200 (Fri, 17 Jul 2020)
Log Message:
-----------
l3 (17jul20)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf-code.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
    trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
    trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins
    trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls

Added Paths:
-----------
    trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx

Removed Paths:
-------------
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3cctab/
    trunk/Master/texmf-dist/source/latex/l3experimental/l3cctab/
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3cctab/

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md	2020-07-17 21:45:53 UTC (rev 55860)
@@ -7,6 +7,16 @@
 
 ## [Unreleased]
 
+## [2020-07-17]
+
+### Added
+- `\color_export:nn(n)N` (see #742)
+- Support for multiple color models (see #739)
+
+### Removed
+
+- `l3cctab`: moved to `l3kernel`
+
 ## [2020-06-18]
 
 ### Changed
@@ -139,7 +149,8 @@
 - New `l3color` module using `xcolor`-like expression syntax
 - New `l3draw` module, based on `pgf` layer of the TikZ system
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2020-06-18...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2020-07-17...HEAD
+[2020-07-17]: https://github.com/latex3/latex3/compare/2020-06-18...2020-07-17
 [2020-06-18]: https://github.com/latex3/latex3/compare/2020-06-03...2020-06-18
 [2020-06-03]: https://github.com/latex3/latex3/compare/2020-05-18...2020-06-03
 [2020-05-18]: https://github.com/latex3/latex3/compare/2020-01-12...2020-05-18

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2020-07-17 21:45:53 UTC (rev 55860)
@@ -1,7 +1,7 @@
 Experimental LaTeX3 Concepts
 ============================
 
-Release 2020-06-18
+Release 2020-07-17
 
 Overview
 --------
@@ -22,7 +22,6 @@
 Currently included in the CTAN release of l3experimental are the following
 bundles:
 * `l3benchmark`
-* `l3cctab`
 * `l3color`
 * `l3draw`
 * `l3graphics`
@@ -37,13 +36,7 @@
 
 This module provides support for benchmarking the performance of code.
 
-`l3cctab`
----------
 
-This module provides support for saving and restoring category codes
-_en masse_ in a table. This is supported for the 8-bit range for all engines,
-and for the entire Unicode range with LuaTeX.
-
 `l3color`
 ---------
 

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf-code.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2020-07-17 21:45:53 UTC (rev 55860)
@@ -7,6 +7,27 @@
 
 ## [Unreleased]
 
+## [2020-07-17]
+
+### Added
+- `l3cctab` module for using category code tables
+- `\file_parse_full_name:n` and `\file_parse_full_name_apply:nN`
+- Additional `\prop_put:Nnn` variants
+- `\seq_set_map_x:NNn`
+- `\msg_term:nn(nnnn)`
+
+### Fixed
+- File lookup with `\input at path`
+
+### Changed
+- Implementation of `\file_parse_full_name:nNNN` now uses
+  `\file_parse_full_name:n` internally
+- `\seq_set_map:NNn` no longer `x`-expands `<inline function>`
+  (`\seq_set_map_x:NNn` now does that).  Both moved to stable.
+
+### Removed
+- Functions deprecated at end of 2019
+
 ## [2020-06-18]
 
 ### Changed
@@ -704,7 +725,8 @@
 - Step func­tions have been added for dim vari­ables,
   e.g. `\dim_step_in­line:nnnn`
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2020-06-18...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2020-07-17...HEAD
+[2020-07-17]: https://github.com/latex3/latex3/compare/2020-06-18...2020-07-17
 [2020-06-18]: https://github.com/latex3/latex3/compare/2020-06-03...2020-06-18
 [2020-06-03]: https://github.com/latex3/latex3/compare/2020-05-15...2020-06-03
 [2020-05-15]: https://github.com/latex3/latex3/compare/2020-05-14...2020-05-15

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2020-07-17 21:45:53 UTC (rev 55860)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2020-06-18
+Release 2020-07-17
 
 Overview
 --------

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2020-07-17 21:45:53 UTC (rev 55860)
@@ -54,7 +54,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2020-06-18}
+\date{Released 2020-07-17}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt	2020-07-17 21:45:53 UTC (rev 55860)
@@ -23,29 +23,6 @@
 \box_set_eq_clear:cN              2020
 \box_set_eq_clear:Nc              2020
 \box_set_eq_clear:NN              2020
-\c_zero                           2019
-\c_one                            2019
-\c_two                            2019
-\c_three                          2019
-\c_four                           2019
-\c_five                           2019
-\c_six                            2019
-\c_seven                          2019
-\c_eight                          2019
-\c_nine                           2019
-\c_ten                            2019
-\c_eleven                         2019
-\c_twelve                         2019
-\c_thirteen                       2019
-\c_fourteen                       2019
-\c_fifteen                        2019
-\c_sixteen                        2019
-\c_thirty_two                     2019
-\c_one_hundred                    2019
-\c_two_hundred_fifty_five         2019
-\c_two_hundred_fifty_six          2019
-\c_one_thousand                   2019
-\c_ten_thousand                   2019
 \c_term_ior                       2020
 \char_fold_case:N                 2022
 \char_lower_case:N                2022
@@ -55,18 +32,10 @@
 \char_str_lower_case:N            2022
 \char_str_mixed_case:N            2022
 \char_str_upper_case:N            2022
-\etex_....:D                      2019
 \hbox_unpack_clear:c              2020
 \hbox_unpack_clear:N              2020
 \l_keys_key_tl                    2022
 \l_keys_path_tl                   2022
-\lua_escape_x:n                   2019
-\luatex_...:D                     2019
-\msg_interrupt:nn                 2019
-\msg_log:n                        2019
-\msg_term:n                       2019
-\pdftex_...:D                     2019
-\ptex_...:D                       2019
 \str_fold_case:n                  2022
 \str_fold_case:V                  2022
 \str_lower_case:f                 2022
@@ -92,11 +61,8 @@
 \token_get_arg_spec:N             2020
 \token_get_prefix_spec:N          2020
 \token_get_replacement_spec:N     2020
-\uptex_...:D                      2019
-\utex_...:D                       2019
 \vbox_unpack_clear:c              2020
 \vbox_unpack_clear:N              2020
-\xetex_...:D                      2019
 --------------------------------------
 
 Removed functions and variables
@@ -114,7 +80,13 @@
 \box_use_clear:N                                2018-12-27
 \c_active_char_token                            2011-09-08
 \c_alignment_tab_token                          2011-09-08
+\c_eight                                        2020-01-01
+\c_eleven                                       2020-01-01
 \c_empty_toks                                   2011-09-08
+\c_fifteen                                      2020-01-01
+\c_five                                         2020-01-01
+\c_four                                         2020-01-01
+\c_fourteen                                     2020-01-01
 \c_job_name_tl                                  2017-01-01
 \c_keys_code_root_tl                            2013-01-08
 \c_letter_token                                 2011-09-08
@@ -121,11 +93,28 @@
 \c_luatex_is_engine_bool                        2011-12-30
 \c_math_shift_token                             2011-09-08
 \c_minus_one                                    2018-12-27
+\c_nine                                         2020-01-01
+\c_one                                          2020-01-01
+\c_one_hundred                                  2020-01-01
+\c_one_thousand                                 2020-01-01
 \c_other_char_token                             2011-09-08
 \c_pdftex_is_engine_bool                        2011-12-30
+\c_seven                                        2020-01-01
+\c_six                                          2020-01-01
+\c_sixteen                                      2020-01-01
 \c_string_cctab                                 2012-06-30
+\c_thirteen                                     2020-01-01
+\c_thirty_two                                   2020-01-01
+\c_three                                        2020-01-01
+\c_ten                                          2020-01-01
+\c_ten_thousand                                 2020-01-01
+\c_twelve                                       2020-01-01
+\c_two                                          2020-01-01
+\c_two_hundred_fifty_five                       2020-01-01
+\c_two_hundred_fifty_six                        2020-01-01
 \c_undefined_fp                                 2014-05-28
 \c_xetex_is_engine_bool                         2011-12-30
+\c_zero                                         2020-01-01
 \char_make_active:N                             2011-09-08
 \char_make_active:n                             2011-09-08
 \char_make_alignment_tab:N                      2011-09-08
@@ -233,6 +222,7 @@
 \dim_set_max:Nn                                 2013-01-08
 \dim_set_min:cn                                 2013-01-08
 \dim_set_min:Nn                                 2013-01-08
+\etex_....:D                                    2020-01-01
 \ExplSyntaxNamesOff                             2013-01-08
 \ExplSyntaxNamesOn                              2013-01-08
 \file_add_path:nN                               2018-12-27
@@ -352,8 +342,10 @@
 \l_tmpb_toks                                    2011-09-08
 \l_tmpc_int                                     2013-01-08
 \l_tmpc_toks                                    2011-09-08
+\lua_escape_x:n                                 2020-01-01
 \lua_now_x:n                                    2020-01-01
 \lua_shipout_x:n                                2020-01-01
+\luatex_...:D                                   2020-01-01
 \luatex_if_engine_p:                            2017-01-01
 \luatex_if_engine:F                             2017-01-01
 \luatex_if_engine:T                             2017-01-01
@@ -367,9 +359,12 @@
 \msg_generic_new:nnn                            2011-09-08
 \msg_generic_set:nn                             2011-09-08
 \msg_generic_set:nnn                            2011-09-08
+\msg_interrupt:nn                               2020-01-01
 \msg_interrupt:xxx                              2013-01-08
+\msg_log:n                                      2020-01-01
 \msg_log:x                                      2013-01-08
 \msg_newline:                                   2013-01-08
+\msg_term:n                                     2020-01-01
 \msg_term:x                                     2013-01-08
 \msg_trace:nn                                   2011-09-08
 \msg_trace:nnx                                  2011-09-08
@@ -377,6 +372,7 @@
 \msg_trace:nnxxx                                2011-09-08
 \msg_trace:nnxxxx                               2011-09-08
 \msg_two_newlines:                              2013-01-08
+\pdftex_...:D                                   2020-01-01
 \pdftex_if_engine_p:                            2017-01-01
 \pdftex_if_engine:F                             2017-01-01
 \pdftex_if_engine:T                             2017-01-01
@@ -432,6 +428,7 @@
 \prop_if_in:ccF                                 2011-09-08
 \prop_if_in:ccT                                 2011-09-08
 \prop_if_in:ccTF                                2011-09-08
+\ptex_...:D                                     2020-01-01
 \quark_if_recursion_tail_break:N                2015-07-14
 \quark_if_recursion_tail_break:n                2015-07-14
 \scan_align_safe_stop:                          2017-01-01
@@ -634,10 +631,12 @@
 \toks_use_gclear:N                              2011-09-08
 \toks_use:c                                     2011-09-08
 \toks_use:N                                     2011-09-08
+\uptex_...:D                                    2020-01-01
 \use_i_after_else:nw                            2011-12-30
 \use_i_after_fi:nw                              2011-12-30
 \use_i_after_or:nw                              2011-12-30
 \use_i_after_orelse:nw                          2011-12-30
+\utex_...:D                                     2020-01-01
 \vbox_gset_inline_begin:c                       2014-08-09
 \vbox_gset_inline_begin:N                       2014-08-09
 \vbox_gset_inline_end:                          2014-08-09
@@ -644,6 +643,7 @@
 \vbox_set_inline_begin:c                        2014-08-09
 \vbox_set_inline_begin:N                        2014-08-09
 \vbox_set_inline_end:                           2014-08-09
+\xetex_...:D                                    2020-01-01
 \xetex_if_engine_p:                             2017-01-01
 \xetex_if_engine:F                              2017-01-01
 \xetex_if_engine:T                              2017-01-01

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv	2020-07-17 21:45:53 UTC (rev 55860)
@@ -123,6 +123,7 @@
 msg,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
 msvg,media4svg,Alexander Grahn,,https://gitlab.com/agrahn/media4svg,https://gitlab.com/agrahn/media4svg/issues,2020-04-15,2020-04-15,
 muskip,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
+namedef,namedef,Phelype Oleinik,https://github.com/PhelypeOleinik/namedef,https://github.com/PhelypeOleinik/namedef.git,https://github.com/PhelypeOleinik/namedef/issues,2020-06-22,2020-06-22,
 nan,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
 nicematrix,nicematrix,François Pantigny,,,,2019-12-19,2019-12-19,
 nil,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
@@ -138,9 +139,11 @@
 parameter,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
 pbs,media9,Alexander Grahn,,https://gitlab.com/agrahn/media9,https://gitlab.com/agrahn/media9/issues,2016-02-26,2020-04-15,
 pdf,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2019-06-02,2019-06-02,
+pdfoverlay,pdfoverlay,David Purton,https://github.com/dcpurton/pdfoverlay,https://github.com/dcpurton/pdfoverlay.git,https://github.com/dcpurton/pdfoverlay/issues,2020-06-22,2020-06-22,
 pdftex,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
 peek,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
 percent,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
+pgf,pgf,The PGF/TikZ Team,https://pgf-tikz.github.io,https://github.com/pgf-tikz/pgf,https://github.com/pgf-tikz/pgf/issues,2020-07-03,2020-07-03,
 pi,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
 pkgploader,pkgploader,Michiel Helvensteijn,,,,2014-02-05,2014-02-05,
 polyglossia,polyglossia,Arthur Reutenauer,https://www.polyglossia.org/,https://github.com/reutenauer/polyglossia,https://github.com/reutenauer/polyglossia/issues,2019-09-03,,
@@ -149,7 +152,9 @@
 prop,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
 pseudo,pseudo,Magnus Lie Hetland,https://github.com/mlhetland/pseudo.sty,https://github.com/mlhetland/pseudo.sty.git,https://github.com/mlhetland/pseudo.sty/issues,2019-06-24,2019-06-24,
 ptex,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2015-07-28,2015-07-28,
+ptxcd,ptxcd, Marei Peischl,,,,2020-07-27,2020-07-27,Used for specific corporate design templates
 quark,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
+qrbill,qrbill,Marei Peischl,https://github.com/peiTeX/qrbill,https://github.com/peiTeX/qrbill.git,https://github.com/peiTeX/qrbill/issues,2020-06-27,2020-06-27,
 randomwalk,randomwalk,Bruno Le Floch,https://github.com/blefloch/latex-randomwalk,https://github.com/blefloch/latex-randomwalk.git,https://github.com/blefloch/latex-randomwalk/issues,2013-03-16,2015-09-22,
 recursion,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
 regex,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2018-04-06,

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2020-07-17 21:45:53 UTC (rev 55860)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2020-06-18}
+\date{Released 2020-07-17}
 
 \begin{document}
 

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2020-07-17 21:45:53 UTC (rev 55860)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2020-06-18}
+\date{Released 2020-07-17}
 
 \newcommand{\TF}{\textit{(TF)}}
 

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2020-07-17 21:45:53 UTC (rev 55860)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2020-06-18}
+\date{Released 2020-07-17}
 
 \newcommand{\TF}{\textit{(TF)}}
 
@@ -53,8 +53,99 @@
 
 \section{Structure of tokens}
 
-Copy there the section ``Description of all possible tokens'' from \texttt{l3token}.
+We refer to the documentation of \texttt{l3token} for a complete
+description of all \TeX{} tokens.  We distinguish the meaning of the
+token, which controls the expansion of the token and its effect on
+\TeX{}'s state, and its shape, which is used when comparing token lists
+such as for delimited arguments.  At any given time two tokens of the
+same shape automatically have the same meaning, but the converse does
+not hold, and the meaning associated with a given shape change when
+doing assignments.
 
+Apart from a few exceptions, a token has one of the following shapes.
+\begin{itemize}
+  \item A control sequence, characterized by the sequence of characters
+    that constitute its name: for instance, \cs{use:n} is a five-letter
+    control sequence.
+  \item An active character token, characterized by its character code
+    (between $0$ and $1114111$ for \LuaTeX{} and \XeTeX{} and less for
+    other engines) and category code~$13$.
+  \item A character token such as |A| or |#|, characterized by its
+    character code and category code (one of $1$, $2$, $3$, $4$, $6$,
+    $7$, $8$, $10$, $11$ or~$12$ whose meaning is described below).
+\end{itemize}
+
+The meaning of a (non-active) character token is fixed by its category
+code (and character code) and cannot be changed.  We call these tokens
+\emph{explicit} character tokens.  Category codes that a character token
+can have are listed below by giving a sample output of the \TeX{}
+primitive \tn{meaning}, together with their \LaTeX3 names and most
+common example:
+\begin{itemize}
+  \item[1] begin-group character (|group_begin|, often |{|),
+  \item[2] end-group character (|group_end|, often |}|),
+  \item[3] math shift character (|math_toggle|, often |$|), % $
+  \item[4] alignment tab character (|alignment|, often |&|),
+  \item[6] macro parameter character (|parameter|, often |#|),
+  \item[7] superscript character (|math_superscript|, often |^|),
+  \item[8] subscript character (|math_subscript|, often |_|),
+  \item[10] blank space (|space|, often character code~$32$),
+  \item[11] the letter (|letter|, such as |A|),
+  \item[12] the character (|other|, such as |0|).
+\end{itemize}
+Category code~$13$ (|active|) is discussed below.  Input characters can
+also have several other category codes which do not lead to character
+tokens for later processing: $0$~(|escape|), $5$~(|end_line|),
+$9$~(|ignore|), $14$~(|comment|), and $15$~(|invalid|).
+
+The meaning of a control sequence or active character can be identical
+to that of any character token listed above (with any character code),
+and we call such tokens \emph{implicit} character tokens.  The meaning
+is otherwise in the following list:
+\begin{itemize}
+  \item a macro, used in \LaTeX3 for most functions and some variables
+    (|tl|, |fp|, |seq|, \ldots{}),
+  \item a primitive such as \tn{def} or \tn{topmark}, used in \LaTeX3
+    for some functions,
+  \item a register such as \tn{count}|123|, used in \LaTeX3{} for the
+    implementation of some variables (|int|, |dim|, \ldots{}),
+  \item a constant integer such as \tn{char}|"56| or
+    \tn{mathchar}|"121|, used when defining a constant using
+    \cs{int_const:Nn},
+  \item a font selection command,
+  \item undefined.
+\end{itemize}
+Macros can be \tn{protected} or not, \tn{long} or not (the opposite of
+what \LaTeX3 calls |nopar|), and \tn{outer} or not (unused in \LaTeX3).
+Their \tn{meaning} takes the form
+\begin{quote}
+  \meta{prefix} |macro:|\meta{argument}|->|\meta{replacement}
+\end{quote}
+where \meta{prefix} is among \tn{protected}\tn{long}\tn{outer},
+\meta{argument} describes parameters that the macro expects, such as
+|#1#2#3|, and \meta{replacement} describes how the parameters are
+manipulated, such as~|\int_eval:n{#2+#1*#3}|.  This information can be
+accessed by \cs{cs_prefix_spec:N}, \cs{cs_argument_spec:N},
+\cs{cs_replacement_spec:N}.
+
+When a macro takes an undelimited argument, explicit space characters
+(with character code $32$ and category code $10$) are ignored.  If the
+following token is an explicit character token with category code $1$
+(begin-group) and an arbitrary character code, then \TeX{} scans ahead
+to obtain an equal number of explicit character tokens with category
+code $1$ (begin-group) and $2$ (end-group), and the resulting list of
+tokens (with outer braces removed) becomes the argument.  Otherwise, a
+single token is taken as the argument for the macro: we call such single
+tokens \enquote{N-type}, as they are suitable to be used as an argument
+for a function with the signature~\texttt{:N}.
+
+When a macro takes a delimited argument \TeX{} scans ahead until finding
+the delimiter (outside any pairs of begin-group/end-group explicit
+characters), and the resulting list of tokens (with outer braces
+removed) becomes the argument.  Note that explicit space characters at
+the start of the argument are \emph{not} ignored in this case (and they
+prevent brace-stripping).
+
 \section{Quantities and expressions}
 
 Integer denotations, dimensions, glue (including \texttt{fill} and \texttt{true pt} and the like).

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2020-07-17 21:45:53 UTC (rev 55860)
@@ -53,7 +53,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2020-06-18}
+\date{Released 2020-07-17}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2020-07-17 21:45:53 UTC (rev 55860)
@@ -476,6 +476,7 @@
 \ExplSyntaxOff
 
 \DocInput{l3fparray.dtx}
+\DocInput{l3cctab.dtx}
 \DocInput{l3sort.dtx}
 \DocInput{l3tl-analysis.dtx}
 \DocInput{l3regex.dtx}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -130,7 +130,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3benchmark}{2020-06-18}{}
+\ProvidesExplPackage{l3benchmark}{2020-07-17}{}
   {L3 Experimental benchmarking}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -190,9 +190,9 @@
 %
 % \begin{function}{\color_set:nnn}
 %   \begin{syntax}
-%     \cs{color_set:nnn} \Arg{name} \Arg{model} \Arg{value(s)}
+%     \cs{color_set:nnn} \Arg{name} \Arg{model(s)} \Arg{value(s)}
 %   \end{syntax}
-%   Stores the color specification equivalent to the \meta{model} and
+%   Stores the color specification equivalent to the \meta{model(s)} and
 %   \meta{values} as the \meta{name}.
 % \end{function}
 %
@@ -225,9 +225,9 @@
 %
 % \begin{function}{\color_select:nn}
 %   \begin{syntax}
-%     \cs{color_select:nn} \Arg{model} \Arg{value(s)}
+%     \cs{color_select:nn} \Arg{model(s)} \Arg{value(s)}
 %   \end{syntax}
-%   Activates the color specification equivalent to the \meta{model} and
+%   Activates the color specification equivalent to the \meta{model(s)} and
 %   \meta{value(s)} for typeset material.
 % \end{function}
 %
@@ -237,25 +237,71 @@
 %   and similar are not influenced by this setting.
 % \end{variable}
 %
-% \section{Core color representation}
+% \section{Multiple color models}
 %
-% To allow data to be handled internally, \pkg{l3color} uses a simple
-% representation of color, comprising two \meta{balanced text} entries, the first
-% the \meta{model} and the second the \meta{values} given
-% \emph{separated by spaces}.
+% When selecting or setting a color with an explicit model, it is possible
+% to give values for more than one model at one time. This is particularly
+% useful where automated conversion between models does not give the desired
+% outcome. To do this, the list of models and list of values are both subdivided
+% using |/| characters (as for the similar function in \pkg{xcolor}). For
+% example, to save a color with explicit |cmyk| and |rgb| values, one could
+% use
+% \begin{verbatim}
+%   \color_set:nnn { foo } { cmyk / rgb }
+%     { 0.1 , 0.2 , 0.3 , 0.4 / 0.1, 0.2 , 0.3 }
+% \end{verbatim}
+% The manually-specified conversion will be used in preference to automated
+% calculation whenever the model(s) listed are used: both in expressions and
+% when a fixed model is active.
+% 
+% Similarly, the same syntax can be applied to directly selecting a color.
+% \begin{verbatim}
+%   \color_select:nn { cmyk / rgb }
+%     { 0.1 , 0.2 , 0.3 , 0.4 / 0.1, 0.2 , 0.3 }
+% \end{verbatim}
+% Again, this list is used when a fixed model is active: the first entry is used
+% unless there is a fixed model matching one of the other entries.
 %
-% This core representation is produced when parsing color expressions.
-% 
-% \begin{function}{\color_parse:nN}
+% \section{Exporting color specifications}
+%
+% The major use of color expressions is in setting typesetting output, but there
+% are other places in which some form of color information is required. These
+% may need data in a different format or using a different model to the internal
+% representation. Thus a set of functions are available to export colors in
+% different formats.
+%
+% Valid export targets are
+% \begin{itemize}
+%    \item \texttt{backend} Two brace groups: the first containing the
+%      model, the second containing space-separated values appropriate
+%      for the model; this is the format required by backend functions
+%      of \pkg{expl3}
+%    \item \texttt{HTML} Uppercase two-digit hexadecimal values, expressing
+%      a red-green-blue color; the digits are \emph{not} separated
+%    \item \texttt{space-sep-cmyk} Space-separated cyan-magenta-yellow-black
+%      values
+%    \item \texttt{space-sep-rgb} Space-separated red-green-blue values
+%      suitable for use as a PDF annotation color
+% \end{itemize}
+%
+% \begin{function}{\color_export:nnN}
 %   \begin{syntax}
-%     \cs{color_parse:nN} \Arg{color expression} \Arg{tl}
+%     \cs{color_export:nnN} \Arg{color expression} \Arg{format} \Arg{tl}
 %   \end{syntax}
-%   Parses the \meta{color expression} as described above, and sets the
-%   \meta{tl} to the equivalent \meta{core color representation}
-%   (used at the backend level and based on \texttt{dvips} color
-%   representation).
+%   Parses the \meta{color expression} as described earlier,
+%   then converts to the \meta{format} specified and assigns the data to the
+%   \meta{tl}.
 % \end{function}
 %
+% \begin{function}{\color_export:nnN}
+%   \begin{syntax}
+%     \cs{color_export:nnnN} \Arg{model} \Arg{value(s)} \Arg{format} \Arg{tl}
+%   \end{syntax}
+%   Expresses the combination of \meta{model} and \meta{value(s)} in an
+%   internal representation, then converts to the \meta{format} specified and
+%   assigns the data to the \meta{tl}.
+% \end{function}
+%
 % \section{Spot colors}
 % \label{l3color:sec:spot}
 %
@@ -275,7 +321,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3color}{2020-06-18}{}
+\ProvidesExplPackage{l3color}{2020-07-17}{}
   {L3 Experimental color support}
 %</package>
 %    \end{macrocode}
@@ -297,8 +343,8 @@
 % functions).
 %
 % Since there is no need to manipulate colors \emph{en masse}, each is stored
-% in a separate token list variable, rather than the alternative of using a
-% single property list for all names.
+% in a two-part structure: a \texttt{prop} for the colors themselves, and a
+% \texttt{tl} for the default model for each color.
 %
 % \subsection{Setup}
 %
@@ -323,7 +369,7 @@
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \@@_if_defined:n #1 { T, F, TF }
   {
-    \tl_if_exist:cTF { l_@@_named_ #1 _tl }
+    \prop_if_exist:cTF { l_@@_named_ #1 _prop }
       \prg_return_true:
       \prg_return_false:
   }
@@ -330,35 +376,30 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[EXP]{\@@_model:N, \@@_values:N}
+%   Simple abstractions.
+%    \begin{macrocode}
+\cs_new:Npn \@@_model:N #1 { \exp_after:wN \use_i:nn #1 }
+\cs_new:Npn \@@_values:N #1 { \exp_after:wN \use_ii:nn #1 }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\@@_extract:nNN, \@@_extract:VNN}
-% \begin{macro}{\@@_extract:NNnn}
-%   Split the model and color from a named color, and store the two. No test
-%   for the existence of the color: that is assumed to be the case (this
-%   is internal only). Somewhat \enquote{old-fashioned} but should be quite
-%   fast.
+%   Recover the values for the standard model for a color.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_extract:nNN #1#2#3
   {
-    \exp_after:wN \exp_after:wN \exp_after:wN
-      \@@_extract:NNnn
-      \exp_after:wN \exp_after:wN \exp_after:wN #2
-      \exp_after:wN \exp_after:wN \exp_after:wN #3
-        \cs:w l_@@_named_ #1 _tl \cs_end:
+    \tl_set_eq:Nc #2 { l_@@_named_ #1 _tl }
+    \prop_get:cVN { l_@@_named_ #1 _prop } #2 #3
   }
 \cs_generate_variant:Nn \@@_extract:nNN { V }
-\cs_new_protected:Npn \@@_extract:NNnn #1#2#3#4
-  {
-    \tl_set:Nn #1 {#3}
-    \tl_set:Nn #2 {#4}
-  }
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 % \subsection{Model conversion}
 %
 % \begin{macro}{\@@_convert:nnN, \@@_convert:VVN}
-% \begin{macro}{\@@_convert:nnnN}
+% \begin{macro}{\@@_convert:nnnN, \@@_convert:nVnN, \@@_convert:nnVN}
 % \begin{macro}[aux, EXP]
 %   {
 %     \@@_convert_gray_rgb:w
@@ -383,7 +424,7 @@
     \tl_set:Nx #4
       { \use:c { @@_convert_ #1 _ #2 :w } #3 ~ 0 ~ 0 ~ 0 \s_@@_stop }
   }
-\cs_generate_variant:Nn \@@_convert:nnnN { nnV }
+\cs_generate_variant:Nn \@@_convert:nnnN { nV , nnV }
 \cs_new:Npn \@@_convert_gray_rgb:w #1 ~ #2 \s_@@_stop
   { #1 ~ #1 ~ #1 }
 \cs_new:Npn \@@_convert_gray_cmyk:w #1 ~ #2 \s_@@_stop
@@ -442,12 +483,15 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{macro}{\color_parse:nN}
 % \begin{macro}{\@@_parse:nN}
+% \begin{macro}{\@@_parse_aux:nN}
+% \begin{macro}{\@@_parse_eq:Nn}
+% \begin{macro}{\@@_parse_eq:nNn}
 % \begin{macro}{\@@_parse:Nw}
 % \begin{macro}{\@@_parse_loop_init:Nnn}
 % \begin{macro}{\@@_parse_loop:w}
 % \begin{macro}{\@@_parse_loop:nn}
+% \begin{macro}{\@@_parse_gray:n, \@@_parse_std:n}
 % \begin{macro}{\@@_parse_break:w}
 % \begin{macro}{\@@_parse_end:}
 % \begin{macro}[aux, EXP]{\@@_parse_mix:Nnnn, \@@_parse_mix:NVVn}
@@ -462,13 +506,18 @@
 %   otherwise expands, then starts working through the expression itself.
 %   At the end, we apply the payload.
 %    \begin{macrocode}
-\cs_new_protected:Npn \color_parse:nN #1#2
+\cs_new_protected:Npx \@@_parse:nN #1#2
   {
 %<*package>
-    \@@_backend_pickup:N \l_@@_current_tl
-    \tl_set_eq:cN { l_@@_named_ . _tl } \l_@@_current_tl
+    \exp_not:N \@@_backend_pickup:N \exp_not:N \l_@@_current_tl
+    \tl_set:Nx \exp_not:c { l_@@_named_ . _tl }
+      { \exp_not:N \@@_model:N \exp_not:N \l_@@_current_tl }
+    \prop_put:NVx \exp_not:c { l_@@_named_ . _prop }
+      \exp_not:c { l_@@_named_ . _tl }
+      { \exp_not:N \@@_values:N \exp_not:N \l_@@_current_tl }
 %</package>
-    \exp_args:Ne \@@_parse:nN { \tl_to_str:n {#1} } #2
+    \exp_not:N \exp_args:Ne \exp_not:N \@@_parse_aux:nN
+      { \exp_not:N \tl_to_str:n {#1} } #2
   }
 %    \end{macrocode}
 %   Before going to all of the effort of parsing an expression, these two
@@ -475,24 +524,55 @@
 %   precursor functions look for a pre-defined name, either on its own or
 %   with a trailing |!| (which is the same thing).
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_parse:nN #1#2
+\cs_new_protected:Npn \@@_parse_aux:nN #1#2
   {
-    \tl_if_exist:cTF { l_@@_named_ #1 _tl }
-      { \tl_set_eq:Nc #2 { l_@@_named_ #1 _tl } }
+    \tl_if_exist:cTF { l_@@_named_ #1 _prop }
+      { \@@_parse_set_eq:Nn #2 {#1} }
       { \@@_parse:Nw #2#1 ! \s_@@_stop }
     \@@_check_model:N #2
   }
+\cs_new_protected:Npn \@@_parse_set_eq:Nn #1#2
+  {
+    \tl_if_empty:NTF \l_color_fixed_model_tl
+       { \exp_args:Nv \@@_parse_set_eq:nNn { l_@@_named_ #2 _tl } }
+       { \exp_args:NV \@@_parse_set_eq:nNn \l_color_fixed_model_tl }
+         #1 {#2}
+  }
+%    \end{macrocode}
+%    Here, we have to allow for the case where there is a fixed model:
+%    that can't be swept up by generic conversion as we are dealing with a
+%    named color.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_set_eq:nNn #1#2#3
+  {
+    \prop_get:cnNTF
+      { l_@@_named_ #3 _prop } {#1}
+      \l_@@_value_tl
+      { \tl_set:Nx #2 { {#1} { \l_@@_value_tl } } }
+      {
+        \tl_set_eq:Nc \l_@@_model_tl { l_@@_named_ #3 _tl }
+        \prop_get:cVN { l_@@_named_ #3 _prop } \l_@@_model_tl
+          \l_@@_value_tl
+         \@@_convert:nnN
+           \l_@@_model_tl {#1} \l_@@_value_tl
+        \tl_set:Nx #2
+          {
+            {#1}
+            { \l_@@_value_tl }
+          }
+      }
+  }
 \cs_new_protected:Npn \@@_parse:Nw #1#2 ! #3 \s_@@_stop
   {
     \@@_if_defined:nTF {#2}
       {
         \tl_if_blank:nTF {#3}
-          { \tl_set_eq:Nc #1 { l_@@_named_ #2 _tl } }
+          { \@@_parse_set_eq:Nn #1 {#2} }
           { \@@_parse_loop_init:Nnn #1 {#2} {#3} }
       }
       {
         \__kernel_msg_error:nnn { color } { unknown-color } {#2}
-        \tl_set_eq:NN \l_@@_current_tl \l_@@_named_black_tl
+        \tl_set:Nn \l_@@_current_tl { { gray } { 0 } }
       }
   }
 %    \end{macrocode}
@@ -562,24 +642,9 @@
         \@@_extract:nNN {#2} \l_@@_next_model_tl \l_@@_next_value_tl
         \tl_if_eq:NNF \l_@@_model_tl \l_@@_next_model_tl
           {
-            \str_if_eq:VnT \l_@@_model_tl { gray }
-              {
-                \use:x
-                  {
-                    \tl_set:Nn \exp_not:N \l_@@_model_tl
-                      { \l_@@_next_model_tl }
-                    \tl_set:Nn \exp_not:N \l_@@_value_tl
-                      { \l_@@_next_value_tl }
-                    \tl_set:Nn \exp_not:N \l_next_@@_model_tl
-                      { \l_@@_model_tl }
-                    \tl_set:Nn \exp_not:N \l_next_@@_value_tl
-                      { \l_@@_value_tl }
-                  }
-              }
-            \@@_convert:VVN
-              \l_@@_next_model_tl
-              \l_@@_model_tl
-              \l_@@_next_value_tl
+            \str_if_eq:VnTF \l_@@_model_tl { gray }
+              { \@@_parse_gray:n {#2} }
+              { \@@_parse_std:n {#2} }
           }
         \tl_set:Nx \l_@@_value_tl
           {
@@ -593,6 +658,31 @@
         \@@_parse_break:w
       }
   }
+%    \end{macrocode}
+%   The \texttt{gray} model needs special handling: the models need to be
+%   swapped: we do that using a dedicated function.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_gray:n #1
+  {
+    \tl_set_eq:NN \l_@@_model_tl \l_@@_next_model_tl
+    \tl_set:Nn \l_@@_next_model_tl { gray }
+    \exp_args:NnV \@@_convert:nnN { gray } \l_@@_model_tl
+      \l_@@_value_tl
+    \prop_get:cVN { l_@@_named_ #1 _prop } \l_@@_model_tl
+      \l_@@_next_value_tl
+  }
+\cs_new_protected:Npn \@@_parse_std:n #1
+  {
+    \prop_get:cVNF { l_@@_named_ #1 _prop }
+      \l_@@_model_tl
+      \l_@@_next_value_tl
+        {
+          \@@_convert:VVN
+            \l_@@_next_model_tl
+            \l_@@_model_tl
+            \l_@@_next_value_tl
+        }
+  }
 \cs_new_protected:Npn \@@_parse_break:w #1 \@@_parse_end: { }
 \cs_new_protected:Npn \@@_parse_end: { }
 %    \end{macrocode}
@@ -640,6 +730,9 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
 % \begin{macro}[EXP]
 %   {
@@ -814,10 +907,15 @@
 %   will therefore always be available. The finalisation is separate from the
 %   main function so it can also be applied to \emph{e.g.}~page color.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_select:
+\cs_new_protected:Npx \@@_select:
   {
-    \tl_set_eq:cN { l_@@_named_ . _tl } \l_@@_current_tl
-    \@@_select:N \l_@@_current_tl
+    \tl_set:Nx \exp_not:c { l_@@_named_ . _tl }
+      { \exp_not:N \@@_model:N \exp_not:N \l_@@_current_tl }
+    \prop_clear:N \exp_not:c { l_@@_named_ . _prop }
+    \prop_put:NVx \exp_not:c { l_@@_named_ . _prop }
+      \exp_not:c { l_@@_named_ . _tl }
+      { \exp_not:N \@@_values:N \exp_not:N \l_@@_current_tl }
+    \@@_select:N \exp_not:N \l_@@_current_tl
   }
 %    \end{macrocode}
 % \end{macro}
@@ -824,42 +922,76 @@
 %
 % \begin{macro}{\color_select:n}
 % \begin{macro}{\color_select:nn}
+% \begin{macro}{\@@_select_main:Nw, \@@_select_loop:Nw}
+% \begin{macro}{\@@_select:nnN}
+% \begin{macro}{\@@_select_swap:Nnn}
 %   Parse the input expressions then get the backend to actually activate
-%   them.
+%   them. The main complexity here is the need to check through multiple models.
+%   That is done \enquote{locally} here as the approach is subtly different to
+%   when different models are being stored.
 %    \begin{macrocode}
 \cs_new_protected:Npn \color_select:n #1
   {
-    \color_parse:nN {#1} \l_@@_current_tl
+    \@@_parse:nN {#1} \l_@@_current_tl
     \@@_select:
   }
 \cs_new_protected:Npn \color_select:nn #1#2
   {
-    \@@_direct:nnN {#1} {#2} \l_@@_current_tl
+    \@@_select_main:Nw \l_@@_current_tl
+      #1 / / \s_@@_mark #2 / / \s_@@_stop
     \@@_select:
   }
 %    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Direct model use}
-%
-% \begin{macro}{\@@_direct:nnN}
-%   Directly set a color based on a model/value combination.
+%   If the first color model is the fixed one, or if there is no fixed
+%   model, we don't need most of the data: just set up and apply the backend
+%   function.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_direct:nnN #1#2#3
+\cs_new_protected:Npn \@@_select_main:Nw
+  #1 #2 / #3 / #4 \s_@@_mark #5 / #6 / #7 \s_@@_stop
   {
+    \@@_select:nnN {#2} {#5} #1
+    \bool_lazy_or:nnF
+      { \tl_if_empty_p:N \l_color_fixed_model_tl }
+      { \str_if_eq_p:nV {#2} \l_color_fixed_model_tl }
+      { \@@_select_loop:Nw #1 #3 / #4 \s_@@_mark #6 / #7 \s_@@_stop }
+  }
+%    \end{macrocode}
+%   If a fixed model applies, we need to check each possible value in order.
+%   If there is no hit at all, fall back on the generic formula-based
+%   interchange.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_select_loop:Nw
+  #1 #2 / #3 \s_@@_mark #4 / #5 \s_@@_stop
+  {
+    \str_if_eq:nVTF {#2} \l_color_fixed_model_tl
+      { \@@_select:nnN {#2} {#4} #1 }
+      {
+        \tl_if_blank:nTF {#2}
+          { \exp_after:wN \@@_select_swap:Nnn \exp_after:wN #1 #1 }
+          { \@@_select_loop:Nw #1 #3 \s_@@_mark #5 \s_@@_stop }
+      }
+  }
+\cs_new_protected:Npn \@@_select:nnN #1#2#3
+  {
     \cs_if_exist:cTF { @@_parse_model_ #1 :w }
       {
         \tl_set:Nx #3
           { \use:c { @@_parse_model_ #1 :w } #2 , 0 , 0 , 0 , 0 \s_@@_stop }
-        \@@_check_model:N #3
       }
-      {
-        \__kernel_msg_error:nnn { color } { unknown-model } {#1}
-      }
+      { \__kernel_msg_error:nnn { color } { unknown-model } {#1} }
   }
+\cs_new_protected:Npn \@@_select_swap:Nnn #1#2#3
+  {
+    \@@_convert:nVnN {#2} \l_color_fixed_model_tl {#3} \l_@@_value_tl
+    \tl_set:Nx #1
+      { { \l_color_fixed_model_tl } { \l_@@_value_tl } }
+  }
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
 % \subsection{Defining named colors}
 %
@@ -870,44 +1002,113 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{macro}{\@@_store:Nn}
-%   Store the named color unless it has an invalid name.
-%     \begin{macrocode}
-\cs_new_protected:Npn \@@_store:Nn #1#2
+% \begin{macro}{\color_set:nn}
+% \begin{macro}{\@@_set:nnn}
+% \begin{macro}{\@@_set:nn}
+% \begin{macro}{\@@_set:nnw}
+% \begin{macro}{\color_set:nnn}
+% \begin{macro}{\@@_set_loop:nw}
+% \begin{macro}{\color_set_eq:nn}
+%   Defining named colors means working through the model list and saving
+%   both the \enquote{main} color and any equivalents in other models. Even
+%   if there is only one model, we store a |prop| as well as a |tl|, as there
+%   could be grouping weirdness, etc. When setting using an expression,
+%   we need to avoid any fixed model issues, which is done without a group as
+%   in \pkg{l3keys}.
+%    \begin{macrocode}
+\cs_new_protected:Npn \color_set:nn #1#2
   {
-    \str_if_eq:nnF {#2} { . }
+    \exp_args:NV \@@_set:nnn
+      \l_color_fixed_model_tl {#1} {#2}
+  }
+\cs_new_protected:Npn \@@_set:nnn #1#2#3
+  {
+    \tl_clear:N \l_color_fixed_model_tl
+    \@@_set:nn {#2} {#3}
+    \tl_set:Nn \l_color_fixed_model_tl {#1}
+  }
+\cs_new_protected:Npn \@@_set:nn #1#2
+  {
+    \str_if_eq:nnF {#1} { . }
       {
-        \tl_clear_new:c { l_@@_named_ #2 _tl }
-        \tl_set_eq:cN { l_@@_named_ #2 _tl } #1
+        \@@_parse:nN {#2} \l_@@_named_tl
+        \tl_clear_new:c { l_@@_named_ #1 _tl }
+        \tl_set:cx { l_@@_named_ #1 _tl }
+          { \@@_model:N \l_@@_named_tl }
+        \prop_clear_new:c { l_@@_named_ #1 _prop }
+        \prop_put:cvx { l_@@_named_ #1 _prop } { l_@@_named_ #1 _tl }
+          { \@@_values:N \l_@@_named_tl }
+        \@@_set:nnw {#1} {#2} #2 ! \s_@@_stop
       }
   }
 %    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\color_set:nn}
-% \begin{macro}{\color_set:nnn}
-% \begin{macro}{\color_set_eq:nn}
-%   Defining named colors has to include a step to force creation of the
-%   underlying token list to avoid errors when checking is enabled.
+%   When setting an expression-based color, there could be multiple model
+%   data available for one or more of the input colors. Where that is true for
+%   the \emph{first} named color in an expression, we re-parse the expression
+%   when they are also parameter-based: only |cmyk|, |gray| and |rgb| make
+%   any sense here. There is a bit of a performance hit but this should be
+%   rare and taking place during set-up.
 %    \begin{macrocode}
-\cs_new_protected:Npn \color_set:nn #1#2
+\cs_new_protected:Npn \@@_set:nnw #1#2#3 ! #4 \s_@@_stop
   {
-    \color_parse:nN {#2} \l_@@_named_tl
-    \@@_store:Nn \l_@@_named_tl {#1}
+    \clist_map_inline:nn { cmyk , gray , rgb }
+      {
+        \prop_get:cnNT { l_@@_named_ #3 _prop } {##1} \l_@@_internal_tl
+          {
+            \prop_if_in:cnF { l_@@_named_ #1 _prop } {##1}
+              {
+                \group_begin:
+                  \tl_set:cn { l_@@_named_ #3 _tl } {##1}
+                  \@@_parse:nN {#2} \l_@@_internal_tl
+                \exp_args:NNNV \group_end:
+                \tl_set:Nn \l_@@_internal_tl \l_@@_internal_tl
+                \prop_put:cxx { l_@@_named_ #1 _prop }
+                  { \@@_model:N \l_@@_internal_tl }
+                  { \@@_values:N \l_@@_internal_tl }
+              }
+          }
+      }
   }
 \cs_new_protected:Npn \color_set:nnn #1#2#3
   {
-    \@@_direct:nnN {#2} {#3} \l_@@_named_tl
-    \@@_store:Nn \l_@@_named_tl {#1}
+    \str_if_eq:nnF {#1} { . }
+      {
+        \tl_clear_new:c { l_@@_named_ #1 _tl }
+        \prop_clear_new:c { l_@@_named_ #1 _prop }
+        \@@_set_loop:nw {#1} #2 / / \s_@@_mark #3 / / \s_@@_stop
+      }
   }
+\cs_new_protected:Npn \@@_set_loop:nw
+  #1#2 / #3 \s_@@_mark #4 / #5 \s_@@_stop
+  {
+    \tl_if_blank:nF {#2}
+      {
+        \@@_select:nnN {#2} {#4} \l_@@_named_tl
+        \tl_set:Nx \l_@@_internal_tl { \@@_model:N \l_@@_named_tl }
+        \tl_if_empty:cT { l_@@_named_ #1 _tl }
+          { \tl_set_eq:cN { l_@@_named_ #1 _tl } \l_@@_internal_tl }
+        \prop_put:cVx { l_@@_named_ #1 _prop } \l_@@_internal_tl
+          { \@@_values:N \l_@@_named_tl }
+        \@@_set_loop:nw {#1} #3 \s_@@_mark #5 \s_@@_stop
+      }
+  }
 \cs_new_protected:Npn \color_set_eq:nn #1#2
   {
     \@@_if_defined:nTF {#2}
       {
         \tl_clear_new:c { l_@@_named_ #1 _tl }
+        \prop_clear_new:c { l_@@_named_ #1 _prop }
         \str_if_eq:nnTF {#2} { . }
-          { \tl_set_eq:cN { l_@@_named_ #1 _tl } \l_@@_current_tl }
-          { \tl_set_eq:cc { l_@@_named_ #1 _tl } { l_@@_named_ #2 _tl } }
+          {
+            \tl_set:cx { l_@@_named_ #1 _tl }
+              { \@@_model:N \l_@@_current_tl }
+            \prop_put:cvx { l_@@_named_ #1 _prop } { l_@@_named_ #1 _tl }
+              { \@@_values:N \l_@@_current_tl }
+          }
+          {
+            \tl_set_eq:cc { l_@@_named_ #1 _tl } { l_@@_named_ #2 _tl }
+            \prop_set_eq:cc { l_@@_named_ #1 _prop } { l_@@_named_ #2 _prop }
+          }
       }
       {
         \__kernel_msg_error:nnn { color } { unknown-color } {#2}
@@ -920,6 +1121,7 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
 %
 % A small set of colors are always defined.
 % \begin{macrocode}
@@ -933,19 +1135,154 @@
 \color_set:nnn { blue }  { rgb } { 0 , 0 , 1 }
 % \end{macrocode}
 %
-% \begin{variable}{\l_@@_named_._tl}
+% \begin{variable}{\l_@@_named_._prop, \l_@@_named_._tl}
 %   A special named color: this is always defined though not fixed in
 %   definition.
 %    \begin{macrocode}
+\prop_new:c { l_@@_named_._prop }
 \tl_new:c { l_@@_named_._tl }
-\tl_set_eq:cN { l_@@_named_._tl } \l_@@_current_tl
+\tl_set:cx { l_@@_named_._tl } { \@@_model:N \l_@@_current_tl }
 %    \end{macrocode}
 % \end{variable}
 %
+% \subsection{Exporting colors}
+%
+% \begin{macro}{\color_export:nnN}
+% \begin{macro}{\color_export:nnnN}
+% \begin{macro}{\@@_export:nN}
+% \begin{macro}{\@@_export:nnnN}
+%    \begin{macrocode}
+\cs_new_protected:Npn \color_export:nnN #1#2#3
+  {
+    \group_begin:
+      \tl_if_exist:cT { c_@@_export_ #2 _tl }
+        { \tl_set_eq:Nc \l_color_fixed_model_tl { c_@@_export_ #2 _tl } }
+      \@@_parse:nN {#1} #3
+      \@@_export:nN {#2} #3
+    \exp_args:NNNV \group_end:
+    \tl_set:Nn #3 #3
+  }
+\cs_new_protected:Npn \color_export:nnnN #1#2#3#4
+  {
+    \@@_select_main:Nw #4
+      #1 / / \s_@@_mark #2 / / \s_@@_stop
+    \@@_export:nN {#3} #4
+  }
+\cs_new_protected:Npn \@@_export:nN #1#2
+  { \exp_after:wN \@@_export:nnnN #2 {#1} #2 }
+\cs_new:Npn \@@_export:nnnN #1#2#3#4
+  {
+    \cs_if_exist_use:cF { @@_export_format_ #3 :nnN }
+      {
+        \__kernel_msg_error:nnn { color } { unknown-export-format } {#3}
+        \use_none:nnn
+      }
+        {#1} {#2} #4
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_export_format_backend:nnN}
+%   Simple.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_export_format_backend:nnN #1#2#3
+  { \tl_set:Nn #3 { {#1} {#2} } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_export:nnnNN}
+%   A generic auxiliary for cases where only one model is appropriate.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_export:nnnNN #1#2#3#4#5
+  {
+    \str_if_eq:nnTF {#2} {#1}
+      { #5 #4 #3 \s_@@_stop }
+      {
+        \@@_convert:nnnN {#2} {#1} {#3} #4
+        \exp_after:wN #5 \exp_after:wN #4
+          #4 \s_@@_stop
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}
+%   {
+%     \c_@@_export_HTML_tl           ,
+%     \c_@@_export_space-sep-cmyk_tl ,
+%     \c_@@_export_space-sep-rgb_tl
+%   }
+%    \begin{macrocode}
+\tl_const:Nn \c_@@_export_HTML_tl { rgb }
+\tl_const:cn { c_@@_export_space-sep-cmyk_tl } { cmyk }
+\tl_const:cn { c_@@_export_space-sep-rgb_tl } { rgb }
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_export_format_space-sep-cmyk:nnN}
+% \begin{macro}{\@@_export_space-sep-cmyk:Nw}
+%    \begin{macrocode}
+\cs_new_protected:cpx { @@_export_format_space-sep-cmyk:nnN } #1#2#3
+  {
+    \exp_not:N \@@_export:nnnNN { cmyk } {#1} {#2} #3
+      \exp_not:c { @@_export_space-sep-cmyk:Nw }
+  }
+\cs_new_protected:cpn { @@_export_space-sep-cmyk:Nw } #1#2 \s_@@_stop
+  { \tl_set:Nx #1 {#2} }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+%   {
+%     \@@_export_format_HTML:nnN          ,
+%     \@@_export_format_space-sep-rgb:nnN
+%   }
+% \begin{macro}
+%   {
+%     \@@_export_HTML:Nw          ,
+%     \@@_export_space-sep-rgb:Nw
+%   }
+% \begin{macro}[EXP]{\@@_export_HTML:n}
+%   \textsc{html} values must be given in |rgb|: we force conversion if
+%   required, then do some simple maths.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_export_format_HTML:nnN #1#2#3
+  { \@@_export:nnnNN { rgb } {#1} {#2}#3 \@@_export_HTML:Nw }
+\cs_new_protected:cpx { @@_export_format_space-sep-rgb:nnN } #1#2#3
+  {
+    \exp_not:N \@@_export:nnnNN { rgb } {#1} {#2} #3
+      \exp_not:c { @@_export_space-sep-rgb:Nw }
+  }
+\cs_new_protected:Npn \@@_export_HTML:Nw #1#2 ~ #3 ~ #4 \s_@@_stop
+  {
+    \tl_set:Nx #1
+      {
+        \@@_export_HTML:n {#2}
+        \@@_export_HTML:n {#3}
+        \@@_export_HTML:n {#4}
+      }
+  }
+\cs_new:Npn \@@_export_HTML:n #1
+  {
+    \fp_compare:nNnTF {#1} = { 0 }
+      { 00 }
+      { \int_to_Hex:n { \fp_to_int:n { #1 * 255 } } }
+  }
+\cs_new_protected:cpn { @@_export_space-sep-rgb:Nw } #1#2 \s_@@_stop
+  { \tl_set:Nx #1 {#2} }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
 % \subsection{Diagnostics}
 %
 % \begin{macro}{\color_show:n}
-% \begin{macro}{\@@_show:nn}
+% \begin{macro}{\@@_show:n}
 %   Extract the information about a color and format for the user: the approach
 %   is similar to the keys module here.
 %    \begin{macrocode}
@@ -954,17 +1291,20 @@
     \msg_show:nnxxxx { LaTeX / color } { show }
       {#1}
       {
-        \@@_if_defined:nTF {#1}
-          { \exp_last_unbraced:Nv \@@_show:nn { l_@@_named_ #1 _tl } }
-          { }
+        \@@_if_defined:nT {#1}
+          {
+            \exp_args:Nv \@@_show:n { l_@@_named_ #1 _tl }
+            \prop_map_function:cN
+              { l_@@_named_ #1 _prop }
+              \msg_show_item_unbraced:nn
+          }
       }
       { }
       { }
   }
-\cs_new:Npn \@@_show:nn #1#2
+\cs_new:Npn \@@_show:n #1
   {
     \msg_show_item_unbraced:nn { model } {#1}
-    \msg_show_item_unbraced:nn { value } {#2}
   }
 %    \end{macrocode}
 % \end{macro}
@@ -979,6 +1319,12 @@
     LaTeX~has~been~asked~to~use~a~color~named~'#1',~
     but~this~has~never~been~defined.
   }
+\__kernel_msg_new:nnnn { color } { unknown-export-format }
+  { Unknown~export~format~'#1'. }
+  {
+    LaTeX~has~been~asked~to~export~a~color~in~format~'#1',~
+    but~this~has~never~been~defined.
+  }
 \__kernel_msg_new:nnnn { color } { unknown-model }
   { Unknown~color~model~'#1'. }
   {

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -167,7 +167,7 @@
   { \@@_color:nn { stroke } {#1} }
 \cs_new_protected:Npn \@@_color:nn #1#2
   {
-    \color_parse:nN {#2} \l_@@_color_tmp_tl
+    \color_export:nnN {#2} { backend } \l_@@_color_tmp_tl
     \exp_after:wN \@@_color:nnn \l_@@_color_tmp_tl {#1}
   }
 \cs_new_protected:Npn \@@_color:nnn #1#2#3

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -110,7 +110,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -1146,7 +1146,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3draw}{2020-06-18}{}
+\ProvidesExplPackage{l3draw}{2020-07-17}{}
   {L3 Experimental core drawing support}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -241,7 +241,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3graphics}{2020-06-18}{}
+\ProvidesExplPackage{l3graphics}{2020-07-17}{}
   {L3 Experimental graphics inclusion support}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -191,7 +191,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3pdf}{2020-06-18}{}
+\ProvidesExplPackage{l3pdf}{2020-07-17}{}
   {L3 Experimental core PDF support}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -48,7 +48,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -167,7 +167,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3str-format}{2020-06-18}{}
+\ProvidesExplPackage{l3str-format}{2020-07-17}{}
   {L3 Experimental string formatting}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -136,7 +136,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3sys-shell}{2020-06-18}{}
+\ProvidesExplPackage{l3sys-shell}{2020-07-17}{}
   {L3 Experimental system shell functions}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -56,7 +56,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -675,7 +675,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2020-06-18}{}
+\ProvidesExplPackage{xcoffins}{2020-07-17}{}
   {L3 Experimental design level coffins}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -61,7 +61,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -687,7 +687,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3galley}{2020-06-18}{}
+\ProvidesExplPackage{l3galley}{2020-07-17}{}
   {L3 Experimental galley code}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -734,7 +734,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2020-06-18}{}
+\ProvidesExplPackage{xgalley}{2020-07-17}{}
   {L3 Experimental galley}
 \RequirePackage{xparse,xtemplate,l3galley}
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -24,7 +24,7 @@
 %
 %<*driver|generic|package|2ekernel>
 %</driver|generic|package|2ekernel>
-\def\ExplFileDate{2020-06-18}%
+\def\ExplFileDate{2020-07-17}%
 %<*driver>
 \documentclass[full]{l3doc}
 \usepackage{graphicx}
@@ -51,7 +51,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -423,6 +423,7 @@
 %   \item[bool]   either true or false (the \LaTeX3 implementation does
 %                 not use \tn{iftrue} or \tn{iffalse});
 %   \item[box]    box register;
+%   \item[cctab]  category code table;
 %   \item[clist]  comma separated list;
 %   \item[coffin] a \enquote{box with handles} --- a higher-level data
 %                 type for carrying out |box| alignment operations;

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2020-07-17 21:45:53 UTC (rev 55860)
@@ -95,6 +95,7 @@
         \from{l3fp-convert.dtx} {package}
         \from{l3fp-random.dtx}  {package}
         \from{l3fparray.dtx}    {package}
+        \from{l3cctab.dtx}      {package}
         \from{l3sort.dtx}       {package}
         \from{l3str-convert.dtx}{package}
         \from{l3tl-analysis.dtx}{package}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -426,24 +426,6 @@
 %   \end{texnote}
 % \end{function}
 %
-% \begin{function}[added = 2011-12-22]
-%   {\seq_set_map:NNn, \seq_gset_map:NNn}
-%   \begin{syntax}
-%     \cs{seq_set_map:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline function}
-%   \end{syntax}
-%   Applies \meta{inline function} to every \meta{item} stored
-%   within the \meta{sequence_2}. The \meta{inline function} should
-%   consist of code which will receive the \meta{item} as |#1|.
-%   The sequence resulting from \texttt{x}-expanding
-%   \meta{inline function} applied to each \meta{item}
-%   is assigned to \meta{sequence_1}. As such, the code
-%   in \meta{inline function} should be expandable.
-%   \begin{texnote}
-%     Contrarily to other mapping functions, \cs{seq_map_break:} cannot
-%     be used in this function, and would lead to low-level \TeX{} errors.
-%   \end{texnote}
-% \end{function}
-%
 % \begin{function}[added = 2018-04-06]
 %   {\seq_set_from_function:NnN, \seq_gset_from_function:NnN}
 %   \begin{syntax}
@@ -622,7 +604,8 @@
 %     \cs{tl_build_end:N} \meta{tl~var}
 %   \end{syntax}
 %   Gets the contents of \meta{tl~var} and stores that into the
-%   \meta{tl~var} using \cs{tl_set:Nn}.  The \meta{tl~var} must have
+%   \meta{tl~var} using \cs{tl_set:Nn} or \cs{tl_gset:Nn}.
+%   The \meta{tl~var} must have
 %   been set up with \cs{tl_build_begin:N} or \cs{tl_build_gbegin:N}.
 %   The |end| and |gend| functions must be used for local and global
 %   \meta{tl~var} respectively.  These functions completely remove the
@@ -1145,26 +1128,6 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\seq_set_map:NNn, \seq_gset_map:NNn}
-% \begin{macro}{\@@_set_map:NNNn}
-%   Very similar to \cs{seq_set_filter:NNn}. We could actually
-%   merge the two within a single function, but it would have weird
-%   semantics.
-%    \begin{macrocode}
-\cs_new_protected:Npn \seq_set_map:NNn
-  { \@@_set_map:NNNn \tl_set:Nx }
-\cs_new_protected:Npn \seq_gset_map:NNn
-  { \@@_set_map:NNNn \tl_gset:Nx }
-\cs_new_protected:Npn \@@_set_map:NNNn #1#2#3#4
-  {
-    \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
-    #1 #2 { #3 }
-    \@@_pop_item_def:
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
 % \begin{macro}{\seq_set_from_inline_x:Nnn, \seq_gset_from_inline_x:Nnn}
 % \begin{macro}{\@@_set_from_inline_x:NNnn}
 %   Set \cs{@@_item:n} then map it using the loop code.

Added: trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -0,0 +1,891 @@
+% \iffalse meta-comment
+%
+%% File: l3cctab.dtx
+%
+% Copyright (C) 2018-2020 The LaTeX3 Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version.  The latest version
+% of this license is in the file
+%
+%    http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+%    https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full]{l3doc}
+\begin{document}
+  \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+%   The \pkg{l3cctab} package\\ Category code tables^^A
+% }
+%
+% \author{^^A
+%  The \LaTeX3 Project\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:latex-team at latex-project.org}
+%          {latex-team at latex-project.org}^^A
+%    }^^A
+% }
+%
+% \date{Released 2020-07-17}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% A category code table enables rapid switching of all category codes in
+% one operation. For \LuaTeX{}, this is possible over the entire Unicode
+% range. For other engines, only the $8$-bit range ($0$--$255$) is covered by
+% such tables.
+%
+% \section{Creating and initialising category code tables}
+%
+% \begin{function}[updated = 2020-07-02]{\cctab_new:N,\cctab_new:c}
+%   \begin{syntax}
+%     \cs{cctab_new:N} \meta{category code table}
+%   \end{syntax}
+%   Creates a new \meta{category code table} variable or raises an error if
+%   the name is already taken. The declaration is global.  The
+%   \meta{category code table} is initialised with the codes
+%   as used by \IniTeX{}.
+% \end{function}
+%
+% \begin{function}[updated = 2020-07-07]{\cctab_const:Nn,\cctab_const:cn}
+%   \begin{syntax}
+%     \cs{cctab_const:Nn} \meta{category code table} \Arg{category code set up}
+%   \end{syntax}
+%   Creates a new \meta{category code table}, applies (in a group) the
+%   \meta{category code set up} on top of \IniTeX{} settings,
+%   then saves them globally as a constant
+%   table.  The \meta{category code set up} can include a call to
+%   \cs{cctab_select:N}.
+% \end{function}
+%
+% \begin{function}[updated = 2020-07-07]{\cctab_gset:Nn,\cctab_gset:cn}
+%   \begin{syntax}
+%     \cs{cctab_gset:Nn} \meta{category code table} \Arg{category code set up}
+%   \end{syntax}
+%   Starting from the \IniTeX{} category codes,
+%   applies (in a group) the \meta{category code set up}, then saves them
+%   globally in the \meta{category code table}.  The \meta{category code set up}
+%   can include a call to \cs{cctab_select:N}.
+% \end{function}
+%
+% \section{Using category code tables}
+%
+% \begin{function}[updated = 2020-07-02]{\cctab_begin:N,\cctab_begin:c}
+%   \begin{syntax}
+%     \cs{cctab_begin:N} \meta{category code table}
+%   \end{syntax}
+%   Switches locally the category codes in force to those stored in the
+%   \meta{category code table}.  The prevailing codes before the
+%   function is called are added to a stack, for use with
+%   \cs{cctab_end:}. This function does not start a \TeX{} group.
+% \end{function}
+%
+% \begin{function}[updated = 2020-07-02]{\cctab_end:}
+%   \begin{syntax}
+%     \cs{cctab_end:}
+%   \end{syntax}
+%   Ends the scope of a \meta{category code table} started using
+%   \cs{cctab_begin:N}, returning the codes to those in force before the
+%   matching \cs{cctab_begin:N} was used.  This must be used within the
+%   same \TeX{} group (and at the same \TeX{} group level) as the
+%   matching \cs{cctab_begin:N}.
+% \end{function}
+%
+% \begin{function}[added = 2020-05-19, updated = 2020-07-02]{\cctab_select:N}
+%   \begin{syntax}
+%     \cs{cctab_select:N} \meta{category code table}
+%   \end{syntax}
+%   Selects the \meta{category code table} for the scope of the current
+%   group.  This is in particular useful in the \meta{setup} arguments
+%   of \cs{tl_set_rescan:Nnn}, \cs{tl_rescan:nn}, \cs{cctab_const:Nn},
+%   and \cs{cctab_gset:Nn}.
+% \end{function}
+%
+% \section{Category code table conditionals}
+%
+% \begin{function}[pTF]{\cctab_if_exist:N, \cctab_if_exist:c}
+%   \begin{syntax}
+%     \cs{cctab_if_exist_p:N} \meta{category code table}
+%     \cs{cctab_if_exist:NTF} \meta{category code table} \Arg{true code} \Arg{false code}
+%   \end{syntax}
+%   Tests whether the \meta{category code table} is currently defined.
+%   This does not check that the \meta{category code table} really is a
+%   category code table.
+% \end{function}
+%
+% \section{Constant category code tables}
+%
+% \begin{variable}[updated = 2020-07-10]{\c_code_cctab}
+%   Category code table for the \pkg{expl3} code environment; this does
+%   \emph{not} include \texttt{@}, which is retained as an \enquote{other}
+%   character.
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-08]{\c_document_cctab}
+%   Category code table for a standard \LaTeX{} document, as set by the \LaTeX{}
+%   kernel. In particular, the upper-half of the $8$-bit range will be set to
+%   \enquote{active} with \pdfTeX{} \emph{only}. No \pkg{babel} shorthands
+%   will be activated.
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-02]{\c_initex_cctab}
+%   Category code table as set up by \IniTeX{}.
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-02]{\c_other_cctab}
+%   Category code table where all characters have category code $12$
+%   (other).
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-02]{\c_str_cctab}
+%   Category code table where all characters have category code $12$
+%   (other) with the exception of spaces, which have category code
+%   $10$ (space).
+% \end{variable}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3cctab} implementation}
+%
+%    \begin{macrocode}
+%<*initex|package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<@@=cctab>
+%    \end{macrocode}
+%
+% As \LuaTeX{} offers engine support for category code tables, and this
+% is entirely lacking from the other engines, we need two complementary
+% approaches. (Some future \XeTeX{} may add support, at which point the
+% conditionals below would be different.)
+%
+% \subsection{Variables}
+%
+% \begin{variable}{\g_@@_stack_seq, \g_@@_unused_seq}
+%   List of catcode tables saved by nested \cs{cctab_begin:N}, to
+%   restore catcodes at the matching \cs{cctab_end:}.  When popped from
+%   the \cs{g_@@_stack_seq} the table numbers are stored in
+%   \cs{g_@@_unused_seq} for later reuse.
+%    \begin{macrocode}
+\seq_new:N \g_@@_stack_seq
+\seq_new:N \g_@@_unused_seq
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_group_seq}
+%   A stack to store the group level when a catcode table started.
+%    \begin{macrocode}
+\seq_new:N \g_@@_group_seq
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_allocate_int}
+%   Integer to keep track of what category code table to allocate.  In
+%   \LuaTeX{} it is only used in format mode to implement
+%   \cs{cctab_new:N}.  In other engines it is used to make csnames for
+%   dynamic tables.
+%    \begin{macrocode}
+\int_new:N  \g_@@_allocate_int
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_internal_a_tl,\l_@@_internal_b_tl}
+%   Scratch space.  For instance, when popping
+%   \cs{g_@@_stack_seq}/\cs{g_@@_unused_seq}, consists of the
+%   catcodetable number (integer denotation) in \LuaTeX{}, or of an
+%   intarray variable (as a single token) in other engines.
+%    \begin{macrocode}
+\tl_new:N \l_@@_internal_a_tl
+\tl_new:N \l_@@_internal_b_tl
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_endlinechar_prop}
+%   In \LuaTeX{} we store the \tn{endlinechar} associated to each
+%   \tn{catcodetable} in a property list, unless it is the default
+%   value~$13$.
+%    \begin{macrocode}
+\prop_new:N \g_@@_endlinechar_prop
+%    \end{macrocode}
+% \end{variable}
+%
+% \subsection{Allocating category code tables}
+%
+% \begin{macro}{\cctab_new:N, \cctab_new:c, \@@_new:N, \@@_gstore:Nnn}
+%   The \cs{@@_new:N} auxiliary allocates a new catcode table but does
+%   not attempt to set its value consistently across engines.  It is
+%   used both in \cs{cctab_new:N}, which sets catcodes to \IniTeX{}
+%   values, and in \cs{cctab_begin:N}/\cs{cctab_end:} for dynamically
+%   allocated tables.
+%
+%   First, the \LuaTeX{} case.
+%   Creating a new category code table is done like other registers.
+%    \begin{macrocode}
+\sys_if_engine_luatex:TF
+  {
+    \cs_new_protected:Npn \cctab_new:N #1
+      {
+        \__kernel_chk_if_free_cs:N #1
+        \@@_new:N #1
+      }
+%<*initex>
+    \cs_new_protected:Npn \@@_new:N #1
+      {
+        \int_gincr:N \g_@@_allocate_int
+        \int_compare:nNnTF
+          \g_@@_allocate_int > \c_max_register_int
+           {
+             \__kernel_msg_fatal:nnx
+               { kernel } { out-of-registers } { cctab }
+           }
+           {
+             \tex_global:D \tex_chardef:D #1 \g_@@_allocate_int
+             \tex_initcatcodetable:D #1
+           }
+      }
+%</initex>
+%<*package>
+    \cs_new_eq:NN \@@_new:N \newcatcodetable
+%</package>
+  }
+%    \end{macrocode}
+%   Now the case for other engines. Here, each table is an integer
+%   array.  Following the \LuaTeX{} pattern, a new table starts with
+%   \IniTeX{} codes.  The index base is out-by-one, so we have an
+%   internal function to handle that.  The \IniTeX{} \tn{endlinechar} is
+%   $13$.
+%    \begin{macrocode}
+  {
+    \cs_new_protected:Npn \@@_new:N #1
+      { \intarray_new:Nn #1 { 257 } }
+    \cs_new_protected:Npn \@@_gstore:Nnn #1#2#3
+      { \intarray_gset:Nnn #1 { \int_eval:n { #2 + 1 } } {#3} }
+    \cs_new_protected:Npn \cctab_new:N #1
+      {
+        \__kernel_chk_if_free_cs:N #1
+        \@@_new:N #1
+        \int_step_inline:nn { 256 }
+          { \__kernel_intarray_gset:Nnn #1 {##1} { 12 } }
+        \__kernel_intarray_gset:Nnn #1 { 257 } { 13 }
+        \@@_gstore:Nnn #1 { 0 } { 9 }
+        \@@_gstore:Nnn #1 { 13 } { 5 }
+        \@@_gstore:Nnn #1 { 32 } { 10 }
+        \@@_gstore:Nnn #1 { 37 } { 14 }
+        \int_step_inline:nnn { 65 } { 90 }
+          { \@@_gstore:Nnn #1 {##1} { 11 } }
+        \@@_gstore:Nnn #1 { 92 } { 0 }
+        \int_step_inline:nnn { 97 } { 122 }
+          { \@@_gstore:Nnn #1 {##1} { 11 } }
+        \@@_gstore:Nnn #1 { 127 } { 15 }
+      }
+  }
+\cs_generate_variant:Nn \cctab_new:N { c }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Saving category code tables}
+%
+% \begin{macro}{\@@_gset:n, \@@_gset_aux:n}
+%   In various functions we need to save the current catcodes (globally)
+%   in a table.  In \LuaTeX{}, saving the catcodes is a primitives, but
+%   the \tn{endlinechar} needs more work: to avoid filling
+%   \cs{g_@@_endlinechar_prop} with many entries we special-case the
+%   default value $13$.  In other engines we store $256$ current
+%   catcodes and the \tn{endlinechar} in an intarray variable.
+%    \begin{macrocode}
+\sys_if_engine_luatex:TF
+  {
+    \cs_new_protected:Npn \@@_gset:n #1
+      { \exp_args:Nf \@@_gset_aux:n { \int_eval:n {#1} } }
+    \cs_new_protected:Npn \@@_gset_aux:n #1
+      {
+        \tex_savecatcodetable:D #1 \scan_stop:
+        \int_compare:nNnTF { \tex_endlinechar:D } = { 13 }
+          { \prop_gremove:Nn \g_@@_endlinechar_prop {#1} }
+          {
+            \prop_gput:NnV \g_@@_endlinechar_prop {#1}
+              \tex_endlinechar:D
+          }
+      }
+  }
+  {
+    \cs_new_protected:Npn \@@_gset:n #1
+      {
+        \int_step_inline:nn { 256 }
+          {
+            \__kernel_intarray_gset:Nnn #1 {##1}
+              { \char_value_catcode:n { ##1 - 1 } }
+          }
+        \__kernel_intarray_gset:Nnn #1 { 257 }
+          { \tex_endlinechar:D }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cctab_gset:Nn, \cctab_gset:cn}
+%   Category code tables are always global, so only one version of
+%   assignments is needed.  Simply run the setup in a group and save the
+%   result in a category code table~|#1|, provided it is valid.  The
+%   internal function is defined above depending on the engine.
+%    \begin{macrocode}
+\cs_new_protected:Npn \cctab_gset:Nn #1#2
+  {
+    \@@_chk_if_valid:NT #1
+      {
+        \group_begin:
+          \cctab_select:N \c_initex_cctab
+          #2 \scan_stop:
+          \@@_gset:n {#1}
+        \group_end:
+      }
+  }
+\cs_generate_variant:Nn \cctab_gset:Nn { c }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Using category code tables}
+%
+% \begin{variable}{\g_@@_internal_cctab}
+% \begin{macro}[EXP]{\@@_internal_cctab_name:}
+%   In \LuaTeX{}, we must ensure that the saved tables are read-only.
+%   This is done by applying the saved table, then switching immediately
+%   to a scratch table.  Any later catcode assignment will affect that
+%   scratch table rather than the saved one.  If we simply switched to
+%   the saved tables, then \cs{char_set_catcode_other:N} in the example
+%   below would change \cs{c_document_cctab} and a later use of that
+%   table would give the wrong category code to |_|.
+% \begin{verbatim}
+% \use:n
+%   {
+%     \cctab_begin:N \c_document_cctab
+%       \char_set_catcode_other:N \_
+%     \cctab_end:
+%     \cctab_begin:N \c_document_cctab
+%       \int_compare:nTF { \char_value_catcode:n { `_ } = 8 }
+%         { \TRUE } { \ERROR }
+%     \cctab_end:
+%   }
+% \end{verbatim}
+%   We must also make sure that a scratch table is never reused in a
+%   nested group: in the following example, the scratch table used by
+%   the first \cs{cctab_begin:N} would be changed globally by the second
+%   one issuing \tn{savecatcodetable}, and after \cs{group_end:} the
+%   wrong category codes (those of \cs{c_str_cctab}) would be imposed.
+%   Note that the inner \cs{cctab_end:} restores the correct catcodes
+%   only locally, so the problem really comes up because of the
+%   different grouping level.  The simplest is to use a scratch table
+%   labeled by the \tn{currentgrouplevel}.  We initialize one of them as
+%   an example.
+% \begin{verbatim}
+% \use:n
+%   {
+%     \cctab_begin:N \c_document_cctab
+%       \group_begin:
+%         \cctab_begin:N \c_str_cctab
+%         \cctab_end:
+%       \group_end:
+%     \cctab_end:
+%   }
+% \end{verbatim}
+%    \begin{macrocode}
+\sys_if_engine_luatex:T
+  {
+    \@@_new:N \g_@@_internal_cctab
+    \cs_new:Npn \@@_internal_cctab_name:
+      {
+        g_@@_internal
+        \tex_romannumeral:D \tex_currentgrouplevel:D
+        _cctab
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{variable}
+%
+% \begin{macro}{\cctab_select:N, \cctab_select:c}
+% \begin{macro}{\@@_select:N}
+%   The public function simply checks the \meta{cctab~var} exists before
+%   using the engine-dependent \cs{@@_select:N}.  Skipping these checks
+%   would result in low-level engine-dependent errors.  First, the
+%   \LuaTeX{} case.  In other engines, selecting a catcode table is a matter
+%   of doing $256$ catcode assignments and setting the \tn{endlinechar}.
+%    \begin{macrocode}
+\cs_new_protected:Npn \cctab_select:N #1
+  { \@@_chk_if_valid:NT #1 { \@@_select:N #1 } }
+\cs_generate_variant:Nn \cctab_select:N { c }
+\sys_if_engine_luatex:TF
+  {
+    \cs_new_protected:Npn \@@_select:N #1
+      {
+        \tex_catcodetable:D #1
+        \prop_get:NVNTF \g_@@_endlinechar_prop #1 \l_@@_internal_a_tl
+          { \int_set:Nn \tex_endlinechar:D { \l_@@_internal_a_tl } }
+          { \int_set:Nn \tex_endlinechar:D { 13 } }
+        \cs_if_exist:cF { \@@_internal_cctab_name: }
+          { \exp_args:Nc \@@_new:N { \@@_internal_cctab_name: } }
+        \exp_args:Nc \tex_savecatcodetable:D { \@@_internal_cctab_name: }
+        \exp_args:Nc \tex_catcodetable:D { \@@_internal_cctab_name: }
+      }
+  }
+  {
+    \cs_new_protected:Npn \@@_select:N #1
+      {
+        \int_step_inline:nn { 256 }
+          {
+            \char_set_catcode:nn { ##1 - 1 }
+              { \__kernel_intarray_item:Nn #1 {##1} }
+          }
+        \int_set:Nn \tex_endlinechar:D
+          { \__kernel_intarray_item:Nn #1 { 257 } }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{variable}{\g_@@_next_cctab}
+% \begin{macro}{\@@_begin_aux:}
+%   For \cs{cctab_begin:N}/\cs{cctab_end:} we will need to allocate
+%   dynamic tables.  This is done here by \cs{@@_begin_aux:}, which puts
+%   a table number (in \LuaTeX{}) or name (in other engines) into
+%   \cs{l_@@_internal_a_tl}.  In \LuaTeX{} this simply calls \cs{@@_new:N}
+%   and uses the resulting catcodetable number; in other engines we need
+%   to give a name to the intarray variable and use that.  In \LuaTeX{},
+%   to restore catcodes at \cs{cctab_end:} we cannot just set
+%   \tn{catcodetable} to its value before \cs{cctab_begin:N}, because
+%   that table may have been altered by other code in the mean time.  So
+%   we must make sure to save the catcodes in a table we control and
+%   restore them at \cs{cctab_end:}.
+%    \begin{macrocode}
+\sys_if_engine_luatex:TF
+  {
+    \cs_new_protected:Npn \@@_begin_aux:
+      {
+        \@@_new:N \g_@@_next_cctab
+        \tl_set:NV \l_@@_internal_a_tl \g_@@_next_cctab
+        \cs_undefine:N \g_@@_next_cctab
+      }
+  }
+  {
+    \cs_new_protected:Npn \@@_begin_aux:
+      {
+        \int_gincr:N \g_@@_allocate_int
+        \exp_args:Nc \@@_new:N
+          { g_@@_ \int_use:N \g_@@_allocate_int _cctab }
+        \exp_args:NNc \tl_set:Nn \l_@@_internal_a_tl
+          { g_@@_ \int_use:N \g_@@_allocate_int _cctab }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{variable}
+%
+% \begin{macro}{\cctab_begin:N, \cctab_begin:c}
+%   Check the \meta{cctab~var} exists, to avoid low-level errors.  Get
+%   in \cs{l_@@_internal_a_tl} the number/name of a dynamic table, either
+%   from \cs{g_@@_unused_seq} where we save tables that are not
+%   currently in use, or from \cs{@@_begin_aux:} if none are available.
+%   Then save the current catcodes into the table (pointed to by)
+%   \cs{l_@@_internal_a_tl} and save that table number in a stack before
+%   selecting the desired catcodes.
+%    \begin{macrocode}
+\cs_new_protected:Npn \cctab_begin:N #1
+  {
+    \@@_chk_if_valid:NT #1
+      {
+        \seq_gpop:NNF \g_@@_unused_seq \l_@@_internal_a_tl
+          { \@@_begin_aux: }
+        \exp_args:Nx \@@_chk_group_begin:n
+          { \@@_nesting_number:N \l_@@_internal_a_tl }
+        \seq_gpush:NV \g_@@_stack_seq \l_@@_internal_a_tl
+        \exp_args:NV \@@_gset:n \l_@@_internal_a_tl
+        \@@_select:N #1
+      }
+  }
+\cs_generate_variant:Nn \cctab_begin:N { c }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cctab_end:}
+%   Make sure a \cs{cctab_begin:N} was used some time earlier, get in
+%   \cs{l_@@_internal_a_tl} the catcode table number/name in which the
+%   prevailing catcodes were stored, then restore these catcodes.  The
+%   dynamic table is now unused hence stored in \cs{g_@@_unused_seq} for
+%   recycling by later \cs{cctab_begin:N}.
+%    \begin{macrocode}
+\cs_new_protected:Npn \cctab_end:
+  {
+    \seq_gpop:NNTF \g_@@_stack_seq \l_@@_internal_a_tl
+      {
+        \seq_gpush:NV \g_@@_unused_seq \l_@@_internal_a_tl
+        \exp_args:Nx \@@_chk_group_end:n
+          { \@@_nesting_number:N \l_@@_internal_a_tl }
+        \@@_select:N \l_@@_internal_a_tl
+      }
+      { \__kernel_msg_error:nn { kernel } { cctab-extra-end } }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_chk_group_begin:n,\@@_chk_group_end:n}
+%   Catcode tables are not allowed to be intermixed with groups, so here
+%   we check that they are properly nested regarding \TeX{} groups.
+%   \cs{@@_chk_group_begin:n} stores the current group level in a stack,
+%   and locally defines a dummy control sequence
+%   \cs[no-index]{@@_group_\meta{cctab-level}_chk:}.
+%
+%   \cs{@@_chk_group_end:n} pops the stack, and compares the returned
+%   value with \cs{tex_currentgrouplevel:D}.  If they differ,
+%   \cs{cctab_end:} is in a different grouping level than the matching
+%   \cs{cctab_begin:N}.  If they are the same, both happened at the same
+%   level, however a group might have ended and another started between
+%   \cs{cctab_begin:N} and \cs{cctab_end:}:
+% \begin{verbatim}
+%   \group_begin:
+%     \cctab_begin:N \c_document_cctab
+%   \group_end:
+%   \group_begin:
+%     \cctab_end:
+%   \group_end:
+% \end{verbatim}
+%   In this case checking \cs{tex_currentgrouplevel:D} is not enough, so
+%   we locally define \cs[no-index]{@@_group_\meta{cctab-level}_chk:},
+%   and then check if it exist in \cs{cctab_end:}.  If it doesn't,
+%   we know there was a group end where it shouldn't.
+%
+%   The \meta{cctab-level} in the sentinel macro above cannot be
+%   replaced by the more convenient \cs{tex_currentgrouplevel:D} because
+%   with the latter we might be tricked.  Suppose:
+% \begin{verbatim}
+%   \group_begin:
+%     \cctab_begin:N \c_code_cctab % A
+%   \group_end:
+%   \group_begin:
+%     \cctab_begin:N \c_code_cctab % B
+%     \cctab_end: % C
+%     \cctab_end: % D
+%   \group_end:
+% \end{verbatim}
+%   The line marked with |A| would start a |cctab| with a sentinel token
+%   named \cs[no-index]{@@_group_1_chk:}, which would disappear at the
+%   \cs{group_end:} that follows.  But |B| would create the same
+%   sentinel token, since both are at the same group level.  Line |C|
+%   would end the |cctab| from line |B| correctly, but so would line |D|
+%   because line |B| created the same sentinel token.  Using
+%   \meta{cctab-level} works correctly because it signals that certain
+%   |cctab| level was activated somewhere, but if it doesn't exist when
+%   the \cs{cctab_end:} is reached, we had a problem.
+%
+%   Unfortunately these tests only flag the wrong usage at the
+%   \cs{cctab_end:}, which might be far from the \cs{cctab_begin:N}.
+%   However it isn't possible to signal the wrong usage at the
+%   \cs{group_end:} without using \cs{tex_aftergroup:D}, which is
+%   unsafe in certain types of groups.
+%
+%   The three cases checked here just raise an error, and no recovery is
+%   attempted:  usually interleaving groups and catcode tables will work
+%   predictably.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_chk_group_begin:n #1
+  {
+    \seq_gpush:Nx \g_@@_group_seq
+      { \int_use:N \tex_currentgrouplevel:D }
+    \cs_set_eq:cN { @@_group_ #1 _chk: } \prg_do_nothing:
+  }
+\cs_new_protected:Npn \@@_chk_group_end:n #1
+  {
+    \seq_gpop:NN \g_@@_group_seq \l_@@_internal_b_tl
+    \bool_lazy_and:nnF
+      {
+        \int_compare_p:nNn
+          { \tex_currentgrouplevel:D } = { \l_@@_internal_b_tl }
+      }
+      { \cs_if_exist_p:c { @@_group_ #1 _chk: } }
+      {
+        \__kernel_msg_error:nnx { kernel } { cctab-group-mismatch }
+          {
+            \int_sign:n
+              { \tex_currentgrouplevel:D - \l_@@_internal_b_tl }
+          }
+      }
+    \cs_undefine:c { @@_group_ #1 _chk: }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_nesting_number:N,\@@_nesting_number:w}
+%   This macro returns the numeric index of the current catcode table.
+%   In \LuaTeX{} this is just the argument, which is a count reference
+%   to a \tn{catcodetable} register.  In other engines, the number is
+%   extracted from the |cctab| variable.
+%    \begin{macrocode}
+\sys_if_engine_luatex:TF
+  { \cs_new:Npn \@@_nesting_number:N #1 {#1} }
+  {
+    \cs_new:Npn \@@_nesting_number:N #1
+      {
+        \exp_after:wN \exp_after:wN \exp_after:wN \@@_nesting_number:w
+          \exp_after:wN \token_to_str:N #1
+      }
+    \use:x
+      {
+        \cs_new:Npn \exp_not:N \@@_nesting_number:w
+          ##1 \tl_to_str:n { g_@@_ } ##2 \tl_to_str:n { _cctab } {##2}
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% Finally, install some code at the end of the \TeX{} run to check that
+% all \cs{cctab_begin:N} were ended by some \cs{cctab_end:}.
+%    \begin{macrocode}
+\cs_if_exist:NT \hook_gput_code:nnn
+  {
+    \hook_gput_code:nnn { enddocument/end } { kernel }
+      {
+        \seq_if_empty:NF \g_@@_stack_seq
+          { \__kernel_msg_error:nn { kernel } { cctab-missing-end } }
+      }
+  }
+%    \end{macrocode}
+%
+% \subsection{Category code table conditionals}
+%
+% \begin{macro}{\cctab_if_exist:N,\cctab_if_exist:c}
+%   Checks whether a \meta{cctab~var} is defined.
+%    \begin{macrocode}
+\prg_new_eq_conditional:NNn \cctab_if_exist:N \cs_if_exist:N
+  { TF , T , F , p }
+\prg_new_eq_conditional:NNn \cctab_if_exist:c \cs_if_exist:c
+  { TF , T , F , p }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[TF]{\@@_chk_if_valid:N}
+% \begin{macro}{\@@_chk_if_valid_aux:NTF}
+%   Checks whether the argument is defined and whether it is a valid
+%   \meta{cctab~var}. In \LuaTeX{} the validity of the \meta{cctab~var}
+%   is checked by the engine, which complains if the argument is not a
+%   \cs{chardef}'ed constant. In other engines, check if the given
+%   command is an intarray variable (the underlying definition is a copy
+%   of the \texttt{cmr10} font).
+%    \begin{macrocode}
+\prg_new_protected_conditional:Npnn \@@_chk_if_valid:N #1
+  { TF , T , F }
+  {
+    \cctab_if_exist:NTF #1
+      {
+        \@@_chk_if_valid_aux:NTF #1
+          { \prg_return_true: }
+          {
+            \__kernel_msg_error:nnx { kernel } { invalid-cctab }
+              { \token_to_str:N #1 }
+            \prg_return_false:
+          }
+      }
+      {
+        \__kernel_msg_error:nnx { kernel } { command-not-defined }
+          { \token_to_str:N #1 }
+        \prg_return_false:
+      }
+  }
+\sys_if_engine_luatex:TF
+  {
+    \cs_new_protected:Npn \@@_chk_if_valid_aux:NTF #1
+      {
+%<*initex>
+        \bool_lazy_and:nnTF
+          { \int_if_odd_p:n {#1} }
+          { \int_compare_p:nNn {#1-1} < { \g_@@_allocate_int } }
+%</initex>
+%<*package>
+        \int_compare:nNnTF {#1-1} < { \e at alloc@ccodetable at count }
+%</package>
+      }
+  }
+  {
+    \cs_new_protected:Npn \@@_chk_if_valid_aux:NTF #1
+      {
+        \exp_args:Nf \str_if_in:nnTF
+          { \cs_meaning:N #1 }
+          { select~font~cmr10~at~ }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Constant category code tables}
+%
+% \begin{macro}{\cctab_const:Nn,\cctab_const:cn}
+%  Creates a new \meta{cctab~var} then sets it with the current and
+%  user-supplied codes.
+%    \begin{macrocode}
+\cs_new_protected:Npn \cctab_const:Nn #1#2
+  {
+    \cctab_new:N #1
+    \cctab_gset:Nn #1 {#2}
+  }
+\cs_generate_variant:Nn \cctab_const:Nn { c }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}
+%   {
+%     \c_initex_cctab   ,
+%     \c_other_cctab    ,
+%     \c_str_cctab
+%   }
+%   Creating category code tables means thinking starting from \IniTeX{}.
+%   For all-other and the standard \enquote{string} tables that's easy.
+%    \begin{macrocode}
+\cctab_new:N \c_initex_cctab
+\cctab_const:Nn \c_other_cctab
+  {
+    \cctab_select:N \c_initex_cctab
+    \int_set:Nn \tex_endlinechar:D     { -1 }
+    \int_step_inline:nnn { 0 } { 127 }
+      { \char_set_catcode_other:n {#1} }
+  }
+\cctab_const:Nn \c_str_cctab
+  {
+    \cctab_select:N \c_other_cctab
+    \char_set_catcode_space:n { 32 }
+  }
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\c_document_cctab, \c_other_cctab}
+%  To pick up document-level category codes, we need to delay set up to the
+%  end of the format, where that's possible. Also, as there are a \emph{lot}
+%  of category codes to set, we avoid using the official interface and store the
+%  document codes using internal code. Depending on whether we are in the hook
+%  or not, the catcodes may be code or document, so we explicitly set up both
+%  correctly.
+%    \begin{macrocode}
+\cs_if_exist:NTF \@expl at finalise@setup@@@@
+  { \tl_gput_right:Nn \@expl at finalise@setup@@@@ }
+  { \use:n }
+  {
+    \@@_new:N \c_code_cctab
+    \group_begin:
+      \int_set:Nn \tex_endlinechar:D { 32 }
+      \char_set_catcode_invalid:n { 0 }
+      \bool_lazy_or:nnTF
+        { \sys_if_engine_xetex_p: } { \sys_if_engine_luatex_p: }
+        { \int_step_function:nN { 31 } \char_set_catcode_invalid:n }
+        { \int_step_function:nN { 31 } \char_set_catcode_active:n }
+      \int_step_function:nnN { 33 } { 64 } \char_set_catcode_other:n
+      \int_step_function:nnN { 65 } { 90 } \char_set_catcode_letter:n
+      \int_step_function:nnN { 91 } { 96 } \char_set_catcode_other:n
+      \int_step_function:nnN { 97 } { 122 } \char_set_catcode_letter:n
+      \char_set_catcode_ignore:n           { 9 }   % tab
+      \char_set_catcode_other:n            { 10 }  % lf
+      \char_set_catcode_active:n           { 12 }  % ff
+      \char_set_catcode_end_line:n         { 13 }  % cr
+      \char_set_catcode_ignore:n           { 32 }  % space
+      \char_set_catcode_parameter:n        { 35 }  % hash
+      \char_set_catcode_math_toggle:n      { 36 }  % dollar
+      \char_set_catcode_comment:n          { 37 }  % percent
+      \char_set_catcode_alignment:n        { 38 }  % ampersand
+      \char_set_catcode_letter:n           { 58 }  % colon
+      \char_set_catcode_escape:n           { 92 }  % backslash
+      \char_set_catcode_math_superscript:n { 94 }  % circumflex
+      \char_set_catcode_letter:n           { 95 }  % underscore
+      \char_set_catcode_group_begin:n      { 123 } % left brace
+      \char_set_catcode_other:n            { 124 } % pipe
+      \char_set_catcode_group_end:n        { 125 } % right brace
+      \char_set_catcode_space:n            { 126 } % tilde
+      \char_set_catcode_invalid:n          { 127 } % ^^?
+      \@@_gset:n { \c_code_cctab }
+    \group_end:
+    \cctab_const:Nn \c_document_cctab
+      {
+        \cctab_select:N \c_code_cctab
+        \int_set:Nn \tex_endlinechar:D { 13 }
+        \char_set_catcode_space:n          { 9 }
+        \char_set_catcode_space:n          { 32 }
+        \char_set_catcode_other:n          { 58 }
+        \char_set_catcode_math_subscript:n { 95 }
+        \char_set_catcode_active:n         { 126 }
+      }
+  }
+%    \end{macrocode}
+% \end{variable}
+%
+% \subsection{Messages}
+%
+%    \begin{macrocode}
+\__kernel_msg_new:nnnn { kernel } { cctab-stack-full }
+  { The~category~code~table~stack~is~exhausted. }
+  {
+    LaTeX~has~been~asked~to~switch~to~a~new~category~code~table,~
+    but~there~is~no~more~space~to~do~this!
+  }
+\__kernel_msg_new:nnnn { kernel } { cctab-extra-end }
+  { Extra~\iow_char:N\\cctab_end:~ignored~\msg_line_context:. }
+  {
+    LaTeX~came~across~a~\iow_char:N\\cctab_end:~without~a~matching~
+    \iow_char:N\\cctab_begin:N.~This~command~will~be~ignored.
+  }
+\__kernel_msg_new:nnnn { kernel } { cctab-missing-end }
+  { Missing~\iow_char:N\\cctab_end:~before~end~of~TeX~run. }
+  {
+    LaTeX~came~across~more~\iow_char:N\\cctab_begin:N~than~
+    \iow_char:N\\cctab_end:.
+  }
+\__kernel_msg_new:nnnn { kernel } { invalid-cctab }
+  { Invalid~\iow_char:N\\catcode~table. }
+  {
+    You~can~only~switch~to~a~\iow_char:N\\catcode~table~that~is~
+    initialized~using~\iow_char:N\\cctab_new:N~or~
+    \iow_char:N\\cctab_const:Nn.
+  }
+\__kernel_msg_new:nnnn { kernel } { cctab-group-mismatch }
+  {
+    \iow_char:N\\cctab_end:~occurred~in~a~
+    \int_case:nn {#1}
+      {
+        { 0 } { different~group }
+        { 1 } { higher~group~level }
+        { -1 } { lower~group~level }
+      } ~than~
+    the~matching~\iow_char:N\\cctab_begin:N.
+  }
+  {
+    Catcode~tables~and~groups~must~be~properly~nested,~but~
+    you~tried~to~interleave~them.~LaTeX~will~try~to~proceed,~
+    but~results~may~be~unexpected.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%</initex|package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+%\PrintIndex


Property changes on: trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -2233,9 +2233,6 @@
 %   flexible.
 %    \begin{macrocode}
 \tl_new:N  \l_@@_display_font_tl
-%<*initex>
-\tl_set:Nn \l_@@_display_font_tl { } % TODO
-%</initex>
 %<*package>
 \tl_set:Nn \l_@@_display_font_tl { \sffamily \tiny }
 %</package>
@@ -2263,7 +2260,7 @@
     \hcoffin_set:Nn \l_@@_display_pole_coffin
       {
 %<*initex>
-        \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: } % TODO
+        \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: }
 %</initex>
 %<*package>
         \@@_color:n {#4}
@@ -2274,9 +2271,6 @@
       \l_@@_display_pole_coffin { hc } { vc } { 0pt } { 0pt }
     \hcoffin_set:Nn \l_@@_display_coord_coffin
       {
-%<*initex>
-        % TODO
-%</initex>
 %<*package>
         \@@_color:n {#4}
 %</package>
@@ -2332,7 +2326,7 @@
     \hcoffin_set:Nn \l_@@_display_pole_coffin
       {
 %<*initex>
-        \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: } % TODO
+        \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: }
 %</initex>
 %<*package>
         \@@_color:n {#2}
@@ -2377,9 +2371,6 @@
               { 0pt } { 0pt }
             \hcoffin_set:Nn \l_@@_display_coord_coffin
               {
-%<*initex>
-                % TODO
-%</initex>
 %<*package>
                 \@@_color:n {#6}
 %</package>

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -865,6 +865,7 @@
       \box_gset_eq:NN
       \box_gset_eq_drop:NN
       \box_gset_to_last:N
+      \cctab_gset:Nn
       \clist_gset_eq:NN
       \dim_gset_eq:NN
       \dim_gzero:N
@@ -926,6 +927,7 @@
     { }
     {
       \bool_const:Nn
+      \cctab_const:Nn
       \dim_const:Nn
       \int_const:Nn
       \intarray_const_from_clist:Nn
@@ -961,6 +963,10 @@
   \__kernel_patch:nnn
     { \__kernel_chk_var_scope:NN g #1 }
     { }
+    { \cctab_new:N }
+  \__kernel_patch:nnn
+    { \__kernel_chk_var_scope:NN g #1 }
+    { }
     { \intarray_new:Nn }
   \__kernel_patch:nnn
     { \__kernel_chk_var_scope:NN q #1 }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -402,6 +402,52 @@
   { \c_sys_jobname_str } { 2017-01-01 }
 \@@_old:Nnn \c_minus_one
   { -1 } { 2019-01-01 }
+\@@_old:Nnn \c_zero
+  { 0 } { 2020-01-01 }
+\@@_old:Nnn \c_one
+  { 1 } { 2020-01-01 }
+\@@_old:Nnn \c_two
+  { 2 } { 2020-01-01 }
+\@@_old:Nnn \c_three
+  { 3 } { 2020-01-01 }
+\@@_old:Nnn \c_four
+  { 4 } { 2020-01-01 }
+\@@_old:Nnn \c_five
+  { 5 } { 2020-01-01 }
+\@@_old:Nnn \c_six
+  { 6 } { 2020-01-01 }
+\@@_old:Nnn \c_seven
+  { 7 } { 2020-01-01 }
+\@@_old:Nnn \c_eight
+  { 8 } { 2020-01-01 }
+\@@_old:Nnn \c_nine
+  { 9 } { 2020-01-01 }
+\@@_old:Nnn \c_ten
+  { 10 } { 2020-01-01 }
+\@@_old:Nnn \c_eleven
+  { 11 } { 2020-01-01 }
+\@@_old:Nnn \c_twelve
+  { 12 } { 2020-01-01 }
+\@@_old:Nnn \c_thirteen
+  { 13 } { 2020-01-01 }
+\@@_old:Nnn \c_fourteen
+  { 14 } { 2020-01-01 }
+\@@_old:Nnn \c_fifteen
+  { 15 } { 2020-01-01 }
+\@@_old:Nnn \c_sixteen
+  { 16 } { 2020-01-01 }
+\@@_old:Nnn \c_thirty_two
+  { 32 } { 2020-01-01 }
+\@@_old:Nnn \c_one_hundred
+  { 100 } { 2020-01-01 }
+\@@_old:Nnn \c_two_hundred_fifty_five
+  { 255 } { 2020-01-01 }
+\@@_old:Nnn \c_two_hundred_fifty_six
+  { 256 } { 2020-01-01 }
+\@@_old:Nnn \c_one_thousand
+  { 1000 } { 2020-01-01 }
+\@@_old:Nnn \c_ten_thousand
+  { 10000 } { 2020-01-01 }
 \@@_old:Nnn \dim_case:nnn
   { \dim_case:nnF } { 2015-07-14 }
 \@@_old:Nnn \file_add_path:nN
@@ -442,6 +488,12 @@
   { \iow_show_list: } { 2019-01-01 }
 \@@_old:Nnn \iow_log_streams:
   { \iow_log_list: } { 2019-01-01 }
+\@@_old:Nnn \lua_escape_x:n
+  { \lua_escape:e } { 2020-01-01 }
+\@@_old:Nnn \lua_now_x:n
+  { \lua_now:e } { 2020-01-01 }
+\@@_old_protected:Nnn \lua_shipout_x:n
+  { \lua_shipout_e:n } { 2020-01-01 }
 \@@_old:Nnn \luatex_if_engine_p:
   { \sys_if_engine_luatex_p: } { 2017-01-01 }
 \@@_old:Nnn \luatex_if_engine:F
@@ -450,6 +502,12 @@
   { \sys_if_engine_luatex:T } { 2017-01-01 }
 \@@_old:Nnn \luatex_if_engine:TF
   { \sys_if_engine_luatex:TF } { 2017-01-01 }
+\@@_old_protected:Nnn \msg_interrupt:nnn
+  { [Defined~error~message] } { 2020-01-01 }
+\@@_old_protected:Nnn \msg_log:n
+  { \iow_log:n } { 2020-01-01 }
+\@@_old_protected:Nnn \msg_term:n
+  { \iow_term:n } { 2020-01-01 }
 \@@_old:Nnn \pdftex_if_engine_p:
   { \sys_if_engine_pdftex_p: } { 2017-01-01 }
 \@@_old:Nnn \pdftex_if_engine:F
@@ -476,8 +534,28 @@
   { \str_case:nnF } { 2015-07-14 }
 \@@_old:Nnn \str_case:onn
   { \str_case:onF } { 2015-07-14 }
+\@@_old:Nnn \str_case_x:nn
+  { \str_case_e:nn } { 2020-01-01 }
 \@@_old:Nnn \str_case_x:nnn
   { \str_case_e:nnF } { 2015-07-14 }
+\@@_old:Nnn \str_case_x:nnT
+  { \str_case_e:nnT } { 2020-01-01 }
+\@@_old:Nnn \str_case_x:nnTF
+  { \str_case_e:nnTF } { 2020-01-01 }
+\@@_old:Nnn \str_case_x:nnF
+  { \str_case_e:nnF } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x_p:nn
+  { \str_if_eq_p:ee } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x:nnT
+  { \str_if_eq:eeT } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x:nnF
+  { \str_if_eq:eeF } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x:nnTF
+  { \str_if_eq:eeTF } { 2020-01-01 }
+\@@_old_protected:Nnn \tl_show_analysis:N
+  { \tl_analysis_show:N } { 2020-01-01 }
+\@@_old_protected:Nnn \tl_show_analysis:n
+  { \tl_analysis_show:n } { 2020-01-01 }
 \@@_old:Nnn \tl_case:cnn
   { \tl_case:cnF } { 2015-07-14 }
 \@@_old:Nnn \tl_case:Nnn
@@ -499,70 +577,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Deprecated primitives}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\etex_beginL:D}
-% \begin{macro}{\@@_primitive:NN, \@@_primitive:w}
-%   We renamed all primitives to \cs[no-index]{tex_\ldots{}:D} so all
-%   others are deprecated.  In \pkg{l3names}, \cs{__kernel_primitives:}
-%   is defined to contain \cs{__kernel_primitive:NN} \cs{beginL}
-%   \cs{etex_beginL:D} and so on, one for each deprecated primitive.  We
-%   apply \cs{exp_not:N} to the second argument of
-%   \cs{__kernel_primitive:NN} because it may be outer (both when doing
-%   and undoing deprecation actually), then \cs{@@_primitive:NN} uses
-%   \cs{tex_let:D} to change the meaning of this potentially outer
-%   token.  Then, either turn it into an error or make it equal to the
-%   primitive~|#1|.  To be more precise, |#1| may not be defined, so try
-%   a \cs[no-index]{tex_\ldots{}:D} command as well.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_primitive:NN #1#2 { }
-\exp_last_unbraced:NNNNo
-  \cs_new:Npn \@@_primitive:w #1 { \token_to_str:N _ } { }
-\__kernel_deprecation_code:nn
-  {
-    \cs_set_protected:Npn \__kernel_primitive:NN #1
-      {
-        \exp_after:wN \@@_primitive:NN
-        \exp_after:wN #1
-        \exp_not:N
-      }
-    \cs_set_protected:Npn \@@_primitive:NN #1#2
-      {
-        \tex_let:D #2 \scan_stop:
-        \exp_args:NNx \__kernel_deprecation_error:Nnn #2
-          {
-            \iow_char:N \\
-            \cs_if_exist:NTF #1
-              { \cs_to_str:N #1 }
-              {
-                tex_
-                \exp_last_unbraced:Nf
-                \@@_primitive:w { \cs_to_str:N #2 }
-              }
-          }
-          { 2020-01-01 }
-      }
-    \__kernel_primitives:
-  }
-  {
-    \cs_set_protected:Npn \__kernel_primitive:NN #1
-      {
-        \exp_after:wN \@@_primitive:NN
-        \exp_after:wN #1
-        \exp_not:N
-      }
-    \cs_set_protected:Npn \@@_primitive:NN #1#2
-      {
-        \tex_let:D #2 #1
-        \cs_if_exist:cT { tex_ \cs_to_str:N #1 :D }
-          { \cs_set_eq:Nc #2 { tex_ \cs_to_str:N #1 :D } }
-      }
-    \__kernel_primitives:
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
 % \subsection{Loading the patches}
 %
 % When loaded first, the patches are simply read here.
@@ -646,243 +660,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Deprecated \pkg{l3int} functions}
-%
-%    \begin{macrocode}
-%<@@=int>
-%    \end{macrocode}
-%
-% \begin{variable}[deprecated = 2020-07-01]
-%   {
-%     \c_zero, \c_one, \c_two, \c_three, \c_four, \c_five, \c_six,
-%     \c_seven, \c_eight, \c_nine, \c_ten, \c_eleven, \c_twelve,
-%     \c_thirteen, \c_fourteen, \c_fifteen, \c_sixteen, \c_thirty_two,
-%     \c_one_hundred, \c_two_hundred_fifty_five,
-%     \c_two_hundred_fifty_six, \c_one_thousand, \c_ten_thousand,
-%   }
-% \begin{macro}{\@@_deprecated_constants:nn}
-%   Constants that are now deprecated.  By default define them with
-%   \cs{int_const:Nn}.  To deprecate them call for instance
-%   \cs{__kernel_deprecation_error:Nnn} \cs{c_zero} |{0}|
-%   |{2020-01-01}|.  To redefine them (locally), use
-%   \cs{@@_constdef:Nw}, with an \cs{exp_not:N} construction because the
-%   constants themselves are outer at that point.
-%    \begin{macrocode}
-\cs_gset_protected:Npn \@@_deprecated_constants:nn #1#2
-  {
-    #1 \c_zero                   {   0 } #2
-    #1 \c_one                    {   1 } #2
-    #1 \c_two                    {   2 } #2
-    #1 \c_three                  {   3 } #2
-    #1 \c_four                   {   4 } #2
-    #1 \c_five                   {   5 } #2
-    #1 \c_six                    {   6 } #2
-    #1 \c_seven                  {   7 } #2
-    #1 \c_eight                  {   8 } #2
-    #1 \c_nine                   {   9 } #2
-    #1 \c_ten                    {  10 } #2
-    #1 \c_eleven                 {  11 } #2
-    #1 \c_twelve                 {  12 } #2
-    #1 \c_thirteen               {  13 } #2
-    #1 \c_fourteen               {  14 } #2
-    #1 \c_fifteen                {  15 } #2
-    #1 \c_sixteen                {  16 } #2
-    #1 \c_thirty_two             {  32 } #2
-    #1 \c_one_hundred            { 100 } #2
-    #1 \c_two_hundred_fifty_five { 255 } #2
-    #1 \c_two_hundred_fifty_six  { 256 } #2
-    #1 \c_one_thousand         {  1000 } #2
-    #1 \c_ten_thousand         { 10000 } #2
-  }
-\cs_set_protected:Npn \@@_deprecated_constants:Nn #1#2
-  {
-    \cs_if_free:NT #1
-      { \int_const:Nn #1 {#2} }
-  }
-\@@_deprecated_constants:nn { \@@_deprecated_constants:Nn } { }
-\__kernel_deprecation_code:nn
-  {
-    \@@_deprecated_constants:nn
-      { \exp_after:wN \__kernel_deprecation_error:Nnn \exp_not:N }
-      { { 2020-01-01 } }
-  }
-  {
-    \@@_deprecated_constants:nn
-      {
-        \exp_after:wN \use:nnn
-        \exp_after:wN \@@_constdef:Nw \exp_not:N
-      }
-      { \exp_stop_f: }
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{variable}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\@@_value:w}
-%   Made public.
-%    \begin{macrocode}
-\cs_gset_eq:NN \@@_value:w \int_value:w
-%    \end{macrocode}
-% \end{macro}
-%
-% \subsection{Deprecated \pkg{l3luatex} functions}
-%
-%    \begin{macrocode}
-%<@@=lua>
-%    \end{macrocode}
-%
-% \begin{macro}[EXP, deprecated = 2020-07-01]{\lua_now_x:n, \lua_escape_x:n}
-% \begin{macro}[deprecated = 2020-07-01]{\lua_shipout_x:n}
-%    \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_now:e }
-\cs_gset:Npn \lua_now_x:n #1 { \@@_now:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_escape:e }
-\cs_gset:Npn \lua_escape_x:n #1 { \@@_escape:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_shipout_e:n }
-\cs_gset_protected:Npn \lua_shipout_x:n #1 { \@@_shipout:n {#1} }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Deprecated \pkg{l3msg} functions}
-%
-%    \begin{macrocode}
-%<@@=msg>
-%    \end{macrocode}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\msg_log:n, \msg_term:n}
-%    \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \iow_log:n }
-\cs_gset_protected:Npn \msg_log:n #1
-  {
-    \iow_log:n { ................................................. }
-    \iow_wrap:nnnN { . ~ #1} { . ~ } { } \iow_log:n
-    \iow_log:n { ................................................. }
-  }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \iow_term:n }
-\cs_gset_protected:Npn \msg_term:n #1
-  {
-    \iow_term:n { ************************************************* }
-    \iow_wrap:nnnN { * ~ #1} { * ~ } { } \iow_term:n
-    \iow_term:n { ************************************************* }
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\msg_interrupt:nnn}
-%    \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { [Defined~error~message] }
-\cs_gset_protected:Npn \msg_interrupt:nnn #1#2#3
-  {
-    \tl_if_empty:nTF {#3}
-      {
-        \@@_old_interrupt_wrap:nn { \\ \c_@@_no_info_text_tl }
-          {#1 \\\\ #2 \\\\ \c_@@_continue_text_tl }
-      }
-      {
-        \@@_old_interrupt_wrap:nn { \\ #3 }
-          {#1 \\\\ #2 \\\\ \c_@@_help_text_tl }
-      }
-  }
-\cs_gset_protected:Npn \@@_old_interrupt_wrap:nn #1#2
-  {
-    \iow_wrap:nnnN {#1} { | ~ } { } \@@_old_interrupt_more_text:n
-    \iow_wrap:nnnN {#2} { ! ~ } { } \@@_old_interrupt_text:n
-  }
-\cs_gset_protected:Npn \@@_old_interrupt_more_text:n #1
-  {
-    \exp_args:Nx \tex_errhelp:D
-      {
-        |'''''''''''''''''''''''''''''''''''''''''''''''
-        #1 \iow_newline:
-        |...............................................
-      }
-  }
-\group_begin:
-  \char_set_lccode:nn {`\{} {`\ }
-  \char_set_lccode:nn {`\}} {`\ }
-  \char_set_lccode:nn {`\&} {`\!}
-  \char_set_catcode_active:N \&
-\tex_lowercase:D
-  {
-    \group_end:
-    \cs_gset_protected:Npn \@@_old_interrupt_text:n #1
-      {
-        \iow_term:x
-          {
-            \iow_newline:
-            !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-            \iow_newline:
-            !
-          }
-        \__kernel_iow_with:Nnn \tex_newlinechar:D { `\^^J }
-          {
-            \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
-              {
-                \group_begin:
-                  \cs_set_protected:Npn &
-                    {
-                      \tex_errmessage:D
-                        {
-                          #1
-                          \use_none:n
-                            { ............................................ }
-                        }
-                    }
-                  \exp_after:wN
-                \group_end:
-                &
-              }
-          }
-      }
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-% \subsection{Deprecated \pkg{l3prg} functions}
-%
-%    \begin{macrocode}
-%<@@=prg>
-%    \end{macrocode}
-%
-% \begin{macro}[deprecated = 2020-07-01]
-%   {
-%     \@@_break_point:Nn,
-%     \@@_break_point:,
-%     \@@_map_break:Nn,
-%     \@@_break:,
-%     \@@_break:n
-%   }
-%   Made public, but used by a few third-parties.  It's not possible to
-%   perfectly support a mixture of \cs{@@_map_break:Nn} and
-%   \cs{prg_map_break:Nn} because they use different delimiters.  The
-%   following code only breaks if someone tries to break from two
-%   \enquote{old-style} \cs{@@_map_break:Nn} \ldots{}
-%   \cs{@@_break_point:Nn} mappings in one go.  Basically, the
-%   \cs{@@_map_break:Nn} converts a single \cs{@@_break_point:Nn} to
-%   \cs{prg_break_point:Nn}, and that delimiter had better be the right
-%   one.  Then we call \cs{prg_map_break:Nn} which may end up breaking
-%   intermediate looks in the (unbraced) argument |#1|.  It is essential
-%   to define the |break_point| functions before the corresponding
-%   |break| functions: otherwise \cs{debug_on:n} |{deprecation}|
-%   \cs{debug_off:n} |{deprecation}| would break when trying to restore
-%   the definitions because they would involve deprecated commands whose
-%   definition has not yet been restored.
-%    \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break_point:Nn }
-\cs_gset:Npn \@@_break_point:Nn { \prg_break_point:Nn }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break_point: }
-\cs_gset:Npn \@@_break_point: { \prg_break_point: }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_map_break:Nn }
-\cs_gset:Npn \@@_map_break:Nn #1 \@@_break_point:Nn
-  { \prg_map_break:Nn #1 \prg_break_point:Nn }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break: }
-\cs_gset:Npn \@@_break: #1 \@@_break_point: { }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break:n }
-\cs_gset:Npn \@@_break:n #1#2 \@@_break_point: {#1}
-%    \end{macrocode}
-% \end{macro}
-%
 % \subsection{Deprecated \pkg{l3str} functions}
 %
 % \begin{macro}[EXP, deprecated = 2022-07-01]
@@ -907,29 +684,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP, deprecated = 2020-07-01, noTF]{\str_case_x:nn}
-% \begin{macro}[EXP, deprecated = 2020-07-01, pTF]{\str_if_eq_x:nn}
-%    \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nn }
-\cs_gset:Npn \str_case_x:nn { \str_case_e:nn }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnT }
-\cs_gset:Npn \str_case_x:nnT { \str_case_e:nnT }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnF }
-\cs_gset:Npn \str_case_x:nnF { \str_case_e:nnF }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnTF }
-\cs_gset:Npn \str_case_x:nnTF { \str_case_e:nnTF }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq_p:ee }
-\cs_gset:Npn \str_if_eq_x_p:nn { \str_if_eq_p:ee }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeT }
-\cs_gset:Npn \str_if_eq_x:nnT { \str_if_eq:eeT }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeF }
-\cs_gset:Npn \str_if_eq_x:nnF { \str_if_eq:eeF }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeTF }
-\cs_gset:Npn \str_if_eq_x:nnTF { \str_if_eq:eeTF }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
 % \subsection{Deprecated \pkg{l3seq} functions}
 %
 % \begin{macro}[EXP, deprecated = 2023-01-01]
@@ -1023,19 +777,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Deprecated \pkg{l3tl-analysis} functions}
-%
-% \begin{macro}[deprecated = 2020-07-01]
-%   {\tl_show_analysis:N, \tl_show_analysis:n}
-%   Simple renames.
-%    \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \tl_analysis_show:N }
-\cs_gset_protected:Npn \tl_show_analysis:N { \tl_analysis_show:N }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \tl_analysis_show:n }
-\cs_gset_protected:Npn \tl_show_analysis:n { \tl_analysis_show:n }
-%    \end{macrocode}
-% \end{macro}
-%
 % \subsection{Deprecated \pkg{l3token} functions}
 %
 % \begin{macro}[EXP, deprecated = 2021-07-01]

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -79,7 +79,7 @@
 %
 % \title{The \cls{l3doc} class}
 % \author{\Team}
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 % \maketitle
 % \tableofcontents
 %
@@ -3368,7 +3368,7 @@
   {
     \seq_set_map:NNn \l_@@_tmpa_seq
       \g_@@_nested_names_seq
-      { \exp_not:n { \@@_macro_end_wrap_item:n {##1} } }
+      { \@@_macro_end_wrap_item:n {##1} }
     End~ definition~ for~
     \int_compare:nTF { \seq_count:N \l_@@_tmpa_seq <= 3 }
       {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -677,7 +677,7 @@
 %   If the file is not found on the path, the expansion is empty.
 % \end{function}
 %
-% \begin{function}[added = 2017-06-23, updated = 2017-06-26]
+% \begin{function}[added = 2017-06-23, updated = 2020-06-24]
 %   {\file_parse_full_name:nNNN, \file_parse_full_name:VNNN}
 %   \begin{syntax}
 %     \cs{file_parse_full_name:nNNN} \Arg{full name} \meta{dir} \meta{name} \meta{ext}
@@ -697,11 +697,30 @@
 %     \item The \meta{ext}: everything after the last |.| (including the dot).
 %       The \meta{ext} is empty if there is no |.| after the last |/|.
 %   \end{itemize}
-%   This function does not expand the \meta{full name} before turning it
-%   to a string.  It assume that the \meta{full name} either contains no
-%   quote (|"|) characters or is surrounded by a pair of quotes.
+%
+%   Before parsing, the \meta{full name} is expanded until only non-expandable
+%   tokens remain, except that active characters are also not expanded.
+%   Quotes (|"|) are invalid in file names and are discarded from the input.
 % \end{function}
 %
+% \begin{function}[EXP, added = 2020-06-24]{\file_parse_full_name:n}
+%   \begin{syntax}
+%     \cs{file_parse_full_name:n} \Arg{full name}
+%   \end{syntax}
+%   Parses the \meta{full name} as described for \cs{file_parse_full_name:nNNN},
+%   and leaves \meta{dir}, \meta{name}, and \meta{ext} in the input stream,
+%   each inside a pair of braces.
+% \end{function}
+%
+% \begin{function}[EXP, added = 2020-06-24]{\file_parse_full_name_apply:nN}
+%   \begin{syntax}
+%     \cs{file_parse_full_name_apply:nN} \Arg{full name} \meta{function}
+%   \end{syntax}
+%   Parses the \meta{full name} as described for \cs{file_parse_full_name:nNNN},
+%   and passes \meta{dir}, \meta{name}, and \meta{ext} as arguments to \meta{function},
+%   as an \texttt{n}-type argument each, in this order.
+% \end{function}
+%
 % \begin{function}[rEXP, added = 2019-11-19]
 %   {\file_hex_dump:n, \file_hex_dump:nnn}
 %   \begin{syntax}
@@ -2682,8 +2701,8 @@
 % \end{macro}
 %
 % \begin{macro}[EXP]{\file_full_name:n, \@@_full_name:n}
-% \begin{macro}[EXP]{\@@_full_name_aux:nn}
-% \begin{macro}[EXP]{\@@_full_name_aux:n}
+% \begin{macro}[EXP]{\@@_full_name_aux:Nnn}
+% \begin{macro}[EXP]{\@@_full_name_aux:nN}
 % \begin{macro}[EXP]{\@@_name_cleanup:w}
 % \begin{macro}[EXP]{\@@_name_end:}
 % \begin{macro}[EXP]{\@@_name_ext_check:n}
@@ -2714,12 +2733,12 @@
         \tl_if_blank:eTF { \@@_size:n {#1} }
           {
             \seq_map_tokens:Nn \l_file_search_path_seq
-              { \@@_full_name_aux:nn {#1} }
+              { \@@_full_name_aux:Nnn \seq_map_break:n {#1} }
 %<*package>
             \cs_if_exist:NT \input at path
               {
                 \tl_map_tokens:Nn \input at path
-                  { \@@_full_name_aux:nn {#1} }
+                  { \@@_full_name_aux:Nnn \tl_map_break:n {#1} }
               }
 %</package>
             \@@_name_end:
@@ -2731,13 +2750,13 @@
 %   Two pars to the auxiliary here so we can avoid doing quoting
 %   twice in the event we find the right file.
 %    \begin{macrocode}
-\cs_new:Npn \@@_full_name_aux:nn #1#2
-  { \exp_args:Ne \@@_full_name_aux:n { \tl_to_str:n {#2} / #1 } }
-\cs_new:Npn \@@_full_name_aux:n #1
+\cs_new:Npn \@@_full_name_aux:Nnn #1#2#3
+  { \exp_args:Ne \@@_full_name_aux:nN { \tl_to_str:n {#3} / #2 } #1 }
+\cs_new:Npn \@@_full_name_aux:nN #1 #2
   {
     \tl_if_blank:eF { \@@_size:n {#1} }
       {
-        \seq_map_break:n
+        #2
           {
             \@@_ext_check:n {#1}
             \@@_name_cleanup:w
@@ -3358,64 +3377,114 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\file_parse_full_name:nNNN, \file_parse_full_name:VNNN}
-% \begin{macro}
-%   {\@@_parse_full_name_auxi:w, \@@_parse_full_name_split:nNNNTF}
-%   Parsing starts by stripping off any surrounding quotes.  Then find
-%   the directory |#4| by splitting at the last~|/|.  (The auxiliary
-%   returns \texttt{true}/\texttt{false} depending on whether it found
-%   the delimiter.)  We correct for the case of a file in the root |/|,
-%   as in that case we wish to keep the trailing (and only) slash.  Then
-%   split the base name |#5| at the last dot.  If there was indeed a
-%   dot, |#5| contains the name and |#6| the extension without the dot,
-%   which we add back for convenience.  In the special case of no
-%   extension given, the auxiliary stored the name into |#6|, we just
-%   have to move it to |#5|.
+% \begin{macro}{\file_parse_full_name:n, \file_parse_full_name_apply:nN}
+%   The main parsing macro \cs{file_parse_full_name_apply:nN} passes the
+%   file name |#1| through \cs{__kernel_file_name_sanitize:n} so that we
+%   have a single normalised way to treat files internally.
+%   \cs{file_parse_full_name:n} uses the former, with
+%   \cs{prg_do_nothing:} to
+%   leave each part of the name within a pair of braces.
 %    \begin{macrocode}
-\cs_new_protected:Npn \file_parse_full_name:nNNN #1#2#3#4
+\cs_new:Npn \file_parse_full_name:n #1
   {
-    \exp_after:wN \@@_parse_full_name_auxi:w
-      \tl_to_str:n { #1 " #1 " } \s_@@_stop #2#3#4
+    \file_parse_full_name_apply:nN {#1}
+      \prg_do_nothing:
   }
-\cs_generate_variant:Nn \file_parse_full_name:nNNN { V }
-\cs_new_protected:Npn \@@_parse_full_name_auxi:w
-  #1 " #2 " #3 \s_@@_stop #4#5#6
+\cs_new:Npn \file_parse_full_name_apply:nN #1
   {
-    \@@_parse_full_name_split:nNNNTF {#2} / #4 #5
-      { \str_if_empty:NT #4 { \str_set:Nn #4 { / } } }
-      { }
-    \exp_args:No \@@_parse_full_name_split:nNNNTF {#5} . #5 #6
-      { \str_put_left:Nn #6 { . } }
-      {
-        \str_set_eq:NN #5 #6
-        \str_clear:N #6
-      }
+    \exp_args:Ne \@@_parse_full_name_auxi:nN
+      { \__kernel_file_name_sanitize:n {#1} }
   }
-\cs_new_protected:Npn \@@_parse_full_name_split:nNNNTF #1#2#3#4
+%    \end{macrocode}
+%
+% \begin{macro}{\@@_parse_full_name_auxi:nN}
+% \begin{macro}{\@@_parse_full_name_area:nw}
+%   \cs{@@_parse_full_name_area:nw} splits the file name into chunks
+%   separated by |/|, until the last one is reached.  The last chunk is
+%   the file name plus the extension, and everything before that is the
+%   path.  When \cs{@@_parse_full_name_area:nw} is done, it leaves
+%   the path within braces after the scan mark \cs{s_@@_stop} and
+%   proceeds parsing the actual file name.
+%    \begin{macrocode}
+\cs_new:Npn \@@_parse_full_name_auxi:nN #1
   {
-    \cs_set_protected:Npn \@@_tmp:w ##1 ##2 #2 ##3 \s_@@_stop
+    \@@_parse_full_name_area:nw { } #1
+      / \s_@@_stop
+  }
+\cs_new:Npn \@@_parse_full_name_area:nw #1 #2 / #3 \s_@@_stop
+  {
+    \tl_if_empty:nTF {#3}
+      { \@@_parse_full_name_base:nw { } #2 . \s_@@_stop {#1} }
+      { \@@_parse_full_name_area:nw { #1 / #2 } #3 \s_@@_stop }
+  }
+%    \end{macrocode}
+%
+% \begin{macro}{\@@_parse_full_name_base:nw}
+%   \cs{@@_parse_full_name_base:nw} does roughly the same as above, but
+%   it separates the chunks at each period.  However here there's some
+%   extra complications:  In case |#1| is empty, it is assumed that the
+%   extension is actually empty, and the file name is |#2|.  Besides, an
+%   extra |.| has to be added to |#2| because it is later removed in
+%   \cs{@@_parse_full_name_tidy:nnnN}.  In any case, if there's an
+%   extension, it is returned with a leading |.|.
+%    \begin{macrocode}
+\cs_new:Npn \@@_parse_full_name_base:nw #1 #2 . #3 \s_@@_stop
+  {
+    \tl_if_empty:nTF {#3}
       {
-        \tl_if_empty:nTF {##3}
+        \tl_if_empty:nTF {#1}
           {
-            \str_set:Nn #4 {##2}
-            \tl_if_empty:nTF {##1}
-              {
-                \str_clear:N #3
-                \use_ii:nn
-              }
-              {
-                \str_set:Nx #3 { \str_tail:n {##1} }
-                \use_i:nn
-              }
+            \tl_if_empty:nTF {#2}
+              { \@@_parse_full_name_tidy:nnnN { } { } }
+              { \@@_parse_full_name_tidy:nnnN { .#2 } { } }
           }
-          { \@@_tmp:w { ##1 #2 ##2 } ##3 \s_@@_stop }
+          { \@@_parse_full_name_tidy:nnnN {#1} { .#2 } }
       }
-    \@@_tmp:w { } #1 #2 \s_@@_stop
+      { \@@_parse_full_name_base:nw { #1 . #2 } #3 \s_@@_stop }
   }
 %    \end{macrocode}
+%
+% \begin{macro}{\@@_parse_full_name_tidy:nnnN}
+%   Now we just need to tidy some bits left loose before.  The loop
+%   used in the two macros above start with a leading |/| and |.| in the
+%   file path an name, so here we need to remove them, except in the
+%   path, if it is a single |/|, in which case it's left as is.  After
+%   all's done, pass to |#4|.
+%    \begin{macrocode}
+\cs_new:Npn \@@_parse_full_name_tidy:nnnN #1 #2 #3 #4
+  {
+    \exp_args:Nee #4
+      {
+        \str_if_eq:nnF {#3} { / } { \use_none:n }
+        #3 \prg_do_nothing:
+      }
+      { \use_none:n #1 \prg_do_nothing: }
+      {#2}
+  }
+%    \end{macrocode}
 % \end{macro}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
+% \begin{macro}{\file_parse_full_name:nNNN, \file_parse_full_name:VNNN}
+%    \begin{macrocode}
+\cs_new_protected:Npn \file_parse_full_name:nNNN #1 #2 #3 #4
+  {
+    \file_parse_full_name_apply:nN {#1}
+      \@@_full_name_assign:nnnNNN #2 #3 #4
+  }
+\cs_new_protected:Npn \@@_full_name_assign:nnnNNN #1 #2 #3 #4 #5 #6
+  {
+    \str_set:Nn #4 {#1}
+    \str_set:Nn #5 {#2}
+    \str_set:Nn #6 {#3}
+  }
+\cs_generate_variant:Nn \file_parse_full_name:nNNN { V }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\file_show_list:, \file_log_list:, \@@_list:N}
 % \begin{macro}[EXP]{\@@_list_aux:n}
 %   A function to list all files used to the log, without duplicates.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins	2020-07-17 21:45:53 UTC (rev 55860)
@@ -95,6 +95,7 @@
         \from{l3fp-convert.dtx} {initex}
         \from{l3fp-random.dtx}  {initex}
         \from{l3fparray.dtx}    {initex}
+        \from{l3cctab.dtx}      {initex}
         \from{l3sort.dtx}       {initex}
         \from{l3str-convert.dtx}{initex}
         \from{l3tl-analysis.dtx}{initex}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -1643,7 +1643,7 @@
 % \end{macro}
 %
 % \begin{macro}[rEXP]
-%   {\@@_parse_exponent:N, \@@_parse_exponent_aux:N}
+%   {\@@_parse_exponent:N, \@@_parse_exponent_aux:NN}
 %   This function should be called within an \cs{int_value:w}
 %   expansion (or within an integer expression).  It leaves digits of the
 %   exponent behind it in the input stream, and terminates the expansion
@@ -1657,7 +1657,8 @@
 \cs_new:Npn \@@_parse_exponent:N #1
   {
     \if:w e \if:w E \exp_not:N #1 e \else: \exp_not:N #1 \fi:
-      \exp_after:wN \@@_parse_exponent_aux:N
+      \exp_after:wN \@@_parse_exponent_aux:NN
+      \exp_after:wN #1
       \exp:w
     \else:
       0 \@@_parse_return_semicolon:w #1
@@ -1664,15 +1665,15 @@
     \fi:
     \@@_parse_expand:w
   }
-\cs_new:Npn \@@_parse_exponent_aux:N #1
+\cs_new:Npn \@@_parse_exponent_aux:NN #1#2
   {
-    \if_int_compare:w \if_catcode:w \scan_stop: \exp_not:N #1
-                0 \else: `#1 \fi: > `9 \exp_stop_f:
-      0 \exp_after:wN ; \exp_after:wN e
+    \if_int_compare:w \if_catcode:w \scan_stop: \exp_not:N #2
+                0 \else: `#2 \fi: > `9 \exp_stop_f:
+      0 \exp_after:wN ; \exp_after:wN #1
     \else:
       \exp_after:wN \@@_parse_exponent_sign:N
     \fi:
-    #1
+    #2
   }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -266,29 +266,28 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]{\@@_bounds:NNnTF, \@@_bounds_error:NNn}
+% \begin{macro}[EXP]{\@@_bounds:NNnTF, \@@_bounds_error:NNnw}
 %   The functions \cs{intarray_gset:Nnn} and \cs{intarray_item:Nn} share
 %   bounds checking.  The |T| branch is used if |#3| is within bounds of
 %   the array |#2|.
 %    \begin{macrocode}
-\cs_new:Npn \@@_bounds:NNnTF #1#2#3#4#5
+\cs_new:Npn \@@_bounds:NNnTF #1#2#3
   {
     \if_int_compare:w 1 > #3 \exp_stop_f:
-      \@@_bounds_error:NNn #1 #2 {#3}
-      #5
+      \@@_bounds_error:NNnw #1 #2 {#3}
     \else:
       \if_int_compare:w #3 > \intarray_count:N #2 \exp_stop_f:
-        \@@_bounds_error:NNn #1 #2 {#3}
-        #5
-      \else:
-        #4
+        \@@_bounds_error:NNnw #1 #2 {#3}
       \fi:
     \fi:
+    \use_i:nn
   }
-\cs_new:Npn \@@_bounds_error:NNn #1#2#3
+\cs_new:Npn \@@_bounds_error:NNnw #1#2#3#4 \use_i:nn #5#6
   {
+    #4
     #1 { kernel } { out-of-bounds }
       { \token_to_str:N #2 } {#3} { \intarray_count:N #2 }
+    #6
   }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -162,6 +162,33 @@
 %   than once.
 % \end{function}
 %
+% \begin{function}[added = 2018-03-31]{\__kernel_intarray_gset:Nnn}
+%   \begin{syntax}
+%     \cs{__kernel_intarray_gset:Nnn} \meta{intarray~var} \Arg{index} \Arg{value}
+%   \end{syntax}
+%   Faster version of \cs{intarray_gset:Nnn}.  Stores the \meta{value}
+%   into the \meta{integer array variable} at the \meta{position}.  The
+%   \meta{index} and \meta{value} must be suitable for a direct
+%   assignment to a \TeX{} count register, for instance expanding to an
+%   integer denotation or obtained through the primitive \tn{numexpr}
+%   (which may be un-terminated).  No bound checking is performed: the
+%   caller is responsible for ensuring that the \meta{position} is
+%   between $1$ and the \cs{intarray_count:N}, and the \meta{value}'s
+%   absolute value is at most $2^{30}-1$.  Assignments are always
+%   global.
+% \end{function}
+%
+% \begin{function}[EXP, added = 2018-03-31]{\__kernel_intarray_item:Nn}
+%   \begin{syntax}
+%     \cs{__kernel_intarray_item:Nn} \meta{intarray~var} \Arg{index}
+%   \end{syntax}
+%   Faster version of \cs{intarray_item:Nn}.  Expands to the integer
+%   entry stored at the \meta{index} in the \meta{integer array
+%   variable}.  The \meta{index} must be suitable for a direct
+%   assignment to a \TeX{} count register and must be between $1$ and
+%   the \cs{intarray_count:N}, lest a low-level \TeX{} error occur.
+% \end{function}
+%
 % \begin{function}{\__kernel_ior_open:Nn, \__kernel_ior_open:No}
 %   \begin{syntax}
 %     \cs{__kernel_ior_open:Nn} \meta{stream} \Arg{file name}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -404,6 +404,27 @@
 %   is briefer than \cs{msg_info:nnnnnn}.
 % \end{function}
 %
+% \begin{function}[added = 2020-07-16]
+%   {
+%     \msg_term:nnnnnn ,
+%     \msg_term:nnnnn  ,
+%     \msg_term:nnnn   ,
+%     \msg_term:nnn    ,
+%     \msg_term:nn     ,
+%     \msg_term:nnxxxx ,
+%     \msg_term:nnxxx  ,
+%     \msg_term:nnxx   ,
+%     \msg_term:nnx
+%   }
+%   \begin{syntax}
+%     \cs{msg_term:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+%   \end{syntax}
+%   Issues \meta{module} information \meta{message}, passing
+%   \meta{arg one} to \meta{arg four} to the text-creating functions.
+%   The information text is printed on the terminal (and added to the
+%   log file): the output is similar to that of \cs{msg_log:nnnnnn}.
+% \end{function}
+%
 % \begin{function}[updated = 2012-08-11]
 %   {
 %     \msg_none:nnnnnn ,
@@ -1214,6 +1235,31 @@
 %
 % \begin{macro}
 %   {
+%     \msg_term:nnnnnn ,
+%     \msg_term:nnnnn  ,
+%     \msg_term:nnnn   ,
+%     \msg_term:nnn    ,
+%     \msg_term:nn     ,
+%     \msg_term:nnxxxx ,
+%     \msg_term:nnxxx  ,
+%     \msg_term:nnxx   ,
+%     \msg_term:nnx
+%   }
+%   \enquote{Term} is used for communicating with the user through the
+%   terminal, like diagnostic messages, and debugging.  This is similar
+%   to \enquote{log} messages, but uses the terminal output.
+%    \begin{macrocode}
+  \@@_class_new:nn { term }
+    {
+      \iow_wrap:nnnN
+        { \use:c { \c_@@_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} }
+        { } { } \iow_term:n
+    }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+%   {
 %     \msg_none:nnnnnn ,
 %     \msg_none:nnnnn  ,
 %     \msg_none:nnnn   ,

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -600,9 +600,7 @@
   \@@_primitive:NN \pdfuniqueresname      \tex_pdfuniqueresname:D
   \@@_primitive:NN \pdfvorigin            \tex_pdfvorigin:D
   \@@_primitive:NN \pdfxform              \tex_pdfxform:D
-  \@@_primitive:NN \pdfxformattr          \tex_pdfxformattr:D
   \@@_primitive:NN \pdfxformname          \tex_pdfxformname:D
-  \@@_primitive:NN \pdfxformresources     \tex_pdfxformresources:D
   \@@_primitive:NN \pdfximage             \tex_pdfximage:D
   \@@_primitive:NN \pdfximagebbox         \tex_pdfximagebbox:D
 %    \end{macrocode}
@@ -924,7 +922,7 @@
   \@@_primitive:NN \normaldeviate         \tex_normaldeviate:D
   \@@_primitive:NN \outputmode            \tex_pdfoutput:D
   \@@_primitive:NN \pageheight            \tex_pageheight:D
-  \@@_primitive:NN \pagewidth             \tex_pagewith:D
+  \@@_primitive:NN \pagewidth             \tex_pagewidth:D
   \@@_primitive:NN \protrudechars         \tex_protrudechars:D
   \@@_primitive:NN \pxdimen               \tex_pxdimen:D
   \@@_primitive:NN \randomseed            \tex_randomseed:D
@@ -1209,15 +1207,26 @@
 %    \end{macrocode}
 %
 % \LaTeXe{} moves a few primitives, so these are sorted out.
-% A convenient test for \LaTeXe{} is the \cs{@@@@end} saved primitive.
+% In newer versions of \LaTeXe{}, \pkg{expl3} is loaded rather early, so
+% only some primitives are already renamed, so we need two tests here.
+% At the beginning of the \LaTeXe{} format, the primitives \tn{end} and
+% \tn{input} are renamed, and only later on the other ones.
 %    \begin{macrocode}
 %<*package>
 \tex_ifdefined:D \@@@@end
   \tex_let:D \tex_end:D                  \@@@@end
+  \tex_let:D \tex_input:D                \@@@@input
+\tex_fi:D
+%    \end{macrocode}
+%
+% If \tn{@@@@hyph} is defined, we are loading \pkg{expl3} in a
+% pre-2020/10/01 release of \LaTeXe{}, so a few other primitives have to
+% be tested as well.
+%    \begin{macrocode}
+\tex_ifdefined:D \@@@@hyph
   \tex_let:D \tex_everydisplay:D         \frozen at everydisplay
   \tex_let:D \tex_everymath:D            \frozen at everymath
   \tex_let:D \tex_hyphen:D               \@@@@hyph
-  \tex_let:D \tex_input:D                \@@@@input
   \tex_let:D \tex_italiccorrection:D     \@@@@italiccorr
   \tex_let:D \tex_underline:D            \@@@@underline
 %    \end{macrocode}
@@ -1438,653 +1447,7 @@
 %</package>
 %    \end{macrocode}
 %
-% \subsection{Deprecated functions}
-%
-% Older versions of \pkg{expl3} divided up primitives by \enquote{source}: that
-% becomes very tricky with multiple parallel engine developments, so has been
-% dropped. To cover the transition, we provide the older names here for a
-% limited period (until the end of 2019).
-%
-% To allow \cs{debug_on:n} \Arg{deprecation} to work we save the list of
-% primitives into \cs{@@_primitives:}
 %    \begin{macrocode}
-%<*package>
-\tex_begingroup:D
-  \tex_long:D \tex_def:D \use_ii:nn #1#2 {#2}
-  \tex_long:D \tex_def:D \use_none:n #1 { }
-  \tex_long:D \tex_def:D \@@_primitive:NN #1#2
-    {
-      \tex_ifdefined:D #1
-        \tex_expandafter:D \use_ii:nn
-      \tex_fi:D
-        \use_none:n { \tex_global:D \tex_let:D #2 #1 }
-    }
-  \tex_xdef:D \@@_primitives:
-    {
-      \tex_unexpanded:D
-        {
-  \@@_primitive:NN \beginL                \etex_beginL:D
-  \@@_primitive:NN \beginR                \etex_beginR:D
-  \@@_primitive:NN \botmarks              \etex_botmarks:D
-  \@@_primitive:NN \clubpenalties         \etex_clubpenalties:D
-  \@@_primitive:NN \currentgrouplevel     \etex_currentgrouplevel:D
-  \@@_primitive:NN \currentgrouptype      \etex_currentgrouptype:D
-  \@@_primitive:NN \currentifbranch       \etex_currentifbranch:D
-  \@@_primitive:NN \currentiflevel        \etex_currentiflevel:D
-  \@@_primitive:NN \currentiftype         \etex_currentiftype:D
-  \@@_primitive:NN \detokenize            \etex_detokenize:D
-  \@@_primitive:NN \dimexpr               \etex_dimexpr:D
-  \@@_primitive:NN \displaywidowpenalties
-    \etex_displaywidowpenalties:D
-  \@@_primitive:NN \endL                  \etex_endL:D
-  \@@_primitive:NN \endR                  \etex_endR:D
-  \@@_primitive:NN \eTeXrevision          \etex_eTeXrevision:D
-  \@@_primitive:NN \eTeXversion           \etex_eTeXversion:D
-  \@@_primitive:NN \everyeof              \etex_everyeof:D
-  \@@_primitive:NN \firstmarks            \etex_firstmarks:D
-  \@@_primitive:NN \fontchardp            \etex_fontchardp:D
-  \@@_primitive:NN \fontcharht            \etex_fontcharht:D
-  \@@_primitive:NN \fontcharic            \etex_fontcharic:D
-  \@@_primitive:NN \fontcharwd            \etex_fontcharwd:D
-  \@@_primitive:NN \glueexpr              \etex_glueexpr:D
-  \@@_primitive:NN \glueshrink            \etex_glueshrink:D
-  \@@_primitive:NN \glueshrinkorder       \etex_glueshrinkorder:D
-  \@@_primitive:NN \gluestretch           \etex_gluestretch:D
-  \@@_primitive:NN \gluestretchorder      \etex_gluestretchorder:D
-  \@@_primitive:NN \gluetomu              \etex_gluetomu:D
-  \@@_primitive:NN \ifcsname              \etex_ifcsname:D
-  \@@_primitive:NN \ifdefined             \etex_ifdefined:D
-  \@@_primitive:NN \iffontchar            \etex_iffontchar:D
-  \@@_primitive:NN \interactionmode       \etex_interactionmode:D
-  \@@_primitive:NN \interlinepenalties    \etex_interlinepenalties:D
-  \@@_primitive:NN \lastlinefit           \etex_lastlinefit:D
-  \@@_primitive:NN \lastnodetype          \etex_lastnodetype:D
-  \@@_primitive:NN \marks                 \etex_marks:D
-  \@@_primitive:NN \middle                \etex_middle:D
-  \@@_primitive:NN \muexpr                \etex_muexpr:D
-  \@@_primitive:NN \mutoglue              \etex_mutoglue:D
-  \@@_primitive:NN \numexpr               \etex_numexpr:D
-  \@@_primitive:NN \pagediscards          \etex_pagediscards:D
-  \@@_primitive:NN \parshapedimen         \etex_parshapedimen:D
-  \@@_primitive:NN \parshapeindent        \etex_parshapeindent:D
-  \@@_primitive:NN \parshapelength        \etex_parshapelength:D
-  \@@_primitive:NN \predisplaydirection   \etex_predisplaydirection:D
-  \@@_primitive:NN \protected             \etex_protected:D
-  \@@_primitive:NN \readline              \etex_readline:D
-  \@@_primitive:NN \savinghyphcodes       \etex_savinghyphcodes:D
-  \@@_primitive:NN \savingvdiscards       \etex_savingvdiscards:D
-  \@@_primitive:NN \scantokens            \etex_scantokens:D
-  \@@_primitive:NN \showgroups            \etex_showgroups:D
-  \@@_primitive:NN \showifs               \etex_showifs:D
-  \@@_primitive:NN \showtokens            \etex_showtokens:D
-  \@@_primitive:NN \splitbotmarks         \etex_splitbotmarks:D
-  \@@_primitive:NN \splitdiscards         \etex_splitdiscards:D
-  \@@_primitive:NN \splitfirstmarks       \etex_splitfirstmarks:D
-  \@@_primitive:NN \TeXXeTstate           \etex_TeXXeTstate:D
-  \@@_primitive:NN \topmarks              \etex_topmarks:D
-  \@@_primitive:NN \tracingassigns        \etex_tracingassigns:D
-  \@@_primitive:NN \tracinggroups         \etex_tracinggroups:D
-  \@@_primitive:NN \tracingifs            \etex_tracingifs:D
-  \@@_primitive:NN \tracingnesting        \etex_tracingnesting:D
-  \@@_primitive:NN \tracingscantokens     \etex_tracingscantokens:D
-  \@@_primitive:NN \unexpanded            \etex_unexpanded:D
-  \@@_primitive:NN \unless                \etex_unless:D
-  \@@_primitive:NN \widowpenalties        \etex_widowpenalties:D
-  \@@_primitive:NN \pdfannot              \pdftex_pdfannot:D
-  \@@_primitive:NN \pdfcatalog            \pdftex_pdfcatalog:D
-  \@@_primitive:NN \pdfcompresslevel      \pdftex_pdfcompresslevel:D
-  \@@_primitive:NN \pdfcolorstack         \pdftex_pdfcolorstack:D
-  \@@_primitive:NN \pdfcolorstackinit     \pdftex_pdfcolorstackinit:D
-  \@@_primitive:NN \pdfcreationdate       \pdftex_pdfcreationdate:D
-  \@@_primitive:NN \pdfdecimaldigits      \pdftex_pdfdecimaldigits:D
-  \@@_primitive:NN \pdfdest               \pdftex_pdfdest:D
-  \@@_primitive:NN \pdfdestmargin         \pdftex_pdfdestmargin:D
-  \@@_primitive:NN \pdfendlink            \pdftex_pdfendlink:D
-  \@@_primitive:NN \pdfendthread          \pdftex_pdfendthread:D
-  \@@_primitive:NN \pdffontattr           \pdftex_pdffontattr:D
-  \@@_primitive:NN \pdffontname           \pdftex_pdffontname:D
-  \@@_primitive:NN \pdffontobjnum         \pdftex_pdffontobjnum:D
-  \@@_primitive:NN \pdfgamma              \pdftex_pdfgamma:D
-  \@@_primitive:NN \pdfimageapplygamma    \pdftex_pdfimageapplygamma:D
-  \@@_primitive:NN \pdfimagegamma         \pdftex_pdfimagegamma:D
-  \@@_primitive:NN \pdfgentounicode       \pdftex_pdfgentounicode:D
-  \@@_primitive:NN \pdfglyphtounicode     \pdftex_pdfglyphtounicode:D
-  \@@_primitive:NN \pdfhorigin            \pdftex_pdfhorigin:D
-  \@@_primitive:NN \pdfimagehicolor       \pdftex_pdfimagehicolor:D
-  \@@_primitive:NN \pdfimageresolution    \pdftex_pdfimageresolution:D
-  \@@_primitive:NN \pdfincludechars       \pdftex_pdfincludechars:D
-  \@@_primitive:NN \pdfinclusioncopyfonts
-    \pdftex_pdfinclusioncopyfonts:D
-  \@@_primitive:NN \pdfinclusionerrorlevel
-    \pdftex_pdfinclusionerrorlevel:D
-  \@@_primitive:NN \pdfinfo               \pdftex_pdfinfo:D
-  \@@_primitive:NN \pdflastannot          \pdftex_pdflastannot:D
-  \@@_primitive:NN \pdflastlink           \pdftex_pdflastlink:D
-  \@@_primitive:NN \pdflastobj            \pdftex_pdflastobj:D
-  \@@_primitive:NN \pdflastxform          \pdftex_pdflastxform:D
-  \@@_primitive:NN \pdflastximage         \pdftex_pdflastximage:D
-  \@@_primitive:NN \pdflastximagecolordepth
-    \pdftex_pdflastximagecolordepth:D
-  \@@_primitive:NN \pdflastximagepages    \pdftex_pdflastximagepages:D
-  \@@_primitive:NN \pdflinkmargin         \pdftex_pdflinkmargin:D
-  \@@_primitive:NN \pdfliteral            \pdftex_pdfliteral:D
-  \@@_primitive:NN \pdfminorversion       \pdftex_pdfminorversion:D
-  \@@_primitive:NN \pdfnames              \pdftex_pdfnames:D
-  \@@_primitive:NN \pdfobj                \pdftex_pdfobj:D
-  \@@_primitive:NN \pdfobjcompresslevel
-    \pdftex_pdfobjcompresslevel:D
-  \@@_primitive:NN \pdfoutline            \pdftex_pdfoutline:D
-  \@@_primitive:NN \pdfoutput             \pdftex_pdfoutput:D
-  \@@_primitive:NN \pdfpageattr           \pdftex_pdfpageattr:D
-  \@@_primitive:NN \pdfpagebox            \pdftex_pdfpagebox:D
-  \@@_primitive:NN \pdfpageref            \pdftex_pdfpageref:D
-  \@@_primitive:NN \pdfpageresources      \pdftex_pdfpageresources:D
-  \@@_primitive:NN \pdfpagesattr          \pdftex_pdfpagesattr:D
-  \@@_primitive:NN \pdfrefobj             \pdftex_pdfrefobj:D
-  \@@_primitive:NN \pdfrefxform           \pdftex_pdfrefxform:D
-  \@@_primitive:NN \pdfrefximage          \pdftex_pdfrefximage:D
-  \@@_primitive:NN \pdfrestore            \pdftex_pdfrestore:D
-  \@@_primitive:NN \pdfretval             \pdftex_pdfretval:D
-  \@@_primitive:NN \pdfsave               \pdftex_pdfsave:D
-  \@@_primitive:NN \pdfsetmatrix          \pdftex_pdfsetmatrix:D
-  \@@_primitive:NN \pdfstartlink          \pdftex_pdfstartlink:D
-  \@@_primitive:NN \pdfstartthread        \pdftex_pdfstartthread:D
-  \@@_primitive:NN \pdfsuppressptexinfo
-    \pdftex_pdfsuppressptexinfo:D
-  \@@_primitive:NN \pdfthread             \pdftex_pdfthread:D
-  \@@_primitive:NN \pdfthreadmargin       \pdftex_pdfthreadmargin:D
-  \@@_primitive:NN \pdftrailer            \pdftex_pdftrailer:D
-  \@@_primitive:NN \pdfuniqueresname      \pdftex_pdfuniqueresname:D
-  \@@_primitive:NN \pdfvorigin            \pdftex_pdfvorigin:D
-  \@@_primitive:NN \pdfxform              \pdftex_pdfxform:D
-  \@@_primitive:NN \pdfxformattr          \pdftex_pdfxformattr:D
-  \@@_primitive:NN \pdfxformname          \pdftex_pdfxformname:D
-  \@@_primitive:NN \pdfxformresources     \pdftex_pdfxformresources:D
-  \@@_primitive:NN \pdfximage             \pdftex_pdfximage:D
-  \@@_primitive:NN \pdfximagebbox         \pdftex_pdfximagebbox:D
-  \@@_primitive:NN \ifpdfabsdim           \pdftex_ifabsdim:D
-  \@@_primitive:NN \ifpdfabsnum           \pdftex_ifabsnum:D
-  \@@_primitive:NN \ifpdfprimitive        \pdftex_ifprimitive:D
-  \@@_primitive:NN \pdfadjustspacing      \pdftex_adjustspacing:D
-  \@@_primitive:NN \pdfcopyfont           \pdftex_copyfont:D
-  \@@_primitive:NN \pdfdraftmode          \pdftex_draftmode:D
-  \@@_primitive:NN \pdfeachlinedepth      \pdftex_eachlinedepth:D
-  \@@_primitive:NN \pdfeachlineheight     \pdftex_eachlineheight:D
-  \@@_primitive:NN \pdffilemoddate        \pdftex_filemoddate:D
-  \@@_primitive:NN \pdffilesize           \pdftex_filesize:D
-  \@@_primitive:NN \pdffirstlineheight    \pdftex_firstlineheight:D
-  \@@_primitive:NN \pdffontexpand         \pdftex_fontexpand:D
-  \@@_primitive:NN \pdffontsize           \pdftex_fontsize:D
-  \@@_primitive:NN \pdfignoreddimen       \pdftex_ignoreddimen:D
-  \@@_primitive:NN \pdfinsertht           \pdftex_insertht:D
-  \@@_primitive:NN \pdflastlinedepth      \pdftex_lastlinedepth:D
-  \@@_primitive:NN \pdflastxpos           \pdftex_lastxpos:D
-  \@@_primitive:NN \pdflastypos           \pdftex_lastypos:D
-  \@@_primitive:NN \pdfmapfile            \pdftex_mapfile:D
-  \@@_primitive:NN \pdfmapline            \pdftex_mapline:D
-  \@@_primitive:NN \pdfmdfivesum          \pdftex_mdfivesum:D
-  \@@_primitive:NN \pdfnoligatures        \pdftex_noligatures:D
-  \@@_primitive:NN \pdfnormaldeviate      \pdftex_normaldeviate:D
-  \@@_primitive:NN \pdfpageheight         \pdftex_pageheight:D
-  \@@_primitive:NN \pdfpagewidth          \pdftex_pagewidth:D
-  \@@_primitive:NN \pdfpkmode             \pdftex_pkmode:D
-  \@@_primitive:NN \pdfpkresolution       \pdftex_pkresolution:D
-  \@@_primitive:NN \pdfprimitive          \pdftex_primitive:D
-  \@@_primitive:NN \pdfprotrudechars      \pdftex_protrudechars:D
-  \@@_primitive:NN \pdfpxdimen            \pdftex_pxdimen:D
-  \@@_primitive:NN \pdfrandomseed         \pdftex_randomseed:D
-  \@@_primitive:NN \pdfsavepos            \pdftex_savepos:D
-  \@@_primitive:NN \pdfstrcmp             \pdftex_strcmp:D
-  \@@_primitive:NN \pdfsetrandomseed      \pdftex_setrandomseed:D
-  \@@_primitive:NN \pdfshellescape        \pdftex_shellescape:D
-  \@@_primitive:NN \pdftracingfonts       \pdftex_tracingfonts:D
-  \@@_primitive:NN \pdfuniformdeviate     \pdftex_uniformdeviate:D
-  \@@_primitive:NN \pdftexbanner          \pdftex_pdftexbanner:D
-  \@@_primitive:NN \pdftexrevision        \pdftex_pdftexrevision:D
-  \@@_primitive:NN \pdftexversion         \pdftex_pdftexversion:D
-  \@@_primitive:NN \efcode                \pdftex_efcode:D
-  \@@_primitive:NN \ifincsname            \pdftex_ifincsname:D
-  \@@_primitive:NN \leftmarginkern        \pdftex_leftmarginkern:D
-  \@@_primitive:NN \letterspacefont       \pdftex_letterspacefont:D
-  \@@_primitive:NN \lpcode                \pdftex_lpcode:D
-  \@@_primitive:NN \quitvmode             \pdftex_quitvmode:D
-  \@@_primitive:NN \rightmarginkern       \pdftex_rightmarginkern:D
-  \@@_primitive:NN \rpcode                \pdftex_rpcode:D
-  \@@_primitive:NN \synctex               \pdftex_synctex:D
-  \@@_primitive:NN \tagcode               \pdftex_tagcode:D
-  \@@_primitive:NN \mdfivesum             \pdftex_mdfivesum:D
-  \@@_primitive:NN \ifprimitive           \pdftex_ifprimitive:D
-  \@@_primitive:NN \primitive             \pdftex_primitive:D
-  \@@_primitive:NN \shellescape           \pdftex_shellescape:D
-  \@@_primitive:NN \adjustspacing         \pdftex_adjustspacing:D
-  \@@_primitive:NN \copyfont              \pdftex_copyfont:D
-  \@@_primitive:NN \draftmode             \pdftex_draftmode:D
-  \@@_primitive:NN \expandglyphsinfont    \pdftex_fontexpand:D
-  \@@_primitive:NN \ifabsdim              \pdftex_ifabsdim:D
-  \@@_primitive:NN \ifabsnum              \pdftex_ifabsnum:D
-  \@@_primitive:NN \ignoreligaturesinfont
-    \pdftex_ignoreligaturesinfont:D
-  \@@_primitive:NN \insertht              \pdftex_insertht:D
-  \@@_primitive:NN \lastsavedboxresourceindex
-    \pdftex_pdflastxform:D
-  \@@_primitive:NN \lastsavedimageresourceindex
-    \pdftex_pdflastximage:D
-  \@@_primitive:NN \lastsavedimageresourcepages
-    \pdftex_pdflastximagepages:D
-  \@@_primitive:NN \lastxpos              \pdftex_lastxpos:D
-  \@@_primitive:NN \lastypos              \pdftex_lastypos:D
-  \@@_primitive:NN \normaldeviate         \pdftex_normaldeviate:D
-  \@@_primitive:NN \outputmode            \pdftex_pdfoutput:D
-  \@@_primitive:NN \pageheight            \pdftex_pageheight:D
-  \@@_primitive:NN \pagewidth             \pdftex_pagewith:D
-  \@@_primitive:NN \protrudechars         \pdftex_protrudechars:D
-  \@@_primitive:NN \pxdimen               \pdftex_pxdimen:D
-  \@@_primitive:NN \randomseed            \pdftex_randomseed:D
-  \@@_primitive:NN \useboxresource        \pdftex_pdfrefxform:D
-  \@@_primitive:NN \useimageresource      \pdftex_pdfrefximage:D
-  \@@_primitive:NN \savepos               \pdftex_savepos:D
-  \@@_primitive:NN \saveboxresource       \pdftex_pdfxform:D
-  \@@_primitive:NN \saveimageresource     \pdftex_pdfximage:D
-  \@@_primitive:NN \setrandomseed         \pdftex_setrandomseed:D
-  \@@_primitive:NN \tracingfonts          \pdftex_tracingfonts:D
-  \@@_primitive:NN \uniformdeviate        \pdftex_uniformdeviate:D
-  \@@_primitive:NN \suppressfontnotfounderror
-    \xetex_suppressfontnotfounderror:D
-  \@@_primitive:NN \XeTeXcharclass        \xetex_charclass:D
-  \@@_primitive:NN \XeTeXcharglyph        \xetex_charglyph:D
-  \@@_primitive:NN \XeTeXcountfeatures    \xetex_countfeatures:D
-  \@@_primitive:NN \XeTeXcountglyphs      \xetex_countglyphs:D
-  \@@_primitive:NN \XeTeXcountselectors   \xetex_countselectors:D
-  \@@_primitive:NN \XeTeXcountvariations  \xetex_countvariations:D
-  \@@_primitive:NN \XeTeXdefaultencoding  \xetex_defaultencoding:D
-  \@@_primitive:NN \XeTeXdashbreakstate   \xetex_dashbreakstate:D
-  \@@_primitive:NN \XeTeXfeaturecode      \xetex_featurecode:D
-  \@@_primitive:NN \XeTeXfeaturename      \xetex_featurename:D
-  \@@_primitive:NN \XeTeXfindfeaturebyname
-    \xetex_findfeaturebyname:D
-  \@@_primitive:NN \XeTeXfindselectorbyname
-    \xetex_findselectorbyname:D
-  \@@_primitive:NN \XeTeXfindvariationbyname
-    \xetex_findvariationbyname:D
-  \@@_primitive:NN \XeTeXfirstfontchar    \xetex_firstfontchar:D
-  \@@_primitive:NN \XeTeXfonttype         \xetex_fonttype:D
-  \@@_primitive:NN \XeTeXgenerateactualtext
-    \xetex_generateactualtext:D
-  \@@_primitive:NN \XeTeXglyph            \xetex_glyph:D
-  \@@_primitive:NN \XeTeXglyphbounds      \xetex_glyphbounds:D
-  \@@_primitive:NN \XeTeXglyphindex       \xetex_glyphindex:D
-  \@@_primitive:NN \XeTeXglyphname        \xetex_glyphname:D
-  \@@_primitive:NN \XeTeXinputencoding    \xetex_inputencoding:D
-  \@@_primitive:NN \XeTeXinputnormalization
-    \xetex_inputnormalization:D
-  \@@_primitive:NN \XeTeXinterchartokenstate
-    \xetex_interchartokenstate:D
-  \@@_primitive:NN \XeTeXinterchartoks    \xetex_interchartoks:D
-  \@@_primitive:NN \XeTeXisdefaultselector
-    \xetex_isdefaultselector:D
-  \@@_primitive:NN \XeTeXisexclusivefeature
-    \xetex_isexclusivefeature:D
-  \@@_primitive:NN \XeTeXlastfontchar     \xetex_lastfontchar:D
-  \@@_primitive:NN \XeTeXlinebreakskip    \xetex_linebreakskip:D
-  \@@_primitive:NN \XeTeXlinebreaklocale  \xetex_linebreaklocale:D
-  \@@_primitive:NN \XeTeXlinebreakpenalty \xetex_linebreakpenalty:D
-  \@@_primitive:NN \XeTeXOTcountfeatures  \xetex_OTcountfeatures:D
-  \@@_primitive:NN \XeTeXOTcountlanguages \xetex_OTcountlanguages:D
-  \@@_primitive:NN \XeTeXOTcountscripts   \xetex_OTcountscripts:D
-  \@@_primitive:NN \XeTeXOTfeaturetag     \xetex_OTfeaturetag:D
-  \@@_primitive:NN \XeTeXOTlanguagetag    \xetex_OTlanguagetag:D
-  \@@_primitive:NN \XeTeXOTscripttag      \xetex_OTscripttag:D
-  \@@_primitive:NN \XeTeXpdffile          \xetex_pdffile:D
-  \@@_primitive:NN \XeTeXpdfpagecount     \xetex_pdfpagecount:D
-  \@@_primitive:NN \XeTeXpicfile          \xetex_picfile:D
-  \@@_primitive:NN \XeTeXselectorname     \xetex_selectorname:D
-  \@@_primitive:NN \XeTeXtracingfonts     \xetex_tracingfonts:D
-  \@@_primitive:NN \XeTeXupwardsmode      \xetex_upwardsmode:D
-  \@@_primitive:NN \XeTeXuseglyphmetrics  \xetex_useglyphmetrics:D
-  \@@_primitive:NN \XeTeXvariation        \xetex_variation:D
-  \@@_primitive:NN \XeTeXvariationdefault \xetex_variationdefault:D
-  \@@_primitive:NN \XeTeXvariationmax     \xetex_variationmax:D
-  \@@_primitive:NN \XeTeXvariationmin     \xetex_variationmin:D
-  \@@_primitive:NN \XeTeXvariationname    \xetex_variationname:D
-  \@@_primitive:NN \XeTeXrevision         \xetex_XeTeXrevision:D
-  \@@_primitive:NN \XeTeXversion          \xetex_XeTeXversion:D
-  \@@_primitive:NN \alignmark             \luatex_alignmark:D
-  \@@_primitive:NN \aligntab              \luatex_aligntab:D
-  \@@_primitive:NN \attribute             \luatex_attribute:D
-  \@@_primitive:NN \attributedef          \luatex_attributedef:D
-  \@@_primitive:NN \automaticdiscretionary
-    \luatex_automaticdiscretionary:D
-  \@@_primitive:NN \automatichyphenmode
-    \luatex_automatichyphenmode:D
-  \@@_primitive:NN \automatichyphenpenalty
-    \luatex_automatichyphenpenalty:D
-  \@@_primitive:NN \begincsname           \luatex_begincsname:D
-  \@@_primitive:NN \breakafterdirmode     \luatex_breakafterdirmode:D
-  \@@_primitive:NN \catcodetable          \luatex_catcodetable:D
-  \@@_primitive:NN \clearmarks            \luatex_clearmarks:D
-  \@@_primitive:NN \crampeddisplaystyle
-    \luatex_crampeddisplaystyle:D
-  \@@_primitive:NN \crampedscriptscriptstyle
-    \luatex_crampedscriptscriptstyle:D
-  \@@_primitive:NN \crampedscriptstyle    \luatex_crampedscriptstyle:D
-  \@@_primitive:NN \crampedtextstyle      \luatex_crampedtextstyle:D
-  \@@_primitive:NN \directlua             \luatex_directlua:D
-  \@@_primitive:NN \dviextension          \luatex_dviextension:D
-  \@@_primitive:NN \dvifeedback           \luatex_dvifeedback:D
-  \@@_primitive:NN \dvivariable           \luatex_dvivariable:D
-  \@@_primitive:NN \etoksapp              \luatex_etoksapp:D
-  \@@_primitive:NN \etokspre              \luatex_etokspre:D
-  \@@_primitive:NN \explicithyphenpenalty
-    \luatex_explicithyphenpenalty:D
-  \@@_primitive:NN \expanded              \luatex_expanded:D
-  \@@_primitive:NN \explicitdiscretionary
-    \luatex_explicitdiscretionary:D
-  \@@_primitive:NN \firstvalidlanguage    \luatex_firstvalidlanguage:D
-  \@@_primitive:NN \fontid                \luatex_fontid:D
-  \@@_primitive:NN \formatname            \luatex_formatname:D
-  \@@_primitive:NN \hjcode                \luatex_hjcode:D
-  \@@_primitive:NN \hpack                 \luatex_hpack:D
-  \@@_primitive:NN \hyphenationbounds     \luatex_hyphenationbounds:D
-  \@@_primitive:NN \hyphenationmin        \luatex_hyphenationmin:D
-  \@@_primitive:NN \hyphenpenaltymode     \luatex_hyphenpenaltymode:D
-  \@@_primitive:NN \gleaders              \luatex_gleaders:D
-  \@@_primitive:NN \initcatcodetable      \luatex_initcatcodetable:D
-  \@@_primitive:NN \lastnamedcs           \luatex_lastnamedcs:D
-  \@@_primitive:NN \latelua               \luatex_latelua:D
-  \@@_primitive:NN \letcharcode           \luatex_letcharcode:D
-  \@@_primitive:NN \luaescapestring       \luatex_luaescapestring:D
-  \@@_primitive:NN \luafunction           \luatex_luafunction:D
-  \@@_primitive:NN \luatexbanner          \luatex_luatexbanner:D
-  \@@_primitive:NN \luatexrevision        \luatex_luatexrevision:D
-  \@@_primitive:NN \luatexversion         \luatex_luatexversion:D
-  \@@_primitive:NN \mathdelimitersmode    \luatex_mathdelimitersmode:D
-  \@@_primitive:NN \mathdisplayskipmode
-    \luatex_mathdisplayskipmode:D
-  \@@_primitive:NN \matheqnogapstep       \luatex_matheqnogapstep:D
-  \@@_primitive:NN \mathnolimitsmode      \luatex_mathnolimitsmode:D
-  \@@_primitive:NN \mathoption            \luatex_mathoption:D
-  \@@_primitive:NN \mathpenaltiesmode     \luatex_mathpenaltiesmode:D
-  \@@_primitive:NN \mathrulesfam          \luatex_mathrulesfam:D
-  \@@_primitive:NN \mathscriptsmode       \luatex_mathscriptsmode:D
-  \@@_primitive:NN \mathscriptboxmode     \luatex_mathscriptboxmode:D
-  \@@_primitive:NN \mathstyle             \luatex_mathstyle:D
-  \@@_primitive:NN \mathsurroundmode      \luatex_mathsurroundmode:D
-  \@@_primitive:NN \mathsurroundskip      \luatex_mathsurroundskip:D
-  \@@_primitive:NN \nohrule               \luatex_nohrule:D
-  \@@_primitive:NN \nokerns               \luatex_nokerns:D
-  \@@_primitive:NN \noligs                \luatex_noligs:D
-  \@@_primitive:NN \nospaces              \luatex_nospaces:D
-  \@@_primitive:NN \novrule               \luatex_novrule:D
-  \@@_primitive:NN \outputbox             \luatex_outputbox:D
-  \@@_primitive:NN \pagebottomoffset      \luatex_pagebottomoffset:D
-  \@@_primitive:NN \pageleftoffset        \luatex_pageleftoffset:D
-  \@@_primitive:NN \pagerightoffset       \luatex_pagerightoffset:D
-  \@@_primitive:NN \pagetopoffset         \luatex_pagetopoffset:D
-  \@@_primitive:NN \pdfextension          \luatex_pdfextension:D
-  \@@_primitive:NN \pdffeedback           \luatex_pdffeedback:D
-  \@@_primitive:NN \pdfvariable           \luatex_pdfvariable:D
-  \@@_primitive:NN \postexhyphenchar      \luatex_postexhyphenchar:D
-  \@@_primitive:NN \posthyphenchar        \luatex_posthyphenchar:D
-  \@@_primitive:NN \prebinoppenalty       \luatex_prebinoppenalty:D
-  \@@_primitive:NN \predisplaygapfactor
-    \luatex_predisplaygapfactor:D
-  \@@_primitive:NN \preexhyphenchar       \luatex_preexhyphenchar:D
-  \@@_primitive:NN \prehyphenchar         \luatex_prehyphenchar:D
-  \@@_primitive:NN \prerelpenalty         \luatex_prerelpenalty:D
-  \@@_primitive:NN \savecatcodetable      \luatex_savecatcodetable:D
-  \@@_primitive:NN \scantextokens         \luatex_scantextokens:D
-  \@@_primitive:NN \setfontid             \luatex_setfontid:D
-  \@@_primitive:NN \shapemode             \luatex_shapemode:D
-  \@@_primitive:NN \suppressifcsnameerror
-    \luatex_suppressifcsnameerror:D
-  \@@_primitive:NN \suppresslongerror     \luatex_suppresslongerror:D
-  \@@_primitive:NN \suppressmathparerror
-    \luatex_suppressmathparerror:D
-  \@@_primitive:NN \suppressoutererror    \luatex_suppressoutererror:D
-  \@@_primitive:NN \suppressprimitiveerror
-    \luatex_suppressprimitiveerror:D
-  \@@_primitive:NN \toksapp               \luatex_toksapp:D
-  \@@_primitive:NN \tokspre               \luatex_tokspre:D
-  \@@_primitive:NN \tpack                 \luatex_tpack:D
-  \@@_primitive:NN \vpack                 \luatex_vpack:D
-  \@@_primitive:NN \bodydir               \luatex_bodydir:D
-  \@@_primitive:NN \boxdir                \luatex_boxdir:D
-  \@@_primitive:NN \leftghost             \luatex_leftghost:D
-  \@@_primitive:NN \linedir               \luatex_linedir:D
-  \@@_primitive:NN \localbrokenpenalty    \luatex_localbrokenpenalty:D
-  \@@_primitive:NN \localinterlinepenalty
-    \luatex_localinterlinepenalty:D
-  \@@_primitive:NN \localleftbox          \luatex_localleftbox:D
-  \@@_primitive:NN \localrightbox         \luatex_localrightbox:D
-  \@@_primitive:NN \mathdir               \luatex_mathdir:D
-  \@@_primitive:NN \pagedir               \luatex_pagedir:D
-  \@@_primitive:NN \pardir                \luatex_pardir:D
-  \@@_primitive:NN \rightghost            \luatex_rightghost:D
-  \@@_primitive:NN \textdir               \luatex_textdir:D
-  \@@_primitive:NN \Uchar                 \utex_char:D
-  \@@_primitive:NN \Ucharcat              \utex_charcat:D
-  \@@_primitive:NN \Udelcode              \utex_delcode:D
-  \@@_primitive:NN \Udelcodenum           \utex_delcodenum:D
-  \@@_primitive:NN \Udelimiter            \utex_delimiter:D
-  \@@_primitive:NN \Udelimiterover        \utex_delimiterover:D
-  \@@_primitive:NN \Udelimiterunder       \utex_delimiterunder:D
-  \@@_primitive:NN \Uhextensible          \utex_hextensible:D
-  \@@_primitive:NN \Umathaccent           \utex_mathaccent:D
-  \@@_primitive:NN \Umathaxis             \utex_mathaxis:D
-  \@@_primitive:NN \Umathbinbinspacing    \utex_binbinspacing:D
-  \@@_primitive:NN \Umathbinclosespacing  \utex_binclosespacing:D
-  \@@_primitive:NN \Umathbininnerspacing  \utex_bininnerspacing:D
-  \@@_primitive:NN \Umathbinopenspacing   \utex_binopenspacing:D
-  \@@_primitive:NN \Umathbinopspacing     \utex_binopspacing:D
-  \@@_primitive:NN \Umathbinordspacing    \utex_binordspacing:D
-  \@@_primitive:NN \Umathbinpunctspacing  \utex_binpunctspacing:D
-  \@@_primitive:NN \Umathbinrelspacing    \utex_binrelspacing:D
-  \@@_primitive:NN \Umathchar             \utex_mathchar:D
-  \@@_primitive:NN \Umathcharclass        \utex_mathcharclass:D
-  \@@_primitive:NN \Umathchardef          \utex_mathchardef:D
-  \@@_primitive:NN \Umathcharfam          \utex_mathcharfam:D
-  \@@_primitive:NN \Umathcharnum          \utex_mathcharnum:D
-  \@@_primitive:NN \Umathcharnumdef       \utex_mathcharnumdef:D
-  \@@_primitive:NN \Umathcharslot         \utex_mathcharslot:D
-  \@@_primitive:NN \Umathclosebinspacing  \utex_closebinspacing:D
-  \@@_primitive:NN \Umathcloseclosespacing
-    \utex_closeclosespacing:D
-  \@@_primitive:NN \Umathcloseinnerspacing
-    \utex_closeinnerspacing:D
-  \@@_primitive:NN \Umathcloseopenspacing \utex_closeopenspacing:D
-  \@@_primitive:NN \Umathcloseopspacing   \utex_closeopspacing:D
-  \@@_primitive:NN \Umathcloseordspacing  \utex_closeordspacing:D
-  \@@_primitive:NN \Umathclosepunctspacing
-    \utex_closepunctspacing:D
-  \@@_primitive:NN \Umathcloserelspacing  \utex_closerelspacing:D
-  \@@_primitive:NN \Umathcode             \utex_mathcode:D
-  \@@_primitive:NN \Umathcodenum          \utex_mathcodenum:D
-  \@@_primitive:NN \Umathconnectoroverlapmin
-    \utex_connectoroverlapmin:D
-  \@@_primitive:NN \Umathfractiondelsize  \utex_fractiondelsize:D
-  \@@_primitive:NN \Umathfractiondenomdown
-    \utex_fractiondenomdown:D
-  \@@_primitive:NN \Umathfractiondenomvgap
-    \utex_fractiondenomvgap:D
-  \@@_primitive:NN \Umathfractionnumup    \utex_fractionnumup:D
-  \@@_primitive:NN \Umathfractionnumvgap  \utex_fractionnumvgap:D
-  \@@_primitive:NN \Umathfractionrule     \utex_fractionrule:D
-  \@@_primitive:NN \Umathinnerbinspacing  \utex_innerbinspacing:D
-  \@@_primitive:NN \Umathinnerclosespacing
-    \utex_innerclosespacing:D
-  \@@_primitive:NN \Umathinnerinnerspacing
-    \utex_innerinnerspacing:D
-  \@@_primitive:NN \Umathinneropenspacing \utex_inneropenspacing:D
-  \@@_primitive:NN \Umathinneropspacing   \utex_inneropspacing:D
-  \@@_primitive:NN \Umathinnerordspacing  \utex_innerordspacing:D
-  \@@_primitive:NN \Umathinnerpunctspacing
-    \utex_innerpunctspacing:D
-  \@@_primitive:NN \Umathinnerrelspacing  \utex_innerrelspacing:D
-  \@@_primitive:NN \Umathlimitabovebgap   \utex_limitabovebgap:D
-  \@@_primitive:NN \Umathlimitabovekern   \utex_limitabovekern:D
-  \@@_primitive:NN \Umathlimitabovevgap   \utex_limitabovevgap:D
-  \@@_primitive:NN \Umathlimitbelowbgap   \utex_limitbelowbgap:D
-  \@@_primitive:NN \Umathlimitbelowkern   \utex_limitbelowkern:D
-  \@@_primitive:NN \Umathlimitbelowvgap   \utex_limitbelowvgap:D
-  \@@_primitive:NN \Umathnolimitsubfactor \utex_nolimitsubfactor:D
-  \@@_primitive:NN \Umathnolimitsupfactor \utex_nolimitsupfactor:D
-  \@@_primitive:NN \Umathopbinspacing     \utex_opbinspacing:D
-  \@@_primitive:NN \Umathopclosespacing   \utex_opclosespacing:D
-  \@@_primitive:NN \Umathopenbinspacing   \utex_openbinspacing:D
-  \@@_primitive:NN \Umathopenclosespacing \utex_openclosespacing:D
-  \@@_primitive:NN \Umathopeninnerspacing \utex_openinnerspacing:D
-  \@@_primitive:NN \Umathopenopenspacing  \utex_openopenspacing:D
-  \@@_primitive:NN \Umathopenopspacing    \utex_openopspacing:D
-  \@@_primitive:NN \Umathopenordspacing   \utex_openordspacing:D
-  \@@_primitive:NN \Umathopenpunctspacing \utex_openpunctspacing:D
-  \@@_primitive:NN \Umathopenrelspacing   \utex_openrelspacing:D
-  \@@_primitive:NN \Umathoperatorsize     \utex_operatorsize:D
-  \@@_primitive:NN \Umathopinnerspacing   \utex_opinnerspacing:D
-  \@@_primitive:NN \Umathopopenspacing    \utex_opopenspacing:D
-  \@@_primitive:NN \Umathopopspacing      \utex_opopspacing:D
-  \@@_primitive:NN \Umathopordspacing     \utex_opordspacing:D
-  \@@_primitive:NN \Umathoppunctspacing   \utex_oppunctspacing:D
-  \@@_primitive:NN \Umathoprelspacing     \utex_oprelspacing:D
-  \@@_primitive:NN \Umathordbinspacing    \utex_ordbinspacing:D
-  \@@_primitive:NN \Umathordclosespacing  \utex_ordclosespacing:D
-  \@@_primitive:NN \Umathordinnerspacing  \utex_ordinnerspacing:D
-  \@@_primitive:NN \Umathordopenspacing   \utex_ordopenspacing:D
-  \@@_primitive:NN \Umathordopspacing     \utex_ordopspacing:D
-  \@@_primitive:NN \Umathordordspacing    \utex_ordordspacing:D
-  \@@_primitive:NN \Umathordpunctspacing  \utex_ordpunctspacing:D
-  \@@_primitive:NN \Umathordrelspacing    \utex_ordrelspacing:D
-  \@@_primitive:NN \Umathoverbarkern      \utex_overbarkern:D
-  \@@_primitive:NN \Umathoverbarrule      \utex_overbarrule:D
-  \@@_primitive:NN \Umathoverbarvgap      \utex_overbarvgap:D
-  \@@_primitive:NN \Umathoverdelimiterbgap
-     \utex_overdelimiterbgap:D
-  \@@_primitive:NN \Umathoverdelimitervgap
-    \utex_overdelimitervgap:D
-  \@@_primitive:NN \Umathpunctbinspacing  \utex_punctbinspacing:D
-  \@@_primitive:NN \Umathpunctclosespacing
-    \utex_punctclosespacing:D
-  \@@_primitive:NN \Umathpunctinnerspacing
-    \utex_punctinnerspacing:D
-  \@@_primitive:NN \Umathpunctopenspacing \utex_punctopenspacing:D
-  \@@_primitive:NN \Umathpunctopspacing   \utex_punctopspacing:D
-  \@@_primitive:NN \Umathpunctordspacing  \utex_punctordspacing:D
-  \@@_primitive:NN \Umathpunctpunctspacing\utex_punctpunctspacing:D
-  \@@_primitive:NN \Umathpunctrelspacing  \utex_punctrelspacing:D
-  \@@_primitive:NN \Umathquad             \utex_quad:D
-  \@@_primitive:NN \Umathradicaldegreeafter
-    \utex_radicaldegreeafter:D
-  \@@_primitive:NN \Umathradicaldegreebefore
-    \utex_radicaldegreebefore:D
-  \@@_primitive:NN \Umathradicaldegreeraise
-    \utex_radicaldegreeraise:D
-  \@@_primitive:NN \Umathradicalkern      \utex_radicalkern:D
-  \@@_primitive:NN \Umathradicalrule      \utex_radicalrule:D
-  \@@_primitive:NN \Umathradicalvgap      \utex_radicalvgap:D
-  \@@_primitive:NN \Umathrelbinspacing    \utex_relbinspacing:D
-  \@@_primitive:NN \Umathrelclosespacing  \utex_relclosespacing:D
-  \@@_primitive:NN \Umathrelinnerspacing  \utex_relinnerspacing:D
-  \@@_primitive:NN \Umathrelopenspacing   \utex_relopenspacing:D
-  \@@_primitive:NN \Umathrelopspacing     \utex_relopspacing:D
-  \@@_primitive:NN \Umathrelordspacing    \utex_relordspacing:D
-  \@@_primitive:NN \Umathrelpunctspacing  \utex_relpunctspacing:D
-  \@@_primitive:NN \Umathrelrelspacing    \utex_relrelspacing:D
-  \@@_primitive:NN \Umathskewedfractionhgap
-    \utex_skewedfractionhgap:D
-  \@@_primitive:NN \Umathskewedfractionvgap
-    \utex_skewedfractionvgap:D
-  \@@_primitive:NN \Umathspaceafterscript \utex_spaceafterscript:D
-  \@@_primitive:NN \Umathstackdenomdown   \utex_stackdenomdown:D
-  \@@_primitive:NN \Umathstacknumup       \utex_stacknumup:D
-  \@@_primitive:NN \Umathstackvgap        \utex_stackvgap:D
-  \@@_primitive:NN \Umathsubshiftdown     \utex_subshiftdown:D
-  \@@_primitive:NN \Umathsubshiftdrop     \utex_subshiftdrop:D
-  \@@_primitive:NN \Umathsubsupshiftdown  \utex_subsupshiftdown:D
-  \@@_primitive:NN \Umathsubsupvgap       \utex_subsupvgap:D
-  \@@_primitive:NN \Umathsubtopmax        \utex_subtopmax:D
-  \@@_primitive:NN \Umathsupbottommin     \utex_supbottommin:D
-  \@@_primitive:NN \Umathsupshiftdrop     \utex_supshiftdrop:D
-  \@@_primitive:NN \Umathsupshiftup       \utex_supshiftup:D
-  \@@_primitive:NN \Umathsupsubbottommax  \utex_supsubbottommax:D
-  \@@_primitive:NN \Umathunderbarkern     \utex_underbarkern:D
-  \@@_primitive:NN \Umathunderbarrule     \utex_underbarrule:D
-  \@@_primitive:NN \Umathunderbarvgap     \utex_underbarvgap:D
-  \@@_primitive:NN \Umathunderdelimiterbgap
-    \utex_underdelimiterbgap:D
-  \@@_primitive:NN \Umathunderdelimitervgap
-    \utex_underdelimitervgap:D
-  \@@_primitive:NN \Unosubscript          \utex_nosubscript:D
-  \@@_primitive:NN \Unosuperscript        \utex_nosuperscript:D
-  \@@_primitive:NN \Uoverdelimiter        \utex_overdelimiter:D
-  \@@_primitive:NN \Uradical              \utex_radical:D
-  \@@_primitive:NN \Uroot                 \utex_root:D
-  \@@_primitive:NN \Uskewed               \utex_skewed:D
-  \@@_primitive:NN \Uskewedwithdelims     \utex_skewedwithdelims:D
-  \@@_primitive:NN \Ustack                \utex_stack:D
-  \@@_primitive:NN \Ustartdisplaymath     \utex_startdisplaymath:D
-  \@@_primitive:NN \Ustartmath            \utex_startmath:D
-  \@@_primitive:NN \Ustopdisplaymath      \utex_stopdisplaymath:D
-  \@@_primitive:NN \Ustopmath             \utex_stopmath:D
-  \@@_primitive:NN \Usubscript            \utex_subscript:D
-  \@@_primitive:NN \Usuperscript          \utex_superscript:D
-  \@@_primitive:NN \Uunderdelimiter       \utex_underdelimiter:D
-  \@@_primitive:NN \Uvextensible          \utex_vextensible:D
-  \@@_primitive:NN \autospacing           \ptex_autospacing:D
-  \@@_primitive:NN \autoxspacing          \ptex_autoxspacing:D
-  \@@_primitive:NN \dtou                  \ptex_dtou:D
-  \@@_primitive:NN \epTeXinputencoding    \ptex_inputencoding:D
-  \@@_primitive:NN \epTeXversion          \ptex_epTeXversion:D
-  \@@_primitive:NN \euc                   \ptex_euc:D
-  \@@_primitive:NN \ifdbox                \ptex_ifdbox:D
-  \@@_primitive:NN \ifddir                \ptex_ifddir:D
-  \@@_primitive:NN \ifmdir                \ptex_ifmdir:D
-  \@@_primitive:NN \iftbox                \ptex_iftbox:D
-  \@@_primitive:NN \iftdir                \ptex_iftdir:D
-  \@@_primitive:NN \ifybox                \ptex_ifybox:D
-  \@@_primitive:NN \ifydir                \ptex_ifydir:D
-  \@@_primitive:NN \inhibitglue           \ptex_inhibitglue:D
-  \@@_primitive:NN \inhibitxspcode        \ptex_inhibitxspcode:D
-  \@@_primitive:NN \jcharwidowpenalty     \ptex_jcharwidowpenalty:D
-  \@@_primitive:NN \jfam                  \ptex_jfam:D
-  \@@_primitive:NN \jfont                 \ptex_jfont:D
-  \@@_primitive:NN \jis                   \ptex_jis:D
-  \@@_primitive:NN \kanjiskip             \ptex_kanjiskip:D
-  \@@_primitive:NN \kansuji               \ptex_kansuji:D
-  \@@_primitive:NN \kansujichar           \ptex_kansujichar:D
-  \@@_primitive:NN \kcatcode              \ptex_kcatcode:D
-  \@@_primitive:NN \kuten                 \ptex_kuten:D
-  \@@_primitive:NN \noautospacing         \ptex_noautospacing:D
-  \@@_primitive:NN \noautoxspacing        \ptex_noautoxspacing:D
-  \@@_primitive:NN \postbreakpenalty      \ptex_postbreakpenalty:D
-  \@@_primitive:NN \prebreakpenalty       \ptex_prebreakpenalty:D
-  \@@_primitive:NN \ptexminorversion      \ptex_ptexminorversion:D
-  \@@_primitive:NN \ptexrevision          \ptex_ptexrevision:D
-  \@@_primitive:NN \ptexversion           \ptex_ptexversion:D
-  \@@_primitive:NN \showmode              \ptex_showmode:D
-  \@@_primitive:NN \sjis                  \ptex_sjis:D
-  \@@_primitive:NN \tate                  \ptex_tate:D
-  \@@_primitive:NN \tbaselineshift        \ptex_tbaselineshift:D
-  \@@_primitive:NN \tfont                 \ptex_tfont:D
-  \@@_primitive:NN \xkanjiskip            \ptex_xkanjiskip:D
-  \@@_primitive:NN \xspcode               \ptex_xspcode:D
-  \@@_primitive:NN \ybaselineshift        \ptex_ybaselineshift:D
-  \@@_primitive:NN \yoko                  \ptex_yoko:D
-  \@@_primitive:NN \disablecjktoken       \uptex_disablecjktoken:D
-  \@@_primitive:NN \enablecjktoken        \uptex_enablecjktoken:D
-  \@@_primitive:NN \forcecjktoken         \uptex_forcecjktoken:D
-  \@@_primitive:NN \kchar                 \uptex_kchar:D
-  \@@_primitive:NN \kchardef              \uptex_kchardef:D
-  \@@_primitive:NN \kuten                 \uptex_kuten:D
-  \@@_primitive:NN \ucs                   \uptex_ucs:D
-  \@@_primitive:NN \uptexrevision         \uptex_uptexrevision:D
-  \@@_primitive:NN \uptexversion          \uptex_uptexversion:D
-        }
-    }
-  \@@_primitives:
-\tex_endgroup:D
-%</package>
-%    \end{macrocode}
-%
-%    \begin{macrocode}
 %</initex|package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -146,13 +146,17 @@
 % \begin{function}[updated = 2012-07-09]
 %   {
 %     \prop_put:Nnn,  \prop_put:NnV,  \prop_put:Nno,  \prop_put:Nnx,
-%     \prop_put:NVn,  \prop_put:NVV,  \prop_put:Non,  \prop_put:Noo,
+%     \prop_put:NVn,  \prop_put:NVV,  \prop_put:NVx,  \prop_put:Nvx, 
+%     \prop_put:Non,  \prop_put:Noo,, \prop_put:Nxx,
 %     \prop_put:cnn,  \prop_put:cnV,  \prop_put:cno,  \prop_put:cnx,
-%     \prop_put:cVn,  \prop_put:cVV,  \prop_put:con,  \prop_put:coo,
+%     \prop_put:cVn,  \prop_put:cVV,  \prop_put:cVx,  \prop_put:cvx, 
+%     \prop_put:con,  \prop_put:coo,  \prop_put:cxx,
 %     \prop_gput:Nnn, \prop_gput:NnV, \prop_gput:Nno, \prop_gput:Nnx,
-%     \prop_gput:NVn, \prop_gput:NVV, \prop_gput:Non, \prop_gput:Noo,
+%     \prop_gput:NVn, \prop_gput:NVV, \prop_gput:NVx, \prop_gput:Nvx,
+%     \prop_gput:Non, \prop_gput:Noo, \prop_gput:Nxx,
 %     \prop_gput:cnn, \prop_gput:cnV, \prop_gput:cno, \prop_gput:cnx,
-%     \prop_gput:cVn, \prop_gput:cVV, \prop_gput:con, \prop_gput:coo
+%     \prop_gput:cVn, \prop_gput:cVV, \prop_gput:cVx, \prop_gput:cvx, 
+%     \prop_gput:con, \prop_gput:coo, \prop_gput:cxx
 %   }
 %   \begin{syntax}
 %     \cs{prop_put:Nnn} \meta{property list} \Arg{key} \Arg{value}
@@ -186,8 +190,8 @@
 %
 % \begin{function}[updated = 2011-08-28]
 %   {
-%     \prop_get:NnN, \prop_get:NVN, \prop_get:NoN,
-%     \prop_get:cnN, \prop_get:cVN, \prop_get:coN,
+%     \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NoN,
+%     \prop_get:cnN, \prop_get:cVN, \prop_get:cvN, \prop_get:coN,
 %   }
 %   \begin{syntax}
 %     \cs{prop_get:NnN} \meta{property list} \Arg{key} \meta{tl var}
@@ -319,8 +323,8 @@
 %
 % \begin{function}[updated = 2012-05-19, TF]
 %   {
-%     \prop_get:NnN, \prop_get:NVN, \prop_get:NoN,
-%     \prop_get:cnN, \prop_get:cVN, \prop_get:coN
+%     \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NoN,
+%     \prop_get:cnN, \prop_get:cVN, \prop_get:cvN, \prop_get:coN
 %   }
 %   \begin{syntax}
 %     \cs{prop_get:NnNTF} \meta{property list} \Arg{key} \meta{token list variable} \\
@@ -911,8 +915,8 @@
       { \tl_set:Nn #3 {##2} }
       { \tl_set:Nn #3 { \q_no_value } }
   }
-\cs_generate_variant:Nn \prop_get:NnN {     NV , No }
-\cs_generate_variant:Nn \prop_get:NnN { c , cV , co }
+\cs_generate_variant:Nn \prop_get:NnN {     NV , Nv , No }
+\cs_generate_variant:Nn \prop_get:NnN { c , cV , cv , co }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1038,16 +1042,20 @@
 % \begin{macro}[tested = m3prop002]
 %   {
 %     \prop_put:Nnn, \prop_put:NnV, \prop_put:Nno, \prop_put:Nnx,
-%     \prop_put:NVn, \prop_put:NVV, \prop_put:Non, \prop_put:Noo,
+%     \prop_put:NVn, \prop_put:NVV, \prop_put:NVx, \prop_put:Nvx,
+%     \prop_put:Non, \prop_put:Noo, \prop_put:Nxx,
 %     \prop_put:cnn, \prop_put:cnV, \prop_put:cno, \prop_put:cnx,
-%     \prop_put:cVn, \prop_put:cVV, \prop_put:con, \prop_put:coo
+%     \prop_put:cVn, \prop_put:cVV, \prop_put:cVx, \prop_put:cvx,
+%     \prop_put:con, \prop_put:coo, \prop_put:cxx
 %   }
 % \begin{macro}[tested = m3prop002]
 %   {
 %     \prop_gput:Nnn, \prop_gput:NnV, \prop_gput:Nno, \prop_gput:Nnx,
-%     \prop_gput:NVn, \prop_gput:NVV, \prop_gput:Non, \prop_gput:Noo,
+%     \prop_gput:NVn, \prop_gput:NVV, \prop_hput:NVx, \prop_hput:Nvx,
+%     \prop_gput:Non, \prop_gput:Noo, \prop_gput:Nxx,
 %     \prop_gput:cnn, \prop_gput:cnV, \prop_gput:cno, \prop_gput:cnx,
-%     \prop_gput:cVn, \prop_gput:cVV, \prop_gput:con, \prop_gput:coo
+%     \prop_gput:cVn, \prop_gput:cVV, \prop_gput:cVx, \prop_gput:cvx,
+%     \prop_gput:con, \prop_gput:coo, \prop_gput:cxx
 %   }
 % \begin{macro}{\@@_put:NNnn}
 %   Since the branches of \cs{@@_split:NnTF} are used as the replacement
@@ -1077,13 +1085,13 @@
       { #1 #2 { \exp_not:o {#2} \l_@@_internal_tl } }
   }
 \cs_generate_variant:Nn \prop_put:Nnn
-  {     NnV , Nno , Nnx , NV , NVV , No , Noo }
+  {     NnV , Nno , Nnx , NV , NVV , NVx , Nvx , No , Noo , Nxx }
 \cs_generate_variant:Nn \prop_put:Nnn
-  { c , cnV , cno , cnx , cV , cVV , co , coo }
+  { c , cnV , cno , cnx , cV , cVV , cVx , cvx , co , coo , cxx }
 \cs_generate_variant:Nn \prop_gput:Nnn
-  {     NnV , Nno , Nnx , NV , NVV , No , Noo }
+  {     NnV , Nno , Nnx , NV , NVV , NVx , Nvx , No , Noo , Nxx }
 \cs_generate_variant:Nn \prop_gput:Nnn
-  { c , cnV , cno , cnx , cV , cVV , co , coo }
+  { c , cnV , cno , cnx , cV , cVV , cVx , cvx , co , coo , cxx }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1230,7 +1238,7 @@
       { \prg_return_false: }
   }
 \prg_generate_conditional_variant:Nnn \prop_get:NnN
-  { NV , No , c , cV , co } { T , F , TF }
+  { NV , Nv , No , c , cV , cv , co } { T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -3699,7 +3699,7 @@
 \cs_new_protected:Npn \@@_show_item_exact_cs:n #1
   {
     \seq_set_split:Nnn \l_@@_internal_seq { \scan_stop: } {#1}
-    \seq_set_map:NNn \l_@@_internal_seq
+    \seq_set_map_x:NNn \l_@@_internal_seq
       \l_@@_internal_seq { \iow_char:N\\##1 }
     \@@_show_one:n
       { control~sequence~ \seq_use:Nn \l_@@_internal_seq { ~or~ } }
@@ -6109,7 +6109,7 @@
             { \flag_height:n { @@_end } }
             { \flag_height:n { @@_begin } }
         }
-      \seq_set_map:NNn \l_@@_internal_seq \l_@@_internal_seq {##1}
+      \seq_set_map_x:NNn \l_@@_internal_seq \l_@@_internal_seq {##1}
       \exp_args:NNNo
       \group_end:
       \tl_set:Nn #1 { \l_@@_internal_seq }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -139,7 +139,7 @@
 %   this space trimming behaviour is identical to that of
 %   \pkg{l3clist} functions. Empty \meta{items} are preserved by
 %   \cs{seq_set_split:Nnn}, and can be removed afterwards using
-%   \cs{seq_remove_all:Nn} \meta{sequence} \Arg{}.
+%   \cs{seq_remove_all:Nn} \meta{sequence} |{}|.
 %   The \meta{delimiter} may not contain |{|, |}| or |#|
 %   (assuming \TeX{}'s normal category code r\'egime).
 %   If the \meta{delimiter} is empty, the \meta{token list} is split
@@ -653,6 +653,40 @@
 %   \end{texnote}
 % \end{function}
 %
+% \begin{function}[added = 2011-12-22, updated = 2020-07-16]
+%   {\seq_set_map:NNn, \seq_gset_map:NNn}
+%   \begin{syntax}
+%     \cs{seq_set_map:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline function}
+%   \end{syntax}
+%   Applies \meta{inline function} to every \meta{item} stored
+%   within the \meta{sequence_2}. The \meta{inline function} should
+%   consist of code which will receive the \meta{item} as |#1|.
+%   The sequence resulting applying \meta{inline function} to each
+%   \meta{item} is assigned to \meta{sequence_1}.
+%   \begin{texnote}
+%     Contrarily to other mapping functions, \cs{seq_map_break:} cannot
+%     be used in this function, and would lead to low-level \TeX{} errors.
+%   \end{texnote}
+% \end{function}
+%
+% \begin{function}[added = 2020-07-16]
+%   {\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
+%   \begin{syntax}
+%     \cs{seq_set_map_x:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline function}
+%   \end{syntax}
+%   Applies \meta{inline function} to every \meta{item} stored
+%   within the \meta{sequence_2}. The \meta{inline function} should
+%   consist of code which will receive the \meta{item} as |#1|.
+%   The sequence resulting from \texttt{x}-expanding
+%   \meta{inline function} applied to each \meta{item}
+%   is assigned to \meta{sequence_1}. As such, the code
+%   in \meta{inline function} should be expandable.
+%   \begin{texnote}
+%     Contrarily to other mapping functions, \cs{seq_map_break:} cannot
+%     be used in this function, and would lead to low-level \TeX{} errors.
+%   \end{texnote}
+% \end{function}
+%
 % \begin{function}[EXP, added = 2012-07-13]{\seq_count:N, \seq_count:c}
 %   \begin{syntax}
 %     \cs{seq_count:N} \meta{sequence}
@@ -2082,6 +2116,45 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
+% \begin{macro}{\@@_set_map_x:NNNn}
+%   Very similar to \cs{seq_set_filter:NNn}. We could actually
+%   merge the two within a single function, but it would have weird
+%   semantics.
+%    \begin{macrocode}
+\cs_new_protected:Npn \seq_set_map_x:NNn
+  { \@@_set_map_x:NNNn \tl_set:Nx }
+\cs_new_protected:Npn \seq_gset_map_x:NNn
+  { \@@_set_map_x:NNNn \tl_gset:Nx }
+\cs_new_protected:Npn \@@_set_map_x:NNNn #1#2#3#4
+  {
+    \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
+    #1 #2 { #3 }
+    \@@_pop_item_def:
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\seq_set_map:NNn, \seq_gset_map:NNn}
+% \begin{macro}{\@@_set_map:NNNn}
+%   Similar to \cs{seq_set_map_x:NNn}, but prevents expansion of the
+%   <inline function>.
+%    \begin{macrocode}
+\cs_new_protected:Npn \seq_set_map:NNn
+  { \@@_set_map:NNNn \tl_set:Nx }
+\cs_new_protected:Npn \seq_gset_map:NNn
+  { \@@_set_map:NNNn \tl_gset:Nx }
+\cs_new_protected:Npn \@@_set_map:NNNn #1#2#3#4
+  {
+    \@@_push_item_def:n { \exp_not:n { \@@_item:n {#4} } }
+    #1 #2 { #3 }
+    \@@_pop_item_def:
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}{\seq_count:N, \seq_count:c}
 % \begin{macro}{\@@_count:w, \@@_count_end:w}
 %   Since counting the items in a sequence is quite common, we optimize

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -306,7 +306,8 @@
 %   \end{syntax}
 %   Compares the content of two \meta{str variables} and
 %   is logically \texttt{true} if the two contain the same characters
-%   in the same order.
+%   in the same order.  See \cs{tl_if_eq:NNTF} to compare tokens
+%   (including their category codes) rather than characters.
 % \end{function}
 %
 % \begin{function}[EXP,pTF, updated  = 2018-06-18]
@@ -326,7 +327,8 @@
 %   \begin{verbatim}
 %     \str_if_eq_p:no { abc } { \tl_to_str:n { abc } }
 %   \end{verbatim}
-%   is logically \texttt{true}.
+%   is logically \texttt{true}.  See \cs{tl_if_eq:nnTF} to compare
+%   tokens (including their category codes) rather than characters.
 % \end{function}
 %
 % \begin{function}[TF, added = 2017-10-08]{\str_if_in:Nn, \str_if_in:cn}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -305,7 +305,8 @@
 %   This allows the \meta{tl~var} to contain material
 %   with category codes other than those that apply when \meta{tokens}
 %   are absorbed.  The \meta{setup} is run within a group and may
-%   contain any valid input, although only changes in category codes
+%   contain any valid input, although only changes in category codes,
+%   such as uses of \cs{cctab_select:N},
 %   are relevant. See also \cs{tl_rescan:nn}.
 %   \begin{texnote}
 %     The \meta{tokens} are first turned into a string (using
@@ -332,7 +333,8 @@
 %   by the \meta{setup} are those in force at the point of use of
 %   \cs{tl_rescan:nn}.)
 %   The \meta{setup} is run within a group and may
-%   contain any valid input, although only changes in category codes
+%   contain any valid input, although only changes in category codes,
+%   such as uses of \cs{cctab_select:N},
 %   are relevant.  See also \cs{tl_set_rescan:Nnn}, which is more
 %   robust than using \cs{tl_set:Nn} in the \meta{tokens} argument of
 %   \cs{tl_rescan:nn}.
@@ -401,8 +403,21 @@
 %     \tl_if_eq:NNTF \l_tmpa_tl \l_tmpb_tl { true } { false }
 %   \end{verbatim}
 %   yields \texttt{false}.
+%   See also \cs{str_if_eq:nnTF} for a comparison that ignores category codes.
 % \end{function}
 %
+% \begin{function}[TF, added = 2020-07-14]{\tl_if_eq:Nn, \tl_if_eq:cn}
+%   \begin{syntax}
+%     \cs{tl_if_eq:NnTF} \meta{tl~var_1} \Arg{token list_2} \Arg{true code} \Arg{false code}
+%   \end{syntax}
+%   Tests if the \meta{token list variable_1} and the \meta{token
+%   list_2} contain the same list of tokens, both in respect of
+%   character codes and category codes.  This conditional is not
+%   expandable: see \cs{tl_if_eq:NNTF} for an expandable version when
+%   both token lists are stored in variables, or \cs{str_if_eq:nnTF} if
+%   category codes are not important.
+% \end{function}
+%
 % \begin{function}[TF]{\tl_if_eq:nn}
 %   \begin{syntax}
 %     \cs{tl_if_eq:nnTF} \Arg{token list_1} \Arg{token list_2} \Arg{true code} \Arg{false code}
@@ -409,7 +424,9 @@
 %   \end{syntax}
 %   Tests if \meta{token list_1} and \meta{token list_2} contain the
 %   same list of tokens, both in respect of character codes and category
-%   codes.
+%   codes.  This conditional is not expandable: see \cs{tl_if_eq:NNTF}
+%   for an expandable version when token lists are stored in variables,
+%   or \cs{str_if_eq:nnTF} if category codes are not important.
 % \end{function}
 %
 % \begin{function}[TF]{\tl_if_in:Nn, \tl_if_in:cn}
@@ -1203,7 +1220,7 @@
 %   will \emph{not} match the simple text input |-NoValue-|, \emph{i.e.}
 %   that
 %   \begin{verbatim}
-%     \tl_if_eq:VnTF \c_novalue_tl { -NoValue- }
+%     \tl_if_eq:NnTF \c_novalue_tl { -NoValue- }
 %   \end{verbatim}
 %   is logically \texttt{false}. The \cs{c_novalue_tl} marker is intended for
 %   use in creating document-level interfaces, where it serves as an indicator
@@ -2125,10 +2142,36 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[TF]{\tl_if_eq:nn}
 % \begin{variable}{\l_@@_internal_a_tl, \l_@@_internal_b_tl}
+%   Temporary storage.
+%    \begin{macrocode}
+\tl_new:N \l_@@_internal_a_tl
+\tl_new:N \l_@@_internal_b_tl
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[TF]{\tl_if_eq:Nn}
 %   A simple store and compare routine.
 %    \begin{macrocode}
+\prg_new_protected_conditional:Npnn \tl_if_eq:Nn #1#2 { T , F , TF }
+  {
+    \group_begin:
+      \tl_set:Nn \l_@@_internal_b_tl {#2}
+      \exp_after:wN
+    \group_end:
+    \if_meaning:w #1 \l_@@_internal_b_tl
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
+\prg_generate_conditional_variant:Nnn \tl_if_eq:Nn { c } { TF , T , F }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[TF]{\tl_if_eq:nn}
+%   A simple store and compare routine.
+%    \begin{macrocode}
 \prg_new_protected_conditional:Npnn \tl_if_eq:nn #1#2 { T , F ,  TF }
   {
     \group_begin:
@@ -2142,10 +2185,7 @@
       \prg_return_false:
     \fi:
   }
-\tl_new:N \l_@@_internal_a_tl
-\tl_new:N \l_@@_internal_b_tl
 %    \end{macrocode}
-% \end{variable}
 % \end{macro}
 %
 % \begin{macro}[TF]{\tl_if_in:Nn, \tl_if_in:cn}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %
@@ -992,11 +992,7 @@
 %     other engines) and category code~$13$.
 %   \item A character token, characterized by its character code and
 %     category code (one of $1$, $2$, $3$, $4$, $6$, $7$, $8$, $10$,
-%     $11$ or~$12$ whose meaning is described below).\footnote{In
-%     \LuaTeX{}, there is also the case of \enquote{bytes}, which behave as
-%     character tokens of category code $12$~(other) and character code
-%     between $1114112$ and~$1114366$.  They are used to output
-%     individual bytes to files, rather than UTF-8.}
+%     $11$ or~$12$ whose meaning is described below).
 % \end{itemize}
 % There are also a few internal tokens.  The following list may be
 % incomplete in some engines.
@@ -1017,6 +1013,19 @@
 %   \item Tricky programming might access a frozen |\endwrite|.
 %   \item Some frozen tokens can only be accessed in interactive
 %     sessions: |\cr|, |\right|, |\endgroup|, |\fi|, |\inaccessible|.
+%   \item In \LuaTeX{}, there is also the strange case of \enquote{bytes}
+%     |^^^^^^1100|$x$$y$ where $x,y$ are any two lowercase hexadecimal
+%     digits, so that the hexadecimal number ranges from
+%     $"\text{110000}=1114112$ to~$"\text{1100ff}=1114367$.  These are
+%     used to output individual bytes to files, rather than UTF-8.  For
+%     the purposes of token comparisons they behave like non-expandable
+%     primitive control sequences (\emph{not characters}) whose
+%     \tn{meaning} is \verb*|the character | followed by the given byte.
+%     If this byte is in the range |80|--|ff| this gives an ``invalid
+%     utf-8 sequence'' error: applying \cs{token_to_str:N} or
+%     \cs{token_to_meaning:N} to these tokens is unsafe.  Unfortunately,
+%     they don't seem to be detectable safely by any means except perhaps
+%     Lua code.
 % \end{itemize}
 %
 % The meaning of a (non-active) character token is fixed by its category
@@ -1028,7 +1037,7 @@
 % \begin{itemize}
 %   \item[1] begin-group character (|group_begin|, often |{|),
 %   \item[2] end-group character (|group_end|, often |}|),
-%   \item[3] math shift character (|math_toggle|, often |$|),
+%   \item[3] math shift character (|math_toggle|, often |$|), %^^A $
 %   \item[4] alignment tab character (|alignment|, often |&|),
 %   \item[6] macro parameter character (|parameter|, often |#|),
 %   \item[7] superscript character (|math_superscript|, often |^|),
@@ -1058,19 +1067,17 @@
 %   \item a font selection command,
 %   \item undefined.
 % \end{itemize}
-% Macros be \tn{protected} or not, \tn{long} or not (the opposite of
+% Macros can be \tn{protected} or not, \tn{long} or not (the opposite of
 % what \LaTeX3 calls |nopar|), and \tn{outer} or not (unused in
 % \LaTeX3).  Their \tn{meaning} takes the form
 % \begin{quote}
-%   \meta{properties} |macro:|\meta{parameters}|->|\meta{replacement}
+%   \meta{prefix} |macro:|\meta{argument}|->|\meta{replacement}
 % \end{quote}
-% where \meta{properties} is among \tn{protected}\tn{long}\tn{outer},
-% \meta{parameters} describes parameters that the macro expects, such as
+% where \meta{prefix} is among \tn{protected}\tn{long}\tn{outer},
+% \meta{argument} describes parameters that the macro expects, such as
 % |#1#2#3|, and \meta{replacement} describes how the parameters are
-% manipulated, such as~|#2/#1/#3|.
+% manipulated, such as~|\int_eval:n{#2+#1*#3}|.
 %
-% ^^A todo Bruno: discuss here some other subtleties of space tokens? when looking for numbers, when looking for equal signs in let, in expressions, etc.
-%
 % Now is perhaps a good time to mention some subtleties relating to
 % tokens with category code $10$ (space).  Any input character with this
 % category code (normally, space and tab characters) becomes a normal
@@ -1087,6 +1094,13 @@
 % single tokens \enquote{N-type}, as they are suitable to be used as an
 % argument for a function with the signature~\texttt{:N}.
 %
+% When a macro takes a delimited argument \TeX{} scans ahead until
+% finding the delimiter (outside any pairs of begin-group/end-group
+% explicit characters), and the resulting list of tokens (with outer
+% braces removed) becomes the argument.  Note that explicit space
+% characters at the start of the argument are \emph{not} ignored in this
+% case (and they prevent brace-stripping).
+%
 % \end{documentation}
 %
 % \begin{implementation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty	2020-07-17 21:45:53 UTC (rev 55860)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3benchmark.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3benchmark}{2020-06-18}{}
+\ProvidesExplPackage{l3benchmark}{2020-07-17}{}
   {L3 Experimental benchmarking}
 \sys_if_engine_luatex:TF
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty	2020-07-17 21:45:53 UTC (rev 55860)
@@ -20,30 +20,24 @@
 %% 
 %% File: l3color.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3color}{2020-06-18}{}
+\ProvidesExplPackage{l3color}{2020-07-17}{}
   {L3 Experimental color support}
 \tl_new:N \l__color_internal_tl
 \scan_new:N \s__color_mark
 \prg_new_conditional:Npnn \__color_if_defined:n #1 { T, F, TF }
   {
-    \tl_if_exist:cTF { l__color_named_ #1 _tl }
+    \prop_if_exist:cTF { l__color_named_ #1 _prop }
       \prg_return_true:
       \prg_return_false:
   }
+\cs_new:Npn \__color_model:N #1 { \exp_after:wN \use_i:nn #1 }
+\cs_new:Npn \__color_values:N #1 { \exp_after:wN \use_ii:nn #1 }
 \cs_new_protected:Npn \__color_extract:nNN #1#2#3
   {
-    \exp_after:wN \exp_after:wN \exp_after:wN
-      \__color_extract:NNnn
-      \exp_after:wN \exp_after:wN \exp_after:wN #2
-      \exp_after:wN \exp_after:wN \exp_after:wN #3
-        \cs:w l__color_named_ #1 _tl \cs_end:
+    \tl_set_eq:Nc #2 { l__color_named_ #1 _tl }
+    \prop_get:cVN { l__color_named_ #1 _prop } #2 #3
   }
 \cs_generate_variant:Nn \__color_extract:nNN { V }
-\cs_new_protected:Npn \__color_extract:NNnn #1#2#3#4
-  {
-    \tl_set:Nn #1 {#3}
-    \tl_set:Nn #2 {#4}
-  }
 \cs_new_protected:Npn \__color_convert:nnN #1#2#3
   { \__color_convert:nnVN {#1} {#2} #3 #3 }
 \cs_generate_variant:Nn \__color_convert:nnN { VV }
@@ -54,7 +48,7 @@
     \tl_set:Nx #4
       { \use:c { __color_convert_ #1 _ #2 :w } #3 ~ 0 ~ 0 ~ 0 \s__color_stop }
   }
-\cs_generate_variant:Nn \__color_convert:nnnN { nnV }
+\cs_generate_variant:Nn \__color_convert:nnnN { nV , nnV }
 \cs_new:Npn \__color_convert_gray_rgb:w #1 ~ #2 \s__color_stop
   { #1 ~ #1 ~ #1 }
 \cs_new:Npn \__color_convert_gray_cmyk:w #1 ~ #2 \s__color_stop
@@ -85,30 +79,61 @@
 \tl_new:N \l__color_value_tl
 \tl_new:N \l__color_next_model_tl
 \tl_new:N \l__color_next_value_tl
-\cs_new_protected:Npn \color_parse:nN #1#2
+\cs_new_protected:Npx \__color_parse:nN #1#2
   {
-    \__color_backend_pickup:N \l__color_current_tl
-    \tl_set_eq:cN { l__color_named_ . _tl } \l__color_current_tl
-    \exp_args:Ne \__color_parse:nN { \tl_to_str:n {#1} } #2
+    \exp_not:N \__color_backend_pickup:N \exp_not:N \l__color_current_tl
+    \tl_set:Nx \exp_not:c { l__color_named_ . _tl }
+      { \exp_not:N \__color_model:N \exp_not:N \l__color_current_tl }
+    \prop_put:NVx \exp_not:c { l__color_named_ . _prop }
+      \exp_not:c { l__color_named_ . _tl }
+      { \exp_not:N \__color_values:N \exp_not:N \l__color_current_tl }
+    \exp_not:N \exp_args:Ne \exp_not:N \__color_parse_aux:nN
+      { \exp_not:N \tl_to_str:n {#1} } #2
   }
-\cs_new_protected:Npn \__color_parse:nN #1#2
+\cs_new_protected:Npn \__color_parse_aux:nN #1#2
   {
-    \tl_if_exist:cTF { l__color_named_ #1 _tl }
-      { \tl_set_eq:Nc #2 { l__color_named_ #1 _tl } }
+    \tl_if_exist:cTF { l__color_named_ #1 _prop }
+      { \__color_parse_set_eq:Nn #2 {#1} }
       { \__color_parse:Nw #2#1 ! \s__color_stop }
     \__color_check_model:N #2
   }
+\cs_new_protected:Npn \__color_parse_set_eq:Nn #1#2
+  {
+    \tl_if_empty:NTF \l_color_fixed_model_tl
+       { \exp_args:Nv \__color_parse_set_eq:nNn { l__color_named_ #2 _tl } }
+       { \exp_args:NV \__color_parse_set_eq:nNn \l_color_fixed_model_tl }
+         #1 {#2}
+  }
+\cs_new_protected:Npn \__color_parse_set_eq:nNn #1#2#3
+  {
+    \prop_get:cnNTF
+      { l__color_named_ #3 _prop } {#1}
+      \l__color_value_tl
+      { \tl_set:Nx #2 { {#1} { \l__color_value_tl } } }
+      {
+        \tl_set_eq:Nc \l__color_model_tl { l__color_named_ #3 _tl }
+        \prop_get:cVN { l__color_named_ #3 _prop } \l__color_model_tl
+          \l__color_value_tl
+         \__color_convert:nnN
+           \l__color_model_tl {#1} \l__color_value_tl
+        \tl_set:Nx #2
+          {
+            {#1}
+            { \l__color_value_tl }
+          }
+      }
+  }
 \cs_new_protected:Npn \__color_parse:Nw #1#2 ! #3 \s__color_stop
   {
     \__color_if_defined:nTF {#2}
       {
         \tl_if_blank:nTF {#3}
-          { \tl_set_eq:Nc #1 { l__color_named_ #2 _tl } }
+          { \__color_parse_set_eq:Nn #1 {#2} }
           { \__color_parse_loop_init:Nnn #1 {#2} {#3} }
       }
       {
         \__kernel_msg_error:nnn { color } { unknown-color } {#2}
-        \tl_set_eq:NN \l__color_current_tl \l__color_named_black_tl
+        \tl_set:Nn \l__color_current_tl { { gray } { 0 } }
       }
   }
 \cs_new_protected:Npn \__color_parse_loop_init:Nnn #1#2#3
@@ -153,24 +178,9 @@
         \__color_extract:nNN {#2} \l__color_next_model_tl \l__color_next_value_tl
         \tl_if_eq:NNF \l__color_model_tl \l__color_next_model_tl
           {
-            \str_if_eq:VnT \l__color_model_tl { gray }
-              {
-                \use:x
-                  {
-                    \tl_set:Nn \exp_not:N \l__color_model_tl
-                      { \l__color_next_model_tl }
-                    \tl_set:Nn \exp_not:N \l__color_value_tl
-                      { \l__color_next_value_tl }
-                    \tl_set:Nn \exp_not:N \l_next__color_model_tl
-                      { \l__color_model_tl }
-                    \tl_set:Nn \exp_not:N \l_next__color_value_tl
-                      { \l__color_value_tl }
-                  }
-              }
-            \__color_convert:VVN
-              \l__color_next_model_tl
-              \l__color_model_tl
-              \l__color_next_value_tl
+            \str_if_eq:VnTF \l__color_model_tl { gray }
+              { \__color_parse_gray:n {#2} }
+              { \__color_parse_std:n {#2} }
           }
         \tl_set:Nx \l__color_value_tl
           {
@@ -184,6 +194,27 @@
         \__color_parse_break:w
       }
   }
+\cs_new_protected:Npn \__color_parse_gray:n #1
+  {
+    \tl_set_eq:NN \l__color_model_tl \l__color_next_model_tl
+    \tl_set:Nn \l__color_next_model_tl { gray }
+    \exp_args:NnV \__color_convert:nnN { gray } \l__color_model_tl
+      \l__color_value_tl
+    \prop_get:cVN { l__color_named_ #1 _prop } \l__color_model_tl
+      \l__color_next_value_tl
+  }
+\cs_new_protected:Npn \__color_parse_std:n #1
+  {
+    \prop_get:cVNF { l__color_named_ #1 _prop }
+      \l__color_model_tl
+      \l__color_next_value_tl
+        {
+          \__color_convert:VVN
+            \l__color_next_model_tl
+            \l__color_model_tl
+            \l__color_next_value_tl
+        }
+  }
 \cs_new_protected:Npn \__color_parse_break:w #1 \__color_parse_end: { }
 \cs_new_protected:Npn \__color_parse_end: { }
 \cs_new:Npn \__color_parse_mix:Nnnn #1#2#3#4
@@ -334,60 +365,148 @@
     \tl_set:Nn \l__color_model_tl {#1}
     \tl_set:Nn \l__color_value_tl {#2}
   }
-\cs_new_protected:Npn \__color_select:
+\cs_new_protected:Npx \__color_select:
   {
-    \tl_set_eq:cN { l__color_named_ . _tl } \l__color_current_tl
-    \__color_select:N \l__color_current_tl
+    \tl_set:Nx \exp_not:c { l__color_named_ . _tl }
+      { \exp_not:N \__color_model:N \exp_not:N \l__color_current_tl }
+    \prop_clear:N \exp_not:c { l__color_named_ . _prop }
+    \prop_put:NVx \exp_not:c { l__color_named_ . _prop }
+      \exp_not:c { l__color_named_ . _tl }
+      { \exp_not:N \__color_values:N \exp_not:N \l__color_current_tl }
+    \__color_select:N \exp_not:N \l__color_current_tl
   }
 \cs_new_protected:Npn \color_select:n #1
   {
-    \color_parse:nN {#1} \l__color_current_tl
+    \__color_parse:nN {#1} \l__color_current_tl
     \__color_select:
   }
 \cs_new_protected:Npn \color_select:nn #1#2
   {
-    \__color_direct:nnN {#1} {#2} \l__color_current_tl
+    \__color_select_main:Nw \l__color_current_tl
+      #1 / / \s__color_mark #2 / / \s__color_stop
     \__color_select:
   }
-\cs_new_protected:Npn \__color_direct:nnN #1#2#3
+\cs_new_protected:Npn \__color_select_main:Nw
+  #1 #2 / #3 / #4 \s__color_mark #5 / #6 / #7 \s__color_stop
   {
+    \__color_select:nnN {#2} {#5} #1
+    \bool_lazy_or:nnF
+      { \tl_if_empty_p:N \l_color_fixed_model_tl }
+      { \str_if_eq_p:nV {#2} \l_color_fixed_model_tl }
+      { \__color_select_loop:Nw #1 #3 / #4 \s__color_mark #6 / #7 \s__color_stop }
+  }
+\cs_new_protected:Npn \__color_select_loop:Nw
+  #1 #2 / #3 \s__color_mark #4 / #5 \s__color_stop
+  {
+    \str_if_eq:nVTF {#2} \l_color_fixed_model_tl
+      { \__color_select:nnN {#2} {#4} #1 }
+      {
+        \tl_if_blank:nTF {#2}
+          { \exp_after:wN \__color_select_swap:Nnn \exp_after:wN #1 #1 }
+          { \__color_select_loop:Nw #1 #3 \s__color_mark #5 \s__color_stop }
+      }
+  }
+\cs_new_protected:Npn \__color_select:nnN #1#2#3
+  {
     \cs_if_exist:cTF { __color_parse_model_ #1 :w }
       {
         \tl_set:Nx #3
           { \use:c { __color_parse_model_ #1 :w } #2 , 0 , 0 , 0 , 0 \s__color_stop }
-        \__color_check_model:N #3
       }
-      {
-        \__kernel_msg_error:nnn { color } { unknown-model } {#1}
-      }
+      { \__kernel_msg_error:nnn { color } { unknown-model } {#1} }
   }
+\cs_new_protected:Npn \__color_select_swap:Nnn #1#2#3
+  {
+    \__color_convert:nVnN {#2} \l_color_fixed_model_tl {#3} \l__color_value_tl
+    \tl_set:Nx #1
+      { { \l_color_fixed_model_tl } { \l__color_value_tl } }
+  }
 \tl_new:N \l__color_named_tl
-\cs_new_protected:Npn \__color_store:Nn #1#2
+\cs_new_protected:Npn \color_set:nn #1#2
   {
-    \str_if_eq:nnF {#2} { . }
+    \exp_args:NV \__color_set:nnn
+      \l_color_fixed_model_tl {#1} {#2}
+  }
+\cs_new_protected:Npn \__color_set:nnn #1#2#3
+  {
+    \tl_clear:N \l_color_fixed_model_tl
+    \__color_set:nn {#2} {#3}
+    \tl_set:Nn \l_color_fixed_model_tl {#1}
+  }
+\cs_new_protected:Npn \__color_set:nn #1#2
+  {
+    \str_if_eq:nnF {#1} { . }
       {
-        \tl_clear_new:c { l__color_named_ #2 _tl }
-        \tl_set_eq:cN { l__color_named_ #2 _tl } #1
+        \__color_parse:nN {#2} \l__color_named_tl
+        \tl_clear_new:c { l__color_named_ #1 _tl }
+        \tl_set:cx { l__color_named_ #1 _tl }
+          { \__color_model:N \l__color_named_tl }
+        \prop_clear_new:c { l__color_named_ #1 _prop }
+        \prop_put:cvx { l__color_named_ #1 _prop } { l__color_named_ #1 _tl }
+          { \__color_values:N \l__color_named_tl }
+        \__color_set:nnw {#1} {#2} #2 ! \s__color_stop
       }
   }
-\cs_new_protected:Npn \color_set:nn #1#2
+\cs_new_protected:Npn \__color_set:nnw #1#2#3 ! #4 \s__color_stop
   {
-    \color_parse:nN {#2} \l__color_named_tl
-    \__color_store:Nn \l__color_named_tl {#1}
+    \clist_map_inline:nn { cmyk , gray , rgb }
+      {
+        \prop_get:cnNT { l__color_named_ #3 _prop } {##1} \l__color_internal_tl
+          {
+            \prop_if_in:cnF { l__color_named_ #1 _prop } {##1}
+              {
+                \group_begin:
+                  \tl_set:cn { l__color_named_ #3 _tl } {##1}
+                  \__color_parse:nN {#2} \l__color_internal_tl
+                \exp_args:NNNV \group_end:
+                \tl_set:Nn \l__color_internal_tl \l__color_internal_tl
+                \prop_put:cxx { l__color_named_ #1 _prop }
+                  { \__color_model:N \l__color_internal_tl }
+                  { \__color_values:N \l__color_internal_tl }
+              }
+          }
+      }
   }
 \cs_new_protected:Npn \color_set:nnn #1#2#3
   {
-    \__color_direct:nnN {#2} {#3} \l__color_named_tl
-    \__color_store:Nn \l__color_named_tl {#1}
+    \str_if_eq:nnF {#1} { . }
+      {
+        \tl_clear_new:c { l__color_named_ #1 _tl }
+        \prop_clear_new:c { l__color_named_ #1 _prop }
+        \__color_set_loop:nw {#1} #2 / / \s__color_mark #3 / / \s__color_stop
+      }
   }
+\cs_new_protected:Npn \__color_set_loop:nw
+  #1#2 / #3 \s__color_mark #4 / #5 \s__color_stop
+  {
+    \tl_if_blank:nF {#2}
+      {
+        \__color_select:nnN {#2} {#4} \l__color_named_tl
+        \tl_set:Nx \l__color_internal_tl { \__color_model:N \l__color_named_tl }
+        \tl_if_empty:cT { l__color_named_ #1 _tl }
+          { \tl_set_eq:cN { l__color_named_ #1 _tl } \l__color_internal_tl }
+        \prop_put:cVx { l__color_named_ #1 _prop } \l__color_internal_tl
+          { \__color_values:N \l__color_named_tl }
+        \__color_set_loop:nw {#1} #3 \s__color_mark #5 \s__color_stop
+      }
+  }
 \cs_new_protected:Npn \color_set_eq:nn #1#2
   {
     \__color_if_defined:nTF {#2}
       {
         \tl_clear_new:c { l__color_named_ #1 _tl }
+        \prop_clear_new:c { l__color_named_ #1 _prop }
         \str_if_eq:nnTF {#2} { . }
-          { \tl_set_eq:cN { l__color_named_ #1 _tl } \l__color_current_tl }
-          { \tl_set_eq:cc { l__color_named_ #1 _tl } { l__color_named_ #2 _tl } }
+          {
+            \tl_set:cx { l__color_named_ #1 _tl }
+              { \__color_model:N \l__color_current_tl }
+            \prop_put:cvx { l__color_named_ #1 _prop } { l__color_named_ #1 _tl }
+              { \__color_values:N \l__color_current_tl }
+          }
+          {
+            \tl_set_eq:cc { l__color_named_ #1 _tl } { l__color_named_ #2 _tl }
+            \prop_set_eq:cc { l__color_named_ #1 _prop } { l__color_named_ #2 _prop }
+          }
       }
       {
         \__kernel_msg_error:nnn { color } { unknown-color } {#2}
@@ -401,24 +520,101 @@
 \color_set:nnn { red }   { rgb } { 1 , 0 , 0 }
 \color_set:nnn { green } { rgb } { 0 , 1 , 0 }
 \color_set:nnn { blue }  { rgb } { 0 , 0 , 1 }
+\prop_new:c { l__color_named_._prop }
 \tl_new:c { l__color_named_._tl }
-\tl_set_eq:cN { l__color_named_._tl } \l__color_current_tl
+\tl_set:cx { l__color_named_._tl } { \__color_model:N \l__color_current_tl }
+\cs_new_protected:Npn \color_export:nnN #1#2#3
+  {
+    \group_begin:
+      \tl_if_exist:cT { c__color_export_ #2 _tl }
+        { \tl_set_eq:Nc \l_color_fixed_model_tl { c__color_export_ #2 _tl } }
+      \__color_parse:nN {#1} #3
+      \__color_export:nN {#2} #3
+    \exp_args:NNNV \group_end:
+    \tl_set:Nn #3 #3
+  }
+\cs_new_protected:Npn \color_export:nnnN #1#2#3#4
+  {
+    \__color_select_main:Nw #4
+      #1 / / \s__color_mark #2 / / \s__color_stop
+    \__color_export:nN {#3} #4
+  }
+\cs_new_protected:Npn \__color_export:nN #1#2
+  { \exp_after:wN \__color_export:nnnN #2 {#1} #2 }
+\cs_new:Npn \__color_export:nnnN #1#2#3#4
+  {
+    \cs_if_exist_use:cF { __color_export_format_ #3 :nnN }
+      {
+        \__kernel_msg_error:nnn { color } { unknown-export-format } {#3}
+        \use_none:nnn
+      }
+        {#1} {#2} #4
+  }
+\cs_new_protected:Npn \__color_export_format_backend:nnN #1#2#3
+  { \tl_set:Nn #3 { {#1} {#2} } }
+\cs_new_protected:Npn \__color_export:nnnNN #1#2#3#4#5
+  {
+    \str_if_eq:nnTF {#2} {#1}
+      { #5 #4 #3 \s__color_stop }
+      {
+        \__color_convert:nnnN {#2} {#1} {#3} #4
+        \exp_after:wN #5 \exp_after:wN #4
+          #4 \s__color_stop
+      }
+  }
+\tl_const:Nn \c__color_export_HTML_tl { rgb }
+\tl_const:cn { c__color_export_space-sep-cmyk_tl } { cmyk }
+\tl_const:cn { c__color_export_space-sep-rgb_tl } { rgb }
+\cs_new_protected:cpx { __color_export_format_space-sep-cmyk:nnN } #1#2#3
+  {
+    \exp_not:N \__color_export:nnnNN { cmyk } {#1} {#2} #3
+      \exp_not:c { __color_export_space-sep-cmyk:Nw }
+  }
+\cs_new_protected:cpn { __color_export_space-sep-cmyk:Nw } #1#2 \s__color_stop
+  { \tl_set:Nx #1 {#2} }
+\cs_new_protected:Npn \__color_export_format_HTML:nnN #1#2#3
+  { \__color_export:nnnNN { rgb } {#1} {#2}#3 \__color_export_HTML:Nw }
+\cs_new_protected:cpx { __color_export_format_space-sep-rgb:nnN } #1#2#3
+  {
+    \exp_not:N \__color_export:nnnNN { rgb } {#1} {#2} #3
+      \exp_not:c { __color_export_space-sep-rgb:Nw }
+  }
+\cs_new_protected:Npn \__color_export_HTML:Nw #1#2 ~ #3 ~ #4 \s__color_stop
+  {
+    \tl_set:Nx #1
+      {
+        \__color_export_HTML:n {#2}
+        \__color_export_HTML:n {#3}
+        \__color_export_HTML:n {#4}
+      }
+  }
+\cs_new:Npn \__color_export_HTML:n #1
+  {
+    \fp_compare:nNnTF {#1} = { 0 }
+      { 00 }
+      { \int_to_Hex:n { \fp_to_int:n { #1 * 255 } } }
+  }
+\cs_new_protected:cpn { __color_export_space-sep-rgb:Nw } #1#2 \s__color_stop
+  { \tl_set:Nx #1 {#2} }
 \cs_new_protected:Npn \color_show:n #1
   {
     \msg_show:nnxxxx { LaTeX / color } { show }
       {#1}
       {
-        \__color_if_defined:nTF {#1}
-          { \exp_last_unbraced:Nv \__color_show:nn { l__color_named_ #1 _tl } }
-          { }
+        \__color_if_defined:nT {#1}
+          {
+            \exp_args:Nv \__color_show:n { l__color_named_ #1 _tl }
+            \prop_map_function:cN
+              { l__color_named_ #1 _prop }
+              \msg_show_item_unbraced:nn
+          }
       }
       { }
       { }
   }
-\cs_new:Npn \__color_show:nn #1#2
+\cs_new:Npn \__color_show:n #1
   {
     \msg_show_item_unbraced:nn { model } {#1}
-    \msg_show_item_unbraced:nn { value } {#2}
   }
 \__kernel_msg_new:nnnn { color } { unknown-color }
   { Unknown~color~'#1'. }
@@ -426,6 +622,12 @@
     LaTeX~has~been~asked~to~use~a~color~named~'#1',~
     but~this~has~never~been~defined.
   }
+\__kernel_msg_new:nnnn { color } { unknown-export-format }
+  { Unknown~export~format~'#1'. }
+  {
+    LaTeX~has~been~asked~to~export~a~color~in~format~'#1',~
+    but~this~has~never~been~defined.
+  }
 \__kernel_msg_new:nnnn { color } { unknown-model }
   { Unknown~color~model~'#1'. }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty	2020-07-17 21:45:53 UTC (rev 55860)
@@ -28,7 +28,7 @@
 %% 
 %% File: l3draw.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3draw}{2020-06-18}{}
+\ProvidesExplPackage{l3draw}{2020-07-17}{}
   {L3 Experimental core drawing support}
 \RequirePackage { l3color }
 \scan_new:N \s__draw_mark
@@ -1694,7 +1694,7 @@
   { \__draw_color:nn { stroke } {#1} }
 \cs_new_protected:Npn \__draw_color:nn #1#2
   {
-    \color_parse:nN {#2} \l__draw_color_tmp_tl
+    \color_export:nnN {#2} { backend } \l__draw_color_tmp_tl
     \exp_after:wN \__draw_color:nnn \l__draw_color_tmp_tl {#1}
   }
 \cs_new_protected:Npn \__draw_color:nnn #1#2#3

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty	2020-07-17 21:45:53 UTC (rev 55860)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3graphics.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3graphics}{2020-06-18}{}
+\ProvidesExplPackage{l3graphics}{2020-07-17}{}
   {L3 Experimental graphics inclusion support}
 \ior_new:N \l__graphics_tmp_ior
 \tl_new:N  \l__graphics_tmp_tl

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty	2020-07-17 21:45:53 UTC (rev 55860)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3pdf.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3pdf}{2020-06-18}{}
+\ProvidesExplPackage{l3pdf}{2020-07-17}{}
   {L3 Experimental core PDF support}
 \scan_new:N \s__pdf_stop
 \bool_new:N \g__pdf_init_bool

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2020-07-17 21:45:53 UTC (rev 55860)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-format.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-format}{2020-06-18}{}
+\ProvidesExplPackage{l3str-format}{2020-07-17}{}
   {L3 Experimental string formatting}
 \cs_generate_variant:Nn \use:nn { nf }
 \cs_generate_variant:Nn \use:nnn { fnf }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty	2020-07-17 21:45:53 UTC (rev 55860)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3sys-shell.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3sys-shell}{2020-06-18}{}
+\ProvidesExplPackage{l3sys-shell}{2020-07-17}{}
   {L3 Experimental system shell functions}
 \scan_new:N \s__sys_stop
 \quark_new:N \q__sys_nil

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2020-07-17 21:45:53 UTC (rev 55860)
@@ -20,7 +20,7 @@
 %% 
 %% File: xcoffins.dtx
 \RequirePackage{xparse}
-\ProvidesExplPackage{xcoffins}{2020-06-18}{}
+\ProvidesExplPackage{xcoffins}{2020-07-17}{}
   {L3 Experimental design level coffins}
 \keys_define:nn { coffin }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2020-07-17 21:45:53 UTC (rev 55860)
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3galley}{2020-06-18}{}
+\ProvidesExplPackage{l3galley}{2020-07-17}{}
   {L3 Experimental galley code}
 \int_new:N \l__galley_tmp_int
 \seq_new:N \g__galley_tmpa_seq

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2020-07-17 21:45:53 UTC (rev 55860)
@@ -20,7 +20,7 @@
 %% 
 %% File: xgalley.dtx
 \RequirePackage{xparse}
-\ProvidesExplPackage{xgalley}{2020-06-18}{}
+\ProvidesExplPackage{xgalley}{2020-07-17}{}
   {L3 Experimental galley}
 \RequirePackage{xparse,xtemplate,l3galley}
 \clist_new:N \l__galley_tmpa_clist

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2020-07-17 21:45:53 UTC (rev 55860)
@@ -39,6 +39,7 @@
 %% l3fp-convert.dtx  (with options: `package')
 %% l3fp-random.dtx  (with options: `package')
 %% l3fparray.dtx  (with options: `package')
+%% l3cctab.dtx  (with options: `package')
 %% l3sort.dtx  (with options: `package')
 %% l3str-convert.dtx  (with options: `package')
 %% l3tl-analysis.dtx  (with options: `package')
@@ -68,7 +69,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2020-06-18}%
+\def\ExplFileDate{2020-07-17}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -765,9 +766,7 @@
   \__kernel_primitive:NN \pdfuniqueresname      \tex_pdfuniqueresname:D
   \__kernel_primitive:NN \pdfvorigin            \tex_pdfvorigin:D
   \__kernel_primitive:NN \pdfxform              \tex_pdfxform:D
-  \__kernel_primitive:NN \pdfxformattr          \tex_pdfxformattr:D
   \__kernel_primitive:NN \pdfxformname          \tex_pdfxformname:D
-  \__kernel_primitive:NN \pdfxformresources     \tex_pdfxformresources:D
   \__kernel_primitive:NN \pdfximage             \tex_pdfximage:D
   \__kernel_primitive:NN \pdfximagebbox         \tex_pdfximagebbox:D
   \__kernel_primitive:NN \ifpdfabsdim           \tex_ifabsdim:D
@@ -1046,7 +1045,7 @@
   \__kernel_primitive:NN \normaldeviate         \tex_normaldeviate:D
   \__kernel_primitive:NN \outputmode            \tex_pdfoutput:D
   \__kernel_primitive:NN \pageheight            \tex_pageheight:D
-  \__kernel_primitive:NN \pagewidth             \tex_pagewith:D
+  \__kernel_primitive:NN \pagewidth             \tex_pagewidth:D
   \__kernel_primitive:NN \protrudechars         \tex_protrudechars:D
   \__kernel_primitive:NN \pxdimen               \tex_pxdimen:D
   \__kernel_primitive:NN \randomseed            \tex_randomseed:D
@@ -1305,10 +1304,12 @@
 \tex_endgroup:D
 \tex_ifdefined:D \@@end
   \tex_let:D \tex_end:D                  \@@end
+  \tex_let:D \tex_input:D                \@@input
+\tex_fi:D
+\tex_ifdefined:D \@@hyph
   \tex_let:D \tex_everydisplay:D         \frozen at everydisplay
   \tex_let:D \tex_everymath:D            \frozen at everymath
   \tex_let:D \tex_hyphen:D               \@@hyph
-  \tex_let:D \tex_input:D                \@@input
   \tex_let:D \tex_italiccorrection:D     \@@italiccorr
   \tex_let:D \tex_underline:D            \@@underline
   \tex_ifdefined:D \@@shipout
@@ -1473,638 +1474,6 @@
   \tex_let:D \tex_middle:D \normalmiddle
   \tex_let:D \tex_right:D  \normalright
 \tex_fi:D
-\tex_begingroup:D
-  \tex_long:D \tex_def:D \use_ii:nn #1#2 {#2}
-  \tex_long:D \tex_def:D \use_none:n #1 { }
-  \tex_long:D \tex_def:D \__kernel_primitive:NN #1#2
-    {
-      \tex_ifdefined:D #1
-        \tex_expandafter:D \use_ii:nn
-      \tex_fi:D
-        \use_none:n { \tex_global:D \tex_let:D #2 #1 }
-    }
-  \tex_xdef:D \__kernel_primitives:
-    {
-      \tex_unexpanded:D
-        {
-  \__kernel_primitive:NN \beginL                \etex_beginL:D
-  \__kernel_primitive:NN \beginR                \etex_beginR:D
-  \__kernel_primitive:NN \botmarks              \etex_botmarks:D
-  \__kernel_primitive:NN \clubpenalties         \etex_clubpenalties:D
-  \__kernel_primitive:NN \currentgrouplevel     \etex_currentgrouplevel:D
-  \__kernel_primitive:NN \currentgrouptype      \etex_currentgrouptype:D
-  \__kernel_primitive:NN \currentifbranch       \etex_currentifbranch:D
-  \__kernel_primitive:NN \currentiflevel        \etex_currentiflevel:D
-  \__kernel_primitive:NN \currentiftype         \etex_currentiftype:D
-  \__kernel_primitive:NN \detokenize            \etex_detokenize:D
-  \__kernel_primitive:NN \dimexpr               \etex_dimexpr:D
-  \__kernel_primitive:NN \displaywidowpenalties
-    \etex_displaywidowpenalties:D
-  \__kernel_primitive:NN \endL                  \etex_endL:D
-  \__kernel_primitive:NN \endR                  \etex_endR:D
-  \__kernel_primitive:NN \eTeXrevision          \etex_eTeXrevision:D
-  \__kernel_primitive:NN \eTeXversion           \etex_eTeXversion:D
-  \__kernel_primitive:NN \everyeof              \etex_everyeof:D
-  \__kernel_primitive:NN \firstmarks            \etex_firstmarks:D
-  \__kernel_primitive:NN \fontchardp            \etex_fontchardp:D
-  \__kernel_primitive:NN \fontcharht            \etex_fontcharht:D
-  \__kernel_primitive:NN \fontcharic            \etex_fontcharic:D
-  \__kernel_primitive:NN \fontcharwd            \etex_fontcharwd:D
-  \__kernel_primitive:NN \glueexpr              \etex_glueexpr:D
-  \__kernel_primitive:NN \glueshrink            \etex_glueshrink:D
-  \__kernel_primitive:NN \glueshrinkorder       \etex_glueshrinkorder:D
-  \__kernel_primitive:NN \gluestretch           \etex_gluestretch:D
-  \__kernel_primitive:NN \gluestretchorder      \etex_gluestretchorder:D
-  \__kernel_primitive:NN \gluetomu              \etex_gluetomu:D
-  \__kernel_primitive:NN \ifcsname              \etex_ifcsname:D
-  \__kernel_primitive:NN \ifdefined             \etex_ifdefined:D
-  \__kernel_primitive:NN \iffontchar            \etex_iffontchar:D
-  \__kernel_primitive:NN \interactionmode       \etex_interactionmode:D
-  \__kernel_primitive:NN \interlinepenalties    \etex_interlinepenalties:D
-  \__kernel_primitive:NN \lastlinefit           \etex_lastlinefit:D
-  \__kernel_primitive:NN \lastnodetype          \etex_lastnodetype:D
-  \__kernel_primitive:NN \marks                 \etex_marks:D
-  \__kernel_primitive:NN \middle                \etex_middle:D
-  \__kernel_primitive:NN \muexpr                \etex_muexpr:D
-  \__kernel_primitive:NN \mutoglue              \etex_mutoglue:D
-  \__kernel_primitive:NN \numexpr               \etex_numexpr:D
-  \__kernel_primitive:NN \pagediscards          \etex_pagediscards:D
-  \__kernel_primitive:NN \parshapedimen         \etex_parshapedimen:D
-  \__kernel_primitive:NN \parshapeindent        \etex_parshapeindent:D
-  \__kernel_primitive:NN \parshapelength        \etex_parshapelength:D
-  \__kernel_primitive:NN \predisplaydirection   \etex_predisplaydirection:D
-  \__kernel_primitive:NN \protected             \etex_protected:D
-  \__kernel_primitive:NN \readline              \etex_readline:D
-  \__kernel_primitive:NN \savinghyphcodes       \etex_savinghyphcodes:D
-  \__kernel_primitive:NN \savingvdiscards       \etex_savingvdiscards:D
-  \__kernel_primitive:NN \scantokens            \etex_scantokens:D
-  \__kernel_primitive:NN \showgroups            \etex_showgroups:D
-  \__kernel_primitive:NN \showifs               \etex_showifs:D
-  \__kernel_primitive:NN \showtokens            \etex_showtokens:D
-  \__kernel_primitive:NN \splitbotmarks         \etex_splitbotmarks:D
-  \__kernel_primitive:NN \splitdiscards         \etex_splitdiscards:D
-  \__kernel_primitive:NN \splitfirstmarks       \etex_splitfirstmarks:D
-  \__kernel_primitive:NN \TeXXeTstate           \etex_TeXXeTstate:D
-  \__kernel_primitive:NN \topmarks              \etex_topmarks:D
-  \__kernel_primitive:NN \tracingassigns        \etex_tracingassigns:D
-  \__kernel_primitive:NN \tracinggroups         \etex_tracinggroups:D
-  \__kernel_primitive:NN \tracingifs            \etex_tracingifs:D
-  \__kernel_primitive:NN \tracingnesting        \etex_tracingnesting:D
-  \__kernel_primitive:NN \tracingscantokens     \etex_tracingscantokens:D
-  \__kernel_primitive:NN \unexpanded            \etex_unexpanded:D
-  \__kernel_primitive:NN \unless                \etex_unless:D
-  \__kernel_primitive:NN \widowpenalties        \etex_widowpenalties:D
-  \__kernel_primitive:NN \pdfannot              \pdftex_pdfannot:D
-  \__kernel_primitive:NN \pdfcatalog            \pdftex_pdfcatalog:D
-  \__kernel_primitive:NN \pdfcompresslevel      \pdftex_pdfcompresslevel:D
-  \__kernel_primitive:NN \pdfcolorstack         \pdftex_pdfcolorstack:D
-  \__kernel_primitive:NN \pdfcolorstackinit     \pdftex_pdfcolorstackinit:D
-  \__kernel_primitive:NN \pdfcreationdate       \pdftex_pdfcreationdate:D
-  \__kernel_primitive:NN \pdfdecimaldigits      \pdftex_pdfdecimaldigits:D
-  \__kernel_primitive:NN \pdfdest               \pdftex_pdfdest:D
-  \__kernel_primitive:NN \pdfdestmargin         \pdftex_pdfdestmargin:D
-  \__kernel_primitive:NN \pdfendlink            \pdftex_pdfendlink:D
-  \__kernel_primitive:NN \pdfendthread          \pdftex_pdfendthread:D
-  \__kernel_primitive:NN \pdffontattr           \pdftex_pdffontattr:D
-  \__kernel_primitive:NN \pdffontname           \pdftex_pdffontname:D
-  \__kernel_primitive:NN \pdffontobjnum         \pdftex_pdffontobjnum:D
-  \__kernel_primitive:NN \pdfgamma              \pdftex_pdfgamma:D
-  \__kernel_primitive:NN \pdfimageapplygamma    \pdftex_pdfimageapplygamma:D
-  \__kernel_primitive:NN \pdfimagegamma         \pdftex_pdfimagegamma:D
-  \__kernel_primitive:NN \pdfgentounicode       \pdftex_pdfgentounicode:D
-  \__kernel_primitive:NN \pdfglyphtounicode     \pdftex_pdfglyphtounicode:D
-  \__kernel_primitive:NN \pdfhorigin            \pdftex_pdfhorigin:D
-  \__kernel_primitive:NN \pdfimagehicolor       \pdftex_pdfimagehicolor:D
-  \__kernel_primitive:NN \pdfimageresolution    \pdftex_pdfimageresolution:D
-  \__kernel_primitive:NN \pdfincludechars       \pdftex_pdfincludechars:D
-  \__kernel_primitive:NN \pdfinclusioncopyfonts
-    \pdftex_pdfinclusioncopyfonts:D
-  \__kernel_primitive:NN \pdfinclusionerrorlevel
-    \pdftex_pdfinclusionerrorlevel:D
-  \__kernel_primitive:NN \pdfinfo               \pdftex_pdfinfo:D
-  \__kernel_primitive:NN \pdflastannot          \pdftex_pdflastannot:D
-  \__kernel_primitive:NN \pdflastlink           \pdftex_pdflastlink:D
-  \__kernel_primitive:NN \pdflastobj            \pdftex_pdflastobj:D
-  \__kernel_primitive:NN \pdflastxform          \pdftex_pdflastxform:D
-  \__kernel_primitive:NN \pdflastximage         \pdftex_pdflastximage:D
-  \__kernel_primitive:NN \pdflastximagecolordepth
-    \pdftex_pdflastximagecolordepth:D
-  \__kernel_primitive:NN \pdflastximagepages    \pdftex_pdflastximagepages:D
-  \__kernel_primitive:NN \pdflinkmargin         \pdftex_pdflinkmargin:D
-  \__kernel_primitive:NN \pdfliteral            \pdftex_pdfliteral:D
-  \__kernel_primitive:NN \pdfminorversion       \pdftex_pdfminorversion:D
-  \__kernel_primitive:NN \pdfnames              \pdftex_pdfnames:D
-  \__kernel_primitive:NN \pdfobj                \pdftex_pdfobj:D
-  \__kernel_primitive:NN \pdfobjcompresslevel
-    \pdftex_pdfobjcompresslevel:D
-  \__kernel_primitive:NN \pdfoutline            \pdftex_pdfoutline:D
-  \__kernel_primitive:NN \pdfoutput             \pdftex_pdfoutput:D
-  \__kernel_primitive:NN \pdfpageattr           \pdftex_pdfpageattr:D
-  \__kernel_primitive:NN \pdfpagebox            \pdftex_pdfpagebox:D
-  \__kernel_primitive:NN \pdfpageref            \pdftex_pdfpageref:D
-  \__kernel_primitive:NN \pdfpageresources      \pdftex_pdfpageresources:D
-  \__kernel_primitive:NN \pdfpagesattr          \pdftex_pdfpagesattr:D
-  \__kernel_primitive:NN \pdfrefobj             \pdftex_pdfrefobj:D
-  \__kernel_primitive:NN \pdfrefxform           \pdftex_pdfrefxform:D
-  \__kernel_primitive:NN \pdfrefximage          \pdftex_pdfrefximage:D
-  \__kernel_primitive:NN \pdfrestore            \pdftex_pdfrestore:D
-  \__kernel_primitive:NN \pdfretval             \pdftex_pdfretval:D
-  \__kernel_primitive:NN \pdfsave               \pdftex_pdfsave:D
-  \__kernel_primitive:NN \pdfsetmatrix          \pdftex_pdfsetmatrix:D
-  \__kernel_primitive:NN \pdfstartlink          \pdftex_pdfstartlink:D
-  \__kernel_primitive:NN \pdfstartthread        \pdftex_pdfstartthread:D
-  \__kernel_primitive:NN \pdfsuppressptexinfo
-    \pdftex_pdfsuppressptexinfo:D
-  \__kernel_primitive:NN \pdfthread             \pdftex_pdfthread:D
-  \__kernel_primitive:NN \pdfthreadmargin       \pdftex_pdfthreadmargin:D
-  \__kernel_primitive:NN \pdftrailer            \pdftex_pdftrailer:D
-  \__kernel_primitive:NN \pdfuniqueresname      \pdftex_pdfuniqueresname:D
-  \__kernel_primitive:NN \pdfvorigin            \pdftex_pdfvorigin:D
-  \__kernel_primitive:NN \pdfxform              \pdftex_pdfxform:D
-  \__kernel_primitive:NN \pdfxformattr          \pdftex_pdfxformattr:D
-  \__kernel_primitive:NN \pdfxformname          \pdftex_pdfxformname:D
-  \__kernel_primitive:NN \pdfxformresources     \pdftex_pdfxformresources:D
-  \__kernel_primitive:NN \pdfximage             \pdftex_pdfximage:D
-  \__kernel_primitive:NN \pdfximagebbox         \pdftex_pdfximagebbox:D
-  \__kernel_primitive:NN \ifpdfabsdim           \pdftex_ifabsdim:D
-  \__kernel_primitive:NN \ifpdfabsnum           \pdftex_ifabsnum:D
-  \__kernel_primitive:NN \ifpdfprimitive        \pdftex_ifprimitive:D
-  \__kernel_primitive:NN \pdfadjustspacing      \pdftex_adjustspacing:D
-  \__kernel_primitive:NN \pdfcopyfont           \pdftex_copyfont:D
-  \__kernel_primitive:NN \pdfdraftmode          \pdftex_draftmode:D
-  \__kernel_primitive:NN \pdfeachlinedepth      \pdftex_eachlinedepth:D
-  \__kernel_primitive:NN \pdfeachlineheight     \pdftex_eachlineheight:D
-  \__kernel_primitive:NN \pdffilemoddate        \pdftex_filemoddate:D
-  \__kernel_primitive:NN \pdffilesize           \pdftex_filesize:D
-  \__kernel_primitive:NN \pdffirstlineheight    \pdftex_firstlineheight:D
-  \__kernel_primitive:NN \pdffontexpand         \pdftex_fontexpand:D
-  \__kernel_primitive:NN \pdffontsize           \pdftex_fontsize:D
-  \__kernel_primitive:NN \pdfignoreddimen       \pdftex_ignoreddimen:D
-  \__kernel_primitive:NN \pdfinsertht           \pdftex_insertht:D
-  \__kernel_primitive:NN \pdflastlinedepth      \pdftex_lastlinedepth:D
-  \__kernel_primitive:NN \pdflastxpos           \pdftex_lastxpos:D
-  \__kernel_primitive:NN \pdflastypos           \pdftex_lastypos:D
-  \__kernel_primitive:NN \pdfmapfile            \pdftex_mapfile:D
-  \__kernel_primitive:NN \pdfmapline            \pdftex_mapline:D
-  \__kernel_primitive:NN \pdfmdfivesum          \pdftex_mdfivesum:D
-  \__kernel_primitive:NN \pdfnoligatures        \pdftex_noligatures:D
-  \__kernel_primitive:NN \pdfnormaldeviate      \pdftex_normaldeviate:D
-  \__kernel_primitive:NN \pdfpageheight         \pdftex_pageheight:D
-  \__kernel_primitive:NN \pdfpagewidth          \pdftex_pagewidth:D
-  \__kernel_primitive:NN \pdfpkmode             \pdftex_pkmode:D
-  \__kernel_primitive:NN \pdfpkresolution       \pdftex_pkresolution:D
-  \__kernel_primitive:NN \pdfprimitive          \pdftex_primitive:D
-  \__kernel_primitive:NN \pdfprotrudechars      \pdftex_protrudechars:D
-  \__kernel_primitive:NN \pdfpxdimen            \pdftex_pxdimen:D
-  \__kernel_primitive:NN \pdfrandomseed         \pdftex_randomseed:D
-  \__kernel_primitive:NN \pdfsavepos            \pdftex_savepos:D
-  \__kernel_primitive:NN \pdfstrcmp             \pdftex_strcmp:D
-  \__kernel_primitive:NN \pdfsetrandomseed      \pdftex_setrandomseed:D
-  \__kernel_primitive:NN \pdfshellescape        \pdftex_shellescape:D
-  \__kernel_primitive:NN \pdftracingfonts       \pdftex_tracingfonts:D
-  \__kernel_primitive:NN \pdfuniformdeviate     \pdftex_uniformdeviate:D
-  \__kernel_primitive:NN \pdftexbanner          \pdftex_pdftexbanner:D
-  \__kernel_primitive:NN \pdftexrevision        \pdftex_pdftexrevision:D
-  \__kernel_primitive:NN \pdftexversion         \pdftex_pdftexversion:D
-  \__kernel_primitive:NN \efcode                \pdftex_efcode:D
-  \__kernel_primitive:NN \ifincsname            \pdftex_ifincsname:D
-  \__kernel_primitive:NN \leftmarginkern        \pdftex_leftmarginkern:D
-  \__kernel_primitive:NN \letterspacefont       \pdftex_letterspacefont:D
-  \__kernel_primitive:NN \lpcode                \pdftex_lpcode:D
-  \__kernel_primitive:NN \quitvmode             \pdftex_quitvmode:D
-  \__kernel_primitive:NN \rightmarginkern       \pdftex_rightmarginkern:D
-  \__kernel_primitive:NN \rpcode                \pdftex_rpcode:D
-  \__kernel_primitive:NN \synctex               \pdftex_synctex:D
-  \__kernel_primitive:NN \tagcode               \pdftex_tagcode:D
-  \__kernel_primitive:NN \mdfivesum             \pdftex_mdfivesum:D
-  \__kernel_primitive:NN \ifprimitive           \pdftex_ifprimitive:D
-  \__kernel_primitive:NN \primitive             \pdftex_primitive:D
-  \__kernel_primitive:NN \shellescape           \pdftex_shellescape:D
-  \__kernel_primitive:NN \adjustspacing         \pdftex_adjustspacing:D
-  \__kernel_primitive:NN \copyfont              \pdftex_copyfont:D
-  \__kernel_primitive:NN \draftmode             \pdftex_draftmode:D
-  \__kernel_primitive:NN \expandglyphsinfont    \pdftex_fontexpand:D
-  \__kernel_primitive:NN \ifabsdim              \pdftex_ifabsdim:D
-  \__kernel_primitive:NN \ifabsnum              \pdftex_ifabsnum:D
-  \__kernel_primitive:NN \ignoreligaturesinfont
-    \pdftex_ignoreligaturesinfont:D
-  \__kernel_primitive:NN \insertht              \pdftex_insertht:D
-  \__kernel_primitive:NN \lastsavedboxresourceindex
-    \pdftex_pdflastxform:D
-  \__kernel_primitive:NN \lastsavedimageresourceindex
-    \pdftex_pdflastximage:D
-  \__kernel_primitive:NN \lastsavedimageresourcepages
-    \pdftex_pdflastximagepages:D
-  \__kernel_primitive:NN \lastxpos              \pdftex_lastxpos:D
-  \__kernel_primitive:NN \lastypos              \pdftex_lastypos:D
-  \__kernel_primitive:NN \normaldeviate         \pdftex_normaldeviate:D
-  \__kernel_primitive:NN \outputmode            \pdftex_pdfoutput:D
-  \__kernel_primitive:NN \pageheight            \pdftex_pageheight:D
-  \__kernel_primitive:NN \pagewidth             \pdftex_pagewith:D
-  \__kernel_primitive:NN \protrudechars         \pdftex_protrudechars:D
-  \__kernel_primitive:NN \pxdimen               \pdftex_pxdimen:D
-  \__kernel_primitive:NN \randomseed            \pdftex_randomseed:D
-  \__kernel_primitive:NN \useboxresource        \pdftex_pdfrefxform:D
-  \__kernel_primitive:NN \useimageresource      \pdftex_pdfrefximage:D
-  \__kernel_primitive:NN \savepos               \pdftex_savepos:D
-  \__kernel_primitive:NN \saveboxresource       \pdftex_pdfxform:D
-  \__kernel_primitive:NN \saveimageresource     \pdftex_pdfximage:D
-  \__kernel_primitive:NN \setrandomseed         \pdftex_setrandomseed:D
-  \__kernel_primitive:NN \tracingfonts          \pdftex_tracingfonts:D
-  \__kernel_primitive:NN \uniformdeviate        \pdftex_uniformdeviate:D
-  \__kernel_primitive:NN \suppressfontnotfounderror
-    \xetex_suppressfontnotfounderror:D
-  \__kernel_primitive:NN \XeTeXcharclass        \xetex_charclass:D
-  \__kernel_primitive:NN \XeTeXcharglyph        \xetex_charglyph:D
-  \__kernel_primitive:NN \XeTeXcountfeatures    \xetex_countfeatures:D
-  \__kernel_primitive:NN \XeTeXcountglyphs      \xetex_countglyphs:D
-  \__kernel_primitive:NN \XeTeXcountselectors   \xetex_countselectors:D
-  \__kernel_primitive:NN \XeTeXcountvariations  \xetex_countvariations:D
-  \__kernel_primitive:NN \XeTeXdefaultencoding  \xetex_defaultencoding:D
-  \__kernel_primitive:NN \XeTeXdashbreakstate   \xetex_dashbreakstate:D
-  \__kernel_primitive:NN \XeTeXfeaturecode      \xetex_featurecode:D
-  \__kernel_primitive:NN \XeTeXfeaturename      \xetex_featurename:D
-  \__kernel_primitive:NN \XeTeXfindfeaturebyname
-    \xetex_findfeaturebyname:D
-  \__kernel_primitive:NN \XeTeXfindselectorbyname
-    \xetex_findselectorbyname:D
-  \__kernel_primitive:NN \XeTeXfindvariationbyname
-    \xetex_findvariationbyname:D
-  \__kernel_primitive:NN \XeTeXfirstfontchar    \xetex_firstfontchar:D
-  \__kernel_primitive:NN \XeTeXfonttype         \xetex_fonttype:D
-  \__kernel_primitive:NN \XeTeXgenerateactualtext
-    \xetex_generateactualtext:D
-  \__kernel_primitive:NN \XeTeXglyph            \xetex_glyph:D
-  \__kernel_primitive:NN \XeTeXglyphbounds      \xetex_glyphbounds:D
-  \__kernel_primitive:NN \XeTeXglyphindex       \xetex_glyphindex:D
-  \__kernel_primitive:NN \XeTeXglyphname        \xetex_glyphname:D
-  \__kernel_primitive:NN \XeTeXinputencoding    \xetex_inputencoding:D
-  \__kernel_primitive:NN \XeTeXinputnormalization
-    \xetex_inputnormalization:D
-  \__kernel_primitive:NN \XeTeXinterchartokenstate
-    \xetex_interchartokenstate:D
-  \__kernel_primitive:NN \XeTeXinterchartoks    \xetex_interchartoks:D
-  \__kernel_primitive:NN \XeTeXisdefaultselector
-    \xetex_isdefaultselector:D
-  \__kernel_primitive:NN \XeTeXisexclusivefeature
-    \xetex_isexclusivefeature:D
-  \__kernel_primitive:NN \XeTeXlastfontchar     \xetex_lastfontchar:D
-  \__kernel_primitive:NN \XeTeXlinebreakskip    \xetex_linebreakskip:D
-  \__kernel_primitive:NN \XeTeXlinebreaklocale  \xetex_linebreaklocale:D
-  \__kernel_primitive:NN \XeTeXlinebreakpenalty \xetex_linebreakpenalty:D
-  \__kernel_primitive:NN \XeTeXOTcountfeatures  \xetex_OTcountfeatures:D
-  \__kernel_primitive:NN \XeTeXOTcountlanguages \xetex_OTcountlanguages:D
-  \__kernel_primitive:NN \XeTeXOTcountscripts   \xetex_OTcountscripts:D
-  \__kernel_primitive:NN \XeTeXOTfeaturetag     \xetex_OTfeaturetag:D
-  \__kernel_primitive:NN \XeTeXOTlanguagetag    \xetex_OTlanguagetag:D
-  \__kernel_primitive:NN \XeTeXOTscripttag      \xetex_OTscripttag:D
-  \__kernel_primitive:NN \XeTeXpdffile          \xetex_pdffile:D
-  \__kernel_primitive:NN \XeTeXpdfpagecount     \xetex_pdfpagecount:D
-  \__kernel_primitive:NN \XeTeXpicfile          \xetex_picfile:D
-  \__kernel_primitive:NN \XeTeXselectorname     \xetex_selectorname:D
-  \__kernel_primitive:NN \XeTeXtracingfonts     \xetex_tracingfonts:D
-  \__kernel_primitive:NN \XeTeXupwardsmode      \xetex_upwardsmode:D
-  \__kernel_primitive:NN \XeTeXuseglyphmetrics  \xetex_useglyphmetrics:D
-  \__kernel_primitive:NN \XeTeXvariation        \xetex_variation:D
-  \__kernel_primitive:NN \XeTeXvariationdefault \xetex_variationdefault:D
-  \__kernel_primitive:NN \XeTeXvariationmax     \xetex_variationmax:D
-  \__kernel_primitive:NN \XeTeXvariationmin     \xetex_variationmin:D
-  \__kernel_primitive:NN \XeTeXvariationname    \xetex_variationname:D
-  \__kernel_primitive:NN \XeTeXrevision         \xetex_XeTeXrevision:D
-  \__kernel_primitive:NN \XeTeXversion          \xetex_XeTeXversion:D
-  \__kernel_primitive:NN \alignmark             \luatex_alignmark:D
-  \__kernel_primitive:NN \aligntab              \luatex_aligntab:D
-  \__kernel_primitive:NN \attribute             \luatex_attribute:D
-  \__kernel_primitive:NN \attributedef          \luatex_attributedef:D
-  \__kernel_primitive:NN \automaticdiscretionary
-    \luatex_automaticdiscretionary:D
-  \__kernel_primitive:NN \automatichyphenmode
-    \luatex_automatichyphenmode:D
-  \__kernel_primitive:NN \automatichyphenpenalty
-    \luatex_automatichyphenpenalty:D
-  \__kernel_primitive:NN \begincsname           \luatex_begincsname:D
-  \__kernel_primitive:NN \breakafterdirmode     \luatex_breakafterdirmode:D
-  \__kernel_primitive:NN \catcodetable          \luatex_catcodetable:D
-  \__kernel_primitive:NN \clearmarks            \luatex_clearmarks:D
-  \__kernel_primitive:NN \crampeddisplaystyle
-    \luatex_crampeddisplaystyle:D
-  \__kernel_primitive:NN \crampedscriptscriptstyle
-    \luatex_crampedscriptscriptstyle:D
-  \__kernel_primitive:NN \crampedscriptstyle    \luatex_crampedscriptstyle:D
-  \__kernel_primitive:NN \crampedtextstyle      \luatex_crampedtextstyle:D
-  \__kernel_primitive:NN \directlua             \luatex_directlua:D
-  \__kernel_primitive:NN \dviextension          \luatex_dviextension:D
-  \__kernel_primitive:NN \dvifeedback           \luatex_dvifeedback:D
-  \__kernel_primitive:NN \dvivariable           \luatex_dvivariable:D
-  \__kernel_primitive:NN \etoksapp              \luatex_etoksapp:D
-  \__kernel_primitive:NN \etokspre              \luatex_etokspre:D
-  \__kernel_primitive:NN \explicithyphenpenalty
-    \luatex_explicithyphenpenalty:D
-  \__kernel_primitive:NN \expanded              \luatex_expanded:D
-  \__kernel_primitive:NN \explicitdiscretionary
-    \luatex_explicitdiscretionary:D
-  \__kernel_primitive:NN \firstvalidlanguage    \luatex_firstvalidlanguage:D
-  \__kernel_primitive:NN \fontid                \luatex_fontid:D
-  \__kernel_primitive:NN \formatname            \luatex_formatname:D
-  \__kernel_primitive:NN \hjcode                \luatex_hjcode:D
-  \__kernel_primitive:NN \hpack                 \luatex_hpack:D
-  \__kernel_primitive:NN \hyphenationbounds     \luatex_hyphenationbounds:D
-  \__kernel_primitive:NN \hyphenationmin        \luatex_hyphenationmin:D
-  \__kernel_primitive:NN \hyphenpenaltymode     \luatex_hyphenpenaltymode:D
-  \__kernel_primitive:NN \gleaders              \luatex_gleaders:D
-  \__kernel_primitive:NN \initcatcodetable      \luatex_initcatcodetable:D
-  \__kernel_primitive:NN \lastnamedcs           \luatex_lastnamedcs:D
-  \__kernel_primitive:NN \latelua               \luatex_latelua:D
-  \__kernel_primitive:NN \letcharcode           \luatex_letcharcode:D
-  \__kernel_primitive:NN \luaescapestring       \luatex_luaescapestring:D
-  \__kernel_primitive:NN \luafunction           \luatex_luafunction:D
-  \__kernel_primitive:NN \luatexbanner          \luatex_luatexbanner:D
-  \__kernel_primitive:NN \luatexrevision        \luatex_luatexrevision:D
-  \__kernel_primitive:NN \luatexversion         \luatex_luatexversion:D
-  \__kernel_primitive:NN \mathdelimitersmode    \luatex_mathdelimitersmode:D
-  \__kernel_primitive:NN \mathdisplayskipmode
-    \luatex_mathdisplayskipmode:D
-  \__kernel_primitive:NN \matheqnogapstep       \luatex_matheqnogapstep:D
-  \__kernel_primitive:NN \mathnolimitsmode      \luatex_mathnolimitsmode:D
-  \__kernel_primitive:NN \mathoption            \luatex_mathoption:D
-  \__kernel_primitive:NN \mathpenaltiesmode     \luatex_mathpenaltiesmode:D
-  \__kernel_primitive:NN \mathrulesfam          \luatex_mathrulesfam:D
-  \__kernel_primitive:NN \mathscriptsmode       \luatex_mathscriptsmode:D
-  \__kernel_primitive:NN \mathscriptboxmode     \luatex_mathscriptboxmode:D
-  \__kernel_primitive:NN \mathstyle             \luatex_mathstyle:D
-  \__kernel_primitive:NN \mathsurroundmode      \luatex_mathsurroundmode:D
-  \__kernel_primitive:NN \mathsurroundskip      \luatex_mathsurroundskip:D
-  \__kernel_primitive:NN \nohrule               \luatex_nohrule:D
-  \__kernel_primitive:NN \nokerns               \luatex_nokerns:D
-  \__kernel_primitive:NN \noligs                \luatex_noligs:D
-  \__kernel_primitive:NN \nospaces              \luatex_nospaces:D
-  \__kernel_primitive:NN \novrule               \luatex_novrule:D
-  \__kernel_primitive:NN \outputbox             \luatex_outputbox:D
-  \__kernel_primitive:NN \pagebottomoffset      \luatex_pagebottomoffset:D
-  \__kernel_primitive:NN \pageleftoffset        \luatex_pageleftoffset:D
-  \__kernel_primitive:NN \pagerightoffset       \luatex_pagerightoffset:D
-  \__kernel_primitive:NN \pagetopoffset         \luatex_pagetopoffset:D
-  \__kernel_primitive:NN \pdfextension          \luatex_pdfextension:D
-  \__kernel_primitive:NN \pdffeedback           \luatex_pdffeedback:D
-  \__kernel_primitive:NN \pdfvariable           \luatex_pdfvariable:D
-  \__kernel_primitive:NN \postexhyphenchar      \luatex_postexhyphenchar:D
-  \__kernel_primitive:NN \posthyphenchar        \luatex_posthyphenchar:D
-  \__kernel_primitive:NN \prebinoppenalty       \luatex_prebinoppenalty:D
-  \__kernel_primitive:NN \predisplaygapfactor
-    \luatex_predisplaygapfactor:D
-  \__kernel_primitive:NN \preexhyphenchar       \luatex_preexhyphenchar:D
-  \__kernel_primitive:NN \prehyphenchar         \luatex_prehyphenchar:D
-  \__kernel_primitive:NN \prerelpenalty         \luatex_prerelpenalty:D
-  \__kernel_primitive:NN \savecatcodetable      \luatex_savecatcodetable:D
-  \__kernel_primitive:NN \scantextokens         \luatex_scantextokens:D
-  \__kernel_primitive:NN \setfontid             \luatex_setfontid:D
-  \__kernel_primitive:NN \shapemode             \luatex_shapemode:D
-  \__kernel_primitive:NN \suppressifcsnameerror
-    \luatex_suppressifcsnameerror:D
-  \__kernel_primitive:NN \suppresslongerror     \luatex_suppresslongerror:D
-  \__kernel_primitive:NN \suppressmathparerror
-    \luatex_suppressmathparerror:D
-  \__kernel_primitive:NN \suppressoutererror    \luatex_suppressoutererror:D
-  \__kernel_primitive:NN \suppressprimitiveerror
-    \luatex_suppressprimitiveerror:D
-  \__kernel_primitive:NN \toksapp               \luatex_toksapp:D
-  \__kernel_primitive:NN \tokspre               \luatex_tokspre:D
-  \__kernel_primitive:NN \tpack                 \luatex_tpack:D
-  \__kernel_primitive:NN \vpack                 \luatex_vpack:D
-  \__kernel_primitive:NN \bodydir               \luatex_bodydir:D
-  \__kernel_primitive:NN \boxdir                \luatex_boxdir:D
-  \__kernel_primitive:NN \leftghost             \luatex_leftghost:D
-  \__kernel_primitive:NN \linedir               \luatex_linedir:D
-  \__kernel_primitive:NN \localbrokenpenalty    \luatex_localbrokenpenalty:D
-  \__kernel_primitive:NN \localinterlinepenalty
-    \luatex_localinterlinepenalty:D
-  \__kernel_primitive:NN \localleftbox          \luatex_localleftbox:D
-  \__kernel_primitive:NN \localrightbox         \luatex_localrightbox:D
-  \__kernel_primitive:NN \mathdir               \luatex_mathdir:D
-  \__kernel_primitive:NN \pagedir               \luatex_pagedir:D
-  \__kernel_primitive:NN \pardir                \luatex_pardir:D
-  \__kernel_primitive:NN \rightghost            \luatex_rightghost:D
-  \__kernel_primitive:NN \textdir               \luatex_textdir:D
-  \__kernel_primitive:NN \Uchar                 \utex_char:D
-  \__kernel_primitive:NN \Ucharcat              \utex_charcat:D
-  \__kernel_primitive:NN \Udelcode              \utex_delcode:D
-  \__kernel_primitive:NN \Udelcodenum           \utex_delcodenum:D
-  \__kernel_primitive:NN \Udelimiter            \utex_delimiter:D
-  \__kernel_primitive:NN \Udelimiterover        \utex_delimiterover:D
-  \__kernel_primitive:NN \Udelimiterunder       \utex_delimiterunder:D
-  \__kernel_primitive:NN \Uhextensible          \utex_hextensible:D
-  \__kernel_primitive:NN \Umathaccent           \utex_mathaccent:D
-  \__kernel_primitive:NN \Umathaxis             \utex_mathaxis:D
-  \__kernel_primitive:NN \Umathbinbinspacing    \utex_binbinspacing:D
-  \__kernel_primitive:NN \Umathbinclosespacing  \utex_binclosespacing:D
-  \__kernel_primitive:NN \Umathbininnerspacing  \utex_bininnerspacing:D
-  \__kernel_primitive:NN \Umathbinopenspacing   \utex_binopenspacing:D
-  \__kernel_primitive:NN \Umathbinopspacing     \utex_binopspacing:D
-  \__kernel_primitive:NN \Umathbinordspacing    \utex_binordspacing:D
-  \__kernel_primitive:NN \Umathbinpunctspacing  \utex_binpunctspacing:D
-  \__kernel_primitive:NN \Umathbinrelspacing    \utex_binrelspacing:D
-  \__kernel_primitive:NN \Umathchar             \utex_mathchar:D
-  \__kernel_primitive:NN \Umathcharclass        \utex_mathcharclass:D
-  \__kernel_primitive:NN \Umathchardef          \utex_mathchardef:D
-  \__kernel_primitive:NN \Umathcharfam          \utex_mathcharfam:D
-  \__kernel_primitive:NN \Umathcharnum          \utex_mathcharnum:D
-  \__kernel_primitive:NN \Umathcharnumdef       \utex_mathcharnumdef:D
-  \__kernel_primitive:NN \Umathcharslot         \utex_mathcharslot:D
-  \__kernel_primitive:NN \Umathclosebinspacing  \utex_closebinspacing:D
-  \__kernel_primitive:NN \Umathcloseclosespacing
-    \utex_closeclosespacing:D
-  \__kernel_primitive:NN \Umathcloseinnerspacing
-    \utex_closeinnerspacing:D
-  \__kernel_primitive:NN \Umathcloseopenspacing \utex_closeopenspacing:D
-  \__kernel_primitive:NN \Umathcloseopspacing   \utex_closeopspacing:D
-  \__kernel_primitive:NN \Umathcloseordspacing  \utex_closeordspacing:D
-  \__kernel_primitive:NN \Umathclosepunctspacing
-    \utex_closepunctspacing:D
-  \__kernel_primitive:NN \Umathcloserelspacing  \utex_closerelspacing:D
-  \__kernel_primitive:NN \Umathcode             \utex_mathcode:D
-  \__kernel_primitive:NN \Umathcodenum          \utex_mathcodenum:D
-  \__kernel_primitive:NN \Umathconnectoroverlapmin
-    \utex_connectoroverlapmin:D
-  \__kernel_primitive:NN \Umathfractiondelsize  \utex_fractiondelsize:D
-  \__kernel_primitive:NN \Umathfractiondenomdown
-    \utex_fractiondenomdown:D
-  \__kernel_primitive:NN \Umathfractiondenomvgap
-    \utex_fractiondenomvgap:D
-  \__kernel_primitive:NN \Umathfractionnumup    \utex_fractionnumup:D
-  \__kernel_primitive:NN \Umathfractionnumvgap  \utex_fractionnumvgap:D
-  \__kernel_primitive:NN \Umathfractionrule     \utex_fractionrule:D
-  \__kernel_primitive:NN \Umathinnerbinspacing  \utex_innerbinspacing:D
-  \__kernel_primitive:NN \Umathinnerclosespacing
-    \utex_innerclosespacing:D
-  \__kernel_primitive:NN \Umathinnerinnerspacing
-    \utex_innerinnerspacing:D
-  \__kernel_primitive:NN \Umathinneropenspacing \utex_inneropenspacing:D
-  \__kernel_primitive:NN \Umathinneropspacing   \utex_inneropspacing:D
-  \__kernel_primitive:NN \Umathinnerordspacing  \utex_innerordspacing:D
-  \__kernel_primitive:NN \Umathinnerpunctspacing
-    \utex_innerpunctspacing:D
-  \__kernel_primitive:NN \Umathinnerrelspacing  \utex_innerrelspacing:D
-  \__kernel_primitive:NN \Umathlimitabovebgap   \utex_limitabovebgap:D
-  \__kernel_primitive:NN \Umathlimitabovekern   \utex_limitabovekern:D
-  \__kernel_primitive:NN \Umathlimitabovevgap   \utex_limitabovevgap:D
-  \__kernel_primitive:NN \Umathlimitbelowbgap   \utex_limitbelowbgap:D
-  \__kernel_primitive:NN \Umathlimitbelowkern   \utex_limitbelowkern:D
-  \__kernel_primitive:NN \Umathlimitbelowvgap   \utex_limitbelowvgap:D
-  \__kernel_primitive:NN \Umathnolimitsubfactor \utex_nolimitsubfactor:D
-  \__kernel_primitive:NN \Umathnolimitsupfactor \utex_nolimitsupfactor:D
-  \__kernel_primitive:NN \Umathopbinspacing     \utex_opbinspacing:D
-  \__kernel_primitive:NN \Umathopclosespacing   \utex_opclosespacing:D
-  \__kernel_primitive:NN \Umathopenbinspacing   \utex_openbinspacing:D
-  \__kernel_primitive:NN \Umathopenclosespacing \utex_openclosespacing:D
-  \__kernel_primitive:NN \Umathopeninnerspacing \utex_openinnerspacing:D
-  \__kernel_primitive:NN \Umathopenopenspacing  \utex_openopenspacing:D
-  \__kernel_primitive:NN \Umathopenopspacing    \utex_openopspacing:D
-  \__kernel_primitive:NN \Umathopenordspacing   \utex_openordspacing:D
-  \__kernel_primitive:NN \Umathopenpunctspacing \utex_openpunctspacing:D
-  \__kernel_primitive:NN \Umathopenrelspacing   \utex_openrelspacing:D
-  \__kernel_primitive:NN \Umathoperatorsize     \utex_operatorsize:D
-  \__kernel_primitive:NN \Umathopinnerspacing   \utex_opinnerspacing:D
-  \__kernel_primitive:NN \Umathopopenspacing    \utex_opopenspacing:D
-  \__kernel_primitive:NN \Umathopopspacing      \utex_opopspacing:D
-  \__kernel_primitive:NN \Umathopordspacing     \utex_opordspacing:D
-  \__kernel_primitive:NN \Umathoppunctspacing   \utex_oppunctspacing:D
-  \__kernel_primitive:NN \Umathoprelspacing     \utex_oprelspacing:D
-  \__kernel_primitive:NN \Umathordbinspacing    \utex_ordbinspacing:D
-  \__kernel_primitive:NN \Umathordclosespacing  \utex_ordclosespacing:D
-  \__kernel_primitive:NN \Umathordinnerspacing  \utex_ordinnerspacing:D
-  \__kernel_primitive:NN \Umathordopenspacing   \utex_ordopenspacing:D
-  \__kernel_primitive:NN \Umathordopspacing     \utex_ordopspacing:D
-  \__kernel_primitive:NN \Umathordordspacing    \utex_ordordspacing:D
-  \__kernel_primitive:NN \Umathordpunctspacing  \utex_ordpunctspacing:D
-  \__kernel_primitive:NN \Umathordrelspacing    \utex_ordrelspacing:D
-  \__kernel_primitive:NN \Umathoverbarkern      \utex_overbarkern:D
-  \__kernel_primitive:NN \Umathoverbarrule      \utex_overbarrule:D
-  \__kernel_primitive:NN \Umathoverbarvgap      \utex_overbarvgap:D
-  \__kernel_primitive:NN \Umathoverdelimiterbgap
-     \utex_overdelimiterbgap:D
-  \__kernel_primitive:NN \Umathoverdelimitervgap
-    \utex_overdelimitervgap:D
-  \__kernel_primitive:NN \Umathpunctbinspacing  \utex_punctbinspacing:D
-  \__kernel_primitive:NN \Umathpunctclosespacing
-    \utex_punctclosespacing:D
-  \__kernel_primitive:NN \Umathpunctinnerspacing
-    \utex_punctinnerspacing:D
-  \__kernel_primitive:NN \Umathpunctopenspacing \utex_punctopenspacing:D
-  \__kernel_primitive:NN \Umathpunctopspacing   \utex_punctopspacing:D
-  \__kernel_primitive:NN \Umathpunctordspacing  \utex_punctordspacing:D
-  \__kernel_primitive:NN \Umathpunctpunctspacing\utex_punctpunctspacing:D
-  \__kernel_primitive:NN \Umathpunctrelspacing  \utex_punctrelspacing:D
-  \__kernel_primitive:NN \Umathquad             \utex_quad:D
-  \__kernel_primitive:NN \Umathradicaldegreeafter
-    \utex_radicaldegreeafter:D
-  \__kernel_primitive:NN \Umathradicaldegreebefore
-    \utex_radicaldegreebefore:D
-  \__kernel_primitive:NN \Umathradicaldegreeraise
-    \utex_radicaldegreeraise:D
-  \__kernel_primitive:NN \Umathradicalkern      \utex_radicalkern:D
-  \__kernel_primitive:NN \Umathradicalrule      \utex_radicalrule:D
-  \__kernel_primitive:NN \Umathradicalvgap      \utex_radicalvgap:D
-  \__kernel_primitive:NN \Umathrelbinspacing    \utex_relbinspacing:D
-  \__kernel_primitive:NN \Umathrelclosespacing  \utex_relclosespacing:D
-  \__kernel_primitive:NN \Umathrelinnerspacing  \utex_relinnerspacing:D
-  \__kernel_primitive:NN \Umathrelopenspacing   \utex_relopenspacing:D
-  \__kernel_primitive:NN \Umathrelopspacing     \utex_relopspacing:D
-  \__kernel_primitive:NN \Umathrelordspacing    \utex_relordspacing:D
-  \__kernel_primitive:NN \Umathrelpunctspacing  \utex_relpunctspacing:D
-  \__kernel_primitive:NN \Umathrelrelspacing    \utex_relrelspacing:D
-  \__kernel_primitive:NN \Umathskewedfractionhgap
-    \utex_skewedfractionhgap:D
-  \__kernel_primitive:NN \Umathskewedfractionvgap
-    \utex_skewedfractionvgap:D
-  \__kernel_primitive:NN \Umathspaceafterscript \utex_spaceafterscript:D
-  \__kernel_primitive:NN \Umathstackdenomdown   \utex_stackdenomdown:D
-  \__kernel_primitive:NN \Umathstacknumup       \utex_stacknumup:D
-  \__kernel_primitive:NN \Umathstackvgap        \utex_stackvgap:D
-  \__kernel_primitive:NN \Umathsubshiftdown     \utex_subshiftdown:D
-  \__kernel_primitive:NN \Umathsubshiftdrop     \utex_subshiftdrop:D
-  \__kernel_primitive:NN \Umathsubsupshiftdown  \utex_subsupshiftdown:D
-  \__kernel_primitive:NN \Umathsubsupvgap       \utex_subsupvgap:D
-  \__kernel_primitive:NN \Umathsubtopmax        \utex_subtopmax:D
-  \__kernel_primitive:NN \Umathsupbottommin     \utex_supbottommin:D
-  \__kernel_primitive:NN \Umathsupshiftdrop     \utex_supshiftdrop:D
-  \__kernel_primitive:NN \Umathsupshiftup       \utex_supshiftup:D
-  \__kernel_primitive:NN \Umathsupsubbottommax  \utex_supsubbottommax:D
-  \__kernel_primitive:NN \Umathunderbarkern     \utex_underbarkern:D
-  \__kernel_primitive:NN \Umathunderbarrule     \utex_underbarrule:D
-  \__kernel_primitive:NN \Umathunderbarvgap     \utex_underbarvgap:D
-  \__kernel_primitive:NN \Umathunderdelimiterbgap
-    \utex_underdelimiterbgap:D
-  \__kernel_primitive:NN \Umathunderdelimitervgap
-    \utex_underdelimitervgap:D
-  \__kernel_primitive:NN \Unosubscript          \utex_nosubscript:D
-  \__kernel_primitive:NN \Unosuperscript        \utex_nosuperscript:D
-  \__kernel_primitive:NN \Uoverdelimiter        \utex_overdelimiter:D
-  \__kernel_primitive:NN \Uradical              \utex_radical:D
-  \__kernel_primitive:NN \Uroot                 \utex_root:D
-  \__kernel_primitive:NN \Uskewed               \utex_skewed:D
-  \__kernel_primitive:NN \Uskewedwithdelims     \utex_skewedwithdelims:D
-  \__kernel_primitive:NN \Ustack                \utex_stack:D
-  \__kernel_primitive:NN \Ustartdisplaymath     \utex_startdisplaymath:D
-  \__kernel_primitive:NN \Ustartmath            \utex_startmath:D
-  \__kernel_primitive:NN \Ustopdisplaymath      \utex_stopdisplaymath:D
-  \__kernel_primitive:NN \Ustopmath             \utex_stopmath:D
-  \__kernel_primitive:NN \Usubscript            \utex_subscript:D
-  \__kernel_primitive:NN \Usuperscript          \utex_superscript:D
-  \__kernel_primitive:NN \Uunderdelimiter       \utex_underdelimiter:D
-  \__kernel_primitive:NN \Uvextensible          \utex_vextensible:D
-  \__kernel_primitive:NN \autospacing           \ptex_autospacing:D
-  \__kernel_primitive:NN \autoxspacing          \ptex_autoxspacing:D
-  \__kernel_primitive:NN \dtou                  \ptex_dtou:D
-  \__kernel_primitive:NN \epTeXinputencoding    \ptex_inputencoding:D
-  \__kernel_primitive:NN \epTeXversion          \ptex_epTeXversion:D
-  \__kernel_primitive:NN \euc                   \ptex_euc:D
-  \__kernel_primitive:NN \ifdbox                \ptex_ifdbox:D
-  \__kernel_primitive:NN \ifddir                \ptex_ifddir:D
-  \__kernel_primitive:NN \ifmdir                \ptex_ifmdir:D
-  \__kernel_primitive:NN \iftbox                \ptex_iftbox:D
-  \__kernel_primitive:NN \iftdir                \ptex_iftdir:D
-  \__kernel_primitive:NN \ifybox                \ptex_ifybox:D
-  \__kernel_primitive:NN \ifydir                \ptex_ifydir:D
-  \__kernel_primitive:NN \inhibitglue           \ptex_inhibitglue:D
-  \__kernel_primitive:NN \inhibitxspcode        \ptex_inhibitxspcode:D
-  \__kernel_primitive:NN \jcharwidowpenalty     \ptex_jcharwidowpenalty:D
-  \__kernel_primitive:NN \jfam                  \ptex_jfam:D
-  \__kernel_primitive:NN \jfont                 \ptex_jfont:D
-  \__kernel_primitive:NN \jis                   \ptex_jis:D
-  \__kernel_primitive:NN \kanjiskip             \ptex_kanjiskip:D
-  \__kernel_primitive:NN \kansuji               \ptex_kansuji:D
-  \__kernel_primitive:NN \kansujichar           \ptex_kansujichar:D
-  \__kernel_primitive:NN \kcatcode              \ptex_kcatcode:D
-  \__kernel_primitive:NN \kuten                 \ptex_kuten:D
-  \__kernel_primitive:NN \noautospacing         \ptex_noautospacing:D
-  \__kernel_primitive:NN \noautoxspacing        \ptex_noautoxspacing:D
-  \__kernel_primitive:NN \postbreakpenalty      \ptex_postbreakpenalty:D
-  \__kernel_primitive:NN \prebreakpenalty       \ptex_prebreakpenalty:D
-  \__kernel_primitive:NN \ptexminorversion      \ptex_ptexminorversion:D
-  \__kernel_primitive:NN \ptexrevision          \ptex_ptexrevision:D
-  \__kernel_primitive:NN \ptexversion           \ptex_ptexversion:D
-  \__kernel_primitive:NN \showmode              \ptex_showmode:D
-  \__kernel_primitive:NN \sjis                  \ptex_sjis:D
-  \__kernel_primitive:NN \tate                  \ptex_tate:D
-  \__kernel_primitive:NN \tbaselineshift        \ptex_tbaselineshift:D
-  \__kernel_primitive:NN \tfont                 \ptex_tfont:D
-  \__kernel_primitive:NN \xkanjiskip            \ptex_xkanjiskip:D
-  \__kernel_primitive:NN \xspcode               \ptex_xspcode:D
-  \__kernel_primitive:NN \ybaselineshift        \ptex_ybaselineshift:D
-  \__kernel_primitive:NN \yoko                  \ptex_yoko:D
-  \__kernel_primitive:NN \disablecjktoken       \uptex_disablecjktoken:D
-  \__kernel_primitive:NN \enablecjktoken        \uptex_enablecjktoken:D
-  \__kernel_primitive:NN \forcecjktoken         \uptex_forcecjktoken:D
-  \__kernel_primitive:NN \kchar                 \uptex_kchar:D
-  \__kernel_primitive:NN \kchardef              \uptex_kchardef:D
-  \__kernel_primitive:NN \kuten                 \uptex_kuten:D
-  \__kernel_primitive:NN \ucs                   \uptex_ucs:D
-  \__kernel_primitive:NN \uptexrevision         \uptex_uptexrevision:D
-  \__kernel_primitive:NN \uptexversion          \uptex_uptexversion:D
-        }
-    }
-  \__kernel_primitives:
-\tex_endgroup:D
 %% File: l3basics.dtx
 \tex_let:D \if_true:           \tex_iftrue:D
 \tex_let:D \if_false:          \tex_iffalse:D
@@ -4601,6 +3970,21 @@
   }
 \prg_generate_conditional_variant:Nnn \tl_if_eq:NN
   { Nc , c , cc } { p , TF , T , F }
+\tl_new:N \l__tl_internal_a_tl
+\tl_new:N \l__tl_internal_b_tl
+\prg_new_protected_conditional:Npnn \tl_if_eq:Nn #1#2 { T , F , TF }
+  {
+    \group_begin:
+      \tl_set:Nn \l__tl_internal_b_tl {#2}
+      \exp_after:wN
+    \group_end:
+    \if_meaning:w #1 \l__tl_internal_b_tl
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
+\prg_generate_conditional_variant:Nnn \tl_if_eq:Nn { c } { TF , T , F }
 \prg_new_protected_conditional:Npnn \tl_if_eq:nn #1#2 { T , F ,  TF }
   {
     \group_begin:
@@ -4614,8 +3998,6 @@
       \prg_return_false:
     \fi:
   }
-\tl_new:N \l__tl_internal_a_tl
-\tl_new:N \l__tl_internal_b_tl
 \cs_new_protected:Npn \tl_if_in:NnT  { \exp_args:No \tl_if_in:nnT  }
 \cs_new_protected:Npn \tl_if_in:NnF  { \exp_args:No \tl_if_in:nnF  }
 \cs_new_protected:Npn \tl_if_in:NnTF { \exp_args:No \tl_if_in:nnTF }
@@ -6443,6 +5825,26 @@
     \exp_after:wN #1
     \int_value:w \int_eval:w 1 + #2 ;
   }
+\cs_new_protected:Npn \seq_set_map_x:NNn
+  { \__seq_set_map_x:NNNn \tl_set:Nx }
+\cs_new_protected:Npn \seq_gset_map_x:NNn
+  { \__seq_set_map_x:NNNn \tl_gset:Nx }
+\cs_new_protected:Npn \__seq_set_map_x:NNNn #1#2#3#4
+  {
+    \__seq_push_item_def:n { \exp_not:N \__seq_item:n {#4} }
+    #1 #2 { #3 }
+    \__seq_pop_item_def:
+  }
+\cs_new_protected:Npn \seq_set_map:NNn
+  { \__seq_set_map:NNNn \tl_set:Nx }
+\cs_new_protected:Npn \seq_gset_map:NNn
+  { \__seq_set_map:NNNn \tl_gset:Nx }
+\cs_new_protected:Npn \__seq_set_map:NNNn #1#2#3#4
+  {
+    \__seq_push_item_def:n { \exp_not:n { \__seq_item:n {#4} } }
+    #1 #2 { #3 }
+    \__seq_pop_item_def:
+  }
 \cs_new:Npn \seq_count:N #1
   {
     \int_eval:n
@@ -9716,8 +9118,8 @@
       { \tl_set:Nn #3 {##2} }
       { \tl_set:Nn #3 { \q_no_value } }
   }
-\cs_generate_variant:Nn \prop_get:NnN {     NV , No }
-\cs_generate_variant:Nn \prop_get:NnN { c , cV , co }
+\cs_generate_variant:Nn \prop_get:NnN {     NV , Nv , No }
+\cs_generate_variant:Nn \prop_get:NnN { c , cV , cv , co }
 \cs_new_protected:Npn \prop_pop:NnN #1#2#3
   {
     \__prop_split:NnTF #1 {#2}
@@ -9799,13 +9201,13 @@
       { #1 #2 { \exp_not:o {#2} \l__prop_internal_tl } }
   }
 \cs_generate_variant:Nn \prop_put:Nnn
-  {     NnV , Nno , Nnx , NV , NVV , No , Noo }
+  {     NnV , Nno , Nnx , NV , NVV , NVx , Nvx , No , Noo , Nxx }
 \cs_generate_variant:Nn \prop_put:Nnn
-  { c , cnV , cno , cnx , cV , cVV , co , coo }
+  { c , cnV , cno , cnx , cV , cVV , cVx , cvx , co , coo , cxx }
 \cs_generate_variant:Nn \prop_gput:Nnn
-  {     NnV , Nno , Nnx , NV , NVV , No , Noo }
+  {     NnV , Nno , Nnx , NV , NVV , NVx , Nvx , No , Noo , Nxx }
 \cs_generate_variant:Nn \prop_gput:Nnn
-  { c , cnV , cno , cnx , cV , cVV , co , coo }
+  { c , cnV , cno , cnx , cV , cVV , cVx , cvx , co , coo , cxx }
 \cs_new_protected:Npn \prop_put_if_new:Nnn
   { \__prop_put_if_new:NNnn \tl_set:Nx }
 \cs_new_protected:Npn \prop_gput_if_new:Nnn
@@ -9868,7 +9270,7 @@
       { \prg_return_false: }
   }
 \prg_generate_conditional_variant:Nnn \prop_get:NnN
-  { NV , No , c , cV , co } { T , F , TF }
+  { NV , Nv , No , c , cV , cv , co } { T , F , TF }
 \cs_new:Npn \prop_map_function:NN #1#2
   {
     \exp_after:wN \use_i_ii:nnn
@@ -10272,6 +9674,12 @@
         { \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} }
         { } { } \iow_log:n
     }
+  \__msg_class_new:nn { term }
+    {
+      \iow_wrap:nnnN
+        { \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} }
+        { } { } \iow_term:n
+    }
   \__msg_class_new:nn { none } { }
   \__msg_class_new:nn { show }
     {
@@ -11736,11 +11144,11 @@
         \tl_if_blank:eTF { \__file_size:n {#1} }
           {
             \seq_map_tokens:Nn \l_file_search_path_seq
-              { \__file_full_name_aux:nn {#1} }
+              { \__file_full_name_aux:Nnn \seq_map_break:n {#1} }
             \cs_if_exist:NT \input at path
               {
                 \tl_map_tokens:Nn \input at path
-                  { \__file_full_name_aux:nn {#1} }
+                  { \__file_full_name_aux:Nnn \tl_map_break:n {#1} }
               }
             \__file_name_end:
           }
@@ -11747,13 +11155,13 @@
           { \__file_ext_check:n {#1} }
       }
   }
-\cs_new:Npn \__file_full_name_aux:nn #1#2
-  { \exp_args:Ne \__file_full_name_aux:n { \tl_to_str:n {#2} / #1 } }
-\cs_new:Npn \__file_full_name_aux:n #1
+\cs_new:Npn \__file_full_name_aux:Nnn #1#2#3
+  { \exp_args:Ne \__file_full_name_aux:nN { \tl_to_str:n {#3} / #2 } #1 }
+\cs_new:Npn \__file_full_name_aux:nN #1 #2
   {
     \tl_if_blank:eF { \__file_size:n {#1} }
       {
-        \seq_map_break:n
+        #2
           {
             \__file_ext_check:n {#1}
             \__file_name_cleanup:w
@@ -12194,46 +11602,63 @@
     \str_gset:Nn \g_file_curr_name_str {#2}
     \str_gset:Nn \g_file_curr_ext_str  {#3}
   }
-\cs_new_protected:Npn \file_parse_full_name:nNNN #1#2#3#4
+\cs_new:Npn \file_parse_full_name:n #1
   {
-    \exp_after:wN \__file_parse_full_name_auxi:w
-      \tl_to_str:n { #1 " #1 " } \s__file_stop #2#3#4
+    \file_parse_full_name_apply:nN {#1}
+      \prg_do_nothing:
   }
-\cs_generate_variant:Nn \file_parse_full_name:nNNN { V }
-\cs_new_protected:Npn \__file_parse_full_name_auxi:w
-  #1 " #2 " #3 \s__file_stop #4#5#6
+\cs_new:Npn \file_parse_full_name_apply:nN #1
   {
-    \__file_parse_full_name_split:nNNNTF {#2} / #4 #5
-      { \str_if_empty:NT #4 { \str_set:Nn #4 { / } } }
-      { }
-    \exp_args:No \__file_parse_full_name_split:nNNNTF {#5} . #5 #6
-      { \str_put_left:Nn #6 { . } }
-      {
-        \str_set_eq:NN #5 #6
-        \str_clear:N #6
-      }
+    \exp_args:Ne \__file_parse_full_name_auxi:nN
+      { \__kernel_file_name_sanitize:n {#1} }
   }
-\cs_new_protected:Npn \__file_parse_full_name_split:nNNNTF #1#2#3#4
+\cs_new:Npn \__file_parse_full_name_auxi:nN #1
   {
-    \cs_set_protected:Npn \__file_tmp:w ##1 ##2 #2 ##3 \s__file_stop
+    \__file_parse_full_name_area:nw { } #1
+      / \s__file_stop
+  }
+\cs_new:Npn \__file_parse_full_name_area:nw #1 #2 / #3 \s__file_stop
+  {
+    \tl_if_empty:nTF {#3}
+      { \__file_parse_full_name_base:nw { } #2 . \s__file_stop {#1} }
+      { \__file_parse_full_name_area:nw { #1 / #2 } #3 \s__file_stop }
+  }
+\cs_new:Npn \__file_parse_full_name_base:nw #1 #2 . #3 \s__file_stop
+  {
+    \tl_if_empty:nTF {#3}
       {
-        \tl_if_empty:nTF {##3}
+        \tl_if_empty:nTF {#1}
           {
-            \str_set:Nn #4 {##2}
-            \tl_if_empty:nTF {##1}
-              {
-                \str_clear:N #3
-                \use_ii:nn
-              }
-              {
-                \str_set:Nx #3 { \str_tail:n {##1} }
-                \use_i:nn
-              }
+            \tl_if_empty:nTF {#2}
+              { \__file_parse_full_name_tidy:nnnN { } { } }
+              { \__file_parse_full_name_tidy:nnnN { .#2 } { } }
           }
-          { \__file_tmp:w { ##1 #2 ##2 } ##3 \s__file_stop }
+          { \__file_parse_full_name_tidy:nnnN {#1} { .#2 } }
       }
-    \__file_tmp:w { } #1 #2 \s__file_stop
+      { \__file_parse_full_name_base:nw { #1 . #2 } #3 \s__file_stop }
   }
+\cs_new:Npn \__file_parse_full_name_tidy:nnnN #1 #2 #3 #4
+  {
+    \exp_args:Nee #4
+      {
+        \str_if_eq:nnF {#3} { / } { \use_none:n }
+        #3 \prg_do_nothing:
+      }
+      { \use_none:n #1 \prg_do_nothing: }
+      {#2}
+  }
+\cs_new_protected:Npn \file_parse_full_name:nNNN #1 #2 #3 #4
+  {
+    \file_parse_full_name_apply:nN {#1}
+      \__file_full_name_assign:nnnNNN #2 #3 #4
+  }
+\cs_new_protected:Npn \__file_full_name_assign:nnnNNN #1 #2 #3 #4 #5 #6
+  {
+    \str_set:Nn #4 {#1}
+    \str_set:Nn #5 {#2}
+    \str_set:Nn #6 {#3}
+  }
+\cs_generate_variant:Nn \file_parse_full_name:nNNN { V }
 \cs_new_protected:Npn \file_show_list: { \__file_list:N \msg_show:nnxxxx }
 \cs_new_protected:Npn \file_log_list: { \__file_list:N \msg_log:nnxxxx }
 \cs_new_protected:Npn \__file_list:N #1
@@ -14126,24 +13551,23 @@
 \cs_generate_variant:Nn \intarray_count:N { c }
 \cs_new:Npn \__intarray_signed_max_dim:n #1
   { \int_value:w \int_compare:nNnT {#1} < 0 { - } \c_max_dim }
-\cs_new:Npn \__intarray_bounds:NNnTF #1#2#3#4#5
+\cs_new:Npn \__intarray_bounds:NNnTF #1#2#3
   {
     \if_int_compare:w 1 > #3 \exp_stop_f:
-      \__intarray_bounds_error:NNn #1 #2 {#3}
-      #5
+      \__intarray_bounds_error:NNnw #1 #2 {#3}
     \else:
       \if_int_compare:w #3 > \intarray_count:N #2 \exp_stop_f:
-        \__intarray_bounds_error:NNn #1 #2 {#3}
-        #5
-      \else:
-        #4
+        \__intarray_bounds_error:NNnw #1 #2 {#3}
       \fi:
     \fi:
+    \use_i:nn
   }
-\cs_new:Npn \__intarray_bounds_error:NNn #1#2#3
+\cs_new:Npn \__intarray_bounds_error:NNnw #1#2#3#4 \use_i:nn #5#6
   {
+    #4
     #1 { kernel } { out-of-bounds }
       { \token_to_str:N #2 } {#3} { \intarray_count:N #2 }
+    #6
   }
 \cs_new_protected:Npn \__kernel_intarray_gset:Nnn #1#2#3
   { \__intarray_entry:w #2 #1 #3 \c__intarray_sp_dim }
@@ -15749,7 +15173,8 @@
 \cs_new:Npn \__fp_parse_exponent:N #1
   {
     \if:w e \if:w E \exp_not:N #1 e \else: \exp_not:N #1 \fi:
-      \exp_after:wN \__fp_parse_exponent_aux:N
+      \exp_after:wN \__fp_parse_exponent_aux:NN
+      \exp_after:wN #1
       \exp:w
     \else:
       0 \__fp_parse_return_semicolon:w #1
@@ -15756,15 +15181,15 @@
     \fi:
     \__fp_parse_expand:w
   }
-\cs_new:Npn \__fp_parse_exponent_aux:N #1
+\cs_new:Npn \__fp_parse_exponent_aux:NN #1#2
   {
-    \if_int_compare:w \if_catcode:w \scan_stop: \exp_not:N #1
-                0 \else: `#1 \fi: > `9 \exp_stop_f:
-      0 \exp_after:wN ; \exp_after:wN e
+    \if_int_compare:w \if_catcode:w \scan_stop: \exp_not:N #2
+                0 \else: `#2 \fi: > `9 \exp_stop_f:
+      0 \exp_after:wN ; \exp_after:wN #1
     \else:
       \exp_after:wN \__fp_parse_exponent_sign:N
     \fi:
-    #1
+    #2
   }
 \cs_new:Npn \__fp_parse_exponent_sign:N #1
   {
@@ -20684,6 +20109,361 @@
   }
 \cs_new:Npn \__fp_array_item_normal:w #1 #2#3#4#5 #6 ; #7 ; #8 ; #9
   { #9 \s__fp \__fp_chk:w 1 #1 {#8} #7 {#2#3#4#5} {#6} ; }
+%% File: l3cctab.dtx
+\seq_new:N \g__cctab_stack_seq
+\seq_new:N \g__cctab_unused_seq
+\seq_new:N \g__cctab_group_seq
+\int_new:N  \g__cctab_allocate_int
+\tl_new:N \l__cctab_internal_a_tl
+\tl_new:N \l__cctab_internal_b_tl
+\prop_new:N \g__cctab_endlinechar_prop
+\sys_if_engine_luatex:TF
+  {
+    \cs_new_protected:Npn \cctab_new:N #1
+      {
+        \__kernel_chk_if_free_cs:N #1
+        \__cctab_new:N #1
+      }
+    \cs_new_eq:NN \__cctab_new:N \newcatcodetable
+  }
+  {
+    \cs_new_protected:Npn \__cctab_new:N #1
+      { \intarray_new:Nn #1 { 257 } }
+    \cs_new_protected:Npn \__cctab_gstore:Nnn #1#2#3
+      { \intarray_gset:Nnn #1 { \int_eval:n { #2 + 1 } } {#3} }
+    \cs_new_protected:Npn \cctab_new:N #1
+      {
+        \__kernel_chk_if_free_cs:N #1
+        \__cctab_new:N #1
+        \int_step_inline:nn { 256 }
+          { \__kernel_intarray_gset:Nnn #1 {##1} { 12 } }
+        \__kernel_intarray_gset:Nnn #1 { 257 } { 13 }
+        \__cctab_gstore:Nnn #1 { 0 } { 9 }
+        \__cctab_gstore:Nnn #1 { 13 } { 5 }
+        \__cctab_gstore:Nnn #1 { 32 } { 10 }
+        \__cctab_gstore:Nnn #1 { 37 } { 14 }
+        \int_step_inline:nnn { 65 } { 90 }
+          { \__cctab_gstore:Nnn #1 {##1} { 11 } }
+        \__cctab_gstore:Nnn #1 { 92 } { 0 }
+        \int_step_inline:nnn { 97 } { 122 }
+          { \__cctab_gstore:Nnn #1 {##1} { 11 } }
+        \__cctab_gstore:Nnn #1 { 127 } { 15 }
+      }
+  }
+\cs_generate_variant:Nn \cctab_new:N { c }
+\sys_if_engine_luatex:TF
+  {
+    \cs_new_protected:Npn \__cctab_gset:n #1
+      { \exp_args:Nf \__cctab_gset_aux:n { \int_eval:n {#1} } }
+    \cs_new_protected:Npn \__cctab_gset_aux:n #1
+      {
+        \tex_savecatcodetable:D #1 \scan_stop:
+        \int_compare:nNnTF { \tex_endlinechar:D } = { 13 }
+          { \prop_gremove:Nn \g__cctab_endlinechar_prop {#1} }
+          {
+            \prop_gput:NnV \g__cctab_endlinechar_prop {#1}
+              \tex_endlinechar:D
+          }
+      }
+  }
+  {
+    \cs_new_protected:Npn \__cctab_gset:n #1
+      {
+        \int_step_inline:nn { 256 }
+          {
+            \__kernel_intarray_gset:Nnn #1 {##1}
+              { \char_value_catcode:n { ##1 - 1 } }
+          }
+        \__kernel_intarray_gset:Nnn #1 { 257 }
+          { \tex_endlinechar:D }
+      }
+  }
+\cs_new_protected:Npn \cctab_gset:Nn #1#2
+  {
+    \__cctab_chk_if_valid:NT #1
+      {
+        \group_begin:
+          \cctab_select:N \c_initex_cctab
+          #2 \scan_stop:
+          \__cctab_gset:n {#1}
+        \group_end:
+      }
+  }
+\cs_generate_variant:Nn \cctab_gset:Nn { c }
+\sys_if_engine_luatex:T
+  {
+    \__cctab_new:N \g__cctab_internal_cctab
+    \cs_new:Npn \__cctab_internal_cctab_name:
+      {
+        g__cctab_internal
+        \tex_romannumeral:D \tex_currentgrouplevel:D
+        _cctab
+      }
+  }
+\cs_new_protected:Npn \cctab_select:N #1
+  { \__cctab_chk_if_valid:NT #1 { \__cctab_select:N #1 } }
+\cs_generate_variant:Nn \cctab_select:N { c }
+\sys_if_engine_luatex:TF
+  {
+    \cs_new_protected:Npn \__cctab_select:N #1
+      {
+        \tex_catcodetable:D #1
+        \prop_get:NVNTF \g__cctab_endlinechar_prop #1 \l__cctab_internal_a_tl
+          { \int_set:Nn \tex_endlinechar:D { \l__cctab_internal_a_tl } }
+          { \int_set:Nn \tex_endlinechar:D { 13 } }
+        \cs_if_exist:cF { \__cctab_internal_cctab_name: }
+          { \exp_args:Nc \__cctab_new:N { \__cctab_internal_cctab_name: } }
+        \exp_args:Nc \tex_savecatcodetable:D { \__cctab_internal_cctab_name: }
+        \exp_args:Nc \tex_catcodetable:D { \__cctab_internal_cctab_name: }
+      }
+  }
+  {
+    \cs_new_protected:Npn \__cctab_select:N #1
+      {
+        \int_step_inline:nn { 256 }
+          {
+            \char_set_catcode:nn { ##1 - 1 }
+              { \__kernel_intarray_item:Nn #1 {##1} }
+          }
+        \int_set:Nn \tex_endlinechar:D
+          { \__kernel_intarray_item:Nn #1 { 257 } }
+      }
+  }
+\sys_if_engine_luatex:TF
+  {
+    \cs_new_protected:Npn \__cctab_begin_aux:
+      {
+        \__cctab_new:N \g__cctab_next_cctab
+        \tl_set:NV \l__cctab_internal_a_tl \g__cctab_next_cctab
+        \cs_undefine:N \g__cctab_next_cctab
+      }
+  }
+  {
+    \cs_new_protected:Npn \__cctab_begin_aux:
+      {
+        \int_gincr:N \g__cctab_allocate_int
+        \exp_args:Nc \__cctab_new:N
+          { g__cctab_ \int_use:N \g__cctab_allocate_int _cctab }
+        \exp_args:NNc \tl_set:Nn \l__cctab_internal_a_tl
+          { g__cctab_ \int_use:N \g__cctab_allocate_int _cctab }
+      }
+  }
+\cs_new_protected:Npn \cctab_begin:N #1
+  {
+    \__cctab_chk_if_valid:NT #1
+      {
+        \seq_gpop:NNF \g__cctab_unused_seq \l__cctab_internal_a_tl
+          { \__cctab_begin_aux: }
+        \exp_args:Nx \__cctab_chk_group_begin:n
+          { \__cctab_nesting_number:N \l__cctab_internal_a_tl }
+        \seq_gpush:NV \g__cctab_stack_seq \l__cctab_internal_a_tl
+        \exp_args:NV \__cctab_gset:n \l__cctab_internal_a_tl
+        \__cctab_select:N #1
+      }
+  }
+\cs_generate_variant:Nn \cctab_begin:N { c }
+\cs_new_protected:Npn \cctab_end:
+  {
+    \seq_gpop:NNTF \g__cctab_stack_seq \l__cctab_internal_a_tl
+      {
+        \seq_gpush:NV \g__cctab_unused_seq \l__cctab_internal_a_tl
+        \exp_args:Nx \__cctab_chk_group_end:n
+          { \__cctab_nesting_number:N \l__cctab_internal_a_tl }
+        \__cctab_select:N \l__cctab_internal_a_tl
+      }
+      { \__kernel_msg_error:nn { kernel } { cctab-extra-end } }
+  }
+\cs_new_protected:Npn \__cctab_chk_group_begin:n #1
+  {
+    \seq_gpush:Nx \g__cctab_group_seq
+      { \int_use:N \tex_currentgrouplevel:D }
+    \cs_set_eq:cN { __cctab_group_ #1 _chk: } \prg_do_nothing:
+  }
+\cs_new_protected:Npn \__cctab_chk_group_end:n #1
+  {
+    \seq_gpop:NN \g__cctab_group_seq \l__cctab_internal_b_tl
+    \bool_lazy_and:nnF
+      {
+        \int_compare_p:nNn
+          { \tex_currentgrouplevel:D } = { \l__cctab_internal_b_tl }
+      }
+      { \cs_if_exist_p:c { __cctab_group_ #1 _chk: } }
+      {
+        \__kernel_msg_error:nnx { kernel } { cctab-group-mismatch }
+          {
+            \int_sign:n
+              { \tex_currentgrouplevel:D - \l__cctab_internal_b_tl }
+          }
+      }
+    \cs_undefine:c { __cctab_group_ #1 _chk: }
+  }
+\sys_if_engine_luatex:TF
+  { \cs_new:Npn \__cctab_nesting_number:N #1 {#1} }
+  {
+    \cs_new:Npn \__cctab_nesting_number:N #1
+      {
+        \exp_after:wN \exp_after:wN \exp_after:wN \__cctab_nesting_number:w
+          \exp_after:wN \token_to_str:N #1
+      }
+    \use:x
+      {
+        \cs_new:Npn \exp_not:N \__cctab_nesting_number:w
+          ##1 \tl_to_str:n { g__cctab_ } ##2 \tl_to_str:n { _cctab } {##2}
+      }
+  }
+\cs_if_exist:NT \hook_gput_code:nnn
+  {
+    \hook_gput_code:nnn { enddocument/end } { kernel }
+      {
+        \seq_if_empty:NF \g__cctab_stack_seq
+          { \__kernel_msg_error:nn { kernel } { cctab-missing-end } }
+      }
+  }
+\prg_new_eq_conditional:NNn \cctab_if_exist:N \cs_if_exist:N
+  { TF , T , F , p }
+\prg_new_eq_conditional:NNn \cctab_if_exist:c \cs_if_exist:c
+  { TF , T , F , p }
+\prg_new_protected_conditional:Npnn \__cctab_chk_if_valid:N #1
+  { TF , T , F }
+  {
+    \cctab_if_exist:NTF #1
+      {
+        \__cctab_chk_if_valid_aux:NTF #1
+          { \prg_return_true: }
+          {
+            \__kernel_msg_error:nnx { kernel } { invalid-cctab }
+              { \token_to_str:N #1 }
+            \prg_return_false:
+          }
+      }
+      {
+        \__kernel_msg_error:nnx { kernel } { command-not-defined }
+          { \token_to_str:N #1 }
+        \prg_return_false:
+      }
+  }
+\sys_if_engine_luatex:TF
+  {
+    \cs_new_protected:Npn \__cctab_chk_if_valid_aux:NTF #1
+      {
+        \int_compare:nNnTF {#1-1} < { \e at alloc@ccodetable at count }
+      }
+  }
+  {
+    \cs_new_protected:Npn \__cctab_chk_if_valid_aux:NTF #1
+      {
+        \exp_args:Nf \str_if_in:nnTF
+          { \cs_meaning:N #1 }
+          { select~font~cmr10~at~ }
+      }
+  }
+\cs_new_protected:Npn \cctab_const:Nn #1#2
+  {
+    \cctab_new:N #1
+    \cctab_gset:Nn #1 {#2}
+  }
+\cs_generate_variant:Nn \cctab_const:Nn { c }
+\cctab_new:N \c_initex_cctab
+\cctab_const:Nn \c_other_cctab
+  {
+    \cctab_select:N \c_initex_cctab
+    \int_set:Nn \tex_endlinechar:D     { -1 }
+    \int_step_inline:nnn { 0 } { 127 }
+      { \char_set_catcode_other:n {#1} }
+  }
+\cctab_const:Nn \c_str_cctab
+  {
+    \cctab_select:N \c_other_cctab
+    \char_set_catcode_space:n { 32 }
+  }
+\cs_if_exist:NTF \@expl at finalise@setup@@
+  { \tl_gput_right:Nn \@expl at finalise@setup@@ }
+  { \use:n }
+  {
+    \__cctab_new:N \c_code_cctab
+    \group_begin:
+      \int_set:Nn \tex_endlinechar:D { 32 }
+      \char_set_catcode_invalid:n { 0 }
+      \bool_lazy_or:nnTF
+        { \sys_if_engine_xetex_p: } { \sys_if_engine_luatex_p: }
+        { \int_step_function:nN { 31 } \char_set_catcode_invalid:n }
+        { \int_step_function:nN { 31 } \char_set_catcode_active:n }
+      \int_step_function:nnN { 33 } { 64 } \char_set_catcode_other:n
+      \int_step_function:nnN { 65 } { 90 } \char_set_catcode_letter:n
+      \int_step_function:nnN { 91 } { 96 } \char_set_catcode_other:n
+      \int_step_function:nnN { 97 } { 122 } \char_set_catcode_letter:n
+      \char_set_catcode_ignore:n           { 9 }   % tab
+      \char_set_catcode_other:n            { 10 }  % lf
+      \char_set_catcode_active:n           { 12 }  % ff
+      \char_set_catcode_end_line:n         { 13 }  % cr
+      \char_set_catcode_ignore:n           { 32 }  % space
+      \char_set_catcode_parameter:n        { 35 }  % hash
+      \char_set_catcode_math_toggle:n      { 36 }  % dollar
+      \char_set_catcode_comment:n          { 37 }  % percent
+      \char_set_catcode_alignment:n        { 38 }  % ampersand
+      \char_set_catcode_letter:n           { 58 }  % colon
+      \char_set_catcode_escape:n           { 92 }  % backslash
+      \char_set_catcode_math_superscript:n { 94 }  % circumflex
+      \char_set_catcode_letter:n           { 95 }  % underscore
+      \char_set_catcode_group_begin:n      { 123 } % left brace
+      \char_set_catcode_other:n            { 124 } % pipe
+      \char_set_catcode_group_end:n        { 125 } % right brace
+      \char_set_catcode_space:n            { 126 } % tilde
+      \char_set_catcode_invalid:n          { 127 } % ^^?
+      \__cctab_gset:n { \c_code_cctab }
+    \group_end:
+    \cctab_const:Nn \c_document_cctab
+      {
+        \cctab_select:N \c_code_cctab
+        \int_set:Nn \tex_endlinechar:D { 13 }
+        \char_set_catcode_space:n          { 9 }
+        \char_set_catcode_space:n          { 32 }
+        \char_set_catcode_other:n          { 58 }
+        \char_set_catcode_math_subscript:n { 95 }
+        \char_set_catcode_active:n         { 126 }
+      }
+  }
+\__kernel_msg_new:nnnn { kernel } { cctab-stack-full }
+  { The~category~code~table~stack~is~exhausted. }
+  {
+    LaTeX~has~been~asked~to~switch~to~a~new~category~code~table,~
+    but~there~is~no~more~space~to~do~this!
+  }
+\__kernel_msg_new:nnnn { kernel } { cctab-extra-end }
+  { Extra~\iow_char:N\\cctab_end:~ignored~\msg_line_context:. }
+  {
+    LaTeX~came~across~a~\iow_char:N\\cctab_end:~without~a~matching~
+    \iow_char:N\\cctab_begin:N.~This~command~will~be~ignored.
+  }
+\__kernel_msg_new:nnnn { kernel } { cctab-missing-end }
+  { Missing~\iow_char:N\\cctab_end:~before~end~of~TeX~run. }
+  {
+    LaTeX~came~across~more~\iow_char:N\\cctab_begin:N~than~
+    \iow_char:N\\cctab_end:.
+  }
+\__kernel_msg_new:nnnn { kernel } { invalid-cctab }
+  { Invalid~\iow_char:N\\catcode~table. }
+  {
+    You~can~only~switch~to~a~\iow_char:N\\catcode~table~that~is~
+    initialized~using~\iow_char:N\\cctab_new:N~or~
+    \iow_char:N\\cctab_const:Nn.
+  }
+\__kernel_msg_new:nnnn { kernel } { cctab-group-mismatch }
+  {
+    \iow_char:N\\cctab_end:~occurred~in~a~
+    \int_case:nn {#1}
+      {
+        { 0 } { different~group }
+        { 1 } { higher~group~level }
+        { -1 } { lower~group~level }
+      } ~than~
+    the~matching~\iow_char:N\\cctab_begin:N.
+  }
+  {
+    Catcode~tables~and~groups~must~be~properly~nested,~but~
+    you~tried~to~interleave~them.~LaTeX~will~try~to~proceed,~
+    but~results~may~be~unexpected.
+  }
 %% File l3sort.dtx
 \seq_new:N \g__sort_internal_seq
 \tl_new:N \g__sort_internal_tl
@@ -24471,7 +24251,7 @@
 \cs_new_protected:Npn \__regex_show_item_exact_cs:n #1
   {
     \seq_set_split:Nnn \l__regex_internal_seq { \scan_stop: } {#1}
-    \seq_set_map:NNn \l__regex_internal_seq
+    \seq_set_map_x:NNn \l__regex_internal_seq
       \l__regex_internal_seq { \iow_char:N\\##1 }
     \__regex_show_one:n
       { control~sequence~ \seq_use:Nn \l__regex_internal_seq { ~or~ } }
@@ -25626,7 +25406,7 @@
             { \flag_height:n { __regex_end } }
             { \flag_height:n { __regex_begin } }
         }
-      \seq_set_map:NNn \l__regex_internal_seq \l__regex_internal_seq {##1}
+      \seq_set_map_x:NNn \l__regex_internal_seq \l__regex_internal_seq {##1}
       \exp_args:NNNo
       \group_end:
       \tl_set:Nn #1 { \l__regex_internal_seq }
@@ -30627,16 +30407,6 @@
     #1 #2 { #3 }
     \__seq_pop_item_def:
   }
-\cs_new_protected:Npn \seq_set_map:NNn
-  { \__seq_set_map:NNNn \tl_set:Nx }
-\cs_new_protected:Npn \seq_gset_map:NNn
-  { \__seq_set_map:NNNn \tl_gset:Nx }
-\cs_new_protected:Npn \__seq_set_map:NNNn #1#2#3#4
-  {
-    \__seq_push_item_def:n { \exp_not:N \__seq_item:n {#4} }
-    #1 #2 { #3 }
-    \__seq_pop_item_def:
-  }
 \cs_new_protected:Npn \seq_set_from_inline_x:Nnn
   { \__seq_set_from_inline_x:NNnn \tl_set:Nx }
 \cs_new_protected:Npn \seq_gset_from_inline_x:Nnn
@@ -31070,6 +30840,52 @@
   { \c_sys_jobname_str } { 2017-01-01 }
 \__deprecation_old:Nnn \c_minus_one
   { -1 } { 2019-01-01 }
+\__deprecation_old:Nnn \c_zero
+  { 0 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_one
+  { 1 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_two
+  { 2 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_three
+  { 3 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_four
+  { 4 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_five
+  { 5 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_six
+  { 6 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_seven
+  { 7 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_eight
+  { 8 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_nine
+  { 9 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_ten
+  { 10 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_eleven
+  { 11 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_twelve
+  { 12 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_thirteen
+  { 13 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_fourteen
+  { 14 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_fifteen
+  { 15 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_sixteen
+  { 16 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_thirty_two
+  { 32 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_one_hundred
+  { 100 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_two_hundred_fifty_five
+  { 255 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_two_hundred_fifty_six
+  { 256 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_one_thousand
+  { 1000 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_ten_thousand
+  { 10000 } { 2020-01-01 }
 \__deprecation_old:Nnn \dim_case:nnn
   { \dim_case:nnF } { 2015-07-14 }
 \__deprecation_old:Nnn \file_add_path:nN
@@ -31110,6 +30926,12 @@
   { \iow_show_list: } { 2019-01-01 }
 \__deprecation_old:Nnn \iow_log_streams:
   { \iow_log_list: } { 2019-01-01 }
+\__deprecation_old:Nnn \lua_escape_x:n
+  { \lua_escape:e } { 2020-01-01 }
+\__deprecation_old:Nnn \lua_now_x:n
+  { \lua_now:e } { 2020-01-01 }
+\__deprecation_old_protected:Nnn \lua_shipout_x:n
+  { \lua_shipout_e:n } { 2020-01-01 }
 \__deprecation_old:Nnn \luatex_if_engine_p:
   { \sys_if_engine_luatex_p: } { 2017-01-01 }
 \__deprecation_old:Nnn \luatex_if_engine:F
@@ -31118,6 +30940,12 @@
   { \sys_if_engine_luatex:T } { 2017-01-01 }
 \__deprecation_old:Nnn \luatex_if_engine:TF
   { \sys_if_engine_luatex:TF } { 2017-01-01 }
+\__deprecation_old_protected:Nnn \msg_interrupt:nnn
+  { [Defined~error~message] } { 2020-01-01 }
+\__deprecation_old_protected:Nnn \msg_log:n
+  { \iow_log:n } { 2020-01-01 }
+\__deprecation_old_protected:Nnn \msg_term:n
+  { \iow_term:n } { 2020-01-01 }
 \__deprecation_old:Nnn \pdftex_if_engine_p:
   { \sys_if_engine_pdftex_p: } { 2017-01-01 }
 \__deprecation_old:Nnn \pdftex_if_engine:F
@@ -31144,8 +30972,28 @@
   { \str_case:nnF } { 2015-07-14 }
 \__deprecation_old:Nnn \str_case:onn
   { \str_case:onF } { 2015-07-14 }
+\__deprecation_old:Nnn \str_case_x:nn
+  { \str_case_e:nn } { 2020-01-01 }
 \__deprecation_old:Nnn \str_case_x:nnn
   { \str_case_e:nnF } { 2015-07-14 }
+\__deprecation_old:Nnn \str_case_x:nnT
+  { \str_case_e:nnT } { 2020-01-01 }
+\__deprecation_old:Nnn \str_case_x:nnTF
+  { \str_case_e:nnTF } { 2020-01-01 }
+\__deprecation_old:Nnn \str_case_x:nnF
+  { \str_case_e:nnF } { 2020-01-01 }
+\__deprecation_old:Nnn \str_if_eq_x_p:nn
+  { \str_if_eq_p:ee } { 2020-01-01 }
+\__deprecation_old:Nnn \str_if_eq_x:nnT
+  { \str_if_eq:eeT } { 2020-01-01 }
+\__deprecation_old:Nnn \str_if_eq_x:nnF
+  { \str_if_eq:eeF } { 2020-01-01 }
+\__deprecation_old:Nnn \str_if_eq_x:nnTF
+  { \str_if_eq:eeTF } { 2020-01-01 }
+\__deprecation_old_protected:Nnn \tl_show_analysis:N
+  { \tl_analysis_show:N } { 2020-01-01 }
+\__deprecation_old_protected:Nnn \tl_show_analysis:n
+  { \tl_analysis_show:n } { 2020-01-01 }
 \__deprecation_old:Nnn \tl_case:cnn
   { \tl_case:cnF } { 2015-07-14 }
 \__deprecation_old:Nnn \tl_case:Nnn
@@ -31164,50 +31012,6 @@
   { \sys_if_engine_xetex:T } { 2017-01-01 }
 \__deprecation_old:Nnn \xetex_if_engine:TF
   { \sys_if_engine_xetex:TF } { 2017-01-01 }
-\cs_new_protected:Npn \__deprecation_primitive:NN #1#2 { }
-\exp_last_unbraced:NNNNo
-  \cs_new:Npn \__deprecation_primitive:w #1 { \token_to_str:N _ } { }
-\__kernel_deprecation_code:nn
-  {
-    \cs_set_protected:Npn \__kernel_primitive:NN #1
-      {
-        \exp_after:wN \__deprecation_primitive:NN
-        \exp_after:wN #1
-        \exp_not:N
-      }
-    \cs_set_protected:Npn \__deprecation_primitive:NN #1#2
-      {
-        \tex_let:D #2 \scan_stop:
-        \exp_args:NNx \__kernel_deprecation_error:Nnn #2
-          {
-            \iow_char:N \\
-            \cs_if_exist:NTF #1
-              { \cs_to_str:N #1 }
-              {
-                tex_
-                \exp_last_unbraced:Nf
-                \__deprecation_primitive:w { \cs_to_str:N #2 }
-              }
-          }
-          { 2020-01-01 }
-      }
-    \__kernel_primitives:
-  }
-  {
-    \cs_set_protected:Npn \__kernel_primitive:NN #1
-      {
-        \exp_after:wN \__deprecation_primitive:NN
-        \exp_after:wN #1
-        \exp_not:N
-      }
-    \cs_set_protected:Npn \__deprecation_primitive:NN #1#2
-      {
-        \tex_let:D #2 #1
-        \cs_if_exist:cT { tex_ \cs_to_str:N #1 :D }
-          { \cs_set_eq:Nc #2 { tex_ \cs_to_str:N #1 :D } }
-      }
-    \__kernel_primitives:
-  }
 \group_begin:
 \cs_set_protected:Npn \ProvidesExplFile
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2020-07-17 21:45:53 UTC (rev 55860)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2020-06-18}%
+\def\ExplFileDate{2020-07-17}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \def\tempa{LaTeX2e}%

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2020-07-17 21:45:53 UTC (rev 55860)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2020-06-18}%
+\def\ExplFileDate{2020-07-17}%
 \let\ExplLoaderFileDate\ExplFileDate
 \everyjob\expandafter{\the\everyjob
   \message{L3 programming layer <\ExplFileDate>}%

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2020-07-17 21:45:53 UTC (rev 55860)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2020-06-18}%
+\def\ExplFileDate{2020-07-17}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def	2020-07-17 21:45:53 UTC (rev 55860)
@@ -497,6 +497,7 @@
       \box_gset_eq:NN
       \box_gset_eq_drop:NN
       \box_gset_to_last:N
+      \cctab_gset:Nn
       \clist_gset_eq:NN
       \dim_gset_eq:NN
       \dim_gzero:N
@@ -554,6 +555,7 @@
     { }
     {
       \bool_const:Nn
+      \cctab_const:Nn
       \dim_const:Nn
       \int_const:Nn
       \intarray_const_from_clist:Nn
@@ -581,6 +583,10 @@
   \__kernel_patch:nnn
     { \__kernel_chk_var_scope:NN g #1 }
     { }
+    { \cctab_new:N }
+  \__kernel_patch:nnn
+    { \__kernel_chk_var_scope:NN g #1 }
+    { }
     { \intarray_new:Nn }
   \__kernel_patch:nnn
     { \__kernel_chk_var_scope:NN q #1 }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def	2020-07-17 21:45:53 UTC (rev 55860)
@@ -36,149 +36,6 @@
 \cs_gset_protected:Npn \vbox_unpack_clear:N
   { \vbox_unpack_drop:N }
 \cs_generate_variant:Nn \vbox_unpack_clear:N { c }
-\cs_gset_protected:Npn \__int_deprecated_constants:nn #1#2
-  {
-    #1 \c_zero                   {   0 } #2
-    #1 \c_one                    {   1 } #2
-    #1 \c_two                    {   2 } #2
-    #1 \c_three                  {   3 } #2
-    #1 \c_four                   {   4 } #2
-    #1 \c_five                   {   5 } #2
-    #1 \c_six                    {   6 } #2
-    #1 \c_seven                  {   7 } #2
-    #1 \c_eight                  {   8 } #2
-    #1 \c_nine                   {   9 } #2
-    #1 \c_ten                    {  10 } #2
-    #1 \c_eleven                 {  11 } #2
-    #1 \c_twelve                 {  12 } #2
-    #1 \c_thirteen               {  13 } #2
-    #1 \c_fourteen               {  14 } #2
-    #1 \c_fifteen                {  15 } #2
-    #1 \c_sixteen                {  16 } #2
-    #1 \c_thirty_two             {  32 } #2
-    #1 \c_one_hundred            { 100 } #2
-    #1 \c_two_hundred_fifty_five { 255 } #2
-    #1 \c_two_hundred_fifty_six  { 256 } #2
-    #1 \c_one_thousand         {  1000 } #2
-    #1 \c_ten_thousand         { 10000 } #2
-  }
-\cs_set_protected:Npn \__int_deprecated_constants:Nn #1#2
-  {
-    \cs_if_free:NT #1
-      { \int_const:Nn #1 {#2} }
-  }
-\__int_deprecated_constants:nn { \__int_deprecated_constants:Nn } { }
-\__kernel_deprecation_code:nn
-  {
-    \__int_deprecated_constants:nn
-      { \exp_after:wN \__kernel_deprecation_error:Nnn \exp_not:N }
-      { { 2020-01-01 } }
-  }
-  {
-    \__int_deprecated_constants:nn
-      {
-        \exp_after:wN \use:nnn
-        \exp_after:wN \__int_constdef:Nw \exp_not:N
-      }
-      { \exp_stop_f: }
-  }
-\cs_gset_eq:NN \__int_value:w \int_value:w
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_now:e }
-\cs_gset:Npn \lua_now_x:n #1 { \__lua_now:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_escape:e }
-\cs_gset:Npn \lua_escape_x:n #1 { \__lua_escape:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_shipout_e:n }
-\cs_gset_protected:Npn \lua_shipout_x:n #1 { \__lua_shipout:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \iow_log:n }
-\cs_gset_protected:Npn \msg_log:n #1
-  {
-    \iow_log:n { ................................................. }
-    \iow_wrap:nnnN { . ~ #1} { . ~ } { } \iow_log:n
-    \iow_log:n { ................................................. }
-  }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \iow_term:n }
-\cs_gset_protected:Npn \msg_term:n #1
-  {
-    \iow_term:n { ************************************************* }
-    \iow_wrap:nnnN { * ~ #1} { * ~ } { } \iow_term:n
-    \iow_term:n { ************************************************* }
-  }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { [Defined~error~message] }
-\cs_gset_protected:Npn \msg_interrupt:nnn #1#2#3
-  {
-    \tl_if_empty:nTF {#3}
-      {
-        \__msg_old_interrupt_wrap:nn { \\ \c__msg_no_info_text_tl }
-          {#1 \\\\ #2 \\\\ \c__msg_continue_text_tl }
-      }
-      {
-        \__msg_old_interrupt_wrap:nn { \\ #3 }
-          {#1 \\\\ #2 \\\\ \c__msg_help_text_tl }
-      }
-  }
-\cs_gset_protected:Npn \__msg_old_interrupt_wrap:nn #1#2
-  {
-    \iow_wrap:nnnN {#1} { | ~ } { } \__msg_old_interrupt_more_text:n
-    \iow_wrap:nnnN {#2} { ! ~ } { } \__msg_old_interrupt_text:n
-  }
-\cs_gset_protected:Npn \__msg_old_interrupt_more_text:n #1
-  {
-    \exp_args:Nx \tex_errhelp:D
-      {
-        |'''''''''''''''''''''''''''''''''''''''''''''''
-        #1 \iow_newline:
-        |...............................................
-      }
-  }
-\group_begin:
-  \char_set_lccode:nn {`\{} {`\ }
-  \char_set_lccode:nn {`\}} {`\ }
-  \char_set_lccode:nn {`\&} {`\!}
-  \char_set_catcode_active:N \&
-\tex_lowercase:D
-  {
-    \group_end:
-    \cs_gset_protected:Npn \__msg_old_interrupt_text:n #1
-      {
-        \iow_term:x
-          {
-            \iow_newline:
-            !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-            \iow_newline:
-            !
-          }
-        \__kernel_iow_with:Nnn \tex_newlinechar:D { `\^^J }
-          {
-            \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
-              {
-                \group_begin:
-                  \cs_set_protected:Npn &
-                    {
-                      \tex_errmessage:D
-                        {
-                          #1
-                          \use_none:n
-                            { ............................................ }
-                        }
-                    }
-                  \exp_after:wN
-                \group_end:
-                &
-              }
-          }
-      }
-  }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break_point:Nn }
-\cs_gset:Npn \__prg_break_point:Nn { \prg_break_point:Nn }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break_point: }
-\cs_gset:Npn \__prg_break_point: { \prg_break_point: }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_map_break:Nn }
-\cs_gset:Npn \__prg_map_break:Nn #1 \__prg_break_point:Nn
-  { \prg_map_break:Nn #1 \prg_break_point:Nn }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break: }
-\cs_gset:Npn \__prg_break: #1 \__prg_break_point: { }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break:n }
-\cs_gset:Npn \__prg_break:n #1#2 \__prg_break_point: {#1}
 \__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \str_lowercase:n }
 \cs_gset:Npn \str_lower_case:n { \str_lowercase:n }
 \__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \str_lowercase:f }
@@ -191,22 +48,6 @@
 \cs_gset:Npn \str_fold_case:n { \str_foldcase:n }
 \__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \str_foldcase:V }
 \cs_gset:Npn \str_fold_case:V { \str_foldcase:V }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nn }
-\cs_gset:Npn \str_case_x:nn { \str_case_e:nn }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnT }
-\cs_gset:Npn \str_case_x:nnT { \str_case_e:nnT }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnF }
-\cs_gset:Npn \str_case_x:nnF { \str_case_e:nnF }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnTF }
-\cs_gset:Npn \str_case_x:nnTF { \str_case_e:nnTF }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq_p:ee }
-\cs_gset:Npn \str_if_eq_x_p:nn { \str_if_eq_p:ee }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeT }
-\cs_gset:Npn \str_if_eq_x:nnT { \str_if_eq:eeT }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeF }
-\cs_gset:Npn \str_if_eq_x:nnF { \str_if_eq:eeF }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeTF }
-\cs_gset:Npn \str_if_eq_x:nnTF { \str_if_eq:eeTF }
 \__kernel_patch_deprecation:nnNNpn { 2022-07-01 } { \seq_map_indexed_inline:Nn }
 \cs_gset:Npn \seq_indexed_map_inline:Nn { \seq_map_indexed_inline:Nn }
 \__kernel_patch_deprecation:nnNNpn { 2022-07-01 } { \seq_map_indexed_function:NN }
@@ -263,10 +104,6 @@
 \__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_titlecase:nn }
 \cs_gset:Npn \tl_mixed_case:nn #1#2
   { \text_titlecase:nn {#1} {#2} }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \tl_analysis_show:N }
-\cs_gset_protected:Npn \tl_show_analysis:N { \tl_analysis_show:N }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \tl_analysis_show:n }
-\cs_gset_protected:Npn \tl_show_analysis:n { \tl_analysis_show:n }
 \__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \cs_prefix_spec:N }
 \cs_gset:Npn \token_get_prefix_spec:N { \cs_prefix_spec:N }
 \__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \cs_argument_spec:N }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2020-07-17 21:39:34 UTC (rev 55859)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2020-07-17 21:45:53 UTC (rev 55860)
@@ -1618,7 +1618,7 @@
   {
     \seq_set_map:NNn \l__codedoc_tmpa_seq
       \g__codedoc_nested_names_seq
-      { \exp_not:n { \__codedoc_macro_end_wrap_item:n {##1} } }
+      { \__codedoc_macro_end_wrap_item:n {##1} }
     End~ definition~ for~
     \int_compare:nTF { \seq_count:N \l__codedoc_tmpa_seq <= 3 }
       {



More information about the tex-live-commits mailing list.