texlive[61588] Master/texmf-dist: l3 (12jan22)

commits+karl at tug.org commits+karl at tug.org
Wed Jan 12 22:22:19 CET 2022


Revision: 61588
          http://tug.org/svn/texlive?view=revision&revision=61588
Author:   karl
Date:     2022-01-12 22:22:19 +0100 (Wed, 12 Jan 2022)
Log Message:
-----------
l3 (12jan22)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3backend/README.md
    trunk/Master/texmf-dist/doc/latex/l3backend/l3backend-code.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/l3packages/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3packages/README.md
    trunk/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf
    trunk/Master/texmf-dist/dvips/l3backend/l3backend-dvips.pro
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend.ins
    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/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/l3cctab.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.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/l3flag.dtx
    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/l3pdf.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/source/latex/l3packages/l3keys2e/l3keys2e.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.ins
    trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.ins
    trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.ins
    trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.ins
    trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.ins
    trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def
    trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def
    trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def
    trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-luatex.def
    trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
    trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-xetex.def
    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.lua
    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/l3doc.cls
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88591.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885910.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885911.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885913.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885914.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885915.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885916.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88592.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88593.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88594.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88595.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88596.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88597.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88598.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88599.def
    trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.ltx
    trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty

Removed Paths:
-------------
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def

Modified: trunk/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,6 +6,11 @@
 
 ## [Unreleased]
 
+## [2022-01-12]
+
+### Changed
+- Move some functions to `l3color`
+
 ## [2021-12-14]
 
 ### Fixed
@@ -207,7 +212,8 @@
 - Include `l3backend` in file names
 - Moved backend code to internal for each 'parent' module
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2021-12-14...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2022-01-12...HEAD
+[2022-01-12]: https://github.com/latex3/latex3/compare/2021-12-14...2022-01-12
 [2021-12-14]: https://github.com/latex3/latex3/compare/2021-10-17...2021-12-14
 [2021-10-17]: https://github.com/latex3/latex3/compare/2021-10-12...2021-10-17
 [2021-10-12]: https://github.com/latex3/latex3/compare/2021-08-04...2021-10-12

Modified: trunk/Master/texmf-dist/doc/latex/l3backend/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3backend/README.md	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/doc/latex/l3backend/README.md	2022-01-12 21:22:19 UTC (rev 61588)
@@ -1,7 +1,7 @@
 LaTeX3 Backend Drivers
 ======================
 
-Release 2021-12-14
+Release 2022-01-12
 
 This package forms parts of `expl3`, and contains the code used to interface
 with backends (drivers) across the `expl3` codebase. The functions here are
@@ -11,6 +11,6 @@
 
 -----
 
-<p>Copyright (C) 2019-2021 The LaTeX Project <br />
+<p>Copyright (C) 2019-2022 The LaTeX Project <br />
 <a href="http://latex-project.org/">http://latex-project.org/</a> <br />
 All rights reserved.</p>

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2022-01-12 21:22:19 UTC (rev 61588)
@@ -7,6 +7,30 @@
 
 ## [Unreleased]
 
+## [2022-01-12]
+
+### Added
+- Support for validity scope for keys
+- `\peek_remove_filler:n`
+- `\prop_to_keyval:N`
+- `\regex_match_case:nn(TF)`, `\regex_replace_case_once:nN(TF)`,
+  `\regex_replace_case_all:nN(TF)`
+
+### Changed
+- Policy change: functions will no longer be removed after deprecation,
+  thus the Lua functions noted below are the *last* 'stable' code to be
+  removed from `l3kernel` after deprecation
+- Allow indirect conversions between colorspaces through fallback models
+- Move some color functions from `l3backend`
+
+### Deprecated
+- `\peek_..._ignore_spaces:N(TF)` functions
+- `\sys_load_deprecation:`
+- Option `undo-recent-deprecations`
+
+### Removed
+- Lua functions in `l3kernel` table
+
 ## [2021-11-22]
 
 ### Added
@@ -14,7 +38,8 @@
 
 ### Changed
 - Documentation improvements
-- Implementation of `intarray` data tyep with LuaTeX
+- Implementation of `intarray` data type with LuaTeX
+- Better support for LuaMetaTeX
 
 ## [2021-11-12]
 
@@ -93,6 +118,10 @@
   `\ior_show:N`, `\ior_log:N`, `\iow_show:N`, `\iow_log:N`,
   `\tl_log_analysis:N`, `\tl_log_analysis:n`
 - `\legacy_if_set_true:n`, `\legacy_if_set_false:n`, `\legacy_if_set:nn`
+- Matching multiple regex at the same time (issue #433):
+  `\regex_case_match:nn(TF)`,
+  `\regex_case_replace_once:nN(TF)`,
+  `\regex_case_replace_all:nN(TF)`
 
 ### Fixed
 - Checking brace balance in all regex functions (issue #377)
@@ -993,7 +1022,8 @@
 - Step functions have been added for dim variables,
   e.g. `\dim_step_inline:nnnn`
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2021-11-22...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2022-01-12...HEAD
+[2022-01-12]: https://github.com/latex3/latex3/compare/2021-11-22...2022-01-12
 [2021-11-22]: https://github.com/latex3/latex3/compare/2021-11-12...2021-11-22
 [2021-11-12]: https://github.com/latex3/latex3/compare/2021-10-18...2021-11-12
 [2021-10-18]: https://github.com/latex3/latex3/compare/2021-10-17...2021-10-18

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2022-01-12 21:22:19 UTC (rev 61588)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2021-11-22
+Release 2022-01-12
 
 Overview
 --------
@@ -80,6 +80,6 @@
 
 -----
 
-<p>Copyright (C) 1998-2012,2015-2021 The LaTeX Project <br />
+<p>Copyright (C) 1998-2012,2015-2022 The LaTeX Project <br />
 <a href="http://latex-project.org/">http://latex-project.org/</a> <br />
 All rights reserved.</p>

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	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 
 File: interface3.tex
 
-Copyright (C) 1990-2011,2017-2021 The LaTeX Project
+Copyright (C) 1990-2011,2017-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -54,7 +54,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2021-11-22}
+\date{Released 2022-01-12}
 
 \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	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt	2022-01-12 21:22:19 UTC (rev 61588)
@@ -10,37 +10,43 @@
 ==================================
 
 These functions are deprecated and should be removed from packages.
-They will be removed from the sources at the end of the given year.
 
---------------------------------------
-Function                   Expires end
---------------------------------------
-\char_fold_case:N                 2022
-\char_lower_case:N                2022
-\char_mixed_case:N                2022
-\char_upper_case:N                2022
-\char_str_fold_case:N             2022
-\char_str_lower_case:N            2022
-\char_str_mixed_case:N            2022
-\char_str_upper_case:N            2022
-\l_keys_key_tl                    2022
-\l_keys_path_tl                   2022
-\str_declare_eight_bit_encoding:nnn 2022
-\str_fold_case:n                  2022
-\str_fold_case:V                  2022
-\str_lower_case:f                 2022
-\str_lower_case:n                 2022
-\str_upper_case:f                 2022
-\str_upper_case:n                 2022
-\seq_indexed_map_inline:Nn        2023
-\seq_indexed_map_function:NN      2023
-\tl_lower_case:n                  2022
-\tl_lower_case:nn                 2022
-\tl_mixed_case:n                  2022
-\tl_mixed_case:nn                 2022
-\tl_upper_case:n                  2022
-\tl_upper_case:nn                 2022
---------------------------------------
+---------------------------------------------------
+Function                            Date deprecated
+---------------------------------------------------
+\char_fold_case:N                        2020-01-03
+\char_lower_case:N                       2020-01-03
+\char_mixed_case:N                       2020-01-03
+\char_upper_case:N                       2020-01-03
+\char_str_fold_case:N                    2020-01-03
+\char_str_lower_case:N                   2020-01-03
+\char_str_mixed_case:N                   2020-01-03
+\char_str_upper_case:N                   2020-01-03
+\l_keys_key_tl                           2020-02-08
+\l_keys_path_tl                          2020-02-08
+\peek_catcode_ignore_spaces:N            2022-01-11
+\peek_catcode_remove_ignore_spaces:N     2022-01-11
+\peek_charcode_ignore_spaces:N           2022-01-11
+\peek_charcode_remove_ignore_spaces:N    2022-01-11
+\peek_meaning_ignore_spaces:N            2022-01-11
+\peek_meaning_remove_ignore_spaces:N     2022-01-11
+\str_declare_eight_bit_encoding:nnn      2020-08-20
+\str_fold_case:n                         2020-01-03
+\str_fold_case:V                         2020-01-03
+\str_lower_case:f                        2020-01-03
+\str_lower_case:n                        2020-01-03
+\str_upper_case:f                        2020-01-03
+\str_upper_case:n                        2020-01-03
+\seq_indexed_map_inline:Nn               2020-06-18
+\seq_indexed_map_function:NN             2020-06-18
+\sys_load_deprecation:                   2021-01-11
+\tl_lower_case:n                         2020-01-03
+\tl_lower_case:nn                        2020-01-03
+\tl_mixed_case:n                         2020-01-03
+\tl_mixed_case:nn                        2020-01-03
+\tl_upper_case:n                         2020-01-03
+\tl_upper_case:nn                        2020-01-03
+---------------------------------------------------
 
 Removed functions and variables
 ===============================
@@ -661,4 +667,5 @@
 [key property] .value_required:                 2017-01-01
 Variants of n into N/c                          2018-12-27
 Variants of N into n/o/V/v/f/x                  2018-12-27
+Lua l3kernel table and functions therein        2022-01-06
 ----------------------------------------------------------

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv	2022-01-12 21:22:19 UTC (rev 61588)
@@ -256,4 +256,5 @@
 zhlipsum,zhlipsum,Xiangdong Zeng,https://github.com/stone-zeng/zhlipsum,https://github.com/stone-zeng/zhlipsum.git,https://github.com/stone-zeng/zhlipsum/issues,2018-06-14,2018-06-14,
 zhnum,zhnumber,Qing Lee,https://github.com/CTeX-org/ctex-kit,https://github.com/CTeX-org/ctex-kit.git,https://github.com/CTeX-org/ctex-kit/issues,2013-03-16,2013-05-26,
 zrefcheck,zref-check,Gustavo Barros,https://github.com/gusbrs/zref-check,https://github.com/gusbrs/zref-check,https://github.com/gusbrs/zref-check/issues,2021-08-05,2021-08-05,
+zrefclever,zref-clever,Gustavo Barros,https://github.com/gusbrs/zref-clever,https://github.com/gusbrs/zref-clever,https://github.com/gusbrs/zref-clever/issues,2021-11-29,2021-11-29,
 zxjt,zxjatype,Takayuki Yato,,,,2013-03-16,2013-03-16,

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	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 
 File: l3styleguide.tex
 
-Copyright (C) 2011,2012,2014-2021 The LaTeX Project
+Copyright (C) 2011,2012,2014-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2021-11-22}
+\date{Released 2022-01-12}
 
 \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	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 
 File: l3syntax-changes.tex
 
-Copyright (C) 2011,2012,2017-2021 The LaTeX Project
+Copyright (C) 2011,2012,2017-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2021-11-22}
+\date{Released 2022-01-12}
 
 \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	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 
 File: l3term-glossary.tex
 
-Copyright (C) 2018-2021 The LaTeX Project
+Copyright (C) 2018-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2021-11-22}
+\date{Released 2022-01-12}
 
 \newcommand{\TF}{\textit{(TF)}}
 

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	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 
 File: source3.tex
 
-Copyright (C) 1990-2012,2017-2021 The LaTeX Project
+Copyright (C) 1990-2012,2017-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -53,7 +53,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2021-11-22}
+\date{Released 2022-01-12}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md	2022-01-12 21:22:19 UTC (rev 61588)
@@ -7,6 +7,12 @@
 
 ## [Unreleased]
 
+## [2022-01-12]
+
+### Changed
+- Use `\ProvideExp...` in `xfp` because the package will soon no longer be needed
+  and just remains so that old documents still compile correctly.
+
 ## [2021-11-12]
 
 ### Added
@@ -164,7 +170,8 @@
 - Switch to ISO date format
 - Improve cross-module use of internal functions
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2021-11-12...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2022-01-12...HEAD
+[2022-01-12]: https://github.com/latex3/latex3/compare/2021-11-12...2022-01-12
 [2021-11-12]: https://github.com/latex3/latex3/compare/2021-08-27...2021-11-12
 [2021-08-27]: https://github.com/latex3/latex3/compare/2021-08-04...2021-08-27
 [2021-08-04]: https://github.com/latex3/latex3/compare/2021-06-18...2021-08-04

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2022-01-12 21:22:19 UTC (rev 61588)
@@ -1,7 +1,7 @@
 LaTeX3 High-Level Concepts
 ==========================
 
-Release 2021-11-12
+Release 2022-01-12
 
 Overview
 --------
@@ -21,7 +21,7 @@
 Currently included in the CTAN release of `l3packages` are the following
 bundles:
 * `l3keys2e`
-* `xfp`
+* `xfp`     (from 2022-06-01 part of the LaTeX format)
 * `xfrac`
 * `xparse`
 * `xtemplate`
@@ -42,6 +42,8 @@
 but does not require code syntax. It provides the expandable command
 `\fpeval`, which can be used inside for example `\edef` or contexts
 where TeX requires a number.
+From 2022-06-01 release if LaTeX this will be included in the format
+so that the package  doesn't need loading any longer.
 
 `xfrac`
 -------
@@ -107,6 +109,6 @@
 
 -----
 
-<p>Copyright (C) 1998-2012,2015-2021 The LaTeX Project <br />
+<p>Copyright (C) 1998-2012,2015-2022 The LaTeX Project <br />
 <a href="http://latex-project.org/">http://latex-project.org/</a> <br />
 All rights reserved.</p>

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

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

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

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

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

Modified: trunk/Master/texmf-dist/dvips/l3backend/l3backend-dvips.pro
===================================================================
--- trunk/Master/texmf-dist/dvips/l3backend/l3backend-dvips.pro	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/dvips/l3backend/l3backend-dvips.pro	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3backend-header.dtx  (with options: `header,dvips')
 %% 
-%% Copyright (C) 2019-2021 The LaTeX Project
+%% Copyright (C) 2019-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3backend-basics.dtx
 %
-% Copyright (C) 2019-2021 The LaTeX Project
+% Copyright (C) 2019-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-12-14}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -70,27 +70,27 @@
 %    \begin{macrocode}
 \ProvidesExplFile
 %<*dvipdfmx>
-  {l3backend-dvipdfmx.def}{2021-12-14}{}
+  {l3backend-dvipdfmx.def}{2022-01-12}{}
   {L3 backend support: dvipdfmx}
 %</dvipdfmx>
 %<*dvips>
-  {l3backend-dvips.def}{2021-12-14}{}
+  {l3backend-dvips.def}{2022-01-12}{}
   {L3 backend support: dvips}
 %</dvips>
 %<*dvisvgm>
-  {l3backend-dvisvgm.def}{2021-12-14}{}
+  {l3backend-dvisvgm.def}{2022-01-12}{}
   {L3 backend support: dvisvgm}
 %</dvisvgm>
 %<*luatex>
-  {l3backend-luatex.def}{2021-12-14}{}
+  {l3backend-luatex.def}{2022-01-12}{}
   {L3 backend support: PDF output (LuaTeX)}
 %</luatex>
 %<*pdftex>
-  {l3backend-pdftex.def}{2021-12-14}{}
+  {l3backend-pdftex.def}{2022-01-12}{}
   {L3 backend support: PDF output (pdfTeX)}
 %</pdftex>
 %<*xetex>
-  {l3backend-xetex.def}{2021-12-14}{}
+  {l3backend-xetex.def}{2022-01-12}{}
   {L3 backend support: XeTeX}
 %</xetex>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3backend-box.dtx
 %
-% Copyright (C) 2019-2021 The LaTeX Project
+% Copyright (C) 2019-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-12-14}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3backend-color.dtx
 %
-% Copyright (C) 2019-2021 The LaTeX Project
+% Copyright (C) 2019-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-12-14}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -377,7 +377,6 @@
 %<*dvips>
     \__kernel_backend_postscript:n { /color.sc ~ { } ~ def }
 %</dvips>
-    \group_insert_after:N \@@_backend_reset:
   }
 \cs_new_protected:Npn \@@_backend_reset:
   { \__kernel_backend_literal:n { color~pop } }
@@ -424,7 +423,6 @@
     \tl_set:Nn \l_@@_backend_fill_tl {#1}
     \tl_set:Nn \l_@@_backend_stroke_tl {#2}
     \__kernel_color_backend_stack_push:nn \l_@@_backend_stack_int { #1 ~ #2 }
-    \group_insert_after:N \@@_backend_reset:
   }
 \cs_new_protected:Npn \@@_backend_reset:
   { \__kernel_color_backend_stack_pop:n \l_@@_backend_stack_int }
@@ -463,10 +461,7 @@
 \int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
   {
     \cs_gset_protected:Npn \@@_backend_select_cmyk:n #1
-      {
-        \__kernel_backend_literal:n { pdf: bc ~ [#1] }
-        \group_insert_after:N \@@_backend_reset:
-      }
+      { \__kernel_backend_literal:n { pdf: bc ~ [#1] } }
     \cs_gset_eq:NN \@@_backend_select_gray:n \@@_backend_select_cmyk:n
     \cs_gset_eq:NN \@@_backend_select_rgb:n \@@_backend_select_cmyk:n
     \cs_gset_protected:Npn \@@_backend_reset:

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3backend-draw.dtx
 %
-% Copyright (C) 2019-2021 The LaTeX Project
+% Copyright (C) 2019-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-12-14}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3backend-graphics.dtx
 %
-% Copyright (C) 2019-2021 The LaTeX Project
+% Copyright (C) 2019-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-12-14}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3backend-header.dtx
 %
-% Copyright (C) 2019-2021 The LaTeX Project
+% Copyright (C) 2019-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-12-14}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3backend-opacity.dtx
 %
-% Copyright (C) 2021 The LaTeX Project
+% Copyright (C) 2021,2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-12-14}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3backend-pdf.dtx
 %
-% Copyright (C) 2019-2021 The LaTeX Project
+% Copyright (C) 2019-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-12-14}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend.ins	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend.ins	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 
 File l3backend.ins
 
-Copyright (C) 2019-2021 The LaTeX Project
+Copyright (C) 2019-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
 
 \preamble
 
-Copyright (C) 2019-2021 The LaTeX Project
+Copyright (C) 2019-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of
 the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: expl3.dtx
 %
-% Copyright (C) 1990-2021 The LaTeX Project
+% Copyright (C) 1990-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -24,7 +24,7 @@
 %
 %<*driver|generic|package|2ekernel>
 %</driver|generic|package|2ekernel>
-\def\ExplFileDate{2021-11-22}%
+\def\ExplFileDate{2022-01-12}%
 %<*driver>
 \documentclass[full]{l3doc}
 \usepackage{graphicx}
@@ -51,7 +51,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -897,12 +897,6 @@
 % the option name alone is equivalent to using the option with the
 % \texttt{true} value.
 %
-% \DescribeOption{undo-recent-deprecations}
-% The \texttt{undo-recent-deprecations} option suppresses deprecation
-% errors for the first six months after a command is deprecated.  It is
-% intended as a last resort measure for users of packages that were not
-% updated in time.
-%
 % \DescribeOption{check-declarations}
 % All variables used in \pkg{expl3} code should be declared. This is enforced
 % by \TeX{} for variable types based on \TeX{} registers, but not for those
@@ -1408,11 +1402,7 @@
     suppress-backend-headers .bool_gset_inverse:N
       = \g__kernel_backend_header_bool ,
     suppress-backend-headers .initial:n = false ,
-    undo-recent-deprecations .code:n =
-      {
-        \bool_gset_true:N \g__kernel_deprecation_undo_recent_bool
-        \sys_load_deprecation:
-      }
+    undo-recent-deprecations .code:n = {} % A stub
   }
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 
 File l3.ins
 
-Copyright (C) 2011,2012,2014-2021 The LaTeX Project
+Copyright (C) 2011,2012,2014-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
 
 \preamble
 
-Copyright (C) 1990-2021 The LaTeX Project
+Copyright (C) 1990-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of
 the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -109,7 +109,7 @@
         \from{l3text-purify.dtx}{package}
         \from{l3candidates.dtx} {package}
         \from{l3legacy.dtx}     {package}
-        \from{l3deprecation.dtx}{package,kernel}
+        \from{l3deprecation.dtx}{package}
       }
   }
 
@@ -141,7 +141,6 @@
 }
 
 \generate{\file{l3debug.def}      {\from{l3debug.dtx}      {package}}}
-\generate{\file{l3deprecation.def}{\from{l3deprecation.dtx}{package,patches}}}
 
 \generate{\file{l3docstrip.tex}   {\from{l3docstrip.dtx}  {program}}}
 
@@ -152,7 +151,7 @@
 \def\MetaPrefix{--}
 \preamble
 
-Copyright (C) 1990-2021 The LaTeX Project
+Copyright (C) 1990-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of
 the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3basics.dtx
 %
-% Copyright (C) 1990-2021 The LaTeX Project
+% Copyright (C) 1990-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3bootstrap.dtx
 %
-% Copyright (C) 2011-2021 The LaTeX Project
+% Copyright (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3box.dtx
 %
-% Copyright (C) 2005-2021 The LaTeX Project
+% Copyright (C) 2005-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3candidates.dtx
 %
-% Copyright (C) 2012-2021 The LaTeX Project
+% Copyright (C) 2012-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3cctab.dtx
 %
-% Copyright (C) 2018-2021 The LaTeX Project
+% Copyright (C) 2018-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -3,7 +3,7 @@
 %% File: l3clist.dtx
 %
 % Copyright (C) 2004-2011 Frank Mittelbach, The LaTeX Project
-%           (C) 2012-2021 The LaTeX Project
+%           (C) 2012-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -315,7 +315,9 @@
 % \begin{function}[updated = 2011-09-06]
 %   {
 %     \clist_remove_all:Nn,  \clist_remove_all:cn,
-%     \clist_gremove_all:Nn, \clist_gremove_all:cn
+%     \clist_remove_all:NV,  \clist_remove_all:cV,
+%     \clist_gremove_all:Nn, \clist_gremove_all:cn,
+%     \clist_gremove_all:NV, \clist_gremove_all:cV
 %   }
 %   \begin{syntax}
 %     \cs{clist_remove_all:Nn} \meta{comma list} \Arg{item}
@@ -1407,9 +1409,17 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\clist_remove_all:Nn, \clist_remove_all:cn}
+% \begin{macro}
+%   {
+%     \clist_remove_all:Nn, \clist_remove_all:cn,
+%     \clist_remove_all:NV, \clist_remove_all:cV
+%   }
 % \UnitTested
-% \begin{macro}{\clist_gremove_all:Nn, \clist_gremove_all:cn}
+% \begin{macro}
+%   {
+%     \clist_gremove_all:Nn, \clist_gremove_all:cn,
+%     \clist_gremove_all:NV, \clist_remove_all:cV
+%   }
 % \UnitTested
 % \begin{macro}{\@@_remove_all:NNNn}
 % \begin{macro}{\@@_remove_all:w}
@@ -1482,8 +1492,8 @@
 \cs_new:Npn \@@_remove_all:
   { \exp_after:wN \@@_remove_all:w \@@_tmp:w , }
 \cs_new:Npn \@@_remove_all:w #1 , \s_@@_mark , #2 , { \exp_not:n {#1} }
-\cs_generate_variant:Nn \clist_remove_all:Nn  { c }
-\cs_generate_variant:Nn \clist_gremove_all:Nn { c }
+\cs_generate_variant:Nn \clist_remove_all:Nn  { c , NV , cV }
+\cs_generate_variant:Nn \clist_gremove_all:Nn { c , NV , cV }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3coffins.dtx
 %
-% Copyright (C) 2010-2021 The LaTeX Project
+% Copyright (C) 2010-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3color.dtx
 %
-% Copyright (C) 2017-2021 The LaTeX Project
+% Copyright (C) 2017-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -249,6 +249,9 @@
 % General selection of color is safe when split across pages: a stack is
 % used to ensure that the correct color is re-selected on the new page.
 %
+% These commands set the current color (|.|): other more specialised functions
+% such as fill and stroke selectors do \emph{not} adjust this value.
+%
 % \begin{function}{\color_select:n}
 %   \begin{syntax}
 %     \cs{color_select:n} \Arg{color expression}
@@ -281,9 +284,6 @@
 % support this, and so color will need to be contained within a scope, such
 % as \cs{draw_begin:}/\cs{draw_end:}.
 %
-% Note that the \emph{current color} is the fill color, as this is used for
-% running text.
-%
 % \begin{function}{\color_fill:n, \color_stroke:n}
 %   \begin{syntax}
 %     \cs{color_fill:n} \Arg{color expression}
@@ -538,12 +538,15 @@
 % \begin{macro}{\@@_select:nn}
 %    Take an internal color specification and pass it to the driver. This code
 %    is needed to ensure the current color but will also be used by the
-%    higher-level experimental material.
+%    higher-level material.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_select:N #1
   { \exp_after:wN \@@_select:nn #1 }
 \cs_new_protected:Npn \@@_select:nn #1#2
-  { \use:c { @@_backend_select_ #1 :n } {#2} }
+  {
+    \use:c { @@_backend_select_ #1 :n } {#2}
+    \group_insert_after:N \@@_backend_reset:
+  }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -595,7 +598,7 @@
 %
 % \subsection{Utility functions}
 %
-% \begin{macro}[int, TF, EXP]{\@@_if_defined:n}
+% \begin{macro}[TF, EXP]{\@@_if_defined:n}
 %   A simple wrapper to avoid needing to have the lookup repeated in too many
 %   places.
 %    \begin{macrocode}
@@ -632,33 +635,63 @@
 %
 % \begin{macro}{\@@_convert:nnN, \@@_convert:VVN}
 % \begin{macro}{\@@_convert:nnnN, \@@_convert:nVnN, \@@_convert:nnVN}
-% \begin{macro}[aux, EXP]
+% \begin{macro}[EXP]
 %   {
+%     \@@_convert_gray_gray:w
 %     \@@_convert_gray_rgb:w
 %     \@@_convert_gray_cmyk:w
 %     \@@_convert_cmyk_gray:w
 %     \@@_convert_cmyk_rgb:w
+%     \@@_convert_cmyk_cmyk:w
 %     \@@_convert_rgb_gray:w
+%     \@@_convert_rgb_rgb:w
 %     \@@_convert_rgb_cmyk:w
 %   }
-%  \begin{macro}[aux, EXP]{\@@_convert_rgb_cmyk:nnnn}
-%    Model conversion is carried out using standard formulae, as described in
-%    the manual for \pkg{xcolor} (see also the \emph{PostScript Language
-%    Reference Manual}).
+%  \begin{macro}[EXP]{\@@_convert_rgb_cmyk:nnnn}
+%    Model conversion is carried out using standard formulae for base models,
+%    as described in the manual for \pkg{xcolor} (see also the \emph{PostScript
+%    Language Reference Manual}). For other models direct conversion might not
+%    be defined, so we go through the fallback models if necessary.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_convert:nnN #1#2#3
   { \@@_convert:nnVN {#1} {#2} #3 #3 }
 \cs_generate_variant:Nn \@@_convert:nnN { VV }
+\cs_generate_variant:Nn \exp_last_unbraced:Nf { c }
 \cs_new_protected:Npn \@@_convert:nnnN #1#2#3#4
   {
     \tl_set:Nx #4
       {
-        \cs_if_exist:cTF { @@_convert_ #1 _ #2 :w }
-          { \use:c { @@_convert_ #1 _ #2 :w } #3 \s_@@_stop }
-          { \use:c { c_@@_fallback_ #2 _tl } }
+        \cs_if_exist_use:cTF { @@_convert_ #1 _ #2 :w }
+          { #3 \s_@@_stop }
+          {
+            \cs_if_exist:cTF { @@_convert_ \use:c { c_@@_fallback_ #1 _tl } _ #2 :w }
+              {
+                \exp_last_unbraced:cf
+                  { @@_convert_ \use:c { c_@@_fallback_ #1 _tl } _ #2 :w }
+                  { \use:c { @@_convert_ #1 _ \use:c { c_@@_fallback_ #1 _tl } :w } #3 \s_@@_stop }
+                  \s_@@_stop
+              }
+              {
+                \exp_last_unbraced:cf
+                  { @@_convert_ \use:c { c_@@_fallback_ #2 _tl } _ #2 :w }
+                  {
+                    \cs_if_exist_use:cTF { @@_convert_ #1 _ \use:c { c_@@_fallback_ #2 _tl } :w }
+                      { #3 \s_@@_stop }
+                      {
+                        \exp_last_unbraced:cf
+                          { @@_convert_ \use:c { c_@@_fallback_ #1 _tl } _ \use:c { c_@@_fallback_ #2 _tl } :w }
+                          { \use:c { @@_convert_ #1 _ \use:c { c_@@_fallback_ #1 _tl } :w } #3 \s_@@_stop }
+                          \s_@@_stop
+                      }
+                  }
+                  \s_@@_stop
+              }
+          }
       }
   }
 \cs_generate_variant:Nn \@@_convert:nnnN { nV , nnV }
+\cs_new:Npn \@@_convert_gray_gray:w #1 \s_@@_stop
+  { #1 }
 \cs_new:Npn \@@_convert_gray_rgb:w #1 \s_@@_stop
   { #1 ~ #1 ~ #1 }
 \cs_new:Npn \@@_convert_gray_cmyk:w #1 \s_@@_stop
@@ -669,6 +702,8 @@
 %    \begin{macrocode}
 \cs_new:Npn \@@_convert_rgb_gray:w #1 ~ #2 ~ #3 \s_@@_stop
   { \fp_eval:n { 0.3 * #1 + 0.59 * #2 + 0.11 * #3 } }
+\cs_new:Npn \@@_convert_rgb_rgb:w #1 \s_@@_stop
+  { #1 }
 %    \end{macrocode}
 %   The conversion from |rgb| to |cmyk| is the most complex: a two-step
 %   procedure which requires \emph{black generation} and \emph{undercolor
@@ -697,6 +732,8 @@
     \fp_eval:n { 1 - min ( 1 , #2 + #4 ) } \c_space_tl
     \fp_eval:n { 1 - min ( 1 , #3 + #4 ) }
   }
+\cs_new:Npn \@@_convert_cmyk_cmyk:w #1 \s_@@_stop
+  { #1 }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -728,9 +765,9 @@
 % \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}
-% \begin{macro}[aux, EXP]{\@@_parse_mix:nNnn}
-% \begin{macro}[aux, EXP]
+% \begin{macro}[EXP]{\@@_parse_mix:Nnnn, \@@_parse_mix:NVVn}
+% \begin{macro}[EXP]{\@@_parse_mix:nNnn}
+% \begin{macro}[EXP]
 %   {
 %     \@@_parse_mix_gray:nw ,
 %     \@@_parse_mix_rgb:nw  ,
@@ -1222,13 +1259,13 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@@_select:}
+% \begin{macro}{\@@_finalise_current:}
 %   A backend-neutral location for \enquote{last minute} manipulations before
 %   handing off to the backend code.  We set the special |.| syntax here: this
 %   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:Npx \@@_select:
+\cs_new_protected:Npx \@@_finalise_current:
   {
     \tl_set:Nx \exp_not:c { l_@@_named_ . _tl }
       { \exp_not:N \@@_model:N \exp_not:N \l_@@_current_tl }
@@ -1236,7 +1273,6 @@
     \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}
@@ -1254,13 +1290,15 @@
 \cs_new_protected:Npn \color_select:n #1
   {
     \@@_parse:nN {#1} \l_@@_current_tl
-    \@@_select:
+    \@@_finalise_current:
+    \@@_select:N \l_@@_current_tl
   }
 \cs_new_protected:Npn \color_select:nn #1#2
   {
     \@@_select_main:Nw \l_@@_current_tl
       #1 / / \s_@@_mark #2 / / \s_@@_stop
-    \@@_select:
+    \@@_finalise_current:
+    \@@_select:N \l_@@_current_tl
   }
 %    \end{macrocode}
 %   If the first color model is the fixed one, or if there is no fixed
@@ -1692,12 +1730,12 @@
 %
 % \begin{variable}
 %   {\c_@@_fallback_cmyk_tl, \c_@@_fallback_gray_tl, \c_@@_fallback_rgb_tl}
-%   Conversion from Separation or DeviceN spaces may not be possible; have
-%   a fallback to black.
+%   For every colorspace, we define one of the base colorspaces as a fallback.
+%   The base colorspaces themselves are their own fallback.
 %    \begin{macrocode}
-\tl_const:Nn \c_@@_fallback_cmyk_tl { 0 ~ 0 ~ 0 ~ 1 }
-\tl_const:Nn \c_@@_fallback_gray_tl { 1 }
-\tl_const:Nn \c_@@_fallback_rgb_tl { 1 ~ 1 ~ 1 }
+\tl_const:Nn \c_@@_fallback_cmyk_tl { cmyk }
+\tl_const:Nn \c_@@_fallback_gray_tl { gray }
+\tl_const:Nn \c_@@_fallback_rgb_tl { rgb }
 %    \end{macrocode}
 % \end{variable}
 %
@@ -1803,14 +1841,13 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_model_init:nn}
+% \begin{macro}{\@@_model_init:nnnn, \@@_model_init:nnnx}
 %   A shared auxiliary to do the basics of setting up a new model: reserve a
-%   number, create a fallback and white-equivalent, set up links to the backend.
+%   number, create a white-equivalent, set up links to the backend.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_model_init:nnnnn #1#2#3#4#5
+\cs_new_protected:Npn \@@_model_init:nnnn #1#2#3#4
   {
     \int_gincr:N \g_@@_model_int
-    \tl_const:cn { c_@@_fallback_ #1 _tl } { #4 }
     \clist_map_inline:nn { fill , stroke , select }
       {
         \cs_new_protected:cpx { @@_backend_ ##1 _ #1 :n } ####1
@@ -1822,23 +1859,13 @@
     \cs_new_protected:cpx { @@_model_ #1 _white: }
       {
         \prop_put:Nnn \exp_not:N \l_@@_named_white_prop {#1}
-        { \exp_not:n {#5} }
+        { \exp_not:n {#4} }
         \exp_not:N \int_compare:nNnF { \tex_currentgrouplevel:D } = 0
           { \group_insert_after:N \exp_not:c { @@_model_ #1 _ white: } }
       }
     \use:c { @@_model_ #1 _white: }
   }
-\cs_generate_variant:Nn \@@_model_init:nnnnn { nnnxx }
-\cs_new_protected:Npn \@@_model_init:nnn #1#2#3
-  {
-    \@@_model_init:nnnxx { #1 } { #2 } { #3 }
-      {
-        1 \prg_replicate:nn { #2 - 1 } { ~ 1 }
-      }
-      {
-        0 \prg_replicate:nn { #2 - 1 } { ~ 0 }
-      }
-  }
+\cs_generate_variant:Nn \@@_model_init:nnnn { nnnx }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1921,7 +1948,7 @@
 \cs_new_protected:Npn \@@_model_separation:w
   #1 , #2 , #3 , #4 , #5 \s_@@_stop #6#7#8
   {
-    \@@_model_init:nnn {#6} { 1 } { separation }
+    \@@_model_init:nnnn {#6} { 1 } { separation } { 0 }
     \cs_new_eq:cN { @@_parse_mix_ #6 :nw } \@@_parse_mix_gray:nw
     \cs_new:cpn { @@_parse_model_ #6 :w } ##1 , ##2 \s_@@_stop
       { {#6} { \@@_parse_number:n {##1} } }
@@ -1933,6 +1960,7 @@
   }
 \cs_new_protected:Npn \@@_model_separation_cmyk:nnnnnn #1#2#3#4#5#6
   {
+    \tl_const:cn { c_@@_fallback_ #1 _tl } { cmyk }
     \cs_new:cpn { @@_convert_ #1 _cmyk:w } ##1 \s_@@_stop
       {
          \fp_eval:n {##1 * #3} ~
@@ -1940,8 +1968,7 @@
          \fp_eval:n {##1 * #5} ~
          \fp_eval:n {##1 * #6}
       }
-    \@@_model_convert:nnn {#1} { cmyk } { rgb }
-    \@@_model_convert:nnn {#1} { cmyk } { gray }
+    \cs_new:cpn { @@_convert_cmyk_ #1 :w } ##1 \s_@@_stop { 1 }
     \prop_gput:Nnn \g_@@_alternative_values_prop {#1} { #3 , #4 , #5 , #6 }
     \@@_backend_separation_init:nnnnn {#2} { /DeviceCMYK } { }
       { 0 ~ 0 ~ 0 ~ 0 } { #3 ~ #4 ~ #5 ~ #6 }
@@ -1948,6 +1975,7 @@
   }
 \cs_new_protected:Npn \@@_model_separation_rgb:nnnnnn #1#2#3#4#5#6
   {
+    \tl_const:cn { c_@@_fallback_ #1 _tl } { rgb }
     \cs_new:cpn { @@_convert_ #1 _rgb:w } ##1 \s_@@_stop
       {
          \fp_eval:n {##1 * #3} ~
@@ -1954,8 +1982,7 @@
          \fp_eval:n {##1 * #4} ~
          \fp_eval:n {##1 * #5}
       }
-    \@@_model_convert:nnn {#1} { rgb } { cmyk }
-    \@@_model_convert:nnn {#1} { rgb } { gray }
+    \cs_new:cpn { @@_convert_rgb_ #1 :w } ##1 \s_@@_stop { 1 }
     \prop_gput:Nnn \g_@@_alternative_values_prop {#1} { #3 , #4 , #5 }
     \@@_backend_separation_init:nnnnn {#2} { /DeviceRGB } { }
       { 0 ~ 0 ~ 0 } { #3 ~ #4 ~ #5 }
@@ -1962,21 +1989,10 @@
   }
 \cs_new_protected:Npn \@@_model_separation_gray:nnnnnn #1#2#3#4#5#6
   {
-    \cs_new:cpn { @@_convert_ #1 _cmyk:w } ##1 \s_@@_stop
-      {
-        \fp_eval:n {##1 * #3} ~
-        \fp_eval:n {##1 * #3} ~
-        \fp_eval:n {##1 * #3} ~
-        \fp_eval:n {##1 * #3}
-      }
+    \tl_const:cn { c_@@_fallback_ #1 _tl } { gray }
     \cs_new:cpn { @@_convert_ #1 _gray:w } ##1 \s_@@_stop
       { \fp_eval:n {##1 * #3} }
-    \cs_new:cpn { @@_convert_ #1 _rgb:w } ##1 \s_@@_stop
-      {
-        \fp_eval:n {##1 * #3} ~
-        \fp_eval:n {##1 * #3} ~
-        \fp_eval:n {##1 * #3}
-      }
+    \cs_new:cpn { @@_convert_gray_ #1 :w } ##1 \s_@@_stop { 1 }
     \prop_gput:Nnn \g_@@_alternative_values_prop {#1} {#3}
     \@@_backend_separation_init:nnnnn {#2} { /DeviceGray } { } { 0 } {#3}
   }
@@ -2013,8 +2029,8 @@
 %   If a CIELAB space is being set up, we need the illuminant, then create
 %   the appropriate set up. At present, this doesn't include \texttt{BlackPoint}
 %   or \texttt{Range} data, but that may be added later. As CIELAB colors
-%   cannot be converted to anything else, we fallback to producing black: the
-%   user should set up a second model for colors set up this way.
+%   cannot be converted to anything else, we fallback to producing black in the
+%   gray colorspace: the user should set up a second model for colors set up this way.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_model_separation_CIELAB:nnnnnnn #1#2#3#4#5#6#7
   {
@@ -2021,11 +2037,10 @@
     \tl_if_exist:cTF { c_@@_model_whitepoint_CIELAB_ #1 _tl }
       {
         \@@_backend_separation_init_CIELAB:nnn {#1} {#3} { #4 ~ #5 ~ #6 }
-        \cs_new:cpn { @@_convert_ #2 _cmyk:w } ##1 \s_@@_stop
-          { 0 ~ 0 ~ 0 ~ 1 }
-        \cs_new:cpn { @@_convert_ #2 _rgb:w } ##1 \s_@@_stop
-          { 1 ~ 1 ~ 1 }
+        \tl_const:cn { c_@@_fallback_ #2 _tl } { gray }
         \cs_new:cpn { @@_convert_ #2 _gray:w } ##1 \s_@@_stop
+          { 0 }
+        \cs_new:cpn { @@_convert_gray_ #2 :w } ##1 \s_@@_stop
           { 1 }
       }
       {
@@ -2162,12 +2177,18 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_model_devicen:nnnn #1#2#3#4
   {
-    \@@_model_init:nnn {#4} {#1} { devicen }
+    \@@_model_init:nnnx {#4} {#1} { devicen }
+      {
+        0 \prg_replicate:nn { #1 - 1 } { ~ 0 }
+      }
     \cs_if_exist_use:cF { @@_model_devicen_parse_ #1 :nn }
       { \@@_model_devicen_parse_generic:nn }
         {#4} {#1}
     \@@_model_devicen_init:nnn {#1} {#2} {#3}
-    \@@_model_devicen_convert:nnn {#4} {#2} {#3}
+    \@@_model_devicen_convert:nnnx {#4} {#2} {#3}
+      {
+        1 \prg_replicate:nn { #1 - 1 } { ~ 1 }
+      }
   }
 %    \end{macrocode}
 %   For short lists of DeviceN colors, we can use hand-tuned parsing. This
@@ -2382,30 +2403,29 @@
 %   to other parameter-based spaces. Essentially the approach is exactly the same
 %   as the PostScript, just expressed in \TeX{} terms.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_model_devicen_convert:nnn #1#2#3
+\cs_new_protected:Npn \@@_model_devicen_convert:nnnn #1#2#3
   {
-    \use:c { @@_model_devicen_convert_ #2 :nn } {#1} {#3}
+    \use:c { @@_model_devicen_convert_ #2 :nnn } {#1} {#3}
   }
-\cs_new_protected:Npn \@@_model_devicen_convert_cmyk:nn #1#2
+\cs_generate_variant:Nn \@@_model_devicen_convert:nnnn { nnnx }
+\cs_new_protected:Npn \@@_model_devicen_convert_cmyk:nnn #1#2
   {
-    \@@_model_convert:nnn {#1} { cmyk } { gray }
-    \@@_model_convert:nnn {#1} { cmyk } { rgb }
-    \@@_model_devicen_convert:nnnn {#1} { cmyk } { 4 } {#2}
+    \tl_const:cn { c_@@_fallback_ #1 _tl } { cmyk }
+    \@@_model_devicen_convert:nnnnn {#1} { cmyk } { 4 } {#2}
   }
-\cs_new_protected:Npn \@@_model_devicen_convert_gray:nn #1#2
+\cs_new_protected:Npn \@@_model_devicen_convert_gray:nnn #1#2
   {
-    \@@_model_convert:nnn {#1} { gray } { cmyk }
-    \@@_model_convert:nnn {#1} { gray } { rgb }
-    \@@_model_devicen_convert:nnnn {#1} { gray } { 1 } {#2}
+    \tl_const:cn { c_@@_fallback_ #1 _tl } { gray }
+    \@@_model_devicen_convert:nnnnn {#1} { gray } { 1 } {#2}
   }
-\cs_new_protected:Npn \@@_model_devicen_convert_rgb:nn #1#2
+\cs_new_protected:Npn \@@_model_devicen_convert_rgb:nnn #1#2
   {
-    \@@_model_convert:nnn {#1} { rgb } { cmyk }
-    \@@_model_convert:nnn {#1} { rgb } { gray }
-    \@@_model_devicen_convert:nnnn {#1} { rgb } { 3 } {#2}
+    \tl_const:cn { c_@@_fallback_ #1 _tl } { rgb }
+    \@@_model_devicen_convert:nnnnn {#1} { rgb } { 3 } {#2}
   }
-\cs_new_protected:Npn \@@_model_devicen_convert:nnnn #1#2#3#4
+\cs_new_protected:Npn \@@_model_devicen_convert:nnnnn #1#2#3#4#5
   {
+    \cs_new:cpn { @@_convert_ #2 _ #1 :w } ##1 \s_@@_stop {#5}
     \cs_new:cpx { @@_convert_ #1 _ #2 :w } ##1 \s_@@_stop
       {
         \exp_not:c { @@_convert_devicen_ #2 : \prg_replicate:nn {#3} { n } w }
@@ -2607,7 +2627,10 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_model_iccbased_aux:nnnnnn #1#2#3#4#5#6
   {
-    \@@_model_init:nnnnn {#5} {#1} { iccbased } {#2} {#3}
+    \@@_model_init:nnnn {#5} {#1} { iccbased } {#3}
+    \tl_const:cn { c_@@_fallback_ #5 _tl } { gray }
+    \cs_new:cpn { @@_convert_ #5 _gray:w } ##1 \s_@@_stop { 0 }
+    \cs_new:cpn { @@_convert_gray_ #5 :w } ##1 \s_@@_stop { #2 }
     \use:c { @@_model_devicen_parse_ #1 :nn } {#5} {#1}
     \exp_args:Nx \@@_backend_iccbased_init:nnn
       { \file_full_name:n {#6} } {#1} {#4}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3debug.dtx
 %
-% Copyright (C) 2019-2021 The LaTeX Project
+% Copyright (C) 2019-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3deprecation.dtx
 %
-% Copyright (C) 2017-2021 The LaTeX Project
+% Copyright (C) 2017-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -54,31 +54,6 @@
 % A few commands have had to be deprecated over the years.  This module
 % defines deprecated and deleted commands to produce an error.
 %
-% The life of a deprecated command has several stages.
-% \begin{itemize}
-% \item When we decide it should be eventually removed the command's
-%   definition is put in this file \pkg{l3deprecation.dtx} and the name
-%   of the command is added to the list in \pkg{l3obsolete.txt}.  The
-%   command remains defined by default for $12$ or more months,
-%   typically until the end of a year.  During that time, if \pkg{expl3}
-%   is loaded with any of the options \texttt{check-declarations} or
-%   \texttt{log-functions} or \texttt{enable-debug} typically used in
-%   package test files, the command will produce a warning.
-% \item Then by default the command produces an error for all users,
-%   which can be suppressed for $6$ months through the option
-%   \texttt{undo-recent-deprecations}.
-% \item After this $6$-month grace period, the command irreversibly
-%   produces an error.  Its original definition can then be removed from
-%   the sources, leaving only the error definition.  In
-%   \pkg{l3obsolete.txt} its name is moved from the \enquote{Deprecated
-%   functions and variables} list to the \enquote{Removed functions and
-%   variables} list.
-% \end{itemize}
-% Package authors are encouraged to have a test file with
-% \cs{debug_on:n} |{deprecation}|, which makes commands at all stages of
-% this list into errors.  This helps detect uses of deprecated commands
-% before user complain.
-%
 % \end{documentation}
 %
 % \begin{implementation}
@@ -90,97 +65,9 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-%<*kernel>
-%    \end{macrocode}
-%
-%    \begin{macrocode}
 %<@@=deprecation>
 %    \end{macrocode}
 %
-% \subsection{Helpers and variables}
-%
-% \begin{variable}{\l_@@_grace_period_bool}
-%   This is set to \texttt{true} when the deprecated command that is
-%   being defined is in its grace period, meaning between the time it
-%   becomes an error by default and the time $6$~months later where even
-%   \texttt{undo-recent-deprecations} stops restoring it.
-%    \begin{macrocode}
-\bool_new:N \l_@@_grace_period_bool
-%    \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\s_@@_mark,\s_@@_stop}
-%   Internal scan marks.
-%    \begin{macrocode}
-\scan_new:N \s_@@_mark
-\scan_new:N \s_@@_stop
-%    \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}[EXP]{\@@_date_compare:nNnTF, \@@_date_compare_aux:w}
-%   Expects |#1| and |#3| to be dates in the format YYYY-MM-DD (but
-%   accepts YYYY or YYYY-MM too, filling in zeros for the missing data).
-%   Compares them using |#2| (one of |<|, |=|, |>|).
-%    \begin{macrocode}
-\cs_new:Npn \@@_date_compare:nNnTF #1#2#3
-  { \@@_date_compare_aux:w #1 -0-0- \s_@@_mark #2 #3 -0-0- \s_@@_stop }
-\cs_new:Npn \@@_date_compare_aux:w
-  #1 - #2 - #3 - #4 \s_@@_mark #5 #6 - #7 - #8 - #9 \s_@@_stop
-  {
-    \int_compare:nNnTF {#1} = {#6}
-      {
-        \int_compare:nNnTF {#2} = {#7}
-          { \int_compare:nNnTF {#3} #5 {#8} }
-          { \int_compare:nNnTF {#2} #5 {#7} }
-      }
-      { \int_compare:nNnTF {#1} #5 {#6} }
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{variable}{\g__kernel_deprecation_undo_recent_bool}
-%    \begin{macrocode}
-\bool_new:N \g__kernel_deprecation_undo_recent_bool
-%    \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\@@_not_yet_deprecated:nTF, \@@_minus_six_months:w}
-%   Receives a deprecation \meta{date} and runs the \texttt{true}
-%   (\texttt{false}) branch if the \pkg{expl3} date is earlier (later)
-%   than \meta{date}.  If \texttt{undo-recent-deprecations} is used we
-%   subtract $6$ months to the \pkg{expl3} date (equivalently add $6$
-%   months to the \meta{date}).  In addition, if the \pkg{expl3} date is
-%   between \meta{date} and \meta{date} plus $6$ months,
-%   \cs{l_@@_grace_period_bool} is set to \texttt{true}, otherwise
-%   \texttt{false}.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_not_yet_deprecated:nTF #1
-  {
-    \bool_set_false:N \l_@@_grace_period_bool
-    \exp_args:No \@@_date_compare:nNnTF { \ExplLoaderFileDate } < {#1}
-      { \use_i:nn }
-      {
-        \exp_args:Nf \@@_date_compare:nNnTF
-          {
-            \exp_after:wN \@@_minus_six_months:w
-            \ExplLoaderFileDate -0-0- \s_@@_stop
-          } < {#1}
-          {
-            \bool_set_true:N \l_@@_grace_period_bool
-            \bool_if:NTF \g__kernel_deprecation_undo_recent_bool
-          }
-          { \use_ii:nn }
-      }
-  }
-\cs_new:Npn \@@_minus_six_months:w #1 - #2 - #3 - #4 \s_@@_stop
-  {
-    \int_compare:nNnTF {#2} > 6
-      { #1 - \int_eval:n { #2 - 6 } - #3 }
-      { \int_eval:n { #1 - 1 } - \int_eval:n { #2 + 6 } - #3 }
-  }
-%    \end{macrocode}
-% \end{macro}
-%
 % \subsection{Patching definitions to deprecate}
 %
 % \begin{quote}
@@ -231,20 +118,6 @@
 %   In both scenarios we the \meta{function} may be \tn{outer} so we
 %   undefine it with \cs{tex_let:D} before redefining it, with
 %   \cs{__kernel_deprecation_error:Nnn} or with some code added shortly.
-%
-%   Then check the date (taking into account
-%   \texttt{undo-recent-deprecations}) to see if the command should be
-%   deprecated right away (\texttt{false} branch of
-%   \cs{@@_not_yet_deprecated:nTF}), in which case
-%   \cs{@@_just_error:nnNN} makes \meta{function} into an error (not
-%   \tn{outer}), ignoring its \meta{parameters} and \meta{code}
-%   completely.
-%
-%   Otherwise distinguish cases where we should give a warning from
-%   those where we shouldn't: warnings can only happen for protected
-%   commands, and we only want them if either
-%   \texttt{undo-recent-deprecations} or \texttt{enable-debug} is in
-%   force, not for standard users.
 %    \begin{macrocode}
 \cs_new_protected:Npn \__kernel_patch_deprecation:nnNNpn #1#2#3#4#5#
   { \@@_patch_aux:nnNNnn {#1} {#2} #3 #4 {#5} }
@@ -256,18 +129,9 @@
         \__kernel_deprecation_error:Nnn #4 {#2} {#1}
       }
       { \tex_let:D #4 \scan_stop: }
-    \@@_not_yet_deprecated:nTF {#1}
-      {
-        \bool_if:nTF
-          {
-            \cs_if_eq_p:NN #3 \cs_gset_protected:Npn &&
-            \__kernel_if_debug:TF
-              { \c_true_bool } { \g__kernel_deprecation_undo_recent_bool }
-          }
-          { \@@_warn_once:nnNnn {#1} {#2} #4 {#5} {#6} }
-          { \@@_patch_aux:Nn #3 { #4 #5 {#6} } }
-      }
-      { \@@_just_error:nnNN {#1} {#2} #3 #4 }
+     \cs_if_eq:NNTF #3 \cs_gset_protected:Npn
+        { \@@_warn_once:nnNnn {#1} {#2} #4 {#5} {#6} }
+        { \@@_patch_aux:Nn #3 { #4 #5 {#6} } }
   }
 %    \end{macrocode}
 %   In case we want a warning, the \meta{function} is defined to produce
@@ -315,32 +179,6 @@
       { \__kernel_deprecation_code:nn { } { \cs_set:Npn #2 } }
   }
 %    \end{macrocode}
-%   Finally, if we want an error we reuse the same \cs{@@_patch_aux:Nn}
-%   as the previous case.  Indeed, we want \cs{debug_off:n}
-%   |{deprecation}| to make the \meta{function} into an error, just like
-%   it is by default.  The error is expandable or not, and the last
-%   argument of the error message is empty or is \texttt{grace} to
-%   denote the case where we are in the $6$~month grace period, in which
-%   case the error message is more detailed.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_just_error:nnNN #1#2#3#4
-  {
-    \exp_args:NNx \@@_patch_aux:Nn #3
-      {
-        \exp_not:N #4
-        {
-          \cs_if_eq:NNTF #3 \cs_gset_protected:Npn
-            { \exp_not:N \msg_error:nnnnnn }
-            { \exp_not:N \msg_expandable_error:nnnnnn }
-            { deprecation } { deprecated-command }
-            {#1}
-            { \token_to_str:N #4 }
-            { \tl_to_str:n {#2} }
-            { \bool_if:NT \l_@@_grace_period_bool { grace } }
-        }
-      }
-  }
-%    \end{macrocode}
 % \end{macro}
 %
 % \begin{macro}{\__kernel_deprecation_error:Nnn}
@@ -368,13 +206,6 @@
   {
     \tl_if_blank:nF {#3} { Use~ \tl_trim_spaces:n {#3} ~not~ }
     #2~deprecated~on~#1.
-    \str_if_eq:nnT {#4} { grace }
-      {
-        \c_space_tl
-        For~6~months~after~that~date~one~can~restore~a~deprecated~
-        command~by~loading~the~expl3~package~with~the~option~
-        'undo-recent-deprecations'.
-      }
   }
 %    \end{macrocode}
 %
@@ -382,7 +213,7 @@
 %
 % \begin{macro}{\@@_old_protected:Nnn, \@@_old:Nnn}
 %   Short-hands for old commands whose definition does not matter
-%   anymore, i.e., commands past the grace period.
+%   any more as they were removed.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_old_protected:Nnn #1#2#3
   {
@@ -394,9 +225,13 @@
     \__kernel_patch_deprecation:nnNNpn {#3} {#2}
     \cs_gset:Npn #1 { }
   }
-\@@_old:Nnn \box_resize:Nnn
+\@@_old_protected:Nnn \box_gset_eq_clear:NN
+  { \box_gset_eq_drop:NN } { 2021-07-01 }
+\@@_old_protected:Nnn \box_set_eq_clear:NN
+  { \box_set_eq_drop:NN } { 2021-07-01 }
+\@@_old_protected:Nnn \box_resize:Nnn
   { \box_resize_to_wd_and_ht_plus_dp:Nnn } { 2019-01-01 }
-\@@_old:Nnn \box_use_clear:N
+\@@_old_protected:Nnn \box_use_clear:N
   { \box_use_drop:N } { 2019-01-01 }
 \@@_old:Nnn \c_job_name_tl
   { \c_sys_jobname_str } { 2017-01-01 }
@@ -448,22 +283,26 @@
   { 1000 } { 2020-01-01 }
 \@@_old:Nnn \c_ten_thousand
   { 10000 } { 2020-01-01 }
+\@@_old:Nnn \c_term_ior
+  { -1 } { 2021-07-01 }
 \@@_old:Nnn \dim_case:nnn
   { \dim_case:nnF } { 2015-07-14 }
-\@@_old:Nnn \file_add_path:nN
+\@@_old_protected:Nnn \file_add_path:nN
   { \file_get_full_name:nN } { 2019-01-01 }
 \@@_old_protected:Nnn \file_if_exist_input:nT
   { \file_if_exist:nT and~ \file_input:n } { 2018-03-05 }
 \@@_old_protected:Nnn \file_if_exist_input:nTF
   { \file_if_exist:nT and~ \file_input:n } { 2018-03-05 }
-\@@_old:Nnn \file_list:
+\@@_old_protected:Nnn \file_list:
   { \file_log_list: } { 2019-01-01 }
 \@@_old:Nnn \file_path_include:n
   { \seq_put_right:Nn \l_file_search_path_seq } { 2019-01-01 }
-\@@_old:Nnn \file_path_remove:n
+\@@_old_protected:Nnn \file_path_remove:n
   { \seq_remove_all:Nn \l_file_search_path_seq } { 2019-01-01 }
 \@@_old:Nnn \g_file_current_name_tl
   { \g_file_curr_name_str } { 2019-01-01 }
+\@@_old_protected:Nnn \hbox_unpack_clear:N 
+  { \hbox_unpack_drop:N  } { 2021-07-01 }
 \@@_old:Nnn \int_case:nnn
   { \int_case:nnF } { 2015-07-14 }
 \@@_old:Nnn \int_from_binary:n
@@ -480,13 +319,13 @@
   { \int_to_oct:n } { 2016-01-05 }
 \@@_old_protected:Nnn \ior_get_str:NN
   { \ior_str_get:NN } { 2018-03-05 }
-\@@_old:Nnn \ior_list_streams:
+\@@_old_protected:Nnn \ior_list_streams:
   { \ior_show_list: } { 2019-01-01 }
-\@@_old:Nnn \ior_log_streams:
+\@@_old_protected:Nnn \ior_log_streams:
   { \ior_log_list: } { 2019-01-01 }
-\@@_old:Nnn \iow_list_streams:
+\@@_old_protected:Nnn \iow_list_streams:
   { \iow_show_list: } { 2019-01-01 }
-\@@_old:Nnn \iow_log_streams:
+\@@_old_protected:Nnn \iow_log_streams:
   { \iow_log_list: } { 2019-01-01 }
 \@@_old:Nnn \lua_escape_x:n
   { \lua_escape:e } { 2020-01-01 }
@@ -560,12 +399,28 @@
   { \tl_case:cnF } { 2015-07-14 }
 \@@_old:Nnn \tl_case:Nnn
   { \tl_case:NnF } { 2015-07-14 }
+\@@_old_protected:Nnn \tl_gset_from_file:Nnn
+  { \file_get:nnN } { 2021-07-01 }
+\@@_old_protected:Nnn \tl_gset_from_file_x:Nnn
+  { \file_get:nnN } { 2021-07-01 }
+\@@_old_protected:Nnn \tl_set_from_file:Nnn
+  { \file_get:nnN } { 2021-07-01 }
+\@@_old_protected:Nnn \tl_set_from_file_x:Nnn
+  { \file_get:nnN } { 2021-07-01 }
 \@@_old_protected:Nnn \tl_to_lowercase:n
   { \tex_lowercase:D } { 2018-03-05 }
 \@@_old_protected:Nnn \tl_to_uppercase:n
   { \tex_uppercase:D } { 2018-03-05 }
-\@@_old:Nnn \token_new:Nn
+\@@_old:Nnn \token_get_arg_spec:N
+  { \cs_argument_spec:N } { 2021-07-01 }
+\@@_old:Nnn \token_get_prefix_spec:N
+  { \cs_prefix_spec:N } { 2021-07-01 }
+\@@_old:Nnn \token_get_replacement_spec:N
+  { \cs_replacement_spec:N } { 2021-07-01 }
+\@@_old_protected:Nnn \token_new:Nn
   { \cs_new_eq:NN } { 2019-01-01 }
+\@@_old_protected:Nnn \vbox_unpack_clear:N 
+  { \vbox_unpack_drop:N  } { 2021-07-01 }
 \@@_old:Nnn \xetex_if_engine_p:
   { \sys_if_engine_xetex_p: } { 2017-01-01 }
 \@@_old:Nnn \xetex_if_engine:F
@@ -577,46 +432,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Loading the patches}
-%
-% When loaded first, the patches are simply read here.
-% Here the deprecation code is loaded with the lower-level |\__kernel_...|
-% macro because we don't want it to flip the \cs{g__sys_deprecation_bool}
-% boolean, so that the deprecation code can be re-loaded later (when using
-% \texttt{undo-recent-deprecations}).
-%
-%    \begin{macrocode}
-\group_begin:
-\cs_set_protected:Npn \ProvidesExplFile
-  {
-    \char_set_catcode_space:n { `\  }
-    \ProvidesExplFileAux
-  }
-\cs_set_protected:Npx \ProvidesExplFileAux #1#2#3#4
-  {
-    \group_end:
-    \cs_if_exist:NTF \ProvidesFile
-      { \exp_not:N \ProvidesFile {#1} [ #2~v#3~#4 ] }
-      { \iow_log:x { File:~#1~#2~v#3~#4 } }
-  }
-\cs_gset_protected:Npn \__kernel_sys_configuration_load:n #1
-  { \file_input:n { #1 .def } }
-\__kernel_sys_configuration_load:n { l3deprecation }
-%    \end{macrocode}
-%
-%    \begin{macrocode}
-%</kernel>
-%    \end{macrocode}
-%
-%    \begin{macrocode}
-%<*patches>
-%    \end{macrocode}
-%
-% Standard file identification.
-%    \begin{macrocode}
-\ProvidesExplFile{l3deprecation.def}{2019-04-06}{}{L3 Deprecated functions}
-%    \end{macrocode}
-%
 % \subsection{Deprecated \pkg{l3str} functions}
 %
 %    \begin{macrocode}
@@ -623,7 +438,7 @@
 %<@@=str>
 %    \end{macrocode}
 %
-% \begin{macro}[EXP, deprecated = 2022-07-01]
+% \begin{macro}[EXP]
 %   {
 %     \str_lower_case:n, \str_lower_case:f,
 %     \str_upper_case:n, \str_upper_case:f,
@@ -630,28 +445,28 @@
 %     \str_fold_case:n,  \str_fold_case:V
 %   }
 %    \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \str_lowercase:n }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_lowercase:n }
 \cs_gset:Npn \str_lower_case:n { \str_lowercase:n }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \str_lowercase:f }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_lowercase:f }
 \cs_gset:Npn \str_lower_case:f { \str_lowercase:f }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \str_uppercase:n }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_uppercase:n }
 \cs_gset:Npn \str_upper_case:n { \str_uppercase:n }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \str_uppercase:f }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_uppercase:f }
 \cs_gset:Npn \str_upper_case:f { \str_uppercase:f }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \str_foldcase:n }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_foldcase:n }
 \cs_gset:Npn \str_fold_case:n { \str_foldcase:n }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \str_foldcase:V }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_foldcase:V }
 \cs_gset:Npn \str_fold_case:V { \str_foldcase:V }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP, deprecated = 2022-07-01]
+% \begin{macro}[EXP]
 %   {\str_declare_eight_bit_encoding:nnn}
 %   This command was made internal, with one more argument.  There is no
 %   easy way to compute a reasonable value for that extra argument so we
-%   take a value that is big enough to accomodate all of Unicode.
+%   take a value that is big enough to accommodate all of Unicode.
 %    \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { }
+\__kernel_patch_deprecation:nnNNpn { 2020-08-20 } { }
 \cs_gset_protected:Npn \str_declare_eight_bit_encoding:nnn #1
   { \@@_declare_eight_bit_encoding:nnnn {#1} { 1114112 } }
 %    \end{macrocode}
@@ -659,18 +474,31 @@
 %
 % \subsection{Deprecated \pkg{l3seq} functions}
 %
-% \begin{macro}[EXP, deprecated = 2023-01-01]
-%   {
-%     \seq_indexed_map_inline:Nn, \seq_indexed_map_function:NN
-%   }
+% \begin{macro}{\seq_indexed_map_inline:Nn}
+% \begin{macro}[EXP]{ \seq_indexed_map_function:NN}
 %    \begin{macrocode}
-\__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 }
+\__kernel_patch_deprecation:nnNNpn { 2020-06-18 } { \seq_map_indexed_inline:Nn }
+\cs_gset_protected:Npn \seq_indexed_map_inline:Nn { \seq_map_indexed_inline:Nn }
+\__kernel_patch_deprecation:nnNNpn { 2020-06-18 } { \seq_map_indexed_function:NN }
 \cs_gset:Npn \seq_indexed_map_function:NN { \seq_map_indexed_function:NN }
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
 %
+% \subsection{Deprecated \pkg{l3sys} functions}
+%
+% \begin{macro}{\sys_load_deprecation:}
+%    \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2021-01-11 } { (no~longer~required) }
+\cs_gset_protected:Npn \sys_load_deprecation:
+  {
+    \bool_if:NF \g_@@_deprecation_bool
+      { \__kernel_sys_configuration_load:n { l3deprecation } }
+    \bool_gset_true:N \g_@@_deprecation_bool
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Deprecated \pkg{l3tl} functions}
 %
 %    \begin{macrocode}
@@ -677,7 +505,7 @@
 %<@@=tl>
 %    \end{macrocode}
 %
-% \begin{macro}[deprecated = 2022-07-01]
+% \begin{macro}
 %   {
 %     \tl_lower_case:n, \tl_lower_case:nn,
 %     \tl_upper_case:n, \tl_upper_case:nn,
@@ -684,22 +512,22 @@
 %     \tl_mixed_case:n, \tl_mixed_case:nn,
 %   }
 %    \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_lowercase:n }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \text_lowercase:n }
 \cs_gset:Npn \tl_lower_case:n #1
   { \text_lowercase:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_lowercase:nn }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \text_lowercase:nn }
 \cs_gset:Npn \tl_lower_case:nn #1#2
   { \text_lowercase:nn {#1} {#2} }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_uppercase:n }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \text_uppercase:n }
 \cs_gset:Npn \tl_upper_case:n #1
   { \text_uppercase:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_uppercase:nn }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \text_uppercase:nn }
 \cs_gset:Npn \tl_upper_case:nn #1#2
   { \text_uppercase:nn {#1} {#2} }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_titlecase:n }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \text_titlecase:n }
 \cs_gset:Npn \tl_mixed_case:n #1
   { \text_titlecase:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_titlecase:nn }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \text_titlecase:nn }
 \cs_gset:Npn \tl_mixed_case:nn #1#2
   { \text_titlecase:nn {#1} {#2} }
 %    \end{macrocode}
@@ -707,7 +535,7 @@
 %
 % \subsection{Deprecated \pkg{l3token} functions}
 %
-% \begin{macro}[EXP, deprecated = 2022-07-01]
+% \begin{macro}[EXP]
 %   {
 %     \char_lower_case:N, \char_upper_case:N,
 %     \char_mixed_case:Nn, \char_fold_case:N,
@@ -715,28 +543,64 @@
 %     \char_str_mixed_case:Nn, \char_str_fold_case:N,
 %   }
 %    \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \char_lowercase:N }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_lowercase:N }
 \cs_gset:Npn \char_lower_case:N { \char_lowercase:N }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \char_uppercase:N }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_uppercase:N }
 \cs_gset:Npn \char_upper_case:N { \char_uppercase:N }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \char_titlecase:N }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_titlecase:N }
 \cs_gset:Npn \char_mixed_case:N { \char_titlecase:N }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \char_foldcase:N }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_foldcase:N }
 \cs_gset:Npn \char_fold_case:N { \char_foldcase:N }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \char_str_lowercase:N }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_str_lowercase:N }
 \cs_gset:Npn \char_str_lower_case:N { \char_str_lowercase:N }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \char_str_uppercase:N }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_str_uppercase:N }
 \cs_gset:Npn \char_str_upper_case:N { \char_str_uppercase:N }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \char_str_titlecase:N }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_str_titlecase:N }
 \cs_gset:Npn \char_str_mixed_case:N { \char_str_titlecase:N }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \char_str_foldcase:N }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_str_foldcase:N }
 \cs_gset:Npn \char_str_fold_case:N { \char_str_foldcase:N }
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[TF]
+%   {
+%     \peek_catcode_ignore_spaces:N, \peek_catcode_remove_ignore_spaces:N,
+%     \peek_charcode_ignore_spaces:N, \peek_charcode_remove_ignore_spaces:N,
+%     \peek_meaning_ignore_spaces:N, \peek_meaning_remove_ignore_spaces:N
+%   }
+%    A little extra fun here to deal with the expansion.
 %    \begin{macrocode}
-%</patches>
+\tl_map_inline:nn
+  {
+    { catcode } { catcode_remove }
+    { charcode } { charcode_remove }
+    { meaning } { meaning_remove }
+  }
+  {
+    \use:x
+      {
+        \__kernel_patch_deprecation:nnNNpn { 2022-01-11 } { \peek_remove_spaces:n }
+        \cs_gset_protected:Npn \exp_not:c { peek_ #1 _ignore_spaces:NTF } ####1####2####3
+          {
+            \peek_remove_spaces:n
+              { \exp_not:c { peek_ #1 :NTF } ####1 {####2} {####3} }
+          }
+        \__kernel_patch_deprecation:nnNNpn { 2022-01-11 } { \peek_remove_spaces:n }
+        \cs_gset_protected:Npn \exp_not:c { peek_ #1 _ignore_spaces:NT } ####1####2
+          {
+            \peek_remove_spaces:n
+              { \exp_not:c { peek_ #1 :NT } ####1 {####2} }
+          }
+        \__kernel_patch_deprecation:nnNNpn { 2022-01-11 } { \peek_remove_spaces:n }
+        \cs_gset_protected:Npn \exp_not:c { peek_ #1 _ignore_spaces:NF } ####1####2
+          {
+            \peek_remove_spaces:n
+              { \exp_not:c { peek_ #1 :NF } ####1 {####2} }
+          }
+      }
+  }
 %    \end{macrocode}
+% \end{macro}
 %
 %    \begin{macrocode}
 %</package>

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3doc.dtx
 %
-% Copyright (C) 1990-2021 The LaTeX Project
+% Copyright (C) 1990-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -31,7 +31,7 @@
 \askforoverwritefalse
 \preamble
 
-Copyright (C) 1990-2021 The LaTeX Project
+Copyright (C) 1990-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of
 the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -79,7 +79,7 @@
 %
 % \title{The \cls{l3doc} class}
 % \author{\Team}
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 % \maketitle
 % \tableofcontents
 %
@@ -1370,8 +1370,6 @@
     ':'~hence~it~is~not~clear~where~to~add~'_p'~or~'TF'.~
     Please~follow~expl3~naming~conventions.
   }
-\msg_new:nnn { l3doc } { deprecated-function }
-  { The~deprecated~function(s)~'#1'~should~have~been~removed~on~#2. }
 \msg_new:nnn { l3doc } { date-format }
   { The~date~'#1'~should~be~given~in~YYYY-MM-DD~format. }
 \msg_new:nnn { l3doc } { future-date }
@@ -2420,7 +2418,7 @@
       } ,
     added .code:n = { \@@_date_set_past:Nn \l_@@_date_added_tl {#1} },
     updated .code:n = { \@@_date_set_past:Nn \l_@@_date_updated_tl {#1} } ,
-    deprecated .code:n = { \@@_deprecated_on:n {#1} } ,
+    deprecated .code:n = {} , % A stub
     tested .code:n = { } ,
     label .code:n =
       {
@@ -2464,29 +2462,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_deprecated_on:n}
-%   The date comparison function expects two dates in the YYYY-MM-DD
-%   format (|-|~is not subtraction here).
-%   Complain if a deprecated function should have been removed earlier.
-%   In any case, mark it as internal to suppress the text
-%   \enquote{documented on page \ldots{}}.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_deprecated_on:n #1
-  {
-    \@@_date_set:Nn \l_@@_tmpa_tl {#1}
-    \exp_args:No \@@_date_compare:nNnT
-      { \l_@@_tmpa_tl } < { \c_sys_year_int - \c_sys_month_int - \c_sys_day_int }
-      {
-        \msg_error:nnxx { l3doc } { deprecated-function }
-          { \tl_to_str:N \l_@@_macro_argument_tl }
-          { \l_@@_tmpa_tl }
-      }
-    \bool_set_true:N \l_@@_macro_internal_bool
-    \bool_set_true:N \l_@@_macro_internal_set_bool
-  }
-%    \end{macrocode}
-% \end{macro}
-%
 % \begin{macro}{\@@_function:nnw}
 %   \begin{arguments}
 %     \item Key--value list.
@@ -2922,7 +2897,7 @@
       } ,
     added .code:n = {} , % TODO
     updated .code:n = {} , % TODO
-    deprecated .code:n = { \@@_deprecated_on:n {#1} } ,
+    deprecated .code:n = {} , % A stub
     verb .bool_set:N = \l_@@_names_verb_bool ,
     module .tl_set:N = \l_@@_override_module_tl ,
     documented-as .tl_set:N = \l_@@_macro_documented_tl ,

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File l3dosctrip.dtx
 %
-% Copyright (C) 2012,2014-2021 The LaTeX Project
+% Copyright (C) 2012,2014-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3expan.dtx
 %
-% Copyright (C) 1990-2021 The LaTeX Project
+% Copyright (C) 1990-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3file.dtx
 %
-% Copyright (C) 1990-2021 The LaTeX Project
+% Copyright (C) 1990-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3flag.dtx
 %
-% Copyright (C) 2011-2021 The LaTeX Project
+% Copyright (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3fp-assign.dtx
 %
-% Copyright (C) 2011-2021 The LaTeX Project
+% Copyright (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3fp-aux.dtx
 %
-% Copyright (C) 2011-2021 The LaTeX Project
+% Copyright (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3fp-basics.dtx
 %
-% Copyright (C) 2011-2014,2016-2021 The LaTeX Project
+% Copyright (C) 2011-2014,2016-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3fp-convert.dtx
 %
-% Copyright (C) 2011-2021 The LaTeX Project
+% Copyright (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3fp-expo.dtx
 %
-% Copyright (C) 2011-2021 The LaTeX Project
+% Copyright (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3fp-extended.dtx
 %
-% Copyright (C) 2011-2021 The LaTeX Project
+% Copyright (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3fp-logic.dtx
 %
-% Copyright (C) 2011-2021 The LaTeX Project
+% Copyright (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3fp-parse.dtx
 %
-% Copyright (C) 2011-2021 The LaTeX Project
+% Copyright (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3fp-random.dtx
 %
-% Copyright (C) 2016-2021 The LaTeX Project
+% Copyright (C) 2016-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3fp-round.dtx
 %
-% Copyright (C) 2011-2021 The LaTeX Project
+% Copyright (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3fp-traps.dtx
 %
-% Copyright (C) 2011-2014,2016-2021 The LaTeX Project
+% Copyright (C) 2011-2014,2016-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3fp-trig.dtx
 %
-% Copyright (C) 2011-2021 The LaTeX Project
+% Copyright (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3fp.dtx
 %
-% Copyright (C) 2011-2021 The LaTeX Project
+% Copyright (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3fparray.dtx
 %
-% Copyright (C) 2018-2021 The LaTeX Project
+% Copyright (C) 2018-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3int.dtx
 %
-% Copyright (C) 1990-2021 The LaTeX Project
+% Copyright (C) 1990-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3intarray.dtx
 %
-% Copyright (C) 2017-2021 The LaTeX Project
+% Copyright (C) 2017-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3kernel-functions.dtx
 %
-% Copyright (C) 2018-2021 The LaTeX Project
+% Copyright (C) 2018-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3keys.dtx
 %
-% Copyright (C) 2006-2021 The LaTeX Project
+% Copyright (C) 2006-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -358,6 +358,24 @@
 %   require a value at point-of-use unless a default is set.
 % \end{function}
 %
+% \begin{function}[updated = 2021-11-22]
+%   {
+%     .legacy_if_set:n, .legacy_if_gset:n,
+%     .legacy_if_set_inverse:n, .legacy_if_gset_inverse:n
+%   }
+%   \begin{syntax}
+%     \meta{key} .legacy_if_set:n = \meta{switch}
+%   \end{syntax}
+%   Defines \meta{key} to set legacy \cs{if} \meta{switch} to \meta{value}
+%   (which must be either \enquote{\texttt{true}} or \enquote{\texttt{false}}).
+%   The \meta{switch} is the name of the switch \emph{without the leading
+%   \cs{if}}. Note that in contrast to \pkg{expl3} variables, the \meta{switch}
+%   will \emph{not} be created if it does not exist.
+%
+%   The \texttt{inverse} versions will set the \meta{switch} to the logical
+%   opposite of the \meta{value}.
+% \end{function}
+%
 % \begin{function}[updated = 2013-07-10]{.meta:n}
 %   \begin{syntax}
 %     \meta{key} .meta:n = \Arg{keyval list}
@@ -661,6 +679,31 @@
 % \cs{l_keys_choice_tl} and \cs{l_keys_choice_int} in exactly
 % the same way as described for \texttt{.choices:nn}.
 %
+% \subsection{Key usage scope}
+%
+% Some keys will be used as settings which have a strictly limited scope
+% of usage. Some will be only available once, others will only be valid
+% until typesetting begins. To allow formats to support this in a structured
+% way, \pkg{l3keys} allows this information to be specified using the
+% \texttt{.usage:n} property.
+%
+% \begin{function}[added = 2022-01-10]{.usage:n}
+%   \begin{syntax}
+%     \meta{key} .usage:n = \meta{scope}
+%   \end{syntax}
+%   Defines the \meta{key} to have usage within the \meta{scope}, which
+%   should be one of \texttt{general}, \texttt{preamble} or \texttt{load}.
+% \end{function}
+%
+% \begin{variable}[added = 2022-01-10]
+%   {\l_keys_usage_load_prop, \l_keys_usage_preamble_prop}
+%   \pkg{l3keys} itself does \emph{not} attempt to redefine keys based on the
+%   usage scope. Rather, this information is made available with these
+%   two property lists. These hold an entry for each module (prefix); the
+%   value of each entry is a comma-separated list of the usage-restricted
+%   key(s).
+% \end{variable}
+%
 % \section{Setting keys}
 %
 % \begin{function}[updated = 2017-11-14]
@@ -831,7 +874,8 @@
 %
 % \section{Utility functions for keys}
 %
-% \begin{function}[EXP, pTF, updated = 2017-11-14]{\keys_if_exist:nn}
+% \begin{function}[EXP, pTF, updated = 2022-01-10]
+%   {\keys_if_exist:nn, \keys_if_exist:ne}
 %   \begin{syntax}
 %     \cs{keys_if_exist_p:nn} \Arg{module} \Arg{key} \\
 %     \cs{keys_if_exist:nnTF} \Arg{module} \Arg{key} \Arg{true code} \Arg{false code}
@@ -1461,20 +1505,20 @@
 % \begin{variable}
 %   {
 %     \c_@@_code_root_str    ,
+%     \c_@@_check_root_str   ,
 %     \c_@@_default_root_str ,
 %     \c_@@_groups_root_str  ,
-%     \c_@@_inherit_root_str  ,
-%     \c_@@_type_root_str    ,
-%     \c_@@_validate_root_str
+%     \c_@@_inherit_root_str ,
+%     \c_@@_type_root_str
 %   }
 %   Various storage areas for the different data which make up keys.
 %    \begin{macrocode}
 \str_const:Nn \c_@@_code_root_str     { key~code~>~ }
+\str_const:Nn \c_@@_check_root_str    { key~check~>~ }
 \str_const:Nn \c_@@_default_root_str  { key~default~>~ }
 \str_const:Nn \c_@@_groups_root_str   { key~groups~>~ }
 \str_const:Nn \c_@@_inherit_root_str  { key~inherit~>~ }
 \str_const:Nn \c_@@_type_root_str     { key~type~>~ }
-\str_const:Nn \c_@@_validate_root_str { key~validate~>~ }
 %    \end{macrocode}
 % \end{variable}
 %
@@ -1607,6 +1651,14 @@
 %    \end{macrocode}
 % \end{variable}
 %
+% \begin{variable}{\l_keys_usage_load_prop, \l_keys_usage_preamble_prop}
+%   Global data for document-level information.
+%    \begin{macrocode}
+\prop_new:N \l_keys_usage_load_prop
+\prop_new:N \l_keys_usage_preamble_prop
+%    \end{macrocode}
+% \end{variable}
+%
 % \subsubsection{Internal auxiliaries}
 %
 % \begin{variable}{\s_@@_nil,\s_@@_mark,\s_@@_stop}
@@ -1916,7 +1968,7 @@
 % \end{macro}
 %
 % \begin{macro}{\@@_default_set:n}
-%   Setting a default value is easy. These are stored using \cs{cs_set:cpx} as this
+%   Setting a default value is easy. These are stored using \cs{cs_set_nopar:cpx} as this
 %   avoids any worries about whether a token list exists.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_default_set:n #1
@@ -2060,7 +2112,7 @@
 \cs_new_protected:Npn \@@_undefine:
   {
     \clist_map_inline:nn
-      { code , default , groups , inherit , type , validate }
+      { code , default , groups , inherit , type , check }
       {
         \cs_set_eq:cN
           { \tl_use:c { c_@@_ ##1 _root_str } \l_keys_path_str }
@@ -2071,7 +2123,7 @@
 % \end{macro}
 %
 % \begin{macro}{\@@_value_requirement:nn}
-% \begin{macro}{\@@_validate_forbidden:, \@@_validate_required:}
+% \begin{macro}{\@@_check_forbidden:, \@@_check_required:}
 %   Validating key input is done using a second function which runs before
 %   the main key code. Setting that up means setting it equal to a generic
 %   stub which does the check. This approach makes the lookup very fast at
@@ -2085,17 +2137,17 @@
         { true }
           {
             \cs_set_eq:cc
-              { \c_@@_validate_root_str \l_keys_path_str }
-              { @@_validate_ #1 : }
+              { \c_@@_check_root_str \l_keys_path_str }
+              { @@_check_ #1 : }
           }
         { false }
           {
             \cs_if_eq:ccT
-              { \c_@@_validate_root_str \l_keys_path_str }
-              { @@_validate_ #1 : }
+              { \c_@@_check_root_str \l_keys_path_str }
+              { @@_check_ #1 : }
               {
                 \cs_set_eq:cN
-                  { \c_@@_validate_root_str \l_keys_path_str }
+                  { \c_@@_check_root_str \l_keys_path_str }
                   \tex_undefined:D
               }
           }
@@ -2106,7 +2158,7 @@
           { .value_ #1 :n }
       }
   }
-\cs_new_protected:Npn \@@_validate_forbidden:
+\cs_new_protected:Npn \@@_check_forbidden:
   {
     \bool_if:NF \l_@@_no_value_bool
       {
@@ -2115,7 +2167,7 @@
         \use_none:nnn
       }
   }
-\cs_new_protected:Npn \@@_validate_required:
+\cs_new_protected:Npn \@@_check_required:
   {
     \bool_if:NT \l_@@_no_value_bool
       {
@@ -2128,6 +2180,62 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\@@_usage:n}
+% \begin{macro}{\@@_usage:NN}
+% \begin{macro}{\@@_usage:w}
+%   Save the relevant data.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_usage:n #1
+  {
+    \str_case:nnF {#1}
+      {
+        { general }
+          {
+            \@@_usage:NN \l_keys_usage_load_prop
+              \c_false_bool
+            \@@_usage:NN \l_keys_usage_preamble_prop
+              \c_false_bool
+          }
+        { load }
+          {
+            \@@_usage:NN \l_keys_usage_load_prop
+              \c_true_bool
+            \@@_usage:NN \l_keys_usage_preamble_prop
+              \c_false_bool
+          }
+        { preamble }
+          {
+            \@@_usage:NN \l_keys_usage_load_prop
+              \c_false_bool
+            \@@_usage:NN \l_keys_usage_preamble_prop
+              \c_true_bool
+          }
+      }
+      {
+        \msg_error:nnnn { keys }
+          { choice-unknown }
+          { .usage:n }
+          {#1}
+      }
+  }
+\cs_new_protected:Npn \@@_usage:NN #1#2
+  {
+    \prop_get:NVNF #1 \l_@@_module_str \l_@@_tmpa_tl
+      { \tl_clear:N \l_@@_tmpa_tl }
+    \tl_set:Nx \l_@@_tmpb_tl
+      { \exp_after:wN \@@_usage:w \l_keys_path_str \s_@@_stop }
+    \bool_if:NTF #2
+      { \clist_put_right:NV \l_@@_tmpa_tl \l_@@_tmpb_tl }
+      { \clist_remove_all:NV \l_@@_tmpa_tl \l_@@_tmpb_tl }
+    \prop_put:NVV #1 \l_@@_module_str
+      \l_@@_tmpa_tl
+  }
+\cs_new:Npn \@@_usage:w #1 / #2 \s_@@_stop {#2}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}{\@@_variable_set:NnnN, \@@_variable_set:cnnN}
 % \begin{macro}{\@@_variable_set_required:NnnN, \@@_variable_set_required:cnnN}
 %   Setting a variable takes the type and scope separately so that
@@ -2529,6 +2637,13 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{.usage:n}
+%    \begin{macrocode}
+\cs_new_protected:cpn { \c_@@_props_root_str .usage:n } #1
+  { \@@_usage:n {#1} }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{.value_forbidden:n}
 % \begin{macro}{.value_required:n}
 %   These are very similar, so both call the same function.
@@ -2541,6 +2656,29 @@
 % \end{macro}
 % \end{macro}
 %
+% \subsection{Key properties for \LaTeXe{} options}
+%
+% \begin{macro}{.if, .store, .usage}
+%    \begin{macrocode}
+\group_begin:
+  \cs_set_protected:Npn \@@_tmp:nn #1#2
+    {
+      \quark_if_recursion_tail_stop:n {#1}
+      \cs_new_eq:cc
+        { \c_@@_props_root_str . #2 }
+        { \c_@@_props_root_str . #1 }
+      \@@_tmp:nn
+    }
+  \@@_tmp:nn
+    { legacy_if:n } { if }
+    { tl_set:N }    { store }
+    { usage:n }     { usage }
+    { \q_recursion_tail } { }
+    \q_recursion_stop
+\group_end:
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Setting keys}
 %
 % \begin{macro}
@@ -2968,7 +3106,7 @@
   {
     \cs_if_exist:cTF { \c_@@_code_root_str \l_keys_path_str }
       {
-        \cs_if_exist_use:c { \c_@@_validate_root_str \l_keys_path_str }
+        \cs_if_exist_use:c { \c_@@_check_root_str \l_keys_path_str }
         \@@_execute:no \l_keys_path_str \l_keys_value_tl
       }
       {
@@ -2992,7 +3130,7 @@
           { \c_@@_code_root_str ##1 / \l_keys_key_str }
           {
             \str_set:Nn \l_@@_inherit_str {##1}
-            \cs_if_exist_use:c { \c_@@_validate_root_str ##1 / \l_keys_key_str }
+            \cs_if_exist_use:c { \c_@@_check_root_str ##1 / \l_keys_key_str }
             \@@_execute:no { ##1 / \l_keys_key_str } \l_keys_value_tl
             \clist_map_break:n \use_none:n
           }
@@ -3231,6 +3369,7 @@
       { \prg_return_true: }
       { \prg_return_false: }
   }
+\prg_generate_conditional_variant:Nnn \keys_if_exist:nn { ne } { T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3legacy.dtx
 %
-% Copyright (C) 2019-2021 The LaTeX Project
+% Copyright (C) 2019-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3luatex.dtx
 %
-% Copyright (C) 2010-2021 The LaTeX Project
+% Copyright (C) 2010-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -125,34 +125,9 @@
 %   |ltx.utils| table.
 % \end{function}
 %
-% \begin{function}[deprecated = 2021-12-31]{l3kernel}
-%   For compatibility reasons, there are also some deprecated interfaces provided
-%   in the |l3kernel| table. These do not return their result as Lua values but
-%   instead print them to \TeX.
-% \end{function}
-%
-% \begin{function}{l3kernel.charcat}
+% \begin{function}{ltx.utils.filedump}
 %   \begin{syntax}
-%     |l3kernel.charcat(|\meta{charcode}, \meta{catcode}|)|
-%   \end{syntax}
-%   Constructs a character of \meta{charcode} and \meta{catcode} and returns
-%   the result to \TeX{}.
-% \end{function}
-%
-% \begin{function}{l3kernel.elapsedtime}
-%   \begin{syntax}
-%     |l3kernel.elapsedtime()|
-%   \end{syntax}
-%   Returns the CPU time in \meta{scaled seconds} since the start of the
-%   \TeX{} run or since |l3kernel.resettimer| was issued.  This only
-%   measures the time used by the CPU, not the real time, e.g., waiting
-%   for user input.
-% \end{function}
-%
-% \begin{function}{ltx.utils.filedump, l3kernel.filedump}
-%   \begin{syntax}
 %     \meta{dump}| = ltx.utils.filedump(|\meta{file}|,|\meta{offset}|,|\meta{length}|)| \\
-%     |l3kernel.filedump(|\meta{file}|,|\meta{offset}|,|\meta{length}|)|
 %   \end{syntax}
 %   Returns the uppercase hexadecimal representation of the content of the
 %   \meta{file} read as bytes. If the \meta{length} is given, only this part
@@ -161,10 +136,9 @@
 %   is read starting at the \meta{offset}.
 % \end{function}
 %
-% \begin{function}{ltx.utils.filemd5sum, l3kernel.filemdfivesum}
+% \begin{function}{ltx.utils.filemd5sum}
 %   \begin{syntax}
 %     \meta{hash}| = ltx.utils.filemd5sum(|\meta{file}|)| \\
-%     |l3kernel.filemdfivesum(|\meta{file}|)|
 %   \end{syntax}
 %   Returns the MD5 sum of the file contents read as bytes; note that
 %   the result will depend on the nature of the line endings used in the file,
@@ -172,10 +146,9 @@
 %   nothing is returned with \emph{no error raised}.
 % \end{function}
 %
-% \begin{function}{ltx.utils.filemoddate, l3kernel.filemoddate}
+% \begin{function}{ltx.utils.filemoddate}
 %   \begin{syntax}
 %     \meta{date}| = ltx.utils.filemoddate(|\meta{file}|)| \\
-%     |l3kernel.filemoddate(|\meta{file}|)|
 %   \end{syntax}
 %   Returns the date/time of last modification of the \meta{file} in the
 %   format
@@ -188,37 +161,14 @@
 %   not found, nothing is returned with \emph{no error raised}.
 % \end{function}
 %
-% \begin{function}{ltx.utils.filesize, l3kernel.filesize}
+% \begin{function}{ltx.utils.filesize}
 %   \begin{syntax}
 %     |size = ltx.utils.filesize(|\meta{file}|)| \\
-%     |l3kernel.filesize(|\meta{file}|)|
 %   \end{syntax}
 %   Returns the size of the \meta{file} in bytes. If the \meta{file} is not
 %   found, nothing is returned with \emph{no error raised}.
 % \end{function}
 %
-% \begin{function}{l3kernel.resettimer}
-%   \begin{syntax}
-%     |l3kernel.resettimer()|
-%   \end{syntax}
-%  Resets the timer used by |l3kernel.elapsetime|.
-% \end{function}
-%
-% \begin{function}{l3kernel.shellescape}
-%   \begin{syntax}
-%     |l3kernel.shellescape(|\meta{cmd}|)|
-%   \end{syntax}
-%   Executes the \meta{cmd} and prints to the log as for \pdfTeX{}.
-% \end{function}
-%
-% \begin{function}{l3kernel.strcmp}
-%   \begin{syntax}
-%     |l3kernel.strcmp(|\meta{str one}, \meta{str two}|)|
-%   \end{syntax}
-%   Compares the two strings and returns |0| to \TeX{}
-%   if the two are identical.
-% \end{function}
-%
 % \end{documentation}
 %
 % \begin{implementation}
@@ -322,18 +272,14 @@
 % Most of the emulation of \pdfTeX{} here is based heavily on Heiko Oberdiek's
 % \pkg{pdftexcmds} package.
 %
-% \begin{macro}{l3kernel}
 % \begin{macro}{ltx.utils}
 %   Create a table for the kernel's own use.
 %    \begin{macrocode}
-l3kernel = l3kernel or { }
-local l3kernel = l3kernel
 ltx = ltx or {utils={}}
 ltx.utils = ltx.utils or { }
 local ltxutils = ltx.utils
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 %   Local copies of global tables.
 %    \begin{macrocode}
@@ -413,16 +359,6 @@
 end
 %    \end{macrocode}
 %
-%    \begin{macrocode}
-local function deprecated(table, name, func)
-  table[name] = function(...)
-    write_nl(format("Calling deprecated Lua function %s", name))
-    table[name] = func
-    return func(...)
-  end
-end
-%    \end{macrocode
-%
 %   Deal with Con\TeX{}t: doesn't use |kpse| library.
 %    \begin{macrocode}
 local kpse_find = (resolvers and resolvers.findfile) or kpse.find_file
@@ -440,40 +376,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{l3kernel.charcat}
-%   Creating arbitrary chars using |tex.cprint|.
-%   The alternative approach using |token.put_next(token.create(...))|
-%   would be about 10\% slower.
-%    \begin{macrocode}
-deprecated(l3kernel, 'charcat', function(charcode, catcode)
-  cprint(catcode, utf8_char(charcode))
-end)
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{l3kernel.elapsedtime, l3kernel.resettimer}
-%   Simple timing set up: give the result from the system clock in scaled
-%   seconds.
-%    \begin{macrocode}
-local os_clock   = os.clock
-local base_clock_time = 0
-local function elapsedtime()
-  local val = (os_clock() - base_clock_time) * 65536 + 0.5
-  if val > 2147483647 then
-    val = 2147483647
-  end
-  write(format("%d",floor(val)))
-end
-l3kernel.elapsedtime = elapsedtime
-local function resettimer()
-  base_clock_time = os_clock()
-end
-l3kernel.resettimer = resettimer
-%    \end{macrocode}
-% \end{macro}
-%
 % \begin{macro}{ltx.utils.filedump}
-% \begin{macro}{l3kernel.filedump}
 %   Similar comments here to the next function: read the file in binary mode
 %   to avoid any line-end weirdness.
 %    \begin{macrocode}
@@ -490,15 +393,8 @@
   return escapehex(data)
 end
 ltxutils.filedump = filedump
-deprecated(l3kernel, "filedump", function(name, offset, length)
-  local dump = filedump(name, tonumber(offset), tonumber(length))
-  if dump then
-    write(dump)
-  end
-end)
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 % \begin{macro}{md5.HEX}
 % Hash a string and return the hash in uppercase hexadecimal format.
@@ -516,7 +412,6 @@
 %    \end{macrocode}
 % \end{macro}
 % \begin{macro}{ltx.utils.filemd5sum}
-% \begin{macro}{l3kernel.filemdfivesum}
 %   Read an entire file and hash it: the hash function itself is a built-in.
 %   As Lua is byte-based there is no work needed here in terms of UTF-8
 %   (see \pkg{pdftexcmds} and how it handles strings that have passed through
@@ -532,18 +427,10 @@
   return md5_HEX(data)
 end
 ltxutils.filemd5sum = filemd5sum
-deprecated(l3kernel, "filemdfivesum", function(name)
-  local hash = filemd5sum(name)
-  if hash then
-    write(hash)
-  end
-end)
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 % \begin{macro}{ltx.utils.filemoddate}
-% \begin{macro}{l3kernel.filemoddate}
 %   There are two cases: If the C standard library is C99 compliant,
 %   we can use |%z| to get the timezone in almost the right format.
 %   We only have to add primes and replace a zero or missing offset
@@ -607,18 +494,10 @@
   end
 end
 ltxutils.filemoddate = filemoddate
-deprecated(l3kernel, "filemoddate", function(name)
-  local hash = filemoddate(name)
-  if hash then
-    write(hash)
-  end
-end)
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 % \begin{macro}{ltx.utils.filesize}
-% \begin{macro}{l3kernel.filesize}
 %   A simple disk lookup.
 %    \begin{macrocode}
 local function filesize(name)
@@ -631,49 +510,9 @@
   end
 end
 ltxutils.filesize = filesize
-deprecated(l3kernel, "filesize", function(name)
-  local size = filesize(name)
-  if size then
-    write(size)
-  end
-end)
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
-% \begin{macro}{l3kernel.strcmp}
-%   String comparison which gives the same results as \pdfTeX{}'s
-%   \tn{pdfstrcmp}, although the ordering should likely not be relied upon!
-%    \begin{macrocode}
-deprecated(l3kernel, "strcmp", function (A, B)
-  if A == B then
-    write("0")
-  elseif A < B then
-    write("-1")
-  else
-    write("1")
-  end
-end)
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{l3kernel.shellescape}
-%   Replicating the \pdfTeX{} log interaction for shell escape.
-%    \begin{macrocode}
-local os_exec    = os.execute
-deprecated(l3kernel, "shellescape", function(cmd)
-  local status,msg = os_exec(cmd)
-  if status == nil then
-    write_nl("log","runsystem(" .. cmd .. ")...(" .. msg .. ")\n")
-  elseif status == 0 then
-    write_nl("log","runsystem(" .. cmd .. ")...executed\n")
-  else
-    write_nl("log","runsystem(" .. cmd .. ")...failed " .. (msg or "") .. "\n")
-  end
-end)
-%    \end{macrocode}
-% \end{macro}
-%
 % \begin{macro}[int]{luadef}
 % An internal function for defining control sequences form Lua which behave
 % like primitives. This acts as a wrapper around |token.set_lua| which accepts

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3msg.dtx
 %
-% Copyright (C) 2009-2021 The LaTeX Project
+% Copyright (C) 2009-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3names.dtx
 %
-% Copyright (C) 1990-2021 The LaTeX Project
+% Copyright (C) 1990-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3pdf.dtx
 %
-% Copyright(C) 2019-2021 The LaTeX Project
+% Copyright(C) 2019-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3prg.dtx
 %
-% Copyright (C) 2005-2021 The LaTeX Project
+% Copyright (C) 2005-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3prop.dtx
 %
-% Copyright (C) 1990-2021 The LaTeX Project
+% Copyright (C) 1990-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -311,6 +311,21 @@
 %   the input stream as an \meta{integer denotation}.
 % \end{function}
 %
+% \begin{function}[EXP]{\prop_to_keyval:N}
+%   \begin{syntax}
+%     \cs{prop_to_keyval:N} \meta{property list}
+%   \end{syntax}
+%   Expands to the \meta{property list} in a key--value notation. Keep in mind
+%   that a \meta{property list} is \emph{unordered}, while key--value interfaces
+%   don't necessarily are, so this can't be used for arbitrary interfaces.
+%   \begin{texnote}
+%     The result is returned within the \tn{unexpanded} primitive
+%     (\cs{exp_not:n}), which means that the key--value list does not expand
+%     further when appearing in an \texttt{x}-type argument expansion.
+%     It also needs exactly two steps of expansion.
+%   \end{texnote}
+% \end{function}
+%
 % \section{Modifying property lists}
 %
 % \begin{function}[added = 2012-05-12]
@@ -1055,6 +1070,79 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}[EXP]{\prop_to_keyval:N}
+% \begin{macro}[EXP]
+%   {\@@_to_keyval_exp_after:wN, \@@_to_keyval:nn, \@@_to_keyval:nnw}
+%   Each property name and value pair will be returned in the form
+%   \verb*| |\marg{name}\verb*|= |\marg{value}. As one of the main use cases for
+%   this macro is to pass the \meta{property list} on to a key--value parser, we
+%   have to make sure that the behaviour is as good as possible. Using a space
+%   before the opening brace we get the correct brace stripping behaviour for
+%   most of the key--value parsers available in \LaTeX.
+%   If \cs{tex_expanded:D} is available this function makes use of it, so there
+%   are two different implementations here. They both start with
+%   \cs{__kernel_exp_not:w} to start the expansion context to expand in two
+%   steps. If the \meta{property list} is empty they just leave an empty set of
+%   braces in the input stream for \cs{__kernel_exp_not:w}.
+%    \begin{macrocode}
+\cs_if_exist:NTF \tex_expanded:D
+  {
+%    \end{macrocode}
+%   The variant using \cs{tex_expanded:D} can just iterate over the
+%   \meta{property list} and remove the leading comma afterwards. Only the value
+%   has to be protected in \cs{__kernel_exp_not:w} as the property name is
+%   always a string. After the loop the leading comma is removed by
+%   \cs{use_none:n} and afterwards \cs{__kernel_exp_not:w} eventually finds the
+%   opening brace of its argument.
+%    \begin{macrocode}
+    \cs_new:Npn \prop_to_keyval:N #1
+      {
+        \__kernel_exp_not:w
+          \prop_if_empty:NTF #1
+            { {} }
+            {
+              \exp_after:wN \exp_after:wN \exp_after:wN
+              {
+                \tex_expanded:D
+                  {
+                    \__kernel_exp_not:w { \use_none:n }
+                    \prop_map_function:NN #1 \@@_to_keyval:nn
+                  }
+              }
+            }
+      }
+    \cs_new:Npn \@@_to_keyval:nn #1#2
+      { , ~ {#1} =~ { \__kernel_exp_not:w {#2} } }
+  }
+%    \end{macrocode}
+%   The other variant will iterate over the \meta{property list} and has to
+%   output the result in a group after the marker
+%   \cs{@@_to_keyval_exp_after:wN}. As a result this is considerably slower than
+%   the \cs{tex_expanded:D} using variant as it has to read the entire contents
+%   of the \meta{property list} for each item.  Since the marker is just
+%   \cs{exp_after:wN} with another name, after the loop the leading comma is
+%   gobbled by \cs{use_none:n}, leaving the result as the argument to
+%   \cs{__kernel_exp_not:w}.
+%    \begin{macrocode}
+  {
+    \cs_new:Npn \prop_to_keyval:N #1
+      {
+        \__kernel_exp_not:w
+          \prop_if_empty:NTF #1
+            { {} }
+            {
+              \prop_map_function:NN #1 \@@_to_keyval:nnw
+              \@@_to_keyval_exp_after:wN { \use_none:n }
+            }
+      }
+    \cs_new_eq:NN \@@_to_keyval_exp_after:wN \exp_after:wN
+    \cs_new:Npn \@@_to_keyval:nnw #1#2#3 \@@_to_keyval_exp_after:wN #4
+      { #3 \@@_to_keyval_exp_after:wN { #4 , ~ {#1} =~ {#2} } }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}[TF, tested = m3prop004]
 %   {\prop_pop:NnN, \prop_pop:cnN, \prop_gpop:NnN, \prop_gpop:cnN}
 %   Popping an item from a property list, keeping track of whether

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3quark.dtx
 %
-% Copyright (C) 1990-2021 The LaTeX Project
+% Copyright (C) 1990-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3regex.dtx
 %
-% Copyright (C) 2011-2021 The LaTeX Project
+% Copyright (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -99,7 +99,7 @@
 %
 % \section{Syntax of regular expressions}
 %
-% \subsection{Regex examples}
+% \subsection{Regular expression examples}
 %
 % We start with a few examples, and encourage the reader to apply
 % \cs{regex_show:n} to these regular expressions.
@@ -620,6 +620,38 @@
 %   results in \cs[no-index]{l_foo_int} taking the value $5$.
 % \end{function}
 %
+% \begin{function}[noTF, added = 2022-01-10]{\regex_match_case:nn}
+%   \begin{syntax}
+%     \cs{regex_match_case:nnTF}
+%     ~~|{| \\
+%     ~~~~\Arg{regex_1} \Arg{code case_1} \\
+%     ~~~~\Arg{regex_2} \Arg{code case_2} \\
+%     ~~~~\ldots \\
+%     ~~~~\Arg{regex_n} \Arg{code case_n} \\
+%     ~~|}| \Arg{token list}
+%     ~~\Arg{true code} \Arg{false code}
+%   \end{syntax}
+%   Determines which of the \meta{regular expressions} matches at the
+%   earliest point in the \meta{token list}, and leaves the
+%   corresponding \meta{code_i} followed by the \meta{true code} in the
+%   input stream.  If several \meta{regex} match starting at the same
+%   point, then the first one in the list is selected and the others are
+%   discarded.  If none of the \meta{regex} match, the \meta{false code}
+%   is left in the input stream.  Each \meta{regex} can either be given
+%   as a regex variable or as an explicit regular expression.
+%
+%   In detail, for each starting position in the \meta{token list}, each
+%   of the \meta{regex} is searched in turn.  If one of them matches
+%   then the corresponding \meta{code} is used and everything else is
+%   discarded, while if none of the \meta{regex} match at a given
+%   position then the next starting position is attempted.  If none of
+%   the \meta{regex} match anywhere in the \meta{token list} then
+%   nothing is left in the input stream.  Note that this differs from
+%   nested \cs{regex_match:nnTF} statements since all \meta{regex} are
+%   attempted at each position rather than attempting to match
+%   \meta{regex_1} at every position before moving on to \meta{regex_2}.
+% \end{function}
+%
 % \section{Submatch extraction}
 %
 % \begin{function}[noTF, added = 2017-05-26]
@@ -734,6 +766,74 @@
 %   locally to \meta{tl~var}.
 % \end{function}
 %
+% \begin{function}[noTF, added = 2022-01-10]{\regex_replace_case_once:nN}
+%   \begin{syntax}
+%     \cs{regex_replace_case_once:nNTF}
+%     ~~|{| \\
+%     ~~~~\Arg{regex_1} \Arg{replacement_1} \\
+%     ~~~~\Arg{regex_2} \Arg{replacement_2} \\
+%     ~~~~\ldots \\
+%     ~~~~\Arg{regex_n} \Arg{replacement_n} \\
+%     ~~|}| \meta{tl~var}
+%     ~~\Arg{true code} \Arg{false code}
+%   \end{syntax}
+%   Replaces the earliest match of the regular expression
+%   "(?|"\meta{regex_1}"|"\dots"|"\meta{regex_n}")" in the \meta{token
+%   list variable} by the \meta{replacement} corresponding to which
+%   \meta{regex_i} matched, then leaves the \meta{true code} in the
+%   input stream.  If none of the \meta{regex} match, then the
+%   \meta{tl~var} is not modified, and the \meta{false code} is left in
+%   the input stream.  Each \meta{regex} can either be given as a regex
+%   variable or as an explicit regular expression.
+%
+%   In detail, for each starting position in the \meta{token list}, each
+%   of the \meta{regex} is searched in turn.  If one of them matches
+%   then it is replaced by the corresponding \meta{replacement} as
+%   described for \cs{regex_replace_once:nnN}.  This is equivalent to
+%   checking with \cs{regex_match_case:nn} which \meta{regex} matches,
+%   then performing the replacement with \cs{regex_replace_once:nnN}.
+% \end{function}
+%
+% \begin{function}[noTF, added = 2022-01-10]{\regex_replace_case_all:nN}
+%   \begin{syntax}
+%     \cs{regex_replace_case_all:nNTF}
+%     ~~|{| \\
+%     ~~~~\Arg{regex_1} \Arg{replacement_1} \\
+%     ~~~~\Arg{regex_2} \Arg{replacement_2} \\
+%     ~~~~\ldots \\
+%     ~~~~\Arg{regex_n} \Arg{replacement_n} \\
+%     ~~|}| \meta{tl~var}
+%     ~~\Arg{true code} \Arg{false code}
+%   \end{syntax}
+%   Replaces all occurrences of all \meta{regex} in the \meta{token
+%   list} by the corresponding \meta{replacement}.  Every match is
+%   treated independently, and matches cannot overlap.  The result is
+%   assigned locally to \meta{tl~var}, and the \meta{true code} or
+%   \meta{false code} is left in the input stream depending on whether
+%   any replacement was made or not.
+%
+%   In detail, for each starting position in the \meta{token list}, each
+%   of the \meta{regex} is searched in turn.  If one of them matches
+%   then it is replaced by the corresponding \meta{replacement}, and the
+%   search resumes at the position that follows this match (and
+%   replacement).  For instance
+% \begin{verbatim}
+% \tl_set:Nn \l_tmpa_tl { Hello,~world! }
+% \regex_replace_case_all:nN
+%   {
+%     { [A-Za-z]+ } { ``\0'' }
+%     { \b } { --- }
+%     { . } { [\0] }
+%   } \l_tmpa_tl
+% \end{verbatim}
+%   results in \cs{l_tmpa_tl} having the contents
+%   \verb*|``Hello''---[,][ ]``world''---[!]|.  Note in particular that
+%   the word-boundary assertion |\b| did not match at the start of words
+%   because the case |[A-Za-z]+| matched at these positions.  To change
+%   this, one could simply swap the order of the two cases in the
+%   argument of \cs{regex_replace_case_all:nN}.
+% \end{function}
+%
 % \section{Scratch regular expressions}
 %
 % \begin{variable}[added = 2017-12-11]{\l_tmpa_regex, \l_tmpb_regex}
@@ -786,7 +886,7 @@
 %     \texttt{curr_state} and \texttt{curr_submatches}.
 %   \item If possible, when a state is reused by the same thread, kill
 %     other subthreads.
-%   \item Use an array rather than \cs[no-index]{l__regex_balance_tl}
+%   \item Use an array rather than \cs[no-index]{g__regex_balance_tl}
 %     to build the function \cs[no-index]{__regex_replacement_balance_one_match:n}.
 %   \item Reduce the number of epsilon-transitions in alternatives.
 %   \item Optimize simple strings: use less states (|abcade| should give
@@ -1100,6 +1200,26 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_tl_odd_items:n, \@@_tl_even_items:n, \@@_tl_even_items_loop:nn}
+%   Map through a token list one pair at a time, leaving the
+%   odd-numbered or even-numbered items (the first item is
+%   numbered~$1$).
+%    \begin{macrocode}
+\cs_new:Npn \@@_tl_odd_items:n #1 { \@@_tl_even_items:n { ? #1 } }
+\cs_new:Npn \@@_tl_even_items:n #1
+  {
+    \@@_tl_even_items_loop:nn #1 \q_@@_nil \q_@@_nil
+    \prg_break_point:
+  }
+\cs_new:Npn \@@_tl_even_items_loop:nn #1#2
+  {
+    \@@_use_none_delimit_by_q_nil:w #2 \prg_break: \q_@@_nil
+    { \exp_not:n {#2} }
+    \@@_tl_even_items_loop:nn
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsubsection{Constants and variables}
 %
 % \begin{macro}{\@@_tmp:w}
@@ -1186,9 +1306,17 @@
 %    \end{macrocode}
 % \end{variable}
 %
+% \begin{variable}{\q_@@_nil}
+%   Internal quarks.
+%    \begin{macrocode}
+\quark_new:N \q_@@_nil
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{macro}[EXP]{
 %     \@@_use_none_delimit_by_q_recursion_stop:w,
-%     \@@_use_i_delimit_by_q_recursion_stop:nw
+%     \@@_use_i_delimit_by_q_recursion_stop:nw,
+%     \@@_use_none_delimit_by_q_nil:w,
 %   }
 %   Functions to gobble up to a quark.
 %    \begin{macrocode}
@@ -1196,16 +1324,10 @@
   #1 \q_@@_recursion_stop { }
 \cs_new:Npn \@@_use_i_delimit_by_q_recursion_stop:nw
   #1 #2 \q_@@_recursion_stop {#1}
+\cs_new:Npn \@@_use_none_delimit_by_q_nil:w #1 \q_@@_nil { }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{variable}{\q_@@_nil}
-%   Internal quarks.
-%    \begin{macrocode}
-\quark_new:N \q_@@_nil
-%    \end{macrocode}
-% \end{variable}
-%
 % \begin{macro}[pTF]{\@@_quark_if_nil:n}
 %   Branching quark conditional.
 %    \begin{macrocode}
@@ -2343,6 +2465,29 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_compile_use:n}
+%   Use a regex, regardless of whether it is given as a string (in which
+%   case we need to compile) or as a regex variable.  This is used for
+%   \cs{regex_match_case:nn} and related functions to allow a mixture of
+%   explicit regex and regex variables.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_compile_use:n #1
+  {
+    \tl_if_single_token:nT {#1}
+      {
+        \exp_after:wN \@@_compile_use_aux:w
+        \token_to_meaning:N #1 ~ \q_@@_nil
+      }
+    \@@_compile:n {#1} \l_@@_internal_regex
+  }
+\cs_new_protected:Npn \@@_compile_use_aux:w #1 ~ #2 \q_@@_nil
+  {
+    \str_if_eq:nnT { #1 ~ } { macro:->\@@_branch:n }
+      { \use_ii:nnn }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\@@_compile_escaped:N, \@@_compile_special:N}
 %   If the special character or escaped alphanumeric has a particular
 %   meaning in regexes, the corresponding function is used. Otherwise,
@@ -4154,6 +4299,80 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{variable}{\g_@@_case_int}
+%   Case number that was successfully matched in
+%   \cs{regex_match_case:nn} and related functions.
+%    \begin{macrocode}
+\int_new:N \g_@@_case_int
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_case_max_group_int}
+%   The largest group number appearing in any of the \meta{regex} in the
+%   argument of \cs{regex_match_case:nn} and related functions.
+%    \begin{macrocode}
+\int_new:N \l_@@_case_max_group_int
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_case_build:n, \@@_case_build:x, \@@_case_build_aux:Nn, \@@_case_build_loop:n}
+%   See \cs{@@_build:n}, but with a loop.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_case_build:n #1
+  {
+    \@@_case_build_aux:Nn \c_true_bool {#1}
+    \int_gzero:N \g_@@_case_int
+  }
+\cs_generate_variant:Nn \@@_case_build:n { x }
+\cs_new_protected:Npn \@@_case_build_aux:Nn #1#2
+  {
+    \@@_standard_escapechar:
+    \int_set_eq:NN \l_@@_max_state_int \l_@@_min_state_int
+    \@@_build_new_state:
+    \@@_build_new_state:
+    \@@_toks_put_right:Nn \l_@@_left_state_int
+      { \@@_action_start_wildcard:N #1 }
+    %
+    \@@_build_new_state:
+    \@@_toks_put_left:Nx \l_@@_left_state_int
+      { \@@_action_submatch:nN { 0 } < }
+    \@@_push_lr_states:
+    \int_zero:N \l_@@_case_max_group_int
+    \int_gzero:N \g_@@_case_int
+    \tl_map_inline:nn {#2}
+      {
+        \int_gincr:N \g_@@_case_int
+        \@@_case_build_loop:n {##1}
+      }
+    \int_set_eq:NN \l_@@_capturing_group_int \l_@@_case_max_group_int
+    \@@_pop_lr_states:
+  }
+\cs_new_protected:Npn \@@_case_build_loop:n #1
+  {
+    \int_set:Nn \l_@@_capturing_group_int { 1 }
+    \@@_compile_use:n {#1}
+    \int_set:Nn \l_@@_case_max_group_int
+      {
+        \int_max:nn { \l_@@_case_max_group_int }
+          { \l_@@_capturing_group_int }
+      }
+    \seq_pop:NN \l_@@_right_state_seq \l_@@_internal_a_tl
+    \int_set:Nn \l_@@_right_state_int \l_@@_internal_a_tl
+    \@@_toks_put_left:Nx \l_@@_right_state_int
+      {
+        \@@_action_submatch:nN { 0 } >
+        \int_gset:Nn \g_@@_case_int
+          { \int_use:N \g_@@_case_int }
+        \@@_action_success:
+      }
+    \@@_toks_clear:N \l_@@_max_state_int
+    \seq_push:No \l_@@_right_state_seq
+      { \int_use:N \l_@@_max_state_int }
+    \int_incr:N \l_@@_max_state_int
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\@@_build_for_cs:n}
 %   The matching code relies on some global intarray variables, but only
 %   uses a range of their entries.  Specifically,
@@ -4495,7 +4714,7 @@
 %   the group, and leaves \texttt{internal_a} pointing to the left end
 %   of the last repetition. We only record the submatch information at
 %   the last repetition. Finally, add a state at the end (the transition
-%   to it has been taken care of by the replicating auxiliary.
+%   to it has been taken care of by the replicating auxiliary).
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_group_repeat:nn #1#2
   {
@@ -5425,12 +5644,12 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_balance_tl}
+% \begin{variable}{\g_@@_balance_tl}
 %   This token list holds the replacement text for
 %   \cs{@@_replacement_balance_one_match:n} while it is being built
 %   incrementally.
 %    \begin{macrocode}
-\tl_new:N \l_@@_balance_tl
+\tl_new:N \g_@@_balance_tl
 %    \end{macrocode}
 % \end{variable}
 %
@@ -5573,11 +5792,11 @@
 %
 % \subsubsection{Framework}
 %
-% \begin{macro}{\@@_replacement:n}
-% \begin{macro}{\@@_replacement_aux:n}
+% \begin{macro}{\@@_replacement:n, \@@_replacement:x}
+% \begin{macro}{\@@_replacement_apply:Nn, \@@_replacement_set:n}
 %   The replacement text is built incrementally. We keep track in
 %   \cs{l_@@_balance_int} of the balance of explicit begin- and
-%   end-group tokens and we store in \cs{l_@@_balance_tl} some
+%   end-group tokens and we store in \cs{g_@@_balance_tl} some
 %   code to compute the brace balance from submatches (see its
 %   description). Detect unescaped right braces, and escaped characters,
 %   with trailing \cs{prg_do_nothing:} because some of the later
@@ -5585,12 +5804,14 @@
 %   parsed, make sure that there is no open csname. Finally, define the
 %   \texttt{balance_one_match} and \texttt{do_one_match} functions.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_replacement:n #1
+\cs_new_protected:Npn \@@_replacement:n
+  { \@@_replacement_apply:Nn \@@_replacement_set:n }
+\cs_new_protected:Npn \@@_replacement_apply:Nn #1#2
   {
     \group_begin:
       \tl_build_begin:N \l_@@_build_tl
       \int_zero:N \l_@@_balance_int
-      \tl_clear:N \l_@@_balance_tl
+      \tl_gclear:N \g_@@_balance_tl
       \@@_escape_use:nnnn
         {
           \if_charcode:w \c_right_brace_str ##1
@@ -5606,7 +5827,7 @@
         }
         { \@@_replacement_escaped:N ##1 }
         { \@@_replacement_normal:n ##1 }
-        {#1}
+        {#2}
       \prg_do_nothing: \prg_do_nothing:
       \if_int_compare:w \l_@@_replacement_csnames_int > \c_zero_int
         \msg_error:nnx { regex } { replacement-missing-rbrace }
@@ -5620,18 +5841,15 @@
             { \seq_count:N \l_@@_replacement_category_seq }
           \seq_clear:N \l_@@_replacement_category_seq
         }
-      \cs_gset:Npx \@@_replacement_balance_one_match:n ##1
-        {
-          + \int_use:N \l_@@_balance_int
-          \l_@@_balance_tl
-          - \@@_submatch_balance:n {##1}
-        }
+      \tl_gput_right:Nx \g_@@_balance_tl
+        { + \int_use:N \l_@@_balance_int }
       \tl_build_end:N \l_@@_build_tl
       \exp_args:NNo
     \group_end:
-    \@@_replacement_aux:n \l_@@_build_tl
+    #1 \l_@@_build_tl
   }
-\cs_new_protected:Npn \@@_replacement_aux:n #1
+\cs_generate_variant:Nn \@@_replacement:n { x }
+\cs_new_protected:Npn \@@_replacement_set:n #1
   {
     \cs_set:Npn \@@_replacement_do_one_match:n ##1
       {
@@ -5646,11 +5864,47 @@
           }
         #1
       }
+    \exp_args:Nno \use:n
+      { \cs_gset:Npn \@@_replacement_balance_one_match:n ##1 }
+      {
+        \g_@@_balance_tl
+        - \@@_submatch_balance:n {##1}
+      }
   }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\@@_case_replacement:n, \@@_case_replacement:x}
+%    \begin{macrocode}
+\tl_new:N \g_@@_case_replacement_tl
+\tl_new:N \g_@@_case_balance_tl
+\cs_new_protected:Npn \@@_case_replacement:n #1
+  {
+    \tl_gset:Nn \g_@@_case_balance_tl
+      {
+        \if_case:w
+          \__kernel_intarray_item:Nn
+            \g_@@_submatch_case_intarray {##1}
+      }
+    \tl_gset_eq:NN \g_@@_case_replacement_tl \g_@@_case_balance_tl
+    \tl_map_tokens:nn {#1}
+      { \@@_replacement_apply:Nn \@@_case_replacement_aux:n }
+    \tl_gset:No \g_@@_balance_tl
+      { \g_@@_case_balance_tl \fi: }
+    \exp_args:No \@@_replacement_set:n
+      { \g_@@_case_replacement_tl \fi: }
+  }
+\cs_generate_variant:Nn \@@_case_replacement:n { x }
+\cs_new_protected:Npn \@@_case_replacement_aux:n #1
+  {
+    \tl_gput_right:Nn \g_@@_case_replacement_tl { \or: #1 }
+    \tl_gput_right:No \g_@@_case_balance_tl
+      { \exp_after:wN \or: \g_@@_balance_tl }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\@@_replacement_put:n}
 %   This gets redefined for \cs{peek_regex_replace_once:nnTF}.
 %    \begin{macrocode}
@@ -5751,7 +6005,7 @@
 %   construction, it must be taken into account in the brace balance.
 %   Later on, |##1| will be replaced by a pointer to the $0$-th submatch for a
 %   given match.  There is an \cs{exp_not:N} here as at the point-of-use
-%   of \cs{l_@@_balance_tl} there is an \texttt{x}-type expansion which is needed
+%   of \cs{g_@@_balance_tl} there is an \texttt{x}-type expansion which is needed
 %   to get |##1| in correctly.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_replacement_put_submatch:n #1
@@ -5768,11 +6022,8 @@
     \tl_build_put_right:Nn \l_@@_build_tl
       { \@@_query_submatch:n { \int_eval:n { #1 + ##1 } } }
     \if_int_compare:w \l_@@_replacement_csnames_int = \c_zero_int
-      \tl_put_right:Nn \l_@@_balance_tl
-        {
-          + \@@_submatch_balance:n
-            { \exp_not:N \int_eval:n { #1 + ##1 } }
-        }
+      \tl_gput_right:Nn \g_@@_balance_tl
+        { + \@@_submatch_balance:n { \int_eval:n { #1 + ##1 } } }
     \fi:
   }
 %    \end{macrocode}
@@ -6269,6 +6520,29 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[noTF]{\regex_match_case:nn}
+%   The auxiliary errors if |#1| has an odd number of items, and
+%   otherwise it sets \cs{g_@@_case_int} according to which case was
+%   found (zero if not found).  The \texttt{true} branch leaves the
+%   corresponding code in the input stream.
+%    \begin{macrocode}
+\cs_new_protected:Npn \regex_match_case:nnTF #1#2#3
+  {
+    \@@_match_case:nnTF {#1} {#2}
+      {
+        \tl_item:nn {#1} { 2 * \g_@@_case_int }
+        #3
+      }
+  }
+\cs_new_protected:Npn \regex_match_case:nn #1#2
+  { \regex_match_case:nnTF {#1} {#2} { } { } }
+\cs_new_protected:Npn \regex_match_case:nnT #1#2#3
+  { \regex_match_case:nnTF {#1} {#2} {#3} { } }
+\cs_new_protected:Npn \regex_match_case:nnF #1#2
+  { \regex_match_case:nnTF {#1} {#2} { } }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}[noTF]
 %   {
 %     \regex_extract_once:nnN, \regex_extract_once:NnN,
@@ -6306,6 +6580,72 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[noTF]{\regex_replace_case_once:nN}
+%   If the input is bad (odd number of items) then take the false
+%   branch.  Otherwise, use the same auxiliary as
+%   \cs{regex_replace_once:nnN}, but with more complicated code to build
+%   the automaton, and to find what replacement text to use.  The
+%   \cs{tl_item:nn} is only expanded once we know the value of
+%   \cs{g_@@_case_int}, namely which case matched.
+%    \begin{macrocode}
+\cs_new_protected:Npn \regex_replace_case_once:nNTF #1#2
+  {
+    \int_if_odd:nTF { \tl_count:n {#1} }
+      {
+        \msg_error:nnxxxx { regex } { case-odd }
+          { \token_to_str:N \regex_replace_case_once:nN(TF) } { code }
+          { \tl_count:n {#1} } { \tl_to_str:n {#1} }
+        \use_ii:nn
+      }
+      {
+        \@@_replace_once_aux:nnN
+          { \@@_case_build:x { \@@_tl_odd_items:n {#1} } }
+          { \@@_replacement:x { \tl_item:nn {#1} { 2 * \g_@@_case_int } } }
+          #2
+        \bool_if:NTF \g_@@_success_bool
+      }
+  }
+\cs_new_protected:Npn \regex_replace_case_once:nN #1#2
+  { \regex_replace_case_once:nNTF {#1} {#2} { } { } }
+\cs_new_protected:Npn \regex_replace_case_once:nNT #1#2#3
+  { \regex_replace_case_once:nNTF {#1} {#2} {#3} { } }
+\cs_new_protected:Npn \regex_replace_case_once:nNF #1#2
+  { \regex_replace_case_once:nNTF {#1} {#2} { } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[noTF]{\regex_case_replace_all:nN}
+%   If the input is bad (odd number of items) then take the false
+%   branch.  Otherwise, use the same auxiliary as
+%   \cs{regex_replace_all:nnN}, but with more complicated code to build
+%   the automaton, and to find what replacement text to use.
+%    \begin{macrocode}
+\cs_new_protected:Npn \regex_replace_case_all:nNTF #1#2
+  {
+    \int_if_odd:nTF { \tl_count:n {#1} }
+      {
+        \msg_error:nnxxxx { regex } { case-odd }
+          { \token_to_str:N \regex_replace_case_all:nN(TF) } { code }
+          { \tl_count:n {#1} } { \tl_to_str:n {#1} }
+        \use_ii:nn
+      }
+      {
+        \@@_replace_all_aux:nnN
+          { \@@_case_build:x { \@@_tl_odd_items:n {#1} } }
+          { \@@_case_replacement:x { \@@_tl_even_items:n {#1} } }
+          #2
+        \bool_if:NTF \g_@@_success_bool
+      }
+  }
+\cs_new_protected:Npn \regex_replace_case_all:nN #1#2
+  { \regex_replace_case_all:nNTF {#1} {#2} { } { } }
+\cs_new_protected:Npn \regex_replace_case_all:nNT #1#2#3
+  { \regex_replace_case_all:nNTF {#1} {#2} {#3} { } }
+\cs_new_protected:Npn \regex_replace_case_all:nNF #1#2
+  { \regex_replace_case_all:nNTF {#1} {#2} { } }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsubsection{Variables and helpers for user functions}
 %
 % \begin{variable}{\l_@@_match_count_int}
@@ -6343,12 +6683,14 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\g_@@_submatch_prev_intarray, \g_@@_submatch_begin_intarray, \g_@@_submatch_end_intarray}
-%   Hold the place where the match attempt begun and the end-points of each submatch.
+% \begin{variable}{\g_@@_submatch_prev_intarray, \g_@@_submatch_begin_intarray, \g_@@_submatch_end_intarray, \g_@@_submatch_case_intarray}
+%   Hold the place where the match attempt begun, the end-points of each
+%   submatch, and which regex case the match corresponds to, respectively.
 %    \begin{macrocode}
 \intarray_new:Nn \g_@@_submatch_prev_intarray { 65536 }
 \intarray_new:Nn \g_@@_submatch_begin_intarray { 65536 }
 \intarray_new:Nn \g_@@_submatch_end_intarray { 65536 }
+\intarray_new:Nn \g_@@_submatch_case_intarray { 65536 }
 %    \end{macrocode}
 % \end{variable}
 %
@@ -6433,6 +6775,34 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_match_case:nnTF}
+% \begin{macro}[EXP]{\@@_match_case_aux:nn}
+%   The code would get badly messed up if the number of items in |#1|
+%   were not even, so we catch this case, then follow the same code as
+%   \cs{regex_match:nnTF} but using \cs{@@_case_build:n} and without
+%   returning a result.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_match_case:nnTF #1#2
+  {
+    \int_if_odd:nTF { \tl_count:n {#1} }
+      {
+        \msg_error:nnxxxx { regex } { case-odd }
+          { \token_to_str:N \regex_match_case:nn(TF) } { code }
+          { \tl_count:n {#1} } { \tl_to_str:n {#1} }
+        \use_ii:nn
+      }
+      {
+        \@@_if_match:nn
+          { \@@_case_build:x { \@@_tl_odd_items:n {#1} } }
+          {#2}
+        \bool_if:NTF \g_@@_success_bool
+      }
+  }
+\cs_new:Npn \@@_match_case_aux:nn #1#2 { \exp_not:n { {#1} } }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}{\@@_count:nnN}
 %   Again, we don't care about submatches. Instead of aborting after the
 %   first \enquote{longest match} is found, we search for multiple
@@ -6739,10 +7109,14 @@
         {
           \__kernel_intarray_gset:Nnn \g_@@_submatch_prev_intarray
             { \l_@@_submatch_int } { 0 }
+          \__kernel_intarray_gset:Nnn \g_@@_submatch_case_intarray
+            { \l_@@_submatch_int } { 0 }
           \int_incr:N \l_@@_submatch_int
         }
       \__kernel_intarray_gset:Nnn \g_@@_submatch_prev_intarray
         { \l_@@_zeroth_submatch_int } { \l_@@_start_pos_int }
+      \__kernel_intarray_gset:Nnn \g_@@_submatch_case_intarray
+        { \l_@@_zeroth_submatch_int } { \g_@@_case_int }
       \int_zero:N \l_@@_internal_a_int
       \exp_after:wN \@@_extract_aux:w \l_@@_success_submatches_tl
         \prg_break_point: \@@_use_none_delimit_by_q_recursion_stop:w ,
@@ -6767,7 +7141,7 @@
 %
 % \subsubsection{Replacement}
 %
-% \begin{macro}{\@@_replace_once:nnN}
+% \begin{macro}{\@@_replace_once:nnN, \@@_replace_once_aux:nnN}
 %   Build the \textsc{nfa} and the replacement functions, then find a
 %   single match.  If the match failed, simply exit the
 %   group. Otherwise, we do the replacement. Extract submatches. Compute
@@ -6781,18 +7155,19 @@
 %   \texttt{x}-expansion, and checks that braces are balanced in the
 %   final result.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_replace_once:nnN #1#2#3
+\cs_new_protected:Npn \@@_replace_once:nnN #1#2
+  { \@@_replace_once_aux:nnN {#1} { \@@_replacement:n {#2} } }
+\cs_new_protected:Npn \@@_replace_once_aux:nnN #1#2#3
   {
     \group_begin:
       \@@_single_match:
       #1
       \exp_args:No \@@_match:n {#3}
-      \if_meaning:w \c_false_bool \g_@@_success_bool
-        \group_end:
-      \else:
+    \bool_if:NTF \g_@@_success_bool
+      {
         \@@_extract:
         \exp_args:No \@@_query_set:n {#3}
-        \@@_replacement:n {#2}
+        #2
         \int_set:Nn \l_@@_balance_int
           {
             \@@_replacement_balance_one_match:n
@@ -6810,7 +7185,8 @@
               { \l_@@_max_pos_int }
           }
         \@@_group_end_replace:N #3
-      \fi:
+      }
+      { \group_end: }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -6827,7 +7203,9 @@
 %   match. Join together the replacement texts for each match (including
 %   the part of the query before the match), and the end of the query.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_replace_all:nnN #1#2#3
+\cs_new_protected:Npn \@@_replace_all:nnN #1#2
+  { \@@_replace_all_aux:nnN {#1} { \@@_replacement:n {#2} } }
+\cs_new_protected:Npn \@@_replace_all_aux:nnN #1#2#3
   {
     \group_begin:
       \@@_multi_match:n { \@@_extract: }
@@ -6834,7 +7212,7 @@
       #1
       \exp_args:No \@@_match:n {#3}
       \exp_args:No \@@_query_set:n {#3}
-      \@@_replacement:n {#2}
+      #2
       \int_set:Nn \l_@@_balance_int
         {
           0
@@ -7617,8 +7995,15 @@
   { The~values~given~in~a~quantifier~must~be~in~order. }
 %    \end{macrocode}
 %
-% Used when showing a regex.
+% Used in user commands, and when showing a regex.
 %    \begin{macrocode}
+\msg_new:nnnn { regex } { case-odd }
+  { #1~with~odd~number~of~items }
+  {
+    There~must~be~a~#2~part~for~each~regex:~
+    found~odd~number~of~items~(#3)~in\\
+    \iow_indent:n {#4}
+  }
 \msg_new:nnn { regex } { show }
   {
     >~Compiled~regex~

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3seq.dtx
 %
-% Copyright (C) 1990-2021 The LaTeX Project
+% Copyright (C) 1990-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -3,7 +3,7 @@
 %% File: l3skip.dtx
 %
 % Copyright (C) 2004-2011 Frank Mittelbach, The LaTeX Project
-%           (C) 2012-2021 The LaTeX Project
+%           (C) 2012-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File l3sort.dtx
 %
-% Copyright (C) 2012-2021 The LaTeX Project
+% Copyright (C) 2012-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3str-convert.dtx
 %
-% Copyright (C) 2013-2021 The LaTeX Project
+% Copyright (C) 2013-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3str.dtx
 %
-% Copyright (C) 2011-2021 The LaTeX Project
+% Copyright (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3sys.dtx
 %
-% Copyright (C) 2015-2021 The LaTeX Project
+% Copyright (C) 2015-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -220,8 +220,8 @@
 %   \cs{q_no_value} in the non-branching version.
 %   Note that quote characters (|"|) \emph{cannot} be used inside the
 %   \meta{shell command}.  The \cs{sys_get_shell:nnNTF} conditional
-%   returns \texttt{true} if the shell is available and no quote is
-%   detected, and \texttt{false} otherwise.
+%   inserts the \texttt{true code} if the shell is available and no quote is
+%   detected, and the \texttt{false code} otherwise.
 % \end{function}
 %
 % \begin{variable}[added = 2017-05-27]{\c_sys_shell_escape_int}
@@ -295,13 +295,11 @@
 %   issued.
 % \end{variable}
 %
-% \begin{function}[added = 2019-09-12]{\sys_load_debug:, \sys_load_deprecation:}
+% \begin{function}[added = 2019-09-12]{\sys_load_debug:}
 %   \begin{syntax}
 %     \cs{sys_load_debug:}
-%     \cs{sys_load_deprecation:}
 %   \end{syntax}
-%   Load the additional configuration files for debugging support and rolling
-%   back deprecations, respectively.
+%   Load the additional configuration file for debugging support.
 % \end{function}
 %
 % \subsection{Final settings}
@@ -563,14 +561,13 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{variable}{\g_@@_debug_bool, \g_@@_deprecation_bool}
+% \begin{variable}{\g_@@_debug_bool}
 %    \begin{macrocode}
 \bool_new:N \g_@@_debug_bool
-\bool_new:N \g_@@_deprecation_bool
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{macro}{\sys_load_debug:, \sys_load_deprecation:}
+% \begin{macro}{\sys_load_debug:}
 %   Simple.
 %    \begin{macrocode}
 \cs_new_protected:Npn \sys_load_debug:
@@ -579,12 +576,6 @@
       { \__kernel_sys_configuration_load:n { l3debug } }
     \bool_gset_true:N \g_@@_debug_bool
   }
-\cs_new_protected:Npn \sys_load_deprecation:
-  {
-    \bool_if:NF \g_@@_deprecation_bool
-      { \__kernel_sys_configuration_load:n { l3deprecation } }
-    \bool_gset_true:N \g_@@_deprecation_bool
-  }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3text-case.dtx
 %
-% Copyright (C) 2020,2021 The LaTeX Project
+% Copyright (C) 2020-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3text-purify.dtx
 %
-% Copyright (C) 2020,2021 The LaTeX Project
+% Copyright (C) 2020-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3text.dtx
 %
-% Copyright (C) 2020,2021 The LaTeX Project
+% Copyright (C) 2020-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3tl-analysis.dtx
 %
-% Copyright (C) 2011-2021 The LaTeX Project
+% Copyright (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3tl.dtx
 %
-% Copyright (C) 1990-2021 The LaTeX Project
+% Copyright (C) 1990-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -301,6 +301,7 @@
 %   The \meta{token list_2} cannot contain the tokens |{|, |}| or |#|
 %   (more precisely, explicit character tokens with category code $1$
 %   (begin-group) or $2$ (end-group), and tokens with category code $6$).
+%   The search does \emph{not} enter brace (category code $1$/$2$) groups.
 % \end{function}
 %
 % \begin{function}[added = 2017-11-14, EXP,pTF]{\tl_if_novalue:n}
@@ -1072,6 +1073,10 @@
 %
 % \subsection{Replacing tokens}
 %
+% Within token lists, replacement takes place at the top level: there is
+% no recursion into brace groups (more precisely, within a group defined by
+% a categroy code $1$/$2$ pair).
+%
 % \begin{function}[updated = 2011-08-11]
 %   {
 %     \tl_replace_once:Nnn,  \tl_replace_once:cnn,

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3token.dtx
 %
-% Copyright (C) 2005-2021 The LaTeX Project
+% Copyright (C) 2005-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -841,19 +841,6 @@
 %   result of the test).
 % \end{function}
 %
-% \begin{function}[updated = 2012-12-20, TF]{\peek_catcode_ignore_spaces:N}
-%   \begin{syntax}
-%     \cs{peek_catcode_ignore_spaces:NTF} \meta{test token} \Arg{true code} \Arg{false code}
-%   \end{syntax}
-%   Tests if the next non-space \meta{token} in the input stream has the
-%   same category code as the \meta{test token} (as defined by the test
-%   \cs{token_if_eq_catcode:NNTF}).  Explicit and implicit space tokens
-%   (with character code 32 and category code 10) are ignored and
-%   removed by the test and the \meta{token} is left in the input
-%   stream after the \meta{true code} or \meta{false code} (as
-%   appropriate to the result of the test).
-% \end{function}
-%
 % \begin{function}[updated = 2012-12-20, TF]{\peek_catcode_remove:N}
 %   \begin{syntax}
 %     \cs{peek_catcode_remove:NTF} \meta{test token} \Arg{true code} \Arg{false code}
@@ -867,21 +854,6 @@
 %   appropriate to the result of the test).
 % \end{function}
 %
-% \begin{function}[updated = 2012-12-20, TF]
-%   {\peek_catcode_remove_ignore_spaces:N}
-%   \begin{syntax}
-%     \cs{peek_catcode_remove_ignore_spaces:NTF} \meta{test token} \Arg{true code} \Arg{false code}
-%   \end{syntax}
-%   Tests if the next non-space \meta{token} in the input stream has the
-%   same category code as the \meta{test token} (as defined by the test
-%   \cs{token_if_eq_catcode:NNTF}).  Explicit and implicit space tokens
-%   (with character code 32 and category code 10) are ignored and
-%   removed by the test and the \meta{token} is removed from the
-%   input stream if the test is true. The function then places
-%   either the \meta{true code} or \meta{false code} in the input stream
-%   (as appropriate to the result of the test).
-% \end{function}
-%
 % \begin{function}[updated = 2012-12-20, TF]{\peek_charcode:N}
 %   \begin{syntax}
 %     \cs{peek_charcode:NTF} \meta{test token} \Arg{true code} \Arg{false code}
@@ -894,19 +866,6 @@
 %   result of the test).
 % \end{function}
 %
-% \begin{function}[updated = 2012-12-20, TF]{\peek_charcode_ignore_spaces:N}
-%   \begin{syntax}
-%     \cs{peek_charcode_ignore_spaces:NTF} \meta{test token} \Arg{true code} \Arg{false code}
-%   \end{syntax}
-%   Tests if the next non-space \meta{token} in the input stream has the
-%   same character code as the \meta{test token} (as defined by the test
-%   \cs{token_if_eq_charcode:NNTF}).  Explicit and implicit space tokens
-%   (with character code 32 and category code 10) are ignored and removed by
-%   the test and the \meta{token} is left in the input stream after
-%   the \meta{true code} or \meta{false code} (as appropriate to the
-%   result of the test).
-% \end{function}
-%
 % \begin{function}[updated = 2012-12-20, TF]{\peek_charcode_remove:N}
 %   \begin{syntax}
 %     \cs{peek_charcode_remove:NTF} \meta{test token} \Arg{true code} \Arg{false code}
@@ -920,22 +879,6 @@
 %   appropriate to the result of the test).
 % \end{function}
 %
-% \begin{function}[updated = 2012-12-20, TF]
-%   {\peek_charcode_remove_ignore_spaces:N}
-%   \begin{syntax}
-%     \cs{peek_charcode_remove_ignore_spaces:NTF} \meta{test token}
-%     ~~\Arg{true code} \Arg{false code}
-%   \end{syntax}
-%   Tests if the next non-space \meta{token} in the input stream has the
-%   same character code as the \meta{test token} (as defined by the test
-%   \cs{token_if_eq_charcode:NNTF}).  Explicit and implicit space tokens
-%   (with character code 32 and category code 10) are ignored and
-%   removed by the test and the \meta{token} is removed from the
-%   input stream if the test is true. The function then places
-%   either the \meta{true code} or \meta{false code} in the input stream
-%   (as appropriate to the result of the test).
-% \end{function}
-%
 % \begin{function}[updated = 2011-07-02, TF]{\peek_meaning:N}
 %   \begin{syntax}
 %     \cs{peek_meaning:NTF} \meta{test token} \Arg{true code} \Arg{false code}
@@ -948,19 +891,6 @@
 %   result of the test).
 % \end{function}
 %
-% \begin{function}[updated = 2012-12-05, TF]{\peek_meaning_ignore_spaces:N}
-%   \begin{syntax}
-%     \cs{peek_meaning_ignore_spaces:NTF} \meta{test token} \Arg{true code} \Arg{false code}
-%   \end{syntax}
-%   Tests if the next non-space \meta{token} in the input stream has the
-%   same meaning as the \meta{test token} (as defined by the test
-%   \cs{token_if_eq_meaning:NNTF}).  Explicit and implicit space tokens
-%   (with character code 32 and category code 10) are ignored and
-%   removed by the test and the \meta{token} is left in the input
-%   stream after the \meta{true code} or \meta{false code} (as
-%   appropriate to the result of the test).
-% \end{function}
-%
 % \begin{function}[updated = 2011-07-02, TF]{\peek_meaning_remove:N}
 %   \begin{syntax}
 %     \cs{peek_meaning_remove:NTF} \meta{test token} \Arg{true code} \Arg{false code}
@@ -974,6 +904,40 @@
 %   appropriate to the result of the test).
 % \end{function}
 %
+% \begin{function}[added = 2018-10-01]{\peek_remove_spaces:n}
+%   \begin{syntax}
+%     \cs{peek_remove_spaces:n} \Arg{code}
+%   \end{syntax}
+%   Peeks ahead and detect if the following token is a space (category code
+%   $10$ and character code $32$). If so, removes the token and checks the
+%   next token. Once a non-space token is found, the \meta{code} will be
+%   inserted into the input stream. Typically this will contain a \texttt{peek}
+%   operation, but this is not required.
+% \end{function}
+%
+% \begin{function}[added = 2022-01-10]{\peek_remove_filler:n}
+%   \begin{syntax}
+%     \cs{peek_remove_filler:n} \Arg{code}
+%   \end{syntax}
+%   Peeks ahead and detect if the following token is a space (category code
+%   $10$) or has meaning equal to \cs{scan_stop:}. If so,
+%   removes the token and checks the next token. If neither of these cases
+%   apply, expands the next token using \texttt{f}-type expansion, then checks
+%   the resulting leading token in the same way. If after expansion the next
+%   token is neither of the two test cases, the \meta{code} will be inserted
+%   into the input stream. Typically this will contain a \texttt{peek}
+%   operation, but this is not required.
+%   \begin{texnote}
+%     This is essentially a macro-based implementation of how \TeX{} handles
+%     the search for a left brace after for example \tn{everypar}, except that
+%     any non-expandable token cleanly ends the \meta{filler} (i.e.~it does not
+%     lead to a \TeX{} error).
+%
+%     In contrast to \TeX{}'s filler removal, a construct
+%     \verb|\exp_not:N \foo| will be treated in the same way as \verb|\foo|.
+%   \end{texnote}
+% \end{function}
+%
 % \begin{function}[updated = 2012-12-05, TF]
 %   {\peek_meaning_remove_ignore_spaces:N}
 %   \begin{syntax}
@@ -2914,6 +2878,68 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\peek_remove_filler:n}
+% \begin{macro}{\@@_remove_filler:w}
+% \begin{macro}{\@@_remove_filler:}
+% \begin{macro}{\@@_remove_filler_expand:w}
+%   Here we expand the input, removing spaces and \cs{scan_stop:} tokens until
+%   we reach a non-expandable token. At that stage we re-insert the payload.
+%   To deal with the problem of |&| tokens, we have to put the align-safe
+%   group in the correct place.
+%    \begin{macrocode}
+\cs_new_protected:Npn \peek_remove_filler:n #1
+  {
+    \cs_set:Npn \@@_true_aux:w { \@@_remove_filler:w }
+    \cs_set:Npx \@@_false:w
+      {
+        \exp_not:N \group_align_safe_end:
+        \exp_not:n {#1}
+      }
+    \group_align_safe_begin:
+    \@@_remove_filler:w
+  }
+\cs_new_protected:Npn \@@_remove_filler:w
+  {
+    \exp_after:wN \peek_after:Nw \exp_after:wN \@@_remove_filler:
+    \exp:w \exp_end_continue_f:w
+  }
+%    \end{macrocode}
+%   Here we can nest conditionals as \cs{l_peek_token} is only skipped over in
+%   the nested one if it's a space: no problems with conditionals or outer
+%   tokens.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_remove_filler:
+  {
+    \if_catcode:w \exp_not:N \l_peek_token \c_space_token
+      \exp_after:wN \@@_true_remove:w
+    \else:
+      \if_meaning:w \l_peek_token \scan_stop:
+        \exp_after:wN \exp_after:wN \exp_after:wN
+          \@@_true_remove:w
+      \else:
+        \exp_after:wN \exp_after:wN \exp_after:wN
+          \@@_remove_filler_expand:w
+      \fi:
+    \fi:
+  }
+%    \end{macrocode}
+%   To deal with undefined control sequences in the same way \TeX{} does,
+%   we need to check for expansion manually.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_remove_filler_expand:w
+  {
+    \exp_after:wN \if_meaning:w \exp_not:N \l_peek_token \l_peek_token
+      \exp_after:wN \@@_false:w
+    \else:
+      \exp_after:wN \@@_remove_filler:w
+    \fi:
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}{\@@_token_generic_aux:NNNTF}
 %   The generic functions store the test token in both implicit and
 %   explicit modes, and the \texttt{true} and \texttt{false} code as
@@ -3080,41 +3106,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[TF]
-%   {
-%     \peek_catcode_ignore_spaces:N, \peek_catcode_remove_ignore_spaces:N,
-%     \peek_charcode_ignore_spaces:N, \peek_charcode_remove_ignore_spaces:N,
-%     \peek_meaning_ignore_spaces:N, \peek_meaning_remove_ignore_spaces:N
-%   }
-%   To ignore spaces, remove them using \cs{peek_remove_spaces:n}
-%   before running the tests.
-%    \begin{macrocode}
-\tl_map_inline:nn
-  {
-    { catcode } { catcode_remove }
-    { charcode } { charcode_remove }
-    { meaning } { meaning_remove }
-  }
-  {
-    \cs_new_protected:cpx { peek_#1_ignore_spaces:NTF } ##1##2##3
-      {
-        \peek_remove_spaces:n
-          { \exp_not:c { peek_#1:NTF } ##1 {##2} {##3} }
-      }
-    \cs_new_protected:cpx { peek_#1_ignore_spaces:NT } ##1##2
-      {
-        \peek_remove_spaces:n
-          { \exp_not:c { peek_#1:NT } ##1 {##2} }
-      }
-    \cs_new_protected:cpx { peek_#1_ignore_spaces:NF } ##1##2
-      {
-        \peek_remove_spaces:n
-          { \exp_not:c { peek_#1:NF } ##1 {##2} }
-      }
-  }
-%    \end{macrocode}
-% \end{macro}
-%
 % \begin{macro}[TF]{\peek_N_type:}
 % \begin{macro}
 %   {\@@_execute_branches_N_type:, \@@_N_type:w, \@@_N_type_aux:nnw}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3unicode.dtx
 %
-% Copyright (C) 2018-2021 The LaTeX Project
+% Copyright (C) 2018-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-22}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: l3keys2e.dtx
 %
-% Copyright (C) 2009,2011-2021 The LaTeX Project
+% Copyright (C) 2009,2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -62,7 +62,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-12}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -139,7 +139,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3keys2e}{2021-11-12}{}
+\ProvidesExplPackage{l3keys2e}{2022-01-12}{}
   {LaTeX2e option processing using LaTeX3 keys}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.ins	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.ins	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 
 File: l3keys2e.ins
 
-Copyright (C) 2009,2011,2012,2016,2017,2019-2021 The LaTeX Project
+Copyright (C) 2009,2011,2012,2016,2017,2019-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -23,7 +23,7 @@
 
 \preamble
 
-Copyright (C) 2009-2021 The LaTeX Project
+Copyright (C) 2009-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of
 the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 %
 %% File: xfp.dtx
 %
-% Copyright (C) 2017-2021 The LaTeX Project
+% Copyright (C) 2017-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -63,12 +63,17 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-12}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
 % \begin{documentation}
 %
+%    The two functions provided by this package are part of the \LaTeX{}
+%    format starting with 2022-06-01 release. This package is
+%    therefore no longer needed and only provided to be able to
+%    process older documents loading.
+%
 % This package provides a \LaTeXe{} document-level interface to the \LaTeX{}3
 % floating point unit (part of \pkg{expl3}). It also provides a parallel
 % integer expression interface for convenience.
@@ -166,14 +171,17 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfp}{2021-11-12}{}
+\ProvidesExplPackage{xfp}{2022-01-12}{}
   {L3 Floating point unit}
 %    \end{macrocode}
 %
 % \begin{macro}{\fpeval}
-%   A document level wrapper around the code level function.
+%    A document level wrapper around the code level function. This
+%    definition will be moved to the \LaTeXe{} format so we just
+%    ``provide'' it in case this package gets loaded in documents
+%    processed with a new format.
 %    \begin{macrocode}
-\NewExpandableDocumentCommand \fpeval { m } { \fp_eval:n {#1} }
+\ProvideExpandableDocumentCommand \fpeval { m } { \fp_eval:n {#1} }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -180,7 +188,7 @@
 % \begin{macro}{\inteval}
 %   A second one, this time around an \eTeX{} primitive.
 %    \begin{macrocode}
-\NewExpandableDocumentCommand \inteval { m } { \int_eval:n {#1} }
+\ProvideExpandableDocumentCommand \inteval { m } { \int_eval:n {#1} }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.ins	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.ins	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 
 File: xfp.ins
 
-Copyright (C) 2017,2019-2021 The LaTeX Project
+Copyright (C) 2017,2019-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -23,7 +23,7 @@
 
 \preamble
 
-Copyright (C) 2017-2021 The LaTeX Project
+Copyright (C) 2017-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of
 the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -3,7 +3,7 @@
 %% File: xfrac.dtx
 % 
 % Copyright (C) 2004,2008-2010 Morten Hoegholm
-%           (C) 2011,2012,2014-2021 The LaTeX Project
+%           (C) 2011,2012,2014-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -65,7 +65,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-12}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -535,7 +535,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfrac}{2021-11-12}{}
+\ProvidesExplPackage{xfrac}{2022-01-12}{}
   {L3 Experimental split-level fractions}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.ins	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.ins	2022-01-12 21:22:19 UTC (rev 61588)
@@ -3,7 +3,7 @@
 File: xfrac.ins
 
 Copyright (C) 2004,2008-2010 Morten Hoegholm
-          (C) 2011,2012,2016,2017,2019-2021 The LaTeX Project
+          (C) 2011,2012,2016,2017,2019-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -25,7 +25,7 @@
 \preamble
 
 Copyright (C) 2004,2008-2010 Morten Hoegholm
-          (C) 2011-2021 The LaTeX Project
+          (C) 2011-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of
 the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -4,7 +4,7 @@
 %
 % Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle
 %           (C) 2004-2008 Frank Mittelbach, The LaTeX Project
-%           (C) 2009-2021 The LaTeX Project
+%           (C) 2009-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -67,7 +67,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-12}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -1064,7 +1064,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xparse}{2021-11-12}{}
+\ProvidesExplPackage{xparse}{2022-01-12}{}
   {L3 Experimental document command parser}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.ins	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.ins	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 
 File: xparse.ins
 
-Copyright (C) 2000-2012,2016,2017,2019-2021 The LaTeX Project
+Copyright (C) 2000-2012,2016,2017,2019-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -23,7 +23,7 @@
 
 \preamble
 
-Copyright (C) 2009-2021 The LaTeX Project
+Copyright (C) 2009-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of
 the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -4,7 +4,7 @@
 %
 % Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle
 %           (C) 2004-2010 Frank Mittelbach, The LaTeX Project
-%           (C) 2011-2021 The LaTeX Project
+%           (C) 2011-2022 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-11-12}
+% \date{Released 2022-01-12}
 %
 % \maketitle
 %
@@ -682,7 +682,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xtemplate}{2021-11-12}{}
+\ProvidesExplPackage{xtemplate}{2022-01-12}{}
   {L3 Experimental prototype document functions}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.ins	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.ins	2022-01-12 21:22:19 UTC (rev 61588)
@@ -2,7 +2,7 @@
 
 File: xtemplate.ins
 
-Copyright (C) 2000-2012,2016,2017,2019-2021 The LaTeX Project
+Copyright (C) 2000-2012,2016,2017,2019-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@
 
 \preamble
 
-Copyright (C) 2011-2021 The LaTeX Project
+Copyright (C) 2011-2022 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of
 the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -12,7 +12,7 @@
 %% l3backend-pdf.dtx  (with options: `package,dvipdfmx')
 %% l3backend-opacity.dtx  (with options: `package,dvipdfmx')
 %% 
-%% Copyright (C) 2019-2021 The LaTeX Project
+%% Copyright (C) 2019-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-dvipdfmx.def}{2021-12-14}{}
+  {l3backend-dvipdfmx.def}{2022-01-12}{}
   {L3 backend support: dvipdfmx}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -179,7 +179,6 @@
     \tl_set:Nn \l__color_backend_fill_tl {#1}
     \tl_set:Nn \l__color_backend_stroke_tl {#2}
     \__kernel_color_backend_stack_push:nn \l__color_backend_stack_int { #1 ~ #2 }
-    \group_insert_after:N \__color_backend_reset:
   }
 \cs_new_protected:Npn \__color_backend_reset:
   { \__kernel_color_backend_stack_pop:n \l__color_backend_stack_int }
@@ -186,10 +185,7 @@
 \int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
   {
     \cs_gset_protected:Npn \__color_backend_select_cmyk:n #1
-      {
-        \__kernel_backend_literal:n { pdf: bc ~ [#1] }
-        \group_insert_after:N \__color_backend_reset:
-      }
+      { \__kernel_backend_literal:n { pdf: bc ~ [#1] } }
     \cs_gset_eq:NN \__color_backend_select_gray:n \__color_backend_select_cmyk:n
     \cs_gset_eq:NN \__color_backend_select_rgb:n \__color_backend_select_cmyk:n
     \cs_gset_protected:Npn \__color_backend_reset:

Modified: trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -12,7 +12,7 @@
 %% l3backend-pdf.dtx  (with options: `package,dvips')
 %% l3backend-opacity.dtx  (with options: `package,dvips')
 %% 
-%% Copyright (C) 2019-2021 The LaTeX Project
+%% Copyright (C) 2019-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-dvips.def}{2021-12-14}{}
+  {l3backend-dvips.def}{2022-01-12}{}
   {L3 backend support: dvips}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -114,7 +114,6 @@
   {
     \__kernel_backend_literal:n { color~push~ #1 }
     \__kernel_backend_postscript:n { /color.sc ~ { } ~ def }
-    \group_insert_after:N \__color_backend_reset:
   }
 \cs_new_protected:Npn \__color_backend_reset:
   { \__kernel_backend_literal:n { color~pop } }

Modified: trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -12,7 +12,7 @@
 %% l3backend-pdf.dtx  (with options: `package,dvisvgm')
 %% l3backend-opacity.dtx  (with options: `package,dvisvgm')
 %% 
-%% Copyright (C) 2019-2021 The LaTeX Project
+%% Copyright (C) 2019-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-dvisvgm.def}{2021-12-14}{}
+  {l3backend-dvisvgm.def}{2022-01-12}{}
   {L3 backend support: dvisvgm}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -127,7 +127,6 @@
 \cs_new_protected:Npn \__color_backend_select:n #1
   {
     \__kernel_backend_literal:n { color~push~ #1 }
-    \group_insert_after:N \__color_backend_reset:
   }
 \cs_new_protected:Npn \__color_backend_reset:
   { \__kernel_backend_literal:n { color~pop } }

Modified: trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-luatex.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-luatex.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-luatex.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -12,7 +12,7 @@
 %% l3backend-pdf.dtx  (with options: `package,luatex')
 %% l3backend-opacity.dtx  (with options: `package,luatex')
 %% 
-%% Copyright (C) 2019-2021 The LaTeX Project
+%% Copyright (C) 2019-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-luatex.def}{2021-12-14}{}
+  {l3backend-luatex.def}{2022-01-12}{}
   {L3 backend support: PDF output (LuaTeX)}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -148,7 +148,6 @@
     \tl_set:Nn \l__color_backend_fill_tl {#1}
     \tl_set:Nn \l__color_backend_stroke_tl {#2}
     \__kernel_color_backend_stack_push:nn \l__color_backend_stack_int { #1 ~ #2 }
-    \group_insert_after:N \__color_backend_reset:
   }
 \cs_new_protected:Npn \__color_backend_reset:
   { \__kernel_color_backend_stack_pop:n \l__color_backend_stack_int }

Modified: trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -12,7 +12,7 @@
 %% l3backend-pdf.dtx  (with options: `package,pdftex')
 %% l3backend-opacity.dtx  (with options: `package,pdftex')
 %% 
-%% Copyright (C) 2019-2021 The LaTeX Project
+%% Copyright (C) 2019-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-pdftex.def}{2021-12-14}{}
+  {l3backend-pdftex.def}{2022-01-12}{}
   {L3 backend support: PDF output (pdfTeX)}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -148,7 +148,6 @@
     \tl_set:Nn \l__color_backend_fill_tl {#1}
     \tl_set:Nn \l__color_backend_stroke_tl {#2}
     \__kernel_color_backend_stack_push:nn \l__color_backend_stack_int { #1 ~ #2 }
-    \group_insert_after:N \__color_backend_reset:
   }
 \cs_new_protected:Npn \__color_backend_reset:
   { \__kernel_color_backend_stack_pop:n \l__color_backend_stack_int }

Modified: trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-xetex.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-xetex.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-xetex.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -12,7 +12,7 @@
 %% l3backend-pdf.dtx  (with options: `package,xetex')
 %% l3backend-opacity.dtx  (with options: `package,xetex')
 %% 
-%% Copyright (C) 2019-2021 The LaTeX Project
+%% Copyright (C) 2019-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-xetex.def}{2021-12-14}{}
+  {l3backend-xetex.def}{2022-01-12}{}
   {L3 backend support: XeTeX}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -179,7 +179,6 @@
     \tl_set:Nn \l__color_backend_fill_tl {#1}
     \tl_set:Nn \l__color_backend_stroke_tl {#2}
     \__kernel_color_backend_stack_push:nn \l__color_backend_stack_int { #1 ~ #2 }
-    \group_insert_after:N \__color_backend_reset:
   }
 \cs_new_protected:Npn \__color_backend_reset:
   { \__kernel_color_backend_stack_pop:n \l__color_backend_stack_int }
@@ -186,10 +185,7 @@
 \int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
   {
     \cs_gset_protected:Npn \__color_backend_select_cmyk:n #1
-      {
-        \__kernel_backend_literal:n { pdf: bc ~ [#1] }
-        \group_insert_after:N \__color_backend_reset:
-      }
+      { \__kernel_backend_literal:n { pdf: bc ~ [#1] } }
     \cs_gset_eq:NN \__color_backend_select_gray:n \__color_backend_select_cmyk:n
     \cs_gset_eq:NN \__color_backend_select_rgb:n \__color_backend_select_cmyk:n
     \cs_gset_protected:Npn \__color_backend_reset:

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2022-01-12 21:22:19 UTC (rev 61588)
@@ -55,9 +55,9 @@
 %% l3text-purify.dtx  (with options: `package')
 %% l3candidates.dtx  (with options: `package')
 %% l3legacy.dtx  (with options: `package')
-%% l3deprecation.dtx  (with options: `package,kernel')
+%% l3deprecation.dtx  (with options: `package')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -70,7 +70,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2021-11-22}%
+\def\ExplFileDate{2022-01-12}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -7526,7 +7526,6 @@
       }
   }
 \bool_new:N \g__sys_debug_bool
-\bool_new:N \g__sys_deprecation_bool
 \cs_new_protected:Npn \sys_load_debug:
   {
     \bool_if:NF \g__sys_debug_bool
@@ -7533,12 +7532,6 @@
       { \__kernel_sys_configuration_load:n { l3debug } }
     \bool_gset_true:N \g__sys_debug_bool
   }
-\cs_new_protected:Npn \sys_load_deprecation:
-  {
-    \bool_if:NF \g__sys_deprecation_bool
-      { \__kernel_sys_configuration_load:n { l3deprecation } }
-    \bool_gset_true:N \g__sys_deprecation_bool
-  }
 \tl_new:N \l__sys_internal_tl
 \tl_const:Nx \c__sys_marker_tl { : \token_to_str:N : }
 \cs_new_protected:Npn \sys_get_shell:nnN #1#2#3
@@ -8082,8 +8075,8 @@
 \cs_new:Npn \__clist_remove_all:
   { \exp_after:wN \__clist_remove_all:w \__clist_tmp:w , }
 \cs_new:Npn \__clist_remove_all:w #1 , \s__clist_mark , #2 , { \exp_not:n {#1} }
-\cs_generate_variant:Nn \clist_remove_all:Nn  { c }
-\cs_generate_variant:Nn \clist_gremove_all:Nn { c }
+\cs_generate_variant:Nn \clist_remove_all:Nn  { c , NV , cV }
+\cs_generate_variant:Nn \clist_gremove_all:Nn { c , NV , cV }
 \cs_new_protected:Npn \clist_reverse:N #1
   { \__kernel_tl_set:Nx #1 { \exp_args:No \clist_reverse:n {#1} } }
 \cs_new_protected:Npn \clist_greverse:N #1
@@ -9287,6 +9280,44 @@
       \exp_after:wN \__peek_false:w
     \fi:
   }
+\cs_new_protected:Npn \peek_remove_filler:n #1
+  {
+    \cs_set:Npn \__peek_true_aux:w { \__peek_remove_filler:w }
+    \cs_set:Npx \__peek_false:w
+      {
+        \exp_not:N \group_align_safe_end:
+        \exp_not:n {#1}
+      }
+    \group_align_safe_begin:
+    \__peek_remove_filler:w
+  }
+\cs_new_protected:Npn \__peek_remove_filler:w
+  {
+    \exp_after:wN \peek_after:Nw \exp_after:wN \__peek_remove_filler:
+    \exp:w \exp_end_continue_f:w
+  }
+\cs_new_protected:Npn \__peek_remove_filler:
+  {
+    \if_catcode:w \exp_not:N \l_peek_token \c_space_token
+      \exp_after:wN \__peek_true_remove:w
+    \else:
+      \if_meaning:w \l_peek_token \scan_stop:
+        \exp_after:wN \exp_after:wN \exp_after:wN
+          \__peek_true_remove:w
+      \else:
+        \exp_after:wN \exp_after:wN \exp_after:wN
+          \__peek_remove_filler_expand:w
+      \fi:
+    \fi:
+  }
+\cs_new_protected:Npn \__peek_remove_filler_expand:w
+  {
+    \exp_after:wN \if_meaning:w \exp_not:N \l_peek_token \l_peek_token
+      \exp_after:wN \__peek_false:w
+    \else:
+      \exp_after:wN \__peek_remove_filler:w
+    \fi:
+  }
 \cs_new_protected:Npn \__peek_token_generic_aux:NNNTF #1#2#3#4#5
   {
     \group_align_safe_begin:
@@ -9372,29 +9403,6 @@
           }
       }
   }
-\tl_map_inline:nn
-  {
-    { catcode } { catcode_remove }
-    { charcode } { charcode_remove }
-    { meaning } { meaning_remove }
-  }
-  {
-    \cs_new_protected:cpx { peek_#1_ignore_spaces:NTF } ##1##2##3
-      {
-        \peek_remove_spaces:n
-          { \exp_not:c { peek_#1:NTF } ##1 {##2} {##3} }
-      }
-    \cs_new_protected:cpx { peek_#1_ignore_spaces:NT } ##1##2
-      {
-        \peek_remove_spaces:n
-          { \exp_not:c { peek_#1:NT } ##1 {##2} }
-      }
-    \cs_new_protected:cpx { peek_#1_ignore_spaces:NF } ##1##2
-      {
-        \peek_remove_spaces:n
-          { \exp_not:c { peek_#1:NF } ##1 {##2} }
-      }
-  }
 \group_begin:
   \cs_set_protected:Npn \__peek_tmp:w #1 \s__peek_stop
     {
@@ -9612,6 +9620,42 @@
   }
 \cs_new:Npn \__prop_count:nn #1#2 { + 1 }
 \cs_generate_variant:Nn \prop_count:N { c }
+\cs_if_exist:NTF \tex_expanded:D
+  {
+    \cs_new:Npn \prop_to_keyval:N #1
+      {
+        \__kernel_exp_not:w
+          \prop_if_empty:NTF #1
+            { {} }
+            {
+              \exp_after:wN \exp_after:wN \exp_after:wN
+              {
+                \tex_expanded:D
+                  {
+                    \__kernel_exp_not:w { \use_none:n }
+                    \prop_map_function:NN #1 \__prop_to_keyval:nn
+                  }
+              }
+            }
+      }
+    \cs_new:Npn \__prop_to_keyval:nn #1#2
+      { , ~ {#1} =~ { \__kernel_exp_not:w {#2} } }
+  }
+  {
+    \cs_new:Npn \prop_to_keyval:N #1
+      {
+        \__kernel_exp_not:w
+          \prop_if_empty:NTF #1
+            { {} }
+            {
+              \prop_map_function:NN #1 \__prop_to_keyval:nnw
+              \__prop_to_keyval_exp_after:wN { \use_none:n }
+            }
+      }
+    \cs_new_eq:NN \__prop_to_keyval_exp_after:wN \exp_after:wN
+    \cs_new:Npn \__prop_to_keyval:nnw #1#2#3 \__prop_to_keyval_exp_after:wN #4
+      { #3 \__prop_to_keyval_exp_after:wN { #4 , ~ {#1} =~ {#2} } }
+  }
 \prg_new_protected_conditional:Npnn \prop_pop:NnN #1#2#3 { T , F , TF }
   {
     \__prop_split:NnTF #1 {#2}
@@ -12965,11 +13009,11 @@
   \__keyval_tmp:w { ~ }
 \group_end:
 \str_const:Nn \c__keys_code_root_str     { key~code~>~ }
+\str_const:Nn \c__keys_check_root_str    { key~check~>~ }
 \str_const:Nn \c__keys_default_root_str  { key~default~>~ }
 \str_const:Nn \c__keys_groups_root_str   { key~groups~>~ }
 \str_const:Nn \c__keys_inherit_root_str  { key~inherit~>~ }
 \str_const:Nn \c__keys_type_root_str     { key~type~>~ }
-\str_const:Nn \c__keys_validate_root_str { key~validate~>~ }
 \str_const:Nn \c__keys_props_root_str { key~prop~>~ }
 \int_new:N \l_keys_choice_int
 \tl_new:N \l_keys_choice_tl
@@ -12993,6 +13037,8 @@
 \bool_new:N \l__keys_tmp_bool
 \tl_new:N \l__keys_tmpa_tl
 \tl_new:N \l__keys_tmpb_tl
+\prop_new:N \l_keys_usage_load_prop
+\prop_new:N \l_keys_usage_preamble_prop
 \scan_new:N \s__keys_nil
 \scan_new:N \s__keys_mark
 \scan_new:N \s__keys_stop
@@ -13259,7 +13305,7 @@
 \cs_new_protected:Npn \__keys_undefine:
   {
     \clist_map_inline:nn
-      { code , default , groups , inherit , type , validate }
+      { code , default , groups , inherit , type , check }
       {
         \cs_set_eq:cN
           { \tl_use:c { c__keys_ ##1 _root_str } \l_keys_path_str }
@@ -13273,17 +13319,17 @@
         { true }
           {
             \cs_set_eq:cc
-              { \c__keys_validate_root_str \l_keys_path_str }
-              { __keys_validate_ #1 : }
+              { \c__keys_check_root_str \l_keys_path_str }
+              { __keys_check_ #1 : }
           }
         { false }
           {
             \cs_if_eq:ccT
-              { \c__keys_validate_root_str \l_keys_path_str }
-              { __keys_validate_ #1 : }
+              { \c__keys_check_root_str \l_keys_path_str }
+              { __keys_check_ #1 : }
               {
                 \cs_set_eq:cN
-                  { \c__keys_validate_root_str \l_keys_path_str }
+                  { \c__keys_check_root_str \l_keys_path_str }
                   \tex_undefined:D
               }
           }
@@ -13294,7 +13340,7 @@
           { .value_ #1 :n }
       }
   }
-\cs_new_protected:Npn \__keys_validate_forbidden:
+\cs_new_protected:Npn \__keys_check_forbidden:
   {
     \bool_if:NF \l__keys_no_value_bool
       {
@@ -13303,7 +13349,7 @@
         \use_none:nnn
       }
   }
-\cs_new_protected:Npn \__keys_validate_required:
+\cs_new_protected:Npn \__keys_check_required:
   {
     \bool_if:NT \l__keys_no_value_bool
       {
@@ -13312,6 +13358,52 @@
         \use_none:nnn
       }
   }
+\cs_new_protected:Npn \__keys_usage:n #1
+  {
+    \str_case:nnF {#1}
+      {
+        { general }
+          {
+            \__keys_usage:NN \l_keys_usage_load_prop
+              \c_false_bool
+            \__keys_usage:NN \l_keys_usage_preamble_prop
+              \c_false_bool
+          }
+        { load }
+          {
+            \__keys_usage:NN \l_keys_usage_load_prop
+              \c_true_bool
+            \__keys_usage:NN \l_keys_usage_preamble_prop
+              \c_false_bool
+          }
+        { preamble }
+          {
+            \__keys_usage:NN \l_keys_usage_load_prop
+              \c_false_bool
+            \__keys_usage:NN \l_keys_usage_preamble_prop
+              \c_true_bool
+          }
+      }
+      {
+        \msg_error:nnnn { keys }
+          { choice-unknown }
+          { .usage:n }
+          {#1}
+      }
+  }
+\cs_new_protected:Npn \__keys_usage:NN #1#2
+  {
+    \prop_get:NVNF #1 \l__keys_module_str \l__keys_tmpa_tl
+      { \tl_clear:N \l__keys_tmpa_tl }
+    \tl_set:Nx \l__keys_tmpb_tl
+      { \exp_after:wN \__keys_usage:w \l_keys_path_str \s__keys_stop }
+    \bool_if:NTF #2
+      { \clist_put_right:NV \l__keys_tmpa_tl \l__keys_tmpb_tl }
+      { \clist_remove_all:NV \l__keys_tmpa_tl \l__keys_tmpb_tl }
+    \prop_put:NVV #1 \l__keys_module_str
+      \l__keys_tmpa_tl
+  }
+\cs_new:Npn \__keys_usage:w #1 / #2 \s__keys_stop {#2}
 \cs_new_protected:Npn \__keys_variable_set:NnnN #1#2#3#4
   {
     \use:c { #2_if_exist:NF } #1 { \use:c { #2 _new:N } #1 }
@@ -13505,10 +13597,28 @@
   { \__keys_variable_set:cnnN {#1} { tl } { g } x }
 \cs_new_protected:cpn { \c__keys_props_root_str .undefine: }
   { \__keys_undefine: }
+\cs_new_protected:cpn { \c__keys_props_root_str .usage:n } #1
+  { \__keys_usage:n {#1} }
 \cs_new_protected:cpn { \c__keys_props_root_str .value_forbidden:n } #1
   { \__keys_value_requirement:nn { forbidden } {#1} }
 \cs_new_protected:cpn { \c__keys_props_root_str .value_required:n } #1
   { \__keys_value_requirement:nn { required } {#1} }
+\group_begin:
+  \cs_set_protected:Npn \__keys_tmp:nn #1#2
+    {
+      \quark_if_recursion_tail_stop:n {#1}
+      \cs_new_eq:cc
+        { \c__keys_props_root_str . #2 }
+        { \c__keys_props_root_str . #1 }
+      \__keys_tmp:nn
+    }
+  \__keys_tmp:nn
+    { legacy_if:n } { if }
+    { tl_set:N }    { store }
+    { usage:n }     { usage }
+    { \q_recursion_tail } { }
+    \q_recursion_stop
+\group_end:
 \cs_new_protected:Npn \keys_set:nn #1#2
   {
     \use:x
@@ -13784,7 +13894,7 @@
   {
     \cs_if_exist:cTF { \c__keys_code_root_str \l_keys_path_str }
       {
-        \cs_if_exist_use:c { \c__keys_validate_root_str \l_keys_path_str }
+        \cs_if_exist_use:c { \c__keys_check_root_str \l_keys_path_str }
         \__keys_execute:no \l_keys_path_str \l_keys_value_tl
       }
       {
@@ -13803,7 +13913,7 @@
           { \c__keys_code_root_str ##1 / \l_keys_key_str }
           {
             \str_set:Nn \l__keys_inherit_str {##1}
-            \cs_if_exist_use:c { \c__keys_validate_root_str ##1 / \l_keys_key_str }
+            \cs_if_exist_use:c { \c__keys_check_root_str ##1 / \l_keys_key_str }
             \__keys_execute:no { ##1 / \l_keys_key_str } \l_keys_value_tl
             \clist_map_break:n \use_none:n
           }
@@ -13968,6 +14078,7 @@
       { \prg_return_true: }
       { \prg_return_false: }
   }
+\prg_generate_conditional_variant:Nnn \keys_if_exist:nn { ne } { T , F , TF }
 \prg_new_conditional:Npnn \keys_if_choice_exist:nnn #1#2#3
   { p , T , F , TF }
   {
@@ -23588,6 +23699,18 @@
   }
 \cs_new:Npn \__regex_maplike_break:
   { \prg_map_break:Nn \__regex_maplike_break: { } }
+\cs_new:Npn \__regex_tl_odd_items:n #1 { \__regex_tl_even_items:n { ? #1 } }
+\cs_new:Npn \__regex_tl_even_items:n #1
+  {
+    \__regex_tl_even_items_loop:nn #1 \q__regex_nil \q__regex_nil
+    \prg_break_point:
+  }
+\cs_new:Npn \__regex_tl_even_items_loop:nn #1#2
+  {
+    \__regex_use_none_delimit_by_q_nil:w #2 \prg_break: \q__regex_nil
+    { \exp_not:n {#2} }
+    \__regex_tl_even_items_loop:nn
+  }
 \cs_new:Npn \__regex_tmp:w { }
 \tl_new:N   \l__regex_internal_a_tl
 \tl_new:N   \l__regex_internal_b_tl
@@ -23609,11 +23732,12 @@
 \int_const:Nn \c__regex_ascii_max_int { 127 }
 \int_const:Nn \c__regex_ascii_lower_int { `a - `A }
 \quark_new:N \q__regex_recursion_stop
+\quark_new:N \q__regex_nil
 \cs_new:Npn \__regex_use_none_delimit_by_q_recursion_stop:w
   #1 \q__regex_recursion_stop { }
 \cs_new:Npn \__regex_use_i_delimit_by_q_recursion_stop:nw
   #1 #2 \q__regex_recursion_stop {#1}
-\quark_new:N \q__regex_nil
+\cs_new:Npn \__regex_use_none_delimit_by_q_nil:w #1 \q__regex_nil { }
 \__kernel_quark_new_conditional:Nn \__regex_quark_if_nil:N { F }
 \cs_new_protected:Npn \__regex_break_true:w
    #1 \__regex_break_point:TF #2 #3 {#2}
@@ -24215,6 +24339,20 @@
         }
     \__regex_compile_end:
   }
+\cs_new_protected:Npn \__regex_compile_use:n #1
+  {
+    \tl_if_single_token:nT {#1}
+      {
+        \exp_after:wN \__regex_compile_use_aux:w
+        \token_to_meaning:N #1 ~ \q__regex_nil
+      }
+    \__regex_compile:n {#1} \l__regex_internal_regex
+  }
+\cs_new_protected:Npn \__regex_compile_use_aux:w #1 ~ #2 \q__regex_nil
+  {
+    \str_if_eq:nnT { #1 ~ } { macro:->\__regex_branch:n }
+      { \use_ii:nnn }
+  }
 \cs_new_protected:Npn \__regex_compile_special:N #1
   {
     \cs_if_exist_use:cF { __regex_compile_#1: }
@@ -25382,6 +25520,60 @@
     \__regex_toks_put_right:Nn \l__regex_right_state_int
       { \__regex_action_success: }
   }
+\int_new:N \g__regex_case_int
+\int_new:N \l__regex_case_max_group_int
+\cs_new_protected:Npn \__regex_case_build:n #1
+  {
+    \__regex_case_build_aux:Nn \c_true_bool {#1}
+    \int_gzero:N \g__regex_case_int
+  }
+\cs_generate_variant:Nn \__regex_case_build:n { x }
+\cs_new_protected:Npn \__regex_case_build_aux:Nn #1#2
+  {
+    \__regex_standard_escapechar:
+    \int_set_eq:NN \l__regex_max_state_int \l__regex_min_state_int
+    \__regex_build_new_state:
+    \__regex_build_new_state:
+    \__regex_toks_put_right:Nn \l__regex_left_state_int
+      { \__regex_action_start_wildcard:N #1 }
+    %
+    \__regex_build_new_state:
+    \__regex_toks_put_left:Nx \l__regex_left_state_int
+      { \__regex_action_submatch:nN { 0 } < }
+    \__regex_push_lr_states:
+    \int_zero:N \l__regex_case_max_group_int
+    \int_gzero:N \g__regex_case_int
+    \tl_map_inline:nn {#2}
+      {
+        \int_gincr:N \g__regex_case_int
+        \__regex_case_build_loop:n {##1}
+      }
+    \int_set_eq:NN \l__regex_capturing_group_int \l__regex_case_max_group_int
+    \__regex_pop_lr_states:
+  }
+\cs_new_protected:Npn \__regex_case_build_loop:n #1
+  {
+    \int_set:Nn \l__regex_capturing_group_int { 1 }
+    \__regex_compile_use:n {#1}
+    \int_set:Nn \l__regex_case_max_group_int
+      {
+        \int_max:nn { \l__regex_case_max_group_int }
+          { \l__regex_capturing_group_int }
+      }
+    \seq_pop:NN \l__regex_right_state_seq \l__regex_internal_a_tl
+    \int_set:Nn \l__regex_right_state_int \l__regex_internal_a_tl
+    \__regex_toks_put_left:Nx \l__regex_right_state_int
+      {
+        \__regex_action_submatch:nN { 0 } >
+        \int_gset:Nn \g__regex_case_int
+          { \int_use:N \g__regex_case_int }
+        \__regex_action_success:
+      }
+    \__regex_toks_clear:N \l__regex_max_state_int
+    \seq_push:No \l__regex_right_state_seq
+      { \int_use:N \l__regex_max_state_int }
+    \int_incr:N \l__regex_max_state_int
+  }
 \cs_new_protected:Npn \__regex_build_for_cs:n #1
   {
     \int_set_eq:NN \l__regex_min_state_int \l__regex_max_state_int
@@ -25993,7 +26185,7 @@
 \int_new:N \l__regex_replacement_csnames_int
 \tl_new:N \l__regex_replacement_category_tl
 \seq_new:N \l__regex_replacement_category_seq
-\tl_new:N \l__regex_balance_tl
+\tl_new:N \g__regex_balance_tl
 \cs_new:Npn \__regex_replacement_balance_one_match:n #1
   { - \__regex_submatch_balance:n {#1} }
 \cs_new:Npn \__regex_replacement_do_one_match:n #1
@@ -26046,12 +26238,14 @@
           { 0 }
       }
   }
-\cs_new_protected:Npn \__regex_replacement:n #1
+\cs_new_protected:Npn \__regex_replacement:n
+  { \__regex_replacement_apply:Nn \__regex_replacement_set:n }
+\cs_new_protected:Npn \__regex_replacement_apply:Nn #1#2
   {
     \group_begin:
       \tl_build_begin:N \l__regex_build_tl
       \int_zero:N \l__regex_balance_int
-      \tl_clear:N \l__regex_balance_tl
+      \tl_gclear:N \g__regex_balance_tl
       \__regex_escape_use:nnnn
         {
           \if_charcode:w \c_right_brace_str ##1
@@ -26067,7 +26261,7 @@
         }
         { \__regex_replacement_escaped:N ##1 }
         { \__regex_replacement_normal:n ##1 }
-        {#1}
+        {#2}
       \prg_do_nothing: \prg_do_nothing:
       \if_int_compare:w \l__regex_replacement_csnames_int > \c_zero_int
         \msg_error:nnx { regex } { replacement-missing-rbrace }
@@ -26081,18 +26275,15 @@
             { \seq_count:N \l__regex_replacement_category_seq }
           \seq_clear:N \l__regex_replacement_category_seq
         }
-      \cs_gset:Npx \__regex_replacement_balance_one_match:n ##1
-        {
-          + \int_use:N \l__regex_balance_int
-          \l__regex_balance_tl
-          - \__regex_submatch_balance:n {##1}
-        }
+      \tl_gput_right:Nx \g__regex_balance_tl
+        { + \int_use:N \l__regex_balance_int }
       \tl_build_end:N \l__regex_build_tl
       \exp_args:NNo
     \group_end:
-    \__regex_replacement_aux:n \l__regex_build_tl
+    #1 \l__regex_build_tl
   }
-\cs_new_protected:Npn \__regex_replacement_aux:n #1
+\cs_generate_variant:Nn \__regex_replacement:n { x }
+\cs_new_protected:Npn \__regex_replacement_set:n #1
   {
     \cs_set:Npn \__regex_replacement_do_one_match:n ##1
       {
@@ -26107,7 +26298,38 @@
           }
         #1
       }
+    \exp_args:Nno \use:n
+      { \cs_gset:Npn \__regex_replacement_balance_one_match:n ##1 }
+      {
+        \g__regex_balance_tl
+        - \__regex_submatch_balance:n {##1}
+      }
   }
+\tl_new:N \g__regex_case_replacement_tl
+\tl_new:N \g__regex_case_balance_tl
+\cs_new_protected:Npn \__regex_case_replacement:n #1
+  {
+    \tl_gset:Nn \g__regex_case_balance_tl
+      {
+        \if_case:w
+          \__kernel_intarray_item:Nn
+            \g__regex_submatch_case_intarray {##1}
+      }
+    \tl_gset_eq:NN \g__regex_case_replacement_tl \g__regex_case_balance_tl
+    \tl_map_tokens:nn {#1}
+      { \__regex_replacement_apply:Nn \__regex_case_replacement_aux:n }
+    \tl_gset:No \g__regex_balance_tl
+      { \g__regex_case_balance_tl \fi: }
+    \exp_args:No \__regex_replacement_set:n
+      { \g__regex_case_replacement_tl \fi: }
+  }
+\cs_generate_variant:Nn \__regex_case_replacement:n { x }
+\cs_new_protected:Npn \__regex_case_replacement_aux:n #1
+  {
+    \tl_gput_right:Nn \g__regex_case_replacement_tl { \or: #1 }
+    \tl_gput_right:No \g__regex_case_balance_tl
+      { \exp_after:wN \or: \g__regex_balance_tl }
+  }
 \cs_new_protected:Npn \__regex_replacement_put:n
   { \tl_build_put_right:Nn \l__regex_build_tl }
 \cs_new_protected:Npn \__regex_replacement_normal:n #1
@@ -26181,11 +26403,8 @@
     \tl_build_put_right:Nn \l__regex_build_tl
       { \__regex_query_submatch:n { \int_eval:n { #1 + ##1 } } }
     \if_int_compare:w \l__regex_replacement_csnames_int = \c_zero_int
-      \tl_put_right:Nn \l__regex_balance_tl
-        {
-          + \__regex_submatch_balance:n
-            { \exp_not:N \int_eval:n { #1 + ##1 } }
-        }
+      \tl_gput_right:Nn \g__regex_balance_tl
+        { + \__regex_submatch_balance:n { \int_eval:n { #1 + ##1 } } }
     \fi:
   }
 \cs_new_protected:Npn \__regex_replacement_g:w #1#2
@@ -26431,6 +26650,20 @@
   { \__regex_count:nnN { \__regex_build:n {#1} } }
 \cs_new_protected:Npn \regex_count:NnN #1
   { \__regex_count:nnN { \__regex_build:N #1 } }
+\cs_new_protected:Npn \regex_match_case:nnTF #1#2#3
+  {
+    \__regex_match_case:nnTF {#1} {#2}
+      {
+        \tl_item:nn {#1} { 2 * \g__regex_case_int }
+        #3
+      }
+  }
+\cs_new_protected:Npn \regex_match_case:nn #1#2
+  { \regex_match_case:nnTF {#1} {#2} { } { } }
+\cs_new_protected:Npn \regex_match_case:nnT #1#2#3
+  { \regex_match_case:nnTF {#1} {#2} {#3} { } }
+\cs_new_protected:Npn \regex_match_case:nnF #1#2
+  { \regex_match_case:nnTF {#1} {#2} { } }
 \cs_set_protected:Npn \__regex_tmp:w #1#2#3
   {
     \cs_new_protected:Npn #2 ##1 { #1 { \__regex_build:n {##1} } }
@@ -26449,6 +26682,52 @@
 \__regex_tmp:w \__regex_replace_all:nnN
   \regex_replace_all:nnN \regex_replace_all:NnN
 \__regex_tmp:w \__regex_split:nnN \regex_split:nnN \regex_split:NnN
+\cs_new_protected:Npn \regex_replace_case_once:nNTF #1#2
+  {
+    \int_if_odd:nTF { \tl_count:n {#1} }
+      {
+        \msg_error:nnxxxx { regex } { case-odd }
+          { \token_to_str:N \regex_replace_case_once:nN(TF) } { code }
+          { \tl_count:n {#1} } { \tl_to_str:n {#1} }
+        \use_ii:nn
+      }
+      {
+        \__regex_replace_once_aux:nnN
+          { \__regex_case_build:x { \__regex_tl_odd_items:n {#1} } }
+          { \__regex_replacement:x { \tl_item:nn {#1} { 2 * \g__regex_case_int } } }
+          #2
+        \bool_if:NTF \g__regex_success_bool
+      }
+  }
+\cs_new_protected:Npn \regex_replace_case_once:nN #1#2
+  { \regex_replace_case_once:nNTF {#1} {#2} { } { } }
+\cs_new_protected:Npn \regex_replace_case_once:nNT #1#2#3
+  { \regex_replace_case_once:nNTF {#1} {#2} {#3} { } }
+\cs_new_protected:Npn \regex_replace_case_once:nNF #1#2
+  { \regex_replace_case_once:nNTF {#1} {#2} { } }
+\cs_new_protected:Npn \regex_replace_case_all:nNTF #1#2
+  {
+    \int_if_odd:nTF { \tl_count:n {#1} }
+      {
+        \msg_error:nnxxxx { regex } { case-odd }
+          { \token_to_str:N \regex_replace_case_all:nN(TF) } { code }
+          { \tl_count:n {#1} } { \tl_to_str:n {#1} }
+        \use_ii:nn
+      }
+      {
+        \__regex_replace_all_aux:nnN
+          { \__regex_case_build:x { \__regex_tl_odd_items:n {#1} } }
+          { \__regex_case_replacement:x { \__regex_tl_even_items:n {#1} } }
+          #2
+        \bool_if:NTF \g__regex_success_bool
+      }
+  }
+\cs_new_protected:Npn \regex_replace_case_all:nN #1#2
+  { \regex_replace_case_all:nNTF {#1} {#2} { } { } }
+\cs_new_protected:Npn \regex_replace_case_all:nNT #1#2#3
+  { \regex_replace_case_all:nNTF {#1} {#2} {#3} { } }
+\cs_new_protected:Npn \regex_replace_case_all:nNF #1#2
+  { \regex_replace_case_all:nNTF {#1} {#2} { } }
 \int_new:N \l__regex_match_count_int
 \flag_new:n { __regex_begin }
 \flag_new:n { __regex_end }
@@ -26458,6 +26737,7 @@
 \intarray_new:Nn \g__regex_submatch_prev_intarray { 65536 }
 \intarray_new:Nn \g__regex_submatch_begin_intarray { 65536 }
 \intarray_new:Nn \g__regex_submatch_end_intarray { 65536 }
+\intarray_new:Nn \g__regex_submatch_case_intarray { 65536 }
 \intarray_new:Nn \g__regex_balance_intarray { 65536 }
 \int_new:N \l__regex_added_begin_int
 \int_new:N \l__regex_added_end_int
@@ -26499,6 +26779,23 @@
       \__regex_match:n {#2}
     \group_end:
   }
+\cs_new_protected:Npn \__regex_match_case:nnTF #1#2
+  {
+    \int_if_odd:nTF { \tl_count:n {#1} }
+      {
+        \msg_error:nnxxxx { regex } { case-odd }
+          { \token_to_str:N \regex_match_case:nn(TF) } { code }
+          { \tl_count:n {#1} } { \tl_to_str:n {#1} }
+        \use_ii:nn
+      }
+      {
+        \__regex_if_match:nn
+          { \__regex_case_build:x { \__regex_tl_odd_items:n {#1} } }
+          {#2}
+        \bool_if:NTF \g__regex_success_bool
+      }
+  }
+\cs_new:Npn \__regex_match_case_aux:nn #1#2 { \exp_not:n { {#1} } }
 \cs_new_protected:Npn \__regex_count:nnN #1#2#3
   {
     \group_begin:
@@ -26682,10 +26979,14 @@
         {
           \__kernel_intarray_gset:Nnn \g__regex_submatch_prev_intarray
             { \l__regex_submatch_int } { 0 }
+          \__kernel_intarray_gset:Nnn \g__regex_submatch_case_intarray
+            { \l__regex_submatch_int } { 0 }
           \int_incr:N \l__regex_submatch_int
         }
       \__kernel_intarray_gset:Nnn \g__regex_submatch_prev_intarray
         { \l__regex_zeroth_submatch_int } { \l__regex_start_pos_int }
+      \__kernel_intarray_gset:Nnn \g__regex_submatch_case_intarray
+        { \l__regex_zeroth_submatch_int } { \g__regex_case_int }
       \int_zero:N \l__regex_internal_a_int
       \exp_after:wN \__regex_extract_aux:w \l__regex_success_submatches_tl
         \prg_break_point: \__regex_use_none_delimit_by_q_recursion_stop:w ,
@@ -26705,18 +27006,19 @@
     \int_incr:N \l__regex_internal_a_int
     \__regex_extract_aux:w
   }
-\cs_new_protected:Npn \__regex_replace_once:nnN #1#2#3
+\cs_new_protected:Npn \__regex_replace_once:nnN #1#2
+  { \__regex_replace_once_aux:nnN {#1} { \__regex_replacement:n {#2} } }
+\cs_new_protected:Npn \__regex_replace_once_aux:nnN #1#2#3
   {
     \group_begin:
       \__regex_single_match:
       #1
       \exp_args:No \__regex_match:n {#3}
-      \if_meaning:w \c_false_bool \g__regex_success_bool
-        \group_end:
-      \else:
+    \bool_if:NTF \g__regex_success_bool
+      {
         \__regex_extract:
         \exp_args:No \__regex_query_set:n {#3}
-        \__regex_replacement:n {#2}
+        #2
         \int_set:Nn \l__regex_balance_int
           {
             \__regex_replacement_balance_one_match:n
@@ -26734,9 +27036,12 @@
               { \l__regex_max_pos_int }
           }
         \__regex_group_end_replace:N #3
-      \fi:
+      }
+      { \group_end: }
   }
-\cs_new_protected:Npn \__regex_replace_all:nnN #1#2#3
+\cs_new_protected:Npn \__regex_replace_all:nnN #1#2
+  { \__regex_replace_all_aux:nnN {#1} { \__regex_replacement:n {#2} } }
+\cs_new_protected:Npn \__regex_replace_all_aux:nnN #1#2#3
   {
     \group_begin:
       \__regex_multi_match:n { \__regex_extract: }
@@ -26743,7 +27048,7 @@
       #1
       \exp_args:No \__regex_match:n {#3}
       \exp_args:No \__regex_query_set:n {#3}
-      \__regex_replacement:n {#2}
+      #2
       \int_set:Nn \l__regex_balance_int
         {
           0
@@ -27271,6 +27576,13 @@
 \msg_new:nnnn { regex } { backwards-quantifier }
   { Quantifer~"{#1,#2}"~is~backwards. }
   { The~values~given~in~a~quantifier~must~be~in~order. }
+\msg_new:nnnn { regex } { case-odd }
+  { #1~with~odd~number~of~items }
+  {
+    There~must~be~a~#2~part~for~each~regex:~
+    found~odd~number~of~items~(#3)~in\\
+    \iow_indent:n {#4}
+  }
 \msg_new:nnn { regex } { show }
   {
     >~Compiled~regex~
@@ -28009,7 +28321,10 @@
 \cs_new_protected:Npn \__color_select:N #1
   { \exp_after:wN \__color_select:nn #1 }
 \cs_new_protected:Npn \__color_select:nn #1#2
-  { \use:c { __color_backend_select_ #1 :n } {#2} }
+  {
+    \use:c { __color_backend_select_ #1 :n } {#2}
+    \group_insert_after:N \__color_backend_reset:
+  }
 \tl_new:N \l__color_current_tl
 \tl_set:Nn \l__color_current_tl { { gray } { 0 } }
 
@@ -28033,16 +28348,42 @@
 \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 }
+\cs_generate_variant:Nn \exp_last_unbraced:Nf { c }
 \cs_new_protected:Npn \__color_convert:nnnN #1#2#3#4
   {
     \tl_set:Nx #4
       {
-        \cs_if_exist:cTF { __color_convert_ #1 _ #2 :w }
-          { \use:c { __color_convert_ #1 _ #2 :w } #3 \s__color_stop }
-          { \use:c { c__color_fallback_ #2 _tl } }
+        \cs_if_exist_use:cTF { __color_convert_ #1 _ #2 :w }
+          { #3 \s__color_stop }
+          {
+            \cs_if_exist:cTF { __color_convert_ \use:c { c__color_fallback_ #1 _tl } _ #2 :w }
+              {
+                \exp_last_unbraced:cf
+                  { __color_convert_ \use:c { c__color_fallback_ #1 _tl } _ #2 :w }
+                  { \use:c { __color_convert_ #1 _ \use:c { c__color_fallback_ #1 _tl } :w } #3 \s__color_stop }
+                  \s__color_stop
+              }
+              {
+                \exp_last_unbraced:cf
+                  { __color_convert_ \use:c { c__color_fallback_ #2 _tl } _ #2 :w }
+                  {
+                    \cs_if_exist_use:cTF { __color_convert_ #1 _ \use:c { c__color_fallback_ #2 _tl } :w }
+                      { #3 \s__color_stop }
+                      {
+                        \exp_last_unbraced:cf
+                          { __color_convert_ \use:c { c__color_fallback_ #1 _tl } _ \use:c { c__color_fallback_ #2 _tl } :w }
+                          { \use:c { __color_convert_ #1 _ \use:c { c__color_fallback_ #1 _tl } :w } #3 \s__color_stop }
+                          \s__color_stop
+                      }
+                  }
+                  \s__color_stop
+              }
+          }
       }
   }
 \cs_generate_variant:Nn \__color_convert:nnnN { nV , nnV }
+\cs_new:Npn \__color_convert_gray_gray:w #1 \s__color_stop
+  { #1 }
 \cs_new:Npn \__color_convert_gray_rgb:w #1 \s__color_stop
   { #1 ~ #1 ~ #1 }
 \cs_new:Npn \__color_convert_gray_cmyk:w #1 \s__color_stop
@@ -28049,6 +28390,8 @@
   { 0 ~ 0 ~ 0 ~ \fp_eval:n { 1 - #1 } }
 \cs_new:Npn \__color_convert_rgb_gray:w #1 ~ #2 ~ #3 \s__color_stop
   { \fp_eval:n { 0.3 * #1 + 0.59 * #2 + 0.11 * #3 } }
+\cs_new:Npn \__color_convert_rgb_rgb:w #1 \s__color_stop
+  { #1 }
 \cs_new:Npn \__color_convert_rgb_cmyk:w #1 ~ #2 ~ #3 \s__color_stop
   {
     \exp_args:Nf \__color_convert_rgb_cmyk:nnnn
@@ -28069,6 +28412,8 @@
     \fp_eval:n { 1 - min ( 1 , #2 + #4 ) } \c_space_tl
     \fp_eval:n { 1 - min ( 1 , #3 + #4 ) }
   }
+\cs_new:Npn \__color_convert_cmyk_cmyk:w #1 \s__color_stop
+  { #1 }
 \tl_new:N \l__color_model_tl
 \tl_new:N \l__color_value_tl
 \tl_new:N \l__color_next_model_tl
@@ -28421,7 +28766,7 @@
     \tl_set:Nn \l__color_model_tl {#1}
     \tl_set:Nn \l__color_value_tl {#2}
   }
-\cs_new_protected:Npx \__color_select:
+\cs_new_protected:Npx \__color_finalise_current:
   {
     \tl_set:Nx \exp_not:c { l__color_named_ . _tl }
       { \exp_not:N \__color_model:N \exp_not:N \l__color_current_tl }
@@ -28429,18 +28774,19 @@
     \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_select:
+    \__color_finalise_current:
+    \__color_select:N \l__color_current_tl
   }
 \cs_new_protected:Npn \color_select:nn #1#2
   {
     \__color_select_main:Nw \l__color_current_tl
       #1 / / \s__color_mark #2 / / \s__color_stop
-    \__color_select:
+    \__color_finalise_current:
+    \__color_select:N \l__color_current_tl
   }
 \cs_new_protected:Npn \__color_select_main:Nw
   #1 #2 / #3 / #4 \s__color_mark #5 / #6 / #7 \s__color_stop
@@ -28710,9 +29056,9 @@
   { \tl_set:Nn #1 {#2} }
 \prop_new:N \l__color_internal_prop
 \int_new:N \g__color_model_int
-\tl_const:Nn \c__color_fallback_cmyk_tl { 0 ~ 0 ~ 0 ~ 1 }
-\tl_const:Nn \c__color_fallback_gray_tl { 1 }
-\tl_const:Nn \c__color_fallback_rgb_tl { 1 ~ 1 ~ 1 }
+\tl_const:Nn \c__color_fallback_cmyk_tl { cmyk }
+\tl_const:Nn \c__color_fallback_gray_tl { gray }
+\tl_const:Nn \c__color_fallback_rgb_tl { rgb }
 \prop_new:N \g__color_colorants_prop
 \prop_gput:Nnn \g__color_colorants_prop { black }   { Black }
 \prop_gput:Nnn \g__color_colorants_prop { blue }    { Blue }
@@ -28766,10 +29112,9 @@
           }
       }
   }
-\cs_new_protected:Npn \__color_model_init:nnnnn #1#2#3#4#5
+\cs_new_protected:Npn \__color_model_init:nnnn #1#2#3#4
   {
     \int_gincr:N \g__color_model_int
-    \tl_const:cn { c__color_fallback_ #1 _tl } { #4 }
     \clist_map_inline:nn { fill , stroke , select }
       {
         \cs_new_protected:cpx { __color_backend_ ##1 _ #1 :n } ####1
@@ -28781,23 +29126,13 @@
     \cs_new_protected:cpx { __color_model_ #1 _white: }
       {
         \prop_put:Nnn \exp_not:N \l__color_named_white_prop {#1}
-        { \exp_not:n {#5} }
+        { \exp_not:n {#4} }
         \exp_not:N \int_compare:nNnF { \tex_currentgrouplevel:D } = 0
           { \group_insert_after:N \exp_not:c { __color_model_ #1 _ white: } }
       }
     \use:c { __color_model_ #1 _white: }
   }
-\cs_generate_variant:Nn \__color_model_init:nnnnn { nnnxx }
-\cs_new_protected:Npn \__color_model_init:nnn #1#2#3
-  {
-    \__color_model_init:nnnxx { #1 } { #2 } { #3 }
-      {
-        1 \prg_replicate:nn { #2 - 1 } { ~ 1 }
-      }
-      {
-        0 \prg_replicate:nn { #2 - 1 } { ~ 0 }
-      }
-  }
+\cs_generate_variant:Nn \__color_model_init:nnnn { nnnx }
 \cs_new_protected:Npn \__color_model_separation:n #1
   {
     \prop_get:NnNTF \l__color_internal_prop { name }
@@ -28847,7 +29182,7 @@
 \cs_new_protected:Npn \__color_model_separation:w
   #1 , #2 , #3 , #4 , #5 \s__color_stop #6#7#8
   {
-    \__color_model_init:nnn {#6} { 1 } { separation }
+    \__color_model_init:nnnn {#6} { 1 } { separation } { 0 }
     \cs_new_eq:cN { __color_parse_mix_ #6 :nw } \__color_parse_mix_gray:nw
     \cs_new:cpn { __color_parse_model_ #6 :w } ##1 , ##2 \s__color_stop
       { {#6} { \__color_parse_number:n {##1} } }
@@ -28859,6 +29194,7 @@
   }
 \cs_new_protected:Npn \__color_model_separation_cmyk:nnnnnn #1#2#3#4#5#6
   {
+    \tl_const:cn { c__color_fallback_ #1 _tl } { cmyk }
     \cs_new:cpn { __color_convert_ #1 _cmyk:w } ##1 \s__color_stop
       {
          \fp_eval:n {##1 * #3} ~
@@ -28866,8 +29202,7 @@
          \fp_eval:n {##1 * #5} ~
          \fp_eval:n {##1 * #6}
       }
-    \__color_model_convert:nnn {#1} { cmyk } { rgb }
-    \__color_model_convert:nnn {#1} { cmyk } { gray }
+    \cs_new:cpn { __color_convert_cmyk_ #1 :w } ##1 \s__color_stop { 1 }
     \prop_gput:Nnn \g__color_alternative_values_prop {#1} { #3 , #4 , #5 , #6 }
     \__color_backend_separation_init:nnnnn {#2} { /DeviceCMYK } { }
       { 0 ~ 0 ~ 0 ~ 0 } { #3 ~ #4 ~ #5 ~ #6 }
@@ -28874,6 +29209,7 @@
   }
 \cs_new_protected:Npn \__color_model_separation_rgb:nnnnnn #1#2#3#4#5#6
   {
+    \tl_const:cn { c__color_fallback_ #1 _tl } { rgb }
     \cs_new:cpn { __color_convert_ #1 _rgb:w } ##1 \s__color_stop
       {
          \fp_eval:n {##1 * #3} ~
@@ -28880,8 +29216,7 @@
          \fp_eval:n {##1 * #4} ~
          \fp_eval:n {##1 * #5}
       }
-    \__color_model_convert:nnn {#1} { rgb } { cmyk }
-    \__color_model_convert:nnn {#1} { rgb } { gray }
+    \cs_new:cpn { __color_convert_rgb_ #1 :w } ##1 \s__color_stop { 1 }
     \prop_gput:Nnn \g__color_alternative_values_prop {#1} { #3 , #4 , #5 }
     \__color_backend_separation_init:nnnnn {#2} { /DeviceRGB } { }
       { 0 ~ 0 ~ 0 } { #3 ~ #4 ~ #5 }
@@ -28888,21 +29223,10 @@
   }
 \cs_new_protected:Npn \__color_model_separation_gray:nnnnnn #1#2#3#4#5#6
   {
-    \cs_new:cpn { __color_convert_ #1 _cmyk:w } ##1 \s__color_stop
-      {
-        \fp_eval:n {##1 * #3} ~
-        \fp_eval:n {##1 * #3} ~
-        \fp_eval:n {##1 * #3} ~
-        \fp_eval:n {##1 * #3}
-      }
+    \tl_const:cn { c__color_fallback_ #1 _tl } { gray }
     \cs_new:cpn { __color_convert_ #1 _gray:w } ##1 \s__color_stop
       { \fp_eval:n {##1 * #3} }
-    \cs_new:cpn { __color_convert_ #1 _rgb:w } ##1 \s__color_stop
-      {
-        \fp_eval:n {##1 * #3} ~
-        \fp_eval:n {##1 * #3} ~
-        \fp_eval:n {##1 * #3}
-      }
+    \cs_new:cpn { __color_convert_gray_ #1 :w } ##1 \s__color_stop { 1 }
     \prop_gput:Nnn \g__color_alternative_values_prop {#1} {#3}
     \__color_backend_separation_init:nnnnn {#2} { /DeviceGray } { } { 0 } {#3}
   }
@@ -28933,11 +29257,10 @@
     \tl_if_exist:cTF { c__color_model_whitepoint_CIELAB_ #1 _tl }
       {
         \__color_backend_separation_init_CIELAB:nnn {#1} {#3} { #4 ~ #5 ~ #6 }
-        \cs_new:cpn { __color_convert_ #2 _cmyk:w } ##1 \s__color_stop
-          { 0 ~ 0 ~ 0 ~ 1 }
-        \cs_new:cpn { __color_convert_ #2 _rgb:w } ##1 \s__color_stop
-          { 1 ~ 1 ~ 1 }
+        \tl_const:cn { c__color_fallback_ #2 _tl } { gray }
         \cs_new:cpn { __color_convert_ #2 _gray:w } ##1 \s__color_stop
+          { 0 }
+        \cs_new:cpn { __color_convert_gray_ #2 :w } ##1 \s__color_stop
           { 1 }
       }
       {
@@ -29001,12 +29324,18 @@
   }
 \cs_new_protected:Npn \__color_model_devicen:nnnn #1#2#3#4
   {
-    \__color_model_init:nnn {#4} {#1} { devicen }
+    \__color_model_init:nnnx {#4} {#1} { devicen }
+      {
+        0 \prg_replicate:nn { #1 - 1 } { ~ 0 }
+      }
     \cs_if_exist_use:cF { __color_model_devicen_parse_ #1 :nn }
       { \__color_model_devicen_parse_generic:nn }
         {#4} {#1}
     \__color_model_devicen_init:nnn {#1} {#2} {#3}
-    \__color_model_devicen_convert:nnn {#4} {#2} {#3}
+    \__color_model_devicen_convert:nnnx {#4} {#2} {#3}
+      {
+        1 \prg_replicate:nn { #1 - 1 } { ~ 1 }
+      }
   }
 \cs_new_protected:cpn { __color_model_devicen_parse_1:nn } #1#2
   {
@@ -29177,30 +29506,29 @@
   {
     / \prop_item:Nn \g__color_colorants_prop {#1} ~
   }
-\cs_new_protected:Npn \__color_model_devicen_convert:nnn #1#2#3
+\cs_new_protected:Npn \__color_model_devicen_convert:nnnn #1#2#3
   {
-    \use:c { __color_model_devicen_convert_ #2 :nn } {#1} {#3}
+    \use:c { __color_model_devicen_convert_ #2 :nnn } {#1} {#3}
   }
-\cs_new_protected:Npn \__color_model_devicen_convert_cmyk:nn #1#2
+\cs_generate_variant:Nn \__color_model_devicen_convert:nnnn { nnnx }
+\cs_new_protected:Npn \__color_model_devicen_convert_cmyk:nnn #1#2
   {
-    \__color_model_convert:nnn {#1} { cmyk } { gray }
-    \__color_model_convert:nnn {#1} { cmyk } { rgb }
-    \__color_model_devicen_convert:nnnn {#1} { cmyk } { 4 } {#2}
+    \tl_const:cn { c__color_fallback_ #1 _tl } { cmyk }
+    \__color_model_devicen_convert:nnnnn {#1} { cmyk } { 4 } {#2}
   }
-\cs_new_protected:Npn \__color_model_devicen_convert_gray:nn #1#2
+\cs_new_protected:Npn \__color_model_devicen_convert_gray:nnn #1#2
   {
-    \__color_model_convert:nnn {#1} { gray } { cmyk }
-    \__color_model_convert:nnn {#1} { gray } { rgb }
-    \__color_model_devicen_convert:nnnn {#1} { gray } { 1 } {#2}
+    \tl_const:cn { c__color_fallback_ #1 _tl } { gray }
+    \__color_model_devicen_convert:nnnnn {#1} { gray } { 1 } {#2}
   }
-\cs_new_protected:Npn \__color_model_devicen_convert_rgb:nn #1#2
+\cs_new_protected:Npn \__color_model_devicen_convert_rgb:nnn #1#2
   {
-    \__color_model_convert:nnn {#1} { rgb } { cmyk }
-    \__color_model_convert:nnn {#1} { rgb } { gray }
-    \__color_model_devicen_convert:nnnn {#1} { rgb } { 3 } {#2}
+    \tl_const:cn { c__color_fallback_ #1 _tl } { rgb }
+    \__color_model_devicen_convert:nnnnn {#1} { rgb } { 3 } {#2}
   }
-\cs_new_protected:Npn \__color_model_devicen_convert:nnnn #1#2#3#4
+\cs_new_protected:Npn \__color_model_devicen_convert:nnnnn #1#2#3#4#5
   {
+    \cs_new:cpn { __color_convert_ #2 _ #1 :w } ##1 \s__color_stop {#5}
     \cs_new:cpx { __color_convert_ #1 _ #2 :w } ##1 \s__color_stop
       {
         \exp_not:c { __color_convert_devicen_ #2 : \prg_replicate:nn {#3} { n } w }
@@ -29351,7 +29679,10 @@
   }
 \cs_new_protected:Npn \__color_model_iccbased_aux:nnnnnn #1#2#3#4#5#6
   {
-    \__color_model_init:nnnnn {#5} {#1} { iccbased } {#2} {#3}
+    \__color_model_init:nnnn {#5} {#1} { iccbased } {#3}
+    \tl_const:cn { c__color_fallback_ #5 _tl } { gray }
+    \cs_new:cpn { __color_convert_ #5 _gray:w } ##1 \s__color_stop { 0 }
+    \cs_new:cpn { __color_convert_gray_ #5 :w } ##1 \s__color_stop { #2 }
     \use:c { __color_model_devicen_parse_ #1 :nn } {#5} {#1}
     \exp_args:Nx \__color_backend_iccbased_init:nnn
       { \file_full_name:n {#6} } {#1} {#4}
@@ -34457,47 +34788,6 @@
     {#1}
   }
 %% File: l3deprecation.dtx
-\bool_new:N \l__deprecation_grace_period_bool
-\scan_new:N \s__deprecation_mark
-\scan_new:N \s__deprecation_stop
-\cs_new:Npn \__deprecation_date_compare:nNnTF #1#2#3
-  { \__deprecation_date_compare_aux:w #1 -0-0- \s__deprecation_mark #2 #3 -0-0- \s__deprecation_stop }
-\cs_new:Npn \__deprecation_date_compare_aux:w
-  #1 - #2 - #3 - #4 \s__deprecation_mark #5 #6 - #7 - #8 - #9 \s__deprecation_stop
-  {
-    \int_compare:nNnTF {#1} = {#6}
-      {
-        \int_compare:nNnTF {#2} = {#7}
-          { \int_compare:nNnTF {#3} #5 {#8} }
-          { \int_compare:nNnTF {#2} #5 {#7} }
-      }
-      { \int_compare:nNnTF {#1} #5 {#6} }
-  }
-\bool_new:N \g__kernel_deprecation_undo_recent_bool
-\cs_new_protected:Npn \__deprecation_not_yet_deprecated:nTF #1
-  {
-    \bool_set_false:N \l__deprecation_grace_period_bool
-    \exp_args:No \__deprecation_date_compare:nNnTF { \ExplLoaderFileDate } < {#1}
-      { \use_i:nn }
-      {
-        \exp_args:Nf \__deprecation_date_compare:nNnTF
-          {
-            \exp_after:wN \__deprecation_minus_six_months:w
-            \ExplLoaderFileDate -0-0- \s__deprecation_stop
-          } < {#1}
-          {
-            \bool_set_true:N \l__deprecation_grace_period_bool
-            \bool_if:NTF \g__kernel_deprecation_undo_recent_bool
-          }
-          { \use_ii:nn }
-      }
-  }
-\cs_new:Npn \__deprecation_minus_six_months:w #1 - #2 - #3 - #4 \s__deprecation_stop
-  {
-    \int_compare:nNnTF {#2} > 6
-      { #1 - \int_eval:n { #2 - 6 } - #3 }
-      { \int_eval:n { #1 - 1 } - \int_eval:n { #2 + 6 } - #3 }
-  }
 \cs_new_protected:Npn \__kernel_patch_deprecation:nnNNpn #1#2#3#4#5#
   { \__deprecation_patch_aux:nnNNnn {#1} {#2} #3 #4 {#5} }
 \cs_new_protected:Npn \__deprecation_patch_aux:nnNNnn #1#2#3#4#5#6
@@ -34508,18 +34798,9 @@
         \__kernel_deprecation_error:Nnn #4 {#2} {#1}
       }
       { \tex_let:D #4 \scan_stop: }
-    \__deprecation_not_yet_deprecated:nTF {#1}
-      {
-        \bool_if:nTF
-          {
-            \cs_if_eq_p:NN #3 \cs_gset_protected:Npn &&
-            \__kernel_if_debug:TF
-              { \c_true_bool } { \g__kernel_deprecation_undo_recent_bool }
-          }
-          { \__deprecation_warn_once:nnNnn {#1} {#2} #4 {#5} {#6} }
-          { \__deprecation_patch_aux:Nn #3 { #4 #5 {#6} } }
-      }
-      { \__deprecation_just_error:nnNN {#1} {#2} #3 #4 }
+     \cs_if_eq:NNTF #3 \cs_gset_protected:Npn
+        { \__deprecation_warn_once:nnNnn {#1} {#2} #4 {#5} {#6} }
+        { \__deprecation_patch_aux:Nn #3 { #4 #5 {#6} } }
   }
 \cs_new_protected:Npn \__deprecation_warn_once:nnNnn #1#2#3#4#5
   {
@@ -34547,23 +34828,6 @@
       { \__kernel_deprecation_code:nn { } { \cs_set_protected:Npn #2 } }
       { \__kernel_deprecation_code:nn { } { \cs_set:Npn #2 } }
   }
-\cs_new_protected:Npn \__deprecation_just_error:nnNN #1#2#3#4
-  {
-    \exp_args:NNx \__deprecation_patch_aux:Nn #3
-      {
-        \exp_not:N #4
-        {
-          \cs_if_eq:NNTF #3 \cs_gset_protected:Npn
-            { \exp_not:N \msg_error:nnnnnn }
-            { \exp_not:N \msg_expandable_error:nnnnnn }
-            { deprecation } { deprecated-command }
-            {#1}
-            { \token_to_str:N #4 }
-            { \tl_to_str:n {#2} }
-            { \bool_if:NT \l__deprecation_grace_period_bool { grace } }
-        }
-      }
-  }
 \cs_new_protected:Npn \__kernel_deprecation_error:Nnn #1#2#3
   {
     \tex_protected:D \tex_outer:D \tex_edef:D #1
@@ -34580,13 +34844,6 @@
   {
     \tl_if_blank:nF {#3} { Use~ \tl_trim_spaces:n {#3} ~not~ }
     #2~deprecated~on~#1.
-    \str_if_eq:nnT {#4} { grace }
-      {
-        \c_space_tl
-        For~6~months~after~that~date~one~can~restore~a~deprecated~
-        command~by~loading~the~expl3~package~with~the~option~
-        'undo-recent-deprecations'.
-      }
   }
 \cs_new_protected:Npn \__deprecation_old_protected:Nnn #1#2#3
   {
@@ -34598,9 +34855,13 @@
     \__kernel_patch_deprecation:nnNNpn {#3} {#2}
     \cs_gset:Npn #1 { }
   }
-\__deprecation_old:Nnn \box_resize:Nnn
+\__deprecation_old_protected:Nnn \box_gset_eq_clear:NN
+  { \box_gset_eq_drop:NN } { 2021-07-01 }
+\__deprecation_old_protected:Nnn \box_set_eq_clear:NN
+  { \box_set_eq_drop:NN } { 2021-07-01 }
+\__deprecation_old_protected:Nnn \box_resize:Nnn
   { \box_resize_to_wd_and_ht_plus_dp:Nnn } { 2019-01-01 }
-\__deprecation_old:Nnn \box_use_clear:N
+\__deprecation_old_protected:Nnn \box_use_clear:N
   { \box_use_drop:N } { 2019-01-01 }
 \__deprecation_old:Nnn \c_job_name_tl
   { \c_sys_jobname_str } { 2017-01-01 }
@@ -34652,22 +34913,26 @@
   { 1000 } { 2020-01-01 }
 \__deprecation_old:Nnn \c_ten_thousand
   { 10000 } { 2020-01-01 }
+\__deprecation_old:Nnn \c_term_ior
+  { -1 } { 2021-07-01 }
 \__deprecation_old:Nnn \dim_case:nnn
   { \dim_case:nnF } { 2015-07-14 }
-\__deprecation_old:Nnn \file_add_path:nN
+\__deprecation_old_protected:Nnn \file_add_path:nN
   { \file_get_full_name:nN } { 2019-01-01 }
 \__deprecation_old_protected:Nnn \file_if_exist_input:nT
   { \file_if_exist:nT and~ \file_input:n } { 2018-03-05 }
 \__deprecation_old_protected:Nnn \file_if_exist_input:nTF
   { \file_if_exist:nT and~ \file_input:n } { 2018-03-05 }
-\__deprecation_old:Nnn \file_list:
+\__deprecation_old_protected:Nnn \file_list:
   { \file_log_list: } { 2019-01-01 }
 \__deprecation_old:Nnn \file_path_include:n
   { \seq_put_right:Nn \l_file_search_path_seq } { 2019-01-01 }
-\__deprecation_old:Nnn \file_path_remove:n
+\__deprecation_old_protected:Nnn \file_path_remove:n
   { \seq_remove_all:Nn \l_file_search_path_seq } { 2019-01-01 }
 \__deprecation_old:Nnn \g_file_current_name_tl
   { \g_file_curr_name_str } { 2019-01-01 }
+\__deprecation_old_protected:Nnn \hbox_unpack_clear:N
+  { \hbox_unpack_drop:N  } { 2021-07-01 }
 \__deprecation_old:Nnn \int_case:nnn
   { \int_case:nnF } { 2015-07-14 }
 \__deprecation_old:Nnn \int_from_binary:n
@@ -34684,13 +34949,13 @@
   { \int_to_oct:n } { 2016-01-05 }
 \__deprecation_old_protected:Nnn \ior_get_str:NN
   { \ior_str_get:NN } { 2018-03-05 }
-\__deprecation_old:Nnn \ior_list_streams:
+\__deprecation_old_protected:Nnn \ior_list_streams:
   { \ior_show_list: } { 2019-01-01 }
-\__deprecation_old:Nnn \ior_log_streams:
+\__deprecation_old_protected:Nnn \ior_log_streams:
   { \ior_log_list: } { 2019-01-01 }
-\__deprecation_old:Nnn \iow_list_streams:
+\__deprecation_old_protected:Nnn \iow_list_streams:
   { \iow_show_list: } { 2019-01-01 }
-\__deprecation_old:Nnn \iow_log_streams:
+\__deprecation_old_protected:Nnn \iow_log_streams:
   { \iow_log_list: } { 2019-01-01 }
 \__deprecation_old:Nnn \lua_escape_x:n
   { \lua_escape:e } { 2020-01-01 }
@@ -34764,12 +35029,28 @@
   { \tl_case:cnF } { 2015-07-14 }
 \__deprecation_old:Nnn \tl_case:Nnn
   { \tl_case:NnF } { 2015-07-14 }
+\__deprecation_old_protected:Nnn \tl_gset_from_file:Nnn
+  { \file_get:nnN } { 2021-07-01 }
+\__deprecation_old_protected:Nnn \tl_gset_from_file_x:Nnn
+  { \file_get:nnN } { 2021-07-01 }
+\__deprecation_old_protected:Nnn \tl_set_from_file:Nnn
+  { \file_get:nnN } { 2021-07-01 }
+\__deprecation_old_protected:Nnn \tl_set_from_file_x:Nnn
+  { \file_get:nnN } { 2021-07-01 }
 \__deprecation_old_protected:Nnn \tl_to_lowercase:n
   { \tex_lowercase:D } { 2018-03-05 }
 \__deprecation_old_protected:Nnn \tl_to_uppercase:n
   { \tex_uppercase:D } { 2018-03-05 }
-\__deprecation_old:Nnn \token_new:Nn
+\__deprecation_old:Nnn \token_get_arg_spec:N
+  { \cs_argument_spec:N } { 2021-07-01 }
+\__deprecation_old:Nnn \token_get_prefix_spec:N
+  { \cs_prefix_spec:N } { 2021-07-01 }
+\__deprecation_old:Nnn \token_get_replacement_spec:N
+  { \cs_replacement_spec:N } { 2021-07-01 }
+\__deprecation_old_protected:Nnn \token_new:Nn
   { \cs_new_eq:NN } { 2019-01-01 }
+\__deprecation_old_protected:Nnn \vbox_unpack_clear:N
+  { \vbox_unpack_drop:N  } { 2021-07-01 }
 \__deprecation_old:Nnn \xetex_if_engine_p:
   { \sys_if_engine_xetex_p: } { 2017-01-01 }
 \__deprecation_old:Nnn \xetex_if_engine:F
@@ -34778,22 +35059,95 @@
   { \sys_if_engine_xetex:T } { 2017-01-01 }
 \__deprecation_old:Nnn \xetex_if_engine:TF
   { \sys_if_engine_xetex:TF } { 2017-01-01 }
-\group_begin:
-\cs_set_protected:Npn \ProvidesExplFile
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_lowercase:n }
+\cs_gset:Npn \str_lower_case:n { \str_lowercase:n }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_lowercase:f }
+\cs_gset:Npn \str_lower_case:f { \str_lowercase:f }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_uppercase:n }
+\cs_gset:Npn \str_upper_case:n { \str_uppercase:n }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_uppercase:f }
+\cs_gset:Npn \str_upper_case:f { \str_uppercase:f }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_foldcase:n }
+\cs_gset:Npn \str_fold_case:n { \str_foldcase:n }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_foldcase:V }
+\cs_gset:Npn \str_fold_case:V { \str_foldcase:V }
+\__kernel_patch_deprecation:nnNNpn { 2020-08-20 } { }
+\cs_gset_protected:Npn \str_declare_eight_bit_encoding:nnn #1
+  { \__str_declare_eight_bit_encoding:nnnn {#1} { 1114112 } }
+\__kernel_patch_deprecation:nnNNpn { 2020-06-18 } { \seq_map_indexed_inline:Nn }
+\cs_gset_protected:Npn \seq_indexed_map_inline:Nn { \seq_map_indexed_inline:Nn }
+\__kernel_patch_deprecation:nnNNpn { 2020-06-18 } { \seq_map_indexed_function:NN }
+\cs_gset:Npn \seq_indexed_map_function:NN { \seq_map_indexed_function:NN }
+\__kernel_patch_deprecation:nnNNpn { 2021-01-11 } { (no~longer~required) }
+\cs_gset_protected:Npn \sys_load_deprecation:
   {
-    \char_set_catcode_space:n { `\  }
-    \ProvidesExplFileAux
+    \bool_if:NF \g__str_deprecation_bool
+      { \__kernel_sys_configuration_load:n { l3deprecation } }
+    \bool_gset_true:N \g__str_deprecation_bool
   }
-\cs_set_protected:Npx \ProvidesExplFileAux #1#2#3#4
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \text_lowercase:n }
+\cs_gset:Npn \tl_lower_case:n #1
+  { \text_lowercase:n {#1} }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \text_lowercase:nn }
+\cs_gset:Npn \tl_lower_case:nn #1#2
+  { \text_lowercase:nn {#1} {#2} }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \text_uppercase:n }
+\cs_gset:Npn \tl_upper_case:n #1
+  { \text_uppercase:n {#1} }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \text_uppercase:nn }
+\cs_gset:Npn \tl_upper_case:nn #1#2
+  { \text_uppercase:nn {#1} {#2} }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \text_titlecase:n }
+\cs_gset:Npn \tl_mixed_case:n #1
+  { \text_titlecase:n {#1} }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \text_titlecase:nn }
+\cs_gset:Npn \tl_mixed_case:nn #1#2
+  { \text_titlecase:nn {#1} {#2} }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_lowercase:N }
+\cs_gset:Npn \char_lower_case:N { \char_lowercase:N }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_uppercase:N }
+\cs_gset:Npn \char_upper_case:N { \char_uppercase:N }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_titlecase:N }
+\cs_gset:Npn \char_mixed_case:N { \char_titlecase:N }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_foldcase:N }
+\cs_gset:Npn \char_fold_case:N { \char_foldcase:N }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_str_lowercase:N }
+\cs_gset:Npn \char_str_lower_case:N { \char_str_lowercase:N }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_str_uppercase:N }
+\cs_gset:Npn \char_str_upper_case:N { \char_str_uppercase:N }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_str_titlecase:N }
+\cs_gset:Npn \char_str_mixed_case:N { \char_str_titlecase:N }
+\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \char_str_foldcase:N }
+\cs_gset:Npn \char_str_fold_case:N { \char_str_foldcase:N }
+\tl_map_inline:nn
   {
-    \group_end:
-    \cs_if_exist:NTF \ProvidesFile
-      { \exp_not:N \ProvidesFile {#1} [ #2~v#3~#4 ] }
-      { \iow_log:x { File:~#1~#2~v#3~#4 } }
+    { catcode } { catcode_remove }
+    { charcode } { charcode_remove }
+    { meaning } { meaning_remove }
   }
-\cs_gset_protected:Npn \__kernel_sys_configuration_load:n #1
-  { \file_input:n { #1 .def } }
-\__kernel_sys_configuration_load:n { l3deprecation }
+  {
+    \use:x
+      {
+        \__kernel_patch_deprecation:nnNNpn { 2022-01-11 } { \peek_remove_spaces:n }
+        \cs_gset_protected:Npn \exp_not:c { peek_ #1 _ignore_spaces:NTF } ####1####2####3
+          {
+            \peek_remove_spaces:n
+              { \exp_not:c { peek_ #1 :NTF } ####1 {####2} {####3} }
+          }
+        \__kernel_patch_deprecation:nnNNpn { 2022-01-11 } { \peek_remove_spaces:n }
+        \cs_gset_protected:Npn \exp_not:c { peek_ #1 _ignore_spaces:NT } ####1####2
+          {
+            \peek_remove_spaces:n
+              { \exp_not:c { peek_ #1 :NT } ####1 {####2} }
+          }
+        \__kernel_patch_deprecation:nnNNpn { 2022-01-11 } { \peek_remove_spaces:n }
+        \cs_gset_protected:Npn \exp_not:c { peek_ #1 _ignore_spaces:NF } ####1####2
+          {
+            \peek_remove_spaces:n
+              { \exp_not:c { peek_ #1 :NF } ####1 {####2} }
+          }
+      }
+  }
 %% 
 %%
 %% End of file `expl3-code.tex'.

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% expl3.dtx  (with options: `generic,loader')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2021-11-22}%
+\def\ExplFileDate{2022-01-12}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\_=11

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% expl3.dtx  (with options: `2ekernel,loader')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2021-11-22}%
+\def\ExplFileDate{2022-01-12}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\_=11
@@ -100,11 +100,7 @@
     suppress-backend-headers .bool_gset_inverse:N
       = \g__kernel_backend_header_bool ,
     suppress-backend-headers .initial:n = false ,
-    undo-recent-deprecations .code:n =
-      {
-        \bool_gset_true:N \g__kernel_deprecation_undo_recent_bool
-        \sys_load_deprecation:
-      }
+    undo-recent-deprecations .code:n = {} % A stub
   }
 \cs_if_exist:NF \@expl at sys@load at backend@@
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.lua
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.lua	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.lua	2022-01-12 21:22:19 UTC (rev 61588)
@@ -10,7 +10,7 @@
 -- l3token.dtx  (with options: `package,lua')
 -- l3intarray.dtx  (with options: `package,lua')
 -- 
--- Copyright (C) 1990-2021 The LaTeX Project
+-- Copyright (C) 1990-2022 The LaTeX Project
 -- 
 -- It may be distributed and/or modified under the conditions of
 -- the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -23,8 +23,6 @@
 -- and all files in that bundle must be distributed together.
 -- 
 -- File: l3luatex.dtx
-l3kernel = l3kernel or { }
-local l3kernel = l3kernel
 ltx = ltx or {utils={}}
 ltx.utils = ltx.utils or { }
 local ltxutils = ltx.utils
@@ -88,35 +86,11 @@
     return id_map[name]
   end
 end
-local function deprecated(table, name, func)
-  table[name] = function(...)
-    write_nl(format("Calling deprecated Lua function %s", name))
-    table[name] = func
-    return func(...)
-  end
-end
 local kpse_find = (resolvers and resolvers.findfile) or kpse.find_file
 local function escapehex(str)
   return (gsub(str, ".",
     function (ch) return format("%02X", byte(ch)) end))
 end
-deprecated(l3kernel, 'charcat', function(charcode, catcode)
-  cprint(catcode, utf8_char(charcode))
-end)
-local os_clock   = os.clock
-local base_clock_time = 0
-local function elapsedtime()
-  local val = (os_clock() - base_clock_time) * 65536 + 0.5
-  if val > 2147483647 then
-    val = 2147483647
-  end
-  write(format("%d",floor(val)))
-end
-l3kernel.elapsedtime = elapsedtime
-local function resettimer()
-  base_clock_time = os_clock()
-end
-l3kernel.resettimer = resettimer
 local function filedump(name,offset,length)
   local file = kpse_find(name,"tex",true)
   if not file then return end
@@ -130,12 +104,6 @@
   return escapehex(data)
 end
 ltxutils.filedump = filedump
-deprecated(l3kernel, "filedump", function(name, offset, length)
-  local dump = filedump(name, tonumber(offset), tonumber(length))
-  if dump then
-    write(dump)
-  end
-end)
 local md5_HEX = md5.HEX
 if not md5_HEX then
   local md5_sum = md5.sum
@@ -153,12 +121,6 @@
   return md5_HEX(data)
 end
 ltxutils.filemd5sum = filemd5sum
-deprecated(l3kernel, "filemdfivesum", function(name)
-  local hash = filemd5sum(name)
-  if hash then
-    write(hash)
-  end
-end)
 local filemoddate
 if os_date'%z':match'^[+-]%d%d%d%d$' then
   local pattern = lpeg.Cs(16 *
@@ -212,12 +174,6 @@
   end
 end
 ltxutils.filemoddate = filemoddate
-deprecated(l3kernel, "filemoddate", function(name)
-  local hash = filemoddate(name)
-  if hash then
-    write(hash)
-  end
-end)
 local function filesize(name)
   local file = kpse_find(name, "tex", true)
   if file then
@@ -228,32 +184,6 @@
   end
 end
 ltxutils.filesize = filesize
-deprecated(l3kernel, "filesize", function(name)
-  local size = filesize(name)
-  if size then
-    write(size)
-  end
-end)
-deprecated(l3kernel, "strcmp", function (A, B)
-  if A == B then
-    write("0")
-  elseif A < B then
-    write("-1")
-  else
-    write("1")
-  end
-end)
-local os_exec    = os.execute
-deprecated(l3kernel, "shellescape", function(cmd)
-  local status,msg = os_exec(cmd)
-  if status == nil then
-    write_nl("log","runsystem(" .. cmd .. ")...(" .. msg .. ")\n")
-  elseif status == 0 then
-    write_nl("log","runsystem(" .. cmd .. ")...executed\n")
-  else
-    write_nl("log","runsystem(" .. cmd .. ")...failed " .. (msg or "") .. "\n")
-  end
-end)
 local luacmd do
   local set_lua = token.set_lua
   local undefined_cs = command_id'undefined_cs'

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% expl3.dtx  (with options: `package,loader')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2021-11-22}%
+\def\ExplFileDate{2022-01-12}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%
@@ -123,11 +123,7 @@
     suppress-backend-headers .bool_gset_inverse:N
       = \g__kernel_backend_header_bool ,
     suppress-backend-headers .initial:n = false ,
-    undo-recent-deprecations .code:n =
-      {
-        \bool_gset_true:N \g__kernel_deprecation_undo_recent_bool
-        \sys_load_deprecation:
-      }
+    undo-recent-deprecations .code:n = {} % A stub
   }
 \cs_if_exist:NF \@expl at sys@load at backend@@
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3debug.dtx  (with options: `package')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Deleted: trunk/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -1,78 +0,0 @@
-%%
-%% This is file `l3deprecation.def',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% l3deprecation.dtx  (with options: `package,patches')
-%% 
-%% Copyright (C) 1990-2021 The LaTeX 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:
-%% 
-%%    https://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.
-%% 
-%% File: l3deprecation.dtx
-\ProvidesExplFile{l3deprecation.def}{2019-04-06}{}{L3 Deprecated functions}
-\__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 }
-\cs_gset:Npn \str_lower_case:f { \str_lowercase:f }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \str_uppercase:n }
-\cs_gset:Npn \str_upper_case:n { \str_uppercase:n }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \str_uppercase:f }
-\cs_gset:Npn \str_upper_case:f { \str_uppercase:f }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \str_foldcase:n }
-\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 { 2022-01-01 } { }
-\cs_gset_protected:Npn \str_declare_eight_bit_encoding:nnn #1
-  { \__str_declare_eight_bit_encoding:nnnn {#1} { 1114112 } }
-\__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 }
-\cs_gset:Npn \seq_indexed_map_function:NN { \seq_map_indexed_function:NN }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_lowercase:n }
-\cs_gset:Npn \tl_lower_case:n #1
-  { \text_lowercase:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_lowercase:nn }
-\cs_gset:Npn \tl_lower_case:nn #1#2
-  { \text_lowercase:nn {#1} {#2} }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_uppercase:n }
-\cs_gset:Npn \tl_upper_case:n #1
-  { \text_uppercase:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_uppercase:nn }
-\cs_gset:Npn \tl_upper_case:nn #1#2
-  { \text_uppercase:nn {#1} {#2} }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_titlecase:n }
-\cs_gset:Npn \tl_mixed_case:n #1
-  { \text_titlecase:n {#1} }
-\__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 { 2022-01-01 } { \char_lowercase:N }
-\cs_gset:Npn \char_lower_case:N { \char_lowercase:N }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \char_uppercase:N }
-\cs_gset:Npn \char_upper_case:N { \char_uppercase:N }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \char_titlecase:N }
-\cs_gset:Npn \char_mixed_case:N { \char_titlecase:N }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \char_foldcase:N }
-\cs_gset:Npn \char_fold_case:N { \char_foldcase:N }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \char_str_lowercase:N }
-\cs_gset:Npn \char_str_lower_case:N { \char_str_lowercase:N }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \char_str_uppercase:N }
-\cs_gset:Npn \char_str_upper_case:N { \char_str_uppercase:N }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \char_str_titlecase:N }
-\cs_gset:Npn \char_str_mixed_case:N { \char_str_titlecase:N }
-\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \char_str_foldcase:N }
-\cs_gset:Npn \char_str_fold_case:N { \char_str_foldcase:N }
-%% 
-%%
-%% End of file `l3deprecation.def'.

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3doc.dtx  (with options: `class')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -375,8 +375,6 @@
     ':'~hence~it~is~not~clear~where~to~add~'_p'~or~'TF'.~
     Please~follow~expl3~naming~conventions.
   }
-\msg_new:nnn { l3doc } { deprecated-function }
-  { The~deprecated~function(s)~'#1'~should~have~been~removed~on~#2. }
 \msg_new:nnn { l3doc } { date-format }
   { The~date~'#1'~should~be~given~in~YYYY-MM-DD~format. }
 \msg_new:nnn { l3doc } { future-date }
@@ -998,7 +996,7 @@
       } ,
     added .code:n = { \__codedoc_date_set_past:Nn \l__codedoc_date_added_tl {#1} },
     updated .code:n = { \__codedoc_date_set_past:Nn \l__codedoc_date_updated_tl {#1} } ,
-    deprecated .code:n = { \__codedoc_deprecated_on:n {#1} } ,
+    deprecated .code:n = {} , % A stub
     tested .code:n = { } ,
     label .code:n =
       {
@@ -1030,19 +1028,6 @@
           {#1}
       }
   }
-\cs_new_protected:Npn \__codedoc_deprecated_on:n #1
-  {
-    \__codedoc_date_set:Nn \l__codedoc_tmpa_tl {#1}
-    \exp_args:No \__codedoc_date_compare:nNnT
-      { \l__codedoc_tmpa_tl } < { \c_sys_year_int - \c_sys_month_int - \c_sys_day_int }
-      {
-        \msg_error:nnxx { l3doc } { deprecated-function }
-          { \tl_to_str:N \l__codedoc_macro_argument_tl }
-          { \l__codedoc_tmpa_tl }
-      }
-    \bool_set_true:N \l__codedoc_macro_internal_bool
-    \bool_set_true:N \l__codedoc_macro_internal_set_bool
-  }
 \cs_new_protected:Npn \__codedoc_function:nnw #1#2
   {
     \__codedoc_function_typeset_start:
@@ -1346,7 +1331,7 @@
       } ,
     added .code:n = {} , % TODO
     updated .code:n = {} , % TODO
-    deprecated .code:n = { \__codedoc_deprecated_on:n {#1} } ,
+    deprecated .code:n = {} , % A stub
     verb .bool_set:N = \l__codedoc_names_verb_bool ,
     module .tl_set:N = \l__codedoc_override_module_tl ,
     documented-as .tl_set:N = \l__codedoc_macro_documented_tl ,

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3docstrip.dtx  (with options: `program')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88591.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88591.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88591.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3str-convert.dtx  (with options: `iso88591')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885910.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885910.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885910.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3str-convert.dtx  (with options: `iso885910')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885911.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885911.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885911.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3str-convert.dtx  (with options: `iso885911')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885913.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885913.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885913.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3str-convert.dtx  (with options: `iso885913')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885914.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885914.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885914.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3str-convert.dtx  (with options: `iso885914')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885915.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885915.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885915.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3str-convert.dtx  (with options: `iso885915')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885916.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885916.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885916.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3str-convert.dtx  (with options: `iso885916')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88592.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88592.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88592.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3str-convert.dtx  (with options: `iso88592')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88593.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88593.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88593.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3str-convert.dtx  (with options: `iso88593')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88594.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88594.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88594.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3str-convert.dtx  (with options: `iso88594')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88595.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88595.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88595.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3str-convert.dtx  (with options: `iso88595')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88596.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88596.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88596.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3str-convert.dtx  (with options: `iso88596')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88597.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88597.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88597.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3str-convert.dtx  (with options: `iso88597')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88598.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88598.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88598.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3str-convert.dtx  (with options: `iso88598')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88599.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88599.def	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88599.def	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3str-convert.dtx  (with options: `iso88599')
 %% 
-%% Copyright (C) 1990-2021 The LaTeX Project
+%% Copyright (C) 1990-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% l3keys2e.dtx  (with options: `package')
 %% 
-%% Copyright (C) 2009-2021 The LaTeX Project
+%% Copyright (C) 2009-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3keys2e}{2021-11-12}{}
+\ProvidesExplPackage{l3keys2e}{2022-01-12}{}
   {LaTeX2e option processing using LaTeX3 keys}
 \cs_if_exist:NT \ProcessKeysOptions
   { \file_input_stop: }

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% xfp.dtx  (with options: `package')
 %% 
-%% Copyright (C) 2017-2021 The LaTeX Project
+%% Copyright (C) 2017-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -32,10 +32,10 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xfp}{2021-11-12}{}
+\ProvidesExplPackage{xfp}{2022-01-12}{}
   {L3 Floating point unit}
-\NewExpandableDocumentCommand \fpeval { m } { \fp_eval:n {#1} }
-\NewExpandableDocumentCommand \inteval { m } { \int_eval:n {#1} }
+\ProvideExpandableDocumentCommand \fpeval { m } { \fp_eval:n {#1} }
+\ProvideExpandableDocumentCommand \inteval { m } { \int_eval:n {#1} }
 %% 
 %%
 %% End of file `xfp.sty'.

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty	2022-01-12 21:22:19 UTC (rev 61588)
@@ -7,7 +7,7 @@
 %% xfrac.dtx  (with options: `package')
 %% 
 %% Copyright (C) 2004,2008-2010 Morten Hoegholm
-%%           (C) 2011-2021 The LaTeX Project
+%%           (C) 2011-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -34,7 +34,7 @@
     \endinput
   }
 \RequirePackage{amstext,graphicx,l3keys2e,textcomp,xparse,xtemplate}
-\ProvidesExplPackage{xfrac}{2021-11-12}{}
+\ProvidesExplPackage{xfrac}{2022-01-12}{}
   {L3 Experimental split-level fractions}
 \keys_define:nn { xfrac }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.ltx	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.ltx	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% xparse.dtx  (with options: `2ekernel')
 %% 
-%% Copyright (C) 2009-2021 The LaTeX Project
+%% Copyright (C) 2009-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% xparse.dtx  (with options: `package')
 %% 
-%% Copyright (C) 2009-2021 The LaTeX Project
+%% Copyright (C) 2009-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -60,7 +60,7 @@
       }
   }
 \ExplSyntaxOff
-\ProvidesExplPackage{xparse}{2021-11-12}{}
+\ProvidesExplPackage{xparse}{2022-01-12}{}
   {L3 Experimental document command parser}
 \clist_new:N \l__cmd_options_clist
 \DeclareOption* { \clist_put_right:NV \l__cmd_options_clist \CurrentOption }

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2022-01-12 21:19:46 UTC (rev 61587)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2022-01-12 21:22:19 UTC (rev 61588)
@@ -6,7 +6,7 @@
 %%
 %% xtemplate.dtx  (with options: `package')
 %% 
-%% Copyright (C) 2011-2021 The LaTeX Project
+%% Copyright (C) 2011-2022 The LaTeX Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xtemplate}{2021-11-12}{}
+\ProvidesExplPackage{xtemplate}{2022-01-12}{}
   {L3 Experimental prototype document functions}
 \tl_const:Nn \c__xtemplate_code_root_tl      { template~code~>~ }
 \tl_const:Nn \c__xtemplate_defaults_root_tl  { template~defaults~>~ }



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