summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/biblatex-ms/latex/biblatex-ms.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/biblatex-ms/latex/biblatex-ms.sty')
-rw-r--r--macros/latex/contrib/biblatex-ms/latex/biblatex-ms.sty17802
1 files changed, 17802 insertions, 0 deletions
diff --git a/macros/latex/contrib/biblatex-ms/latex/biblatex-ms.sty b/macros/latex/contrib/biblatex-ms/latex/biblatex-ms.sty
new file mode 100644
index 0000000000..560628f8d2
--- /dev/null
+++ b/macros/latex/contrib/biblatex-ms/latex/biblatex-ms.sty
@@ -0,0 +1,17802 @@
+% Copyright (c) 2006-2011 Philipp Lehman.
+% 2012-2017 Philip Kime, Audrey Boruvka, Joseph Wright
+% 2018- Philip Kime, Moritz Wemheuer
+%
+% Permission is granted to copy, distribute and/or modify this
+% software under the terms of the LaTeX Project Public License
+% (LPPL), version 1.3c.
+%
+% This software is provided 'as is', without warranty of any kind,
+% either expressed or implied, including, but not limited to, the
+% implied warranties of merchantability and fitness for a
+% particular purpose.
+
+% Set up the version strings here
+\def\abx@date{2022/08/21}
+\def\abx@version{4.0}
+\def\abx@bbxid{\abx@date\space v\abx@version\space biblatex bibliography style (PK/MW)}
+\def\abx@cbxid{\abx@date\space v\abx@version\space biblatex citation style (PK/MW)}
+\def\abx@lbxid{\abx@date\space v\abx@version\space biblatex localization (PK/MW)}
+\def\abx@cptid{\abx@date\space v\abx@version\space biblatex compatibility (PK/MW)}
+
+% This is not updated by build script as the control file version
+% does not necessarily change with the package version.
+% This is used when writing the .bcf
+\def\blx@bcfversion{4.0}
+
+% This is not updated by build script as the bbl version
+% does not necessarily change with the package version.
+% This is used when checking the .bbl
+\def\blx@bblversion{4.0}
+
+% Postfix for biblatex internal files in case this version is supposed to be installed
+% in parallel with a standard biblatex installation. This postfix will be appended to
+% all searched for files like this:
+%
+% <filename><postfix>.<extension>
+%
+% If a file with this name is found it will be used, otherwise the filename
+% without the postfix will be used. Normally, this will be empty.
+% The build script will normally put something in here before packaging or install
+% rather than it being set manually
+\def\abx@filespf{-ms}
+
+
+\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+\ProvidesPackage{biblatex-ms}
+[\abx@date\space v\abx@version\space programmable bibliographies (PK/MW)]
+
+%% Dependencies
+\RequirePackage{pdftexcmds}[2018/01/30]
+\RequirePackage{etoolbox}
+\RequirePackage{keyval}
+\RequirePackage{kvoptions}
+\RequirePackage{logreq}
+\RequirePackage{ifthen}
+\RequirePackage{url}
+\RequirePackage{xparse}
+%\RequirePackage{trace}
+
+% pretend we're the real biblatex
+\ifcsundef{ver@biblatex.sty}
+ {\cslet{ver@biblatex.sty}\abx@date}
+ {}
+
+% Turn off xparse redefine warnings as we do this a lot
+\ExplSyntaxOn
+ \msg_redirect_name:nnn { LaTeX } { xparse / redefine-command } { none }
+\ExplSyntaxOff
+
+% Globals holding the name of the filename being resolved
+% Better to have globals to avoid messy localisation code
+% as these are used in heavily nested macros
+\let\blx@fnext\@empty
+\let\blx@fnnoext\@empty
+
+\@ifpackagelater{etoolbox}{2010/11/29}
+ {}
+ {\PackageError{biblatex}
+ {Outdated 'etoolbox' package}
+ {Upgrade to etoolbox v2.1 (2010/11/29) or later.\MessageBreak
+ I found: '\csuse{ver@etoolbox.sty}'.\MessageBreak
+ This is a fatal error. I'm aborting now}%
+ \endinput}
+
+% The new hook management system in LaTeX 2020-10-01 and above
+% no longer guarantees that \AtBeginDocument/AfterPreamble
+% are executed in order of use.
+% Instead each use of those commands gets a 'label'
+% and code for the same label is chunked together.
+% We give our \AfterPreamble invocations a new label and set up a rule to
+% have it executed after all normal biblatex \AtBeginDocument stuff.
+% Note that begindocument is a one-time hook, so we are guaranteed
+% immediate execution when inside \begin{document}...\end{document}.
+\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+\IfFormatAtLeastTF{2020/10/01}
+ {\def\blx@AfterPreamble{\AddToHook{begindocument}[biblatex/afterpreamble]}%
+ \DeclareHookRule{begindocument}{biblatex/afterpreamble}{after}{biblatex}%
+ \def\blx@AtEndDocument{\AddToHook{enddocument/afterlastpage}}}
+ {\def\blx@AfterPreamble{\AfterPreamble}%
+ \def\blx@AtEndDocument{\AtEndDocument}}
+
+% generalised keyval interface
+% define a new key (possibly with a default value)
+% {<family>}{<key>}[<default>]{<code>}
+\providerobustcmd*{\blx@kv@defkey}{\define@key}
+
+% globally define new key (should only be the last resort)
+% {<family>}{<key>}[<default>]{<code>}
+\providerobustcmd*{\blx@kv@gdefkey}[2]{%
+ \@ifnextchar[%
+ {\blx@kv@gdefkey@default{#1}{#2}}
+ {\blx@kv@gdefkey@nodefault{#1}{#2}}}
+
+\ifundef\blx@kv@gdefkey@nodefault
+ {\protected\def\blx@kv@gdefkey@nodefault#1#2{\csgdef{KV@#1@#2}##1}}
+ {}
+\ifundef\blx@kv@gdefkey@default
+ {\protected\def\blx@kv@gdefkey@default#1#2[#3]{%
+ \csgdef{KV@#1@#2@default}{\csuse{KV@#1@#2}{#3}}%
+ \csgdef{KV@#1@#2}##1}}
+ {}
+
+% test if key is undefined
+% {<family>}{<key>}{<true>}{<false>}
+\providecommand*{\blx@kv@ifkeyundef}[2]{%
+ \ifcsundef{KV@#1@#2}}
+
+% undefine key
+% {<family>}{<key>}
+\providerobustcmd*{\blx@kv@undef}[2]{\csundef{KV@#1@#2}}
+
+% {<family>}{<key-vals>}
+\providerobustcmd*{\blx@kv@setkeys}{\setkeys}
+
+%% Category codes
+
+\def\blx@docatcodes{%
+ \do\=\do\<\do\>\do\-\do\"\do\'\do\`\do\.%
+ \do\,\do\;\do\:\do\!\do\?\do\/}
+\def\do#1{\catcode\number`#1=\the\catcode`#1\relax}
+\edef\blx@catcodes{\blx@docatcodes\do\^\do\~\do\&\do\|}
+\let\do\noexpand
+
+\def\blx@saneccodes{%
+ \catcode`\~=\active
+ \let\do\@makeother
+ \blx@docatcodes
+ \let\do\noexpand}
+
+\blx@saneccodes
+\catcode`\&=3
+\catcode`\|=3
+\catcode`\^=7
+\def\blx@nl{^^J}
+
+\protected\def\blx@safe@actives{%
+ \let\blx@if@safe@actives\if@safe@actives
+ \let\if@safe@actives\iftrue}
+
+\protected\def\blx@rest@actives{%
+ \let\if@safe@actives\blx@if@safe@actives}
+
+%% Early errors and warnings
+\protected\def\blx@error#1#2{%
+ \begingroup
+ \blx@safe@actives
+ \PackageError{biblatex}{#1}{#2.}%
+ \endgroup}
+
+\protected\def\blx@warning@noline#1{%
+ \begingroup
+ \blx@safe@actives
+ \PackageWarningNoLine{biblatex}{#1}%
+ \endgroup}
+\let\blx@warning\blx@warning@noline
+\AtEndOfPackage{%
+ \protected\def\blx@warning#1{%
+ \begingroup
+ \blx@safe@actives
+ \PackageWarning{biblatex}{#1}%
+ \endgroup}}
+
+\def\blx@err@patch#1{%
+ \blx@error
+ {Patching #1 failed}
+ {This is an internal issue typically caused by a
+ conflict\MessageBreak between biblatex and some
+ other package. Modifying\MessageBreak the package
+ loading order may fix the problem}}
+
+%% Compatibility
+% this hook is executed once at the beginning of loading the package
+% just a few lines down
+% and again later in an \AtEndPreamble hook
+\def\blx@packageincompatibility{%
+ \def\do##1{%
+ \@ifpackageloaded{##1}
+ {\ifcsundef{blx@pkgloaded@##1}
+ {\global\cslet{blx@pkgloaded@##1}\@empty
+ \blx@error
+ {Incompatible package '##1'}
+ {The '##1' package and biblatex are incompatible}}
+ {}}
+ {}}%
+ \docsvlist{%
+ amsrefs,apacite,babelbib,backref,bibtopic,bibunits,chapterbib,
+ cite,citeref,drftcite,footbib,inlinebib,jurabib,mcite,mciteplus,
+ mlbib,multibbl,multibib,natbib,opcit,overcite,splitbib,ucs}%
+ % etextools is special, it gets an option to demote the error to a warning
+ % remind people to restore \forlistloop
+ \ifcsdef{blx@noerroretextools}
+ {\@ifpackageloaded{etextools}
+ {\ifcsundef{blx@pkgloaded@etextools}
+ {\global\cslet{blx@pkgloaded@etextools}\@empty
+ \blx@warning@noline{%
+ Incompatible package 'etextools' loaded,\MessageBreak
+ no error is thrown because you defined\MessageBreak
+ '\string\blx@noerroretextools'.\MessageBreak
+ 'etextools' redefines '\string\forlistloop', you must\MessageBreak
+ restore the definition from 'etoolbox'\MessageBreak
+ before you load biblatex}}
+ {}}
+ {}}
+ {\@ifpackageloaded{etextools}
+ {\ifcsundef{blx@pkgloaded@etextools}
+ {\global\cslet{blx@pkgloaded@etextools}\@empty
+ \blx@error
+ {Incompatible package 'etextools'}
+ {The 'etextools' package and biblatex are
+ incompatible.\MessageBreak
+ If you must load 'etextools' at all costs, define the command%
+ \MessageBreak '\string\blx@noerroretextools'}}
+ {}}
+ {}}}
+
+% Call this right here, almost immediately after loading to give sensible
+% errors for incompatibilities that arise at loading-time.
+% The macro is called again a second time in \AtEndPreamble when all packages
+% should be loaded.
+% This still can't catch all cases, \usepackage{biblatex}\usepackage{natbib}
+% still gives a weird error.
+\blx@packageincompatibility
+
+% this part is only executed now
+\@ifpackageloaded{polyglossia}
+ {\global\cslet{blx@pkgloaded@polyglossia}\@empty}
+ {}
+
+\@ifpackageloaded{inputenc}
+ {\global\cslet{blx@pkgloaded@inputenc}\@empty}
+ {}
+
+\@ifpackageloaded{inputenx}
+ {\global\cslet{blx@pkgloaded@inputenx}\@empty}
+ {}
+
+% this part is deferred to \AtEndPreamble
+\def\blx@packageincompatibility@endpreambleonly{%
+ % people should not be abusing noerroretextools,
+ % so warn if it is not needed
+ \ifcsdef{blx@noerroretextools}
+ {\@ifpackageloaded{etextools}
+ {}
+ {\blx@warning@noline{%
+ You defined '\string\blx@noerroretextools',\MessageBreak
+ but 'etextools' is not loaded.\MessageBreak
+ Please do not define '\string\blx@noerroretextools'\MessageBreak
+ unless you really need it}}}
+ {}%
+ \@ifpackageloaded{inputenc}
+ {\ifcsundef{blx@pkgloaded@inputenc}
+ {\blx@warning@noline{Load 'inputenc' before biblatex}}
+ {}}
+ {}%
+ \@ifpackageloaded{inputenx}
+ {\ifcsundef{blx@pkgloaded@inputenx}
+ {}
+ {\blx@warning@noline{Load 'inputenx' before biblatex}}
+ {}}
+ {}%
+ % polyglossia pretends to be babel, so the nested structure helps
+ % to make sure that babel really is babel
+ \@ifpackageloaded{polyglossia}
+ {\ifcsundef{blx@pkgloaded@polyglossia}
+ {\blx@error
+ {'polyglossia' loaded after biblatex}
+ {'polyglossia' must be loaded before biblatex}}
+ {}%
+ \@ifpackagelater{polyglossia}{2020/04/08}
+ {}
+ {\blx@warning@noline
+ {biblatex works best with 'polyglossia' 1.49\MessageBreak
+ or above.\MessageBreak
+ Please update 'polyglossia' to v1.49 (2020/04/08)\MessageBreak
+ or later.\MessageBreak
+ Variant detection will not work properly with\MessageBreak
+ older versions}}}
+ {\@ifpackageloaded{babel}
+ {\@ifpackagelater{babel}{2016/04/23}
+ {}
+ {\blx@error
+ {Outdated 'babel' package}
+ {Upgrade to babel 3.9r (2016/04/23) or later.\MessageBreak
+ I found: '\csuse{ver@babel.sty}'.\MessageBreak
+ This is a fatal error. I'm aborting now}%
+ \endinput}}
+ {}}}
+
+\begingroup
+\catcode`\#=12
+\gdef\blx@patchbidifootnotes{%
+ \patchcmd\@footnotetext
+ {#1}
+ {\toggletrue{blx@footnote}#1}
+ {\togglefalse{blx@tempa}}
+ {}%
+ \patchcmd\@LTRfootnotetext
+ {#1}
+ {\toggletrue{blx@footnote}#1}
+ {\togglefalse{blx@tempa}}
+ {}%
+ \patchcmd\@RTLfootnotetext
+ {#1}
+ {\toggletrue{blx@footnote}#1}
+ {\togglefalse{blx@tempa}}
+ {}}
+\endgroup
+
+\AtEndPreamble{%
+ \blx@packageincompatibility
+ \blx@packageincompatibility@endpreambleonly
+ \ifnum\blx@hyperref=\thr@@
+ \else
+ \ifnum\blx@hyperref=\z@
+ \blx@mknohyperref
+ \else
+ \@ifpackageloaded{hyperref}
+ {\blx@mkhyperref}
+ {\ifnum\blx@hyperref=\@ne
+ \blx@warning@noline{%
+ Missing 'hyperref' package.\MessageBreak
+ Setting 'hyperref=false'}%
+ \fi
+ \blx@mknohyperref}%
+ \fi
+ \undef\blx@mkhyperref
+ \undef\blx@mknohyperref
+ \fi
+ \providecommand*{\nolinkurl}{\url}%
+ \ifundef\TE@hook
+ {\let\TE@hook\@empty
+ \toggletrue{blx@tempa}%
+ \def\do#1{%
+ \patchcmd#1%
+ {\let\isundefined\TE@undef}
+ {\let\isundefined\TE@undef\TE@hook}
+ {\togglefalse{blx@tempa}\listbreak}
+ {}}%
+ \docsvlist{%
+ \ifthenelse,% ifthen
+ \org@ifthenelse,% babel
+ \HyOrg@ifthenelse,% hyperref
+ \NROrg@ifthenelse}% nameref
+ \iftoggle{blx@tempa}
+ {\blx@err@patch{'ifthen' package}}
+ {}}
+ {}%
+ \appto\TE@hook{\blx@TE@hook}%
+ % we need to patch \addtocontents
+ \toggletrue{blx@tempa}%
+ % kernel definition
+ \patchcmd\addtocontents
+ {\let\glossary\@gobble}
+ {\let\glossary\@gobble
+ \blx@contentssafe@citecommands}
+ {}
+ {\togglefalse{blx@tempa}}%
+ % try tag.sto's definition
+ \iftoggle{blx@tempa}
+ {}
+ {\patchcmd\addtocontents
+ {\let\glossary\Gobble}
+ {\let\glossary\Gobble
+ \blx@contentssafe@citecommands}
+ {}
+ {% give up
+ \blx@err@patch{\string\addtocontents}}}%
+ % patch footnote
+ \toggletrue{blx@tempa}%
+ \def\do#1{%
+ \patchcmd#1%
+ {\color@begingroup}
+ {\color@begingroup\toggletrue{blx@footnote}}
+ {\togglefalse{blx@tempa}\listbreak}
+ {}}%
+ \docsvlist{%
+ \@footnotetext,% latex
+ \H@@footnotetext,% hyperref
+ \V@@footnotetext,% fancyvrb
+ \scr@saved@footnotetext,% koma-script 3.x
+ \l@dold@footnotetext,% ledmac
+ \l@doldold@footnotetext,% ledmac
+ \predefinedfootnotetext,% linguex
+ \@fntORI}% frenchle
+ \iftoggle{blx@tempa}% ams classes ...
+ {\def\do#1{%
+ \patchcmd#1
+ {\@makefntext}
+ {\toggletrue{blx@footnote}\@makefntext}
+ {\togglefalse{blx@tempa}}
+ {}}%
+ \docsvlist{\@footnotetext,% ams classes standard
+ \H@@footnotetext}}% hyperref
+ {}%
+ \@ifpackageloaded{bidi}% bidi
+ {\blx@patchbidifootnotes}
+ {}%
+ \@ifclassloaded{memoir}
+ {\def\do#1{%
+ \patchcmd#1%
+ {\color@begingroup}
+ {\color@begingroup\toggletrue{blx@footnote}}
+ {}
+ {}}%
+ \docsvlist{%
+ \m@mold@footnotetext,%
+ \@plainfootnotetext,%
+ \@twocolfootnotetext,%
+ \@threecolfootnotetext,%
+ \@parafootnotetext}%
+ \def\do#1{%
+ \patchcmd#1%
+ {\color@begingroup\@makefntext}
+ {\color@begingroup\toggletrue{blx@footnote}\@makefntext}
+ {}
+ {}}%
+ \docsvlist{%
+ \@footnotetext,% patch twice
+ \H@@footnotetext,% patch twice
+ \@plainfootnotetext}}
+ {}%
+ \@ifclassloaded{beamer}
+ {\expandafter\patchcmd\csname beamerx@\string\beamer@framefootnotetext\endcsname
+ {\color@begingroup}
+ {\color@begingroup\toggletrue{blx@footnote}}
+ {\togglefalse{blx@tempa}}
+ {}%
+ \expandafter\patchcmd\csname beamerx@\string\@mpfootnotetext\endcsname
+ {\color@begingroup}
+ {\color@begingroup\toggletrue{blx@footnote}}
+ {}
+ {}}
+ {}%
+ \iftoggle{blx@tempa}
+ {\blx@warning@noline{%
+ Patching footnotes failed.\MessageBreak
+ Footnote detection will not work}}
+ {}%
+ \def\do#1{%
+ \patchcmd#1%
+ {\color@begingroup}
+ {\color@begingroup\toggletrue{blx@footnote}}
+ {\listbreak}
+ {}}%
+ \docsvlist{%
+ \@mpfootnotetext,% minipages
+ \H@@mpfootnotetext}% hyperref minipages
+ \@ifpackageloaded{endnotes}
+ {\patchcmd\theendnotes
+ {\enoteformat}
+ {\toggletrue{blx@footnote}\enoteformat}
+ {}
+ {\blx@err@patch{'endnotes' package}}}
+ {}%
+ \@ifpackageloaded{bigfoot}
+ {\apptocmd\@makefnstartbox
+ {\toggletrue{blx@footnote}}
+ {}
+ {\blx@err@patch{'bigfoot' package}}}
+ {}%
+ \@ifpackageloaded{showkeys}
+ {\ifdef\SK@
+ {\AtEveryBibitem{\SK@\SK@@label{\thefield{entrykey}}}%
+ \AtEveryLositem{\SK@\SK@@label{\thefield{entrykey}}}%
+ \ifundef\SK@cite % = 'notcite' disabled
+ {\AtEveryCitekey{\SK@\SK@@ref{\thefield{entrykey}}}}
+ {}}
+ {}}
+ {}%
+ \iftoggle{blx@trackfloats}
+ {}
+ {\apptocmd\@floatboxreset
+ {\boolfalse{citetracker}%
+ \boolfalse{pagetracker}}
+ {}
+ {\blx@err@patch{floats}}}%
+ \iftoggle{blx@backreffloats}
+ {}
+ {\apptocmd\@floatboxreset
+ {\boolfalse{backtracker}}
+ {}
+ {\blx@err@patch{floats}}}%
+ \ifdef\TX@endtabularx % tabularx/memoir
+ {\pretocmd\TX@endtabularx
+ {\addtocounter{tabx@nest}{1}}% track nested tabularx environments
+ {}
+ {\blx@err@patch{'tabularx'}}%
+ % no need to conditionalise on top-level tabx as the search/replace
+ % will only match once anyway
+ \patchcmd\TX@endtabularx
+ {\edef\TX@ckpt{\cl@@ckpt}}
+ {\edef\TX@ckpt{\cl@@ckpt\abx@resttrackers}%
+ \abx@savetrackers}
+ {}
+ {\blx@err@patch{'tabularx'}}%
+ \apptocmd\TX@endtabularx
+ {\ifnum\value{tabx@nest}=1% only clear trackers for top-level tabularx
+ \abx@cleartrackers
+ \fi
+ \addtocounter{tabx@nest}{-1}}
+ {}
+ {\blx@err@patch{'tabularx'}}}
+ {}%
+ \@ifpackageloaded{csquotes}
+ {\@ifpackagelater{csquotes}{2009/05/30}
+ {}
+ {\blx@error
+ {Outdated 'csquotes' package}
+ {Upgrade to csquotes v4.4 (2009/05/30) or later.\MessageBreak
+ I found: '\csuse{ver@csquotes.sty}'}}%
+ \BlockquoteDisable{\let\blx@thecheckpunct\@gobble}%
+ \@ifpackagelater{csquotes}{2009/08/27}
+ {\appto\@blockquote@prehook{\abx@savetrackers}%
+ \appto\@blockquote@posthook{\abx@resttrackers\abx@cleartrackers}}
+ {}%
+ \@ifpackagelater{csquotes}{2010/06/09}
+ {}
+ {\newcommand*{\@quotereset}{}\newcount\@quotereset}%
+ \newcommand*{\blx@initoquote}{\initoquote}%
+ \newcommand*{\blx@textooquote}{\textooquote}%
+ \newcommand*{\blx@textcoquote}{\textcoquote}%
+ \newcommand*{\blx@initiquote}{\initiquote}%
+ \newcommand*{\blx@textoiquote}{\textoiquote}%
+ \newcommand*{\blx@textciquote}{\textciquote}%
+ \newcommand*{\blx@enquote}{\enquote}}
+ {\@ifpackageloaded{babel}
+ {\blx@warning@noline{%
+ 'babel/polyglossia' detected but 'csquotes' missing.\MessageBreak
+ Loading 'csquotes' recommended}}
+ {}%
+ \newcommand*{\@quotelevel}{}%
+ \newcount\@quotelevel
+ \newcommand*{\@quotereset}{}%
+ \newcount\@quotereset
+ \newcommand*{\@setquotesfcodes}{}%
+ \let\@setquotesfcodes\relax
+ \newrobustcmd*{\blx@initoquote}{\@quotelevel\@ne}%
+ \newrobustcmd*{\blx@initiquote}{\@quotelevel\tw@}%
+ \newrobustcmd*{\blx@textooquote}{``}%
+ \newrobustcmd*{\blx@textcoquote}{''}%
+ \newrobustcmd*{\blx@textoiquote}{`\relax}% block ligs
+ \newrobustcmd*{\blx@textciquote}{'\relax}% block ligs
+ \newrobustcmd*{\blx@enquote}
+ {\@ifstar\blx@enquote@iii\blx@enquote@i}%
+ \def\blx@enquote@i{%
+ \ifnum\@quotelevel>\z@
+ \expandafter\blx@enquote@iii
+ \else
+ \expandafter\blx@enquote@ii
+ \fi}%
+ \long\def\blx@enquote@ii#1{%
+ \begingroup\blx@initoquote
+ \blx@textooquote#1\blx@textcoquote
+ \endgroup}%
+ \long\def\blx@enquote@iii#1{%
+ \begingroup\blx@initiquote
+ \blx@textoiquote#1\blx@textciquote
+ \endgroup}%
+ \appto\blx@setsfcodes{%
+ \sfcode`\`=\z@
+ \sfcode`\'=\z@}}%
+ \let\do\noexpand}
+
+% no longer needed, keep for backwards compatibility
+\let\blx@langstrings\relax
+
+\def\blx@ifhyphenationundef#1{\ifcsundef{l@#1}}
+
+% polyglossia makes heavy use of \AtBeginDocument, so we need to use
+% it too to get in later than polyglossia's setup.
+% This means that load-order is relevant, boo ...
+\AtBeginDocument{%
+ \@ifpackageloaded{polyglossia}
+ {\ifundef\xpg@ifdefined
+ {}
+ {\def\blx@ifhyphenationundef#1#2#3{\xpg@ifdefined{#1}{#3}{#2}}}%
+ % This is required for languages which are never explicitly selected
+ % \xpg@bloaded is not defined in polyglossia < v1.45
+ \ifundef\xpg@bloaded
+ {\ifundef\xpg@loaded
+ {\let\xpg@bloaded\@empty}
+ {\let\xpg@bloaded\xpg@loaded}}
+ {}%
+ \global\let\blx@maplang\blx@maplang@polyglossia
+ \def\do#1{\blx@langsetup@from@pkglist{#1}}%
+ \expandafter\docsvlist\expandafter{\xpg@bloaded}%
+ \def\do#1{\blx@langsetup@from@auxlist{#1}}%
+ \dolistloop\blx@lbx@auxloadlist
+ \ifboolexpr{
+ not togl {blx@autolangbib}
+ and
+ not togl {blx@autolangcite}}
+ {\blx@mknoautolang}
+ {\blx@mkautolangpoly}%
+ }
+ {\global\let\blx@maplang\blx@maplang@babel
+ \@ifpackageloaded{babel}
+ {% This is required for languages which are never explicitly selected
+ \def\do#1{\blx@langsetup@from@pkglist{#1}}%
+ \expandafter\docsvlist\expandafter{\bbl@loaded}%
+ \def\do#1{\blx@langsetup@from@auxlist{#1}}%
+ \dolistloop\blx@lbx@auxloadlist
+ \ifboolexpr{
+ not togl {blx@autolangbib}
+ and
+ not togl {blx@autolangcite}}
+ {\blx@mknoautolang}
+ {\blx@mkautolangbabel}}
+ {\blx@mknoautolang}}%
+ % These already have defaults set to basically do nothing
+ % so if the toggles are true, we need to define again since
+ % mkautolang* redefines \blx@beglang
+ % In turn, \blx@beglang defines \blx@endlang and so \blx@beglangcite and
+ % \blx@endlangcite need redefining inside \blx@beglang after \blx@endlang
+ % has been defined.
+ \iftoggle{blx@autolangbib}
+ {\let\blx@beglangbib\blx@beglang}
+ {}%
+ \iftoggle{blx@autolangcite}
+ {\let\blx@beglangcite\blx@beglang}
+ {}%
+ % babel/polyglossia has loaded the (main document) language already,
+ % so we need to explicitly enable our captions (abx@strings@)
+ % and extras (abx@extras@) now
+ \ifdefstring{\blx@langhook}{captions}
+ {\blx@etb@inittoggle{blx@lang@captions@\blx@languagename}%
+ \toggletrue{blx@lang@captions@\blx@languagename}}
+ {}%
+ \csuse{abx@extras@\blx@languagename}%
+ \csuse{abx@strings@\blx@languagename}%
+ % avoid accidental re-initialization
+ \undef\blx@mkautolangbabel
+ \undef\blx@mkautolangpoly
+ \undef\blx@mknoautolang
+ % pick up the main document language as sortlocale if
+ % auto-detection is desired
+ \ifdefstring\blx@sortlocale{auto}
+ {\ifdef\blx@main@language% babel or polyglossia is loaded
+ {\edef\blx@sortlocale{\blx@main@language}}
+ {\def\blx@sortlocale{english}}}
+ {}%
+
+ % There are several scopes of blx@mslang - they are summarised here for clarity
+ % \blx@gmslang - global option setting as this needs passing to biber
+ % \blx@mslang - setting which varies depending on refcontext
+ % \blx@lmslang - if the langid field exists, the BCP47 tag for this, otherwise same as \blx@mslang
+ % \blx@nmslang - the value of an individual name "mslang" data annotation, if it exists. This is
+ % just a convenient was of getting such an annotation as individual names have
+ % a keyval list in which to store it, the "mslang" data annotation is also available
+ % too. Non-name list "mslang" data annotations don't have this convenience variable
+ % because there is nowhere to store them in the .bbl format and so the annotation
+ % must be fetched directly using the annotation macros.
+
+ % Set default mslang from babel/polyglossia or a fallback
+ % mslang is a biblatex global option but we don't identify it as one as it is not
+ % passed in the .bcf as a biblatex option but rather as a biber option since it is used
+ % to set the default biber option.
+ \ifdef\blx@main@language
+ {\edef\blx@mslang{\csuse{blx@msmaplangr@\blx@main@language}}}
+ {\def\blx@mslang{en-us}}% fallback when no babel/polyglossia
+ \let\blx@gmslang\blx@mslang
+}
+
+
+\protected\def\blx@providecount#1{%
+ \ifcscounter{#1}
+ {}
+ {\expandafter\newcount\csname #1\endcsname}}
+
+\def\blx@citecmds{}
+% \autocite and \autocites are not defined via \DeclareCiteCommand
+\listadd\blx@citecmds{autocite}
+\listadd\blx@citecmds{autocites}
+
+\newcommand*{\blx@contentssafe@citecommands}{%
+ \forlistloop{\blx@mkcitecmd@contentssafe}{\blx@citecmds}}
+
+\def\blx@mkcitecmd@contentssafe#1{%
+ \csdef{#1}{%
+ \blx@tocontentsinit{\the\c@refsection}%
+ \noexpand\csuse{#1}}}
+
+\protected\def\blx@tocontentsinit#1{%
+ \boolfalse{citerequest}%
+ \boolfalse{citetracker}%
+ \boolfalse{pagetracker}%
+ \boolfalse{backtracker}%
+ \defcounter{refsection}{#1}}
+
+% trick hyperref into believing we're natbib
+\let\NAT@parse\@empty
+% trick showkeys into believing we're havard
+\let\HAR@checkdef\@empty
+
+\providecommand{\@gobblefive}[5]{}
+\providecommand{\@gobblethree}[3]{}
+
+% etoolbox helpers
+
+% \ifinlist{<item>}{<list>} is not a good idea
+% for printable stuff according to the etoolbox docs
+% for \ifinlist (p. 31)
+\newrobustcmd{\blx@ifprintableinlist}[2]{%
+ \begingroup
+ \def\blx@tempa{\endgroup
+ \@secondoftwo}%
+ \def\do##1{%
+ \ifstrequal{##1}{#1}
+ {\def\blx@tempa{\endgroup
+ \@firstoftwo}%
+ \listbreak}
+ {}}%
+ \dolistloop{#2}%
+ \expandafter\blx@tempa}
+
+\newrobustcmd{\blx@ifprintableinlistcs}[2]{%
+ \expandafter\blx@ifprintableinlistcs@i\csname #2\endcsname{#1}}
+\long\def\blx@ifprintableinlistcs@i#1#2{\blx@ifprintableinlist{#2}{#1}}
+
+\ifundef\pdf@mdfivesum
+ {\let\blx@mdfivesum\@firstofone
+ \blx@warning@noline{Command '\string\pdf@mdfivesum' undefined.\MessageBreak
+ 'labelprefix' may not be able to accept all input.\MessageBreak
+ The command is available (via 'pdftexcmds')\MessageBreak
+ in recent versions of pdfTeX, LuaTeX and XeTeX}}
+ {\let\blx@mdfivesum\pdf@mdfivesum}
+
+\newtoggle{blx@bbl@rerun@requested}
+
+\ifundef\pdf@filemdfivesum
+ {\blx@warning@noline{Command '\string\pdf@filemdfivesum' undefined.\MessageBreak
+ Biber rerun detection may not work as expected.\MessageBreak
+ The command is available (via 'pdftexcmds')\MessageBreak
+ in recent versions of pdfTeX, LuaTeX and XeTeX}%
+ \let\blx@generate@bbl@mdfivesum@found\@gobble
+ \let\blx@generate@bbl@mdfivesum@notfound\relax
+ \let\abx@aux@read@bblrerun\relax
+ \let\abx@aux@read@bbl@mdfivesum\@gobble
+ \let\blx@aux@write@bbl@mdfivesum\relax
+ \let\blx@check@bbl@rerun@mdfivesum\relax}
+ {\let\blx@filemdfivesum\pdf@filemdfivesum
+
+ \def\blx@generate@bbl@mdfivesum@found#1{%
+ \xdef\blx@bbl@mdfivesum@new{\blx@filemdfivesum{#1}}}
+
+ % 'nobblfile' can never be equal to any md5 hash
+ \def\blx@generate@bbl@mdfivesum@notfound{%
+ \gdef\blx@bbl@mdfivesum@new{nobblfile}}
+
+ \def\abx@aux@read@bblrerun{\global\toggletrue{blx@bbl@rerun@requested}}
+
+ \def\abx@aux@read@bbl@mdfivesum{%
+ \gdef\blx@bbl@mdfivesum@old}
+
+ % If we need Biber to rerun, save the hash of the current .bbl.
+ % That way we can detect if the Biber rerun really happened when
+ % we run LaTeX the next time.
+ \def\blx@aux@write@bbl@mdfivesum{%
+ \blx@auxwrite\@mainaux{}{%
+ \string\abx@aux@read@bbl@mdfivesum{%
+ \ifundef\blx@bbl@mdfivesum@old
+ {nohash}
+ {\blx@bbl@mdfivesum@new}}}%
+ \iftoggle{blx@runbiber}
+ {\blx@auxwrite\@mainaux{}{\string\abx@aux@read@bblrerun}}
+ {}}
+
+ % There was a Biber rerun request last time (\blx@bbl@mdfivesum@old),
+ % yet the bbl files are the same (as far as md5 hashes are concerned),
+ % that means *no* Biber rerun happened.
+ % So we need to re-request a rerun.
+ \def\blx@check@bbl@rerun@mdfivesum{%
+ \iftoggle{blx@bbl@rerun@requested}
+ {\ifdefstrequal\blx@bbl@mdfivesum@old\blx@bbl@mdfivesum@new}
+ {\@secondoftwo}
+ {\blx@logreq@active{}}
+ {}}}
+
+
+% xstring replacements
+
+% reverse a given string
+% idea by egreg (https://tex.stackexchange.com/users/4427/egreg)
+% from https://tex.stackexchange.com/q/36034/
+% relicensed under LPPL according to
+% https://tex.meta.stackexchange.com/a/3333/
+\def\blx@revstr#1{%
+ \ifblank{#1}
+ {}
+ {\blx@revstr@l #1\blx@revstr@b@i\blx@revstr@b@ii}}
+
+\def\blx@revstr@l#1#2\blx@revstr@b@i#3\blx@revstr@b@ii{%
+ \ifblank{#2}
+ {#1#3}
+ {\blx@revstr@l#2\blx@revstr@b@i#1#3\blx@revstr@b@ii}}
+
+% these tests are inspired by Stephan v. Bechtolsheim's TUGboat article
+% https://www.tug.org/TUGboat/tb09-1/tb20bechtolsheim.pdf
+% but we need to test for start and end and not for generic substring
+% start is easy, delimited arguments help there
+\protected\def\blx@ifstrstartswith#1#2{%
+ \def\blx@ifstrstartswith@i ##1#2##2&{%
+ \ifblank{##1}}%
+ \blx@ifstrstartswith@i #1#2&}
+
+% end is harder, so we reverse everything and apply the start test
+\protected\def\blx@ifstrendswith#1#2{%
+ \begingroup
+ \edef\blx@tempa{\endgroup
+ \noexpand\blx@ifstrstartswith{\blx@revstr{#1}}{\blx@revstr{#2}}}%
+ \blx@tempa}
+
+% not expandable, so write the result to the macro given in #3
+% {<string>}{<strip>}{<result>}
+% <result> will contain the bit of <string>
+% after the first occurrence of <strip>
+\protected\def\blx@stripfromstartinto#1#2#3{%
+ \def\blx@stripfromstart@i ##1#2##2&{%
+ \def#3{##2}}%
+ \blx@stripfromstart@i #1&}
+
+% {<string>}{<strip>}{<result>}
+% <result> will contain the bit of <string>
+% before the last occurence of <strip>
+\protected\def\blx@stripfromendinto#1#2#3{%
+ \begingroup
+ \edef\blx@tempa{\endgroup
+ \noexpand\blx@stripfromstartinto{\blx@revstr{#1}}{\blx@revstr{#2}}}%
+ \blx@tempa{#3}%
+ \edef#3{\noexpand\blx@revstr{#3}}%
+ \edef#3{#3}}
+
+%% Allocation
+
+% Counter to track nested tabularx environemnts so we don't
+% try to patch the commands more than once below as this undefs some
+% macros and an error is thrown
+\newcounter{tabx@nest}
+\setcounter{tabx@nest}{0}
+
+\newcounter{listtotal}
+\def\thelisttotal{\the\c@listtotal}
+\newcounter{listcount}
+\def\thelistcount{\the\c@listcount}
+\newcounter{liststart}
+\def\theliststart{\the\c@liststart}
+\newcounter{liststop}
+\def\theliststop{\the\c@liststop}
+\newcounter{citecount}
+\def\thecitecount{\the\c@citecount}
+\newcounter{citetotal}
+\def\thecitetotal{\the\c@citetotal}
+\newcounter{multicitecount}
+\def\themulticitecount{\the\c@multicitecount}
+\newcounter{multicitetotal}
+\def\themulticitetotal{\the\c@multicitetotal}
+\newcounter{instcount}
+\def\theinstcount{\the\c@instcount}
+\newcounter{maxnames}
+\def\themaxnames{\the\c@maxnames}
+\newcounter{minnames}
+\def\theminnames{\the\c@minnames}
+\newcounter{maxitems}
+\def\themaxitems{\the\c@maxitems}
+\newcounter{minitems}
+\def\theminitems{\the\c@minitems}
+\newcounter{citecounter}
+\def\thecitecount{\the\c@citecounter}
+\newcounter{maxcitecounter}
+\def\themaxcitecounter{\the\c@maxcitecounter}
+\newcounter{savedcitecounter}
+\def\thecitecount{\the\c@savedcitecounter}
+\newcounter{uniquelist}
+\def\theuniquelist{\the\c@uniquelist}
+\newcounter{uniquename}
+\def\theuniquename{\the\c@uniquename}
+\newcounter{refsection}
+\def\therefsection{\the\c@refsection}
+\newcounter{refsegment}
+\def\therefsegment{\the\c@refsegment}
+\newcounter{maxextratitle}
+\def\themaxextratitle{\the\c@maxextratitle}
+\newcounter{maxextratitleyear}
+\def\themaxextratitleyear{\the\c@maxextratitleyear}
+\newcounter{maxextraname}
+\def\themaxextraname{\the\c@maxextraname}
+\newcounter{maxextradate}
+\def\themaxextradate{\the\c@maxextradate}
+\newcounter{maxextraalpha}
+\def\themaxextraalpha{\the\c@maxextraalpha}
+\newcounter{abbrvpenalty}
+\def\theabbrvpenalty{\the\c@abbrvpenalty}
+\newcounter{highnamepenalty}
+\def\thehighnamepenalty{\the\c@highnamepenalty}
+\newcounter{lownamepenalty}
+\def\thelownamepenalty{\the\c@lownamepenalty}
+\newcounter{maxparens}
+\def\themaxparens{\the\c@maxparens}
+\newcounter{parenlevel}
+\def\theparenlevel{\the\c@parenlevel}
+
+\newcount\blx@tempcnta
+\newcount\blx@tempcntb
+\newcount\blx@tempcntc
+\newcounter{blx@maxsection}
+\def\theblx@maxsection{\the\c@blx@maxsection}
+\expandafter\newcount\csname blx@maxsegment@0\endcsname
+\newcount\blx@notetype
+\newcount\blx@parenlevel@text
+\newcount\blx@parenlevel@foot
+\expandafter\newcount\csname blx@sectionciteorder@0\endcsname
+\expandafter\newcount\csname blx@sectionciteorderinternal@0\endcsname
+\newcount\blx@entrysetcounter
+\newcount\blx@biblioinstance
+
+\def\blx@uniquename{false}
+\def\blx@uniquelist{false}
+\def\blx@maxbibnames{0}
+\def\blx@minbibnames{0}
+\def\blx@maxcitenames{0}
+\def\blx@mincitenames{0}
+\def\blx@maxsortnames{0}
+\def\blx@minsortnames{0}
+\def\blx@maxalphanames{0}
+\def\blx@minalphanames{0}
+\def\blx@maxitems{0}
+\def\blx@minitems{0}
+
+\newlength{\labelnumberwidth}
+\newlength{\labelalphawidth}
+\newlength{\biblabelsep}
+\ifdef\bibitemsep % memoir
+ {}
+ {\newlength{\bibitemsep}}
+\newlength{\bibnamesep}
+\newlength{\bibinitsep}
+\newlength{\bibparsep}
+\newlength{\bibhang}
+
+\newbool{sourcemap}
+\newbool{citetracker}
+\newbool{pagetracker}
+\newbool{backtracker}
+\newbool{citerequest}
+\booltrue{citerequest}
+\newbool{sortcites}
+\newbool{selectms}
+
+\newtoggle{blx@bbldone}
+\newtoggle{blx@tempa}
+\newtoggle{blx@tempb}
+\newtoggle{blx@runltx}
+\newtoggle{blx@runbiber}
+\newtoggle{blx@block}
+\newtoggle{blx@unit}
+\newtoggle{blx@skipentry}
+\newtoggle{blx@insert}
+\newtoggle{blx@lastins}
+\newtoggle{blx@keepunit}
+\newtoggle{blx@bibtex}
+\newtoggle{blx@debug}
+\newtoggle{blx@sortcase}
+\newtoggle{blx@sortupper}
+\newtoggle{blx@dynamiclabel}
+\newtoggle{blx@autolangbib}
+\newtoggle{blx@autofieldlangstrings}
+\newtoggle{blx@autolangcite}
+\newtoggle{blx@clearlang}
+\newtoggle{blx@defernumbers}
+\newtoggle{blx@omitnumbers}
+\newtoggle{blx@footnote}
+\newtoggle{blx@labelalpha}
+\newtoggle{blx@labelnumber}
+\newtoggle{blx@labeltitle}
+\newtoggle{blx@labeltitleyear}
+\newtoggle{blx@labeldateparts}
+\newtoggle{blx@pluralothers}
+\newtoggle{blx@natbib}
+\newtoggle{blx@mcite}
+\newtoggle{blx@loadfiles}
+\newtoggle{blx@sortsets}
+\newtoggle{blx@crossrefsource}
+\newtoggle{blx@xrefsource}
+\newtoggle{blx@terseinits}
+\newtoggle{blx@useprefix}
+\newtoggle{blx@addset}
+\newtoggle{blx@setonly}
+\newtoggle{blx@dataonly}
+\newtoggle{blx@skipbib}
+\newtoggle{blx@skipbiblist}
+\newtoggle{blx@skiplab}
+\newtoggle{blx@citation}
+\newtoggle{blx@volcite}
+\newtoggle{blx@bibliography}
+\newtoggle{blx@citeindex}
+\newtoggle{blx@bibindex}
+\newtoggle{blx@localnumber}
+\newtoggle{blx@refcontext}
+\newtoggle{blx@noroman}
+\newtoggle{blx@nohashothers}
+\newtoggle{blx@nosortothers}
+\newtoggle{blx@singletitle}
+\newtoggle{blx@uniquebaretitle}
+\newtoggle{blx@uniqueprimaryauthor}
+\newtoggle{blx@uniquetitle}
+\newtoggle{blx@uniquework}
+
+\newcommand*{\blx@xifstrequal}[2]{%
+ \begingroup
+ \edef\blx@tempa{%
+ \endgroup
+ \noexpand\ifstrequal{#1}{#2}}%
+ \blx@tempa}
+
+% Special fields which need resolution using the information provided by biber
+\listadd\abx@rfields{labeltitle}
+\def\abx@dorfields{%
+ \dolistloop\abx@rfields}
+\listadd\abx@rnames{labelname}
+\def\abx@dornames{%
+ \dolistloop\abx@rnames}
+
+% Used to track document forms and langs
+\global\let\blx@msforms\@empty
+\global\let\blx@mslangs\@empty
+
+% Used to track default refcontexts for citations
+\cslet{blx@defaultrefcontexts@0}\@empty
+\listadd\blx@allrefsections{0}
+\listadd\blx@alllastrefsections{0}
+
+% Used to track defernumbers from .aux
+\global\let\blx@localnumbers\@empty
+
+% Used to track sorting name key specifications
+\global\let\blx@sortingnamekeytemplates\@empty
+
+% Used to track uniquename templates
+\global\let\blx@untemplatespecs\@empty
+
+% Used to track labelalphaname templates
+\global\let\blx@lantemplatespecs\@empty
+
+% Used to track transliterations
+\global\let\blx@translits\@empty
+
+% Initialise some lists which track changing citations/sortingtemplates
+% etc. between runs
+\global\let\blx@nocites\@empty
+\global\let\blx@directcites\@empty
+\global\let\blx@refcontexts\@empty
+\global\let\blx@lastrefcontexts\@empty
+\global\let\blx@sortingtemplatenames\@empty
+\global\let\blx@dlistnames\@empty
+\global\let\blx@biblists\@empty
+\global\let\blx@lastbiblists\@empty
+\global\let\blx@localnumaux\@empty
+\global\cslet{blx@cites@0}\@empty
+
+\newread\blx@bcfin
+\newwrite\blx@bcfout
+
+\def\blx@onlypreamble#1{%
+ \gappto\blx@dopreamblecmds{\do#1}}
+
+\def\blx@dopreamblecmds{%
+ \do\blx@dopreamblecmds
+ \do\blx@onlypreamble}
+
+% Deprecations
+\newrobustcmd*{\DeprecateField}[2]{%
+ \blx@imc@ifmsentryfield{#1}
+ {\def\blx@tempa{abx@field@\blx@msform@\blx@mslang@#1}}
+ {\def\blx@tempa{abx@field@@@#1}}%
+ \csdef{\blx@tempa}{%
+ \ifcsundef{abx@legacywarning@field@#1}
+ {\blx@warning@noline{Field '#1' is deprecated. #2}}
+ {}%
+ \global\cslet{abx@legacywarning@field@#1}\@empty}}%
+\newrobustcmd*{\DeprecateList}[2]{%
+ \blx@imc@ifmsentryfield{#1}
+ {\def\blx@tempa{abx@list@\blx@msform@\blx@mslang@#1}}
+ {\def\blx@tempa{abx@list@@@#1}}%
+ \csdef{\blx@tempa}{%
+ \ifcsundef{abx@legacywarning@list@#1}
+ {\blx@warning@noline{List '#1' is deprecated. #2}}
+ {}%
+ \global\cslet{abx@legacywarning@list@#1}\@empty}}
+\newrobustcmd*{\DeprecateName}[2]{%
+ \blx@imc@ifmsentryfield{#1}
+ {\def\blx@tempa{abx@name@\blx@msform@\blx@mslang@#1}}
+ {\def\blx@tempa{abx@name@@@#1}}%
+ \csdef{\blx@tempa}{%
+ \ifcsundef{abx@legacywarning@name@#1}
+ {\blx@warning@noline{Name '#1' is deprecated. #2}}
+ {}%
+ \global\cslet{abx@legacywarning@name@#1}\@empty}}
+
+\let\blx@aliasfields\@empty
+
+\newrobustcmd*{\DeprecateFieldWithReplacement}[2]{%
+ \appto\blx@aliasfields{%
+ \ifcsundef{abx@field@#2}
+ {}%
+ {\blx@imc@ifmsentryfield{#2}
+ {\begingroup
+ \csgdef{blx@datamodel@multiscript@entryfield@#1}{1}%
+ \def\do##1{%
+ \begingroup
+ \def\do####1{%
+ \csgdef{abx@field@##1@####1@#1}{%
+ \csuse{abx@field@##1@####1@#2}%
+ \ifcsundef{abx@legacywarning@field@#1}
+ {\blx@warning@noline{Field '#1' is deprecated.\MessageBreak
+ Please use '#2' instead.\MessageBreak
+ Using '#2' now}}
+ {}%
+ \global\cslet{abx@legacywarning@field@#1}\@empty}}%
+ \dolistcsloop{abx@fieldmslangs@#2}%
+ \endgroup}%
+ \dolistcsloop{abx@fieldmsforms@#2}%
+ \endgroup}
+ {\csdef{abx@field@@@#1}{%
+ \csuse{abx@field@@@#2}%
+ \ifcsundef{abx@legacywarning@field@#1}
+ {\blx@warning@noline{Field '#1' is deprecated.\MessageBreak
+ Please use '#2' instead.\MessageBreak
+ Using '#2' now}}
+ {}%
+ \global\cslet{abx@legacywarning@field@#1}\@empty}}}}}
+
+\newrobustcmd*{\DeprecateListWithReplacement}[2]{%
+ \appto\blx@aliasfields{%
+ \ifcsundef{abx@list@#2}
+ {}%
+ {\blx@imc@ifmsentryfield{#2}
+ {\begingroup
+ \csgdef{blx@datamodel@multiscript@entryfield@#1}{1}%
+ \def\do##1{%
+ \begingroup
+ \def\do####1{%
+ \csgdef{abx@list@##1@####1@#1}{%
+ \csuse{abx@list@##1@####1@#2}%
+ \ifcsundef{abx@legacywarning@list@#1}
+ {\blx@warning@noline{List '#1' is deprecated.\MessageBreak
+ Please use '#2' instead.\MessageBreak
+ Using '#2' now}}
+ {}%
+ \global\cslet{abx@legacywarning@list@#1}\@empty}}%
+ \dolistcsloop{abx@fieldmslangs@#2}%
+ \endgroup}%
+ \dolistcsloop{abx@fieldmsforms@#2}%
+ \endgroup}
+ {\csdef{abx@list@@@#1}{%
+ \csuse{abx@list@@@#2}%
+ \ifcsundef{abx@legacywarning@list@#1}
+ {\blx@warning@noline{List '#1' is deprecated.\MessageBreak
+ Please use '#2' instead.\MessageBreak
+ Using '#2' now}}
+ {}%
+ \global\cslet{abx@legacywarning@list@#1}\@empty}}}}}
+
+\newrobustcmd*{\DeprecateNameWithReplacement}[2]{%
+ \appto\blx@aliasfields{%
+ \ifcsundef{abx@name@#2}
+ {}%
+ {\blx@imc@ifmsentryfield{#2}
+ {\begingroup
+ \csgdef{blx@datamodel@multiscript@entryfield@#1}{1}%
+ \def\do##1{%
+ \begingroup
+ \def\do####1{%
+ \csgdef{abx@name@##1@####1@#1}{%
+ \csuse{abx@name@##1@####1@#2}%
+ \ifcsundef{abx@legacywarning@name@#1}
+ {\blx@warning@noline{Name '#1' is deprecated.\MessageBreak
+ Please use '#2' instead.\MessageBreak
+ Using '#2' now}}
+ {}%
+ \global\cslet{abx@legacywarning@name@#1}\@empty}}%
+ \dolistcsloop{abx@fieldmslangs@#2}%
+ \endgroup}%
+ \dolistcsloop{abx@fieldmsforms@#2}%
+ \endgroup}
+ {\csdef{abx@name@@@#1}{%
+ \csuse{abx@name@@@#2}%
+ \ifcsundef{abx@legacywarning@name@#1}
+ {\blx@warning@noline{Name '#1' is deprecated.\MessageBreak
+ Please use '#2' instead.\MessageBreak
+ Using '#2' now}}
+ {}%
+ \global\cslet{abx@legacywarning@name@#1}\@empty}}}}}
+
+%% Initialisation
+\def\blx@blxinit{%
+ \let\blx@blxinit\relax
+ \blx@initunit}
+
+\def\blx@secinit{%
+ \csgdef{blx@sections@\the\c@refsection}{true}% just to say we have a section for tests later
+ \ifcsundef{blx@bsee@\the\c@refsection}
+ {\global\cslet{blx@bsee@\the\c@refsection}\@empty}
+ {}%
+ \ifcsundef{blx@fsee@\the\c@refsection}
+ {\global\cslet{blx@fsee@\the\c@refsection}\@empty}
+ {}%
+ \blx@ibidreset@force
+ \blx@idemreset@force
+ \blx@opcitreset@force
+ \blx@loccitreset@force
+ % List to track all aliases in a section. We need to output all aliases
+ % to the .bcf every time so that they are visible to biber
+ % Reset only if undefined
+ \ifcsundef{blx@keyaliases@\the\c@refsection}
+ {\global\cslet{blx@keyaliases@\the\c@refsection}\@empty}
+ {}%
+ \ifcsundef{blx@segm@\the\c@refsection @\the\c@refsegment}
+ {\global\cslet{blx@segm@\the\c@refsection @\the\c@refsegment}\@empty}
+ {}}
+
+%% Auxiliary commands
+\protected\def\blx@regimc#1{%
+ \xappto\blx@blxinit{%
+ \let\noexpand#1\expandafter\noexpand\csname
+ blx@imc@\expandafter\@gobble\string#1\endcsname}}
+
+\protected\def\blx@regimcs#1{\blx@regimcs@i#1&}
+\def\blx@regimcs@i#1{%
+ \ifx#1&\else
+ \blx@regimc#1%
+ \expandafter\blx@regimcs@i
+ \fi}
+
+% [<msform>][<mslang>]{<field>} => \do{<item1>}\do{<item2>}...
+\DeclareExpandableDocumentCommand{\blx@imc@docsvfield}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@iffieldundef[{#1}][{#2}]{#3}
+ {}
+ {\blx@imc@ifmsentryfield{#3}
+ {\def\blx@tempa{abx@field@#1@#2@#3}}
+ {\def\blx@tempa{abx@field@@@#3}}%
+ \expandafter\expandafter\expandafter\docsvlist
+ \expandafter\expandafter\expandafter{%
+ \csname\blx@tempa\endcsname}}}
+
+% {<handler>}[<msform>][<mslang>]{<field>} => <handler>{<item1>}<handler>{<item2>}...
+\DeclareExpandableDocumentCommand{\blx@imc@forcsvfield}
+ {m O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@iffieldundef[{#2}][{#3}]{#4}
+ {}
+ {\blx@imc@ifmsentryfield{#4}
+ {\def\blx@tempa{abx@field@#2@#3@#4}}
+ {\def\blx@tempa{abx@field@@@#4}}%
+ \expandafter\expandafter\expandafter\blx@imc@forcsvfield@i
+ \expandafter\expandafter\expandafter{%
+ \csname\blx@tempa\endcsname}{#1}}}
+
+\def\blx@imc@forcsvfield@i#1#2{\forcsvlist{#2}{#1}}
+
+\blx@regimcs{\docsvfield \forcsvfield}
+
+% {<list>|<listmacro>}
+\protected\long\def\blx@listloop#1{%
+ \expandafter\blx@listloop@i#1|&}
+\long\def\blx@listloop@i#1|{%
+ \ifblank{#1}
+ {\blx@break}
+ {\blx@do{#1}\blx@listloop@i}}
+
+\long\def\blx@break#1&{%
+ \blx@done
+ \undef\blx@do
+ \undef\blx@done}
+
+% {<listmacro>}{<listcsname>} => matches in <listmacro>
+\protected\def\blx@filter#1#2{%
+ \def\do##1{%
+ \ifinlistcs{##1}{#2}
+ {\listadd#1{##1}}
+ {}}%
+ \blx@runfilter#1}
+
+% {<listmacro>}{<listcsname>} => matches in <listmacro>
+% Slightly odd use of filtering to do citation sorting.
+% Same as blx@filter but it keeps \tempcnta in step with the
+% resulting number of things in the filtered list. This is
+% because \tempcnta is used to set citetotal - this use
+% of filtering for cite sorting has the side-effect of stripping
+% duplicates like \cite{foo,foo} but we need then to keep citetotal
+% in sync.
+\protected\def\blx@filtercitesort#1#2{%
+ \blx@tempcnta\z@
+ \def\do##1{%
+ \ifinlistcs{##1}{#2}
+ {\listadd#1{##1}%
+ \advance\blx@tempcnta\@ne}
+ {}}%
+ \blx@runfilter#1}
+
+% {<listmacro>}{<listcsname>} => neg. matches in <listmacro>
+\protected\def\blx@notfilter#1#2{%
+ \def\do##1{%
+ \ifinlistcs{##1}{#2}
+ {}
+ {\listadd#1{##1}}}%
+ \blx@runfilter#1}
+
+\def\blx@runfilter#1{%
+ \begingroup\edef#1{\endgroup
+ \unexpanded{\let#1\@empty\dolistloop}{#1}}%
+ #1\let\do\noexpand}
+
+% {<code>}{<string>} => <code>{<string>}
+\protected\def\blx@xsanitizeafter#1#2{%
+ \begingroup
+ \abx@hook@xsanitize
+ \def\blx@tempa{\endgroup#1}%
+ \edef\blx@tempb{#2}%
+ \expandafter\blx@tempa
+ \expandafter{\detokenize\expandafter{\blx@tempb}}}
+
+\def\abx@hook@xsanitize{%
+ \blx@safe@actives
+ \let\protect\string}
+
+% {<code>}{<string>} => <code>{<string>}
+\begingroup
+\catcode`\<=\active
+\catcode`\>=\active
+\catcode`\&=\active
+\catcode`\"=\active
+\catcode`\'=\active
+\protected\gdef\blx@xmlsanitizeafter#1#2{%
+ \begingroup
+ \abx@hook@xsanitize
+ \def\blx@tempa{\endgroup#1}%
+ \edef\blx@tempb{#2}%
+ \let\do\@makeother
+ \dospecials
+ \catcode`\<=\active
+ \catcode`\>=\active
+ \catcode`\&=\active
+ \catcode`\"=\active
+ \catcode`\'=\active
+ \edef<{\string&lt\string;}%
+ \edef>{\string&gt\string;}%
+ \edef&{\string&amp\string;}%
+ \edef"{\string&quot\string;}%
+ \edef'{\string&apos\string;}%
+ \endlinechar\m@ne
+ \everyeof{\noexpand}%
+ \edef\blx@tempb{\scantokens\expandafter{\blx@tempb}}%
+ \expandafter\blx@tempa
+ \expandafter{\detokenize\expandafter{\blx@tempb}}}
+\endgroup
+
+% Generate altername filename with any global package postfix and then test
+% for existence of file with postfix, then bare file.
+% Used to look for files in versions of biblatex which are installed in parallel
+% with the standard version. Such versions have a suffix appended to all filenames
+% which is stored in \abx@filespf
+% Returns the found filename in \blx@fnext (with extension) and \blx@fnnoext (without extension) or
+% both \@empty if no file found
+\def\blx@altfile#1{%
+ \begingroup
+ \edef\blx@tempa{#1}% filename can contain macros
+ \let\blx@tempb\@empty
+ \let\blx@tempc\@empty
+ \global\let\blx@fnext\@empty
+ \global\let\blx@fnnoext\@empty
+ % Gives everything up to extension
+ \expandafter\blx@stripfromendinto\expandafter{\blx@tempa}{.}\blx@tempb
+ % Gives the extension
+ \expandafter\expandafter\expandafter\blx@stripfromstartinto\expandafter\expandafter\expandafter{\expandafter\blx@tempa\expandafter}\expandafter{\blx@tempb.}\blx@tempc
+ \xdef\blx@fnext{\blx@tempb\abx@filespf.\blx@tempc}%
+ \xdef\blx@fnnoext{\blx@tempb\abx@filespf}%
+ \expandafter\IfFileExists\expandafter{\blx@fnext}
+ {}
+ {\expandafter\IfFileExists\expandafter{\blx@tempa}
+ {\global\let\blx@fnext\blx@tempa
+ \global\let\blx@fnnoext\blx@tempb}
+ {\global\let\blx@fnext\@empty
+ \global\let\blx@fnnoext\@empty}}
+ \endgroup}
+
+% {<file>}{<message>}{<preload>}{<postload>}{<success>}{<failure>}
+\protected\long\def\blx@inputonce#1{%
+ \blx@altfile{#1}%
+ \ifdefempty\blx@fnext
+ {\blx@inputonce@i{#1}}
+ {\expandafter\blx@inputonce@i\expandafter{\blx@fnext}}}
+
+\protected\long\def\blx@inputonce@i#1#2#3#4#5#6{%
+ \ifcsundef{blx@file@#1}
+ {\blx@info@noline{Trying to load #2..}%
+ \IfFileExists{#1}
+ {\blx@info@noline{... file '#1' found}%
+ \csuse{blx@filehook@preload@#1}%
+ #3\@@input\@filef@und#4%
+ \csuse{blx@filehook@postload@#1}%
+ #5%
+ \listxadd\blx@list@req@stat{#1}%
+ \@addtofilelist{#1}}
+ {\blx@info@noline{... file '#1' not found}%
+ \csuse{blx@filehook@failure@#1}%
+ #6}%
+ \global\cslet{blx@file@#1}\@empty}
+ {#5}}
+
+% {<write>}{<precode>}{<string>}
+\protected\def\blx@auxwrite#1#2#3{%
+ \if@filesw
+ \begingroup
+ \blx@safe@actives
+ \let\protect\string
+ #2%
+ \immediate\write#1{#3}%
+ \endgroup
+ \fi}
+
+% {<file>}{<signature>}{<true>}{<false>}
+\def\blx@ifsigned#1#2{%
+ \begingroup
+ \let\blx@tempa\@firstoftwo
+ \edef\blx@tempb{\csuse{blx@sig@#2}}%
+ \edef\blx@tempb{\detokenize\expandafter{\blx@tempb}}%
+ \openin\blx@bcfin #1.#2\relax
+ \ifeof\blx@bcfin
+ \else
+ \endlinechar\m@ne
+ \readline\blx@bcfin to \blx@tempc
+ \ifeof\blx@bcfin
+ \else
+ \ifx\blx@tempb\blx@tempc
+ \readline\blx@bcfin to \blx@tempc
+ \edef\blx@tempb{\csuse{blx@ver@#2}}%
+ \edef\blx@tempb{\detokenize\expandafter{\blx@tempb}}%
+ \ifx\blx@tempb\blx@tempc
+ \else
+ \blx@warning@noline{%
+ File '#1.#2' is wrong format version - expected \blx@bblversion}
+ \fi
+ \else
+ \blx@error
+ {File '#1.#2' not created by biblatex}
+ {This file was apparently not created by biblatex.
+ Rename it or\MessageBreak move it to a location were
+ TeX will not find it. If this error\MessageBreak
+ persists, consider redefining \string\blxauxsuffix.%
+ See the biblatex\MessageBreak manual for details}%
+ \let\blx@tempa\@secondoftwo
+ \fi
+ \fi
+ \fi
+ \closein\blx@bcfin
+ \expandafter\endgroup\blx@tempa}
+
+\edef\blx@sig@bbl{\@percentchar\space $ biblatex auxiliary file $}
+\edef\blx@ver@bbl{\@percentchar\space $ biblatex bbl format version \blx@bblversion\space $}
+\edef\blx@sig@bcf{\detokenize{<?xml version="1.0" encoding="UTF-8"?>}}
+\edef\blx@ver@bcf{%
+ \detokenize{<bcf:controlfile version="}\blx@bcfversion
+ \detokenize{" bltxversion="}\abx@version
+ \detokenize{" xmlns:bcf="https://sourceforge.net/projects/biblatex">}}
+
+% {<true>}{<false>}
+\newrobustcmd*{\lbx@ifutfinput}{%
+ \ifboolexpr{%
+ test {\ifdefstring\inputencodingname{utf8}}
+ or
+ test {\ifdefstring\inputencodingname{utf8x}}
+ or
+ test {\ifdefstring\inputencodingname{lutf8}}
+ or
+ ( test {\ifundef\inputencodingname}
+ and
+ ( not test {\ifundef\XeTeXrevision}
+ or
+ not test {\ifundef\luatexversion}
+ )
+ )
+ }%
+}
+
+%% More user feedback
+\protected\def\blx@warning@entry#1{%
+ \ifdef\abx@field@@@entrykey
+ {\blx@warning{#1\MessageBreak at entry '\abx@field@@@entrykey'}}
+ {\blx@warning{#1}}}
+
+\protected\def\blx@info@noline#1{%
+ \begingroup
+ \blx@safe@actives
+ \PackageInfo{biblatex}{#1\@gobble}%
+ \endgroup}
+\let\blx@info\blx@info@noline
+\AtEndOfPackage{%
+ \protected\def\blx@info#1{%
+ \begingroup
+ \blx@safe@actives
+ \PackageInfo{biblatex}{#1}%
+ \endgroup}}
+
+\let\blx@noline\@gobble
+\AtEndOfPackage{\let\blx@noline\@empty}
+\def\blx@imc@BibliographyWarning{\blx@warning@entry}
+\blx@regimc\BibliographyWarning
+
+\protected\def\abx@missing#1{%
+ \mbox{\reset@font\bfseries#1}}
+
+
+\def\blx@err@nolang#1{%
+ \blx@error
+ {Language '#1' not found}
+ {The localization module for '#1' could not be found}}
+
+\def\blx@err@invarg#1#2{%
+ \blx@error
+ {Argument '#1' invalid}
+ {\ifblank{#2}
+ {The argument you have supplied is invalid.\MessageBreak
+ See the biblatex manual for details}
+ {#2}}}
+
+\def\blx@err@invopt#1#2{%
+ \blx@error
+ {Option '#1' invalid}
+ {\ifblank{#2}
+ {The option you have supplied is invalid.\MessageBreak
+ See the biblatex manual for valid option keys and
+ possible values}
+ {#2}}}
+
+\def\blx@err@confopt#1#2{%
+ \blx@error
+ {Conflicting options\ifblank{#1}{}{ (#1)}}
+ {\ifblank{#2}
+ {The option you have supplied conflicts with another one.\MessageBreak
+ See the biblatex manual for valid option keys and possible values}
+ {#2}}}
+
+\def\blx@err@optdef#1#2{%
+ \blx@error
+ {Option '#1' already defined}
+ {The option '#1' is already defined in scope '#2'}}
+
+\def\blx@err@nodocdiv#1{%
+ \blx@error
+ {\@backslashchar#1 not provided by class}
+ {The document class does not seems to support #1s}}
+
+\def\blx@err@nosec#1{%
+ \blx@error
+ {Section '#1' not found}
+ {The reference section '#1' could not be found}}
+
+\def\blx@err@nosort#1{%
+ \blx@error
+ {Sorting template '#1' not found}
+ {The sorting template '#1' does not seem to have been defined anywhere}}
+
+\def\blx@err@secfirst{%
+ \blx@error
+ {'section' not first filter}
+ {When passing multiple filter options,
+ the 'section' filter must be given first}}
+
+\protected\def\blx@err@nestcite{%
+ \blx@error
+ {Nested citation command}
+ {Citation commands may not be nested}}
+
+\def\blx@err@nestenv#1{%
+ \blx@error
+ {Nested '#1' environment}
+ {This environment may not be nested}}
+
+\protected\def\blx@err@citecmd#1{%
+ \begingroup
+ \escapechar\m@ne
+ \blx@error
+ {Command '\@backslashchar\string#1' undefined}
+ {The citation command '\@backslashchar\string#1'
+ has not been defined\MessageBreak by the
+ selected citation style}%
+ \endgroup}
+
+\def\blx@err@endnote#1{%
+ \blx@error
+ {Missing or incomplete endnote support}
+ {There does not seem to be endnote support available\MessageBreak
+ or the available support is incomplete.\MessageBreak
+ If you continue, I will fall back to '\string#1'}%
+ #1}
+
+\def\blx@err@matchparen#1{%
+ \blx@error
+ {Unbalanced parentheses or brackets}
+ {\iftoggle{blx@footnote}{#1 in foot or endnote}{#1}.\MessageBreak
+ This error is triggered if \string\bibopenparen\space and
+ \string\bibcloseparen\MessageBreak or
+ \string\bibopenbracket\space and \string\bibclosebracket\space
+ are unbalanced\MessageBreak or mismatched}}
+
+\def\blx@err@nestparen#1{%
+ \blx@error
+ {Too deeply nested parentheses or brackets}
+ {#1 nested too deeply%
+ \iftoggle{blx@footnote}{\space in foot or endnote}{}.\MessageBreak
+ This error may also be triggered if \string\mkbibparens\MessageBreak
+ or \string\mkbibbrackets\space are nested too deeply}}
+
+\def\blx@err@filter{%
+ \blx@error
+ {Invalid filter expression}
+ {The filter expression you have supplied is invalid.\MessageBreak
+ See the biblatex manual for details}}
+
+\def\blx@warn@nohyph#1{%
+ \blx@warning{No hyphenation patterns for '#1'}}
+
+\protected\def\blx@warn@citecmd#1#2{%
+ \blx@warning{%
+ '\string#1' not defined by citation style.\MessageBreak
+ Falling back to '\string#2'}%
+ #2}
+
+\protected\def\blx@warn@nostring#1{%
+ \blx@warning@entry{Bibliography string '#1'
+ \blx@kv@ifkeyundef{blx@lbx}{#1}{undefined}{untranslated}}%
+ \abx@missing{#1}}
+
+\def\blx@warn@conflopt#1{%
+ \blx@warning{Conflicting options.\MessageBreak#1}}
+
+\def\blx@warn@badoptdt#1{%
+ \blx@warning{Invalid option datatype '#1'.\MessageBreak
+ Defaulting to 'boolean'}}
+
+\def\blx@warn@depropt#1{%
+ \blx@warning{Deprecated option.\MessageBreak Ignoring '#1'}}
+
+\def\blx@warn@bibempty{%
+ \@latex@warning{Empty bibliography}}
+
+\def\blx@warn@biblistempty#1{%
+ \@latex@warning{Empty biblist '#1'}}
+
+\def\blx@inf@refsec{%
+ \blx@info{Reference section=\the\c@refsection}}%
+
+\def\blx@inf@delimdeclare#1#2{%
+ \blx@info{Delimiter '#1' in context '#2' already defined, overwriting}}
+
+\def\blx@warn@delimuse#1#2{%
+ \blx@warning{Delimiter '#1' in context '#2' undefined}}
+
+\def\blx@inf@refseg{%
+ \ifnum\c@refsection=\z@
+ \blx@info{Reference segment=\the\c@refsegment}%
+ \else
+ \blx@info{%
+ Reference section/segment=%
+ \the\c@refsection/\the\c@refsegment}%
+ \fi}
+
+\def\blx@inf@creset{%
+ \blx@info{Resetting trackers}}%
+
+\def\blx@msg@cundef#1{%
+ Citation '#1' undefined}
+\def\blx@msg@cundefon#1{%
+ Citation '#1' on page \the\c@page\space undefined}
+
+% Dummy as backend is biber by default. Some style may still use this to
+% check though.
+\newrobustcmd*{\RequireBiber}[1][2]{}
+
+% \blx@list@active active aux files (basename)
+% [internal list]
+% \blx@list@inactive inactive aux files (basename)
+% [internal list]
+% \blx@list@bibfiles@<auxfile> aux file -> bib file mapping (refsections)
+% aux file (basename) -> bib files (full)
+% [internal list]
+
+\let\blx@list@active\@empty
+\let\blx@list@inactive\@empty
+\listeadd\blx@list@inactive{\jobname}
+
+\protected\def\blx@regbibfiles#1#2{%
+ \forlistloop{\blx@regbibfile{#1}}{#2}}
+
+\def\blx@regbibfile#1#2{%
+ \ifcsundef{blx@res@loca@#2}
+ {\blx@regbibfile@i{#1}{#2}}
+ {\ifcsstring{blx@res@loca@#2}{local}
+ {\blx@regbibfile@i{#1}{#2}}
+ {}}}
+
+\def\blx@regbibfile@i#1#2{%
+ \ifinlistcs{#2}{blx@list@bibfiles@#1}
+ {}
+ {\listcsxadd{blx@list@bibfiles@#1}{#2}}}
+
+\def\blx@check@logreq{%
+ \begingroup
+ \ltxrequest{biblatex}{{\iftoggle{blx@runltx}{1}{0}}}{%
+ \provides[type=dynamic]{
+ \file{\jobname.bcf}
+ }
+ \requires[type=dynamic]{
+ \file{\jobname.bbl}
+ }
+ \ifdef\blx@list@req@edit
+ {\requires[type=editable]{
+ \forlistloop\file\blx@list@req@edit
+ }}
+ {}
+ \ifdef\blx@list@req@stat
+ {\requires[type=static]{
+ \forlistloop\file\blx@list@req@stat
+ }}
+ {}
+ }%
+ \logrequest[package=biblatex,priority=5,active={{\iftoggle{blx@runbiber}{1}{0}}}]{%
+ \generic{biber}
+ \cmdline{
+ \binary{biber}
+ \infile{\jobname}
+ }
+ \input{
+ \file{\jobname.bcf}
+ }
+ \output{
+ \file{\jobname.bbl}
+ }
+ \provides[type=dynamic]{
+ \file{\jobname.bbl}
+ }
+ \requires[type=dynamic]{
+ \file{\jobname.bcf}
+ }
+ \ifcsdef{blx@list@bibfiles@\jobname}
+ {\requires[type=editable]{
+ \def\do{\file}
+ \dolistcsloop{blx@list@bibfiles@\jobname}
+ }}
+ {}
+ }%
+ \endgroup}
+
+\def\blx@logreq@active#1{%
+ \ifblank{#1}
+ {}
+ {\@latex@warning{#1}}%
+ \blx@rerun@latex
+ \blx@rerun@biber}
+
+\def\blx@rerun@latex{%
+ \G@refundefinedtrue
+ \global\toggletrue{blx@runltx}%
+ \global\let\blx@rerun@latex\relax}
+
+\def\blx@rerun@biber{%
+ \global\toggletrue{blx@runbiber}%
+ \global\let\blx@rerun@biber\relax}
+
+
+\let\blx@checksum@old\@empty
+\let\blx@checksum@new\@empty
+\let\blx@pagesum@old\@empty
+\let\blx@pagesum@new\@empty
+
+\def\blx@checksum#1#2#3{%
+ \begingroup
+ \blx@tempcnta\the\numexpr0#2*0#3\relax
+ \blx@tempcntb\blx@tempcnta
+ \divide\blx@tempcntb10
+ \multiply\blx@tempcntb10
+ \advance\blx@tempcnta-\blx@tempcntb
+ \xdef#1{#1\the\blx@tempcnta}%
+ \endgroup}
+
+\def\blx@addchecksum{\blx@checksum\blx@checksum@old}
+\def\blx@addpagesum{\blx@checksum\blx@pagesum@old}
+\blx@AtEndDocument{%
+ \def\blx@addchecksum{\blx@checksum\blx@checksum@new}%
+ \def\blx@addpagesum{\blx@checksum\blx@pagesum@new}}
+
+\protected\def\blx@check@rerun{%
+ \begingroup
+ \blx@tempcnta\z@
+ \iftoggle{blx@runltx}
+ {\blx@tempcnta\@ne}
+ {\ifx\blx@checksum@old\blx@checksum@new
+ \ifx\blx@pagesum@old\blx@pagesum@new
+ \else
+ \blx@tempcnta\@ne
+ \fi
+ \else
+ \blx@tempcnta\@ne
+ \fi}%
+ \iftoggle{blx@runbiber}
+ {\advance\blx@tempcnta\tw@}
+ {}%
+ \ifcase\blx@tempcnta
+ \or
+ \blx@rerun@latex
+ \blx@warning@noline{%
+ Please rerun LaTeX%
+ \ifx\blx@pagesum@old\blx@pagesum@new\else
+ .\MessageBreak Page breaks have changed%
+ \fi}%
+ \else
+ \blx@rerun@latex
+ \blx@warn@auxlist
+ \fi
+ \endgroup}
+
+\def\blx@warn@auxlist{%
+ \blx@warning@noline{%
+ Please (re)run Biber on the file:\MessageBreak
+ \jobname\MessageBreak
+ and rerun LaTeX afterwards}}
+
+\AfterEndDocument{%
+ \blx@check@rerun
+ \blx@check@logreq}
+
+%% Punctuation and capitalization
+
+% 1001 prefix sep for names (e.g. d'Argent ... \printnames only)
+% 1002 abbreviation period (dot)
+% 1003/1250 comma
+% 1004/1500 semicolon
+% 1005/2000 colon
+% 1006/3000 period
+% 1007/3001 exclamation mark
+% 1008/3002 question mark
+% 1009 suppress punctuation
+% 1010 new paragaph
+
+\mathchardef\blx@sf@prefixchar=1001% e.g. apostrophe or equivalent for prefix handling
+\mathchardef\blx@sf@dot=1002
+\mathchardef\blx@sf@comma=1003
+\mathchardef\blx@sf@semicolon=1004
+\mathchardef\blx@sf@colon=1005
+\mathchardef\blx@sf@period=1006
+\mathchardef\blx@sf@exclam=1007
+\mathchardef\blx@sf@question=1008
+\mathchardef\blx@sf@nopunct=1009
+\mathchardef\blx@sf@par=1010
+\mathchardef\blx@sf@threshold@low=1002
+\mathchardef\blx@sf@threshold@high=1009
+
+\csdef{blx@sf@1250}{\the\blx@sf@comma}
+\csdef{blx@sf@1500}{\the\blx@sf@semicolon}
+\csdef{blx@sf@2000}{\the\blx@sf@colon}
+\csdef{blx@sf@3000}{\the\blx@sf@period}
+\csdef{blx@sf@3001}{\the\blx@sf@exclam}
+\csdef{blx@sf@3002}{\the\blx@sf@question}
+
+\csdef{blx@pm@,}{comma}
+\csdef{blx@pm@;}{semicolon}
+\csdef{blx@pm@:}{colon}
+\csdef{blx@pm@.}{period}
+\csdef{blx@pm@!}{exclam}
+\csdef{blx@pm@?}{question}
+
+\def\blx@setsfcodes{%
+ \let\blx@setsfcodes\relax
+ \let\frenchspacing\blx@setfrcodes
+ \let\nonfrenchspacing\blx@setencodes
+ \ifnum\sfcode`\.>2000
+ \blx@setencodes
+ \else
+ \blx@setfrcodes
+ \fi
+ \@setquotesfcodes
+ \sfcode`\(=\z@
+ \sfcode`\)=\z@
+ \sfcode`\[=\z@
+ \sfcode`\]=\z@
+ \sfcode`\<=\z@
+ \sfcode`\>=\z@}
+
+\def\blx@setfrcodes{%
+ \ifnum\sfcode`\A=\@m
+ \else
+ \blx@setazcodes
+ \fi
+ \sfcode`\,=\blx@sf@comma
+ \sfcode`\;=\blx@sf@semicolon
+ \sfcode`\:=\blx@sf@colon
+ \sfcode`\.=\blx@sf@period
+ \sfcode`\!=\blx@sf@exclam
+ \sfcode`\?=\blx@sf@question
+}
+
+\def\blx@setencodes{%
+ \sfcode`\,=1250
+ \sfcode`\;=1500
+ \sfcode`\:=2000
+ \sfcode`\.=3000
+ \sfcode`\!=3001
+ \sfcode`\?=3002
+}
+
+\def\abx@dosingleaccents{%
+ \do\"\do\'\do\`\do\^\do\~\do\=\do\.%
+ \do\H\do\b\do\c\do\d\do\r\do\u\do\v}
+\def\abx@dodoubleaccents{%
+ \do\t}
+
+% Defining characters that count as prefices in names like d'Argent
+% Code from moewe
+\let\blx@prefchars\@empty
+
+\def\blx@defprefchars@loop#1{%
+ \ifx#1\relax
+ \else
+ \listadd{\blx@prefchars}{#1}%
+ \expandafter\blx@defprefchars@loop
+ \fi}
+
+\def\blx@defprefchars#1{%
+ \expandafter\blx@defprefchars@loop\detokenize{#1}\relax}
+
+\newrobustcmd*{\DeclarePrefChars}{%
+ \@ifstar
+ {\blx@defprefchars}
+ {\global\let\blx@prefchars\@empty
+ \blx@defprefchars}}
+\DeclarePrefChars{'-}
+
+\protected\def\blx@imc@ifprefchar{%
+ \ifhmode
+ \begingroup
+ \ifnum\spacefactor=\blx@sf@prefixchar
+ \endgroup
+ \expandafter\expandafter
+ \expandafter\@firstoftwo
+ \else
+ \endgroup
+ \expandafter\expandafter
+ \expandafter\@secondoftwo
+ \fi
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+
+\blx@regimcs{\ifprefchar}
+
+\def\blx@namecodes{%
+ \ifnum\sfcode`\A=\@m
+ \else
+ \blx@setazcodes
+ \fi
+ \def\do##1{\sfcode`##1=\blx@sf@prefixchar}%
+ \dolistloop\blx@prefchars
+}
+
+\begingroup
+\let\blx@setazcodes\@empty
+\def\blx@tempa{%
+ \xdef\blx@setazcodes{%
+ \blx@setazcodes
+ \sfcode\the\blx@tempcnta=\@m}
+ \ifnum\blx@tempcnta<\blx@tempcntb
+ \advance\blx@tempcnta\@ne
+ \expandafter\blx@tempa
+ \fi}
+\blx@tempcnta`\A
+\blx@tempcntb`\Z
+\blx@tempa
+\ifnum\inputlineno=\m@ne\else
+ \blx@tempcnta"80
+ \blx@tempcntb"9C
+ \blx@tempa
+ \blx@tempcnta"C0
+ \blx@tempcntb"DF
+ \blx@tempa
+\fi
+\endgroup
+
+\def\blx@spacefactor{%
+ \ifhmode
+ \ifcsundef{blx@sf@\the\spacefactor}
+ {\the\spacefactor}
+ {\csname blx@sf@\the\spacefactor\endcsname}%
+ \else
+ \the\blx@sf@par
+ \fi}
+
+\protected\def\blx@leavevmode{%
+ \ifhmode
+ \else
+ \leavevmode\spacefactor\blx@sf@par
+ \fi}
+
+\protected\def\blx@leavevmode@cite{%
+ \ifhmode
+ \ifnum\spacefactor=\blx@sf@par
+ \else
+ \spacefactor\@m
+ \fi
+ \else
+ \leavevmode
+ \fi}
+
+\protected\def\blx@imc@setpunctfont#1{%
+ \blx@ifpuncthook
+ {\gdef\abx@puncthook{%
+ \ifdim\lastkern>\z@\unkern\fi
+ \blx@imc@resetpunctfont#1}}
+ {}}
+\protected\def\blx@imc@resetpunctfont{%
+ \blx@ifpuncthook
+ {\global\let\abx@puncthook\@firstofone}
+ {}}
+
+\protected\def\blx@setpostpunct#1{%
+ \blx@ifuspunct
+ {\global\let\blx@postpunct\blx@dopostpunct
+ \ifdef\blx@thepostpunct
+ {\gappto\blx@thepostpunct{#1}}
+ {\gdef\blx@thepostpunct{#1}}}
+ {}}
+
+\def\blx@dopostpunct{%
+ \blx@thepostpunct
+ \global\let\blx@postpunct\@empty
+ \global\undef\blx@thepostpunct}
+
+\protected\def\blx@postpunct@agroup{%
+ \aftergroup\blx@postpunct
+ \let\blx@postpunct@agroup\@empty}
+
+% {<characters>}
+\newrobustcmd*{\DeclareCapitalPunctuation}[1]{%
+ \cslet{blx@cap@\the\blx@sf@par}\@empty
+ \csundef{blx@cap@\the\blx@sf@comma}%
+ \csundef{blx@cap@\the\blx@sf@semicolon}%
+ \csundef{blx@cap@\the\blx@sf@colon}%
+ \csundef{blx@cap@\the\blx@sf@period}%
+ \csundef{blx@cap@\the\blx@sf@exclam}%
+ \csundef{blx@cap@\the\blx@sf@question}%
+ \ifblank{#1}
+ {}
+ {\expandafter\blx@defcapstring\detokenize{#1}\relax}}
+
+\def\blx@defcapstring#1{%
+ \ifx#1\relax
+ \else
+ \begingroup
+ \blx@setfrcodes
+ \ifcsdef{blx@pm@#1}
+ {\expandafter\endgroup
+ \expandafter\let
+ \csname blx@cap@\the\sfcode`#1\endcsname\@empty}
+ {\blx@warning{Ignoring invalid punctuation mark '#1'}%
+ \endgroup}%
+ \expandafter\blx@defcapstring
+ \fi}
+
+% {<characters>}
+\newrobustcmd*{\DeclareQuotePunctuation}[1]{%
+ \csdef{blx@qp@comma}{\blx@postpunct}%
+ \csdef{blx@qp@semicolon}{\blx@postpunct}%
+ \csdef{blx@qp@colon}{\blx@postpunct}%
+ \csdef{blx@qp@period}{\blx@postpunct}%
+ \csdef{blx@qp@exclam}{\blx@postpunct}%
+ \csdef{blx@qp@question}{\blx@postpunct}%
+ \cslet{blx@pq@comma}\@empty
+ \cslet{blx@pq@semicolon}\@empty
+ \cslet{blx@pq@colon}\@empty
+ \cslet{blx@pq@period}\@empty
+ \cslet{blx@pq@exclam}\@empty
+ \cslet{blx@pq@question}\@empty
+ \let\blx@quotepunct\@empty
+ \ifblank{#1}
+ {\let\blx@ifuspunct\@secondoftwo}
+ {\let\blx@ifuspunct\@firstoftwo
+ \expandafter\blx@defquotepunct\detokenize{#1}&}}
+
+\def\blx@defquotepunct#1{%
+ \ifx&#1\relax
+ \else
+ \ifcsdef{blx@pm@#1}
+ {\appto\blx@quotepunct{#1}%
+ \cslet{blx@qp@\csuse{blx@pm@#1}}\@empty
+ \csdef{blx@pq@\csuse{blx@pm@#1}}{\blx@postpunct}}
+ {\blx@warning{Ignoring invalid punctuation mark '#1'}}%
+ \expandafter\blx@defquotepunct
+ \fi}
+
+% {<mark>}{<characters>}
+\newrobustcmd*{\DeclarePunctuationPairs}[2]{%
+ \ifcsdef{blx@sf@\detokenize{#1}}
+ {\ifnum\csname blx@sf@\detokenize{#1}\endcsname>\blx@sf@prefixchar
+ \ifnum\csname blx@sf@\detokenize{#1}\endcsname<\blx@sf@nopunct
+ \expandafter\blx@defpunctpairs
+ \expandafter{\the\csname blx@sf@\detokenize{#1}\endcsname}{#2}%
+ \else
+ \blx@err@invarg{\detokenize{#1}{}}%
+ \fi
+ \else
+ \blx@err@invarg{\detokenize{#1}{}}%
+ \fi}
+ {\blx@err@invarg{\detokenize{#1}{}}}}
+
+\def\blx@defpunctpairs#1#2{%
+ \blx@undefpair{#1}{\the\blx@sf@dot}%
+ \blx@undefpair{#1}{\the\blx@sf@comma}%
+ \blx@undefpair{#1}{\the\blx@sf@semicolon}%
+ \blx@undefpair{#1}{\the\blx@sf@colon}%
+ \blx@undefpair{#1}{\the\blx@sf@period}%
+ \blx@undefpair{#1}{\the\blx@sf@exclam}%
+ \blx@undefpair{#1}{\the\blx@sf@question}%
+ \ifblank{#2}
+ {}
+ {\begingroup
+ \def\blx@tempa{#1}%
+ \let\blx@tempb\@empty
+ \blx@setfrcodes
+ \sfcode`\*=\blx@sf@dot
+ \expandafter\blx@defpair\detokenize{#2}&%
+ \expandafter\endgroup\blx@tempb}}
+
+\def\blx@defpair#1{%
+ \ifx&#1%
+ \else
+ \ifnum\the\sfcode`#1>\blx@sf@prefixchar
+ \ifnum\the\sfcode`#1<\blx@sf@nopunct
+ \eappto\blx@tempb{%
+ \cslet{blx@pp@\blx@tempa @\the\sfcode`#1}\noexpand\@empty}%
+ \else
+ \blx@err@invarg{#1}{}%
+ \fi
+ \else
+ \blx@err@invarg{#1}{}%
+ \fi
+ \expandafter\blx@defpair
+ \fi}
+
+\def\blx@undefpair#1#2{%
+ \ifcsdef{blx@pp@#1@#2}
+ {\csundef{blx@pp@#1@#2}}
+ {}}
+
+\protected\def\blx@resetpunct{%
+ \DeclareCapitalPunctuation{.!?}%
+ \DeclarePunctuationPairs{dot}{}%
+ \DeclarePunctuationPairs{comma}{*!?}%
+ \DeclarePunctuationPairs{semicolon}{*!?}%
+ \DeclarePunctuationPairs{colon}{*!?}%
+ \DeclarePunctuationPairs{period}{}%
+ \DeclarePunctuationPairs{exclam}{*}%
+ \DeclarePunctuationPairs{question}{*}%
+ \DeclareQuotePunctuation{}%
+ \def\abx@dot{\ifdim\lastkern>\z@\unkern\fi.\spacefactor\blx@sf@dot}%
+ \def\abx@comma{\ifdim\lastkern>\z@\unkern\fi\abx@puncthook{,}}%
+ \def\abx@semicolon{\abx@puncthook{;}}%
+ \def\abx@colon{\abx@puncthook{:}}%
+ \def\abx@period{\ifdim\lastkern>\z@\unkern\fi\abx@puncthook{.}}%
+ \def\abx@exclam{\abx@puncthook{!}}%
+ \def\abx@question{\abx@puncthook{?}}%
+ \global\let\abx@puncthook\@firstofone
+ \global\let\blx@postpunct\@empty}
+
+\blx@resetpunct
+
+% {<character>}{<true>}{<false>}
+\protected\def\blx@imc@ifpunctmark#1{%
+ \ifhmode
+ \begingroup
+ \sfcode`\*=\blx@sf@dot
+ \ifnum\sfcode`#1=\spacefactor
+ \endgroup
+ \expandafter\expandafter
+ \expandafter\@firstoftwo
+ \else
+ \endgroup
+ \expandafter\expandafter
+ \expandafter\@secondoftwo
+ \fi
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+
+% {<true>}{<false>}
+\protected\def\blx@imc@ifterm{%
+ \ifhmode
+ \expandafter\blx@imc@ifcapital
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+
+% {<true>}{<false>}
+\protected\def\blx@imc@ifcapital{%
+ \ifcsdef{blx@cap@\blx@spacefactor}}
+
+% {<true>}{<false>}
+\protected\def\blx@imc@ifpunct{%
+ \ifnum\blx@spacefactor>\blx@sf@threshold@low
+ \ifnum\blx@spacefactor<\blx@sf@threshold@high
+ \expandafter\expandafter
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\expandafter
+ \expandafter\@secondoftwo
+ \fi
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+
+% {<character>}
+\newrobustcmd*{\autocap}[1]{#1}
+
+\protected\def\blx@imc@autocap{%
+ \blx@imc@ifcapital\MakeCapital\@firstofone}
+
+\protected\def\blx@imc@nopunct{%
+ \leavevmode\spacefactor\blx@sf@nopunct}
+
+\protected\def\blx@imc@isdot{%
+ \ifnum\blx@spacefactor=\blx@sf@period
+ \spacefactor\blx@sf@dot
+ \fi}
+
+\protected\def\blx@imc@adddot{%
+ \blx@addpunct{dot}%
+ \ifnum\blx@spacefactor=\blx@sf@period
+ \spacefactor\blx@sf@dot
+ \fi}
+
+\protected\def\blx@imc@addperiod{%
+ \blx@addpunct{period}%
+ \ifnum\blx@spacefactor=\blx@sf@dot
+ \spacefactor\blx@sf@period
+ \fi}
+
+\protected\def\blx@imc@addcomma{\blx@addpunct{comma}}
+\protected\def\blx@imc@addsemicolon{\blx@addpunct{semicolon}}
+\protected\def\blx@imc@addcolon{\blx@addpunct{colon}}
+\protected\def\blx@imc@addexclam{\blx@addpunct{exclam}}
+\protected\def\blx@imc@addquestion{\blx@addpunct{question}}
+
+\def\blx@addpunct#1{%
+ \unspace
+ \ifnum\blx@spacefactor<\blx@sf@threshold@low
+ \csuse{blx@qp@#1}\csuse{abx@#1}%
+ \else
+ \ifnum\blx@spacefactor>\blx@sf@threshold@high
+ \csuse{blx@qp@#1}\csuse{abx@#1}%
+ \else
+ \ifcsdef{blx@pp@\the\csname blx@sf@#1\endcsname @\blx@spacefactor}
+ {\csuse{blx@qp@#1}\csuse{abx@#1}}
+ {\csuse{blx@qp@#1}}%
+ \fi
+ \fi
+ \csuse{blx@pq@#1}}
+
+\providerobustcmd*{\unspace}{%
+ \ifbool{hmode}
+ {\ifdimgreater\lastskip\z@
+ {\unskip\unspace}
+ {\ifnumgreater\lastpenalty\z@
+ {\unpenalty\unspace}
+ {}}}
+ {}}
+
+\newrobustcmd*{\bibsentence}{%
+ \leavevmode\spacefactor\blx@sf@par
+ \ignorespaces}
+
+\newrobustcmd*{\midsentence}{%
+ \leavevmode
+ \@ifstar
+ {\ifnum\spacefactor=\blx@sf@dot
+ \else
+ \spacefactor\@m
+ \fi}
+ {\spacefactor\@m}}
+
+\newrobustcmd*{\addslash}{%
+ \unspace/\penalty\hyphenpenalty\hskip\z@skip}
+
+\newrobustcmd*{\addspace}{%
+ \unspace\blx@postpunct
+ \space\blx@imc@resetpunctfont}
+
+\newrobustcmd*{\addnbspace}{%
+ \unspace\blx@postpunct
+ \nobreak\space\blx@imc@resetpunctfont}
+
+\newrobustcmd*{\addthinspace}{%
+ \unspace\blx@postpunct
+ \hskip0.16667em\relax
+ \blx@imc@resetpunctfont}
+
+\newrobustcmd*{\addnbthinspace}{%
+ \unspace\blx@postpunct
+ \nobreak\hskip0.16667em\relax
+ \blx@imc@resetpunctfont}
+
+\newrobustcmd*{\addlowpenspace}{%
+ \unspace\blx@postpunct
+ \penalty\value{lownamepenalty}\space
+ \blx@imc@resetpunctfont}
+
+\newrobustcmd*{\addhighpenspace}{%
+ \unspace\blx@postpunct
+ \penalty\value{highnamepenalty}\space
+ \blx@imc@resetpunctfont}
+
+\newrobustcmd*{\addlpthinspace}{%
+ \unspace\blx@postpunct
+ \penalty\value{lownamepenalty}%
+ \hskip0.16667em\relax\blx@imc@resetpunctfont}
+
+\newrobustcmd*{\addhpthinspace}{%
+ \unspace\blx@postpunct
+ \penalty\value{highnamepenalty}%
+ \hskip0.16667em\relax\blx@imc@resetpunctfont}
+
+\newrobustcmd*{\addabbrvspace}{%
+ \unspace\blx@postpunct
+ \penalty\value{abbrvpenalty}%
+ \space\blx@imc@resetpunctfont}
+
+\newrobustcmd*{\addabthinspace}{%
+ \unspace\blx@postpunct
+ \penalty\value{abbrvpenalty}%
+ \hskip0.16667em\relax
+ \blx@imc@resetpunctfont}
+
+\newrobustcmd*{\adddotspace}{%
+ \unspace\adddot\blx@postpunct
+ \penalty\value{abbrvpenalty}%
+ \space\blx@imc@resetpunctfont}
+
+\providerobustcmd*{\noligature}{%
+ \penalty\@M\discretionary{-}{}{\kern0.03em}%
+ \nobreak\hskip\z@skip}
+
+\providerobustcmd*{\hyphen}{%
+ \nobreak-\nobreak\hskip\z@skip}
+
+\providerobustcmd*{\nbhyphen}{%
+ \nobreak\mbox{-}\nobreak\hskip\z@skip}
+
+\providerobustcmd*{\hyphenate}{%
+ \nobreak\-\nobreak\hskip\z@skip}
+
+\providerobustcmd*{\allowhyphens}{%
+ \nobreak\hskip\z@skip}
+
+% Idea from Peter Wilson's hyphenat package
+% https://ctan.org/pkg/hyphenat
+% also https://texfaq.org/FAQ-hyphoff
+\newlanguage\blx@langwohyphens
+
+\providerobustcmd*{\nohyphenation}{%
+ \language\blx@langwohyphens}
+
+% First part of workaround for odd XeTeX/babel-french behaviour
+% https://github.com/plk/biblatex/issues/979
+% fix by Ulrike Fischer
+% https://tex.stackexchange.com/a/544914/.
+% The second bit lives in blx-unicode.def.
+\ifundef\XeTeXrevision
+ {\providerobustcmd*{\textnohyphenation}[1]{%
+ \bgroup\nohyphenation#1\egroup}}
+ {}
+
+\blx@regimcs{%
+ \setpunctfont \resetpunctfont \ifcapital \autocap \ifpunctmark
+ \ifpunct \ifterm \nopunct \isdot \adddot \addperiod \addcomma
+ \addsemicolon \addcolon \addexclam \addquestion}
+
+\appto\blx@blxinit{%
+ \appto\nocorrlist{\isdot\adddot\addperiod\addcomma}}
+
+%% Style definition
+
+% {<bibstyle>}
+\newrobustcmd*{\RequireBibliographyStyle}[1]{%
+ \blx@inputonce{#1.bbx}{bibliography style '#1'}{}{}{}
+ {\blx@error
+ {Style '#1' not found}
+ {The bibliography style '#1' could not be found}}}
+\@onlypreamble\RequireBibliographyStyle
+
+% {<code>}
+\newrobustcmd*{\InitializeBibliographyStyle}{\appto\blx@hook@bbxinit}
+\@onlypreamble\InitializeBibliographyStyle
+
+% {<entry type>}{<driverdef>}
+\newrobustcmd*{\DeclareBibliographyDriver}[1]{%
+ \blx@declarebibdriver{#1}}
+\@onlypreamble\DeclareBibliographyDriver
+
+\long\def\blx@declarebibdriver#1#2{\long\csdef{blx@bbx@#1}{#2}}
+
+
+
+% {<entry type>}
+\def\blx@driver#1{%
+ \ifcsdef{blx@bbx@#1}
+ {\csuse{blx@bbx@#1}}
+ {\ifcsdef{blx@bbx@*}
+ {\blx@warning{%
+ No driver for '#1'.\MessageBreak
+ Using fallback driver}%
+ \csuse{blx@bbx@*}}
+ {\blx@error
+ {No driver for '#1' found}
+ {I can't find a driver for
+ '#1'\MessageBreak
+ (entry type '\abx@field@@@entrytype')\MessageBreak
+ and there is no fallback driver either}}}}
+
+% {<type>}{<true>}{<false>}
+\def\blx@imc@ifdriver#1{\ifcsdef{blx@bbx@#1}}
+
+% {<alias>}{<type>}
+\newrobustcmd*{\DeclareBibliographyAlias}[2]{%
+ \csedef{blx@bbx@#1}{%
+ \expandafter\noexpand\csname blx@bbx@#2\endcsname}}
+\@onlypreamble\DeclareBibliographyAlias
+
+%% Auxiliary commands
+\newrobustcmd*{\citereset}{%
+ \csuse{blx@hook@cbxinit}%
+ \@ifstar
+ {}
+ {\global\cslet{blx@bsee@\the\c@refsection}\@empty
+ \global\cslet{blx@fsee@\the\c@refsection}\@empty
+ \blx@ibidreset@force
+ \blx@idemreset@force
+ \blx@opcitreset@force
+ \blx@loccitreset@force}}
+
+\def\blx@save#1{%
+ \ifcsdef{blx@saved@#1}
+ {}
+ {\blx@safe@actives
+ \csletcs{blx@saved@#1}{#1}%
+ \blx@rest@actives}}
+
+\def\blx@restore#1{%
+ \ifcsdef{blx@saved@#1}
+ {\blx@safe@actives
+ \csletcs{#1}{blx@saved@#1}%
+ \csundef{blx@saved@#1}%
+ \blx@rest@actives}
+ {}}
+
+\newrobustcmd*{\savecommand}[1]{%
+ \ifcsdef{blx@saved@cmd@\detokenize{#1}}
+ {}
+ {\cslet{blx@saved@cmd@\detokenize{#1}}{#1}}}
+
+\newrobustcmd*{\restorecommand}[1]{%
+ \ifcsdef{blx@saved@cmd@\detokenize{#1}}
+ {\letcs{#1}{blx@saved@cmd@\detokenize{#1}}%
+ \csundef{blx@saved@cmd@\detokenize{#1}}}
+ {}}
+
+% {<name>}
+\newrobustcmd*{\savebibmacro}[1]{%
+ \blx@save{abx@macro@\detokenize{#1}}}
+
+\newrobustcmd*{\restorebibmacro}[1]{%
+ \blx@restore{abx@macro@\detokenize{#1}}}
+
+% {<name>}[<args>][<optarg>]{<definition>}
+\newrobustcmd*{\newbibmacro}{%
+ \@star@or@long\blx@newbibmacro}
+
+\def\blx@newbibmacro#1{%
+ \ifcsundef{abx@macro@\detokenize{#1}}
+ {\blx@defbibmacro\new@command{#1}}
+ {\blx@warning{%
+ Macro '\detokenize{#1}' already defined.\MessageBreak
+ Using \string\renewbibmacro}
+ \blx@defbibmacro\renew@command{#1}}}
+
+\newrobustcmd*{\renewbibmacro}{%
+ \@star@or@long\blx@renewbibmacro}
+
+\def\blx@renewbibmacro#1{%
+ \ifcsundef{abx@macro@\detokenize{#1}}
+ {\blx@warning{%
+ Macro '\detokenize{#1}' undefined.\MessageBreak
+ Using \string\newbibmacro}
+ \blx@defbibmacro\new@command{#1}}
+ {\blx@defbibmacro\renew@command{#1}}}
+
+\newrobustcmd*{\providebibmacro}{%
+ \@star@or@long{\blx@defbibmacro\provide@command}}
+
+\def\blx@defbibmacro#1#2{%
+ \expandafter#1\csname abx@macro@\detokenize{#2}\endcsname}
+
+% {<alias>}{<name>}
+\newrobustcmd*{\letbibmacro}{%
+ \@ifstar
+ {\blx@letbibmacro@i}
+ {\blx@letbibmacro}}
+
+\def\blx@letbibmacro#1#2{%
+ \blx@letbibmacro@i{\detokenize{#1}}{\detokenize{#2}}}
+
+\def\blx@letbibmacro@i#1#2{%
+ \ifcsundef{abx@macro@#2}
+ {\blx@error
+ {Bibliography macro '#2' undefined}
+ {Use '\string\newbibmacro' to define this macro}}
+ {\csletcs{abx@macro@#1}{abx@macro@#2}}}
+
+% {<name>}
+\newrobustcmd*{\usebibmacro}{%
+ \@ifstar
+ {\blx@usebibmacro@i}
+ {\blx@usebibmacro}}
+
+\def\blx@usebibmacro#1{%
+ \blx@usebibmacro@i{\detokenize{#1}}}
+
+\def\blx@usebibmacro@i#1{%
+ \ifcsundef{abx@macro@#1}
+ {\blx@error
+ {Bibliography macro '#1' undefined}
+ {Use '\string\newbibmacro' to define this macro}}
+ {\csuse{abx@macro@#1}}}
+
+% {<name>}{<true>}{<false>}
+\def\blx@imc@ifbibmacroundef#1{%
+ \ifcsundef{abx@macro@#1}}
+
+\def\ifbibmacroundef{\blx@imc@ifbibmacroundef}
+
+% [<msform>][<mslang>]{<field>}
+\DeclareExpandableDocumentCommand{\blx@imc@thefield}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\csuse{abx@field@#1@#2@#3}}
+ {\csuse{abx@field@@@#3}}}
+
+% [<msform>][<mslang>]{<field>}
+\DeclareExpandableDocumentCommand{\blx@imc@strfield}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\ifcsdef{abx@field@#1@#2@#3}
+ {\detokenize\expandafter\expandafter\expandafter
+ {\csname abx@field@#1@#2@#3\endcsname}}
+ {}}
+ {\ifcsdef{abx@field@@@#3}
+ {\detokenize\expandafter\expandafter\expandafter
+ {\csname abx@field@@@#3\endcsname}}
+ {}}}
+
+\def\blx@imc@csfield{\usefield{\unexpanded}}
+
+% {<command>}[msform][mslang]{<field>}
+\DeclareExpandableDocumentCommand{\blx@imc@usefield}
+ {m O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#4}
+ {\expandafter\expandafter\expandafter#1%
+ \expandafter\expandafter\expandafter{\csname abx@field@#2@#3@#4\endcsname}}
+ {\expandafter\expandafter\expandafter#1%
+ \expandafter\expandafter\expandafter{\csname abx@field@@@#4\endcsname}}}
+
+% [msform][mslang]{<plainlist>}
+\DeclareExpandableDocumentCommand{\blx@imc@thelist}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\csuse{abx@list@#1@#2@#3}}
+ {\csuse{abx@list@@@#3}}}
+
+\DeclareExpandableDocumentCommand{\blx@imc@strlist}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\ifcsdef{abx@list@#1@#2@#3}
+ {\detokenize\expandafter\expandafter\expandafter
+ {\csname abx@list@#1@#2@#3\endcsname}}
+ {}}
+ {\ifcsdef{abx@list@@@#3}
+ {\detokenize\expandafter\expandafter\expandafter
+ {\csname abx@list@@@#3\endcsname}}
+ {}}}
+
+\DeclareExpandableDocumentCommand{\blx@imc@thefirstlistitem}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \blx@imc@thefirstlistitem@grab
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ {\csuse{abx@list@#1@#2@#3}}}
+ {\expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \blx@imc@thefirstlistitem@grab
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ {\csuse{abx@list@@@#3}}}}
+
+\def\blx@imc@thefirstlistitem@grab#1{%
+ \blx@imc@thefirstlistitem@grab@i
+ #1{}{}%
+ \blx@imc@thefirstlistitem@grab@i@end}
+\def\blx@imc@thefirstlistitem@grab@i#1#2\blx@imc@thefirstlistitem@grab@i@end{#1}
+
+% {<command>}[msform][mslang]{<field>}
+% needs 7 levels of expansion, i.e. 2^7-1=127 '\expandafter's
+\DeclareExpandableDocumentCommand{\blx@imc@usefirstlistitem}
+ {m O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter
+ #1%
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter
+ {\blx@imc@thefirstlistitem[{#2}][{#3}]{#4}}}
+ {\expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter
+ #1%
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter
+ {\blx@imc@thefirstlistitem{#4}}}}
+
+\DeclareExpandableDocumentCommand{\blx@imc@strfirstlistitem}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\ifcsdef{abx@list@#1@#2@#3}
+ {\blx@imc@usefirstlistitem{\detokenize}[{#1}][{#2}]{#3}}
+ {}}
+ {\ifcsdef{abx@list@@@#3}
+ {\blx@imc@usefirstlistitem{\detokenize}{#3}}
+ {}}}
+
+% [msform][mslang]{<namelist>}
+\DeclareExpandableDocumentCommand{\blx@imc@thename}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\csuse{abx@name@#1@#2@#3}}
+ {\csuse{abx@name@@@#3}}}
+
+\DeclareExpandableDocumentCommand{\blx@imc@strname}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\ifcsdef{abx@name@#1@#2@#3}
+ {\detokenize\expandafter\expandafter\expandafter
+ {\csname abx@name@#1@#2@#3\endcsname}}
+ {}}
+ {\ifcsdef{abx@name@@@#3}
+ {\detokenize\expandafter\expandafter\expandafter
+ {\csname abx@name@@@#3\endcsname}}
+ {}}}
+
+% We have to save cleared fields/lists/names in case a related entry
+% needs them for tests
+\let\abx@dorelfields\@empty
+\let\abx@dorellists\@empty
+\let\abx@dorelnames\@empty
+
+% [<msform>][<mslang>]{<field>}
+% If there is a related field in the entry, save a special copy in case
+% the related entry needs it for tests. See the corresponding tests in
+% \blx@saverelfield
+\DeclareDocumentCommand{\blx@imc@clearfield}
+ {O{} O{} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\ifboolexpr{ test {\ifblank{#1}}
+ and test {\ifblank{#2}} }
+ % clear all alternates of a multiscript field
+ {\blx@imc@iffieldundef{#3}
+ {}
+ {\let\blx@tempi\@empty
+ \begingroup
+ \def\do##1{%
+ \begingroup
+ \def\do####1{%
+ \ifdef\abx@field@@@related
+ {\gappto\blx@tempi{\csletcs{abx@field@##1@####1@relsaved#3}{abx@field@##1@####1@#3}}%
+ \gappto\blx@tempi{\listadd\abx@dorelfields{{{##1}{####1}{#3}}}}}
+ {}%
+ \gappto\blx@tempi{\csundef{abx@field@##1@####1@#3}}}%
+ \dolistcsloop{abx@fieldmslangs@#3}%
+ \endgroup}%
+ \dolistcsloop{abx@fieldmsforms@#3}%
+ \endgroup
+ \blx@tempi\global\undef\blx@tempi}}
+ % clear specific alternate of a multiscript field
+ {\blx@imc@iffieldundef[{#1}][{#2}]{#3}
+ {}
+ {\ifdef\abx@field@@@related
+ {\csletcs{abx@field@#1@#2@relsaved#3}{abx@field@#1@#2@#3}%
+ \listadd\abx@dorelfields{{{#1}{#2}{#3}}}}
+ {}%
+ \csundef{abx@field@#1@#2@#3}}}%
+ \csundef{abx@field@#3}}
+ % clear non multiscript field
+ {\blx@imc@iffieldundef{#3}
+ {}
+ {\ifdef\abx@field@@@related
+ {\csletcs{abx@field@@@relsaved#3}{abx@field@@@#3}%
+ \listadd\abx@dorelfields{{{}{}{#3}}}}
+ {}%
+ \csundef{abx@field@@@#3}%
+ \csundef{abx@field@#3}}}}
+
+% [<msform>][<mslang>]{<plainlist>}
+% If there is a related field in the entry, save a special copy in case
+% the related entry needs it for tests. See the corresponding tests in
+% \blx@saverellist
+\DeclareDocumentCommand{\blx@imc@clearlist}
+ {O{} O{} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\ifboolexpr{ test {\ifblank{#1}}
+ and test {\ifblank{#2}} }
+ % clear all alternates of a multiscript list
+ {\blx@imc@iflistundef{#3}
+ {}
+ {\let\blx@tempi\@empty
+ \begingroup
+ \def\do##1{%
+ \begingroup
+ \def\do####1{%
+ \ifdef\abx@field@@@related
+ {\gappto\blx@tempi{\csletcs{abx@list@##1@####1@relsaved#3}{abx@list@##1@####1@#3}}%
+ \gappto\blx@tempi{\csletcs{etb@tgl@abx@bool@morerelsaved#3}{etb@tgl@abx@bool@more#3}}%
+ \gappto\blx@tempi{\csletcs{c@relsaved#3}{c@#3}}%
+ \gappto\blx@tempi{\listadd\abx@dorellists{{##1}{####1}{#3}}}}
+ {}%
+ \gappto\blx@tempi{\togglefalse{abx@bool@more#3}}%
+ \gappto\blx@tempi{\csundef{abx@list@##1@####1@#3}}%
+ \gappto\blx@tempi{\csname c@#3\endcsname\z@}}%
+ \dolistcsloop{abx@fieldmslangs@#3}%
+ \endgroup}%
+ \dolistcsloop{abx@fieldmsforms@#3}%
+ \endgroup
+ \blx@tempi\global\undef\blx@tempi}}
+ % clear specific alternate of a multiscript list
+ {\blx@imc@iflistundef[{#1}][{#2}]{#3}
+ {}
+ {\ifdef\abx@field@@@related
+ {\csletcs{abx@list@#1@#2@relsaved#3}{abx@list@#1@#2@#3}%
+ \listadd\abx@dorellists{{#1}{#2}{#3}}}
+ {}%
+ \csundef{abx@list@#1@#2@#3}}}%
+ \csundef{abx@list@#3}}
+ % clear non multiscript list
+ {\blx@imc@iflistundef{#3}
+ {}
+ {\ifdef\abx@field@@@related
+ {\csletcs{abx@list@@@relsaved#3}{abx@list@@@#3}%
+ \csletcs{etb@tgl@abx@bool@morerelsaved#3}{etb@tgl@abx@bool@more#3}%
+ \csletcs{c@relsaved#3}{c@#3}%
+ \listadd\abx@dorellists{{}{}{#3}}}
+ {}%
+ \togglefalse{abx@bool@more#3}%
+ \csundef{abx@list@@@#3}%
+ \csname c@#3\endcsname\z@
+ \csundef{abx@list@#3}}}}
+
+% [<msform>][<mslang>]{<namelist>}
+% If there is a related field in the entry, save a special copy in case
+% the related entry needs it for tests. See the corresponding tests in
+% \blx@saverelname
+\DeclareDocumentCommand{\blx@imc@clearname}
+ {O{} O{} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\ifboolexpr{ test {\ifblank{#1}}
+ and test {\ifblank{#2}} }
+ % clear all alternates of a multiscript list
+ {\blx@imc@ifnameundef{#3}
+ {}
+ {\let\blx@tempi\@empty
+ \begingroup
+ \def\do##1{%
+ \begingroup
+ \def\do####1{%
+ \ifdef\abx@field@@@related
+ {\gappto\blx@tempi{\csletcs{abx@name@##1@####1@relsaved#3}{abx@name@##1@####1@#3}}%
+ \gappto\blx@tempi{\csletcs{etb@tgl@abx@bool@morerelsaved#3}{etb@tgl@abx@bool@more#3}}%
+ \gappto\blx@tempi{\csletcs{c@relsaved#3}{c@#3}}%
+ \gappto\blx@tempi{\listadd\abx@dorelnames{{##1}{####1}{#3}}}}
+ {}%
+ \gappto\blx@tempi{\togglefalse{abx@bool@more#3}}%
+ \gappto\blx@tempi{\csundef{abx@name@##1@####1@#3}}%
+ \gappto\blx@tempi{\csname c@#3\endcsname\z@}}%
+ \dolistcsloop{abx@fieldmslangs@#3}%
+ \endgroup}%
+ \dolistcsloop{abx@fieldmsforms@#3}%
+ \endgroup
+ \blx@tempi\global\undef\blx@tempi}}
+ % clear specific alternate of a multiscript list
+ {\blx@imc@ifnameundef[{#1}][{#2}]{#3}
+ {}
+ {\ifdef\abx@field@@@related
+ {\csletcs{abx@name@#1@#2@relsaved#3}{abx@name@#1@#2@#3}%
+ \listadd\abx@dorelnames{{#1}{#2}{#3}}}
+ {}%
+ \csundef{abx@name@#1@#2@#3}}}%
+ \csundef{abx@name@#3}}
+ % clear non multiscript list
+ {\blx@imc@ifnameundef{#3}
+ {}
+ {\ifdef\abx@field@@@related
+ {\csletcs{abx@name@@@relsaved#3}{abx@name@@@#3}%
+ \csletcs{etb@tgl@abx@bool@morerelsaved#3}{etb@tgl@abx@bool@more#3}%
+ \csletcs{c@relsaved#3}{c@#3}%
+ \listadd\abx@dorelnames{{}{}{#3}}}
+ {}%
+ \togglefalse{abx@bool@more#3}%
+ \csundef{abx@name@@@#3}%
+ \csname c@#3\endcsname\z@
+ \csundef{abx@name@#3}}}}
+
+% {field|list|name}[<msform>][<mslang>]{<field>}{<macro>}
+\DeclareExpandableDocumentCommand{\blx@savedata}
+ {m O{\blx@msform} O{\blx@lmslang} m m}
+ {\blx@imc@ifmsentryfield{#4}
+ {\letcs#5{abx@#1@#2@#3@#4}}
+ {\letcs#5{abx@#1@@@#4}}}
+
+% {field|list|name}[<msform>][<mslang>]{<field>}{<macro>}
+\DeclareExpandableDocumentCommand{\blx@savedatacs}
+ {m O{\blx@msform} O{\blx@lmslang} m m}
+ {\blx@imc@ifmsentryfield{#4}
+ {\csletcs{#5}{abx@#1@#2@#3@#4}}
+ {\csletcs{#5}{abx@#1@@@#4}}}
+
+% [<msform>][<mslang>]{<field>}{<macro>}
+\DeclareDocumentCommand{\blx@imc@restorefield}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\cslet{abx@field@#1@#2@#3}}
+ {\cslet{abx@field@@@#3}}}
+
+% [<msform>][<mslang>]{<plainlist>}{<macro>}
+\DeclareDocumentCommand{\blx@imc@restorelist}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\cslet{abx@list@#1@#2@#3}}
+ {\cslet{abx@list@@@#3}}}
+
+% [<msform>][<mslang>]{<namelist>}{<macro>}
+\DeclareDocumentCommand{\blx@imc@restorename}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\cslet{abx@name@#1@#2@#3}}
+ {\cslet{abx@name@@@#3}}}
+
+% [<msform>][<mslang>]{<field>}{<macro>}
+\protected\def\blx@imc@savefield{%
+ \@ifstar{\blx@savedata{field}}{\global\blx@savedata{field}}}
+
+% {<plainlist>}{<macro>}
+\protected\def\blx@imc@savelist{%
+ \@ifstar{\blx@savedata{list}}{\global\blx@savedata{list}}}
+
+% {<namelist>}{<macro>}
+\protected\def\blx@imc@savename{%
+ \@ifstar{\blx@savedata{name}}{\global\blx@savedata{name}}}
+
+% {<field>}{<csname>}
+\protected\def\blx@imc@savefieldcs{%
+ \@ifstar{\blx@savedatacs{field}}{\global\blx@savedatacs{field}}}
+
+% {<plainlist>}{<csname>}
+\protected\def\blx@imc@savelistcs{%
+ \@ifstar{\blx@savedatacs{list}}{\global\blx@savedatacs{list}}}
+
+% {<namelist>}{<csname>}
+\protected\def\blx@imc@savenamecs{%
+ \@ifstar{\blx@savedatacs{name}}{\global\blx@savedatacs{name}}}
+
+% {<entryfield>}
+\def\blx@imc@ifentryfieldundef#1{%
+ \ifcsundef{abx@entryfield@#1}}
+
+% {field|list|name}[<msform>][<mslang>]{<entryfield>}{<true>}{<false>}
+\DeclareExpandableDocumentCommand{\blx@ifmsundef}
+ {m O{} O{} m}
+ {\blx@imc@ifmsentryfield{#4}
+ {\ifstrempty{#2}
+ {\ifstrempty{#3}
+ {\ifcsundef{abx@#1@#4}}
+ {\ifcsundef{abx@#1@\blx@msform @#3@#4}}}
+ {\ifstrempty{#3}
+ {\ifcsundef{abx@#1@#2@\blx@mslang @#4}}
+ {\ifcsundef{abx@#1@#2@#3@#4}}}}
+ {\ifcsundef{abx@#1@@@#4}}}% ignore form/lang for non-multiscript
+
+% [<msform>][<mslang>]{<field>}{<true>}{<false>}
+\def\blx@imc@iffieldundef{%
+ \blx@ifmsundef{field}}
+
+% [<msform>][<mslang>]{<plainlist>}{<true>}{<false>}
+\def\blx@imc@iflistundef{%
+ \blx@ifmsundef{list}}
+
+% [<msform>][<mslang>]{<namelist>}{<true>}{<false>}
+\def\blx@imc@ifnameundef{%
+ \blx@ifmsundef{name}}
+
+% [<msform>][<mslang>]{<field1>}[<msform>][<mslang>]{<field2>}{<true>}{<false>}
+\DeclareExpandableDocumentCommand{\blx@imc@iffieldsequal}
+ {O{\blx@msform} O{\blx@lmslang} m O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\def\blx@tempa{abx@field@#1@#2@#3}}
+ {\def\blx@tempa{abx@field@@@#3}}%
+ \blx@imc@ifmsentryfield{#6}
+ {\def\blx@tempb{abx@field@#4@#5@#6}}
+ {\def\blx@tempb{abx@field@@@#6}}%
+ \ifcsequal{\blx@tempa}{\blx@tempb}}
+
+% [<msform>][<mslang>]{<plainlist1>}[<msform>][<mslang>]{<plainlist2>}{<true>}{<false>}
+\DeclareExpandableDocumentCommand{\blx@imc@iflistsequal}
+ {O{\blx@msform} O{\blx@lmslang} m O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\def\blx@tempa{abx@list@#1@#2@#3}}
+ {\def\blx@tempa{abx@list@@@#3}}%
+ \blx@imc@ifmsentryfield{#6}
+ {\def\blx@tempb{abx@list@#4@#5@#6}}
+ {\def\blx@tempb{abx@list@@@#6}}%
+ \ifcsequal\blx@tempa\blx@tempb}
+
+% This works by extracting a list of all of the name list hashes "{hash1}{hash2}..."
+% from the individual names and comparing these lists of hashes
+% [<msform>][<mslang>]{<namelist1>}[<msform>][<mslang>]{<namelist2>}{<true>}{<false>}
+\DeclareExpandableDocumentCommand{\blx@imc@ifnamesequal}
+ {O{\blx@msform} O{\blx@lmslang} m O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\def\blx@tempa{abx@name@#1@#2@#3}}
+ {\def\blx@tempa{abx@name@@@#3}}%
+ \blx@imc@ifmsentryfield{#6}
+ {\def\blx@tempb{abx@name@#4@#5@#6}}
+ {\def\blx@tempb{abx@name@@@#6}}%
+ \ifcsundef\blx@tempa
+ {\@secondoftwo}
+ {\ifcsundef\blx@tempb
+ {\@secondoftwo}
+ {\blx@ifnamesequal\blx@tempa\blx@tempb}}}
+
+\def\blx@ifnamesequal#1#2{%
+ \begingroup
+ \let\blx@tempc\@empty
+ \expandafter\expandafter
+ \expandafter\blx@ifnamesequal@i\csname #2\endcsname
+ \let\blx@tempd\blx@tempc
+ \let\blx@tempc\@empty
+ \expandafter\expandafter
+ \expandafter\blx@ifnamesequal@i\csname #1\endcsname
+ \expandafter\endgroup
+ \ifx\blx@tempc\blx@tempd
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+
+\def\blx@ifnamesequal@i#1#2{%
+ \expandafter\blx@ifnamesequal@ii#2{}&}
+
+\def\blx@ifnamesequal@ii#1{%
+ \ifblank{#1}
+ {\blx@namebreak}
+ {\blx@ifnamesequal@iii#1%
+ \blx@ifnamesequal@ii}}
+
+% These explicit nameparts are alright as they are for bibtex only
+% biber names will always have a hash generated from all nameparts in datamodel
+\def\blx@ifnamesequal@iii#1#2{%
+ \blx@kv@setkeys{blx@opt@name}{#1}%
+ \blx@kv@setkeys{blx@opt@namepart}{#2}%
+ \ifdef\abx@field@@@hash
+ {\eappto\blx@tempc{{\abx@field@@@hash}}}
+ {\eappto\blx@tempc{{{\namepartfamily}{\namepartgiven}{\namepartprefix}{\namepartsuffix}}}}}
+
+% [<msform>][<mslang>]{<field>}{<macro>}{<true>}{<false>}
+\DeclareExpandableDocumentCommand{\blx@imc@iffieldequals}
+ {O{\blx@msform} O{\blx@lmslang} m m}
+ {\blx@imc@iffieldundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@imc@ifmsentryfield{#3}
+ {\edef\blx@tempa{\csuse{abx@field@#1@#2@#3}}}
+ {\edef\blx@tempa{\csuse{abx@field@@@#3}}}%
+ \ifundef#4%
+ {\@secondoftwo}
+ {\ifx\blx@tempa#4%
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}}}
+
+% [<msform>][<mslang>]{<plainlist>}{<macro>}{<true>}{<false>}
+\DeclareExpandableDocumentCommand{\blx@imc@iflistequals}
+ {O{\blx@msform} O{\blx@lmslang} m m}
+ {\blx@imc@iflistundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@imc@ifmsentryfield{#3}
+ {\edef\blx@tempa{\csuse{abx@list@#1@#2@#3}}}
+ {\edef\blx@tempa{\csuse{abx@list@@@#3}}}%
+ \ifundef#4%
+ {\@secondoftwo}
+ {\ifx\blx@tempa#4%
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}}}
+
+% This works in much the same way as \blx@imc@ifnamesequal and shares some macros with it
+% [<msform>][<mslang>]{<namelist>}{<macro>}{<true>}{<false>}
+\DeclareExpandableDocumentCommand{\blx@imc@ifnameequals}
+ {O{\blx@msform} O{\blx@lmslang} m m}
+ {\blx@imc@ifnameundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@imc@ifmsentryfield{#3}
+ {\def\blx@tempa{abx@name@#1@#2@#3}}
+ {\def\blx@tempa{abx@name@@@#3}}%
+ \ifundef#4%
+ {\@secondoftwo}
+ {\blx@ifnameequals\blx@tempa#4}}}
+
+\def\blx@ifnameequals#1#2{%
+ \begingroup
+ \let\blx@tempc\@empty
+ \expandafter\blx@ifnamesequal@i#2
+ \let\blx@tempd\blx@tempc
+ \let\blx@tempc\@empty
+ \expandafter\expandafter
+ \expandafter\blx@ifnamesequal@i\csname #1\endcsname
+ \expandafter\endgroup
+ \ifx\blx@tempc\blx@tempd
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+
+% [<msform>][<mslang>]{<field>}{<csname>}{<true>}{<false>}
+\DeclareExpandableDocumentCommand{\blx@imc@iffieldequalcs}
+ {O{\blx@msform} O{\blx@lmslang} m m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\ifcsequal{abx@field@#1@#2@#3}{#4}}
+ {\ifcsequal{abx@field@@@#3}{#4}}}
+
+% [<msform>][<mslang>]{<plainlist>}{<csname>}{<true>}{<false>}
+\DeclareExpandableDocumentCommand{\blx@imc@iflistequalcs}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifmsentryfield{#3}
+ {\ifcsequal{abx@list@#1@#2@#3}}
+ {\ifcsequal{abx@list@@@#3}}}
+
+% [<msform>][<mslang>]{<namelist>}{<csname>}{<true>}{<false>}
+\DeclareExpandableDocumentCommand{\blx@imc@ifnameequalcs}
+ {O{\blx@msform} O{\blx@lmslang} m m}
+ {\blx@imc@ifnameundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@imc@ifmsentryfield{#3}
+ {\def\blx@tempa{abx@name@#1@#2@#3}}
+ {\def\blx@tempa{abx@name@@@#3}}%
+ \ifcsundef{#4}%
+ {\@secondoftwo}
+ {\blx@ifnameequalcs\blx@tempa{#4}}}}
+
+\def\blx@ifnameequalcs#1#2{%
+ \begingroup
+ \let\blx@tempc\@empty
+ \expandafter\expandafter\expandafter\blx@ifnamesequal@i\csname #2\endcsname
+ \let\blx@tempd\blx@tempc
+ \let\blx@tempc\@empty
+ \expandafter\expandafter
+ \expandafter\blx@ifnamesequal@i\csname #1\endcsname
+ \expandafter\endgroup
+ \ifx\blx@tempc\blx@tempd
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+
+% [<msform>][<mslang>]{<field>}{<string>}{<true>}{<false>}
+\DeclareDocumentCommand{\blx@imc@iffieldequalstr}
+ {O{\blx@msform} O{\blx@lmslang} m m}
+ {\blx@imc@iffieldundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@imc@ifmsentryfield{#3}
+ {\def\blx@tempa{abx@field@#1@#2@#3}}
+ {\def\blx@tempa{abx@field@@@#3}}%
+ \expandafter\expandafter\expandafter\ifstrequal
+ \expandafter\expandafter\expandafter{%
+ \csname\blx@tempa\endcsname}{#4}}}
+
+% [<msform>][<mslang>]{<field>}{<true>}{<false>}
+\DeclareExpandableDocumentCommand{\blx@imc@iffieldxref}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@iffieldundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@whichxref
+ {\blx@iffieldxref{#1}{#2}{#3}}
+ {\@secondoftwo}}}
+
+% {<msform>}{<mslang>}{field}{xref|crossref}
+\def\blx@iffieldxref#1#2#3#4{%
+ \begingroup
+ \blx@imc@ifmsentryfield{#3}
+ {\letcs\blx@tempb{abx@field@#1@#2@#3}}
+ {\letcs\blx@tempb{abx@field@@@#3}}%
+ \letcs\blx@tempa{abx@field@@@#4}% xref|crossref - non multi
+ \blx@resetdata
+ \blx@getdata{\blx@tempa}%
+ \blx@imc@iffieldequals[{#1}][{#2}]{#3}\blx@tempb
+ {\aftergroup\@firstoftwo}
+ {\aftergroup\@secondoftwo}%
+ \endgroup}
+
+\def\blx@whichxref#1#2{%
+ \blx@imc@iffieldundef{crossref}
+ {\blx@imc@iffieldundef{xref}
+ {#2}
+ {#1{xref}}}
+ {#1{crossref}}}
+
+% [<msform>][<mslang>]{<plainlist>}{<true>}{<false>}
+\DeclareDocumentCommand{\blx@imc@iflistxref}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@iflistundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@whichxref
+ {\blx@iflistxref{#1}{#2}{#3}}
+ {\@secondoftwo}}}
+
+% {<msform>}{<mslang>}{field}{xref|crossref}
+\def\blx@iflistxref#1#2#3#4{%
+ \begingroup
+ \blx@imc@ifmsentryfield{#3}
+ {\letcs\blx@tempb{abx@list@#1@#2@#3}}
+ {\letcs\blx@tempb{abx@list@@@#3}}%
+ \letcs\blx@tempa{abx@field@@@#4}% xref|crossref - non multi
+ \blx@resetdata
+ \blx@getdata{\blx@tempa}%
+ \blx@imc@iflistequals[{#1}][{#2}]{#3}\blx@tempb
+ {\aftergroup\@firstoftwo}
+ {\aftergroup\@secondoftwo}%
+ \endgroup}
+
+% [<msform>][<mslang>]{<namelist>}{<true>}{<false>}
+\DeclareDocumentCommand{\blx@imc@ifnamexref}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@ifnameundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@whichxref
+ {\blx@ifnamexref{#1}{#2}{#3}}
+ {\@secondoftwo}}}
+
+% {<msform>}{<mslang>}{field}{xref|crossref}
+\def\blx@ifnamexref#1#2#3#4{%
+ \begingroup
+ \blx@imc@ifmsentryfield{#3}
+ {\letcs\blx@tempb{abx@name@#1@#2@#3}}
+ {\letcs\blx@tempb{abx@name@@@#3}}%
+ \letcs\blx@tempa{abx@field@@@#4}% xref|crossref - non multi
+ \blx@resetdata
+ \blx@getdata{\blx@tempa}%
+ \blx@imc@ifnameequals[{#1}][{#2}]{#3}\blx@tempb
+ {\aftergroup\@firstoftwo}
+ {\aftergroup\@secondoftwo}%
+ \endgroup}
+
+% {<string>}{<true>}{<false>}
+\protected\def\blx@imc@ifcurrentfield#1{%
+ \begingroup
+ \def\blx@tempa{#1}%
+ \ifx\currentfield\blx@tempa
+ \aftergroup\@firstoftwo
+ \else
+ \aftergroup\@secondoftwo
+ \fi
+ \endgroup}
+
+% {<string>}{<true>}{<false>}
+\protected\def\blx@imc@ifcurrentlist#1{%
+ \begingroup
+ \def\blx@tempa{#1}%
+ \ifx\currentlist\blx@tempa
+ \aftergroup\@firstoftwo
+ \else
+ \aftergroup\@secondoftwo
+ \fi
+ \endgroup}
+
+% {<string>}{<true>}{<false>}
+\protected\def\blx@imc@ifcurrentname#1{%
+ \begingroup
+ \def\blx@tempa{#1}%
+ \ifx\currentname\blx@tempa
+ \aftergroup\@firstoftwo
+ \else
+ \aftergroup\@secondoftwo
+ \fi
+ \endgroup}
+
+% {<string>}{<true>}{<false>}
+\protected\def\blx@imc@ifentrytype#1{%
+ \begingroup
+ \def\blx@tempa{#1}%
+ \ifx\abx@field@@@entrytype\blx@tempa
+ \aftergroup\@firstoftwo
+ \else
+ \aftergroup\@secondoftwo
+ \fi
+ \endgroup}
+
+% {<true>}{<false>}
+\def\blx@imc@ifmorenames{%
+ \ifundef\currentname
+ {\@secondoftwo}
+ {\iftoggle{abx@bool@more\currentname}
+ {\@firstoftwo}
+ {\ifnum\c@listtotal>\c@liststop
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}}}
+
+% {<true>}{<false>}
+\def\blx@imc@ifmoreitems{%
+ \ifundef\currentlist
+ {\@secondoftwo}
+ {\iftoggle{abx@bool@more\currentlist}
+ {\@firstoftwo}
+ {\ifnum\c@listtotal>\c@liststop
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}}}
+
+
+% {<true>}{<false>}
+%\def\blx@imc@iffirstcitekey{%
+% \ifboolexpr{ ( test {\ifnumequal\c@multicitetotal\z@}
+% and test {\ifnumequal\c@citecount\@ne} )
+% or ( test {\ifnumgreater\c@multicitetotal\z@}
+% and test {\ifnumequal\c@multicitecount\@ne}
+% and test {\ifnumequal\c@citecount\@ne} ) }}
+\def\blx@imc@iffirstcitekey{%
+ \ifnumequal\c@citecount\@ne
+ {\ifnumequal\c@multicitetotal\z@
+ {\@firstoftwo}
+ {\ifnumequal\c@multicitecount\@ne}}
+ {\@secondoftwo}}
+
+\def\blx@imc@iflastcitekey{%
+ \ifnumequal\c@citecount\c@citetotal
+ {\ifnumequal\c@multicitecount\c@multicitetotal}
+ {\@secondoftwo}}
+
+% {<category>}{<true>}{<false>}
+\protected\def\blx@imc@ifcategory{%
+ \ifdef\abx@field@@@entrykey
+ {\blx@imc@ifentrycategory\abx@field@@@entrykey}
+ {\expandafter\@secondoftwo\@gobble}}
+
+% {<entrykey>}{<category>}{<true>}{<false>}
+\protected\def\blx@imc@ifentrycategory{%
+ \blx@xsanitizeafter\blx@imc@ifentrycategory@i}
+
+\def\blx@imc@ifentrycategory@i#1#2{%
+ \ifcsdef{blx@catg@\detokenize{#2}}
+ {\ifinlistcs{#1}{blx@catg@\detokenize{#2}}}
+ {\@secondoftwo}}
+
+% {<keyword>}{<true>}{<false>}
+\protected\def\blx@imc@ifkeyword{%
+ \ifdef\abx@field@@@entrykey
+ {\blx@imc@ifentrykeyword\abx@field@@@entrykey}
+ {\expandafter\@secondoftwo\@gobble}}
+
+% {<entrykey>}{<keyword>}{<true>}{<false>}
+\protected\def\blx@imc@ifentrykeyword{%
+ \blx@xsanitizeafter\blx@imc@ifentrykeyword@i}
+
+\def\blx@imc@ifentrykeyword@i#1#2{%
+ \ifcsdef{blx@keyw@\the\c@refsection @\detokenize{#2}}
+ {\ifinlistcs{#1}{blx@keyw@\the\c@refsection @\detokenize{#2}}}
+ {\@secondoftwo}}
+
+% {<true>}{<false>}
+\protected\def\blx@ifciteseen@global{%
+ \ifbool{citetracker}
+ {\ifdef\abx@field@@@entrykey
+ {\expandafter\blx@ifseen@global
+ \expandafter{\abx@field@@@entrykey}}
+ {\@secondoftwo}}
+ {\@secondoftwo}}
+
+\protected\def\blx@ifciteseen@context{%
+ \ifbool{citetracker}
+ {\ifdef\abx@field@@@entrykey
+ {\expandafter\blx@ifseen@context
+ \expandafter{\abx@field@@@entrykey}}
+ {\@secondoftwo}}
+ {\@secondoftwo}}
+
+\protected\def\blx@ifciteseen@context{%
+ \ifbool{citetracker}
+ {\ifdef\abx@field@@@entrykey
+ {\expandafter\blx@ifseen@context
+ \expandafter{\abx@field@@@entrykey}}
+ {\@secondoftwo}}
+ {\@secondoftwo}}
+
+% {<entrykey>}{<true>}{<false>}
+\protected\def\blx@ifentryseen@global{%
+ \blx@xsanitizeafter\blx@ifseen@global}
+
+\protected\def\blx@ifentryseen@context{%
+ \blx@xsanitizeafter\blx@ifseen@context}
+
+\def\blx@ifseen@global#1{%
+ \ifbool{citetracker}
+ {\ifinlistcs{#1}{blx@bsee@\the\c@refsection}}
+ {\@secondoftwo}}
+
+\def\blx@ifseen@context#1{%
+ \ifbool{citetracker}
+ {\iftoggle{blx@footnote}
+ {\ifinlistcs{#1}{blx@fsee@\the\c@refsection}}
+ {\ifinlistcs{#1}{blx@bsee@\the\c@refsection}}}
+ {\@secondoftwo}}
+
+% {<true>}{<false>}
+\def\blx@ifciteibid@global{%
+ \ifbool{citetracker}
+ {\blx@imc@iffieldequals{entrykey}\blx@lastkey@text}
+ {\@secondoftwo}}
+
+\def\blx@ifciteibid@context{%
+ \ifbool{citetracker}
+ {\iftoggle{blx@footnote}
+ {\blx@imc@iffieldequals{entrykey}\blx@lastkey@foot}
+ {\blx@imc@iffieldequals{entrykey}\blx@lastkey@text}}
+ {\@secondoftwo}}
+
+\def\blx@ifciteibid@strict{%
+ \ifbool{citetracker}
+ {\blx@ifcitesingle
+ {\blx@ifciteibid@global}
+ {\@secondoftwo}}
+ {\@secondoftwo}}
+
+\def\blx@ifciteibid@constrict{%
+ \ifbool{citetracker}
+ {\blx@ifcitesingle
+ {\iftoggle{blx@footnote}
+ {\blx@ifmpfncheck
+ {\blx@imc@iffieldequals{entrykey}\blx@lastkey@foot}
+ {\@secondoftwo}}
+ {\blx@imc@iffieldequals{entrykey}\blx@lastkey@text}}
+ {\@secondoftwo}}
+ {\@secondoftwo}}
+
+% {<true>}{<false>}
+\def\blx@ifciteidem@global{%
+ \ifbool{citetracker}
+ {\blx@imc@iffieldequals{fullhash}\blx@lasthash@text}
+ {\@secondoftwo}}
+
+\def\blx@ifciteidem@context{%
+ \ifbool{citetracker}
+ {\iftoggle{blx@footnote}
+ {\blx@imc@iffieldequals{fullhash}\blx@lasthash@foot}
+ {\blx@imc@iffieldequals{fullhash}\blx@lasthash@text}}
+ {\@secondoftwo}}
+
+\let\blx@ifciteidem@strict\blx@ifciteidem@global
+
+\def\blx@ifciteidem@constrict{%
+ \ifbool{citetracker}
+ {\iftoggle{blx@footnote}
+ {\blx@ifmpfncheck
+ {\blx@imc@iffieldequals{fullhash}\blx@lasthash@foot}
+ {\@secondoftwo}}
+ {\blx@imc@iffieldequals{fullhash}\blx@lasthash@text}}
+ {\@secondoftwo}}
+
+% {<true>}{<false>}
+\def\blx@ifopcit@global{%
+ \ifbool{citetracker}
+ {\blx@imc@iffieldundef{namehash}
+ {\@secondoftwo}
+ {\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@text@\abx@field@@@namehash}}}
+ {\@secondoftwo}}
+
+\def\blx@ifopcit@context{%
+ \ifbool{citetracker}
+ {\blx@imc@iffieldundef{namehash}
+ {\@secondoftwo}
+ {\iftoggle{blx@footnote}
+ {\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@foot@\abx@field@@@namehash}}
+ {\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@text@\abx@field@@@namehash}}}}
+ {\@secondoftwo}}
+
+\def\blx@ifopcit@strict{%
+ \ifbool{citetracker}
+ {\blx@ifcitesingle
+ {\blx@ifopcit@global}
+ {\@secondoftwo}}
+ {\@secondoftwo}}
+
+\def\blx@ifopcit@constrict{%
+ \ifbool{citetracker}
+ {\blx@ifcitesingle
+ {\blx@imc@iffieldundef{namehash}
+ {\@secondoftwo}
+ {\iftoggle{blx@footnote}
+ {\blx@ifmpfncheck
+ {\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@foot@\abx@field@@@namehash}}
+ {\@secondoftwo}}
+ {\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@text@\abx@field@@@namehash}}}}
+ {\@secondoftwo}}
+ {\@secondoftwo}}
+
+% {<true>}{<false>}
+\def\blx@ifloccit@global{%
+ \ifbool{citetracker}
+ {\blx@loccit@check{text}}
+ {\@secondoftwo}}
+
+\def\blx@ifloccit@context{%
+ \ifbool{citetracker}
+ {\iftoggle{blx@footnote}
+ {\blx@loccit@check{foot}}
+ {\blx@loccit@check{text}}}
+ {\@secondoftwo}}
+
+\def\blx@ifloccit@strict{%
+ \ifbool{citetracker}
+ {\blx@ifcitesingle
+ {\blx@loccit@numcheck{text}}
+ {\@secondoftwo}}
+ {\@secondoftwo}}
+
+\def\blx@ifloccit@constrict{%
+ \ifbool{citetracker}
+ {\blx@ifcitesingle
+ {\iftoggle{blx@footnote}
+ {\blx@ifmpfncheck
+ {\blx@loccit@numcheck{foot}}
+ {\@secondoftwo}}
+ {\blx@loccit@numcheck{text}}}
+ {\@secondoftwo}}
+ {\@secondoftwo}}
+
+\def\blx@loccit@check#1{%
+ \blx@imc@iffieldundef{postnote}
+ {\@secondoftwo}
+ {\blx@imc@iffieldequalcs{postnote}{blx@lastnote@#1@\abx@field@@@entrykey}}}
+
+\def\blx@loccit@numcheck#1{%
+ \blx@imc@iffieldundef{postnote}
+ {\@secondoftwo}
+ {\expandafter\blx@imc@ifpages
+ \expandafter{\abx@field@@@postnote}
+ {\blx@imc@iffieldequalcs{postnote}{blx@lastnote@#1@\abx@field@@@entrykey}}
+ {\@secondoftwo}}}
+
+% {<true>}{<false>}
+\def\blx@ifmpfncheck{%
+ \ifnum\numexpr\value\@mpfn-\blx@lastmpfn<\tw@
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+
+\def\blx@mpfnsave{%
+ \xdef\blx@lastmpfn{\the\value\@mpfn}}
+
+\def\blx@mpfnreset{%
+ \global\let\blx@lastmpfn\z@}
+
+\blx@mpfnreset
+
+% {<true>}{<false>}
+\def\blx@imc@iffirstonpage{%
+ \ifbool{pagetracker}
+ {\iftoggle{blx@footnote}
+ {\blx@iffirstonpage{fnpage}}
+ {\blx@iffirstonpage{page}}}
+ {\@secondoftwo}}
+
+\def\blx@iffirstonpage#1{%
+ \ifcsundef{blx@#1@\number\c@instcount}
+ {\@secondoftwo}
+ {\expandafter\blx@iffirstonpage@i
+ \expandafter{\number\numexpr\c@instcount-1}{#1}}}
+
+\def\blx@iffirstonpage@i#1#2{%
+ \ifcsundef{blx@#2@#1}
+ {\ifnum#1>\@ne
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ {\expandafter\blx@iffirstonpage@i
+ \expandafter{\number\numexpr#1-1}{#2}}
+ {\@firstoftwo}}
+ {\ifnum\csuse{blx@#2@\number\c@instcount}=%
+ \csuse{blx@#2@#1} %
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi}}
+
+% {<count1>}{<count2>}{<true>}{<false>}
+\def\blx@imc@ifsamepage#1#2{%
+ \ifbool{pagetracker}
+ {\ifcsundef{blx@page@\number\numexpr#1}
+ {\ifcsundef{blx@fnpage@\number\numexpr#1}
+ {\@secondoftwo}
+ {\blx@ifsamepage{#1}{#2}{fnpage}}}
+ {\blx@ifsamepage{#1}{#2}{page}}}
+ {\@secondoftwo}}
+
+\def\blx@ifsamepage#1#2#3{%
+ \ifcsundef{blx@page@\number\numexpr#2}
+ {\ifcsundef{blx@fnpage@\number\numexpr#2}
+ {\@secondoftwo}
+ {\blx@ifsamepage@i{#1}{#2}{#3}{fnpage}}}
+ {\blx@ifsamepage@i{#1}{#2}{#3}{page}}}
+
+\def\blx@ifsamepage@i#1#2#3#4{%
+ \ifnum\csuse{blx@#3@\number\numexpr#1}=%
+ \csuse{blx@#4@\number\numexpr#2} %
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+
+% {<string>}{<true>}{<false>}
+\protected\long\def\blx@imc@ifinteger#1{%
+ \begingroup
+ \def\do##1{\uccode`##1=`\%}%
+ \do\0\do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9%
+ \catcode`\@=11
+ \catcode`\%=9
+ \endlinechar\m@ne
+ \uppercase{\scantokens{\def\blx@tempa{#1}}}%
+ \ifx\blx@tempa\@empty
+ \aftergroup\@firstoftwo
+ \else
+ \aftergroup\@secondoftwo
+ \fi
+ \endgroup}
+
+% {\<non-ASCII numeral>}{\<ASCII number>}
+\protected\def\blx@defcomputableequivalent#1#2{%
+ \appto\blx@dononasciicomputablenumerals{\do#1}%
+ \appto\blx@initcomputableequivs{\uccode`#1=`#2}}
+
+% {<string>}{<true>}{<false>}
+\protected\long\def\blx@imc@hascomputableequivalent#1{%
+ \begingroup
+ \def\do##1{\uccode`##1=`\%}%
+ \blx@dononasciicomputablenumerals
+ \catcode`\@=11
+ \catcode`\%=9
+ \endlinechar\m@ne
+ \uppercase{\scantokens{\def\blx@tempa{#1}}}%
+ \ifx\blx@tempa\@empty
+ \aftergroup\@firstoftwo
+ \else
+ \aftergroup\@secondoftwo
+ \fi
+ \endgroup}
+
+% {<string>}{<true>}{<false>}
+\protected\long\def\blx@imc@ifiscomputable#1{%
+ \blx@imc@ifinteger{#1}
+ {\@firstofone}
+ {\blx@imc@hascomputableequivalent{#1}}}
+
+% {<string>}{<macro>}
+\protected\long\def\blx@imc@getcomputableequivalent#1#2{%
+ \blx@imc@hascomputableequivalent{#1}
+ {\begingroup
+ \blx@initcomputableequivs
+ \uppercase{\def\blx@tempa{#1}}%
+ \edef\blx@tempb{\endgroup
+ \noexpand\def\noexpand#2{\expandonce{\blx@tempa}}}%
+ \blx@tempb}
+ {\def#2{#1}}}
+
+% [<msform>][<mslang>]{<field>}{<true>}{<false>}
+\DeclareDocumentCommand{\blx@imc@iffieldint}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@iffieldundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@imc@ifmsentryfield{#3}
+ {\def\blx@tempa{abx@field@#1@#2@#3}}
+ {\def\blx@tempa{abx@field@@@#3}}%
+ \expandafter\expandafter
+ \expandafter\blx@imc@ifinteger
+ \expandafter\expandafter
+ \expandafter{\csname\blx@tempa\endcsname}}}
+
+% [<msform>][<mslang>]{<field>}{<true>}{<false>}
+\DeclareDocumentCommand{\blx@imc@fieldhascomputableequivalent}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@iffieldundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@imc@ifmsentryfield{#3}
+ {\def\blx@tempa{abx@field@#1@#2@#3}}
+ {\def\blx@tempa{abx@field@@@#3}}%
+ \expandafter\expandafter
+ \expandafter\blx@imc@hascomputableequivalent
+ \expandafter\expandafter
+ \expandafter{\csname\blx@tempa\endcsname}}}
+
+% [<msform>][<mslang>]{<field>}{<true>}{<false>}
+\DeclareDocumentCommand{\blx@imc@iffieldiscomputable}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@iffieldundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@imc@ifmsentryfield{#3}
+ {\def\blx@tempa{abx@field@#1@#2@#3}}
+ {\def\blx@tempa{abx@field@@@#3}}%
+ \expandafter\expandafter
+ \expandafter\blx@imc@ifiscomputable
+ \expandafter\expandafter
+ \expandafter{\csname\blx@tempa\endcsname}}}
+
+% {<string>}{<true>}{<false>}
+\protected\def\blx@imc@ifnumeral{%
+ \blx@ifnum\blx@hook@ifnum}
+
+\protected\def\blx@imc@ifnumerals{%
+ \blx@ifnum\blx@hook@ifnums}
+
+\protected\def\blx@imc@ifpages{%
+ \blx@ifnum\blx@hook@ifpages}
+
+\long\def\blx@ifnum#1#2{%
+ \begingroup
+ \let\protect\@unexpandable@protect
+ \uppercase{\edef\blx@tempa{#2}}%
+ \ifx\blx@tempa\@empty
+ \aftergroup\@secondoftwo
+ \else
+ \catcode`\@=11
+ \catcode`\%=9
+ \endlinechar\m@ne
+ \everyeof{\noexpand}#1%
+ \uppercase{\edef\blx@tempa{\scantokens{#2}}}%
+ \ifx\blx@tempa\@empty
+ \aftergroup\@firstoftwo
+ \else
+ \aftergroup\@secondoftwo
+ \fi
+ \fi
+ \endgroup}
+
+% valid numerals set by the lbx file
+\let\lbx@dononasciinumerals\relax
+
+\def\blx@hook@ifnum{%
+ \def\do##1{\uccode`##1=`\%}%
+ \do\ \do\0\do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9%
+ \do\i\do\v\do\x\do\l\do\c\do\d\do\m
+ \do\I\do\V\do\X\do\L\do\C\do\D\do\M
+ \lbx@dononasciinumerals
+ \blx@donumchars
+ \let\RN\@firstofone
+ \let\Rn\@firstofone}
+
+\def\blx@hook@ifnums{%
+ \blx@hook@ifnum
+ \def\do##1{\uccode`##1=`\%}%
+ \blx@dorangechars
+ \def\do##1{\let##1\@empty}%
+ \blx@dorangecmds}
+
+\def\blx@hook@ifpages{%
+ \blx@hook@ifnum
+ \blx@hook@ifnums
+ \def\do##1{\let##1\@empty}%
+ \blx@dopagecmds}
+
+% [msform][mslang]{<field>}{<true>}{<false>}
+\DeclareDocumentCommand{\blx@imc@iffieldnum}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@iffieldundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@imc@ifmsentryfield{#3}
+ {\def\blx@tempa{abx@field@#1@#2@#3}}
+ {\def\blx@tempa{abx@field@@@#3}}%
+ \expandafter\expandafter
+ \expandafter\blx@imc@ifnumeral
+ \expandafter\expandafter
+ \expandafter{\csname\blx@tempa\endcsname}}}
+
+\DeclareDocumentCommand{\blx@imc@iffieldnums}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@iffieldundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@imc@ifmsentryfield{#3}
+ {\def\blx@tempa{abx@field@#1@#2@#3}}
+ {\def\blx@tempa{abx@field@@@#3}}%
+ \expandafter\expandafter
+ \expandafter\blx@imc@ifnumerals
+ \expandafter\expandafter
+ \expandafter{\csname\blx@tempa\endcsname}}}
+
+\DeclareDocumentCommand{\blx@imc@iffieldpages}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@iffieldundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@imc@ifmsentryfield{#3}
+ {\def\blx@tempa{abx@field@#1@#2@#3}}
+ {\def\blx@tempa{abx@field@@@#3}}%
+ \expandafter\expandafter
+ \expandafter\blx@imc@ifpages
+ \expandafter\expandafter
+ \expandafter{\csname\blx@tempa\endcsname}}}
+
+% {<chars>}
+\newrobustcmd*{\DeclareNumChars}{%
+ \@ifstar
+ {\blx@defnumchars}
+ {\global\let\blx@donumchars\@empty
+ \blx@defnumchars}}
+
+\def\blx@defnumchars#1{%
+ \ifblank{#1}
+ {}
+ {\expandafter\blx@defdochars
+ \expandafter\blx@donumchars
+ \detokenize{#1}\relax}}
+
+% {<chars>}
+\newrobustcmd*{\DeclareRangeChars}{%
+ \@ifstar
+ {\blx@defrangechars}
+ {\global\let\blx@dorangechars\@empty
+ \blx@defrangechars}}
+
+\def\blx@defrangechars#1{%
+ \ifblank{#1}
+ {}
+ {\expandafter\blx@defdochars
+ \expandafter\blx@dorangechars
+ \detokenize{#1}\relax}}
+
+\def\blx@defdochars#1#2{%
+ \ifx#2\relax
+ \else
+ \xdef#1{%
+ \expandonce#1\noexpand\do
+ \expandafter\noexpand\csname#2\endcsname}%
+ \expandafter\blx@defdochars
+ \expandafter#1%
+ \fi}
+
+% {<cstokens>}
+\newrobustcmd*{\DeclareRangeCommands}{%
+ \@ifstar
+ {\blx@defrangecmds}
+ {\global\let\blx@dorangecmds\@empty
+ \blx@defrangecmds}}
+
+\def\blx@defrangecmds#1{%
+ \ifblank{#1}
+ {}
+ {\blx@defrangecmds@i#1&}}
+
+\def\blx@defrangecmds@i#1{%
+ \ifx&#1%
+ \else
+ \gappto\blx@dorangecmds{\do#1}%
+ \expandafter\blx@defrangecmds@i
+ \fi}
+
+% {<cstokens>}
+\newrobustcmd*{\DeclarePageCommands}{%
+ \@ifstar
+ {\blx@defpagecmds}
+ {\global\let\blx@dopagecmds\@empty
+ \blx@defpagecmds}}
+
+\def\blx@defpagecmds#1{%
+ \ifblank{#1}
+ {}
+ {\blx@defpagecmds@i#1&}}
+
+\def\blx@defpagecmds@i#1{%
+ \ifx&#1%
+ \else
+ \gappto\blx@dopagecmds{\do#1}%
+ \expandafter\blx@defpagecmds@i
+ \fi}
+
+\DeclareNumChars{.}
+\DeclareRangeChars{~,;-+/}
+\DeclareRangeCommands{%
+ \ \,\space\nobreakspace\addspace\addnbspace
+ \addthinspace\addnbthinspace\addlowpenspace
+ \addhighpenspace\addlpthinspace\addhpthinspace
+ \adddotspace\addabbrvspace\&\psq\psqq
+ \bibrangedash\bibdaterangesep\bibtimerangesep\textendash\textemdash\bibrangessep}
+\DeclarePageCommands{\pno\ppno}
+
+% *{<code>}
+\newrobustcmd*{\NumCheckSetup}{\appto\blx@hook@ifnum}
+\newcommand*{\NumcheckSetup}{\NumCheckSetup}
+
+\newrobustcmd*{\NumsCheckSetup}{\appto\blx@hook@ifnums}
+
+\newrobustcmd*{\PagesCheckSetup}{\appto\blx@hook@ifpages}
+
+\PagesCheckSetup{\let\pnfmt\@firstofone}
+
+% [<pagination>][<postpro>]{<string>}
+\newrobustcmd*{\blx@imc@mkpageprefix}[1][pagination]{%
+ \begingroup
+ \def\blx@tempa{\blx@mkpageprefix{page}}%
+ \iffieldundef{#1}
+ {}
+ {\iffieldequalstr{#1}{none}
+ {\def\blx@tempa{\blx@mkpageprefix@i}}
+ {\iffieldbibstring{#1}
+ {\edef\blx@tempa{\blx@mkpageprefix{\thefield{#1}}}}
+ {\blx@warning@entry{%
+ Unknown pagination type '\strfield{#1}'}}}}%
+ \@ifnextchar[%]
+ {\blx@tempa}
+ {\blx@tempa[\@firstofone]}}
+
+\protected\long\def\blx@mkpageprefix#1[#2]#3{%
+ \ifnumeral{#3}
+ {\bibstring{#1}\ppspace}
+ {\ifnumerals{#3}
+ {\bibstring{#1s}\ppspace}
+ {\def\pno{\bibstring{#1}}%
+ \def\ppno{\bibstring{#1s}}}}%
+ \blx@mkpageprefix@i[{#2}]{#3}}
+
+\long\def\blx@mkpageprefix@i[#1]#2{#1{#2}\endgroup}
+
+% [<pagination>][<postpro>]{<string>}
+\newrobustcmd*{\blx@imc@mkpagetotal}[1][bookpagination]{%
+ \begingroup
+ \def\blx@tempa{\blx@mkpagetotal{pagetotal}}%
+ \iffieldundef{#1}
+ {}
+ {\iffieldequalstr{#1}{none}
+ {\def\blx@tempa{\blx@mkpagetotal@i}}
+ {\iffieldplusstringbibstring{#1}{total}
+ {\edef\blx@tempa{\blx@mkpagetotal{\thefield{#1}total}}}
+ {\blx@warning@entry{%
+ Unknown pagination type '\strfield{#1}total'}}}}%
+ \@ifnextchar[%]
+ {\blx@tempa}
+ {\blx@tempa[\@firstofone]}}
+
+\protected\long\def\blx@mkpagetotal#1[#2]#3{%
+ \ifnumeral{#3}
+ {\setbox\@tempboxa=\hbox{%
+ \blx@tempcnta0#3\relax
+ \ifnum\blx@tempcnta=\@ne
+ \aftergroup\@firstoftwo
+ \else
+ \aftergroup\@secondoftwo
+ \fi}%
+ {#2{#3}\ppspace\bibstring{#1}}
+ {#2{#3}\ppspace\bibstring{#1s}}}
+ {\def\pno{\bibstring{#1}}%
+ \def\ppno{\bibstring{#1s}}%
+ #2{#3}}%
+ \endgroup}
+
+\long\def\blx@mkpagetotal@i[#1]#2{#1{#2}\endgroup}
+
+\newcounter{mincomprange}
+\newcounter{maxcomprange}
+\newcounter{mincompwidth}
+\setcounter{mincomprange}{10}
+\setcounter{maxcomprange}{100000}
+\setcounter{mincompwidth}{1}
+\def\abx@rangeproclimit{100000}
+
+% {<rangefield>}
+\newcommand*{\rangelen}[1]{%
+ \ifcsdef{abx@range@#1}
+ {\csuse{abx@range@#1}}
+ {}}
+
+% <*>[<postpro>]{<string>}
+\newrobustcmd*{\mknormrange}{%
+ \begingroup
+ \@ifstar
+ {\blx@range@aux\blx@normrange@ii}
+ {\blx@range@aux\blx@normrange@i}}
+
+\def\blx@range@aux#1{%
+ \@ifnextchar[{\blx@range@aux@i#1}{#1[\@firstofone][\@firstofone]}}
+
+\def\blx@range@aux@i#1[#2]{%
+ \@ifnextchar[{#1[{#2}]}{#1[{#2}][\@firstofone]}}
+
+\def\blx@normrange@i[#1][#2]#3{%
+ \let\blx@tempa\@empty
+ \protected\def\blx@range@out@value{\appto\blx@tempa}%
+ \def\blx@range@out@item@process{#2}%
+ \let\blx@range@out@delim\blx@range@out@value
+ \let\blx@range@split\blx@genrange@split
+ \let\blx@range@process\blx@normrange@process
+ \blx@range@chunk{#3}%
+ \begingroup
+ \edef\blx@tempa{\endgroup
+ \unexpanded{#1}{\expandonce\blx@tempa}}%
+ \blx@tempa
+ \endgroup}
+
+\def\blx@normrange@ii[#1][#2]#3{%
+ \protected\def\blx@range@out@value{#1}%
+ \def\blx@range@out@item@process{#2}%
+ \let\blx@range@out@delim\@firstofone
+ \let\blx@range@split\blx@genrange@split
+ \let\blx@range@process\blx@normrange@process
+ \blx@range@chunk{#3}%
+ \endgroup}
+
+\def\blx@range@chunk#1{%
+ \blx@range@chunk@semcol#1;&}
+
+\def\blx@range@chunk@semcol#1;#2&{%
+ \notblank{#1}
+ {\blx@range@chunk@comma#1,&}
+ {}%
+ \notblank{#2}
+ {\notblank{#1}{\blx@range@out@delim{\bibrangessep}}{}%
+ \blx@range@chunk@semcol#2&}
+ {}}
+
+\def\blx@range@chunk@comma#1,#2&{%
+ \notblank{#1}
+ {\blx@range@chunk@sep#1\bibrangessep&}
+ {}%
+ \notblank{#2}
+ {\notblank{#1}{\blx@range@out@delim{\bibrangessep}}{}%
+ \blx@range@chunk@comma#2&}
+ {}}
+
+\def\blx@range@chunk@sep#1\bibrangessep#2&{%
+ \notblank{#1}
+ {\expandafter\blx@range@split
+ \expandafter{\@firstofone#1}}
+ {}%
+ \notblank{#2}
+ {\notblank{#1}{\blx@range@out@delim{\bibrangessep}}{}%
+ \blx@range@chunk@sep#2&}
+ {}}
+
+% Unicode en-dashes are supported in blx-unicode.def
+\def\blx@genrange@split#1{%
+ \protected@edef\blx@normrange@abort{%
+ \blx@range@out@value{%
+ \blx@range@out@item@process{\unexpanded{#1}}}}%
+ \blx@imc@ifpages{#1}
+ {\blx@normrange@range#1\bibrangedash\bibrangedash&}
+ {\blx@normrange@abort}}
+
+\def\blx@normrange@range#1\bibrangedash#2\bibrangedash#3&{%
+ \ifblank{#3}
+ {\blx@normrange@hyphen#1--&}
+ {\ifblank{#2}
+ {\begingroup
+ \protected@edef\blx@tempc{\endgroup
+ \blx@range@out@value{%
+ \blx@range@out@item@process{\unexpanded{#1}}%
+ \noexpand\bibrangedash}}%
+ \blx@tempc}
+ {\ifblank{#1}
+ {\begingroup
+ \protected@edef\blx@tempc{\endgroup
+ \blx@range@out@value{%
+ \noexpand\bibrangedash
+ \blx@range@out@item@process{%
+ \unexpanded{#2}}}}%
+ \blx@tempc}
+ {\blx@range@process{#1}{#2}}}}}
+
+\def\blx@normrange@hyphen#1-#2-#3&{%
+ \ifblank{#3}
+ {\blx@normrange@abort}
+ {\ifblank{#2}
+ {\ifblank{#1}
+ {\let\blx@tempb\@empty}
+ {\def\blx@tempb{#1}}%
+ \blx@normrange@hyphen@i#3&}
+ {\ifblank{#1}
+ {\begingroup
+ \protected@edef\blx@tempc{\endgroup
+ \blx@range@out@value{%
+ \noexpand\bibrangedash
+ \blx@range@out@item@process{%
+ \unexpanded{#2}}}}%
+ \blx@tempc}
+ {\blx@range@process{#1}{#2}}}}}
+
+\def\blx@normrange@hyphen@i#1-#2&{%
+ \ifblank{#1#2}
+ {\begingroup
+ \protected@edef\blx@tempc{\endgroup
+ \blx@range@out@value{%
+ \blx@range@out@item@process{\expandonce\blx@tempb}%
+ \noexpand\bibrangedash}}%
+ \blx@tempc}
+ {\notblank{#1}
+ {\ifdefempty\blx@tempb
+ {\begingroup
+ \protected@edef\blx@tempc{\endgroup
+ \blx@range@out@value{%
+ \noexpand\bibrangedash
+ \blx@range@out@item@process{%
+ \unexpanded{#1}}}}%
+ \blx@tempc}
+ {\expandafter\blx@range@process
+ \expandafter{\blx@tempb}{#1}}}
+ {\blx@normrange@hyphen@i#2&}}}
+
+\def\blx@normrange@process#1#2{%
+ \begingroup
+ \protected@edef\blx@tempc{\endgroup
+ \blx@range@out@value{%
+ \blx@range@out@item@process{\unexpanded{#1}}%
+ \noexpand\bibrangedash
+ \blx@range@out@item@process{\unexpanded{#2}}}}%
+ \blx@tempc}
+
+% <*>[<postpro>]{<string>}
+\newrobustcmd*{\mkcomprange}{%
+ \begingroup
+ \@ifstar
+ {\blx@range@aux\blx@comprange@ii}
+ {\blx@range@aux\blx@comprange@i}}
+
+\def\blx@comprange@i[#1][#2]#3{%
+ \let\blx@tempa\@empty
+ \protected\def\blx@range@out@value{\appto\blx@tempa}%
+ \def\blx@range@out@item@process{#2}%
+ \let\blx@range@out@delim\blx@range@out@value
+ \let\blx@range@split\blx@genrange@split
+ \let\blx@range@process\blx@comprange@check
+ \blx@range@chunk{#3}%
+ \begingroup
+ \edef\blx@tempa{\endgroup
+ \unexpanded{#1}{\expandonce\blx@tempa}}%
+ \blx@tempa
+ \endgroup}
+
+\def\blx@comprange@ii[#1][#2]#3{%
+ \protected\def\blx@range@out@value{#1}%
+ \def\blx@range@out@item@process{#2}%
+ \let\blx@range@out@delim\@firstofone
+ \let\blx@range@split\blx@genrange@split
+ \let\blx@range@process\blx@comprange@check
+ \blx@range@chunk{#3}%
+ \endgroup}
+
+\def\blx@comprange@check#1#2{%
+ \blx@imc@ifinteger{#1}
+ {\blx@imc@ifinteger{#2}
+ {\@firstoftwo}
+ {\@secondoftwo}}
+ {\@secondoftwo}
+ {\blx@comprange@comp{#1}{#2}}
+ {\begingroup
+ \protected@edef\blx@tempc{\endgroup
+ \blx@range@out@value{%
+ \blx@range@out@item@process{\unexpanded{#1}}%
+ \noexpand\bibrangedash
+ \blx@range@out@item@process{\unexpanded{#2}}}}%
+ \blx@tempc}}
+
+\def\blx@comprange@comp#1#2{%
+ \def\blx@tempb{#1}%
+ \def\blx@tempc{#2}%
+ \let\blx@tempd\blx@tempc
+ \ifnum\c@maxcomprange<\abx@rangeproclimit\relax
+ \numdef\blx@tempe\abx@rangeproclimit
+ \else
+ \numdef\blx@tempe\c@maxcomprange
+ \fi
+ \blx@tempcntc=\blx@tempe\relax
+ \ifnum
+ \ifnum\c@mincompwidth<1\space1\fi
+ \ifnum\c@maxcomprange<10\space1\fi
+ \ifnum\c@mincomprange<\blx@tempb\space\else1\fi
+ \ifnum\blx@tempb<\numexpr\blx@tempcntc*10\relax\else1\fi
+ 0=\z@
+ \expandafter\blx@comprange@comp@div
+ \else
+ \expandafter\blx@comprange@end
+ \fi}
+
+\def\blx@comprange@end{%
+ \numdef\blx@tempb\blx@tempb
+ \ifnum\blx@tempe>\c@maxcomprange\relax
+ \numdef\blx@tempc\blx@tempc
+ \else
+ \numdef\blx@tempc\blx@tempd
+ \fi
+ \begingroup
+ \protected@edef\blx@tempb{\endgroup
+ \blx@range@out@value{%
+ \blx@range@out@item@process{\blx@tempb}%
+ \noexpand\bibrangedash
+ \blx@range@out@item@process{\blx@tempc}}}%
+ \blx@tempb}
+
+\def\blx@comprange@comp@div{%
+ \unless\ifnum\blx@tempb<\blx@tempcntc
+ \blx@tempcnta\blx@tempb\relax
+ \blx@tempcntb\blx@tempc\relax
+ \divide\blx@tempcnta\blx@tempcntc
+ \divide\blx@tempcntb\blx@tempcntc
+ \ifnum\blx@tempcnta=\blx@tempcntb
+ \edef\blx@tempd{\expandafter\@gobble\blx@tempd}%
+ \numdef\blx@tempe\blx@tempcntc
+ \fi
+ \fi
+ \divide\blx@tempcntc10\relax
+ \ifnum
+ \ifnum\blx@tempcntc<10 1\fi
+ \ifnum\blx@tempcntc>\c@mincompwidth\else 1\fi
+ 0=\z@
+ \expandafter\blx@comprange@comp@div
+ \else
+ \expandafter\blx@comprange@end
+ \fi}
+
+% <*>[<postpro>]{<string>}
+\newrobustcmd*{\mkfirstpage}{%
+ \begingroup
+ \@ifstar
+ {\blx@range@aux\blx@firstpage@ii}
+ {\blx@range@aux\blx@firstpage@i}}
+
+\def\blx@firstpage@i[#1][#2]#3{%
+ \let\blx@tempa\@empty
+ \protected\def\blx@range@out@value{\appto\blx@tempa}%
+ \def\blx@range@out@item@process{#2}%
+ \let\blx@range@out@delim\blx@range@out@value
+ \let\blx@range@split\blx@firstpage@split
+ \blx@range@chunk{#3}%
+ \begingroup
+ \edef\blx@tempa{\endgroup
+ \unexpanded{#1}{\expandonce\blx@tempa}}%
+ \blx@tempa
+ \endgroup}
+
+\def\blx@firstpage@ii[#1][#2]#3{%
+ \protected\def\blx@range@out@value{#1}%
+ \def\blx@range@out@item@process{#2}%
+ \let\blx@range@out@delim\@firstofone
+ \let\blx@range@split\blx@firstpage@split
+ \blx@range@chunk{#3}%
+ \endgroup}
+
+% Unicode en-dashes are supported in blx-unicode.def
+\def\blx@firstpage@split#1{%
+ \protected@edef\blx@firstpage@abort{%
+ \blx@range@out@value{%
+ \blx@range@out@item@process{\unexpanded{#1}}}}%
+ \blx@firstpage@range#1\bibrangedash\bibrangedash&}
+
+\def\blx@firstpage@range#1\bibrangedash#2\bibrangedash#3&{%
+ \ifblank{#3}
+ {\blx@firstpage@hyphen#1--&}
+ {\ifblank{#1}
+ {\begingroup
+ \protected@edef\blx@tempc{\endgroup
+ \blx@range@out@value{%
+ \noexpand\bibrangedash
+ \blx@range@out@item@process{\unexpanded{#2}}}}%
+ \blx@tempc}
+ {\begingroup
+ \protected@edef\blx@tempc{\endgroup
+ \blx@range@out@value{%
+ \blx@range@out@item@process{\unexpanded{#1}}}}%
+ \blx@tempc}}}
+
+\def\blx@firstpage@hyphen#1-#2-#3&{%
+ \ifblank{#3}
+ {\blx@firstpage@abort}
+ {\ifblank{#1}
+ {\ifblank{#2}
+ {\blx@firstpage@hyphen@i#3&}
+ {\begingroup
+ \protected@edef\blx@tempc{\endgroup
+ \blx@range@out@value{%
+ \noexpand\bibrangedash
+ \blx@range@out@item@process{%
+ \unexpanded{#2}}}}%
+ \blx@tempc}}
+ {\begingroup
+ \protected@edef\blx@tempc{\endgroup
+ \blx@range@out@value{%
+ \blx@range@out@item@process{\unexpanded{#1}}}}%
+ \blx@tempc}}}
+
+\def\blx@firstpage@hyphen@i#1-#2&{%
+ \ifblank{#1}
+ {\ifblank{#2}
+ {\blx@firstpage@abort}
+ {\blx@firstpage@hyphen@i#2&}}
+ {\begingroup
+ \protected@edef\blx@tempc{\endgroup
+ \blx@range@out@value{%
+ \noexpand\bibrangedash
+ \blx@range@out@item@process{%
+ \unexpanded{#1}}}}%
+ \blx@tempc}}
+
+\newcommand*{\ppspace}{\addnbspace}
+\newcommand*{\sqspace}{\addnbspace}
+
+\newrobustcmd*{\RN}[1]{%
+ \begingroup
+ \expandafter\RNfont
+ \expandafter{\romannumeral#1}%
+ \endgroup}
+\newrobustcmd*{\Rn}[1]{%
+ \begingroup
+ \expandafter\Rnfont
+ \expandafter{\romannumeral#1}%
+ \endgroup}
+
+\newcommand*{\RNfont}{\uppercase}
+\newcommand*{\Rnfont}{}
+
+% Delimiter interface
+
+% [<contextname, ...>]{<name>}{<code>}
+\newrobustcmd*{\DeclareDelimFormat}{%
+ \@ifstar
+ {\blx@declaredelimclear}
+ {\blx@declaredelim}}
+
+\def\blx@cleardelim#1{%
+ \ifcsvoid{blx@declaredelimcontexts@#1}
+ {}
+ {\def\do##1{\csundef{blx@printdelim@##1@#1}}%
+ \dolistcsloop{blx@declaredelimcontexts@#1}}%
+ \cslet{blx@declaredelimcontexts@#1}\@empty}
+
+\newrobustcmd*{\blx@declaredelimclear}[3][]{%
+ \blx@cleardelim{#2}%
+ \ifblank{#1}
+ {\blx@declaredelim{#2}{#3}}
+ {\blx@declaredelim[{#1}]{#2}{#3}}}
+
+\newrobustcmd*{\blx@declaredelim}[3][]{%
+ \ifblank{#1}
+ {\blx@declaredelim@i{}{}{#2}{#3}}
+ {\def\do##1{%
+ \listcsadd{blx@declaredelimcontexts@#2}{##1}%
+ \blx@declaredelim@i{blx@printdelim@##1@}{##1}{#2}{#3}}%
+ \docsvlist{#1}}}%
+
+\def\blx@declaredelim@i#1#2#3#4{%
+ \ifcsdef{#1#3}
+ {\blx@inf@delimdeclare{#3}{#2}}
+ {}%
+ \csdef{#1#3}{#4}}
+
+% [<alias context, ...>]{<alias>}[<delim context>]{<delim>}
+% deprecated: *[<alias context, ...>]{<alias>}[<delim context>]{<delim>}
+% the starred version is only implemented for backwards compatibility
+% the only difference is that a missing first argument
+% implies the global/empty context
+\newrobustcmd*{\DeclareDelimAlias}{%
+ \@ifstar
+ {\blx@declaredelimalias@s}
+ {\blx@declaredelimalias@a}}
+
+\def\blx@declaredelimalias@s{%
+ \blx@warning{%
+ The starred command '\string\DeclareDelimAlias*' is\MessageBreak
+ deprecated.%
+ \MessageBreak
+ Use the unstarred version '\string\DeclareDelimAlias'\MessageBreak
+ instead}%
+ \@ifnextchar[%]
+ {\blx@declaredelimalias@om}
+ {\blx@declaredelimalias@om[]}}
+
+\def\blx@declaredelimalias@a{%
+ \@ifnextchar[%]
+ {\blx@declaredelimalias@om}
+ {\blx@declaredelimalias@m}}
+
+\def\blx@declaredelimalias@m#1{%
+ \@ifnextchar[%]
+ {\blx@declaredelimalias@mom{#1}}
+ {\blx@declaredelimalias@mm{#1}}}
+
+\def\blx@declaredelimalias@mm{%
+ \blx@declaredelimalias@auto}
+
+\def\blx@declaredelimalias@mom{%
+ \blx@declaredelimalias@omom[]}
+
+\def\blx@declaredelimalias@om[#1]#2{%
+ \@ifnextchar[%]
+ {\blx@declaredelimalias@omom[{#1}]{#2}}
+ {\blx@declaredelimalias@omm[{#1}]{#2}}}
+
+% hrmpf ... remember that \docsvlist doesn't do anthing for empty
+% lists/list items
+\def\blx@declaredelimalias@omom[#1]#2[#3]#4{%
+ \ifstrequal{#1}{*}
+ {\ifstrequal{#3}{*}
+ {\blx@declaredelimalias@auto{#2}{#4}}
+ {\blx@cleardelim{#1}%
+ \blx@declaredelimalias@manual{}{#2}{#3}{#4}}}
+ {\def\do##1{\blx@declaredelimalias@manual{##1}{#2}{#3}{#4}}%
+ \ifblank{#1}
+ {\do{}}
+ {\docsvlist{#1}}}}
+
+\def\blx@declaredelimalias@omm[#1]#2#3{%
+ \ifstrequal{#1}{*}
+ {\blx@declaredelimalias@auto{#2}{#3}}
+ {\def\do##1{\blx@declaredelimalias@manual{##1}{#2}{##1}{#3}}%
+ \ifblank{#1}
+ {\do{}}
+ {\docsvlist{#1}}}}
+
+% {<alias>}{<source>}
+\def\blx@declaredelimalias@auto#1#2{%
+ \blx@cleardelim{#1}%
+ \blx@declaredelimalias@manual{}{#1}{}{#2}%
+ \ifcsvoid{blx@declaredelimcontexts@#2}
+ {}
+ {\def\do##1{%
+ \blx@declaredelimalias@manual{##1}{#1}{##1}{#2}}%
+ \dolistcsloop{blx@declaredelimcontexts@#2}}}
+
+% {<alias context>}{<alias>}{<source context>}{<source>}
+\def\blx@declaredelimalias@manual#1#2#3#4{%
+ \begingroup
+ \ifblank{#1}
+ {\def\blx@tempa{{}{}}}
+ {\def\blx@tempa{{blx@printdelim@#1@}{#1}}}%
+ \ifblank{#3}
+ {\def\blx@tempb{{}{}}}
+ {\def\blx@tempb{{blx@printdelim@#3@}{#3}}}%
+ \edef\blx@tempc{\endgroup
+ \noexpand\blx@declaredelimalias@def%
+ \expandonce\blx@tempa {\unexpanded{#2}}%
+ \expandonce\blx@tempb {\unexpanded{#4}}}%
+ \blx@tempc}
+
+% {<alias context internal id>}{<alias context name>}{<alias>}
+% {<source context internal id>}{<source context name>}{<source>}
+\def\blx@declaredelimalias@def#1#2#3#4#5#6{%
+ \ifcsdef{#1#3}
+ {\blx@inf@delimdeclare{#3}{#2}}
+ {}%
+ \ifblank{#2}
+ {}
+ {\ifinlistcs{#2}{blx@declaredelimcontexts@#3}
+ {}
+ {\listcsadd{blx@declaredelimcontexts@#3}{#2}}}%
+ \csdef{#1#3}{\ifcsundef{#4#6}{\csuse{#6}}{\csuse{#4#6}}}}
+
+\def\blx@delimcontext{none}
+\newcommand*{\printdelim}[2][]{%
+ \ifblank{#1}
+ {\ifcsdef{blx@printdelim@\blx@delimcontext @#2}
+ {\csuse{blx@printdelim@\blx@delimcontext @#2}}
+ {\ifcsdef{#2}% fall back on legacy macros
+ {\csuse{#2}}
+ {\blx@warn@delimuse{#2}{*}}}}
+ {\ifcsdef{blx@printdelim@#1@#2}
+ {\csuse{blx@printdelim@#1@#2}}
+ {\blx@warn@delimuse{#2}{#1}}}}
+
+\newcommand*{\delimcontext}[1]{%
+ \edef\blx@delimcontext{\blx@delimcontextalias{#1}}}
+
+\def\blx@delimcontextalias#1{%
+ \ifcsdef{blx@delimcontextalias@#1}
+ {\csuse{blx@delimcontextalias@#1}}
+ {#1}}
+
+\newcommand*{\DeclareDelimcontextAlias}[2]{%
+ \csdef{blx@delimcontextalias@#1}{#2}}
+
+\newcommand*{\UndeclareDelimcontextAlias}[1]{%
+ \csundef{blx@delimcontextalias@#1}}
+
+\newrobustcmd*{\AtUsedriver}{%
+ \@ifstar
+ {\global\undef\blx@hook@usedriver
+ \gappto\blx@hook@usedriver}
+ {\gappto\blx@hook@usedriver}}
+\@onlypreamble\AtUsedriver
+\def\blx@imc@UseUsedriverHook{\csuse{blx@hook@usedriver}}
+\blx@regimcs{\UseUsedriverHook}
+
+\AtUsedriver{%
+ \delimcontext{bib}%
+ \let\finentry\blx@finentry@usedrv
+ \let\newblock\relax
+ \let\abx@macro@bibindex\@empty
+ \let\abx@macro@pageref\@empty}
+
+% {<init>}{<entrytype>}
+\protected\def\blx@imc@usedriver#1#2{%
+ \begingroup
+ \csuse{blx@hook@usedriver}%
+ \csuse{blx@hook@bbxinit}#1%
+ \blx@beglangbib
+ \blx@driver{#2}%
+ \blx@endlangbib
+ \endgroup}
+
+% Punctuation
+
+\protected\def\blx@initunit{%
+ \global\togglefalse{blx@block}%
+ \global\togglefalse{blx@unit}%
+ \global\togglefalse{blx@insert}%
+ \global\togglefalse{blx@lastins}%
+ \global\togglefalse{blx@keepunit}%
+ \global\let\blx@unitpunct\newunitpunct
+ \blx@imc@resetpunctfont}
+
+\def\blx@begunit{%
+ \toggletrue{blx@tempa}%
+ \iftoggle{blx@insert}
+ {\iftoggle{blx@unit}
+ {\begingroup
+ \let\blx@begunit\@empty
+ \let\blx@endunit\@empty
+ \let\blx@endnounit\@empty
+ \blx@unitpunct\blx@postpunct
+ \endgroup
+ \global\togglefalse{blx@unit}%
+ \togglefalse{blx@tempa}}
+ {\blx@postpunct}%
+ \iftoggle{blx@block}
+ {\begingroup
+ \let\blx@begunit\@empty
+ \let\blx@endunit\@empty
+ \let\blx@endnounit\@empty
+ \newblockpunct
+ \endgroup
+ \global\togglefalse{blx@block}%
+ \togglefalse{blx@tempa}}
+ {}}
+ {}%
+ \blx@postpunct
+ \blx@imc@resetpunctfont
+ \iftoggle{blx@tempa}
+ {}
+ {\global\togglefalse{blx@insert}}%
+ \blx@leavevmode
+ \begingroup}
+
+\def\blx@endunit{%
+ \endgroup
+ \global\toggletrue{blx@insert}%
+ \global\toggletrue{blx@lastins}}
+
+\def\blx@nounit{%
+ \global\togglefalse{blx@lastins}}
+
+\def\blx@endnounit{%
+ \endgroup\blx@nounit}
+
+\protected\def\blx@imc@newblock{%
+ \global\toggletrue{blx@block}}%
+
+\protected\def\blx@imc@newunit{%
+ \iftoggle{blx@keepunit}
+ {}
+ {\global\let\blx@unitpunct\newunitpunct
+ \global\toggletrue{blx@unit}}}
+
+\protected\def\blx@imc@setunit{%
+ \@ifstar\blx@setunit@i\blx@setunit}
+
+\long\def\blx@setunit#1{%
+ \iftoggle{blx@keepunit}
+ {}
+ {\long\gdef\blx@unitpunct{#1}%
+ \global\toggletrue{blx@unit}}}
+
+\def\blx@setunit@i{%
+ \iftoggle{blx@lastins}
+ {\blx@setunit}
+ {\@gobble}}
+
+\protected\def\blx@imc@printunit{%
+ \@ifstar\blx@printunit@i\blx@printunit}
+
+\def\blx@printunit#1{%
+ \long\gdef\blx@unitpunct{#1\global\togglefalse{blx@keepunit}}%
+ \global\toggletrue{blx@keepunit}%
+ \global\toggletrue{blx@unit}}
+
+\def\blx@printunit@i{%
+ \iftoggle{blx@lastins}
+ {\blx@printunit}
+ {\@gobble}}
+
+\protected\def\blx@imc@finentry{%
+ \unspace\finentrypunct
+ \blx@postpunct
+ \blx@initunit}
+
+\protected\def\blx@finentry@usedrv{%
+ \blx@setunit\relax}
+
+\protected\def\blx@finentry@inset{%
+ \blx@setunit\entrysetpunct
+ \global\toggletrue{blx@block}}
+
+\def\ifentryseen{\blx@imc@ifentryseen}
+\def\ifentryinbib{\blx@imc@ifentryinbib}
+\def\ifentrycategory{\blx@imc@ifentrycategory}
+\def\ifentrykeyword{\blx@imc@ifentrykeyword}
+
+
+\def\blx@imc@iflabeldateisdate{%
+ \iftoggle{blx@labeldateparts}
+ {\iffieldundef{labeldatesource}
+ {\@secondoftwo}
+ {\iffieldequalstr{labeldatesource}{}
+ {\@firstoftwo}
+ {\iffieldequalstr{labeldatesource}{year}}}}
+ {\@secondoftwo}}
+
+
+\def\blx@imc@ifdatehasyearonlyprecision#1{%
+ \iffieldundef{#1year}
+ {\@secondoftwo}
+ {\ifcsstring{blx@dateformat@#1date}{year}
+ {\@firstoftwo}
+ {\iffieldundef{#1month}
+ {\iffieldundef{#1yeardivision}}
+ {\@secondoftwo}}}}
+
+\def\blx@imc@ifdatehastime#1{%
+ \iftoggle{blx@#1dateusetime}
+ {\iffieldundef{#1hour}
+ {\@secondoftwo}
+ {\@firstoftwo}}
+ {\@secondoftwo}}
+
+\def\blx@imc@ifdateshavedifferentprecision#1#2{%
+ \ifboolexpr{ ( test {\ifdatehasyearonlyprecision{#1}}
+ and not test {\ifdatehasyearonlyprecision{#2}})
+ or ( not test {\ifdatehasyearonlyprecision{#1}}
+ and test {\ifdatehasyearonlyprecision{#2}})
+ or ( test {\ifdatehastime{#1}}
+ and not test {\ifdatehastime{#2}})
+ or ( not test {\ifdatehastime{#1}}
+ and test {\ifdatehastime{#2}})}}
+
+\def\blx@imc@ifdateyearsequal#1#2{%
+ \iffieldsequal{#1year}{#2year}
+ {\iffieldundef{#1dateera}
+ {\iffieldundef{#2dateera}}
+ {\iffieldsequal{#1dateera}{#2dateera}}}
+ {\@secondoftwo}}
+
+\def\blx@reconstruct@comparabledate#1{%
+ \thefield{#1year}-\thefield{#1month}(\thefield{#1yeardivision})-%
+ \thefield{#1day}T%
+ \thefield{#1hour}:\thefield{#1minute}:\thefield{#1second}Z%
+ \thefield{#1timezone}//%
+ e\thefield{#1dateera}E%
+ c\csuse{if#1datecirca}{T}{F}%
+ j\csuse{if#1datejulian}{T}{F}%
+ r\csuse{if#1dateuncertain}{T}{F}%
+ k\csuse{if#1dateunknown}{T}{F}%
+}
+
+\def\blx@imc@ifdatesequal#1#2{%
+ \begingroup
+ \edef\blx@tempa{\blx@reconstruct@comparabledate{#1}}%
+ \edef\blx@tempb{\blx@reconstruct@comparabledate{#2}}%
+ \edef\blx@tempc{\endgroup
+ \ifstrequal{\blx@tempa}{\blx@tempb}}%
+ \blx@tempc
+}
+
+\def\blx@imc@ifdaterangesequal#1#2{%
+ \blx@imc@ifdatesequal{#1}{#2}
+ {\blx@imc@ifdatesequal{#1end}{#2end}}
+ {\@secondoftwo}}
+
+\def\blx@imc@ifmsentryfield#1{%
+ \ifcsdef{blx@datamodel@multiscript@entryfield@#1}}
+
+\blx@regimcs{%
+ \ifdriver \thefield \strfield \csfield \usefield \thelist \strlist
+ \thefirstlistitem \usefirstlistitem \strfirstlistitem
+ \thename \strname
+ \clearfield \clearlist \clearname \restorefield \restorelist \restorename
+ \ifcategory \ifkeyword
+ \ifciteseen \ifciteibid \ifciteidem \ifopcit \ifloccit
+ \ifcurrentfield \ifcurrentlist \ifcurrentname \ifentrytype
+ \iffieldequalcs \iffieldequals \iffieldequalstr \iffieldsequal
+ \ifentryfieldundef \iffieldundef \iffieldxref \iflistequalcs \iflistequals
+ \iflistsequal \iflistundef \iflistxref
+ \ifmorenames \ifmoreitems \iffirstcitekey \iflastcitekey
+ \ifnameequalcs \ifnameequals \ifnamesequal \ifnameundef \ifnamexref
+ \iffirstonpage \ifsamepage \savefield \savefieldcs \savelist
+ \savelistcs \savename \savenamecs \usedriver
+ \ifinteger \hascomputableequivalent \ifiscomputable \getcomputableequivalent
+ \ifnumeral \ifnumerals \ifpages
+ \iffieldint \fieldhascomputableequivalent \iffieldiscomputable
+ \iffieldnum \iffieldnums \iffieldpages
+ \iflabeldateisdate \ifdatehasyearonlyprecision \ifdatehastime
+ \ifdateshavedifferentprecision
+ \ifdateyearsequal \ifdatesequal \ifdaterangesequal
+ \mkpageprefix \mkpagetotal
+ \newblock \newunit \setunit \printunit \finentry \ifmsentryfield}
+
+\appto\blx@blxinit{%
+ \def\ifnatbibmode{\iftoggle{blx@natbib}}%
+ \def\ifcitation{\iftoggle{blx@citation}}%
+ \def\ifvolcite{\iftoggle{blx@volcite}}%
+ \def\ifbibliography{\iftoggle{blx@bibliography}}%
+ \def\ifciteindex{\iftoggle{blx@citeindex}}%
+ \def\ifbibindex{\iftoggle{blx@bibindex}}%
+ \def\iffootnote{\iftoggle{blx@footnote}}%
+ \def\ifuseprefix{\iftoggle{blx@useprefix}}%
+ \def\ifterseinits{\iftoggle{blx@terseinits}}%
+ \def\ifcrossrefsource{\iftoggle{abx@bool@crossrefsource}}%
+ \def\ifxrefsource{\iftoggle{abx@bool@xrefsource}}%
+ \def\ifsingletitle{\iftoggle{abx@bool@singletitle}}%
+ \def\ifnocite{\iftoggle{abx@bool@nocite}}%
+ \def\ifuniquetitle{\iftoggle{abx@bool@uniquetitle}}%
+ \def\ifuniquebaretitle{\iftoggle{abx@bool@uniquebaretitle}}%
+ \def\ifuniquework{\iftoggle{abx@bool@uniquework}}%
+ \def\ifuniqueprimaryauthor{\iftoggle{abx@bool@uniqueprimaryauthor}}%
+ \def\ifandothers#1{\iftoggle{abx@bool@more#1}}%
+ \protected\def\pnfmt{\printtext[postnote]}%
+ \protected\def\pno{\bibstring{page}}%
+ \protected\def\ppno{\bibstring{pages}}%
+ \let\nopp\relax
+ \protected\def\psq{\sqspace\bibstring{sequens}}%
+ \protected\def\psqq{\sqspace\bibstring{sequentes}}}
+
+% Make sure that commands which might pop up inside an \edef will be defined
+% as something. If they are taken \AtBeginDocument then we assume that all will
+% be well. If not, then provide a definition which will give an error outside
+% of a citation context.
+\AtBeginDocument{%
+ \protected\def\do#1{%
+ \ifdefined#1%
+ \else
+ \protected\def#1{\ERROR}%
+ \fi
+ }%
+ \docsvlist{\pnfmt,\pno,\ppno,\nopp,\psq,\psqq}%
+}
+
+%% Global formatting hooks
+
+%% Main formatting commands
+% They work by creating a \let alias:
+% \abx@<class>@<entrytype>@<formatname> -> \blx@defformat@d
+% for later use in \print*
+% Then, \blx@defformat@d is defined by calling
+% \def\blx@defformat@d#1{format body}
+
+% [<entrytype>]{<name>}{<definiton>}
+\newrobustcmd*{\DeclareNameFormat}{%
+ \@ifstar
+ {\blx@defformat\blx@defnameformat{nfd}*}
+ {\blx@defformat\blx@defnameformat{nfd}{}}}
+
+\newrobustcmd*{\DeclareIndexNameFormat}{%
+ \@ifstar
+ {\blx@defformat\blx@defnameformat{nid}*}
+ {\blx@defformat\blx@defnameformat{nid}{}}}
+
+\newrobustcmd*{\DeclareListFormat}{%
+ \@ifstar
+ {\blx@defformat\blx@defplainformat{lfd}*}
+ {\blx@defformat\blx@defplainformat{lfd}{}}}
+\newrobustcmd*{\DeclareIndexListFormat}{%
+ \@ifstar
+ {\blx@defformat\blx@defplainformat{lid}*}
+ {\blx@defformat\blx@defplainformat{lid}{}}}
+
+\newrobustcmd*{\DeclareFieldFormat}{%
+ \@ifstar
+ {\blx@defformat\blx@defplainformat{ffd}*}
+ {\blx@defformat\blx@defplainformat{ffd}{}}}
+\newrobustcmd*{\DeclareIndexFieldFormat}{%
+ \@ifstar
+ {\blx@defformat\blx@defplainformat{fid}*}
+ {\blx@defformat\blx@defplainformat{fid}{}}}
+
+\newrobustcmd*{\DeclareNameWrapperFormat}{%
+ \@ifstar
+ {\blx@defformat\blx@defnameformat{nwd}*}
+ {\blx@defformat\blx@defnameformat{nwd}{}}}
+
+\newrobustcmd*{\DeclareListWrapperFormat}{%
+ \@ifstar
+ {\blx@defformat\blx@defplainformat{lwd}*}
+ {\blx@defformat\blx@defplainformat{lwd}{}}}
+
+% {<macro>}{<class>}{<*>}
+\def\blx@defformat#1#2#3{%
+ \@ifnextchar[%]
+ {\blx@defformat@i{#1}{#2}{#3}}
+ {\blx@defformat@i{#1}{#2}{#3}[*]}}
+
+% {<macro>}{<class>}{<*>}[<entrytype>]{<name>}
+\def\blx@defformat@i#1#2#3[#4]#5{%
+ \notblank{#3}
+ {\blx@resetformat{#2}{#5}}
+ {}%
+ \def\blx@defformat@a{#2}%
+ \def\blx@defformat@b{#4}%
+ \blx@xsanitizeafter{\def\blx@defformat@c}{#5}%
+ \afterassignment\blx@defformat@ii
+ #1}
+
+\def\blx@defformat@ii{%
+ \expandafter\forcsvlist
+ \expandafter\blx@defformat@iii
+ \expandafter{\blx@defformat@b}}
+
+\def\blx@defformat@iii#1{%
+ \cslet{abx@\blx@defformat@a @#1@\blx@defformat@c}\blx@defformat@d}
+
+% grab the argument explicitly, this avoids issues with spaces making it
+% into the argument specification of the macros
+% cf. \def\foo#1{<stuff>} vs. \def\foo#1 {<stuff>}
+\long\def\blx@defplainformat#1{%
+ \long\def\blx@defformat@d##1{#1}}
+
+\long\def\blx@defnameformat#1{%
+ \long\def\blx@defformat@d##1{#1}}
+
+\def\blx@resetformat#1#2{%
+ \let\blx@saved@do\do
+ \def\do##1{\blx@resetformat@i{#1}{#2}{##1}}%
+ \blx@safe@actives
+ \abx@doentrytypes
+ \blx@rest@actives
+ \let\do\blx@saved@do}
+
+\def\blx@resetformat@i#1#2#3{%
+ \ifcsdef{abx@#1@#3@#2}
+ {\csundef{abx@#1@#3@#2}}
+ {}}
+
+% {<name>}{<name>}
+\def\blx@letformat#1#2{%
+ \blx@safe@actives
+ \afterassignment\blx@rest@actives
+ \csletcs{#1}{#2}}
+
+% [aliastype]{aliasname}[formattype]{formatname}
+\def\blx@defalias#1{%
+ \@ifnextchar[%]
+ {\blx@defalias@i{#1}}
+ {\blx@defalias@i{#1}[*]}}
+\def\blx@defalias@i#1[#2]#3{%
+ \@ifnextchar[%]
+ {\blx@defalias@ii{#1}{#2}{#3}}
+ {\blx@defalias@ii{#1}{#2}{#3}[*]}}
+\def\blx@defalias@ii#1#2#3[#4]#5{%
+ \blx@safe@actives
+ \afterassignment\blx@rest@actives
+ \csedef{abx@#1@#2@#3}{%
+ \expandonce{\csname abx@#1@#4@#5\endcsname}}}
+
+% {<macro>}{<class>}{<name>}{<field>}
+\def\blx@getformat#1#2#3#4{%
+ \blx@safe@actives
+ \afterassignment\blx@rest@actives
+ \ifcsundef{abx@#2@\blx@imc@thefield{entrytype}@#3}
+ {\ifcsundef{abx@#2@*@#3}
+ {\ifcsundef{abx@#2@\blx@imc@thefield{entrytype}@#4}
+ {\ifcsundef{abx@#2@*@#4}
+ {\letcs#1{abx@#2@*@default}}
+ {\letcs#1{abx@#2@*@#4}}}
+ {\letcs#1{abx@#2@\blx@imc@thefield{entrytype}@#4}}}
+ {\letcs#1{abx@#2@*@#3}}}
+ {\letcs#1{abx@#2@\blx@imc@thefield{entrytype}@#3}}}
+
+% [<entrytype>]{<name>}
+\newrobustcmd*{\savefieldformat}[2][*]{\blx@save{abx@ffd@#1@#2}}
+\newrobustcmd*{\savelistformat}[2][*]{\blx@save{abx@lfd@#1@#2}}
+\newrobustcmd*{\savenameformat}[2][*]{\blx@save{abx@nfd@#1@#2}}
+\newrobustcmd*{\savelistwrapperformat}[2][*]{\blx@save{abx@lwd@#1@#2}}
+\newrobustcmd*{\savenamewrapperformat}[2][*]{\blx@save{abx@nwd@#1@#2}}
+
+\newrobustcmd*{\restorefieldformat}[2][*]{\blx@restore{abx@ffd@#1@#2}}
+\newrobustcmd*{\restorelistformat}[2][*]{\blx@restore{abx@lfd@#1@#2}}
+\newrobustcmd*{\restorenameformat}[2][*]{\blx@restore{abx@nfd@#1@#2}}
+\newrobustcmd*{\restorelistwrapperformat}[2][*]{\blx@restore{abx@lwd@#1@#2}}
+\newrobustcmd*{\restorenamewrapperformat}[2][*]{\blx@restore{abx@nwd@#1@#2}}
+
+% [<entrytype>]{<name>}{<true>}{<false>}
+\newrobustcmd*{\iffieldformatundef}[2][*]{\ifcsundef{abx@ffd@#1@#2}}
+\newrobustcmd*{\iflistformatundef}[2][*]{\ifcsundef{abx@lfd@#1@#2}}
+\newrobustcmd*{\ifnameformatundef}[2][*]{\ifcsundef{abx@nfd@#1@#2}}
+\newrobustcmd*{\iflistwrapperformatundef}[2][*]{\ifcsundef{abx@lwd@#1@#2}}
+\newrobustcmd*{\ifnamewrapperformatundef}[2][*]{\ifcsundef{abx@nwd@#1@#2}}
+
+% [<entrytype>]{<alias>}[<entrytype>]{<name>}
+\newrobustcmd*{\DeclareNameAlias}{\blx@defalias{nfd}}
+\newrobustcmd*{\DeclareIndexNameAlias}{\blx@defalias{nid}}
+
+\newrobustcmd*{\DeclareListAlias}{\blx@defalias{lfd}}
+\newrobustcmd*{\DeclareIndexListAlias}{\blx@defalias{lid}}
+
+\newrobustcmd*{\DeclareFieldAlias}{\blx@defalias{ffd}}
+\newrobustcmd*{\DeclareIndexFieldAlias}{\blx@defalias{fid}}
+
+\newrobustcmd*{\DeclareNameWrapperAlias}{\blx@defalias{nwd}}
+
+\newrobustcmd*{\DeclareListWrapperAlias}{\blx@defalias{lwd}}
+
+% #1: internal type signature, #2: type text for warning
+% #3 #4 #5 #6
+% [aliastype]{aliasname}[formattype]{formatname}
+\def\blx@deprecateformat#1#2{%
+ \@ifnextchar[%]
+ {\blx@deprecateformat@i{#1}{#2}}
+ {\blx@deprecateformat@i{#1}{#2}[*]}}
+\def\blx@deprecateformat@i#1#2[#3]#4{%
+ \@ifnextchar[%]
+ {\blx@deprecateformat@ii{#1}{#2}{#3}{#4}}
+ {\blx@deprecateformat@ii{#1}{#2}{#3}{#4}[*]}}
+\def\blx@deprecateformat@ii#1#2#3#4[#5]#6{%
+ \blx@safe@actives
+ \afterassignment\blx@rest@actives
+ \csdef{abx@#1@#3@#4}{%
+ \ifcsundef{abx@legacywarning@#1@#3@#4}
+ {\global\cslet{abx@legacywarning@#1@#3@#4}\@empty
+ \blx@warning@noline{%
+ #2 '#4' deprecated.\MessageBreak
+ Please use '#6' instead.\MessageBreak
+ Using '#6' now}}
+ {}%
+ \csname abx@#1@#5@#6\endcsname}}
+
+% [<entrytype>]{<alias>}[<entrytype>]{<name>}
+\newrobustcmd*{\DeprecateNameFormatWithReplacement}{%
+ \blx@deprecateformat{nfd}{Name format}}
+\newrobustcmd*{\DeprecateIndexNameFormatWithReplacement}{%
+ \blx@deprecateformat{nid}{Index name format}}
+
+\newrobustcmd*{\DeprecateListFormatWithReplacement}{%
+ \blx@deprecateformat{lfd}{List format}}
+\newrobustcmd*{\DeprecateIndexListFormatWithReplacement}{%
+ \blx@deprecateformat{lid}{Index list format}}
+
+\newrobustcmd*{\DeprecateFieldFormatWithReplacement}{%
+ \blx@deprecateformat{ffd}{Field format}}
+\newrobustcmd*{\DeprecateIndexFieldFormatWithReplacement}{%
+ \blx@deprecateformat{fid}{Index field format}}
+
+\newrobustcmd*{\DeprecateNameWrapperFormatWithReplacement}{%
+ \blx@deprecateformat{nwd}{Name wrapper format}}
+
+\newrobustcmd*{\DeprecateListWrapperFormatWithReplacement}{%
+ \blx@deprecateformat{lwd}{List wrapper format}}
+
+% [<format>]{<text>}
+\newrobustcmd{\blx@imc@printtext}[2][]{%
+ \ifblank{#2}
+ {\blx@nounit}
+ {\ifblank{#1}
+ {\let\blx@theformat\@firstofone}
+ {\blx@getformat\blx@theformat{ffd}{#1}{}}%
+ \ifdefvoid\blx@theformat
+ {\blx@nounit}
+ {\blx@begunit
+ \blx@theformat{#2}%
+ \blx@endunit}}}
+
+% This loops over all form/lang pairs defined for a lang and uses the first one it finds
+% by defining \blx@cmsform/\blx@cmslang according to what it finds
+% {bcp47tag}{entryfield}{entryfieldtype}
+\DeclareDocumentCommand{\blx@ifmsselect}
+ {m m m}
+ {\blx@imc@ifmsentryfield{#2}
+ {\boolfalse{selectms}%
+ % First check the current \blx@msform/\blx@mslang
+ % Must explicitly specify form/lang here and not rely on defaults as \blx@ifmsundef
+ % checks if *any* alternates are defined if no form/lang is passed
+ \blx@ifmsundef{#3}[\blx@msform][\blx@mslang]{#2}
+ % If not defined, then check the select list for the language (tag) of the entry
+ {\ifcsdef{blx@msselect@#1}
+ {\let\blx@tempa\@empty
+ \begingroup
+ \def\do##1{\do@i##1}% \blx@msselect@* list contains pairs like {form}{lang}|{form}{lang}
+ \def\do@i##1##2{%
+ \blx@ifmsundef{#3}[{##1}][{##2}]{#2}
+ {}
+ {% Found a field alternate, save form/lang values and exit listloop
+ \gappto\blx@tempa{\def\blx@cmsform{##1}}%
+ \gappto\blx@tempa{\def\blx@cmslang{##2}}%
+ \gappto\blx@tempa{\booltrue{selectms}}%
+ \listbreak}}%
+ \dolistcsloop{blx@msselect@#1}%
+ \endgroup
+ \blx@tempa\undef\blx@tempa}
+ {}}
+ {\booltrue{selectms}%
+ \let\blx@cmsform\blx@msform
+ \let\blx@cmslang\blx@mslang}% Found the current form/lang alternate
+ \ifbool{selectms}
+ {\@secondoftwo}% found an alternate
+ {\blx@imc@iffieldundef{langid}% No alternate found, check form/langid as last resort
+ {\@firstoftwo}
+ {\blx@ifmsundef{#3}[\blx@msform][\blx@lmslang]{#2}
+ {\@firstoftwo}
+ {\let\blx@cmsform\blx@msform
+ \let\blx@cmslang\blx@lmslang}%
+ \@secondoftwo}}}
+ {\blx@ifmsundef{#3}{#2}}} % Not a multiscript field, just do a normal undef check
+
+% [<format>][<msform>][<mslang>]{field}
+% O{} is an optional arg which defaults to nothing rather than xparse "-NoValue-"
+\DeclareDocumentCommand{\blx@imc@printfield}
+ {O{} O{} O{} m}
+ {\ifboolexpr {test {\ifblank{#2}} and test {\ifblank{#3}}}
+ {\blx@imc@iffieldundef{langid}
+ {\blx@ifmsselect{\blx@mslang}{#4}{field}}
+ {\blx@ifmsselect{\blx@lmslang}{#4}{field}}}
+ {\let\blx@cmsform\blx@msform%
+ \let\blx@cmslang\blx@mslang%
+ \ifblank{#2}{}{\edef\blx@cmsform{#2}}%
+ \ifblank{#3}{}{\edef\blx@cmslang{#3}}%
+ \blx@imc@iffieldundef[\blx@cmsform][\blx@cmslang]{#4}}%
+ {\blx@nounit}
+ {\blx@getformat\blx@theformat{ffd}{#1}{#4}%
+ \ifdefvoid\blx@theformat
+ {\blx@nounit}
+ {\blx@begunit
+ \edef\currentfield{#4}%
+ \blx@imc@ifmsentryfield{#4}
+ {\let\currentmsform\@empty
+ \let\currentmslang\@empty
+ \let\currentmsforms\@empty
+ \let\currentmslangs\@empty
+ \begingroup
+ % begin language for field mslang
+ \let\currentmsform\blx@cmsform%
+ \let\currentmslang\blx@cmslang%
+ \letcs\currentmsforms{abx@fieldmsforms@#4}%
+ \letcs\currentmslangs{abx@fieldmslangs@#4}%
+ \edef\blx@tempa{\csuse{blx@msmaplang@\currentmslang}}%
+ % Override language from any field-level mslang annotation
+ \ifcsdef{abx@annotation@literal@field@\currentmsform @\currentmslang @\currentfield @mslang}
+ {\edef\currentmslang{\csuse{abx@annotation@literal@field@\currentmsform @\currentmslang @\currentfield @mslang}}%
+ \edef\blx@tempa{\csuse{blx@msmaplang@\currentmslang}}}%
+ {}%
+ \ifdef\blx@thefieldlangenv
+ {\iftoggle{blx@autofieldlangstrings}
+ {\blx@langsetup{\blx@tempa}% must call this to load the .lbx
+ \csuse{abx@extras@\blx@tempa}%
+ \csuse{abx@strings@\blx@tempa}}
+ {}%
+ \blx@hook@initfieldlang
+ \csname\blx@thefieldlangenv\expandafter\endcsname\expandafter{\blx@tempa}}
+ {}%
+ \expandafter\expandafter
+ \expandafter\blx@theformat
+ \expandafter\expandafter
+ \expandafter{\csname abx@field@\currentmsform @\currentmslang @#4\endcsname}%
+ % end language for field mslang
+ \ifdef\blx@thefieldlangenv
+ {\blx@hook@endfieldlang
+ \csname end\blx@thefieldlangenv\endcsname}
+ {}%
+ \endgroup}
+ {\expandafter\expandafter
+ \expandafter\blx@theformat
+ \expandafter\expandafter
+ \expandafter{\csname abx@field@@@#4\endcsname}}%
+ \blx@endunit}}}
+
+% [<format>][<msform>][<mslang>]{field}
+\DeclareExpandableDocumentCommand{\blx@imc@indexfield}
+ {O{} O{} O{} m}
+ {\ifboolexpr {test {\ifblank{#2}} and test {\ifblank{#3}}}
+ {\blx@imc@iffieldundef{langid}
+ {\blx@ifmsselect{\blx@mslang}{#4}{field}}
+ {\blx@ifmsselect{\blx@lmslang}{#4}{field}}}
+ {\let\blx@cmsform\blx@msform%
+ \let\blx@cmslang\blx@mslang%
+ \ifblank{#2}{}{\edef\blx@cmsform{#2}}%
+ \ifblank{#3}{}{\edef\blx@cmslang{#3}}%
+ \blx@imc@iffieldundef[\blx@cmsform][\blx@cmslang]{#4}}%
+ {}
+ {\blx@getformat\blx@theformat{fid}{#1}{#4}%
+ \ifdefvoid\blx@theformat
+ {}
+ {\begingroup
+ \edef\currentfield{#4}%
+ \let\currentmsform\@empty
+ \let\currentmslang\@empty
+ \let\currentmsforms\@empty
+ \let\currentmslangs\@empty
+ \blx@imc@ifmsentryfield{#4}
+ {\let\currentmsform\blx@cmsform%
+ \let\currentmslang\blx@cmslang%
+ \letcs\currentmsforms{abx@fieldmsforms@#4}%
+ \letcs\currentmslangs{abx@fieldmslangs@#4}%
+ \edef\blx@tempa{\csuse{blx@msmaplang@\curentmslang}}%
+ \letcs\blx@tempb{abx@field@\currentmsform @\currentmslang @#4}%
+ \expandafter\blx@theformat\expandafter{\blx@tempb}}
+ {\letcs\blx@tempb{abx@field@@@#4}%
+ \expandafter\blx@theformat\expandafter{\blx@tempb}}%
+ \endgroup}}}
+
+% [<format>]{<file>}
+\newrobustcmd*{\blx@imc@printfile}[2][]{%
+ \iftoggle{blx@loadfiles}
+ {\IfFileExists{#2}
+ {\listxadd\blx@list@req@edit{#2}%
+ \blx@imc@printtext[{#1}]{\input{#2}\unspace}}
+ {\blx@nounit}}
+ {\blx@nounit}}
+
+% {<macro>}[<format>][<start>-<stop>][<msform>][<mslang>]
+% => <macro>{<format>}{<start>}{<stop>}{<msform>}{<mslang>}
+\DeclareDocumentCommand\blx@listargs
+ {m O{} >{\SplitArgument{1}{-}}O{} O{} O{}}
+ {\let\Start\@empty%
+ \let\Stop\@empty%
+ \ifblank{#3}
+ {}%
+ {\edef\Start{\@firstoftwo#3}%
+ \edef\Stop{\@secondoftwo#3}}%
+ \expandafter\IfNoValueTF\expandafter{\Stop}% Work around bug in xparse
+ {\def\Stop{}}
+ {}%
+ \protected@edef\z{\noexpand#1{#2}{\Start}{\Stop}{#4}{#5}}\z}
+
+% [<format>][<start>-<stop>]{<namelist>}
+\protected\def\blx@imc@printnames{%
+ \blx@listargs\blx@printnames}
+
+% {<format>}{<start>}{<stop>}{<msform>}{<mslang>}{<namelist>}
+\def\blx@printnames#1#2#3#4#5#6{%
+ \ifboolexpr {test {\ifblank{#4}} and test {\ifblank{#5}}}
+ {\blx@imc@iffieldundef{langid}
+ {\blx@ifmsselect{\blx@mslang}{#6}{name}}
+ {\blx@ifmsselect{\blx@lmslang}{#6}{name}}}
+ {\let\blx@cmsform\blx@msform%
+ \let\blx@cmslang\blx@mslang%
+ \ifblank{#4}{}{\edef\blx@cmsform{#4}}%
+ \ifblank{#5}{}{\edef\blx@cmslang{#5}}%
+ \blx@imc@ifnameundef[\blx@cmsform][\blx@cmslang]{#6}}%
+ {\blx@nounit}
+ {\blx@getformat\blx@thewrapperformat{nwd}{#1}{#6}%
+ \ifdefvoid\blx@thewrapperformat
+ {\blx@nounit}
+ {\blx@getformat\blx@theformat{nfd}{#1}{#6}%
+ \ifdefvoid\blx@theformat
+ {\blx@nounit}
+ {\blx@begunit
+ \blx@namesetup{#2}{#3}{\blx@cmsform}{\blx@cmslang}{#6}%
+ \blx@imc@ifmsentryfield{\currentname}
+ {% begin language for name list mslang
+ \begingroup
+ \edef\blx@tempa{\csuse{blx@msmaplang@\currentmslang}}%
+ % Override language from any field-level mslang annotation
+ \ifcsdef{abx@annotation@literal@field@\currentmsform @\currentmslang @\currentname @mslang}
+ {\edef\currentmslang{\csuse{abx@annotation@literal@field@\currentmsform @\currentmslang @\currentname @mslang}}%
+ \edef\blx@tempa{\csuse{blx@msmaplang@\currentmslang}}}%
+ {}%
+ \ifdef\blx@thefieldlangenv
+ {\iftoggle{blx@autofieldlangstrings}
+ {\blx@langsetup{\blx@tempa}% must call this to load the .lbx
+ \csuse{abx@extras@\blx@tempa}%
+ \csuse{abx@strings@\blx@tempa}}
+ {}%
+ \blx@hook@initfieldlang
+ \csname\blx@thefieldlangenv\expandafter\endcsname\expandafter{\blx@tempa}}
+ {}}
+ {}%
+ \blx@thewrapperformat{\expandafter\blx@nameparser\blx@thedata{}&}%
+ \blx@imc@ifmsentryfield{\currentname}
+ {% end language for name list mslang
+ \ifdef\blx@thefieldlangenv
+ {\blx@hook@endfieldlang
+ \csname end\blx@thefieldlangenv\endcsname}
+ {}%
+ \endgroup}
+ {}%
+ \blx@endunit}}}}
+
+\def\blx@namesetup#1#2#3#4#5{%
+ \def\currentname{#5}%
+ \let\currentmsform\@empty
+ \let\currentmslang\@empty
+ \let\currentmsforms\@empty
+ \let\currentmslangs\@empty
+ \c@listcount\@ne
+ \c@listtotal\csname c@#5\endcsname
+ \blx@namesetup@i{#3}{#4}{#5}%
+ \ifblank{#1}
+ {\c@liststart\@ne}
+ {\ifnum#1<\@ne
+ \c@liststart\@ne
+ \else
+ \c@liststart#1\relax
+ \fi}%
+ \ifblank{#2}
+ {\c@liststop\c@listtotal
+ \ifnum\c@liststop>\c@maxnames
+ \c@liststop\c@minnames
+ \ifnum\c@uniquelist>\c@liststop
+ \c@liststop\c@uniquelist
+ \fi
+ \fi}
+ {\ifnum#2>\c@listtotal
+ \c@liststop\c@listtotal
+ \else
+ \ifnum#2<\@ne
+ \c@liststop\@ne
+ \else
+ \c@liststop#2\relax
+ \fi
+ \fi}%
+ \ifboolexpr{test {\iftoggle{blx@pluralothers}}
+ and
+ test {\ifnumcomp{\value{listtotal}-\value{liststop}}{=}{1}}}
+ {\c@liststop\c@listtotal}
+ {}%
+ \blx@namecodes}
+
+\def\blx@namesetup@i#1#2#3{%
+ \blx@imc@ifmsentryfield{#3}
+ {\edef\currentmsform{#1}%
+ \edef\currentmslang{#2}%
+ \letcs\currentmsforms{abx@fieldmsforms@#3}%
+ \letcs\currentmslangs{abx@fieldmslangs@#3}%
+ \expandafter\expandafter
+ \expandafter\blx@namesetup@ii\csname abx@name@#1@#2@#3\endcsname}
+ {\expandafter\expandafter
+ \expandafter\blx@namesetup@ii\csname abx@name@@@#3\endcsname}}
+
+\def\blx@namesetup@ii#1#2{%
+ \c@uniquelist\z@
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@opt@namelist}{#1}}%
+ \def\blx@thedata{#2}}
+
+% Biber-calculated info passed back to biblatex as an option in the .bbl
+% unlike stuff defined with \DeclareBiblatexOption and
+% \blx@DeclareBackendOption these are not 'real' options
+\blx@kv@defkey{blx@opt@namelist}{ul}{\c@uniquelist#1\relax}
+\blx@kv@defkey{blx@opt@name}{mslang}{\def\blx@nmslang{#1}}
+\blx@kv@defkey{blx@opt@name}{un}{\c@uniquename#1\relax}
+\blx@kv@defkey{blx@opt@name}{uniquepart}{\def\abx@field@@@uniquepart{#1}}
+\blx@kv@defkey{blx@opt@name}{hash}{\edef\abx@field@@@hash{\detokenize{#1}}}
+
+\newrobustcmd*{\bibinitperiod}{\adddot}
+\newrobustcmd*{\bibinitdelim}{\addnbspace}
+\newrobustcmd*{\bibinithyphendelim}{.\mbox{-}}
+\newrobustcmd*{\bibnamedelima}{\addhighpenspace}
+\newrobustcmd*{\bibnamedelimb}{\addlowpenspace}
+\newrobustcmd*{\bibnamedelimc}{\addhighpenspace}
+\newrobustcmd*{\bibnamedelimd}{\addlowpenspace}
+\newrobustcmd*{\bibnamedelimi}{\isdot\addnbspace}
+
+% [<format>][<start>-<stop>]{<namelist>}
+\protected\def\blx@imc@indexnames{%
+ \blx@listargs\blx@indexnames}
+
+% {<format>}{<start>}{<stop>}{<msform>}{<mslang>}{<namelist>}
+\def\blx@indexnames#1#2#3#4#5#6{%
+ \ifboolexpr {test {\ifblank{#4}} and test {\ifblank{#5}}}
+ {\blx@imc@iffieldundef{langid}
+ {\blx@ifmsselect{\blx@mslang}{#6}{name}}
+ {\blx@ifmsselect{\blx@lmslang}{#6}{name}}}
+ {\let\blx@cmsform\blx@msform%
+ \let\blx@cmslang\blx@mslang%
+ \ifblank{#4}{}{\edef\blx@cmsform{#4}}%
+ \ifblank{#5}{}{\edef\blx@cmslang{#5}}%
+ \blx@imc@ifnameundef[\blx@cmsform][\blx@cmslang]{#6}}%
+ {}
+ {\blx@getformat\blx@theformat{nid}{#1}{#6}%
+ \ifdefvoid\blx@theformat
+ {}
+ {\begingroup
+ \blx@namesetup{#2}{#3}{\blx@cmsform}{\blx@cmslang}{#6}%
+ \blx@indexnamesetup
+ \expandafter\blx@nameparser\blx@thedata{}&%
+ \endgroup}}}
+
+\def\blx@indexnamesetup{%
+ \let\bibinitperiod\bibindexinitperiod
+ \let\bibinitdelim\bibindexinitdelim
+ \let\bibinithyphendelim\bibindexinithyphendelim
+ \let\bibnamedelima\bibindexnamedelima
+ \let\bibnamedelimb\bibindexnamedelimb
+ \let\bibnamedelimc\bibindexnamedelimc
+ \let\bibnamedelimd\bibindexnamedelimd
+ \let\bibnamedelimi\bibindexnamedelimi}
+
+% {<name1>}{<name2>}{...}
+\long\def\blx@indexnameparser#1{%
+ \ifblank{#1}
+ {\blx@namebreak}
+ {\ifnum\c@listcount<\c@liststart
+ \else
+ \blx@indexnameparser@i#1%
+ \fi
+ \advance\c@listcount\@ne
+ \ifnum\c@listcount>\c@liststop
+ \expandafter\blx@namebreak
+ \fi
+ \blx@indexnameparser}}
+
+% {name opts}{nameparts}
+\long\def\blx@indexnameparser@i#1#2{%
+ \begingroup
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@opt@name}{#1}}%
+ % reset all the nameparts to empty between names
+ \def\do##1{%
+ \cslet{namepart##1}\@empty
+ \cslet{namepart##1i}\@empty
+ \cslet{namepart##1un}\@empty}%
+ \expandafter\docsvlist\expandafter{\blx@datamodel@constant@nameparts}%
+ \blx@kv@setkeys{blx@opt@namepart}{#2}% Extract nameparts information
+ \blx@theformat{}%
+ \endgroup}
+
+% {<name1>}{<name2>}{...}
+\long\def\blx@nameparser#1{%
+ \ifblank{#1}
+ {\blx@namebreak}
+ {\ifnum\c@listcount<\c@liststart
+ \else
+ \blx@nameparser@i#1%
+ \fi
+ \advance\c@listcount\@ne
+ \ifnum\c@listcount>\c@liststop
+ \expandafter\blx@namebreak
+ \fi
+ \blx@nameparser}}
+
+% {name opts}{nameparts}
+\long\def\blx@nameparser@i#1#2{%
+ \begingroup
+ \let\blx@nmslang\@empty
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@opt@name}{#1}}%
+ % reset all the nameparts to empty between names
+ \def\do##1{%
+ \cslet{namepart##1}\@empty
+ \cslet{namepart##1i}\@empty
+ \cslet{namepart##1un}\@empty}%
+ \expandafter\docsvlist\expandafter{\blx@datamodel@constant@nameparts}%
+ \blx@kv@setkeys{blx@opt@namepart}{#2}% Extract nameparts information
+ % Extract all alternate nameparts for use in format
+ \begingroup
+ \edef\blx@tempc{\endgroup
+ \noexpand\blx@kv@setkeys{blx@opt@nameparts}{\csuse{abx@nameparts@\currentname @\thelistcount}}}%
+ \blx@tempc
+ % For per-name lang switching, see name:langswitchon/off in biblatex.def
+ % This is because the format wraps everything, including namelist delims like "and"
+ % which then are set according to the lang strings of the name list item and this is
+ % not what we want - putting the lang switching in the format makes it granular
+ % to just the name list item data
+ \blx@theformat{}%
+ \endgroup}
+
+\long\def\blx@namebreak#1&{}
+
+% [<format>][<start>-<stop>][<msform>][<mslang>]{<plainlist>}
+\protected\def\blx@imc@printlist{%
+ \blx@listargs\blx@printlist}
+
+% {<format>}{<start>}{<stop>}{<msform>}{<mslang>}{<plainlist>}
+\def\blx@printlist#1#2#3#4#5#6{%
+ \ifboolexpr {test {\ifblank{#4}} and test {\ifblank{#5}}}
+ {\blx@imc@iffieldundef{langid}
+ {\blx@ifmsselect{\blx@mslang}{#6}{list}}
+ {\blx@ifmsselect{\blx@lmslang}{#6}{list}}}
+ {\let\blx@cmsform\blx@msform%
+ \let\blx@cmslang\blx@mslang%
+ \ifblank{#4}{}{\edef\blx@cmsform{#4}}%
+ \ifblank{#5}{}{\edef\blx@cmslang{#5}}%
+ \blx@imc@iflistundef[\blx@cmsform][\blx@cmslang]{#6}}%
+ {\blx@nounit}
+ {\blx@getformat\blx@thewrapperformat{lwd}{#1}{#6}%
+ \ifdefvoid\blx@thewrapperformat
+ {\blx@nounit}
+ {\blx@getformat\blx@theformat{lfd}{#1}{#6}%
+ \ifdefvoid\blx@theformat
+ {\blx@nounit}
+ {\blx@begunit
+ \blx@listsetup{#2}{#3}{\blx@cmsform}{\blx@cmslang}{#6}%
+ \blx@imc@ifmsentryfield{\currentlist}
+ {% begin language for list mslang
+ \begingroup
+ \edef\blx@tempa{\csuse{blx@msmaplang@\currentmslang}}%
+ % Override language from any field-level mslang annotation
+ \ifcsdef{abx@annotation@literal@field@\currentmsform @\currentmslang @\currentlist @mslang}
+ {\edef\currentmslang{\csuse{abx@annotation@literal@field@\currentmsform @\currentmslang @\currentlist @mslang}}%
+ \edef\blx@tempa{\csuse{blx@msmaplang@\currentmslang}}}%
+ {}%
+ \ifdef\blx@thefieldlangenv
+ {\iftoggle{blx@autofieldlangstrings}
+ {\blx@langsetup{\blx@tempa}% must call this to load the .lbx
+ \csuse{abx@extras@\blx@tempa}%
+ \csuse{abx@strings@\blx@tempa}}
+ \blx@hook@initfieldlang
+ \csname\blx@thefieldlangenv\expandafter\endcsname\expandafter{\blx@tempa}}
+ {}}
+ {}%
+ \blx@thewrapperformat{\expandafter\blx@listparser\blx@thedata{}&}%
+ \blx@imc@ifmsentryfield{\currentlist}
+ {% end language for list mslang
+ \ifdef\blx@thefieldlangenv
+ {\blx@hook@endfieldlang
+ \csname end\blx@thefieldlangenv\endcsname}
+ {}%
+ \endgroup}
+ {}%
+ \blx@endunit}}}}
+
+\def\blx@listsetup#1#2#3#4#5{%
+ \def\currentlist{#5}%
+ \let\currentmsform\@empty
+ \let\currentmslang\@empty
+ \let\currentmsforms\@empty
+ \let\currentmslangs\@empty
+ \c@listcount\@ne
+ \expandafter\c@listtotal\csname c@#5\endcsname
+ \blx@imc@ifmsentryfield{#5}
+ {\letcs\blx@thedata{abx@list@#3@#4@#5}%
+ \edef\currentmsform{#3}%
+ \edef\currentmslang{#4}%
+ \letcs\currentmsforms{abx@fieldmsforms@#5}%
+ \letcs\currentmslangs{abx@fieldmslangs@#5}}
+ {\letcs\blx@thedata{abx@list@@@#5}}%
+ \ifblank{#1}
+ {\c@liststart\@ne}
+ {\ifnum#1<\@ne
+ \c@liststart\@ne
+ \else
+ \c@liststart#1\relax
+ \fi}%
+ \ifblank{#2}
+ {\c@liststop\c@listtotal
+ \ifnum\c@listtotal>\c@maxitems
+ \c@liststop\c@minitems
+ \fi}
+ {\ifnum#2>\c@listtotal
+ \c@liststop\c@listtotal
+ \else
+ \ifnum#2<\@ne
+ \c@liststop\@ne
+ \else
+ \c@liststop#2\relax
+ \fi
+ \fi}}
+
+% [<format>][<start>-<stop>]{<plainlist>}
+\protected\def\blx@imc@indexlist{%
+ \blx@listargs\blx@indexlist}
+
+% {<format>}{<start>}{<stop>}{<msform>}{<mslang>}{<plainlist>}
+\def\blx@indexlist#1#2#3#4#5#6{%
+ \ifboolexpr {test {\ifblank{#4}} and test {\ifblank{#5}}}
+ {\blx@imc@iffieldundef{langid}
+ {\blx@ifmsselect{\blx@mslang}{#6}{list}}
+ {\blx@ifmsselect{\blx@lmslang}{#6}{list}}}
+ {\let\blx@cmsform\blx@msform%
+ \let\blx@cmslang\blx@mslang%
+ \ifblank{#4}{}{\edef\blx@cmsform{#4}}%
+ \ifblank{#5}{}{\edef\blx@cmslang{#5}}%
+ \blx@imc@iflistundef[\blx@cmsform][\blx@cmslang]{#6}}%
+ {}
+ {\blx@getformat\blx@theformat{lid}{#1}{#6}%
+ \ifdefvoid\blx@theformat
+ {}
+ {\begingroup
+ \blx@listsetup{#2}{#3}{\blx@cmsform}{\blx@cmslang}{#6}%
+ \expandafter\blx@listparser\blx@thedata{}&%
+ \endgroup}}}
+
+% {<item1>}{<item2>}{...}
+\long\def\blx@indexlistparser#1{%
+ \ifblank{#1}
+ {\blx@listbreak}
+ {\ifnum\c@listcount<\c@liststart
+ \else
+ \blx@theformat{#1}%
+ \fi
+ \advance\c@listcount\@ne
+ \ifnum\c@listcount>\c@liststop
+ \expandafter\blx@listbreak
+ \fi
+ \blx@indexlistparser}}
+
+% {<item1>}{<item2>}{...}
+\long\def\blx@listparser#1{%
+ \ifblank{#1}
+ {\blx@listbreak}
+ {\ifnum\c@listcount<\c@liststart
+ \else
+ \blx@imc@ifmsentryfield{\currentlist}
+ {% Extract all alternate listitems for use in format
+ \begingroup
+ % Need expand the actual value here only once, as in fielddef otherwise
+ % we get into problems with setkeys when values contain things like \emph{}
+ % Since setkeys needs a string of keyvals, we have to edef when the keyvals
+ % are the value of some macro and this fully expands output macros which might
+ % in plain list values like \emph{} etc.
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\blx@tempb\expandafter\expandafter\expandafter{\expandafter\expandonce\csname abx@listitems@\currentlist @\thelistcount\endcsname}%
+ \edef\blx@tempd{\endgroup
+ \noexpand\blx@kv@setkeys{blx@opt@listitems}{\blx@tempb}}%
+ \blx@tempd}
+ {}%
+ % per-list item lang switching is done in list:langswitchon/off in biblatex.def
+ % This is because the format wraps everything, including list delims like "and"
+ % which then are set according to the lang strings of the list item and this is
+ % not what we want - putting the lang switching in the format makes it granular
+ % to just the list item data
+ \blx@theformat{#1}%
+ \fi
+ \advance\c@listcount\@ne
+ \ifnum\c@listcount>\c@liststop
+ \expandafter\blx@listbreak
+ \fi
+ \blx@listparser}}
+
+\long\def\blx@listbreak#1&{}
+
+% <*>{<key>}{<code>}
+\protected\def\blx@imc@entrydata{%
+ \@ifstar
+ {\blx@xsanitizeafter{\blx@imc@entrydata@i\blx@saveentry}}
+ {\blx@xsanitizeafter{\blx@imc@entrydata@i{}}}}
+
+\long\def\blx@imc@entrydata@i#1#2#3{%
+ \blx@getrefcontext{#2}%
+ \blx@ifdata{#2}
+ {\begingroup
+ #1%
+ \blx@resetdata
+ \blx@getdata{#2}%
+ \blx@entrysetcount
+ \blx@setoptions@type\abx@field@@@entrytype
+ \blx@setoptions@entry
+ \addtocounter{instcount}\@ne
+ \blx@execute
+ \blx@beglangbib#3\blx@endlangbib
+ \endgroup}
+ {}}
+
+\protected\def\blx@imc@entryset#1#2{%
+ \blx@imc@iffieldundef{entrykey}
+ {}
+ {\begingroup
+ \long\def\blx@entryset@precode{#1}%
+ \long\def\blx@entryset@postcode{#2}%
+ \let\finentry\blx@finentry@inset
+ \let\do\blx@entryset
+ \blx@imc@docsvfield{entryset}%
+ \endgroup}}
+
+\def\blx@entryset#1{%
+ \blx@ifdata{#1}
+ {\begingroup
+ \blx@imc@clearlist{pageref}%
+ \blx@getdata{#1}%
+ \blx@setoptions@type\abx@field@@@entrytype
+ \blx@setoptions@entry
+ \global\blx@entrysetcounter\@ne
+ \edef\abx@field@@@entrysetcount{\the\blx@entrysetcounter}%
+ \blx@execute
+ \blx@beglangbib
+ \blx@begunit
+ \blx@anchor
+ \blx@entryset@precode
+ \blx@driver{\blx@imc@thefield{entrytype}}%
+ \blx@entryset@postcode
+ \blx@endunit
+ \blx@endlangbib
+ \endgroup}
+ {}%
+ \let\do\blx@entryset@i}
+
+\def\blx@entryset@i#1{%
+ \blx@ifdata{#1}
+ {\begingroup
+ \blx@resetdata
+ \blx@getdata{#1}%
+ \blx@setoptions@type\abx@field@@@entrytype
+ \blx@setoptions@entry
+ \global\advance\blx@entrysetcounter\@ne
+ \edef\abx@field@@@entrysetcount{\the\blx@entrysetcounter}%
+ \addtocounter{instcount}\@ne
+ \blx@execute
+ \blx@beglangbib
+ \blx@begunit
+ \blx@anchor
+ \blx@entryset@precode
+ \blx@driver{\blx@imc@thefield{entrytype}}%
+ \blx@entryset@postcode
+ \blx@endunit
+ \blx@endlangbib
+ \endgroup}
+ {\blx@nounit}}
+
+\blx@regimcs{%
+ \printtext \printfield \printlist \printnames \printfile
+ \indexfield \indexlist \indexnames \entrydata \entryset}
+
+\let\blx@bibstringsets\@empty
+
+% {<set>}{<bibstring_1>,...,<bibstring_n>}
+\newrobustcmd*{\DeclareBibstringSet}[1]{%
+ \listadd\blx@bibstringsets{#1}%
+ \def\do##1{%
+ \csdef{blx@bibstringset@string@##1}{#1}%
+ \listcsadd{blx@bibstringset@set@#1}{##1}}%
+ \docsvlist}
+
+% {<set>}
+\newrobustcmd*{\UndeclareBibstringSet}[1]{%
+ \def\do##1{\csundef{blx@bibstringset@string@##1}}%
+ \dolistcsloop{blx@bibstringset@set@#1}%
+ \csundef{blx@bibstringset@set@#1}%
+ \UndeclareBibstringSetFormat{#1}}
+
+\newrobustcmd*{\UndeclareBibstringSets}{%
+ \forlistloop{\UndeclareBibstringSet}{\blx@bibstringsets}%
+ \let\blx@bibstringsets\@empty}
+
+% {<set>}{<code>}
+\newrobustcmd*{\DeclareBibstringSetFormat}[1]{%
+ \csdef{blx@bibstringsetformat@#1}##1}
+
+% {<set>}
+\newrobustcmd*{\UndeclareBibstringSetFormat}[1]{%
+ \csundef{blx@bibstringsetformat@#1}}
+
+% {<wrapper>}{<string (name)>}{<text (derived from string)>}
+\def\blx@wrapbibstring#1#2#3{%
+ \ifcsundef{blx@bibstringset@string@#2}
+ {#1{#3}}
+ {\ifcsundef{blx@bibstringsetformat@\csuse{blx@bibstringset@string@#2}}
+ {#1{#3}}
+ {#1{\csuse{blx@bibstringsetformat@\csuse{blx@bibstringset@string@#2}}
+ {#3}}}}}
+
+%% Localization
+
+% {<wrapper>}{<long/short>}{<string>}{<print code>}
+% <print code> is executed when the bibstring is defined
+% it differs between the \bib...string versions
+% in <print code> \blx@tempa should be used as <string>
+\protected\def\blx@met@bibstring#1#2#3#4{%
+ \blx@begunit
+ \blx@hyphenreset
+ \blx@bibstringsimple
+ \lowercase{\edef\blx@tempa{#3}}%
+ \ifcsundef{#2@\blx@tempa}
+ {\blx@warn@nostring\blx@tempa
+ \blx@endnounit}
+ {#4}}
+
+% [<wrapper>]{<string>}
+\newrobustcmd*{\blx@imc@bibstring}[2][\@firstofone]{%
+ \blx@bibstring{#1}{\abx@str}{#2}}
+
+\newrobustcmd*{\blx@imc@biblstring}[2][\@firstofone]{%
+ \blx@bibstring{#1}{abx@lstr}{#2}}
+
+\newrobustcmd*{\blx@imc@bibsstring}[2][\@firstofone]{%
+ \blx@bibstring{#1}{abx@sstr}{#2}}
+
+\def\blx@bibstringsimple{%
+ \let\bibstring\blx@imc@bibxstring
+ \let\biblstring\blx@imc@bibxlstring
+ \let\bibsstring\blx@imc@bibxsstring}
+
+\def\blx@bibstringnormal{%
+ \let\bibstring\blx@imc@bibstring
+ \let\biblstring\blx@imc@biblstring
+ \let\bibsstring\blx@imc@bibsstring}
+
+\protected\def\blx@bibstring#1#2#3{%
+ \blx@met@bibstring{#1}{#2}{#3}
+ {\blx@imc@ifcapital
+ {\blx@wrapbibstring{#1}{\blx@tempa}{\MakeCapital{\csuse{#2@\blx@tempa}}}}
+ {\blx@wrapbibstring{#1}{\blx@tempa}{\csuse{#2@\blx@tempa}}}%
+ \blx@endunit}}
+
+% [<wrapper>]{<string>}
+\newrobustcmd*{\blx@imc@bibncpstring}[2][\@firstofone]{%
+ \blx@bibncpstring{#1}{\abx@str}{#2}}
+
+\newrobustcmd*{\blx@imc@bibncplstring}[2][\@firstofone]{%
+ \blx@bibncpstring{#1}{abx@lstr}{#2}}
+
+\newrobustcmd*{\blx@imc@bibncpsstring}[2][\@firstofone]{%
+ \blx@bibncpstring{#1}{abx@sstr}{#2}}
+
+\protected\def\blx@bibncpstring#1#2#3{%
+ \blx@met@bibstring{#1}{#2}{#3}
+ {\blx@wrapbibstring{#1}{\blx@tempa}{\csuse{#2@\blx@tempa}}%
+ \blx@endunit}}
+
+% [<wrapper>]{<string>}
+\newrobustcmd*{\blx@imc@bibcpstring}[2][\@firstofone]{%
+ \blx@bibcpstring{#1}{\abx@str}{#2}}
+
+\newrobustcmd*{\blx@imc@bibcplstring}[2][\@firstofone]{%
+ \blx@bibcpstring{#1}{abx@lstr}{#2}}
+
+\newrobustcmd*{\blx@imc@bibcpsstring}[2][\@firstofone]{%
+ \blx@bibcpstring{#1}{abx@sstr}{#2}}
+
+\protected\def\blx@bibcpstring#1#2#3{%
+ \blx@met@bibstring{#1}{#2}{#3}
+ {\blx@wrapbibstring{#1}{\blx@tempa}{\MakeCapital{\csuse{#2@\blx@tempa}}}%
+ \blx@endunit}}
+
+% [<wrapper>]{<string>}
+\newrobustcmd*{\blx@imc@biblcstring}[2][\@firstofone]{%
+ \blx@biblcstring{#1}{\abx@str}{#2}}
+
+\newrobustcmd*{\blx@imc@biblclstring}[2][\@firstofone]{%
+ \blx@biblcstring{#1}{abx@lstr}{#2}}
+
+\newrobustcmd*{\blx@imc@biblcsstring}[2][\@firstofone]{%
+ \blx@biblcstring{#1}{abx@sstr}{#2}}
+
+\protected\def\blx@biblcstring#1#2#3{%
+ \blx@met@bibstring{#1}{#2}{#3}
+ {\blx@wrapbibstring{#1}{\blx@tempa}{\blx@maketext@lowercase{\csuse{#2@\blx@tempa}}}%
+ \blx@endunit}}
+
+% [<wrapper>]{<string>}
+\newrobustcmd*{\blx@imc@bibucstring}[2][\@firstofone]{%
+ \blx@bibucstring{#1}{\abx@str}{#2}}
+
+\newrobustcmd*{\blx@imc@bibuclstring}[2][\@firstofone]{%
+ \blx@bibucstring{#1}{abx@lstr}{#2}}
+
+\newrobustcmd*{\blx@imc@bibucsstring}[2][\@firstofone]{%
+ \blx@bibucstring{#1}{abx@sstr}{#2}}
+
+\protected\def\blx@bibucstring#1#2#3{%
+ \blx@met@bibstring{#1}{#2}{#3}
+ {\blx@wrapbibstring{#1}{\blx@tempa}{\blx@maketext@uppercase{\csuse{#2@\blx@tempa}}}%
+ \blx@endunit}}
+
+% {<string>}
+\def\blx@imc@bibxstring#1{%
+ \blx@bibxstring{\abx@str}{#1}}
+
+\def\blx@imc@bibxlstring#1{%
+ \blx@bibxstring{abx@lstr}{#1}}
+
+\def\blx@imc@bibxsstring#1{%
+ \blx@bibxstring{abx@sstr}{#1}}
+
+\def\blx@bibxstring#1#2{%
+ \ifcsundef{#1@#2}
+ {\protect\blx@warn@nostring{#2}}
+ {\csuse{#1@#2}}}
+
+% {<string>}{<true>}{<false>}
+\def\blx@imc@ifbibstring#1{%
+ \ifcsundef{\abx@str @\detokenize{#1}}
+ {\@secondoftwo}
+ {\@firstoftwo}}
+
+\def\blx@imc@ifbibxstring#1{%
+ \blx@xsanitizeafter\ifcsundef{\abx@str @#1}
+ {\@secondoftwo}
+ {\@firstoftwo}}
+
+% [<msform>][<mslang>]{<field>}{<true>}{<false>}
+\DeclareExpandableDocumentCommand{\blx@imc@iffieldbibstring}
+ {O{\blx@msform} O{\blx@lmslang} m}
+ {\blx@imc@iffieldundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@imc@ifmsentryfield{#3}
+ {\def\blx@tempa{abx@field@#1@#2@#3}}
+ {\def\blx@tempa{abx@field@@@#3}}%
+ \ifcsundef{\abx@str @\detokenize\expandafter
+ \expandafter\expandafter{%
+ \csname\blx@tempa\endcsname}}
+ {\@secondoftwo}
+ {\@firstoftwo}}}
+
+% [<msform>][<mslang>]{<field>}{<string>}{<true>}{<false>}
+\DeclareExpandableDocumentCommand{\blx@imc@iffieldplusstringbibstring}
+ {O{\blx@msform} O{\blx@lmslang} m m}
+ {\blx@imc@iffieldundef[{#1}][{#2}]{#3}
+ {\@secondoftwo}
+ {\blx@imc@ifmsentryfield{#3}
+ {\def\blx@tempa{abx@field@#1@#2@#3}}
+ {\def\blx@tempa{abx@field@@@#3}}%
+ \ifcsundef{\abx@str @\detokenize\expandafter
+ \expandafter\expandafter{%
+ \csname\blx@tempa\endcsname}#4}
+ {\@secondoftwo}
+ {\@firstoftwo}}}
+
+\blx@regimcs{%
+ \bibstring \biblstring \bibsstring
+ \bibxstring \bibxlstring \bibxsstring
+ \bibncpstring \bibncplstring \bibncpsstring
+ \bibcpstring \bibcplstring \bibcpsstring
+ \biblcstring \biblclstring \biblcsstring
+ \bibucstring \bibuclstring \bibucsstring
+ \ifbibstring \ifbibxstring \iffieldbibstring
+ \iffieldplusstringbibstring}
+
+% \DeclareCaseChangeEquivalent is available in
+% LaTeX 2022-06-01-PL5
+% the older code works-ish for LaTeX before 2022-06-01
+% it errors with 2022-06-01-PL4
+% but we'll not guard against this specific PL
+\ifundef\DeclareCaseChangeEquivalent
+ {\let\blx@hook@uc\relax
+ \let\blx@hook@lc\relax
+ %
+ \AtEndPreamble{%
+ \toggletrue{blx@tempa}%
+ \toggletrue{blx@tempb}%
+ \expandafter\patchcmd\csname MakeUppercase \endcsname
+ {\protected@edef}
+ {\blx@hook@uc\protected@edef}
+ {\togglefalse{blx@tempa}}
+ {}%
+ \expandafter\patchcmd\csname MakeLowercase \endcsname
+ {\protected@edef}
+ {\blx@hook@lc\protected@edef}
+ {\togglefalse{blx@tempb}}
+ {}%
+ \@ifpackageloaded{textcase}
+ {\expandafter\patchcmd\csname MakeUppercase \endcsname
+ {\def\i}
+ {\blx@hook@uc\def\i}
+ {\togglefalse{blx@tempa}}
+ {}%
+ \expandafter\patchcmd\csname MakeLowercase \endcsname
+ {\@uclcnotmath{}}
+ {\@uclcnotmath{\blx@hook@lc}}
+ {\togglefalse{blx@tempb}}
+ {}%
+ \expandafter\patchcmd\csname MakeTextUppercase \endcsname
+ {\def\i}
+ {\blx@hook@uc\def\i}
+ {}
+ {}%
+ \expandafter\patchcmd\csname MakeTextLowercase \endcsname
+ {\@uclcnotmath{}}
+ {\@uclcnotmath{\blx@hook@lc}}
+ {}
+ {}}
+ {}%
+ \iftoggle{blx@tempa}{\blx@err@patch{\string\MakeUppercase}}{}%
+ \iftoggle{blx@tempb}{\blx@err@patch{\string\MakeLowercase}}{}%
+ }
+ %
+ \appto\blx@blxinit{%
+ \def\blx@hook@uc{%
+ \def\bibstring{\blx@imc@bibucstring}%
+ \def\biblstring{\blx@imc@bibuclstring}%
+ \def\bibsstring{\blx@imc@bibucsstring}%
+ \def\biblcstring{\blx@imc@bibucstring}%
+ \def\biblclstring{\blx@imc@bibuclstring}%
+ \def\biblcsstring{\blx@imc@bibucsstring}%
+ \def\bibcpstring{\blx@imc@bibucstring}%
+ \def\bibcplstring{\blx@imc@bibuclstring}%
+ \def\bibcpsstring{\blx@imc@bibucsstring}}%
+ \def\blx@hook@lc{%
+ \def\bibstring{\blx@imc@biblcstring}%
+ \def\biblstring{\blx@imc@biblclstring}%
+ \def\bibsstring{\blx@imc@biblcsstring}%
+ \def\bibucstring{\blx@imc@biblcstring}%
+ \def\bibuclstring{\blx@imc@biblclstring}%
+ \def\bibucsstring{\blx@imc@biblcsstring}%
+ \def\bibcpstring{\blx@imc@biblcstring}%
+ \def\bibcplstring{\blx@imc@biblclstring}%
+ \def\bibcpsstring{\blx@imc@biblcsstring}}}}
+ {\DeclareCaseChangeEquivalent{\bibstring}{%
+ \CaseSwitch
+ {\blx@imc@bibstring}
+ {\blx@imc@bibucstring}
+ {\blx@imc@biblcstring}
+ {\blx@imc@bibcpstring}}
+ \DeclareCaseChangeEquivalent{\biblstring}{%
+ \CaseSwitch
+ {\blx@imc@biblstring}
+ {\blx@imc@bibuclstring}
+ {\blx@imc@biblclstring}
+ {\blx@imc@bibcplstring}}
+ \DeclareCaseChangeEquivalent{\bibsstring}{%
+ \CaseSwitch
+ {\blx@imc@bibsstring}
+ {\blx@imc@bibucsstring}
+ {\blx@imc@biblcsstring}
+ {\blx@imc@bibcpsstring}}
+ \DeclareCaseChangeEquivalent{\biblcstring}{%
+ \CaseSwitch
+ {\blx@imc@bibstring}
+ {\blx@imc@bibucstring}
+ {\blx@imc@biblcstring}
+ {\blx@imc@bibcpstring}}
+ \DeclareCaseChangeEquivalent{\biblclstring}{%
+ \CaseSwitch
+ {\blx@imc@biblstring}
+ {\blx@imc@bibuclstring}
+ {\blx@imc@biblclstring}
+ {\blx@imc@bibcplstring}}
+ \DeclareCaseChangeEquivalent{\biblcsstring}{%
+ \CaseSwitch
+ {\blx@imc@bibsstring}
+ {\blx@imc@bibucsstring}
+ {\blx@imc@biblcsstring}
+ {\blx@imc@bibcpsstring}}
+ \DeclareCaseChangeEquivalent{\bibucstring}{%
+ \CaseSwitch
+ {\blx@imc@bibstring}
+ {\blx@imc@bibucstring}
+ {\blx@imc@biblcstring}
+ {\blx@imc@bibcpstring}}
+ \DeclareCaseChangeEquivalent{\bibuclstring}{%
+ \CaseSwitch
+ {\blx@imc@biblstring}
+ {\blx@imc@bibuclstring}
+ {\blx@imc@biblclstring}
+ {\blx@imc@bibcplstring}}
+ \DeclareCaseChangeEquivalent{\bibucsstring}{%
+ \CaseSwitch
+ {\blx@imc@bibsstring}
+ {\blx@imc@bibucsstring}
+ {\blx@imc@biblcsstring}
+ {\blx@imc@bibcpsstring}}
+ \DeclareCaseChangeEquivalent{\bibcpstring}{%
+ \CaseSwitch
+ {\blx@imc@bibstring}
+ {\blx@imc@bibucstring}
+ {\blx@imc@biblcstring}
+ {\blx@imc@bibcpstring}}
+ \DeclareCaseChangeEquivalent{\bibcplstring}{%
+ \CaseSwitch
+ {\blx@imc@biblstring}
+ {\blx@imc@bibuclstring}
+ {\blx@imc@biblclstring}
+ {\blx@imc@bibcplstring}}
+ \DeclareCaseChangeEquivalent{\bibcpsstring}{%
+ \CaseSwitch
+ {\blx@imc@bibsstring}
+ {\blx@imc@bibucsstring}
+ {\blx@imc@biblcsstring}
+ {\blx@imc@bibcpsstring}}}
+
+\def\abx@dostrings{%
+ \do{bibliography}%
+ \do{references}%
+ \do{shorthands}%
+ \do{editor}%
+ \do{editors}%
+ \do{compiler}%
+ \do{compilers}%
+ \do{redactor}%
+ \do{redactors}%
+ \do{reviser}%
+ \do{revisers}%
+ \do{founder}%
+ \do{founders}%
+ \do{continuator}%
+ \do{continuators}%
+ \do{collaborator}%
+ \do{collaborators}%
+ \do{translator}%
+ \do{translators}%
+ \do{commentator}%
+ \do{commentators}%
+ \do{annotator}%
+ \do{annotators}%
+ \do{commentary}%
+ \do{annotations}%
+ \do{introduction}%
+ \do{foreword}%
+ \do{afterword}%
+ \do{editortr}%
+ \do{editorstr}%
+ \do{editorco}%
+ \do{editorsco}%
+ \do{editoran}%
+ \do{editorsan}%
+ \do{editorin}%
+ \do{editorsin}%
+ \do{editorfo}%
+ \do{editorsfo}%
+ \do{editoraf}%
+ \do{editorsaf}%
+ \do{editortrco}%
+ \do{editorstrco}%
+ \do{editortran}%
+ \do{editorstran}%
+ \do{editortrin}%
+ \do{editorstrin}%
+ \do{editortrfo}%
+ \do{editorstrfo}%
+ \do{editortraf}%
+ \do{editorstraf}%
+ \do{editorcoin}%
+ \do{editorscoin}%
+ \do{editorcofo}%
+ \do{editorscofo}%
+ \do{editorcoaf}%
+ \do{editorscoaf}%
+ \do{editoranin}%
+ \do{editorsanin}%
+ \do{editoranfo}%
+ \do{editorsanfo}%
+ \do{editoranaf}%
+ \do{editorsanaf}%
+ \do{editortrcoin}%
+ \do{editorstrcoin}%
+ \do{editortrcofo}%
+ \do{editorstrcofo}%
+ \do{editortrcoaf}%
+ \do{editorstrcoaf}%
+ \do{editortranin}%
+ \do{editorstranin}%
+ \do{editortranfo}%
+ \do{editorstranfo}%
+ \do{editortranaf}%
+ \do{editorstranaf}%
+ \do{translatorco}%
+ \do{translatorsco}%
+ \do{translatoran}%
+ \do{translatorsan}%
+ \do{translatorin}%
+ \do{translatorsin}%
+ \do{translatorfo}%
+ \do{translatorsfo}%
+ \do{translatoraf}%
+ \do{translatorsaf}%
+ \do{translatorcoin}%
+ \do{translatorscoin}%
+ \do{translatorcofo}%
+ \do{translatorscofo}%
+ \do{translatorcoaf}%
+ \do{translatorscoaf}%
+ \do{translatoranin}%
+ \do{translatorsanin}%
+ \do{translatoranfo}%
+ \do{translatorsanfo}%
+ \do{translatoranaf}%
+ \do{translatorsanaf}%
+ \do{byauthor}%
+ \do{byeditor}%
+ \do{bycompiler}%
+ \do{byredactor}%
+ \do{byreviser}%
+ \do{byreviewer}%
+ \do{byfounder}%
+ \do{bycontinuator}%
+ \do{bycollaborator}%
+ \do{bytranslator}%
+ \do{bycommentator}%
+ \do{byannotator}%
+ \do{withcommentator}%
+ \do{withannotator}%
+ \do{withintroduction}%
+ \do{withforeword}%
+ \do{withafterword}%
+ \do{organizer}%
+ \do{organizers}%
+ \do{byorganizer}%
+ \do{byeditortr}%
+ \do{byeditorco}%
+ \do{byeditoran}%
+ \do{byeditorin}%
+ \do{byeditorfo}%
+ \do{byeditoraf}%
+ \do{byeditortrco}%
+ \do{byeditortran}%
+ \do{byeditortrin}%
+ \do{byeditortrfo}%
+ \do{byeditortraf}%
+ \do{byeditorcoin}%
+ \do{byeditorcofo}%
+ \do{byeditorcoaf}%
+ \do{byeditoranin}%
+ \do{byeditoranfo}%
+ \do{byeditoranaf}%
+ \do{byeditortrcoin}%
+ \do{byeditortrcofo}%
+ \do{byeditortrcoaf}%
+ \do{byeditortranin}%
+ \do{byeditortranfo}%
+ \do{byeditortranaf}%
+ \do{bytranslatorco}%
+ \do{bytranslatoran}%
+ \do{bytranslatorin}%
+ \do{bytranslatorfo}%
+ \do{bytranslatoraf}%
+ \do{bytranslatorcoin}%
+ \do{bytranslatorcofo}%
+ \do{bytranslatorcoaf}%
+ \do{bytranslatoranin}%
+ \do{bytranslatoranfo}%
+ \do{bytranslatoranaf}%
+ \do{and}%
+ \do{andothers}%
+ \do{andmore}%
+ \do{volume}%
+ \do{volumes}%
+ \do{involumes}%
+ \do{part}%
+ \do{jourvol}%
+ \do{jourser}%
+ \do{newseries}%
+ \do{oldseries}%
+ \do{edition}%
+ \do{reprint}%
+ \do{reprintof}%
+ \do{reprintas}%
+ \do{reprintfrom}%
+ \do{reviewof}%
+ \do{translationof}%
+ \do{translationas}%
+ \do{translationfrom}%
+ \do{origpubas}%
+ \do{origpubin}%
+ \do{astitle}%
+ \do{bypublisher}%
+ \do{nodate}%
+ \do{page}%
+ \do{pages}%
+ \do{column}%
+ \do{columns}%
+ \do{line}%
+ \do{lines}%
+ \do{verse}%
+ \do{verses}%
+ \do{section}%
+ \do{sections}%
+ \do{paragraph}%
+ \do{paragraphs}%
+ \do{pagetotal}%
+ \do{pagetotals}%
+ \do{columntotal}%
+ \do{columntotals}%
+ \do{linetotal}%
+ \do{linetotals}%
+ \do{versetotal}%
+ \do{versetotals}%
+ \do{sectiontotal}%
+ \do{sectiontotals}%
+ \do{paragraphtotal}%
+ \do{paragraphtotals}%
+ \do{in}%
+ \do{inseries}%
+ \do{ofseries}%
+ \do{book}%
+ \do{issue}%
+ \do{number}%
+ \do{chapter}%
+ \do{bathesis}%
+ \do{mathesis}%
+ \do{phdthesis}%
+ \do{candthesis}%
+ \do{resreport}%
+ \do{techreport}%
+ \do{software}%
+ \do{datacd}%
+ \do{audiocd}%
+ \do{version}%
+ \do{url}%
+ \do{urlfrom}%
+ \do{urlseen}%
+ \do{file}%
+ \do{inpreparation}%
+ \do{submitted}%
+ \do{inpress}%
+ \do{prepublished}%
+ \do{forthcoming}%
+ \do{library}%
+ \do{abstract}%
+ \do{annotation}%
+ \do{citedas}%
+ \do{seenote}%
+ \do{quotedin}%
+ \do{opcit}%
+ \do{loccit}%
+ \do{ibidem}%
+ \do{idem}%
+ \do{idemsf}%
+ \do{idemsm}%
+ \do{idemsn}%
+ \do{idempf}%
+ \do{idempm}%
+ \do{idempn}%
+ \do{idempp}%
+ \do{confer}%
+ \do{sequens}%
+ \do{sequentes}%
+ \do{passim}%
+ \do{see}%
+ \do{seealso}%
+ \do{backrefpage}%
+ \do{backrefpages}%
+ \do{thiscite}%
+ \do{january}%
+ \do{february}%
+ \do{march}%
+ \do{april}%
+ \do{may}%
+ \do{june}%
+ \do{july}%
+ \do{august}%
+ \do{september}%
+ \do{october}%
+ \do{november}%
+ \do{december}%
+ \do{langamerican}%
+ \do{langbasque}%
+ \do{langbrazilian}%
+ \do{langbulgarian}%
+ \do{langcatalan}%
+ \do{langcroatian}%
+ \do{langczech}%
+ \do{langdanish}%
+ \do{langdutch}%
+ \do{langenglish}%
+ \do{langestonian}%
+ \do{langfinnish}%
+ \do{langfrench}%
+ \do{langgalician}%
+ \do{langgerman}%
+ \do{langgreek}%
+ \do{langhungarian}%
+ \do{langitalian}%
+ \do{langjapanese}%
+ \do{langlatin}%
+ \do{langlatvian}%
+ \do{langlithuanian}%
+ \do{langmarathi}%
+ \do{langnorwegian}%
+ \do{langpolish}%
+ \do{langportuguese}%
+ \do{langserbian}%
+ \do{langromanian}%
+ \do{langrussian}%
+ \do{langslovak}%
+ \do{langslovene}%
+ \do{langspanish}%
+ \do{langswedish}%
+ \do{langturkish}%
+ \do{langukrainian}%
+ \do{fromamerican}%
+ \do{frombasque}%
+ \do{frombrazilian}%
+ \do{frombulgarian}%
+ \do{fromcatalan}%
+ \do{fromcroatian}%
+ \do{fromczech}%
+ \do{fromdanish}%
+ \do{fromdutch}%
+ \do{fromenglish}%
+ \do{fromestonian}%
+ \do{fromfinnish}%
+ \do{fromfrench}%
+ \do{fromgalician}%
+ \do{fromgerman}%
+ \do{fromgreek}%
+ \do{fromhungarian}%
+ \do{fromitalian}%
+ \do{fromjapanese}%
+ \do{fromlatin}%
+ \do{fromlithuanian}%
+ \do{fromlatvian}%
+ \do{frommarathi}%
+ \do{fromnorwegian}%
+ \do{frompolish}%
+ \do{fromportuguese}%
+ \do{fromromanian}%
+ \do{fromrussian}%
+ \do{fromserbian}%
+ \do{fromslovak}%
+ \do{fromslovene}%
+ \do{fromspanish}%
+ \do{fromswedish}%
+ \do{fromturkish}%
+ \do{fromukrainian}%
+ \do{countryde}%
+ \do{countryep}%
+ \do{countryeu}%
+ \do{countryfr}%
+ \do{countryuk}%
+ \do{countryus}%
+ \do{patent}%
+ \do{patentde}%
+ \do{patenteu}%
+ \do{patentfr}%
+ \do{patentuk}%
+ \do{patentus}%
+ \do{patreq}%
+ \do{patreqde}%
+ \do{patreqeu}%
+ \do{patreqfr}%
+ \do{patrequk}%
+ \do{patrequs}%
+ \do{commonera}%
+ \do{beforecommonera}%
+ \do{annodomini}%
+ \do{beforechrist}%
+ \do{circa}%
+ \do{spring}%
+ \do{summer}%
+ \do{autumn}%
+ \do{winter}%
+ \do{springN}%
+ \do{summerN}%
+ \do{autumnN}%
+ \do{winterN}%
+ \do{springS}%
+ \do{summerS}%
+ \do{autumnS}%
+ \do{winterS}%
+ \do{Q1}%
+ \do{Q2}%
+ \do{Q3}%
+ \do{Q4}%
+ \do{QD1}%
+ \do{QD2}%
+ \do{QD3}%
+ \do{S1}%
+ \do{S2}%
+ \do{am}%
+ \do{pm}%
+}
+
+\newrobustcmd*{\NewBibliographyString}[1]{%
+ \forcsvlist\blx@newstring{#1}}
+
+\def\blx@newstring#1{%
+ \blx@kv@ifkeyundef{blx@lbx}{#1}
+ {\gappto\abx@dostrings{\do{#1}}%
+ \blx@kv@gdefkey{blx@lbx}{#1}{\blx@defstring{#1}{##1}}}
+ {}}
+
+% in *.cbx/bbx/tex: <key> = {<string>},
+% in *.lbx: <key> = {{<longstring>}{<abbrevstring>}},
+\def\do#1{\blx@kv@defkey{blx@lbx}{#1}{\blx@defstring{#1}{##1}}}
+\abx@dostrings
+
+% in *.cbx/bbx/tex: (implicit)
+% in *.lbx: inherit = {<language>},
+\blx@kv@defkey{blx@lbx}{inherit}{%
+ \blx@lbxinput@strings{#1}{}{\blx@err@nolang{#1}}%
+ \csuse{abx@strings@#1}}
+
+\def\blx@cfg@defstring#1#2{%
+ \csdef{abx@lstr@#1}{#2}%
+ \csdef{abx@sstr@#1}{#2}}
+
+\def\blx@lbx@defstring#1#2{%
+ \blx@lbx@defstring@i{#1}#2}
+\def\blx@lbx@defstring@i#1#2#3{%
+ \csdef{abx@lstr@#1}{#2}%
+ \csdef{abx@sstr@#1}{#3}}
+
+% {<language>}
+\def\blx@lbxcheck#1{%
+ \begingroup
+ \ifcsdef{blx@lng@#1}
+ {\edef\blx@tempa{\csuse{blx@lng@#1}.lbx}}
+ {\def\blx@tempa{#1.lbx}}%
+ \expandafter\blx@altfile\expandafter{\blx@tempa}%
+ \ifdefempty\blx@fnext
+ {\blx@err@nolang{#1}}
+ {}%
+ \endgroup}
+
+% {<language>}{<definitions>}
+\newrobustcmd*{\DefineBibliographyExtras}[2]{%
+ \blx@lbxcheck{#1}%
+ \csgappto{blx@hook@extras@#1}{%
+ \blx@defbibextras{#1}{#2}}}
+\@onlypreamble\DefineBibliographyExtras
+
+\newrobustcmd*{\UndefineBibliographyExtras}[2]{%
+ \blx@lbxcheck{#1}%
+ \csgappto{blx@hook@noextras@#1}{%
+ \blx@undefbibextras{#1}{#2}}}
+\@onlypreamble\UndefineBibliographyExtras
+
+\def\blx@defbibextras#1{\csgappto{abx@extras@#1}}
+\def\blx@undefbibextras#1{\csgappto{abx@noextras@#1}}
+
+% {<language>}{<language>}
+\def\blx@letbibextras#1#2{%
+ \blx@lbxinput@extras{#2}{}{\blx@err@nolang{#2}}%
+ \global\csletcs{abx@extras@#1}{abx@extras@#2}
+ \global\csletcs{abx@noextras@#1}{abx@noextras@#2}}%
+
+% {<language>}{<strings>}
+\newrobustcmd*{\DefineBibliographyStrings}[2]{%
+ \blx@lbxcheck{#1}%
+ \csgappto{blx@hook@strings@#1}{%
+ \begingroup
+ \let\blx@defstring\blx@cfg@defstring
+ \blx@defbibstrings{#1}{#2}%
+ \endgroup}}
+\@onlypreamble\DefineBibliographyStrings
+
+\def\blx@defbibstrings#1#2{%
+ \def\do##1{\csundef{abx@lstr@##1}\csundef{abx@sstr@##1}}%
+ \abx@dostrings
+ \csuse{abx@strings@#1}%
+ \blx@kv@setkeys{blx@lbx}{#2}%
+ \let\do\blx@defbibstrings@i
+ \csxdef{abx@strings@#1}{\abx@dostrings}%
+ \csgappto{abx@strings@#1}{%
+ \ifcsdef{\abx@str @bibliography}
+ {\letcs\bibname{\abx@str @bibliography}}
+ {\let\bibname\@empty}%
+ \ifcsdef{\abx@str @references}
+ {\letcs\refname{\abx@str @references}}
+ {\let\refname\@empty}%
+ \ifcsdef{\abx@str @shorthands}
+ {\letcs\biblistname{\abx@str @shorthands}}
+ {\let\biblistname\@empty}}}
+
+% this one is special, it's basically ours and probably not defined
+% by anyone else, so we had better make sure it exists
+\providecommand*{\biblistname}{\blx@warn@nostring{shorthands}}
+
+\def\blx@defbibstrings@i#1{%
+ \ifcsdef{abx@lstr@#1}
+ {\def\expandafter\noexpand\csname abx@lstr@#1\endcsname{%
+ \csexpandonce{abx@lstr@#1}}}
+ {\undef\expandafter\noexpand\csname abx@lstr@#1\endcsname}%
+ \ifcsdef{abx@sstr@#1}
+ {\def\expandafter\noexpand\csname abx@sstr@#1\endcsname{%
+ \csexpandonce{abx@sstr@#1}}}
+ {\undef\expandafter\noexpand\csname abx@sstr@#1\endcsname}}
+
+% {<language>}{<language>}
+\def\blx@letbibstrings#1#2{%
+ \blx@lbxinput@strings{#2}{}{\blx@err@nolang{#2}}%
+ \global\csletcs{abx@strings@#1}{abx@strings@#2}}%
+
+% {<language>}{<exceptions>}
+\newrobustcmd*{\DefineHyphenationExceptions}[2]{%
+ \blx@ifhyphenationundef{#1}
+ {\blx@warn@nohyph{#1}}
+ {}%
+ \csgappto{blx@hook@hyph@#1}{\blx@hyphexcept{#1}{#2}}}
+\@onlypreamble\DefineHyphenationExceptions
+
+\def\blx@hyphexcept#1#2{%
+ \blx@ifhyphenationundef{#1}
+ {\blx@warn@nohyph{#1}}
+ {\begingroup
+ \language\csname l@#1\endcsname\relax
+ \hyphenation{#2}%
+ \endgroup}}
+
+% {<mapping suffix>}
+\newrobustcmd*{\DeclareLanguageMappingSuffix}[1]{%
+ \gdef\blx@lng@suff{#1}}
+\@onlypreamble\DeclareLanguageMappingSuffix
+\let\blx@lng@suff\@empty
+
+% {<language>}{<mapping>}
+\newrobustcmd*{\DeclareLanguageMapping}[2]{%
+ \csgdef{blx@lng@#1}{#2}%
+ \csgdef{blx@lng@explicit@#1}{#2}}
+\@onlypreamble\DeclareLanguageMapping
+
+% to avoid copying, these commands simply redefine the input handlers and
+% process and postprocess code
+% {<language>}{<success>}{<failure>}
+\def\blx@lbxinput#1{%
+ \csletcs{blx@lbx@input@handler}{blx@lbx@input@handler@once}%
+ \csletcs{blx@lbx@input@process}{blx@lbx@input@process@all}%
+ \csletcs{blx@lbx@input@postprocess}{blx@lbx@input@postprocess@all}%
+ \blx@lbxinput@i{#1}}
+
+\def\blx@lbxinput@strings#1{%
+ \csletcs{blx@lbx@input@handler}{blx@lbx@input@handler@simple}%
+ \csletcs{blx@lbx@input@process}{blx@lbx@input@process@strings}%
+ \csletcs{blx@lbx@input@postprocess}{blx@lbx@input@postprocess@strings}%
+ \blx@lbxinput@i{#1}}
+
+\def\blx@lbxinput@extras#1{%
+ \csletcs{blx@lbx@input@handler}{blx@lbx@input@handler@simple}%
+ \csletcs{blx@lbx@input@process}{blx@lbx@input@process@extras}%
+ \csletcs{blx@lbx@input@postprocess}{blx@lbx@input@postprocess@extras}%
+ \blx@lbxinput@i{#1}}
+
+\def\blx@lbxinput@i#1{%
+ \ifcsundef{blx@nolbxrecurse@#1}
+ {\ifcsdef{blx@lng@explicit@#1}
+ {\global\csletcs{blx@lng@#1}{blx@lng@explicit@#1}}
+ {\ifdefempty\blx@lng@suff
+ {}
+ {\csgdef{blx@lng@#1}{#1\blx@lng@suff}}}}
+ {}%
+ \blx@lbxinput@ii{#1}}
+
+\def\blx@lbxinput@ii#1{%
+ \ifcsdef{blx@lng@#1}
+ {\expandafter\expandafter\expandafter\blx@lbxinput@iii
+ \expandafter\expandafter\expandafter{%
+ \csname blx@lng@#1\endcsname}{#1}}
+ {\blx@altfile{#1.lbx}%
+ \ifdefempty\blx@fnext
+ {\blx@lbxinput@iv{#1}{#1}{language '#1'}}
+ {\blx@lbxinput@iv{#1}{\blx@fnnoext}{language '#1'}}}}
+
+% {<mapping>}{<language>}
+\def\blx@lbxinput@iii#1#2{%
+ \global\csundef{blx@lng@#2}%
+ \blx@altfile{#1.lbx}%
+ \ifdefempty\blx@fnext
+ {\ifcsdef{blx@suffmaptried@#2}
+ {}
+ {\blx@warning@noline{%
+ File '#1.lbx' not found!\MessageBreak
+ Ignoring mapping '#2' -> '#1'}%
+ \global\cslet{blx@suffmaptried@#2}\@empty}%
+ \blx@lbxinput@iv{#2}{#2}{language '#2'}}
+ {\blx@lbxinput@iv{#2}{\blx@fnnoext}{language '#2' -> '#1'}}}
+
+% {<language>}{<lbxfile>}{<message>}
+\def\blx@lbxinput@iv#1#2#3{%
+ \begingroup
+ \blx@lbx@input@handler{#2.lbx}{#3}
+ {\let\InheritBibliographyStrings\@gobble
+ \let\DeclareBibliographyStrings\@gobble
+ \let\InheritBibliographyExtras\@gobble
+ \let\DeclareBibliographyExtras\@gobble
+ \let\UndeclareBibliographyExtras\@gobble
+ \blx@lbx@input@process{#1}%
+ \begingroup
+ \cslet{blx@nolbxrecurse@#1}\@empty
+ \blx@saneccodes
+ \makeatletter}
+ {\endgroup
+ \blx@lbx@input@postprocess{#1}}
+ {\aftergroup\@firstoftwo}
+ {\aftergroup\@secondoftwo}%
+ \endgroup}
+
+% .lbx files must be read with one of the two following commands,
+% do not use \blx@inputonce. Only the commands here make sure that the file
+% is read as many times as necessary.
+% blx@file@lbx@simple@#1 only blocks the file being added to the file list
+% blx@file@lbx@once@#1 blocks a file from being loaded again by the input-once
+% routine
+% {<file>}{<message>}{<preload>}{<postload>}{<success>}{<failure>}
+\protected\long\def\blx@lbx@input@handler@simple#1#2#3#4#5#6{%
+ \blx@info@noline{Trying to load #2..}%
+ \IfFileExists{#1}
+ {\blx@info@noline{... file '#1' found}%
+ \csuse{blx@lbxfilehook@simple@preload@#1}%
+ #3%
+ \@@input\@filef@und
+ #4%
+ \csuse{blx@lbxfilehook@simple@postload@#1}%
+ #5%
+ \ifcsundef{blx@file@lbx@simple@#1}
+ {\listxadd\blx@list@req@stat{#1}%
+ \@addtofilelist{#1}%
+ \global\cslet{blx@file@lbx@simple@#1}\@empty}
+ {}}
+ {\blx@info@noline{... file '#1' not found}%
+ \csuse{blx@lbxfilehook@simple@failure@#1}%
+ #6}}
+
+% {<file>}{<message>}{<preload>}{<postload>}{<success>}{<failure>}
+\protected\long\def\blx@lbx@input@handler@once#1#2#3#4#5#6{%
+ \ifcsundef{blx@file@lbx@once@#1}
+ {\blx@info@noline{Trying to load #2..}%
+ \IfFileExists{#1}
+ {\blx@info@noline{... file '#1' found}%
+ \csuse{blx@lbxfilehook@once@preload@#1}%
+ #3%
+ \@@input\@filef@und
+ #4%
+ \csuse{blx@lbxfilehook@once@postload@#1}%
+ #5%
+ \ifcsundef{blx@file@lbx@simple@#1}
+ {\listxadd\blx@list@req@stat{#1}%
+ \@addtofilelist{#1}}
+ {}}
+ {\blx@info@noline{... file '#1' not found}%
+ \csuse{blx@lbxfilehook@once@failure@#1}%
+ #6}%
+ \global\cslet{blx@file@lbx@once@#1}\@empty
+ \global\cslet{blx@file@lbx@simple@#1}\@empty}
+ {#5}}
+
+\def\blx@lbx@input@process@strings#1{%
+ \global\cslet{abx@strings@#1}\@empty
+ \def\InheritBibliographyStrings{%
+ \blx@letbibstrings{#1}}%
+ \def\DeclareBibliographyStrings##1{%
+ \begingroup
+ \let\blx@defstring\blx@lbx@defstring
+ \blx@defbibstrings{#1}{##1}%
+ \endgroup}}
+
+\def\blx@lbx@input@process@extras#1{%
+ \global\cslet{abx@extras@#1}\@empty
+ \global\cslet{abx@noextras@#1}\@empty
+ \def\InheritBibliographyExtras{\blx@letbibextras{#1}}%
+ \def\DeclareBibliographyExtras{\blx@defbibextras{#1}}%
+ \def\UndeclareBibliographyExtras{\blx@undefbibextras{#1}}}
+
+\def\blx@lbx@input@process@all#1{%
+ \blx@lbx@input@process@strings{#1}%
+ \blx@lbx@input@process@extras{#1}%
+ \def\DeclareHyphenationExceptions{\blx@hyphexcept{#1}}}
+
+\def\blx@lbx@input@postprocess@strings#1{%
+ \csuse{blx@hook@strings@#1}}
+
+\def\blx@lbx@input@postprocess@extras#1{%
+ \csuse{blx@hook@extras@#1}%
+ \csuse{blx@hook@noextras@#1}}
+
+\def\blx@lbx@input@postprocess@all#1{%
+ \blx@lbx@input@postprocess@strings{#1}%
+ \blx@lbx@input@postprocess@extras{#1}%
+ \csuse{blx@hook@hyph@#1}%
+ \blx@maplang{#1}{#1}}
+
+% {<language>}
+\protected\def\blx@langsetup#1{%
+ \blx@lbxinput{#1}
+ {\edef\blx@languagename{#1}}
+ {\blx@warning
+ {Language '#1' not supported.\MessageBreak
+ Using dummy definitions}}}
+
+\protected\def\blx@langsetup@from@pkglist#1{%
+ \global\cslet{blx@lbx@loaded@from@pkglist@#1}\@empty
+ \blx@langsetup{#1}}
+
+\protected\def\blx@langsetup@from@auxlist#1{%
+ \global\cslet{blx@lbx@loaded@from@auxlist@#1}\@empty
+ \blx@langsetup{#1}}
+
+\newcommand*{\blx@lbx@loadlist}{}
+
+\protected\def\blx@langsetup@indoc#1{%
+ \ifcsundef{blx@lbx@loaded@from@pkglist@#1}
+ {\xifinlist{#1}\blx@lbx@loadlist
+ {}
+ {\listxadd\blx@lbx@loadlist{#1}}%
+ \ifcsundef{blx@lbx@loaded@from@auxlist@#1}
+ {\ifcsundef{blx@lbx@loaded@nolistload@#1}
+ {\blx@warning@noline{%
+ No localisation for language '#1' loaded.\MessageBreak
+ Please rerun LaTeX to ensure languages can\MessageBreak
+ be requested properly}%
+ \global\cslet{blx@lbx@loaded@nolistload@#1}\@empty}
+ {}}
+ {\edef\blx@languagename{#1}}}
+ {\edef\blx@languagename{#1}}%
+}
+
+\newcommand*{\blx@lbx@auxloadlist}{}
+
+\def\abx@aux@lbx@loadrequest{%
+ \listgadd\blx@lbx@auxloadlist}
+
+\protected\def\blx@lbx@writeloaderequest#1{%
+ \blx@auxwrite\@mainaux{}{%
+ \string\abx@aux@lbx@loadrequest{#1}}}
+
+% auxiliary macros
+
+% {<field base name>}
+\newrobustcmd*{\mkdaterangeshort}{%
+ \mkdaterangefull{short}}
+
+\newrobustcmd*{\mkdaterangelong}{%
+ \mkdaterangefull{long}}
+
+\newrobustcmd*{\mkdaterangeterse}{%
+ \mkdaterangetrunc{short}}
+
+\newrobustcmd*{\mkdaterangecomp}{%
+ \mkdaterangetrunc{long}}
+
+\newrobustcmd*{\mkdaterangeshortextra}{%
+ \mkdaterangefullextra{short}}
+
+\newrobustcmd*{\mkdaterangelongextra}{%
+ \mkdaterangefullextra{long}}
+
+\newrobustcmd*{\mkdaterangeterseextra}{%
+ \mkdaterangetruncextra{short}}
+
+\newrobustcmd*{\mkdaterangecompextra}{%
+ \mkdaterangetruncextra{long}}
+
+% calls to \blx@metadateinfo should be grouped to avoid name clashes
+\def\blx@metadateinfo#1{%
+ \letcs\ifdateera{if#1dateera}%
+ \letcs\ifenddateera{if#1enddateera}%
+ \letcs\ifdatecirca{if#1datecirca}%
+ \letcs\ifenddatecirca{if#1enddatecirca}%
+ \letcs\ifdatejulian{if#1datejulian}%
+ \letcs\ifenddatejulian{if#1enddatejulian}%
+ \letcs\ifdateuncertain{if#1dateuncertain}%
+ \letcs\ifenddateuncertain{if#1enddateuncertain}%
+ \letcs\ifdateunknown{if#1dateunknown}%
+ \letcs\ifenddateunknown{if#1enddateunknown}}
+
+\expandafter\newrobustcmd\expandafter*\csname mktimerange24h\endcsname{%
+ \mktimerange{24h}}
+
+\expandafter\newrobustcmd\expandafter*\csname mktimerange12h\endcsname{%
+ \mktimerange{12h}}
+
+\expandafter\newrobustcmd\expandafter*\csname mktimerange24hcomp\endcsname[1]{%
+ \iffieldundef{#1hour}
+ {}
+ {\ifboolexpr{test {\iffieldundef{#1endhour}}
+ or
+ test {\iffieldequalstr{#1endhour}{}}}
+ {\mktimerange{24h}{#1}}
+ {\iffieldsequal{#1hour}{#1endhour}
+ % 14:xx:xx 14:xx:xx
+ {\iffieldsequal{#1minute}{#1endminute}
+ % 14:13:xx 14:13:xx
+ {\toggletrue{blx@seconds}%
+ \printtext[{#1time}]{%
+ \csuse{mkbibtime24h}{#1hour}{#1minute}{#1second}{}%
+ \bibtimerangesep
+ \csuse{mkbibtime24h}{}{}{#1endsecond}{}}}
+ % 14:13:xx 14:14:xx
+ {\toggletrue{blx@seconds}%
+ \printtext[{#1time}]{\csuse{mkbibtime24h}{#1hour}{#1minute}{}{}%
+ \bibtimerangesep
+ \csuse{mkbibtime24h}{}{#1endminute}{}{}}}}
+ % 14:xx:xx 15:xx:xx
+ {\mktimerange{24h}{#1}}}}}
+
+% {<24h|24hcomp|12h>}{<datetype>}
+\newrobustcmd*{\mktimerange}[2]{%
+ \begingroup
+ \iffieldundef{#2hour}
+ {\blx@nounit}
+ {\blx@timepre{#2}{}%
+ \printtext[{#2time}]{%
+ \csuse{mkbibtime#1}{#2hour}{#2minute}{#2second}{#2timezone}%
+ \iffieldundef{#2endhour}
+ {}
+ {\blx@timepre{#2}{end}%
+ \iffieldequalstr{#2endhour}{}
+ {\mbox{\bibtimerangesep}}
+ {\bibtimerangesep
+ \csuse{mkbibtime#1}{#2endhour}{#2endminute}{#2endsecond}{#2endtimezone}}}}}%
+ \endgroup}
+
+% {<datetype>}{''|end}
+\newrobustcmd*{\blx@timepre}[2]{%
+ \iftoggle{blx@timezones}{}
+ {\blx@imc@clearfield{#1#2timezone}}%
+ \iftoggle{blx@seconds}{}
+ {\blx@imc@clearfield{#1#2second}}}
+
+\newcommand*{\blx@if@printtime}[2]{%
+ \iftoggle{blx@#1dateusetime}
+ {\iffieldundef{#1#2hour}
+ {\@secondoftwo}
+ {\@firstoftwo}}
+ {\@secondoftwo}}
+
+\newcommand*{\blx@if@printanytimes}[1]{%
+ \iftoggle{blx@#1dateusetime}
+ {\iffieldundef{#1hour}
+ {\iffieldundef{#1endhour}
+ {\@secondoftwo}
+ {\@firstoftwo}}
+ {\@firstoftwo}}
+ {\@secondoftwo}}
+
+% {<datetype>}{'' | end}
+\newrobustcmd*{\blx@printtime}[2]{%
+ \blx@if@printtime{#1}{#2}
+ {\blx@timepre{#1}{#2}%
+ \bibdatetimesep%
+ \printtext[{#1time}]{%
+ \csuse{mkbibtime\csuse{blx@timeformat@#1time}}
+ {#1#2hour}{#1#2minute}{#1#2second}{#1#2timezone}}}
+ {}}
+
+% {<short|long>}{<datetype>}
+\newrobustcmd*{\mkdaterangefull}[2]{%
+ \begingroup
+ \blx@metadateinfo{#2}%
+ \iffieldundef{#2year}
+ {\blx@nounit}
+ {\printtext[{#2date}]{%
+ \datecircaprint
+ % Such a year division component can only come from an ISO8601 year division which replaces
+ % a normal month so if it exists, we know that a normal date print is ruled out
+ \iffieldundef{#2yeardivision}
+ {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
+ % Optionally print the time after the date
+ \blx@printtime{#2}{}}
+ {\csuse{mkbibyeardivisiondate#1}{#2year}{#2yeardivision}}%
+ \dateuncertainprint
+ \dateeraprint{#2year}%
+ \iffieldundef{#2endyear}
+ {}
+ {\iffieldequalstr{#2endyear}{}
+ {\mbox{\bibdaterangesep}}
+ {\bibdaterangesep
+ \enddatecircaprint
+ \iffieldundef{#2endyeardivision}
+ {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}%
+ % Optionally print the time after the date
+ \blx@printtime{#2}{end}}
+ {\csuse{mkbibyeardivisiondate#1}{#2endyear}{#2endyeardivision}}%
+ \enddateuncertainprint
+ \dateeraprint{#2endyear}}}}}%
+ \endgroup}
+
+\newrobustcmd*{\mkdaterangefullextra}[2]{%
+ \begingroup
+ \blx@metadateinfo{#2}%
+ \iffieldundef{#2year}
+ {\blx@nounit}
+ {\printtext[{#2date}]{%
+ \datecircaprint
+ % Such a year division component can only come from an ISO8601 year division which replaces
+ % a normal month so if it exists, we know that a normal date print is ruled out
+ \iffieldundef{#2yeardivision}
+ {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
+ % Optionally print the time after the date
+ \blx@printtime{#2}{}}
+ {\csuse{mkbibyeardivisiondate#1}{#2year}{#2yeardivision}}%
+ \dateuncertainprint
+ \dateeraprint{#2year}%
+ \iffieldundef{#2endyear}
+ {\printfield{extradate}}
+ {\iffieldequalstr{#2endyear}{}
+ {\printfield{extradate}%
+ \mbox{\bibdaterangesep}}
+ {\bibdaterangesep
+ \enddatecircaprint
+ \iffieldundef{#2endyeardivision}
+ {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}%
+ % Optionally print the time after the date
+ \blx@printtime{#2}{end}}
+ {\csuse{mkbibyeardivisiondate#1}{#2endyear}{#2endyeardivision}}}%
+ \printfield{extradate}%
+ \enddateuncertainprint
+ \dateeraprint{#2endyear}}}}%
+ \endgroup}
+
+\newrobustcmd*{\mkdaterangetrunc}[2]{%
+ \blx@if@printanytimes{#2}
+ {\mkdaterangefull{#1}{#2}}
+ {\mkdaterangetrunc@i{#1}{#2}}}
+
+\newrobustcmd*{\mkdaterangetrunc@i}[2]{%
+ \begingroup
+ \blx@metadateinfo{#2}%
+ \iffieldundef{#2year}
+ {\blx@nounit}
+ {\printtext[{#2date}]{%
+ \datecircaprint
+ % Such a year division component can only come from an ISO8601 year division which replaces
+ % a normal month so if it exists, we know that a normal date print is ruled out
+ \iffieldundef{#2yeardivision}
+ {\ifdateyearsequal{#2}{#2end}
+ {\iffieldsequal{#2month}{#2endmonth}
+ {\csuse{mkbibdate#1}{}{}{#2day}}
+ {\csuse{mkbibdate#1}{}{#2month}{#2day}}}
+ {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
+ \iffieldsequal{#2dateera}{#2enddateera}{}
+ {\dateeraprint{#2year}}}}
+ {\ifdateyearsequal{#2}{#2end}
+ {\csuse{mkbibyeardivisiondate#1}{}{#2yeardivision}}
+ {\csuse{mkbibyeardivisiondate#1}{#2year}{#2yeardivision}%
+ \iffieldsequal{#2dateera}{#2enddateera}{}
+ {\dateeraprint{#2year}}}}%
+ \dateuncertainprint
+ \iffieldundef{#2endyear}
+ {}
+ {\iffieldequalstr{#2endyear}{}
+ {\mbox{\bibdaterangesep}}
+ {\bibdaterangesep
+ \enddatecircaprint
+ \iffieldundef{#2endyeardivision}
+ {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}
+ {\csuse{mkbibyeardivisiondate#1}{#2endyear}{#2endyeardivision}}%
+ \enddateuncertainprint
+ \dateeraprint{#2endyear}}}}}%
+ \endgroup}
+
+\newrobustcmd*{\mkdaterangetruncextra}[2]{%
+ \blx@if@printanytimes{#2}
+ {\mkdaterangefullextra{#1}{#2}}
+ {\mkdaterangetruncextra@i{#1}{#2}}}
+
+\newrobustcmd*{\mkdaterangetruncextra@i}[2]{%
+ \begingroup
+ \blx@metadateinfo{#2}%
+ \iffieldundef{#2year}
+ {\blx@nounit}
+ {\printtext[{#2date}]{%
+ \datecircaprint
+ % Such a year division component can only come from an ISO8601 year division which replaces
+ % a normal month so if it exists, we know that a normal date print is ruled out
+ \iffieldundef{#2yeardivision}
+ {\ifdateyearsequal{#2}{#2end}
+ {\iffieldsequal{#2month}{#2endmonth}
+ {\csuse{mkbibdate#1}{}{}{#2day}}
+ {\csuse{mkbibdate#1}{}{#2month}{#2day}}}
+ {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
+ \iffieldsequal{#2dateera}{#2enddateera}{}
+ {\dateeraprint{#2year}}}}
+ {\ifdateyearsequal{#2}{#2end}
+ {\csuse{mkbibyeardivisiondate#1}{}{#2yeardivision}}
+ {\csuse{mkbibyeardivisiondate#1}{#2year}{#2yeardivision}%
+ \iffieldsequal{#2dateera}{#2enddateera}{}
+ {\dateeraprint{#2year}}}}%
+ \dateuncertainprint
+ \iffieldundef{#2endyear}
+ {\printfield{extradate}}
+ {\iffieldequalstr{#2endyear}{}
+ {\printfield{extradate}%
+ \mbox{\bibdaterangesep}}
+ {\bibdaterangesep
+ \enddatecircaprint
+ \iffieldundef{#2endyeardivision}
+ {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}
+ {\csuse{mkbibyeardivisiondate#1}{#2endyear}{#2endyeardivision}}}%
+ \printfield{extradate}%
+ \enddateuncertainprint
+ \dateeraprint{#2endyear}}}}%
+ \endgroup}
+
+\newrobustcmd*{\mkdaterangeyear}[1]{%
+ \begingroup
+ \blx@imc@clearfield{#1yeardivision}%
+ \blx@imc@clearfield{#1month}%
+ \blx@imc@clearfield{#1day}%
+ \blx@imc@clearfield{#1hour}%
+ \blx@imc@clearfield{#1minute}%
+ \blx@imc@clearfield{#1second}%
+ \blx@imc@clearfield{#1timezone}%
+ \blx@imc@clearfield{#1endyeardivision}%
+ \blx@imc@clearfield{#1endmonth}%
+ \blx@imc@clearfield{#1endday}%
+ \blx@imc@clearfield{#1endhour}%
+ \blx@imc@clearfield{#1endminute}%
+ \blx@imc@clearfield{#1endsecond}%
+ \blx@imc@clearfield{#1endtimezone}%
+ \ifdateyearsequal{#1}{#1end}
+ {\blx@imc@clearfield{#1endyear}}
+ {}%
+ \mkdaterangefull{short}{#1}%
+ \endgroup}
+
+% {<datetype>}
+\newrobustcmd*{\mkdaterangeymd}[1]{%
+ \begingroup
+ \blx@metadateinfo{#1}%
+ \iffieldundef{#1year}
+ {\blx@nounit}
+ {\printtext[{#1date}]{%
+ \datecircaprint
+ % Such a year division component can only come from an ISO8601 year division which replaces
+ % a normal month so if it exists, we know that a normal date print is ruled out
+ \iffieldundef{#1yeardivision}
+ {\blx@ymddate{#1}{}%
+ % Optionally print the time after the date
+ \blx@printtime{#1}{}}
+ {\csuse{mkbibyeardivisiondateshort}{#1year}{#1yeardivision}}%
+ \dateuncertainprint
+ \dateeraprint{#1year}%
+ \iffieldundef{#1endyear}
+ {}
+ {\iffieldequalstr{#1endyear}{}
+ {\mbox{\bibdaterangesep}}
+ {\bibdaterangesep
+ \enddatecircaprint
+ \iffieldundef{#1yeardivision}
+ {\blx@ymddate{#1}{end}%
+ % Optionally print the time after the date
+ \blx@printtime{#1}{end}}
+ {\csuse{mkbibyeardivisiondateshort}{#1endyear}{#1endyeardivision}}%
+ \enddateuncertainprint
+ \dateeraprint{#1endyear}}}}}%
+ \endgroup}
+
+% {<datetype>}
+\newrobustcmd*{\mkdaterangeymdextra}[1]{%
+ \begingroup
+ \blx@metadateinfo{#1}%
+ \iffieldundef{#1year}
+ {\blx@nounit}
+ {\printtext[{#1date}]{%
+ \datecircaprint
+ % Such a year division component can only come from an ISO8601 year division which replaces
+ % a normal month so if it exists, we know that a normal date print is ruled out
+ \iffieldundef{#1yeardivision}
+ {\blx@ymddate[extradate]{#1}{}%
+ % Optionally print the time after the date
+ \blx@printtime{#1}{}}
+ {\csuse{mkbibyeardivisiondateshort}{#1year}{#1yeardivision}}%
+ \dateuncertainprint
+ \dateeraprint{#1year}%
+ \iffieldundef{#1endyear}
+ {}
+ {\iffieldequalstr{#1endyear}{}
+ {\mbox{\bibdaterangesep}}
+ {\bibdaterangesep
+ \enddatecircaprint
+ \iffieldundef{#1yeardivision}
+ {\blx@ymddate{#1}{end}%
+ % Optionally print the time after the date
+ \blx@printtime{#1}{end}}
+ {\csuse{mkbibyeardivisiondateshort}{#1endyear}{#1endyeardivision}}}%
+ \enddateuncertainprint
+ \dateeraprint{#1endyear}}}}%
+ \endgroup}
+
+% [extradate]{<datetype>}{''|end}
+\newrobustcmd*{\blx@ymddate}[3][]{%
+ \dateeraprintpre{#2#3year}%
+ \mkyearzeros{\thefield{#2#3year}}\ifblank{#1}{}{\printfield{#1}}%
+ \iffieldundef{#2#3month}{}{\bibdatesep\mkmonthzeros{\thefield{#2#3month}}}%
+ \iffieldundef{#2#3day}{}{\bibdatesep\mkdayzeros{\thefield{#2#3day}}}}
+
+\newrobustcmd*{\mkdaterangeyearextra}[1]{%
+ \begingroup
+ \blx@imc@clearfield{#1yeardivision}%
+ \blx@imc@clearfield{#1month}%
+ \blx@imc@clearfield{#1day}%
+ \blx@imc@clearfield{#1hour}%
+ \blx@imc@clearfield{#1minute}%
+ \blx@imc@clearfield{#1second}%
+ \blx@imc@clearfield{#1timezone}%
+ \blx@imc@clearfield{#1endyeardivision}%
+ \blx@imc@clearfield{#1endmonth}%
+ \blx@imc@clearfield{#1endday}%
+ \blx@imc@clearfield{#1endhour}%
+ \blx@imc@clearfield{#1endminute}%
+ \blx@imc@clearfield{#1endsecond}%
+ \blx@imc@clearfield{#1endtimezone}%
+ \ifdateyearsequal{#1}{#1end}
+ {\blx@imc@clearfield{#1endyear}}
+ {}%
+ \mkdaterangefullextra{short}{#1}%
+ \endgroup}
+
+\newrobustcmd*{\mkdaterangeiso}[1]{%
+ \begingroup
+ \blx@metadateinfo{#1}%
+ \def\bibdatetimesep{T}%
+ \iffieldundef{#1year}
+ {\blx@nounit}
+ {\printtext[{#1date}]{%
+ \blx@isodate{#1}{}%
+ \ifboolexpr{%
+ togl {blx@#1dateusetime}
+ and
+ not test {\iffieldundef{#1hour}}}
+ {\bibdatetimesep%
+ \blx@isotime{#1}{}}
+ {}%
+ \dateuncertainprint
+ \datecircaprintiso
+ \iffieldundef{#1endyear}
+ {}
+ {\addslash
+ \blx@isodate{#1}{end}%
+ \ifboolexpr{%
+ togl {blx@#1dateusetime}
+ and
+ not test {\iffieldundef{#1endhour}}}
+ {\bibdatetimesep%
+ \blx@isotime{#1}{end}}
+ {}%
+ \enddateuncertainprint
+ \enddatecircaprintiso}}}%
+ \endgroup}
+
+\newrobustcmd*{\mkdaterangeisoextra}[1]{%
+ \begingroup
+ \blx@metadateinfo{#1}%
+ \def\bibdatetimesep{T}%
+ \iffieldundef{#1year}
+ {\blx@nounit}
+ {\printtext[{#1date}]{%
+ \blx@isodate[extradate]{#1}{}%
+ \ifboolexpr{%
+ togl {blx@#1dateusetime}
+ and
+ not test {\iffieldundef{#1hour}}}
+ {\bibdatetimesep%
+ \blx@isotime{#1}{}}
+ {}%
+ \dateuncertainprint
+ \datecircaprintiso
+ \iffieldundef{#1endyear}
+ {}
+ {\addslash
+ \blx@isodate{#1}{end}}%
+ \ifboolexpr{%
+ togl {blx@#1dateusetime}
+ and
+ not test {\iffieldundef{#1endhour}}}
+ {\bibdatetimesep%
+ \blx@isotime{#1}{end}}
+ {}%
+ \enddateuncertainprint
+ \enddatecircaprintiso}}%
+ \endgroup}
+
+% [extradate]{<datetype>}{''|end}
+\newrobustcmd*{\blx@isodate}[3][]{%
+ \dateeraprintpre{#2#3year}%
+ \blx@imc@forcezerosy{\thefield{#2#3year}}\ifblank{#1}{}{\printfield{#1}}%
+ % Such a year division component can only come from an ISO8601 year division which replaces
+ % a normal month so if it exists, we know that a normal date print is ruled out
+ \iffieldundef{#2#3yeardivision}
+ {\iffieldundef{#2#3month}{}{\hyphen\blx@imc@forcezerosmdt{\thefield{#2#3month}}}%
+ \iffieldundef{#2#3day}{}{\hyphen\blx@imc@forcezerosmdt{\thefield{#2#3day}}}}
+ {\hyphen\blx@yeardivisionmap{\thefield{#2#3yeardivision}}}}
+
+\def\blx@yeardivisionmap#1{%
+ \blx@xifstrequal{#1}{spring}{21}
+ {\blx@xifstrequal{#1}{summer}{22}
+ {\blx@xifstrequal{#1}{autumn}{23}
+ {\blx@xifstrequal{#1}{winter}{24}{}}}}}
+
+\newrobustcmd*{\blx@isotime}[2]{%
+ \blx@imc@forcezerosmdt{\thefield{#1#2hour}}%
+ :\blx@imc@forcezerosmdt{\thefield{#1#2minute}}%
+ :\blx@imc@forcezerosmdt{\thefield{#1#2second}}%
+ \iftoggle{blx@timezones}
+ {\mkbibtimezone{\thefield{#1#2timezone}}}
+ {}}
+
+% some sane defaults for bibliography extras
+% many of these should be redefined in the .lbx files
+% all .lbx files should have date and time handling, so the fallback values
+% issue a warning to make people aware of the deficiency in their file
+% \mkbibordinal should also only be used if it is defined, so it warns as well
+% times
+\newrobustcmd*{\bibtimesep}{:}
+\newrobustcmd*{\bibtimerangesep}{\textendash}
+\newrobustcmd*{\bibutctimezone}{Z}
+\newrobustcmd*{\bibtimezonesep}{}
+\newrobustcmd*{\bibtzminsep}{\bibtimesep}
+% dates
+\newrobustcmd*{\bibdateuncertain}{?}
+% \textminus is only guaranteed for non-PDFTeX
+\newrobustcmd*{\bibdateeraprefix}{\ifdef\textminus\textminus\textendash}
+\newrobustcmd*{\bibdateeraendprefix}{\,\bibdateeraprefix}
+\newrobustcmd*{\bibdatesep}{\hyphen}
+\newrobustcmd*{\bibdaterangesep}{\bibrangedash}
+% date+times
+\newrobustcmd*{\bibdatetimesep}{\space}
+% ranges
+\newrobustcmd*{\bibrangedash}{\textendash}
+\newrobustcmd*{\bibrangessep}{,\space}
+% formatters
+\newrobustcmd*{\mkbibtimezone}[1]{\blx@xifstrequal{#1}{Z}{\bibutctimezone}{#1}}
+% you should never end up needing the next few definitions
+% but it is safer to do something than just swallow the input
+\newrobustcmd*{\mkbibdatelong}[3]{%
+ \blx@warning@noline{%
+ Using fallback definition for \string\mkbibdatelong.\MessageBreak
+ The command should be defined in the .lbx file.\MessageBreak
+ If you see this message, the .lbx file could not be\MessageBreak
+ loaded, is faulty or does not contain a definition\MessageBreak
+ for \string\mkbibdatelong
+ }%
+ \iffieldundef{#3}
+ {}
+ {\mkbibordinal{\thefield{#3}}%
+ \iffieldundef{#2}{}{\nobreakspace}}%
+ \iffieldundef{#2}
+ {}
+ {\mkbibmonth{\thefield{#2}}%
+ \iffieldundef{#1}{}{\space}}%
+ \iffieldbibstring{#1}
+ {\bibstring{\thefield{#1}}}
+ {\dateeraprintpre{#1}\stripzeros{\thefield{#1}}}}
+
+\newrobustcmd*{\mkbibdateshort}[3]{%
+ \blx@warning@noline{%
+ Using fallback definition for \string\mkbibdateshort.\MessageBreak
+ The command should be defined in the .lbx file.\MessageBreak
+ If you see this message, the .lbx file could not be\MessageBreak
+ loaded, is faulty or does not contain a definition\MessageBreak
+ for \string\mkbibdateshort
+ }%
+ \iffieldundef{#3}
+ {}
+ {\mkdayzeros{\thefield{#3}}%
+ \iffieldundef{#2}{}{/}}%
+ \iffieldundef{#2}
+ {}
+ {\mkmonthzeros{\thefield{#2}}%
+ \iffieldundef{#1}{}{/}}%
+ \iffieldbibstring{#1}
+ {\bibstring{\thefield{#1}}}
+ {\dateeraprintpre{#1}\mkyearzeros{\thefield{#1}}}}
+
+\expandafter\newrobustcmd\expandafter*\csname mkbibtime24h\endcsname[4]{%
+ \blx@warning@noline{%
+ Using fallback definition for
+ \expandafter\string\csname mkbibtime24h\endcsname.\MessageBreak
+ The command should be defined in the .lbx file.\MessageBreak
+ If you see this message, the .lbx file could not be\MessageBreak
+ loaded, is faulty or does not contain a definition\MessageBreak
+ for \expandafter\string\csname mkbibtime24h\endcsname
+ }%
+ \iffieldundef{#1}
+ {}
+ {\mktimezeros{\thefield{#1}}%
+ \iffieldundef{#2}{}{\bibtimesep}}%
+ \iffieldundef{#2}
+ {}
+ {\mktimezeros{\thefield{#2}}%
+ \iffieldundef{#3}{}{\bibtimesep}}%
+ \iffieldundef{#3}
+ {}
+ {\mktimezeros{\thefield{#3}}}%
+ \iffieldundef{#4}{}
+ {\bibtimezonesep
+ \mkbibtimezone{\thefield{#4}}}}
+
+\expandafter\newrobustcmd\expandafter*\csname mkbibtime12h\endcsname[4]{%
+ \blx@warning@noline{%
+ Using fallback definition for
+ \expandafter\string\csname mkbibtime12h\endcsname.\MessageBreak
+ The command should be defined in the .lbx file.\MessageBreak
+ If you see this message, the .lbx file could not be\MessageBreak
+ loaded, is faulty or does not contain a definition\MessageBreak
+ for \expandafter\string\csname mkbibtime12h\endcsname
+ }%
+ \stripzeros{\mktimehh{\thefield{#1}}}%
+ \bibtimesep
+ \forcezerosmdt{\thefield{#2}}%
+ \iffieldundef{#3}{}
+ {\bibtimesep
+ \forcezeros{\thefield{#3}}}%
+ \space
+ \ifnumless{\thefield{#1}}{12}
+ {\bibstring{am}}
+ {\bibstring{pm}}%
+ \iffieldundef{#4}{}
+ {\space\bibtimezonesep
+ \mkbibparens{\mkbibtimezone{\thefield{#4}}}}}
+
+\newrobustcmd*{\mkbibyeardivisiondateshort}[2]{%
+ \blx@warning@noline{%
+ Using fallback definition for \string\mkbibyeardivisiondateshort.\MessageBreak
+ The command should be defined in the .lbx file.\MessageBreak
+ If you see this message, the .lbx file could not be\MessageBreak
+ loaded, is faulty or does not contain a definition\MessageBreak
+ for \string\mkbibyeardivisiondateshort
+ }%
+ \mkbibyeardivision{\thefield{#2}}%
+ \iffieldundef{#1}{}{\space}%
+ \dateeraprintpre{#1}\mkyearzeros{\thefield{#1}}}
+\def\mkbibseasondateshort{% LEGACY
+ \blx@warning@noline{%
+ '\string\mkbibseasondateshort' is deprecated in favour of\MessageBreak
+ '\string\mkbibyeardivisiondateshort'}%
+ \mkbibyeardivisiondateshort}
+
+\newrobustcmd*{\mkbibyeardivisiondatelong}[2]{%
+ \blx@warning@noline{%
+ Using fallback definition for \string\mkbibyeardivisiondatelong.\MessageBreak
+ The command should be defined in the .lbx file.\MessageBreak
+ If you see this message, the .lbx file could not be\MessageBreak
+ loaded, is faulty or does not contain a definition\MessageBreak
+ for \string\mkbibyeardivisiondatelong
+ }%
+ \mkbibyeardivision{\thefield{#2}}%
+ \iffieldundef{#1}{}{\space}%
+ \dateeraprintpre{#1}\mkyearzeros{\thefield{#1}}}
+\def\mkbibseasondatelong{% LEGACY
+ \blx@warning@noline{%
+ '\string\mkbibseasondatelong' is deprecated in favour of\MessageBreak
+ '\string\mkbibyeardivisiondatelong'}%
+ \mkbibyeardivisiondatelong}
+
+\newrobustcmd*{\bibdatedash}{\bibrangedash}
+\newrobustcmd*{\finalandcomma}{}
+\newrobustcmd*{\finalandsemicolon}{}
+\newrobustcmd*{\mkbibordinal}[1]{%
+ \blx@warning@noline{%
+ Using fallback definition for \string\mkbibordinal.\MessageBreak
+ The command should be defined in the .lbx file.\MessageBreak
+ If you see this message, the .lbx file could not be\MessageBreak
+ loaded, is faulty or does not contain a definition\MessageBreak
+ for \string\mkbibordinal
+ }%
+ #1%
+}
+\newrobustcmd*{\mkbibmascord}{\mkbibordinal}
+\newrobustcmd*{\mkbibfemord}{\mkbibordinal}
+\newrobustcmd*{\mkbibneutord}{\mkbibordinal}
+% the following is usually not redefined in an .lbx
+\newrobustcmd*{\mkbibyeardivision}[1]{\abx@bibyeardivision{#1}}
+\newrobustcmd*\mkbibseason{% LEGACY
+ \blx@warning@noline{%
+ '\string\mkbibseason' is deprecated in favour of\MessageBreak
+ '\string\mkbibyeardivision'}%
+ \mkbibyeardivision}
+\newrobustcmd*{\mkbibmonth}[1]{%
+ \ifcase0#1\relax
+ \blx@warning@entry{Month out of range or not an integer}%
+ \or\abx@bibmonth{january}%
+ \or\abx@bibmonth{february}%
+ \or\abx@bibmonth{march}%
+ \or\abx@bibmonth{april}%
+ \or\abx@bibmonth{may}%
+ \or\abx@bibmonth{june}%
+ \or\abx@bibmonth{july}%
+ \or\abx@bibmonth{august}%
+ \or\abx@bibmonth{september}%
+ \or\abx@bibmonth{october}%
+ \or\abx@bibmonth{november}%
+ \or\abx@bibmonth{december}%
+ \else
+ \blx@warning@entry{Month out of range}#1%
+ \fi}
+
+% strip leading zeros and prepend zero for month/day/timeparts
+% Allow for non numeric labelyear values
+\protected\def\blx@imc@forcezerosmdt#1{%
+ \protected@edef\blx@tempa{#1}%
+ \expandafter\blx@imc@forcezerosmdt@i\expandafter{\blx@tempa}}
+
+\protected\def\blx@imc@forcezerosmdt@i#1{%
+ \notblank{#1}
+ {\blx@imc@ifinteger{#1}
+ {\ifnumless{#1}{10}
+ {0\the\numexpr(#1)\relax}
+ {#1}}
+ {#1}}
+ {#1}}
+
+% strip leading zeros and prepend zero(s) for year
+% Allow for non numeric labelyear values
+\protected\def\blx@imc@forcezerosy#1{%
+ \protected@edef\blx@tempa{#1}%
+ \expandafter\blx@imc@forcezerosy@i\expandafter{\blx@tempa}}
+
+\protected\def\blx@imc@forcezerosy@i#1{%
+ \notblank{#1}
+ {\blx@imc@ifinteger{#1}
+ {\ifnumless{#1}{10}% 1-digit year
+ {000\the\numexpr(#1)\relax}
+ {\ifnumless{#1}{100}% 2-digit year
+ {00\the\numexpr(#1)\relax}
+ {\ifnumless{#1}{1000}% 3-digit year
+ {0\the\numexpr(#1)\relax}
+ {#1}}}}
+ {#1}}
+ {#1}}%
+
+\let\blx@imc@mkyearzeros\blx@imc@forcezerosy
+\let\blx@imc@mkmonthzeros\blx@imc@forcezerosmdt
+\let\blx@imc@mkdayzeros\blx@imc@forcezerosmdt
+\protected\def\blx@imc@stripzeros#1{%
+ \begingroup
+ \setbox\@tempboxa=\hbox\bgroup
+ \aftergroup\endgroup
+ \abx@hook@xsanitize
+ \if0#1\relax
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ {\@tempcnta#1\relax
+ \expandafter\egroup
+ \number\@tempcnta
+ \@tempcnta#1\relax}
+ {\egroup#1}}
+
+\let\blx@imc@printlabeldate\@empty
+\let\blx@imc@printlabeltime\@empty
+\let\blx@imc@printlabeldateextra\@empty
+
+\blx@regimcs{\printlabeldate \printlabeltime \printlabeldateextra
+ \stripzeros \forcezerosy \forcezerosmdt
+ \mkyearzeros \mkmonthzeros \mkdayzeros \mktimezeros}
+
+% User macro for retrieving currrent language
+\def\currentlang{\blx@languagename}
+
+% We need to be able to prefix \providetoggle with \global,
+% plus we don't need the testing from \providetoggle anway.
+% This uses internal implementation details of etoolbox's
+% toggles, so is a bit meh, but it's better than rolling our own
+% version of toggles just for that.
+\newcommand*{\blx@etb@inittoggle}[1]{\cslet{etb@tgl@#1}\@secondoftwo}
+
+% There is no \nocaptions..., so if we send everything to \captions...
+% we need to find a way to call our noextras only in situations where
+% \noextras... is called to clean up \extras... AND \captions...
+% and not just \extras...
+% We detect this by setting a toggle in the \captions...
+
+% {<language>}{<strings>}
+\def\blx@maplang@babel#1#2{%
+ \global\blx@etb@inittoggle{blx@lang@captions@#2}%
+ \ifdefstring{\blx@langhook}{captions}
+ {\csgappto{captions#1}{%
+ \toggletrue{blx@lang@captions@#2}%
+ \blx@resetpunct
+ \csuse{abx@extras@#2}%
+ \csuse{abx@strings@#2}}%
+ \csgappto{noextras#1}{%
+ \iftoggle{blx@lang@captions@#2}
+ {\blx@resetpunct
+ \csuse{abx@noextras@#2}}
+ {}}}
+ {\csgappto{extras#1}{%
+ \blx@resetpunct
+ \csuse{abx@extras@#2}%
+ \csuse{abx@strings@#2}}%
+ \csgappto{noextras#1}{%
+ \blx@resetpunct
+ \csuse{abx@noextras@#2}}}}
+
+\def\blx@maplang@polyglossia#1#2{%
+ \global\blx@etb@inittoggle{blx@lang@captions@#2}%
+ \ifdefstring{\blx@langhook}{captions}
+ {\csgappto{captions@bbl@#1}{%
+ \toggletrue{blx@lang@captions@#2}%
+ \blx@resetpunct
+ \csuse{abx@extras@#2}%
+ \csuse{abx@strings@#2}}%
+ \csgappto{noextras@bbl@#1}{%
+ \iftoggle{blx@lang@captions@#2}
+ {\blx@resetpunct
+ \csuse{abx@noextras@#2}}
+ {}}}
+ {\csgappto{blockextras@bbl@#1}{%
+ \blx@resetpunct
+ \csuse{abx@extras@#2}%
+ \csuse{abx@strings@#2}}%
+ \csgappto{inlineextras@bbl@#1}{%
+ \blx@resetpunct
+ \csuse{abx@extras@#2}%
+ \csuse{abx@strings@#2}}%
+ \csgappto{noextras@bbl@#1}{%
+ \blx@resetpunct
+ \csuse{abx@noextras@#2}}}}
+
+%% babel/polyglossia interface
+\def\blx@beglang{\blx@clearlang\begingroup}
+\def\blx@endlang{\endgroup}
+\let\blx@beglangbib\blx@beglang
+\let\blx@endlangbib\blx@endlang
+\let\blx@beglangcite\blx@beglang
+\let\blx@endlangcite\blx@endlang
+\let\blx@hook@endlang\@empty
+\let\blx@hook@initlang\@empty
+\let\blx@imc@mainlang\@empty
+\let\blx@imc@textmainlang\@firstofone
+\let\blx@imc@textouterlang\@firstofone
+\def\blx@hyphenreset{%
+ \blx@ifhyphenationundef{\blx@languagename}
+ {}
+ {\language\csname l@\blx@languagename\endcsname\relax}%
+ \ifcsundef{\blx@languagename hyphenmins}
+ {\blx@sethyphenmins\tw@\thr@@}
+ {\expandafter\expandafter\expandafter\blx@sethyphenmins
+ \csname\blx@languagename hyphenmins\endcsname}}
+\def\blx@sethyphenmins#1#2{%
+ \lefthyphenmin#1\relax
+ \righthyphenmin#2\relax}
+
+
+
+\def\blx@mkautolangbabel{%
+ \ifundef\bbl@main@language
+ {\blx@error
+ {No default 'babel' language defined}
+ {You must define a default language for 'babel'}}
+ {\let\blx@main@language\bbl@main@language}%
+ \let\blx@outer@language\blx@main@language
+ % use afterreset to get in a bit earlier
+ % we want to be there before \captions... is issued
+ % beforeextras is before extras, but captions come before extras
+ % afterreset was added in 3.9i (~2014-03-16)
+ % way before 3.9r (2016-04-23), which we require
+ \AddBabelHook{biblatex@langsetup}{afterreset}{%
+ \expandafter\blx@langsetup@indoc\expandafter{\languagename}}%
+ \ifdef\blx@thelangenv
+ {\def\blx@beglang{%
+ \blx@clearlang
+ \begingroup
+ % track outer language (i.e. language not selected by biblatex)
+ \ifundef\blx@outer@language@set
+ {\let\blx@outer@language\blx@languagename
+ \let\blx@outer@language@set\@empty}
+ {}%
+ % Need to override all entries, regardless of if there is a
+ % langid if language=<language> option is given
+ \ifboolexpr { test {\ifdef\abx@field@@@langid }
+ or
+ test {\ifdef\blx@forcelanguagename} }
+ % override local langid if we forced it with
+ % language=<language> option
+ {\ifdef\blx@forcelanguagename
+ {\let\abx@field@@@langid\blx@forcelanguagename}
+ {}%
+ \let\blx@languagename\abx@field@@@langid% track global language
+ \blx@ifhyphenationundef{\abx@field@@@langid}
+ {\blx@warn@nohyph{\abx@field@@@langid}}
+ {\blx@hook@initlang
+ \def\blx@endlang{%
+ \blx@hook@endlang
+ \csname end\blx@thelangenv\endcsname
+ \endgroup}%
+ \iftoggle{blx@autolangbib}
+ {\let\blx@endlangbib\blx@endlang}
+ {}%
+ \iftoggle{blx@autolangcite}
+ {\let\blx@endlangcite\blx@endlang}
+ {}%
+ \csname\blx@thelangenv\expandafter\endcsname
+ \expandafter{\abx@field@@@langid}}}
+ {}}}
+ {}%
+ \def\blx@imc@mainlang{%
+ \ifundef\blx@warn@mainlang
+ {\blx@warning@noline{%
+ '\string\mainlang' is deprecated in favour of\MessageBreak
+ '\string\textmainlang'.%
+ \MessageBreak
+ Please consider using the new command,\MessageBreak
+ but note that the syntax is different.\MessageBreak
+ Using the old, problematic definition}%
+ \global\let\blx@warn@mainlang\@empty}
+ {}%
+ \expandafter\selectlanguage\expandafter{\blx@main@language}}%
+ \def\blx@imc@textmainlang##1{%
+ {{\expandafter\selectlanguage\expandafter{\blx@main@language}##1}}}%
+ \def\blx@imc@textouterlang##1{%
+ {{\expandafter\selectlanguage\expandafter{\blx@outer@language}##1}}}%
+ \expandafter\blx@langsetup@from@pkglist\expandafter{\blx@main@language}%
+}
+
+\def\blx@beglang@spacefactors{\frenchspacing}
+
+\def\blx@mkautolangpoly{%
+ \ifundef\mainbabelname
+ {\ifundef\bbl@main@language
+ {\blx@error
+ {No default 'polyglossia' language defined}
+ {You must define a default language for 'polyglossia'}}
+ {\let\blx@main@language\bbl@main@language}}
+ {\let\blx@main@language\mainbabelname}%
+ \let\blx@outer@language\blx@main@language
+ \ifundef\polyglossia@language@switched
+ {\apptocmd\select@language
+ {\expandafter\blx@langsetup@indoc\expandafter{\babelname}}
+ {}
+ {\blx@err@patch{'polyglossia' package}%
+ \blx@mknoautolang}}
+ {\appto\polyglossia@language@switched{%
+ \expandafter\blx@langsetup@indoc\expandafter{\babelname}}}%
+ \ifdef\blx@thelangenv
+ {\def\blx@beglang{%
+ \blx@clearlang
+ \begingroup
+ % track outer language (i.e. language not selected by biblatex)
+ \ifundef\blx@outer@language@set
+ {\let\blx@outer@language\blx@languagename
+ \let\blx@outer@language@set\@empty}
+ {}%
+ % Need to override all entries, regardless of if there is a
+ % langid if language=<language> option is given
+ \ifboolexpr { test {\ifdef\abx@@@field@langid }
+ or
+ test {\ifdef\blx@forcelanguagename} }
+ % override local langid if we forced it with
+ % language=<language> option
+ {\ifdef\blx@forcelanguagename
+ {\let\abx@field@@@langid\blx@forcelanguagename}
+ {}%
+ \let\blx@languagename\abx@field@@@langid% track global language
+ \blx@ifhyphenationundef{\abx@field@@@langid}
+ {\blx@warn@nohyph{\abx@field@@@langid}}
+ {\blx@hook@initlang
+ \def\blx@endlang{%
+ \blx@hook@endlang
+ % Polyglossia language envs are \<lang>[]
+ \ifcsstring{blx@thelangenv}{langname}
+ {\csname end\abx@field@@@langid\endcsname}
+ {\csname end\blx@thelangenv\endcsname}%
+ \endgroup}%
+ \iftoggle{blx@autolangbib}
+ {\let\blx@endlangbib\blx@endlang}
+ {}%
+ \iftoggle{blx@autolangcite}
+ {\let\blx@endlangcite\blx@endlang}
+ {}%
+ \ifcsstring{blx@thelangenv}{langname}
+ {\ifdef\abx@field@@@langidopts
+ {\csname\abx@field@@@langid\expandafter\endcsname
+ \expandafter[\abx@field@@@langidopts]}
+ {\csname\abx@field@@@langid\endcsname}}
+ {\csname\blx@thelangenv\expandafter\endcsname
+ \expandafter{\abx@field@@@langid}}%
+ \blx@beglang@spacefactors}}
+ {}}}
+ {}%
+ \def\blx@imc@mainlang{%
+ \ifundef\blx@warn@mainlang
+ {\blx@warning@noline{%
+ '\string\mainlang' is deprecated in favour of\MessageBreak
+ '\string\textmainlang'.%
+ \MessageBreak
+ Please consider using the new command,\MessageBreak
+ but note that the syntax is different.\MessageBreak
+ Using the old, problematic definition}%
+ \global\let\blx@warn@mainlang\@empty}
+ {}%
+ \select@language{\blx@main@language}}%
+ \def\blx@imc@textmainlang##1{{{\select@language{\blx@main@language}##1}}}%
+ \def\blx@imc@textouterlang##1{{{\select@language{\blx@outer@language}##1}}}%
+ \expandafter\blx@langsetup@from@pkglist\expandafter{\blx@main@language}}
+
+\def\blx@mknoautolang{%
+ \blx@lbxinput{\blx@languagename}
+ {}
+ {\blx@err@nolang{\blx@languagename}}}
+
+\blx@regimcs{\mainlang \textmainlang \textouterlang}
+
+\newrobustcmd*{\DeclareRedundantLanguages}[2]{%
+ \begingroup
+ \ifblank{#2}
+ {\def\do##1{%
+ \global\csundef{blx@rlm@##1}%
+ \global\csundef{blx@rlm@lang##1}}}
+ {\def\do##1{%
+ \csxdef{blx@rlm@##1}{#2}%
+ \csxdef{blx@rlm@lang##1}{#2}}}%
+ \docsvlist{#1}%
+ \endgroup}
+
+\def\blx@clearlang{%
+ \iftoggle{blx@clearlang}
+ {\iflistundef{language}
+ {}
+ {\ifnumgreater{\value{language}}{1}
+ {}
+ {\expandafter\blx@clearlang@i\abx@list@@@language}}}
+ {}}
+
+\def\blx@clearlang@i#1{%
+ \ifcsdef{blx@rlm@#1}
+ {\expandafter\expandafter\expandafter\forcsvlist
+ \expandafter\expandafter\expandafter\blx@clearlang@ii
+ \expandafter\expandafter\expandafter{%
+ \csname blx@rlm@#1\endcsname}}
+ {}}
+
+\def\blx@clearlang@ii#1{%
+ \ifdefstring\languagename{#1}
+ {\clearlist{language}}
+ {}}
+
+%% Biber equivalents to bibtex data interface
+
+\def\abx@doentrytypes{\dolistloop\blx@datamodel@entrytypes}
+
+% fields which can be used as labels - we auto-create some macros for these
+\def\abx@dolabelfields{\dolistloop\blx@datamodel@labelfields}
+\def\abx@dolabelwidths{%
+ \do{labelnumber}%
+ \do{labelalpha}%
+ \abx@dolabelfields}
+
+\def\abx@donames{\dolistloop\blx@datamodel@names}
+\def\abx@donameparts{\expandafter\docsvlist\expandafter{\blx@datamodel@constant@nameparts}}
+
+\def\abx@dofields{\dolistloop\blx@datamodel@fields}
+
+\def\abx@dolists{%
+ \dolistloop\blx@datamodel@lists%
+ \do{pageref}}
+
+% Used to pass regexps to .bcf
+\def\regexp#1{\expandafter\zap@space\detokenize{#1} \@empty}
+
+% Have to do this otherwise the '~'s in the .bcf strings are not expanded
+% This is done for the .bcf later but since we have to do all the
+% data model things much earlier, have to set this here and reset on finishing
+\let\blx@tsave~
+\let~\space
+% Data model and supporting macros must be loaded early
+\blx@inputonce{blx-dm.def}{biblatex default data model}{}{}{}{}
+\let~\blx@tsave
+
+% We need to now load any style data model
+% Order of precedence is:
+% <datamodel option>.dbx
+% <style option>.dbx
+% <citestyle option>.dbx and <bibstyle option>.dbx
+% This has to be done before the real options processing so we need to
+% pick out just these four options to look at. You can't do this with keyval,
+% you have to use kvoptions. So, pick out these four, pass through all
+% others and delete datamodel option as we don't care about it when we come
+% to really set options below
+\SetupKeyvalOptions{
+ family=blx@opt@eldt,
+ prefix=blx@opt@eldt@}
+\DeclareStringOption{datamodel}
+\DeclareStringOption{style}
+\DeclareStringOption{citestyle}
+\DeclareStringOption{bibstyle}
+\DeclareDefaultOption{}
+\ProcessLocalKeyvalOptions{blx@opt@eldt}
+\ifx\blx@opt@eldt@datamodel\@empty
+ \ifx\blx@opt@eldt@style\@empty
+ \ifx\blx@opt@eldt@citestyle\@empty
+ \else
+ \blx@inputonce{\blx@opt@eldt@citestyle.dbx}{biblatex citestyle data model}{}{}{}{}
+ \fi
+ \ifx\blx@opt@eldt@bibstyle\@empty
+ \else
+ \blx@inputonce{\blx@opt@eldt@bibstyle.dbx}{biblatex bibstyle data model}{}{}{}{}
+ \fi
+ \else
+ \blx@inputonce{\blx@opt@eldt@style.dbx}{biblatex style data model}{}{}{}{}
+ \fi
+\else
+ \blx@inputonce{\blx@opt@eldt@datamodel.dbx}{biblatex style data model}{}{}{}{}
+\fi
+\DisableKeyvalOption[action=undef,local]{blx@opt@eldt}{datamodel}
+
+% Override with user-defined data model if there is one
+\blx@inputonce{biblatex-dm.cfg}{biblatex custom data model}{}{}{}{}
+
+% Initialise option datatypes lists
+\global\let\blx@bcf@options@scope@global\@empty
+\global\let\blx@bcf@options@scope@type\@empty
+\global\let\blx@bcf@options@scope@entry\@empty
+\global\let\blx@bcf@options@scope@namelist\@empty
+\global\let\blx@bcf@options@scope@name\@empty
+\global\let\blx@globalopts@datatypes\@empty
+\global\let\blx@typeopts@datatypes\@empty
+\global\let\blx@entryopts@datatypes\@empty
+\global\let\blx@namelistopts@datatypes\@empty
+\global\let\blx@nameopts@datatypes\@empty
+\def\do#1{%
+ \global\cslet{blx@globalopts@#1}\@empty
+ \global\cslet{blx@typeopts@#1}\@empty
+ \global\cslet{blx@entryopts@#1}\@empty
+ \global\cslet{blx@namelistopts@#1}\@empty
+ \global\cslet{blx@nameopts@#1}\@empty}
+\expandafter\expandafter\expandafter
+\docsvlist
+\expandafter\expandafter\expandafter
+{\csname blx@datamodel@constant@optiondatatypes\endcsname}
+
+% Helper for collecting options and datatypes
+% {<datatype>}{<scope>}{<name>}
+\def\blx@collectopts#1#2#3{%
+ \ifinlistcs{#1}{#2@datatypes}
+ {}
+ {\listcsgadd{#2@datatypes}{#1}}%
+ \ifinlistcs{#3}{#2@#1}
+ {}
+ {\listcsgadd{#2@#1}{#3}}}
+
+
+% entry, namelist, name scopes are input/handled on the backend side
+% if we want to see the info back on the biblatex side, we need the backend
+% to pass the info through via the .bbl file
+\def\blx@declareblxopt@extrahandler@entry#1{%
+ \csgdef{blx@bcf@backendout@entry@#1}{1}}
+\def\blx@declareblxopt@extrahandler@namelist#1{%
+ \csgdef{blx@bcf@backendout@namelist@#1}{1}}
+\def\blx@declareblxopt@extrahandler@name#1{%
+ \csgdef{blx@bcf@backendout@name@#1}{1}}
+
+% {<option scope>}[<datatype>]{<key>}[<value>]{<code>}
+\protected\def\blx@declareblxopt#1{%
+ \@ifnextchar[%]
+ {\blx@declareblxopt@i#1}
+ {\blx@declareblxopt@i#1[]}}
+
+\def\blx@declareblxopt@i#1[#2]#3{%
+ \begingroup
+ \ifblank{#2}
+ {\def\blx@tempa{boolean}}
+ {\ifcsundef{blx@#1opts@#2}
+ {\blx@warn@badoptdt{#2}%
+ \def\blx@tempa{boolean}}
+ {\def\blx@tempa{#2}}}%
+ \expandafter\blx@collectopts\expandafter{\blx@tempa}{blx@#1opts}{#3}%
+ \ifcsundef{blx@declareblxopt@extrahandler@#1}
+ {}
+ {\csuse{blx@declareblxopt@extrahandler@#1}{#3}}%
+ \endgroup
+ \@ifnextchar[%]
+ {\csuse{blx@defblxopt@#1opt}{#3}}
+ {\csuse{blx@defblxopt@#1opt}{#3}[]}}
+
+\long\def\blx@defblxopt@globalopt#1[#2]#3{%
+ \blx@kv@ifkeyundef{blx@opt@ldt}{#1}
+ {\blx@kv@ifkeyundef{blx@opt@pre}{#1}
+ {\ifblank{#2}
+ {\blx@kv@defkey{blx@opt@pre}{#1}{#3}}
+ {\blx@kv@defkey{blx@opt@pre}{#1}[{#2}]{#3}}}
+ {\blx@err@optdef{#1}{pre/global}}}
+ {\blx@err@optdef{#1}{ldt/global}}}
+
+\long\def\blx@defblxopt@typeentryopt#1#2[#3]#4{%
+ \blx@kv@ifkeyundef{blx@opt@#1}{#2}
+ {\ifblank{#3}
+ {\blx@kv@defkey{blx@opt@#1}{#2}{#4}}
+ {\blx@kv@defkey{blx@opt@#1}{#2}[{#3}]{#4}}}
+ {\blx@err@optdef{#2}{#1}}}
+
+\def\blx@defblxopt@typeopt{\blx@defblxopt@typeentryopt{typ}}
+\def\blx@defblxopt@entryopt{\blx@defblxopt@typeentryopt{ent}}
+\def\blx@defblxopt@nameopt{\blx@defblxopt@typeentryopt{name}}
+\def\blx@defblxopt@namelistopt{\blx@defblxopt@typeentryopt{namelist}}
+
+% The Declare*Option macros are for options which need to be visible
+% to biblatex. For options which only biber needs to see, they can be
+% passed to the .bcf directly using \blx@collectopts
+% [<datatype>]{<key>}[<default value>]{<code>}
+\newcommand*{\DeclareBibliographyOption}{\blx@declareblxopt{global}}
+\newcommand*{\DeclareTypeOption}{\blx@declareblxopt{type}}
+\newcommand*{\DeclareEntryOption}{\blx@declareblxopt{entry}}
+
+% we'll assume that \blx@optscopes is non-empty from now on
+\newcommand*{\blx@optscopes}{}
+\forcsvlist{\listadd\blx@optscopes}{global,type,entry}
+
+\long\def\blx@defblxopt@loopscopes@i#1[#2]#3#4{%
+ \csuse{blx@defblxopt@#4opt}{#1}[{#2}]{#3}}
+
+\long\def\blx@defblxopt@loopscopes#1[#2]#3{%
+ \forlistloop{\blx@defblxopt@loopscopes@i{#1}[{#2}]{#3}}{\blx@optscopes}}
+
+% {<option scopes>}[<datatype>]{<key>}[<default value>]{<code>}
+\newrobustcmd*{\DeclareBiblatexOption}[1]{%
+ \let\blx@optscopes\@empty
+ \forcsvlist{\listadd\blx@optscopes}{#1}%
+ \blx@DeclareBiblatexOption@i}
+
+\newrobustcmd*{\blx@DeclareBiblatexOption@i}[2][]{%
+ \begingroup
+ \ifblank{#1}
+ {\def\blx@tempa{boolean}}
+ {\let\blx@tempb\@secondoftwo
+ \def\do##1{%
+ \ifcsundef{blx@##1opts@#1}
+ {\let\blx@tempb\@firstoftwo\listbreak}
+ {}}%
+ \dolistloop{\blx@optscopes}%
+ \blx@tempb
+ {\blx@warn@badoptdt{#1}%
+ \def\blx@tempa{boolean}}
+ {\def\blx@tempa{#1}}}%
+ \def\do##1{%
+ \expandafter\blx@collectopts\expandafter{\blx@tempa}{blx@##1opts}{#2}%
+ \ifcsundef{blx@declareblxopt@extrahandler@##1}
+ {}
+ {\csuse{blx@declareblxopt@extrahandler@##1}{#2}}}%
+ \dolistloop{\blx@optscopes}%
+ \endgroup
+ \@ifnextchar[%]
+ {\blx@defblxopt@loopscopes{#2}}
+ {\blx@defblxopt@loopscopes{#2}[]}}
+
+% this macro is internal for now because options declared with it need
+% support on the backend side and are not useful for document or style authors
+% {<option scopes>}[<datatype>]{<key>}
+\newrobustcmd*{\blx@DeclareBackendOption}[1]{%
+ \let\blx@optscopes\@empty
+ \forcsvlist{\listadd\blx@optscopes}{#1}%
+ \blx@DeclareBackendOption@i}
+
+\newrobustcmd*{\blx@DeclareBackendOption@i}[2][]{%
+ \begingroup
+ \ifblank{#1}
+ {\def\blx@tempa{boolean}}
+ {\let\blx@tempb\@secondoftwo
+ \def\do##1{%
+ \ifcsundef{blx@##1opts@#1}
+ {\let\blx@tempb\@firstoftwo\listbreak}
+ {}}%
+ \dolistloop{\blx@optscopes}%
+ \blx@tempb
+ {\blx@warn@badoptdt{#1}%
+ \def\blx@tempa{boolean}}
+ {\def\blx@tempa{#1}}}%
+ \def\do##1{%
+ \expandafter\blx@collectopts\expandafter{\blx@tempa}{blx@##1opts}{#2}}%
+ \dolistloop{\blx@optscopes}%
+ \endgroup}
+
+% per-entry inheritance blocking option for biber
+\blx@DeclareBackendOption{entry}[string]{noinherit}
+
+
+% nametemplates meta-option entry/namelist/name scope
+% this meta option is resolved by Biber
+\blx@DeclareBackendOption{entry,namelist,name}[string]{nametemplates}
+\gdef\blx@bcf@backendin@entry@nametemplates{sortingnamekeytemplatename,%
+ uniquenametemplatename,labelalphanametemplatename}%
+\gdef\blx@bcf@backendin@namelist@nametemplates{sortingnamekeytemplatename,%
+ uniquenametemplatename,labelalphanametemplatename}%
+\gdef\blx@bcf@backendin@name@nametemplates{sortingnamekeytemplatename,%
+ uniquenametemplatename,labelalphanametemplatename}%
+
+
+
+% Misc globalopts
+\blx@DeclareBackendOption{global}[xml]{datamodel}
+\blx@collectopts{string}{blx@globalopts}{controlversion}
+
+\newcommand*{\labelalphaothers}{+}
+\newcommand*{\sortalphaothers}{\labelalphaothers}
+\blx@DeclareBackendOption{global,type}[string]{alphaothers}
+\blx@DeclareBackendOption{global,type}[string]{sortalphaothers}
+
+% date, eventdate, urldate etc.
+\def\abx@dodates{\dolistloop\blx@datamodel@dates}
+% year, endyear, month, endmonth etc.
+\def\abx@dodateparts{\expandafter\docsvlist\expandafter{\blx@dateparts}}
+
+% '', event, url, orig etc.
+\def\do#1{%
+ \blx@stripfromendinto{#1}{date}\blx@datetype
+ \listxadd\blx@datetypes{\blx@datetype}}
+\abx@dodates
+% main date field has an empty prefix (''date) which can't be added to a list
+% and so do it explicity
+% This is one of the few (only?) hard-coded datamodel assumptions but it is
+% very unlikely that anyone would *remove* the main date field in a custom application ...
+\def\abx@dodatetypes{\do{}\dolistloop\blx@datetypes}
+
+% Sanity check on date field names - they *must* end in 'date' to make things easier/possible later
+\def\do#1{%
+ \blx@ifstrendswith{#1}{date}
+ {}
+ {\blx@error
+ {Invalid date field name '#1'}
+ {Date fields in the datamodel must end in the string 'date' but '#1' doesn't}}}
+\abx@dodates
+
+% date meta-information option fallbacks
+\def\do#1{%
+ \cslet{#1datecircaprint}\@empty
+ \cslet{#1enddatecircaprint}\@empty
+ \cslet{#1datecircaprintiso}\@empty
+ \cslet{#1enddatecircaprintiso}\@empty
+ \cslet{#1dateuncertainprint}\@empty
+ \cslet{#1enddateuncertainprint}\@empty
+ \cslet{#1dateeraprint}\@gobble
+ \cslet{#1dateeraprintpre}\@gobble
+ \csdef{if#1dateera}##1{\@secondoftwo}%
+ \csdef{if#1enddateera}##1{\@secondoftwo}%
+ \cslet{if#1datecirca}\@secondoftwo
+ \cslet{if#1enddatecirca}\@secondoftwo
+ \cslet{if#1datejulian}\@secondoftwo
+ \cslet{if#1enddatejulian}\@secondoftwo
+ \cslet{if#1dateuncertain}\@secondoftwo
+ \cslet{if#1enddateuncertain}\@secondoftwo
+ \cslet{if#1dateunknown}\@secondoftwo
+ \cslet{if#1enddateunknown}\@secondoftwo}
+\abx@dodatetypes
+\do{labeldate}
+
+% These are internal fields/booleans which are not part of the data model but
+% which need to be dealt with along with data model fields in places
+\def\do#1{%
+ \listxadd\blx@datemetafields{#1dateera}%
+ \listxadd\blx@datemetafields{#1enddateera}%
+ \listxadd\blx@datemetafields{#1dateunspecified}}
+\abx@dodatetypes
+
+
+\def\do#1{%
+ \listxadd\blx@datemetabooleans{#1datecirca}%
+ \listxadd\blx@datemetabooleans{#1enddatecirca}%
+ \listxadd\blx@datemetabooleans{#1datejulian}%
+ \listxadd\blx@datemetabooleans{#1enddatejulian}%
+ \listxadd\blx@datemetabooleans{#1dateuncertain}%
+ \listxadd\blx@datemetabooleans{#1enddateuncertain}%
+ \listxadd\blx@datemetabooleans{#1dateunknown}%
+ \listxadd\blx@datemetabooleans{#1enddateunknown}}
+\abx@dodatetypes
+
+\def\do#1{%
+ \listxadd\blx@namepartmetafields{#1namehash}%
+ \listxadd\blx@namepartmetafields{#1fullhash}%
+ \listxadd\blx@namepartmetafields{#1bibnamehash}}
+\abx@donameparts
+
+\def\do#1{%
+ \listxadd\blx@labeldatepartfields{label#1}}
+\abx@dodateparts
+
+\def\abx@dointernalfields{%
+ \do{clonesourcekey}%
+ \do{labeldate}%
+ \do{labeldatesource}%
+ \do{labeldateera}%
+ \do{labelenddateera}%
+ \do{labelyear}%
+ \do{labelendyear}%
+ \do{labelmonth}%
+ \do{labelendmonth}%
+ \do{labelday}%
+ \do{labelendday}%
+ \do{labelhour}%
+ \do{labelendhour}%
+ \do{labelminute}%
+ \do{labelendminute}%
+ \do{labelsecond}%
+ \do{labelendsecond}%
+ \do{labeltimezone}%
+ \do{labelendtimezone}%
+ \do{labelyeardivision}%
+ \do{labelendyeardivision}%
+ \do{entrykey}%
+ \do{entryset}%
+ \do{entrysetcount}%
+ \do{entrytype}%
+ \do{extraalpha}%
+ \do{extraname}%
+ \do{extratitle}%
+ \do{extratitleyear}%
+ \do{extradate}%
+ \do{fullhash}%
+ \do{labelalpha}%
+ \do{labelnumber}%
+ \do{labelprefix}%
+ \do{labeltitleyear}%
+ \do{localnumber}%
+ \do{namehash}%
+ \do{bibnamehash}%
+ \do{options}%
+ \do{sortinit}%
+ \do{sortinithash}%
+ \dolistloop\blx@datemetafields
+ \dolistloop\blx@namepartmetafields
+ \dolistloop\blx@labeldatepartfields}
+
+\def\abx@dobooleans{%
+ \do{crossrefsource}%
+ \do{xrefsource}%
+ \do{singletitle}%
+ \do{uniquetitle}%
+ \do{uniquebaretitle}%
+ \do{uniquework}%
+ \do{uniqueprimaryauthor}%
+ \do{nocite}%
+ \dolistloop\blx@datemetabooleans}
+
+% Date datatype fields
+\def\do#1{%
+ \protected\csdef{blx@imc@print#1date}{}%
+ \protected\csdef{blx@imc@print#1dateextra}{}%
+ \protected\csdef{blx@imc@print#1time}{}}
+\abx@dodatetypes
+
+% \blx@regimcs doesn't work in do-lists nicely so use internal macro it calls
+\def\do#1{%
+ \xappto\blx@blxinit{\csletcs{print#1date}{blx@imc@print#1date}}%
+ \xappto\blx@blxinit{\csletcs{print#1time}{blx@imc@print#1time}}%
+ \xappto\blx@blxinit{\csletcs{print#1dateextra}{blx@imc@print#1dateextra}}}
+\abx@dodatetypes
+
+% Set up circa, julian and uncertain date internals
+\def\blx@makeifdatemeta@bools@i#1#2{%
+ \appto\blx@blxinit{%
+ \blx@makeifdatemeta@bools{#1}{#2}}}
+
+\def\blx@makeifdatemeta@bools#1#2{%
+ \csdef{if#1date#2}{\iftoggle{abx@bool@#1date#2}}%
+ \csdef{if#1enddate#2}{\iftoggle{abx@bool@#1enddate#2}}%
+ \appto\blx@TE@hook{%
+ \csdef{if#1date#2}{\blx@TE{\iftoggle{abx@bool@#1date#2}}}%
+ \csdef{if#1enddate#2}{\blx@TE{\iftoggle{abx@bool@#1enddate#2}}}}}
+
+% Set up date era internals
+\def\blx@makeifdatemeta@fields@i#1{%
+ \appto\blx@blxinit{%
+ \blx@makeifdatemeta@fields{#1}}}
+
+\def\blx@makeifdatemeta@fields#1{%
+ \csdef{if#1dateera}##1{\ifcsstring{abx@field@@@#1dateera}{##1}}%
+ \csdef{if#1enddateera}##1{\ifcsstring{abx@field@@@#1enddateera}{##1}}%
+ \appto\blx@TE@hook{%
+ \csdef{if#1dateera}##1{\blx@TE{\ifcsstring{abx@field@@@#1dateera}{##1}}}%
+ \csdef{if#1enddateera}##1{\blx@TE{\ifcsstring{abx@field@@@#1enddateera}{##1}}}}}
+
+% Create date meta information boolean tests
+\def\do#1{%
+ \blx@makeifdatemeta@bools@i{#1}{circa}%
+ \blx@makeifdatemeta@bools@i{#1}{julian}%
+ \blx@makeifdatemeta@bools@i{#1}{uncertain}%
+ \blx@makeifdatemeta@bools@i{#1}{unknown}}
+\abx@dodatetypes
+
+% Create date meta information field tests
+\def\do#1{%
+ \blx@makeifdatemeta@fields@i{#1}}
+\abx@dodatetypes
+
+% Resolve date meta information tests and print routines for labeldate
+% We have to test here, in each \def, whether the labeldatesource
+% is a real date field or not. If it's not, then we don't want to use
+% any of the meta-information and so make the conditionals always return false
+% This can't be neater by testing for the \abx@field@@@labeldatesource value
+% earlier because its not available until the tests are in scope.
+\appto\blx@blxinit{%
+ \ifdefstring\blx@dateera{astronomical}
+ {\protected\def\dateeraprintpre#1{%
+ \iffieldnum{#1}
+ {\begingroup
+ \let\blx@tempa\@empty
+ \blx@ifstrendswith{#1}{endyear}
+ {\blx@stripfromendinto{#1}{endyear}\blx@datetype
+ \def\blx@tempa{end}}
+ {\blx@stripfromendinto{#1}{year}\blx@datetype}%
+ \csuse{if\blx@datetype\blx@tempa dateera}{bce}
+ {\ifnumless{0-\thefield{#1}}{0}
+ {\csuse{bibdateera\blx@tempa prefix}}
+ {}}
+ {}%
+ \endgroup}
+ {}}}
+ {\protected\def\dateeraprint#1{%
+ \iffieldnum{#1}
+ {\begingroup
+ \let\blx@tempa\@empty
+ \blx@ifstrendswith{#1}{endyear}
+ {\blx@stripfromendinto{#1}{endyear}\blx@datetype
+ \def\blx@tempa{end}}
+ {\blx@stripfromendinto{#1}{year}\blx@datetype}%
+ \csuse{if\blx@datetype\blx@tempa dateera}{bce}
+ {\ifnum\numexpr0-\thefield{#1}\relax<\blx@dateeraauto
+ % \midsentence is to suppress automatic capitalisation
+ \printdelim{dateeradelim}\midsentence\bibstring{\blx@dateera@bce}\relax
+ \fi}
+ {\ifnumless{\thefield{#1}}\blx@dateeraauto
+ {\printdelim{dateeradelim}\midsentence\bibstring{\blx@dateera@ce}}
+ {}}%
+ \endgroup}
+ {}}}%
+ \iftoggle{blx@labeldateparts}
+ {\def\iflabeldateera#1{% start era
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\ifcsstring{abx@field@@@\abx@field@@@labeldatesource dateera}{#1}}
+ {\@secondoftwo}}%
+ \appto\blx@TE@hook{\def\iflabeldateera#1{%
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\blx@TE{\ifcsstring{abx@field@@@\abx@field@@@labeldatesource dateera}{#1}}}
+ {\@secondoftwo}}}%
+ % end era
+ \def\iflabelenddateera#1{%
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\ifcsstring{abx@field@@@\abx@field@@@labeldatesource enddateera}{#1}}
+ {\@secondoftwo}}%
+ \appto\blx@TE@hook{\def\iflabelenddateera#1{%
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\blx@TE{\ifcsstring{abx@field@@@\abx@field@@@labeldatesource enddateera}{#1}}}
+ {\@secondoftwo}}}%
+ % start circa
+ \def\iflabeldatecirca{%
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\iftoggle{abx@bool@\abx@field@@@labeldatesource datecirca}}
+ {\@secondoftwo}}%
+ \appto\blx@TE@hook{\def\iflabeldatecirca{%
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\blx@TE{\iftoggle{abx@bool@\abx@field@@@labeldatesource datecirca}}}
+ {\@secondoftwo}}}%
+ % end circa
+ \def\iflabelenddatecirca{%
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\iftoggle{abx@bool@\abx@field@@@labeldatesource enddatecirca}}
+ {\@secondoftwo}}%
+ \appto\blx@TE@hook{\def\iflabelenddatecirca{%
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\blx@TE{\iftoggle{abx@bool@\abx@field@@@labeldatesource enddatecirca}}}
+ {\@secondoftwo}}}%
+ % start julian
+ \def\iflabeldatejulian{%
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\iftoggle{abx@bool@\abx@field@@@labeldatesource datejulian}}
+ {\@secondoftwo}}%
+ \appto\blx@TE@hook{\def\iflabeldatejulian{%
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\blx@TE{\iftoggle{abx@bool@\abx@field@@@labeldatesource datejulian}}}
+ {\@secondoftwo}}}%
+ % end julian
+ \def\iflabelenddatejulian{%
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\iftoggle{abx@bool@\abx@field@@@labeldatesource enddatejulian}}
+ {\@secondoftwo}}%
+ \appto\blx@TE@hook{\def\iflabelenddatejulian{%
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\blx@TE{\iftoggle{abx@bool@\abx@field@@@labeldatesource enddatejulian}}}
+ {\@secondoftwo}}}%
+ % start uncertain
+ \def\iflabeldateuncertain{%
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\iftoggle{abx@bool@\abx@field@@@labeldatesource dateuncertain}}
+ {\@secondoftwo}}%
+ \appto\blx@TE@hook{\def\iflabeldateuncertain{%
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\blx@TE{\iftoggle{abx@bool@\abx@field@@@labeldatesource dateuncertain}}}
+ {\@secondoftwo}}}%
+ % end uncertain
+ \def\iflabelenddateuncertain{%
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\iftoggle{abx@bool@\abx@field@@@labeldatesource enddateuncertain}}
+ {\@secondoftwo}}%
+ \appto\blx@TE@hook{\def\iflabelenddateuncertain{%
+ \xifinlist{\abx@field@@@labeldatesource date}\blx@datamodel@dates
+ {\blx@TE{\iftoggle{abx@bool@\abx@field@@@labeldatesource enddateuncertain}}}
+ {\@secondoftwo}}}}%
+ {}}
+
+% Name toggles like \ifauthor etc. need to be dynamically created for all
+% name datatypes in the data model and we have to do this here after the
+% datamodel is available. Need to be careful about expansions here as these
+% go into hooks to be executed later
+
+% toggle to say if we have set any <name>inits to true. Used for conflict
+% tests with uniquename settings (see \AtEndPreamble below)
+\newtoggle{abx@bool@xinits}
+% define <name>inits options and tests (terseinits is global for all initials)
+\def\do#1{%
+ \newtoggle{abx@bool@#1inits}%
+ \appto\blx@blxinit{%
+ \csdef{if#1inits}{\iftoggle{abx@bool@#1inits}}%
+ \appto\blx@TE@hook{%
+ \csdef{if#1inits}{\blx@TE{\iftoggle{abx@bool@#1inits}}}}}%
+ \DeclareBiblatexOption{global,type,entry,namelist,name}[boolean]{#1inits}[true]{%
+ \settoggle{abx@bool@#1inits}{##1}}}
+\abx@donameparts
+
+\def\do#1{%
+ % Define use<name> options scope for biber
+ \blx@DeclareBackendOption{global,type,entry}[boolean]{use#1}%
+ % Define name toggles
+ \newtoggle{blx@use#1}\toggletrue{blx@use#1}%
+ % Define tests
+ \appto\blx@blxinit{%
+ \csdef{ifuse#1}{\iftoggle{blx@use#1}}%
+ \appto\blx@TE@hook{%
+ \csdef{ifuse#1}{\blx@TE{\iftoggle{blx@use#1}}}}}}
+\abx@donames
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Since these are bare counters which define \the<string>, save any current values
+% (memoir, titling, koma etc. have a \theauthor macro, for example) and restore at
+% end of package
+\def\do#1{%
+ \csletcs{blx@compat@the#1}{the#1}%
+ \newcounter{#1}%
+ \newcounter{saved#1}%
+ \appto\abx@dobooleans{\do{more#1}}}
+
+\abx@donames
+\abx@dornames
+\abx@dolists
+%\abx@dorlists
+
+\AtEndOfPackage{%
+ \def\do#1{\csletcs{the#1}{blx@compat@the#1}}%
+ \abx@donames
+ \abx@dornames
+ \abx@dolists}
+
+\def\do#1{\newtoggle{abx@bool@#1}}
+\abx@dobooleans
+
+\def\do#1{\expandafter\newlength\expandafter{\csname #1width\endcsname}}
+\abx@dolabelfields
+
+\def\do#1{\expandafter\newlength\expandafter{\csname local#1width\endcsname}}
+\abx@dolabelwidths
+
+\protected\def\blx@resetdata{%
+ \let\blx@saved@do\do
+ \def\do##1{%
+ \csundef{abx@fieldmssource@field@##1}%
+ \csundef{abx@fieldmssource@msform@##1}%
+ \csundef{abx@fieldmssource@mslang@##1}}%
+ \abx@dorfields
+ \abx@dornames
+ \let\do\blx@imc@clearname
+ \abx@donames
+ \let\do\blx@imc@clearlist
+ \abx@dolists
+ \let\do\blx@imc@clearfield
+ \abx@dofields
+ \abx@dointernalfields
+ \ifundef\abx@nameparts@defined
+ {}
+ {\def\do##1{\csundef{abx@nameparts@##1}}%
+ \dolistloop\abx@nameparts@defined}%
+ \let\abx@nameparts@defined\@empty
+ \ifundef\abx@listitems@defined
+ {}
+ {\def\do##1{\csundef{abx@listitems@##1}}%
+ \dolistloop\abx@listitems@defined}%
+ \let\abx@listitems@defined\@empty
+ \ifundef\abx@annotation@defined
+ {}
+ {\def\do##1{\csundef{abx@annotation@##1}}%
+ \dolistloop\abx@annotation@defined}%
+ \let\abx@annotation@defined\@empty
+ \def\do##1{\togglefalse{abx@bool@##1}}%
+ \abx@dobooleans
+ \let\do\blx@saved@do
+ \c@citecounter\z@
+ \iftoggle{blx@bibliography}
+ {\c@maxnames\blx@maxbibnames\relax
+ \c@minnames\blx@minbibnames\relax}
+ {\c@maxnames\blx@maxcitenames\relax
+ \c@minnames\blx@mincitenames\relax}%
+ \c@maxitems\blx@maxitems\relax
+ \c@minitems\blx@minitems\relax}
+
+\protected\def\blx@saveentry{%
+ \let\blx@saved@do\do
+ \let\do\blx@savefieldmssource
+ \abx@dorfields
+ \abx@dornames
+ \let\do\blx@savename
+ \abx@donames
+ \let\do\blx@saverelname
+ \dolistloop\abx@dorelnames
+ \let\do\blx@savelist
+ \abx@dolists
+ \let\do\blx@saverellist
+ \dolistloop\abx@dorellists
+ \let\do\blx@savefield
+ \abx@dofields
+ \abx@dointernalfields
+ \let\do\blx@saverelfield
+ \dolistloop\abx@dorelfields
+ \ifundef\abx@savedannotation@defined
+ {}
+ {\def\do##1{\csundef{abx@annotation@\blx@saveannotations@makesaved##1}}%
+ \dolistloop\abx@savedannotation@defined}%
+ \let\abx@savedannotation@defined\@empty
+ \ifundef\abx@annotation@defined
+ {}
+ {\let\do\blx@saveannotations
+ \dolistloop\abx@annotation@defined}%
+ \let\abx@savedannotation@defined\abx@annotation@defined
+ \ifundef\abx@savednameparts@defined
+ {}
+ {\def\do##1{\csundef{abx@nameparts@\blx@savenameparts@makesaved##1}}%
+ \dolistloop\abx@savednameparts@defined}%
+ \let\abx@savednameparts@defined\@empty
+ \ifundef\abx@nameparts@defined
+ {}
+ {\let\do\blx@savenameparts
+ \dolistloop\abx@nameparts@defined}%
+ \let\abx@savednameparts@defined\abx@nameparts@defined
+ \ifundef\abx@savedlistitems@defined
+ {}
+ {\def\do##1{\csundef{abx@listitems@\blx@savelistitems@makesaved##1}}%
+ \dolistloop\abx@savedlistitems@defined}%
+ \let\abx@savedlistitems@defined\@empty
+ \ifundef\abx@listitems@defined
+ {}
+ {\let\do\blx@savelistitems
+ \dolistloop\abx@listitems@defined}%
+ \let\abx@savedlistitems@defined\abx@listitems@defined
+ \let\do\blx@savebool
+ \abx@dobooleans
+ \let\do\blx@savedatetype
+ \abx@dodatetypes
+ \do{label}%
+ \c@savedcitecounter\c@citecounter
+ \let\do\blx@saved@do}
+
+\protected\def\blx@savefieldmssource#1{%
+ \csletcs{abx@fieldmssource@field@saved#1}{abx@fieldmssource@field@#1}%
+ \csletcs{abx@fieldmssource@msform@saved#1}{abx@fieldmssource@msform@#1}%
+ \csletcs{abx@fieldmssource@mslang@saved#1}{abx@fieldmssource@mslang@#1}}
+
+\def\blx@saveannotations@makesaved#1@#2{#1@saved#2}
+\protected\def\blx@saveannotations#1{%
+ \csletcs{abx@annotation@\blx@saveannotations@makesaved#1}{abx@annotation@#1}}
+
+\def\blx@savenameparts@makesaved#1@#2{#1@saved#2}
+\protected\def\blx@savenameparts#1{%
+ \csletcs{abx@nameparts@\blx@savenameparts@makesaved#1}{abx@nameparts@#1}}
+
+\def\blx@savelistitems@makesaved#1@#2{#1@saved#2}
+\protected\def\blx@savelistitems#1{%
+ \csletcs{abx@listitems@\blx@savelistitems@makesaved#1}{abx@listitems@#1}}
+
+% saves all alternates of multiscript fields
+\protected\def\blx@savefield#1{%
+ \blx@imc@iffieldundef{#1}
+ {}
+ {\blx@imc@ifmsentryfield{#1}
+ {\let\blx@tempi\@empty
+ \begingroup
+ \def\do##1{%
+ \begingroup
+ \def\do####1{%
+ \gappto\blx@tempi{\csletcs{abx@field@##1@####1@saved#1}{abx@field@##1@####1@#1}}}%
+ \dolistcsloop{abx@fieldmslangs@#1}%
+ \endgroup}%
+ \dolistcsloop{abx@fieldmsforms@#1}%
+ \endgroup
+ \blx@tempi\global\undef\blx@tempi}
+ {\csletcs{abx@field@@@saved#1}{abx@field@@@#1}}}}
+
+% override with field saved from \clearfield for related processing
+% argument is a triple which needs expanding
+% {{<msform>}{<mslang>}{field}}
+\protected\def\blx@saverelfield#1{%
+ \blx@saverelfield@i#1}
+% {<msform>}{<mslang>}{field}
+\protected\def\blx@saverelfield@i#1#2#3{%
+ \blx@imc@ifmsentryfield{#3}
+ {\csletcs{abx@field@#1@#2@saved#3}{abx@field@#1@#2@relsaved#3}}
+ {\csletcs{abx@field@@@saved#3}{abx@field@@@relsaved#3}}}
+
+% saves all alternates of multiscript lists
+\protected\def\blx@savelist#1{%
+ \blx@imc@iflistundef{#1}
+ {}
+ {\blx@imc@ifmsentryfield{#1}
+ {\let\blx@tempi\@empty
+ \begingroup
+ \def\do##1{%
+ \begingroup
+ \def\do####1{%
+ \gappto\blx@tempi{\csletcs{abx@list@##1@####1@saved#1}{abx@list@##1@####1@#1}}}%
+ \dolistcsloop{abx@fieldmslangs@#1}%
+ \endgroup}%
+ \dolistcsloop{abx@fieldmsforms@#1}%
+ \endgroup
+ \blx@tempi\global\undef\blx@tempi}
+ {\csletcs{abx@list@@@saved#1}{abx@list@@@#1}}%
+ \csletcs{etb@tgl@abx@bool@moresaved#1}{etb@tgl@abx@bool@more#1}%
+ \csname c@saved#1\endcsname\csname c@#1\endcsname}}
+
+% override with list saved from \clearlist for related processing
+% argument is a triple which needs expanding
+% {{<msform>}{<mslang>}{field}}
+\protected\def\blx@saverellist#1{%
+ \blx@saverellist@i#1}
+% {<msform>}{<mslang>}{field}
+\protected\def\blx@saverellist@i#1#2#3{%
+ \blx@imc@ifmsentryfield{#3}
+ {\csletcs{abx@list@#1@#2@saved#3}{abx@list@#1@#2@relsaved#3}}
+ {\csletcs{abx@list@@@saved#3}{abx@list@@@relsaved#3}}%
+ \csletcs{etb@tgl@abx@bool@moresaved#3}{etb@tgl@abx@bool@morerelsaved#3}%
+ \csname c@saved#3\endcsname\csname c@relsaved#3\endcsname}
+
+% saves all alternates of multiscript names
+\protected\def\blx@savename#1{%
+ \blx@imc@ifnameundef{#1}
+ {}
+ {\blx@imc@ifmsentryfield{#1}
+ {\let\blx@tempi\@empty
+ \begingroup
+ \def\do##1{%
+ \begingroup
+ \def\do####1{%
+ \gappto\blx@tempi{\csletcs{abx@name@##1@####1@saved#1}{abx@name@##1@####1@#1}}}%
+ \dolistcsloop{abx@fieldmslangs@#1}%
+ \endgroup}%
+ \dolistcsloop{abx@fieldmsforms@#1}%
+ \endgroup
+ \blx@tempi\global\undef\blx@tempi}
+ {\csletcs{abx@name@@@saved#1}{abx@name@@@#1}}%
+ \csletcs{etb@tgl@abx@bool@moresaved#1}{etb@tgl@abx@bool@more#1}%
+ \csname c@saved#1\endcsname\csname c@#1\endcsname}}
+
+% override with name saved from \clearname for related processing
+% argument is a triple which needs expanding
+% {{<msform>}{<mslang>}{field}}
+\protected\def\blx@saverelname#1{%
+ \blx@saverelname@i#1}
+% {<msform>}{<mslang>}{field}
+\protected\def\blx@saverelname@i#1#2#3{%
+ \blx@imc@ifmsentryfield{#3}
+ {\csletcs{abx@name@#1@#2@saved#3}{abx@name@#1@#2@relsaved#3}}
+ {\csletcs{abx@name@@@saved#3}{abx@name@@@relsaved#3}}%
+ \csletcs{etb@tgl@abx@bool@moresaved#3}{etb@tgl@abx@bool@morerelsaved#3}%
+ \csname c@saved#3\endcsname\csname c@relsaved#3\endcsname}
+
+\protected\def\blx@savebool#1{%
+ \csletcs{etb@tgl@abx@bool@saved#1}{etb@tgl@abx@bool@#1}}
+
+\protected\def\blx@savedatetype#1{%
+ \csletcs{blx@dateformat@saved#1date}{blx@dateformat@#1date}%
+ \protected\csedef{blx@imc@printsaved#1date}{%
+ \noexpand\csuse{mkdaterange\csuse{blx@dateformat@saved#1date}}
+ {saved#1}}%
+ \protected\csedef{blx@imc@printsaved#1dateextra}{%
+ \begingroup
+ % extradate is hard-coded in date macros, so reset it temporarily
+ \csletcs{abx@field@@@extradate}{abx@field@@@savedextradate}%
+ \noexpand\csuse{mkdaterange\csuse{blx@dateformat@saved#1date}extra}
+ {saved#1}%
+ \endgroup}%
+ \csletcs{blx@timeformat@saved#1time}{blx@timeformat@#1time}%
+ \protected\csedef{blx@imc@printsaved#1time}{%
+ \noexpand\csuse{mktimerange\csuse{blx@timeformat@saved#1time}}
+ {saved#1}}%
+ \csletcs{etb@tgl@blx@saved#1dateusetime}{etb@tgl@blx@#1dateusetime}%
+ % the datemetabooleans are here again for labeldate
+ \blx@savebool{#1datecirca}%
+ \blx@savebool{#1enddatecirca}%
+ \blx@savebool{#1datejulian}%
+ \blx@savebool{#1enddatejulian}%
+ \blx@savebool{#1dateuncertain}%
+ \blx@savebool{#1enddateuncertain}%
+ \blx@savebool{#1dateunknown}%
+ \blx@savebool{#1enddateunknown}%
+ \blx@makeifdatemeta@bools{saved#1}{circa}%
+ \blx@makeifdatemeta@bools{saved#1}{julian}%
+ \blx@makeifdatemeta@bools{saved#1}{uncertain}%
+ \blx@makeifdatemeta@bools{saved#1}{unknown}%
+ \blx@makeifdatemeta@fields{saved#1}%
+ \csletcs{printsaved#1date}{blx@imc@printsaved#1date}%
+ \csletcs{printsaved#1time}{blx@imc@printsaved#1time}%
+ \csletcs{printsaved#1dateextra}{blx@imc@printsaved#1dateextra}}
+
+% {<code>}
+\protected\long\def\blx@bbl@preamble#1{%
+ \gappto\abx@preamble{#1}}
+
+% {<message>}
+\protected\def\blx@bbl@warn#1{%
+ \begingroup
+ \def\item{\MessageBreak-\space}%
+ \def\break{\MessageBreak\space\space}%
+ \blx@warning@noline{%
+ Biber reported the following issues%
+ \ifdef\abx@field@@@entrykey
+ {\MessageBreak with '\abx@field@@@entrykey'}
+ {}%
+ :#1}%
+ \endgroup}
+
+% {<field>}{<code>}
+\newrobustcmd{\DeclareFieldInputHandler}[2]{%
+ \ifblank{#2}
+ {\csundef{blx@fih@#1}}
+ {\long\csdef{blx@fih@#1}##1{#2}}}
+\@onlypreamble\DeclareFieldInputHandler
+
+% {<list>}{<code>}
+\newrobustcmd*{\DeclareListInputHandler}[2]{%
+ \ifblank{#2}
+ {\csundef{blx@lih@#1}}
+ {\csdef{blx@lih@#1}##1{#2}}}
+\@onlypreamble\DeclareListInputHandler
+
+% {<name>}{<code>}
+\newrobustcmd*{\DeclareNameInputHandler}[2]{%
+ \ifblank{#2}
+ {\csundef{blx@nih@#1}}
+ {\csdef{blx@nih@#1}##1{#2}}}
+\@onlypreamble\DeclareNameInputHandler
+
+% {<entrykey>}{<refsection>}{<field>}{<refcontext>}{<value>}
+% No multiscript fields are set via this
+\long\def\blx@bbl@addentryfield#1#2#3#4#5{%
+ \csxappto{blx@data@#2@#4@#1}{%
+ \def\expandafter\noexpand\csname abx@field@#3\endcsname{#5}%
+ \def\expandafter\noexpand\csname abx@field@@@#3\endcsname{#5}}}
+
+% {<rangefield>}{<value>}
+% No range fields are multiscript
+\protected\def\blx@bbl@rangedef#1#2{%
+ \csxappto\blx@bbl@data{%
+ \def\expandafter\noexpand\csname abx@range@#1\endcsname{#2}}}
+
+% {<field>}{<value>}{<msform>}{<mslang>}
+\long\def\blx@bbl@addfield#1#2#3#4{%
+ \csxappto\blx@bbl@data{%
+ \def\expandafter\noexpand\csname abx@entryfield@#1\endcsname{1}% value doesn't matter
+ \def\expandafter\noexpand\csname abx@field@#1\endcsname{1}% value doesn't matter
+ \def\expandafter\noexpand\csname abx@field@#3@#4@#1\endcsname{#2}}}
+
+\blx@regimcs{\fieldmsforms \fieldmslangs}
+
+\def\blx@imc@fieldmsforms#1{\csuse{abx@fieldmsforms@#1}}
+\def\blx@imc@fieldmslangs#1{\csuse{abx@fieldmslangs@#1}}
+
+% [<msform>][<mslang>]{field}{value}
+\protected\long\def\blx@bbl@msfielddef{\blx@bbl@msdef{field}}
+\protected\long\def\blx@bbl@mslistdef{\blx@bbl@msdef{list}}
+\protected\long\def\blx@bbl@msnamedef{\blx@bbl@msdef{name}}
+
+\protected\long\def\blx@bbl@msdef#1{%
+ \@ifnextchar[%]
+ {\blx@bbl@msdef@i#1}
+ {\csuse{blx@bbl@#1def}{}{}}}
+
+% biber resolves all msform/mslang explicitly
+% and so we can detect multiscript fields simply
+% by the presence of a bracket here
+\protected\long\def\blx@bbl@msdef@i#1[#2][#3]{%
+ \csuse{blx@bbl@#1def}{#2}{#3}}
+
+% Biber always makes the msform/mslang of \fieldmssource explicit
+% These label*source fields are not normal fields as their *value*
+% is a triple of fieldname/form/lang
+% msform/mslang can be empty for non-multiscript sources in which case
+% the expansions of \abx@fieldmssource@ms*@<field> will be empty and these
+% are only used in places where empty expansion would therefore lead to a
+% the correct non-multiscript \abx@{field|list|name}@@@...
+% {<field>}{<value>}{<msform>}{<mslang>}
+\protected\long\def\blx@bbl@fieldmssourcedef#1#2#3#4{%
+ \csxappto\blx@bbl@data{%
+ \def\expandafter\noexpand\csname abx@fieldmssource@field@#1\endcsname{#2}%
+ \def\expandafter\noexpand\csname abx@fieldmssource@msform@#1\endcsname{#3}%
+ \def\expandafter\noexpand\csname abx@fieldmssource@mslang@#1\endcsname{#4}}}
+
+% {<msform>}{<mslang>}{<field>}{<value>}
+\protected\long\def\blx@bbl@fielddef#1#2#3#4{%
+ \def\NewValue{#4}%
+ \ifcsdef{blx@fih@#3}
+ {\csname blx@fih@#1\endcsname{#4}%
+ \ifdefvoid\NewValue}
+ {\@secondoftwo}
+ {}
+ {\csgappto\blx@bbl@data{%
+ \ifinlistcs{#1}{abx@fieldmsforms@#3}{}{\listcsadd{abx@fieldmsforms@#3}{#1}}%
+ \ifinlistcs{#2}{abx@fieldmslangs@#3}{}{\listcsadd{abx@fieldmslangs@#3}{#2}}}%
+ \blx@bbl@addfield{#3}{\expandonce\NewValue}{#1}{#2}}}
+
+% No multiscript fields are set via this
+\protected\long\def\blx@bbl@fieldedef#1#2{%
+ \edef\NewValue{#2}%
+ \ifcsdef{blx@fih@#1}
+ {\csname blx@fih@#1\expandafter
+ \endcsname\expandafter{\NewValue}%
+ \ifdefvoid\NewValue}
+ {\@secondoftwo}
+ {}
+ {\blx@bbl@addfield{#1}{\NewValue}{}{}}}
+
+\protected\long\def\blx@bbl@stringdef#1#2{%
+ \begingroup
+ \edef\blx@tempa{\endgroup
+ \blx@bbl@fielddef{}{}{#1}{\detokenize{#2}}}%
+ \blx@tempa}
+
+% Verbatim lists
+% {<list>}{<listcount>}
+\protected\def\blx@bbl@verbldef#1#2{%
+ \begingroup
+ \let\lverb\blx@bbl@verbladd
+ \def\blx@tempa{#1}%
+ \def\blx@tempb{#2}%
+ \let\blx@tempc\@empty
+ \let\NewValue\@empty}
+
+\protected\def\blx@bbl@verblend{%
+ \expandafter\blx@bbl@listdef\expandafter{\expandafter}\expandafter{\expandafter}\expandafter{\expandafter\blx@tempa\expandafter}\expandafter{\expandafter\blx@tempb\expandafter}\expandafter{\blx@tempc}%
+ \endgroup}
+
+\protected\def\blx@bbl@verbladd{%
+ \begingroup
+ \let\do\@makeother
+ \dospecials
+ \catcode\endlinechar=12\relax
+ \blx@bbl@verbladd@i}
+
+% Verbatim fields
+% {<field>}
+\protected\def\blx@bbl@verbdef#1{%
+ \begingroup
+ \let\verb\blx@bbl@verbadd
+ \def\blx@tempa{#1}%
+ \let\NewValue\@empty}
+
+\protected\def\blx@bbl@verbend{%
+ \ifcsdef{blx@fih@\blx@tempa}
+ {\csname blx@fih@\blx@tempa\expandafter
+ \endcsname\expandafter{\NewValue}%
+ \ifdefvoid\NewValue}
+ {\@secondoftwo}
+ {}
+ {\blx@bbl@addfield{\blx@tempa}{\NewValue}{}{}}%
+ \endgroup}
+
+\protected\def\blx@bbl@verbadd{%
+ \begingroup
+ \let\do\@makeother
+ \dospecials
+ \catcode\endlinechar=12\relax
+ \blx@bbl@verbadd@i}
+
+% xparse argument processors
+% because msform/mslang are optional and are followed in some cases by more
+% more optional arguments, they need supplying as empty in some cases
+% and this overrides the defaulting in xparse so we pre-process to force
+% defaulting in case of supplied empty arguments
+\def\blx@msformexpand#1{%
+ \ifblank{#1}{\let\ProcessedArgument\blx@msform}{\def\ProcessedArgument{#1}}}
+\def\blx@mslangexpand#1{%
+ \ifblank{#1}{\let\ProcessedArgument\blx@lmslang}{\def\ProcessedArgument{#1}}}
+
+% [<msform>][<mslang>]{<scope>}{<field>}{<name>}{<itemcount>}{<part>}{<isliteral>}{<value>}
+% No need to default form/lang as, if present, they are always defined by biber
+\DeclareDocumentCommand{\blx@bbl@annotationdef}
+ {O{} O{} m m m m m m m}
+ {\ifstrequal{#3}{field}
+ {\ifstrequal{#8}{1}
+ {\csxappto\blx@bbl@data{%
+ \listadd\noexpand\abx@annotation@defined{literal@field@#1@#2@#4@#5}%
+ \csdef{abx@annotation@literal@field@#1@#2@#4@#5}{#9}}}
+ {\csxappto\blx@bbl@data{%
+ \listadd\noexpand\abx@annotation@defined{field@#1@#2@#4@#5}%
+ \def\do####1{\listcsadd{abx@annotation@field@#1@#2@#4@#5}{####1}}%
+ \docsvlist{#9}}}}
+ {}%
+ \ifstrequal{#3}{item}
+ {\ifstrequal{#8}{1}
+ {\csxappto\blx@bbl@data{%
+ \listadd\noexpand\abx@annotation@defined{literal@item@#1@#2@#4@#5@#6}%
+ \csdef{abx@annotation@literal@item@#1@#2@#4@#5@#6}{#9}}}
+ {\csxappto\blx@bbl@data{%
+ \listadd\noexpand\abx@annotation@defined{item@#1@#2@#4@#5@#6}%
+ \def\do####1{\listcsadd{abx@annotation@item@#1@#2@#4@#5@#6}{####1}}%
+ \docsvlist{#9}}}}
+ {}%
+ \ifstrequal{#3}{part}
+ {\ifstrequal{#8}{1}
+ {\csxappto\blx@bbl@data{%
+ \listadd\noexpand\abx@annotation@defined{literal@part@#1@#2@#4@#5@#6@#7}%
+ \csdef{abx@annotation@literal@part@#1@#2@#4@#5@#6@#7}{#9}}}
+ {\csxappto\blx@bbl@data{%
+ \listadd\noexpand\abx@annotation@defined{part@#1@#2@#4@#5@#6@#7}%
+ \def\do####1{\listcsadd{abx@annotation@part@#1@#2@#4@#5@#6@#7}{####1}}%
+ \docsvlist{#9}}}}
+ {}}
+
+% [<msform>][<mslang>][<entryfield>][<annotationname>]
+\DeclareDocumentCommand{\blx@imc@getfieldannotation}
+ {>{\blx@msformexpand}O{\blx@msform}
+ >{\blx@mslangexpand}O{\blx@lmslang}
+ O{}
+ O{default}}
+ {\let\blx@tempa\@empty
+ \ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
+ \ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
+ \ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
+ \ifblank{#3}
+ {}
+ {\def\blx@tempa{#3}}%
+ \blx@resolve@annotation@label{\blx@tempa}%
+ \blx@imc@ifmsentryfield\blx@tempa
+ {\edef\blx@tempc{abx@annotation@literal@field@#1@#2@\blx@tempa @#4}}
+ {\edef\blx@tempc{abx@annotation@literal@field@@@\blx@tempa @#4}}%
+ \ifcsdef{\blx@tempc}
+ {\csuse{\blx@tempc}}
+ {}}
+
+% [<msform>][<mslang>][<entryfield>][<annotationname>][<item>]
+\DeclareDocumentCommand{\blx@imc@getitemannotation}
+ {>{\blx@msformexpand}O{\blx@msform}
+ >{\blx@mslangexpand}O{\blx@lmslang}
+ O{}
+ O{default}
+ O{\thelistcount}}
+ {\let\blx@tempa\@empty
+ \ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
+ \ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
+ \ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
+ \ifblank{#3}
+ {}
+ {\def\blx@tempa{#3}}%
+ \blx@resolve@annotation@label{\blx@tempa}%
+ \blx@imc@ifmsentryfield\blx@tempa
+ {\edef\blx@tempc{abx@annotation@literal@item@#1@#2@\blx@tempa @#4@#5}}
+ {\edef\blx@tempc{abx@annotation@literal@item@@@\blx@tempa @#4@#5}}%
+ \ifcsdef{\blx@tempc}
+ {\csuse{\blx@tempc}}
+ {}}
+
+% [<msform>][<mslang>][<entryfield>][<annotationname>][<item>]{<part>}
+\DeclareDocumentCommand{\blx@imc@getpartannotation}
+ {>{\blx@msformexpand}O{\blx@msform}
+ >{\blx@mslangexpand}O{\blx@lmslang}
+ O{}
+ O{default}
+ O{\thelistcount}
+ m}
+ {\let\blx@tempa\@empty
+ \ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
+ \ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
+ \ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
+ \ifblank{#3}
+ {}
+ {\def\blx@tempa{#3}}%
+ \blx@resolve@annotation@label{\blx@tempa}%
+ \blx@imc@ifmsentryfield\blx@tempa
+ {\edef\blx@tempc{abx@annotation@literal@part@#1@#2@\blx@tempa @#4@#5@#6}}
+ {\edef\blx@tempc{abx@annotation@literal@part@@@\blx@tempa @#4@#5@#6}}%
+ \ifcsdef{\blx@tempc}
+ {\csuse{\blx@tempc}}
+ {}}
+
+% [<msform>][<mslang>][<entryfield>][<annotationname>]{<annotation>}
+\DeclareDocumentCommand{\blx@imc@iffieldannotation}
+ {>{\blx@msformexpand}O{\blx@msform}
+ >{\blx@mslangexpand}O{\blx@lmslang}
+ O{}
+ O{default}
+ m}
+ {\let\blx@tempa\@empty
+ \ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
+ \ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
+ \ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
+ \ifblank{#3}
+ {}
+ {\def\blx@tempa{#3}}%
+ \blx@resolve@annotation@label{\blx@tempa}%
+ \blx@imc@ifmsentryfield\blx@tempa
+ {\edef\blx@tempc{abx@annotation@field@#1@#2@\blx@tempa @#4}}
+ {\edef\blx@tempc{abx@annotation@field@@@\blx@tempa @#4}}%
+ \ifinlistcs{#5}{\blx@tempc}}
+
+% [<msform>][<mslang>][<entryfield>][<annotationname>][<item>]{<annotation>}
+\DeclareDocumentCommand{\blx@imc@ifitemannotation}
+ {>{\blx@msformexpand}O{\blx@msform}
+ >{\blx@mslangexpand}O{\blx@lmslang}
+ O{}
+ O{default}
+ O{\thelistcount}
+ m}
+ {\let\blx@tempa\@empty
+ \ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
+ \ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
+ \ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
+ \ifblank{#3}
+ {}
+ {\def\blx@tempa{#3}}%
+ \blx@resolve@annotation@label{\blx@tempa}%
+ \blx@imc@ifmsentryfield\blx@tempa
+ {\edef\blx@tempc{abx@annotation@item@#1@#2@\blx@tempa @#4@#5}}
+ {\edef\blx@tempc{abx@annotation@item@@@\blx@tempa @#4@#5}}%
+ \ifinlistcs{#6}{\blx@tempc}}
+
+% [<msform>][<mslang>][<entryfield>][<annotationname>][<item>]{<part>}{<annotation>}
+\DeclareDocumentCommand{\blx@imc@ifpartannotation}
+ {>{\blx@msformexpand}O{\blx@msform}
+ >{\blx@mslangexpand}O{\blx@lmslang}
+ O{}
+ O{default}
+ O{\thelistcount}
+ m
+ m}
+ {\let\blx@tempa\@empty
+ \ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
+ \ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
+ \ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
+ \ifblank{#3}
+ {}
+ {\def\blx@tempa{#3}}%
+ \blx@resolve@annotation@label{\blx@tempa}%
+ \blx@imc@ifmsentryfield\blx@tempa
+ {\edef\blx@tempc{abx@annotation@part@#1@#2@\blx@tempa @#4@#5@#6}}
+ {\edef\blx@tempc{abx@annotation@part@@@\blx@tempa @#4@#5@#6}}%
+ \ifinlistcs{#7}{\blx@tempc}}
+
+ % [<msform>][<mslang>][<entryfield>][<annotationname>]
+\DeclareDocumentCommand{\blx@imc@hasfieldannotation}
+ {>{\blx@msformexpand}O{\blx@msform}
+ >{\blx@mslangexpand}O{\blx@lmslang}
+ O{}
+ O{default}}
+ {\let\blx@tempa\@empty
+ \ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
+ \ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
+ \ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
+ \ifblank{#3}
+ {}
+ {\def\blx@tempa{#3}}%
+ \blx@resolve@annotation@label{\blx@tempa}%
+ \blx@imc@ifmsentryfield\blx@tempa
+ {\edef\blx@tempc{abx@annotation@literal@field@#1@#2@\blx@tempa @#4}}
+ {\edef\blx@tempc{abx@annotation@literal@field@@@\blx@tempa @#4}}%
+ \ifcsdef{\blx@tempc}}
+
+% [<msform>][<mslang>][<entryfield>][<annotationname>][<item>]
+\DeclareDocumentCommand{\blx@imc@hasitemannotation}
+ {>{\blx@msformexpand}O{\blx@msform}
+ >{\blx@mslangexpand}O{\blx@lmslang}
+ O{}
+ O{default}
+ O{\thelistcount}}
+ {\let\blx@tempa\@empty
+ \ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
+ \ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
+ \ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
+ \ifblank{#3}
+ {}
+ {\def\blx@tempa{#3}}%
+ \blx@resolve@annotation@label{\blx@tempa}%
+ \blx@imc@ifmsentryfield\blx@tempa
+ {\edef\blx@tempc{abx@annotation@literal@item@#1@#2@\blx@tempa @#4@#5}}
+ {\edef\blx@tempc{abx@annotation@literal@item@@@\blx@tempa @#4@#5}}%
+ \ifcsdef{\blx@tempc}}
+
+% [<msform>][<mslang>][<entryfield>][<annotationname>][<item>]{<part>}
+\DeclareDocumentCommand{\blx@imc@haspartannotation}
+ {>{\blx@msformexpand}O{\blx@msform}
+ >{\blx@mslangexpand}O{\blx@lmslang}
+ O{}
+ O{default}
+ O{\thelistcount}
+ m}
+ {\let\blx@tempa\@empty
+ \ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
+ \ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
+ \ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
+ \ifblank{#3}
+ {}
+ {\def\blx@tempa{#3}}%
+ \blx@resolve@annotation@label{\blx@tempa}%
+ \blx@imc@ifmsentryfield\blx@tempa
+ {\edef\blx@tempc{abx@annotation@literal@part@#1@#2@\blx@tempa @#4@#5@#6}}
+ {\edef\blx@tempc{abx@annotation@literal@part@@@\blx@tempa @#4@#5@#6}}%
+ \ifcsdef{\blx@tempc}}
+
+% labeldatesource has a slightly different format than other <field>sources
+% that's one reason for a dedicated command, the other being that this command
+% is probably only used in contexts where \currentfield is not defined, so
+% the <datetype> argument is always required
+% [<annotationname>]{<datetype>}{<annotation>}
+\newcommand*{\blx@imc@ifdateannotation}[3][]{%
+ \ifblank{#1}
+ {\def\blx@tempa{default}}
+ {\def\blx@tempa{#1}}%
+ \def\blx@tempb{#2}%
+ \ifcsundef{abx@field@@@\blx@tempb source}
+ {}%
+ {\letcs\blx@tempa{abx@field@@@\blx@tempb source}%
+ \edef\blx@tempb{\blx@tempb date}}%
+ \ifinlistcs{#3}{abx@annotation@field@\blx@tempb @\blx@tempa}}
+
+% [<annotationname>]{<datetype>}
+\newcommand*{\blx@imc@hasdateannotation}[2][]{%
+ \ifblank{#1}
+ {\def\blx@tempa{default}}
+ {\def\blx@tempa{#1}}%
+ \def\blx@tempb{#2}%
+ \ifcsundef{abx@field@@@\blx@tempb source}
+ {}%
+ {\letcs\blx@tempa{abx@field@@@\blx@tempb source}%
+ \edef\blx@tempb{\blx@tempb date}}%
+ \ifboolexpr { test {\ifcsdef{abx@annotation@field@\blx@tempb @\blx@tempa}}
+ or
+ test {\ifcsdef{abx@annotation@literal@field@\blx@tempb @\blx@tempa}} }}
+
+% [<annotationname>]{<datetype>}
+\newcommand*{\blx@imc@getdateannotation}[2][]{%
+ \ifblank{#1}
+ {\def\blx@tempa{default}}
+ {\def\blx@tempa{#1}}%
+ \def\blx@tempb{#1}%
+ \ifcsundef{abx@field@@@\blx@tempb source}
+ {}%
+ {\letcs\blx@tempb{abx@field@@@\blx@tempb source}%
+ \edef\blx@tempb{\blx@tempb date}}%
+ \ifcsdef{abx@annotation@literal@field@\blx@tempb @\blx@tempa}
+ {\csuse{abx@annotation@literal@field@\blx@tempb @\blx@tempa}}
+ {}}
+
+\blx@regimcs{\iffieldannotation \ifitemannotation \ifpartannotation
+ \ifdateannotation \getfieldannotation \getitemannotation \getpartannotation
+ \getdateannotation \hasfieldannotation \hasitemannotation \haspartannotation
+ \hasdateannotation}
+
+% {<fieldname>}
+\def\blx@resolve@annotation@label#1{%
+ \ifcsundef{abx@fieldmssource@field@#1}
+ {}%
+ {\letcs\blx@tempa{abx@field@\abx@fieldmssource@msform@#1 @\abx@fieldmssource@mslang@#1 @\abx@fieldmssource@field@#1}}}
+
+\begingroup
+\catcode`\<=12
+\catcode`\>=12
+\uccode`\<=`\ %
+\uccode`\>=\endlinechar
+\uppercase{\gdef\blx@bbl@verbadd@i<#1>}{%
+ \endgroup
+ \edef\NewValue{\NewValue\detokenize{#1}}}
+\uppercase{\gdef\blx@bbl@verbladd@i<#1>}{%
+ \endgroup
+ \eappto\blx@tempc{{\detokenize{#1}}}}%
+\endgroup
+
+% {<counter>}{<value>}
+\protected\long\def\blx@bbl@cntdef#1#2{%
+ \csxappto\blx@bbl@data{%
+ \csname c@#1\endcsname#2\relax}}
+
+% {<boolean>}
+\protected\def\blx@bbl@booltrue#1{%
+ \csgappto\blx@bbl@data{%
+ \toggletrue{abx@bool@#1}}}
+
+\protected\def\blx@bbl@boolfalse#1{%
+ \csgappto\blx@bbl@data{%
+ \togglefalse{abx@bool@#1}}}
+
+% {<msform>}{<mslang>}{<list>}{<itemcount>}{<value>}
+% msform and mslang can be empty for non-multiscript lists
+\protected\def\blx@bbl@listdef#1#2#3#4#5{%
+ \def\NewCount{#4}%
+ \def\NewValue{#5}%
+ \ifcsdef{blx@lih@#3}
+ {\csname blx@lih@#1\endcsname{#5}%
+ \ifdefvoid\NewValue}
+ {\@secondoftwo}
+ {}
+ {\csxappto\blx@bbl@data{%
+ \ifinlistcs{#1}{abx@fieldmsforms@#3}{}{\listcsadd{abx@fieldmsforms@#3}{#1}}%
+ \ifinlistcs{#2}{abx@fieldmslangs@#3}{}{\listcsadd{abx@fieldmslangs@#3}{#2}}%
+ \csname c@#3\endcsname\NewCount\relax
+ \def\expandafter\noexpand\csname abx@entryfield@#3\endcsname{1}% value doesn't matter
+ \def\expandafter\noexpand\csname abx@list@#3\endcsname{1}% value doesn't matter
+ \def\expandafter\noexpand\csname abx@list@#1@#2@#3\endcsname{\expandonce\NewValue}}}}
+
+% {<msform>}{<mslang>}{<name>}{<itemcount>}{<nameoptions>}{<value>}
+% msform and mslang can be empty for non-multiscript names
+\protected\def\blx@bbl@namedef#1#2#3#4#5#6{%
+ \def\NewCount{#4}%
+ \def\NewOption{#5}%
+ \def\NewValue{#6}%
+ \ifcsdef{blx@nih@#1}
+ {\csname blx@nih@#1\endcsname{#6}%
+ \ifdefvoid\NewValue}
+ {\@secondoftwo}
+ {}
+ {\csxappto\blx@bbl@data{%
+ \ifinlistcs{#1}{abx@fieldmsforms@#3}{}{\listcsadd{abx@fieldmsforms@#3}{#1}}%
+ \ifinlistcs{#2}{abx@fieldmslangs@#3}{}{\listcsadd{abx@fieldmslangs@#3}{#2}}%
+ \csname c@#3\endcsname\NewCount\relax
+ \def\expandafter\noexpand\csname abx@entryfield@#3\endcsname{1}% value doesn't matter
+ \def\expandafter\noexpand\csname abx@name@#3\endcsname{1}% value doesn't matter
+ \def\expandafter\noexpand\csname abx@name@#1@#2@#3\endcsname{{\expandonce\NewOption}{\expandonce\NewValue}}}}}
+
+% blx@setp@<rs>@<sp> = map of set parent <sp> in a refsection <rs> to csv
+% of set children
+% blx@seti@<rs>@<sc> = position of set child <sc> in entry set in
+% refsection <rs>
+% blx@setc@<rs>@<sc> = map of set child <sc> in refsection <rs> to set parent
+
+% {<entrykey>,...}
+\protected\def\blx@bbl@set#1{%
+ \blx@bbl@fieldedef{entryset}{\detokenize{#1}}%
+ \csxdef{blx@setp@\the\c@refsection @\abx@field@@@entrykey}{\detokenize{#1}}%
+ \begingroup
+ \blx@tempcnta\z@
+ \expandafter\forcsvlist
+ \expandafter\blx@bbl@set@i
+ \expandafter{\detokenize{#1}}%
+ \endgroup}
+
+\def\blx@bbl@set@i#1{%
+ \advance\blx@tempcnta\@ne
+ \csxdef{blx@seti@\the\c@refsection @#1}{\the\blx@tempcnta}}
+
+% {<entrykey>}
+\protected\def\blx@bbl@inset#1{%
+ \toggletrue{blx@setonly}%
+ \blx@bbl@fieldedef{entryset}{\detokenize{#1}}%
+ \csxdef{blx@setc@\the\c@refsection @\abx@field@@@entrykey}{\detokenize{#1}}}
+
+% {<entrykey>}
+\protected\def\blx@bbl@xref#1{}% No-op to avoid an error with BibTeX .bbl
+\protected\def\blx@bbl@fakeset#1{}% No-op to avoid an error with BibTeX .bbl
+
+% {<keyword>,...}
+\protected\def\blx@bbl@keyw#1{%
+ \forcsvlist{\blx@addkeyword{\abx@field@@@entrykey}}{#1}%
+ \blx@bbl@fielddef{}{}{keywords}{#1}}
+
+\def\blx@addkeyword#1#2{%
+ \listcsxadd{blx@keyw@\the\c@refsection @\detokenize{#2}}{#1}}
+
+\newcommand*{\blx@ifcatcode@other}[1]{%
+ \ifnumequal{\catcode\number`#1}{12}}
+
+% {<options>}
+\protected\long\def\blx@bbl@options#1{%
+ \ifblank{#1}
+ {}
+ {\begingroup
+ \blx@ifcatcode@other{,}
+ {\blx@ifcatcode@other{=}}
+ {\@secondoftwo}
+ {\blx@bbl@options@check{#1}}
+ {\ifundef\blx@bbl@options@warncatcode
+ {\blx@warning@noline{%
+ Irregular catcode regime detected.\MessageBreak
+ Attempting to work around this with \string\scantokens}%
+ \global\let\blx@bbl@options@warncatcode\@empty}
+ {}%
+ \makeatletter
+ \@makeother\=
+ \@makeother\'
+ \endlinechar\m@ne
+ \scantokens\expandafter{\blx@bbl@options@check{#1}}}}}
+
+\long\def\blx@bbl@options@check#1{%
+ \let\blx@tempa\@empty
+ \forcsvlist\blx@bbl@options@checkopt{#1}%
+ \edef\blx@tempa{%
+ \endgroup % this group was opened in \blx@bbl@options
+ \ifx\blx@tempa\@empty
+ \else
+ \def\noexpand\abx@field@@@options{\expandonce\blx@tempa}%
+ \fi}%
+ \blx@tempa}
+
+
+\long\def\blx@bbl@options@checkopt#1{\blx@bbl@options@checkopt@i#1==&}
+
+\long\def\blx@bbl@options@checkopt@i#1=#2=#3&{%
+ \blx@kv@ifkeyundef{blx@opt@ent}{#1}
+ {\blx@warning@noline{%
+ Ignoring undefined option '#1'\MessageBreak
+ at entry '\abx@field@@@entrykey'}}
+ {\eappto\blx@tempa{%
+ \ifx\blx@tempa\@empty\else,\fi
+ \unexpanded{#1}\ifblank{#2}{}{=\unexpanded{#2}}}}}
+
+\def\blx@ifdata#1{%
+ \ifcsdef{blx@data@\the\c@refsection @\blx@refcontext@context @#1}}
+\let\blx@imc@ifentryinbib\blx@ifdata
+
+\def\blx@getdata#1{%
+ \csuse{blx@data@\the\c@refsection @\blx@refcontext@context @#1}%
+ % Set lmslang with any entry-specific language
+ \blx@imc@iffieldundef{langid}
+ {\global\let\blx@lmslang\blx@mslang}
+ {\xdef\blx@lmslang{\csuse{blx@msmaplangr@\abx@field@@@langid}}}%
+ \blx@adjustyears
+ \blx@getlabeldata
+ \blx@aliasfields
+ \blx@setcitecounter}
+
+\def\blx@adjustyears{%
+ % All dates by default are output from biber in astronomical era with a year 0
+ % So, if we are ouputting BCE/BC era, we need to adjust the years by +1
+ \def\do##1{%
+ \ifdefstring\blx@dateera{astronomical}
+ {}
+ {\ifcsdef{abx@field@@@##1year}
+ {\csuse{if##1dateera}{bce}
+ {\csedef{abx@field@@@##1year}{\number\numexpr\csuse{abx@field@@@##1year}+1}}
+ {}}
+ {}%
+ \ifcsdef{abx@field@@@##1endyear}
+ {\csuse{if##1enddateera}{bce}
+ {\csedef{abx@field@@@##1endyear}{\number\numexpr\csuse{abx@field@@@##1endyear}+1}}
+ {}}
+ {}}%
+ {}}%
+ \abx@dodatetypes}
+
+\def\blx@getlabeldata{%
+ % Here we resolve label* bib fields to their real fields. In fact, currently biber resolves
+ % the label* fields too, as it needs to do this to generate various internal
+ % counters for tracking things like singletitle etc. internally. However, it does not output
+ % the resolved values to the .bbl. It is conceptually neater to have just the calculated label*
+ % source field in the .bbl and let biblatex resolve the label* field using the label*source
+ % fields. However, currently there is no way/need to vary the label* resolution to pick up a
+ % different target field in biblatex and so practically, this resolution is being done twice,
+ % once by biber, once by biblatex. It is possible in the future that it would be useful to
+ % to change the resolution of the label* fields dynamically in a style/document and so this
+ % biblatex-side resolution remains.
+ %
+ % An unanswered question is whether such dynamic resolution causes problems due to the fact
+ % that biber uses the label* field to generate counters internally and changing the
+ % label* field resolution in biblatex would occur after such counters have been used to
+ % generate the .bbl
+ % This could all be removed from biblatex if necessary and biber could output all resolved
+ % label* fields to the .bbl but then it potentially removes control of such things from
+ % macros
+ %
+ % fields
+ \def\do##1{%
+ \ifcsundef{abx@fieldmssource@field@##1}
+ {}
+ {\iftoggle{blx@dynamiclabel}
+ {\let\blx@tempa\blx@msform
+ \let\blx@tempb\blx@mslang}
+ {\edef\blx@tempa{\csuse{abx@fieldmssource@msform@##1}}%
+ \edef\blx@tempb{\csuse{abx@fieldmssource@mslang@##1}}}%
+ \csletcs{abx@field@@@##1}{abx@field@\blx@tempa @\blx@tempb @\csuse{abx@fieldmssource@field@##1}}}}%
+ \abx@dorfields%
+ % names
+ \def\do##1{%
+ \ifcsundef{abx@fieldmssource@field@##1}
+ {}
+ {\iftoggle{blx@dynamiclabel}
+ {\let\blx@tempa\blx@msform
+ \let\blx@tempb\blx@mslang}
+ {\edef\blx@tempa{\csuse{abx@fieldmssource@msform@##1}}%
+ \edef\blx@tempb{\csuse{abx@fieldmssource@mslang@##1}}}%
+ \csname c@##1\expandafter\endcsname\expandafter
+ \the\csname c@\csuse{abx@fieldmssource@field@##1}\endcsname
+ \csletcs{abx@name@@@##1}{abx@name@\blx@tempa @\blx@tempb @\csuse{abx@fieldmssource@field@##1}}%
+ \csletcs{etb@tgl@abx@bool@more##1}{%
+ etb@tgl@abx@bool@more\csuse{abx@fieldmssource@field@##1}}}}%
+ \abx@dornames%
+ % indextitle/indexsorttitle
+ \blx@indextitle
+ \ifundef\abx@field@@@indexsorttitle
+ {\let\abx@field@@@indexsorttitle\abx@field@@@indextitle}
+ {}%
+ % Resolve labeldate
+ % Note that here we can't refer to labelyear as this is where we create it, hence the
+ % complications in constructing test names etc.
+ % This also shows why biber shouldn't resolve labeldate fields as we have to add
+ % circa/uncertain/era etc. information to them and that has to be done here.
+ \ifundef\abx@field@@@labeldatesource
+ {}
+ {\ifcsundef{abx@field@@@\abx@field@@@labeldatesource year}
+ % \DeclareLabeldate resolved to a literal/localisation string or a non-date field
+ % in which case we only set labelyear.
+ {\ifcsundef{abx@field@@@\abx@field@@@labeldatesource}
+ % \DeclareLabeldate resolved to a literal/localisation string
+ {\let\abx@field@@@labelyear\abx@field@@@labeldatesource}
+ % \DeclareLabeldate resolved to a non-date field. Not safe to \edef because
+ % such contents could contain arbitrary macros, unlike ISO8601 sourced labeldatesource values
+ {\letcs\abx@field@@@labelyear{abx@field@@@\abx@field@@@labeldatesource}}}
+ % \DeclareLabeldate resolved to a date field name prefix like '', 'event', 'url'
+ % or 'orig'
+ {% labeldateera/labelenddateera
+ \letcs\abx@field@@@labeldateera{abx@field@@@\abx@field@@@labeldatesource dateera}%
+ \letcs\abx@field@@@labelenddateera{abx@field@@@\abx@field@@@labeldatesource enddateera}%
+ \letcs\abx@field@@@labelyear{abx@field@@@\abx@field@@@labeldatesource year}%
+ \letcs\abx@field@@@labelendyear{abx@field@@@\abx@field@@@labeldatesource endyear}%
+ \letcs\abx@field@@@labelmonth{abx@field@@@\abx@field@@@labeldatesource month}%
+ \letcs\abx@field@@@labelendmonth{abx@field@@@\abx@field@@@labeldatesource endmonth}%
+ \letcs\abx@field@@@labelday{abx@field@@@\abx@field@@@labeldatesource day}%
+ \letcs\abx@field@@@labelendday{abx@field@@@\abx@field@@@labeldatesource endday}%
+ \letcs\abx@field@@@labelhour{abx@field@@@\abx@field@@@labeldatesource hour}%
+ \letcs\abx@field@@@labelendhour{abx@field@@@\abx@field@@@labeldatesource endhour}%
+ \letcs\abx@field@@@labelminute{abx@field@@@\abx@field@@@labeldatesource minute}%
+ \letcs\abx@field@@@labelendminute{abx@field@@@\abx@field@@@labeldatesource endminute}%
+ \letcs\abx@field@@@labelsecond{abx@field@@@\abx@field@@@labeldatesource second}%
+ \letcs\abx@field@@@labelendsecond{abx@field@@@\abx@field@@@labeldatesource endsecond}%
+ \letcs\abx@field@@@labeltimezone{abx@field@@@\abx@field@@@labeldatesource timezone}%
+ \letcs\abx@field@@@labelendtimezone{abx@field@@@\abx@field@@@labeldatesource endtimezone}%
+ \letcs\abx@field@@@labelyeardivision{abx@field@@@\abx@field@@@labeldatesource yeardivision}%
+ \letcs\abx@field@@@labelendyeardivision{abx@field@@@\abx@field@@@labeldatesource endyeardivision}%
+ \letcs\abx@field@@@labeldateunspecified{abx@field@@@\abx@field@@@labeldatesource dateunspecified}%
+ \letcs\etb@tgl@abx@bool@labeldatecirca{etb@tgl@abx@bool@\abx@field@@@labeldatesource datecirca}%
+ \letcs\etb@tgl@abx@bool@labelenddatecirca{etb@tgl@abx@bool@\abx@field@@@labeldatesource enddatecirca}%
+ \letcs\etb@tgl@abx@bool@labeldatejulian{etb@tgl@abx@bool@\abx@field@@@labeldatesource datejulian}%
+ \letcs\etb@tgl@abx@bool@labelenddatejulian{etb@tgl@abx@bool@\abx@field@@@labeldatesource enddatejulian}%
+ \letcs\etb@tgl@abx@bool@labeldateuncertain{etb@tgl@abx@bool@\abx@field@@@labeldatesource dateuncertain}%
+ \letcs\etb@tgl@abx@bool@labelenddateuncertain{etb@tgl@abx@bool@\abx@field@@@labeldatesource enddateuncertain}%
+ \letcs\etb@tgl@abx@bool@labeldateunknown{etb@tgl@abx@bool@\abx@field@@@labeldatesource dateunknown}%
+ \letcs\etb@tgl@abx@bool@labelenddateunknown{etb@tgl@abx@bool@\abx@field@@@labeldatesource enddateunknown}%
+ }%
+ }%
+}
+
+% This gets the entry data for a citation
+\def\blx@getdata@cite#1{%
+ \blx@getdata{#1}%
+ % Inject the relevant set parent fields like labelnumber/labelprefix into child
+ \ifcsdef{blx@setc@\the\c@refsection @#1}
+ {\blx@ifdata{#1}
+ {\def\abx@field@@@childentrykey{#1}%LEGACY(<3.8)
+ \let\abx@field@@@childentrytype\abx@field@@@entrytype %LEGACY(<3.8)
+ \begingroup
+ \expandafter\expandafter\expandafter\blx@getdata
+ \expandafter\expandafter\expandafter{%
+ \csname blx@setc@\the\c@refsection @#1\endcsname}%
+ \let\blx@tempa\@empty
+ % Inject labelnumber if it exists
+ \ifdef\abx@field@@@labelnumber
+ {\appto\blx@tempa{%
+ \def\noexpand\abx@field@@@labelnumber{%
+ \expandonce\abx@field@@@labelnumber}}}
+ {}%
+ % Inject labelprefix if it exists
+ \ifdef\abx@field@@@labelprefix
+ {\appto\blx@tempa{%
+ \def\noexpand\abx@field@@@labelprefix{%
+ \expandonce\abx@field@@@labelprefix}}}
+ {}%
+ % Inject labelalpha if it exists
+ \ifdef\abx@field@@@labelalpha
+ {\appto\blx@tempa{%
+ \def\noexpand\abx@field@@@labelalpha{%
+ \expandonce\abx@field@@@labelalpha}}}
+ {}%
+ % Inject extraalpha if it exists
+ \ifdef\abx@field@@@extraalpha
+ {\appto\blx@tempa{%
+ \def\noexpand\abx@field@@@extraalpha{%
+ \expandonce\abx@field@@@extraalpha}}}
+ {}%
+ % Perform the injection
+ \edef\blx@tempb{\endgroup\blx@tempa}%
+ \blx@tempb}
+ {}}
+ {}%
+ \ifcsdef{blx@seti@\the\c@refsection @#1}
+ {\letcs\abx@field@@@entrysetcount{blx@seti@\the\c@refsection @#1}}
+ {}}
+
+\def\blx@execute{%
+ \blx@imc@thefield{execute}}
+
+\def\blx@setoptions@entry{%
+ \blx@imc@iffieldundef{options}
+ {}
+ {\begingroup
+ \edef\blx@tempa{\endgroup
+ \noexpand\blx@kv@setkeys{blx@opt@ent}{\abx@field@@@options}}%
+ \blx@tempa
+ \blx@checkoptions@entry}}
+
+\def\blx@setoptions@type#1{%
+ \ifcsdef{blx@opts@type@#1}
+ {\begingroup
+ \edef\blx@tempa{\endgroup
+ \noexpand\blx@kv@setkeys{blx@opt@typ}{\csuse{blx@opts@type@#1}}}%
+ \blx@tempa}
+ {}}
+
+\def\blx@checkoptions@global{}
+\def\blx@checkoptions@type{}
+\def\blx@checkoptions@entry{}
+
+\def\blx@entrysetcount{%
+ \ifdef\abx@field@@@entrykey
+ {\ifcsdef{blx@seti@\the\c@refsection @\abx@field@@@entrykey}
+ {\letcs\abx@field@@@entrysetcount{%
+ blx@seti@\the\c@refsection @\abx@field@@@entrykey}}
+ {}}
+ {}}
+
+% {<section>}
+\def\blx@bbl@refsection#1{%
+ \begingroup
+ \c@refsection#1\relax}
+
+\def\blx@bbl@endrefsection{%
+ \iftoggle{blx@addset}
+ {\blx@addset
+ \global\togglefalse{blx@addset}}
+ {}%
+ \endgroup}
+
+% {<entrykey>}
+\protected\def\blx@bbl@missing#1{%
+ \listcsxadd{blx@miss@\the\c@refsection}{\detokenize{#1}}%
+ \blx@warning@noline{%
+ The following entry could not be found\MessageBreak
+ in the database%
+ \ifnumgreater\c@refsection\z@
+ { (refsection \the\c@refsection)}
+ {}:\MessageBreak
+ \detokenize{#1}\MessageBreak
+ Please verify the spelling and rerun\MessageBreak
+ LaTeX afterwards}}
+
+% We create an alias resolving macro and also a list of aliases
+% which we need to add to the .bcf. We need to resolve the aliases
+% for internal use but we always want the aliases themselves in the .bcf
+% so that biber can correctly use and resolve them too.
+\protected\def\blx@bbl@keyalias#1#2{%
+ \csxdef{blx@keyalias@\the\c@refsection @#1}{\detokenize{#2}}%
+ \listcsxadd{blx@keyaliases@\the\c@refsection}{\detokenize{#1}}}
+
+% blx@dlist@list@<section>@<refcontext> - a list of list items in a refcontext in a
+% section (for tracking bibliography lists,
+% obeys skipbiblist)
+% blx@dlist@entry@<section>@<list> - a list of normal entries in a list in a
+% section (for tracking bibliographies,
+% obeys skipbib)
+% blx@dlist@centry@<section>@<list> - a list of normal entries in a list in a
+% section (for tracking citations,
+% does not obey skipbib).
+% Same as @entry@, but includes skipbib'd entries
+% and set children
+%
+% {<entrykey>}{<entrytype>}{<options>}
+\protected\def\blx@bbl@entry#1#2#3{%
+ \begingroup
+ \edef\abx@field@@@entrykey{\detokenize{#1}}%
+ \blx@setoptions@type{#2}%
+ \blx@bbl@options{#3}%
+ \blx@setoptions@entry
+ \edef\blx@bbl@data{blx@data@\the\c@refsection @\blx@dlist@name @\abx@field@@@entrykey}%
+ \blx@bbl@addfield{entrykey}{\abx@field@@@entrykey}{}{}%
+ \listcsxadd{blx@entries@\the\c@refsection}{\abx@field@@@entrykey}%
+ \blx@bbl@addfield{entrytype}{#2}{}{}%
+ \csuse\blx@bbl@data
+ \blx@imc@iffieldundef{options}
+ {}
+ {\blx@bbl@fieldedef{options}{\expandonce\abx@field@@@options}}}
+
+\protected\def\blx@bbl@endentry{%
+ % Useful for debugging
+ % \expandafter\show\csname\blx@bbl@data\endcsname
+ \csuse\blx@bbl@data
+ \ifcsundef{blx@pref@\the\c@refsection @\abx@field@@@entrykey}
+ {}
+ {\blx@addpageref{\abx@field@@@entrykey}}%
+ \nottoggle{blx@setonly}
+ {}
+ {\global\toggletrue{blx@addset}%
+ \toggletrue{blx@skipbib}%
+ \toggletrue{blx@skipbiblist}%
+ \toggletrue{blx@skiplab}}%
+ \expandafter\ifstrequal\expandafter{\blx@dlist@type}{entry}
+ {\listcsxadd{blx@type@\the\c@refsection @\abx@field@@@entrytype}{\abx@field@@@entrykey}%
+ \ifdef\abx@field@@@entrysubtype
+ {\listcsxadd{blx@subt@\the\c@refsection @\abx@field@@@entrysubtype}{\abx@field@@@entrykey}}
+ {}%
+ \nottoggle{blx@setonly}
+ {\listcsxadd{blx@dlist@centry@\the\c@refsection @\blx@dlist@name}{\abx@field@@@entrykey}}
+ {}%
+ \nottoggle{blx@skipbib}
+ {\listcsxadd{blx@dlist@entry@\the\c@refsection @\blx@dlist@name}{\abx@field@@@entrykey}}
+ {}}%
+ {}%
+ \nottoggle{blx@skipbiblist}
+ {\expandafter\ifstrequal\expandafter{\blx@dlist@type}{list}
+ {\blx@bbl@labelfields
+ \listcsxadd{blx@dlist@\blx@dlist@type @\the\c@refsection @\blx@dlist@name}{\abx@field@@@entrykey}}
+ {}}%
+ {}%
+ \nottoggle{blx@skiplab}
+ {\iftoggle{blx@labelnumber}
+ {\blx@bbl@labelnumber}
+ {}%
+ \iftoggle{blx@labelalpha}
+ {\blx@bbl@labelalpha}
+ {}%
+ \iftoggle{blx@labeltitle}
+ {\blx@bbl@labeltitle}
+ {}%
+ \iftoggle{blx@labeltitleyear}
+ {\blx@bbl@labeltitleyear}
+ {}%
+ \iftoggle{blx@labeldateparts}
+ {\blx@bbl@labeldate}
+ {}%
+ \blx@bbl@labelname}
+ {}%
+ \blx@bbl@hooks
+ \endgroup}
+
+% This, at the end of the .bbl, puts any set parent children into the
+% current context sort list of citations (a separate list *@centry@* to the
+% bibliography *@entry@* which doesn't want the children adding if they weren't
+% cited) as this is needed for the subentry citing
+% when sortcites is enabled as for sortcites, the current context sorting list
+% is used and the parent set of a subentry is not necessarily
+% available in the current context sortlist.
+\def\blx@addset{%
+ \begingroup
+ \ifcsdef{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}
+ {\letcs\blx@tempa{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}%
+ \global\cslet{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}\@empty
+ \forlistloop\blx@addset@i\blx@tempa}
+ {\blx@warning@noline{Sorting template has changed}}%
+ \endgroup}
+
+\def\blx@addset@i#1{%
+ \listcsgadd{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}{#1}%
+ \ifcsdef{blx@setp@\the\c@refsection @#1}
+ {\expandafter\expandafter\expandafter\forcsvlist
+ \expandafter\expandafter\expandafter\blx@addset@ii
+ \expandafter\expandafter\expandafter{%
+ \csname blx@setp@\the\c@refsection @#1\endcsname}}
+ {}}
+
+\def\blx@addset@ii#1{%
+ \listcsgadd{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}{#1}}
+
+% {<csname>}{<field>/<format>}{<field>}
+\def\abx@flfw@getfieldformat#1#2#3{%
+ \blx@getformat\abx@tmp@theformat{ffd}{#2}{#3}%
+ \csletcs{#1}{abx@tmp@theformat}}
+
+
+% {<instance (int)>}{<field>}{<length>}
+\def\abx@aux@locallabelwidth#1#2#3{%
+ \csgdef{blx@locallabelwidth@#1@#2}{#3}}
+
+\def\blx@locallabelwidth@write@length#1{%
+ \blx@auxwrite\@mainaux{}
+ {\string\abx@aux@locallabelwidth
+ {\the\blx@biblioinstance}%
+ {#1}%
+ {\the\csname local#1width\endcsname}}}
+
+\def\blx@locallabelwidth@write{%
+ \let\do\blx@locallabelwidth@write@length
+ \abx@dolabelwidths}
+
+\let\blx@locallabelwidth@finish\relax
+
+\def\blx@labelwidth@resetlocal{%
+ \def\do##1{%
+ \csname local##1width\endcsname\z@}%
+ \abx@dolabelwidths}
+
+\def\blx@labelwidth@settolocal@length#1{%
+ \ifcsundef{blx@locallabelwidth@\the\blx@biblioinstance @#1}
+ {}
+ {\csname #1width\endcsname
+ \csname blx@locallabelwidth@\the\blx@biblioinstance @#1\endcsname
+ \space}}
+
+\def\blx@labelwidth@settolocal{%
+ \let\do\blx@labelwidth@settolocal@length
+ \abx@dolabelwidths}
+
+\def\blx@locallabelwidth@setlengths{%
+ \global\advance\blx@biblioinstance\@ne
+ \blx@labelwidth@resetlocal
+ \blx@labelwidth@settolocal}
+
+\let\blx@locallabelwidth@init\relax
+
+
+% {<prefix for labelwidth fields>}
+\def\blx@bbl@labelnumberwidth@numeric#1{%
+ \abx@flfw@getfieldformat{abx@flfw@labelnumberwidth}{labelnumberwidth}{}%
+ \abx@flfw@getfieldformat{abx@flfw@labelprefix}{labelprefix}{}%
+ \abx@flfw@getfieldformat{abx@flfw@labelnumber}{labelnumber}{}%
+ \iftoggle{blx@defernumbers}
+ {\ifundef\abx@field@@@localnumber
+ {\numdef\abx@field@@@localnumber{0}}%
+ {}}
+ {\ifundef\abx@field@@@localnumber
+ {\edef\abx@field@@@localnumber{%
+ \csuse{blx@labelnumber@\the\c@refsection}}}
+ {}}%
+ \blx@setlabwidth{\csname #1labelnumberwidth\endcsname}{%
+ \csuse{abx@flfw@labelnumberwidth}{%
+ \ifdef\abx@field@@@labelprefix
+ {\csuse{abx@flfw@labelprefix}{\abx@field@@@labelprefix}}
+ {}%
+ \csuse{abx@flfw@labelnumber}{\abx@field@@@localnumber}}}}
+
+\def\blx@bbl@labelnumberwidth@shorthand#1{%
+ \abx@flfw@getfieldformat{abx@flfw@labelnumberwidth}{labelnumberwidth}{}%
+ \abx@flfw@getfieldformat{abx@flfw@labelnumber}{labelnumber}{}%
+ \blx@setlabwidth{\csname #1labelnumberwidth\endcsname}{%
+ \csuse{abx@flfw@labelnumberwidth}{%
+ \csuse{abx@flfw@labelnumber}{\abx@field@@@shorthand}}}}
+
+\def\blx@bbl@locallabelnumberwidth{%
+ \ifdefempty\abx@field@@@localnumber
+ {}
+ {\ifundef\abx@field@@@shorthand
+ {\blx@bbl@labelnumberwidth@numeric{local}}
+ {\blx@bbl@labelnumberwidth@shorthand{local}}}}
+
+% {<prefix for labelwidth fields>}
+\def\blx@bbl@labelalphawidth#1{%
+ \abx@flfw@getfieldformat{abx@flfw@labelalphawidth}{labelalphawidth}{}%
+ \abx@flfw@getfieldformat{abx@flfw@labelprefix}{labelprefix}{}%
+ \abx@flfw@getfieldformat{abx@flfw@labelalpha}{labelalpha}{}%
+ \abx@flfw@getfieldformat{abx@flfw@extraalpha}{extraalpha}{}%
+ \blx@setlabwidth{\csname #1labelalphawidth\endcsname}{%
+ \csuse{abx@flfw@labelalphawidth}{%
+ \ifdef\abx@field@@@labelprefix
+ {\csuse{abx@flfw@labelprefix}{\abx@field@@@labelprefix}}
+ {}%
+ \csuse{abx@flfw@labelalpha}{\abx@field@@@labelalpha}%
+ \ifundef\abx@field@@@extraalpha
+ {}
+ {\csuse{abx@flfw@extraalpha}{\abx@field@@@extraalpha}}}}}
+
+\def\blx@bbl@locallabelalphawidth{%
+ \ifundef\abx@field@@@labelalpha
+ {}
+ {\blx@bbl@labelalphawidth{local}}}
+
+\def\blx@bbl@locallabelfields{\blx@bbl@labelfields@i{local}}
+
+\def\blx@bbl@labelfields{\blx@bbl@labelfields@i{}}
+
+\def\blx@indextitle{%
+ \ifundef\abx@field@@@indextitle
+ {\letcs\abx@field@@@indextitle{abx@field@\blx@msform @\blx@lmslang @title}}
+ {}}
+
+% {<prefix for labelwidth fields>}
+% This relies on the short* fields not being multiscript fields
+\def\blx@bbl@labelfields@i#1{%
+ \def\do##1{%
+ \ifcsundef{abx@field@@@##1}
+ {}
+ {\abx@flfw@getfieldformat{abx@flfw@##1width}{##1width}{##1}%
+ \blx@setlabwidth{\csname #1##1width\endcsname}{%
+ \csuse{abx@flfw@##1width}{\csname abx@field@@@##1\endcsname}}}}%
+ \abx@dolabelfields}
+
+\def\blx@bbl@labelnumber{%
+ % Used at endentry, when reading .bbl
+ % only do this for the global sorting list otherwise we increment
+ % the labelnumbers for each sortlist
+ \ifdefempty\abx@field@@@localnumber
+ {}% only if omitnumbers=true
+ {\ifundef\abx@field@@@shorthand
+ {\iftoggle{blx@defernumbers}
+ % only if defernumbers=true, we have to define localnumber to
+ % something to stop labelnumberwidth def complaining on first
+ % post-backend run since there will be nothing in the .aux yet
+ % for defernums localnumbers. On the second post-backend run,
+ % it will have a value correct for generating labelnumberwidth
+ % We also have to define a dummy value for labelnumber here for
+ % first post-backend runs otherwise references to labelnumber
+ % in cite styles like numeric-comp will die.
+ {\ifundef\abx@field@@@localnumber
+ {\numdef\abx@field@@@localnumber{0}%
+ \blx@bbl@fielddef{}{}{labelnumber}{0}}%
+ {}}
+ {\csnumgdef{blx@labelnumber@\the\c@refsection}{%
+ \csuse{blx@labelnumber@\the\c@refsection}+1}%
+ \edef\abx@field@@@localnumber{%
+ \csuse{blx@labelnumber@\the\c@refsection}}%
+ \blx@bbl@fieldedef{labelnumber}{\abx@field@@@localnumber}}%
+ \iftoggle{blx@skipbib}
+ {}
+ {\blx@bbl@labelnumberwidth@numeric{}}}
+ {\csgappto\blx@bbl@data{\let\abx@field@@@labelnumber\abx@field@@@shorthand}%
+ \iftoggle{blx@skipbib}
+ {}
+ {\blx@bbl@labelnumberwidth@shorthand{}}}}}
+
+\def\blx@bbl@labelalpha{%
+ \ifundef\abx@field@@@labelalpha
+ {}
+ {\ifundef\abx@field@@@extraalpha
+ {}
+ {\ifnum\abx@field@@@extraalpha>\c@maxextraalpha
+ \global\c@maxextraalpha\abx@field@@@extraalpha\relax
+ \fi}%
+ \iftoggle{blx@skipbib}
+ {}
+ {\blx@bbl@labelalphawidth{}}}}
+
+\def\blx@bbl@labeltitle{%
+ \ifundef\abx@field@@@extratitle
+ {}
+ {\ifnum\abx@field@@@extratitle>\c@maxextratitle
+ \global\c@maxextratitle\abx@field@@@extratitle\relax
+ \fi}}
+
+\def\blx@bbl@labeltitleyear{%
+ \ifundef\abx@field@@@extratitleyear
+ {}
+ {\ifnum\abx@field@@@extratitleyear>\c@maxextratitleyear
+ \global\c@maxextratitleyear\abx@field@@@extratitleyear\relax
+ \fi}}
+
+\def\blx@bbl@labelname{%
+ \ifundef\abx@field@@@extraname
+ {}
+ {\ifnum\abx@field@@@extraname>\c@maxextraname
+ \global\c@maxextraname\abx@field@@@extraname\relax
+ \fi}}
+
+\def\blx@bbl@labeldate{%
+ \ifundef\abx@field@@@extradate
+ {}
+ {\ifnum\abx@field@@@extradate>\c@maxextradate
+ \global\c@maxextradate\abx@field@@@extradate\relax
+ \fi}}
+
+\def\blx@bbl@hooks{%
+ \ifcsundef{blx@hook@bblitem@*}
+ {\ifcsundef{blx@hook@bblitem@\abx@field@@@entrytype}
+ {}
+ {\csuse\blx@bbl@data
+ \csuse{blx@hook@bblitem@\abx@field@@@entrytype}}}
+ {\csuse\blx@bbl@data
+ \csuse{blx@hook@bblitem@*}%
+ \csuse{blx@hook@bblitem@\abx@field@@@entrytype}}}
+
+\newrobustcmd*{\AtDataInput}[1][*]{\csgappto{blx@hook@bblitem@#1}}
+\@onlypreamble\AtDataInput
+
+\def\blx@setlabwidth#1#2{%
+ \begingroup
+ \settowidth{\@tempdima}{\bibfont#2}%
+ \ifnum\@tempdima>#1%
+ \global#1\@tempdima
+ \fi
+ \endgroup}
+
+\def\blx@bblstart{%
+ \let\preamble\blx@bbl@preamble
+ \let\warn\blx@bbl@thewarn
+ \let\refsection\blx@bbl@refsection
+ \let\endrefsection\blx@bbl@endrefsection
+ \let\entry\blx@bbl@entry
+ \let\endentry\blx@bbl@endentry
+ \let\missing\blx@bbl@missing
+ \let\keyalias\blx@bbl@keyalias
+ \let\datalist\blx@bbl@dlist
+ \let\enddatalist\blx@bbl@enddlist
+ \let\set\blx@bbl@set
+ \let\inset\blx@bbl@inset
+ \let\fakeset\blx@bbl@fakeset % A No-op for Biber
+ \let\xref\blx@bbl@xref % A No-op for Biber
+ \let\keyw\blx@bbl@keyw
+ \let\name\blx@bbl@msnamedef
+ \let\namepartms\blx@bbl@msnamepartdef
+ \let\listitemms\blx@bbl@mslistitemdef
+ \let\list\blx@bbl@mslistdef
+ \let\field\blx@bbl@msfielddef
+ \let\fieldmssource\blx@bbl@fieldmssourcedef
+ \let\range\blx@bbl@rangedef
+ \let\strng\blx@bbl@stringdef
+ \let\cnt\blx@bbl@cntdef
+ \let\true\blx@bbl@booltrue
+ \let\false\blx@bbl@boolfalse
+ \let\verb\blx@bbl@verbdef
+ \let\endverb\blx@bbl@verbend
+ \let\lverb\blx@bbl@verbldef
+ \let\endlverb\blx@bbl@verblend
+ \let\annotation\blx@bbl@annotationdef
+ \let\msforms\blx@bbl@msformsdef
+ \let\mslangs\blx@bbl@mslangsdef
+ \let\msentrylangs\blx@bbl@msentrylangsdef}
+
+% namepart definitions for all alternates of a name
+\protected\def\blx@bbl@msnamepartdef#1#2#3{%
+ \csxappto\blx@bbl@data{%
+ \listadd\noexpand\abx@nameparts@defined{#1@#2}%
+ \def\expandafter\noexpand\csname abx@nameparts@#1@#2\endcsname{\unexpanded{#3}}}}
+% listitem definitions for all alternates of a list
+\protected\def\blx@bbl@mslistitemdef#1#2#3{%
+ \csxappto\blx@bbl@data{%
+ \listadd\noexpand\abx@listitems@defined{#1@#2}%
+ \def\expandafter\noexpand\csname abx@listitems@#1@#2\endcsname{\unexpanded{#3}}}}
+
+% Record select list for a langid
+\newrobustcmd*{\DeclareMsselect}[2]{%
+ \begingroup
+ \let\alternate\blx@msselect
+ \def\blx@tempa{#1}%
+ \ifcsdef{blx@msmaplangr@#1}
+ {\letcs\blx@tempa{blx@msmaplangr@#1}}
+ {}%
+ #2%
+ \endgroup}
+\protected\def\blx@msselect#1#2{%
+ \listcsgadd{blx@msselect@\blx@tempa}{{#1}{#2}}}
+\@onlypreamble\DeclareMsselect
+
+% List of all forms/langs in the documents, comes from biber via .bbl
+\protected\def\blx@bbl@msformsdef#1{%
+ \gdef\blx@msforms{#1}}
+\protected\def\blx@bbl@mslangsdef#1{%
+ \gdef\blx@mslangs{#1}}
+\protected\def\blx@bbl@msentrylangsdef#1{}
+
+% Mapping of BCP47->babel ids until babel/polyglossia support BCP47 tags
+% Must use \csuse on blx@msmaplang due to hyphens in tags
+\protected\def\blx@imc@maplangtag#1#2{%
+ \csgdef{blx@msmaplang@#1}{#2}}
+\let\maplangtag\blx@imc@maplangtag
+
+% Default BCP47->babel/polyglossia mappings
+% Used to determine babel/polyglossia/biblatex language from BCP47 tag
+% Needs to be replaced by some real package
+\blx@imc@maplangtag{af}{afrikaans}
+\blx@imc@maplangtag{af-za}{afrikaans}
+\blx@imc@maplangtag{am}{ethiopia}
+\blx@imc@maplangtag{am-et}{amharic}
+\blx@imc@maplangtag{ar}{arabic}
+\blx@imc@maplangtag{ar-001}{arabic}
+\blx@imc@maplangtag{ast}{asturian}
+\blx@imc@maplangtag{ast-es}{asturian}
+\blx@imc@maplangtag{bg}{bulgarian}
+\blx@imc@maplangtag{bg-bg}{bulgarian}
+\blx@imc@maplangtag{bn}{bengali}
+\blx@imc@maplangtag{bn-bd}{bengali}
+\blx@imc@maplangtag{bo}{tibetan}
+\blx@imc@maplangtag{bo-cn}{tibetan}
+\blx@imc@maplangtag{br}{breton}
+\blx@imc@maplangtag{br-fr}{breton}
+\blx@imc@maplangtag{ca}{catalan}
+\blx@imc@maplangtag{ca-ad}{catalan}
+\blx@imc@maplangtag{ca-es}{catalan}
+\blx@imc@maplangtag{cop}{coptic}
+\blx@imc@maplangtag{cs}{czech}
+\blx@imc@maplangtag{cs-cz}{czech}
+\blx@imc@maplangtag{cy}{welsh}
+\blx@imc@maplangtag{cy-gb}{welsh}
+\blx@imc@maplangtag{da}{danish}
+\blx@imc@maplangtag{da-dk}{danish}
+\blx@imc@maplangtag{de-1996}{ngerman}
+\blx@imc@maplangtag{de-at}{austrian}
+\blx@imc@maplangtag{de-at-1996}{naustrian}
+\blx@imc@maplangtag{de-ch}{swissgerman}
+\blx@imc@maplangtag{de-ch-1996}{nswissgerman}
+\blx@imc@maplangtag{de}{german}
+\blx@imc@maplangtag{de-de}{german}
+\blx@imc@maplangtag{de-de-1996}{ngerman}
+\blx@imc@maplangtag{dsb}{lowersorbian}
+\blx@imc@maplangtag{dsb-de}{lowersorbian}
+\blx@imc@maplangtag{dv}{divehi}
+\blx@imc@maplangtag{dv-mv}{divehi}
+\blx@imc@maplangtag{el}{greek}
+\blx@imc@maplangtag{el-cy}{ibygreek}
+\blx@imc@maplangtag{el-gr}{greek}
+\blx@imc@maplangtag{en}{english}
+\blx@imc@maplangtag{en-au}{australian}
+\blx@imc@maplangtag{en-ca}{canadian}
+\blx@imc@maplangtag{en-uk}{ukenglish}
+\blx@imc@maplangtag{en-gb}{british}
+\blx@imc@maplangtag{en-nz}{newzealand}
+\blx@imc@maplangtag{en-us}{usenglish}
+\blx@imc@maplangtag{en-us}{american}
+\blx@imc@maplangtag{en-us}{english}
+\blx@imc@maplangtag{eo}{esperanto}
+\blx@imc@maplangtag{eo-001}{esperanto}
+\blx@imc@maplangtag{es}{spanish}
+\blx@imc@maplangtag{es-es}{spanish}
+\blx@imc@maplangtag{et}{estonian}
+\blx@imc@maplangtag{et-ee}{estonian}
+\blx@imc@maplangtag{eu}{basque}
+\blx@imc@maplangtag{eu-es}{basque}
+\blx@imc@maplangtag{fa}{farsi}
+\blx@imc@maplangtag{fa-ir}{farsi}
+\blx@imc@maplangtag{fi}{finnish}
+\blx@imc@maplangtag{fi-fi}{finnish}
+\blx@imc@maplangtag{fr}{french}
+\blx@imc@maplangtag{fr-ca}{acadian}
+\blx@imc@maplangtag{fr-ca}{canadien}
+\blx@imc@maplangtag{fr-fr}{french}
+\blx@imc@maplangtag{fur}{friulan}
+\blx@imc@maplangtag{fur-it}{friulan}
+\blx@imc@maplangtag{ga}{irish}
+\blx@imc@maplangtag{ga-ie}{irish}
+\blx@imc@maplangtag{gd}{scottish}
+\blx@imc@maplangtag{gd-gb}{scottish}
+\blx@imc@maplangtag{gl}{galician}
+\blx@imc@maplangtag{gl-es}{galician}
+\blx@imc@maplangtag{ha}{nko}
+\blx@imc@maplangtag{ha-ng}{nko}
+\blx@imc@maplangtag{he}{hebrew}
+\blx@imc@maplangtag{he-il}{hebrew}
+\blx@imc@maplangtag{hi}{hindi}
+\blx@imc@maplangtag{hi-in}{hindi}
+\blx@imc@maplangtag{hr}{croatian}
+\blx@imc@maplangtag{hr-hr}{croatian}
+\blx@imc@maplangtag{hsb}{uppersorbian}
+\blx@imc@maplangtag{hsb-de}{uppersorbian}
+\blx@imc@maplangtag{hu}{magyar}
+\blx@imc@maplangtag{hu-hu}{magyar}
+\blx@imc@maplangtag{hy}{armenian}
+\blx@imc@maplangtag{hy-am}{armenian}
+\blx@imc@maplangtag{ia}{interlingua}
+\blx@imc@maplangtag{ia-fr}{interlingua}
+\blx@imc@maplangtag{id}{indonesia}
+\blx@imc@maplangtag{is}{icelandic}
+\blx@imc@maplangtag{is-is}{icelandic}
+\blx@imc@maplangtag{it}{italian}
+\blx@imc@maplangtag{it-it}{italian}
+\blx@imc@maplangtag{ja}{japanese}
+\blx@imc@maplangtag{ja-jp}{japanese}
+\blx@imc@maplangtag{kn}{kannada}
+\blx@imc@maplangtag{kn-in}{kannada}
+\blx@imc@maplangtag{lo}{lao}
+\blx@imc@maplangtag{lo-la}{lao}
+\blx@imc@maplangtag{lt}{lithuanian}
+\blx@imc@maplangtag{lt-lt}{lithuanian}
+\blx@imc@maplangtag{lv}{latvian}
+\blx@imc@maplangtag{lv-lv}{latvian}
+\blx@imc@maplangtag{ml}{malayalam}
+\blx@imc@maplangtag{ml-in}{malayalam}
+\blx@imc@maplangtag{mn}{mongolian}
+\blx@imc@maplangtag{mn-cyrl}{mongolian}
+\blx@imc@maplangtag{mr}{marathi}
+\blx@imc@maplangtag{mr-in}{marathi}
+\blx@imc@maplangtag{nb}{norsk}
+\blx@imc@maplangtag{nb-no}{norsk}
+\blx@imc@maplangtag{nl}{dutch}
+\blx@imc@maplangtag{nl-nl}{dutch}
+\blx@imc@maplangtag{nn}{nynorsk}
+\blx@imc@maplangtag{nn-no}{nynorsk}
+\blx@imc@maplangtag{oc}{occitan}
+\blx@imc@maplangtag{oc-fr}{occitan}
+\blx@imc@maplangtag{pl}{polish}
+\blx@imc@maplangtag{pl-pl}{polish}
+\blx@imc@maplangtag{pms}{piedmontese}
+\blx@imc@maplangtag{pms-it}{piedmontese}
+\blx@imc@maplangtag{pny}{pinyin}
+\blx@imc@maplangtag{pt}{portuguese}
+\blx@imc@maplangtag{pt-br}{brazilian}
+\blx@imc@maplangtag{pt-pt}{portuguese}
+\blx@imc@maplangtag{rm}{romansh}
+\blx@imc@maplangtag{rm-ch}{romansh}
+\blx@imc@maplangtag{ro}{romanian}
+\blx@imc@maplangtag{ro-ro}{romanian}
+\blx@imc@maplangtag{ru}{russian}
+\blx@imc@maplangtag{ru-ru}{russian}
+\blx@imc@maplangtag{ru-grek}{greek}
+\blx@imc@maplangtag{ru-latn}{latin}
+\blx@imc@maplangtag{sa}{sanskrit}
+\blx@imc@maplangtag{sa-in}{sanskrit}
+\blx@imc@maplangtag{se}{samin}
+\blx@imc@maplangtag{se-no}{samin}
+\blx@imc@maplangtag{sk}{slovak}
+\blx@imc@maplangtag{sk-sk}{slovak}
+\blx@imc@maplangtag{sl}{slovenian}
+\blx@imc@maplangtag{sl-si}{slovenian}
+\blx@imc@maplangtag{sq}{albanian}
+\blx@imc@maplangtag{sq-al}{albanian}
+\blx@imc@maplangtag{sr}{serbian}
+\blx@imc@maplangtag{sr-cyrl}{serbian}
+\blx@imc@maplangtag{sr-latn}{latin}
+\blx@imc@maplangtag{sv}{swedish}
+\blx@imc@maplangtag{sv-se}{swedish}
+\blx@imc@maplangtag{syc}{syriac}
+\blx@imc@maplangtag{ta}{tamil}
+\blx@imc@maplangtag{ta-in}{tamil}
+\blx@imc@maplangtag{te}{telugu}
+\blx@imc@maplangtag{te-in}{telugu}
+\blx@imc@maplangtag{th}{thai}
+\blx@imc@maplangtag{th-th}{thai}
+\blx@imc@maplangtag{tk}{turkmen}
+\blx@imc@maplangtag{tk-tm}{turkmen}
+\blx@imc@maplangtag{tr}{turkish}
+\blx@imc@maplangtag{tr-tr}{turkish}
+\blx@imc@maplangtag{uk}{ukrainian}
+\blx@imc@maplangtag{uk-ua}{ukrainian}
+\blx@imc@maplangtag{ur}{urdu}
+\blx@imc@maplangtag{ur-in}{urdu}
+\blx@imc@maplangtag{vi}{vietnamese}
+\blx@imc@maplangtag{vi-vn}{vietnamese}
+
+% Mapping of babel->BCP47 ids until babel/polyglossia support BCP47 tags
+% Must use \csuse on blx@msmaplangr due to hyphens in tags
+% No user-facing macro needed
+\protected\def\blx@maplangtagr#1#2{%
+ \csgdef{blx@msmaplangr@#1}{#2}}
+
+% Default mappings of babel/polyglossia language id to BCP47
+% Used to determine default mslang option
+% Needs to be replaced by some real package
+\blx@maplangtagr{acadian}{fr-ca}
+\blx@maplangtagr{american}{en-us}
+\blx@maplangtagr{australian}{en-au}
+\blx@maplangtagr{afrikaans}{af-za}
+\blx@maplangtagr{albanian}{sq-al}
+\blx@maplangtagr{amharic}{am-et}
+\blx@maplangtagr{arabic}{ar-001}
+\blx@maplangtagr{armenian}{hy-am}
+\blx@maplangtagr{asturian}{ast-es}
+\blx@maplangtagr{austrian}{de-at}
+\blx@maplangtagr{bahasa}{id-id}
+\blx@maplangtagr{bahasai}{id-id}
+\blx@maplangtagr{bahasam}{id-id}
+\blx@maplangtagr{basque}{eu-es}
+\blx@maplangtagr{bengali}{bn-bd}
+\blx@maplangtagr{bgreek}{el-gr}
+\blx@maplangtagr{brazil}{pt-br}
+\blx@maplangtagr{brazilian}{pt-br}
+\blx@maplangtagr{breton}{br-fr}
+\blx@maplangtagr{british}{en-gb}
+\blx@maplangtagr{bulgarian}{bg-bg}
+\blx@maplangtagr{canadian}{en-ca}
+\blx@maplangtagr{canadien}{fr-ca}
+\blx@maplangtagr{catalan}{ca-ad}
+\blx@maplangtagr{coptic}{cop}
+\blx@maplangtagr{croatian}{hr-hr}
+\blx@maplangtagr{czech}{cs-cz}
+\blx@maplangtagr{danish}{da-dk}
+\blx@maplangtagr{divehi}{dv-mv}
+\blx@maplangtagr{dutch}{nl-nl}
+\blx@maplangtagr{english}{en-us}
+\blx@maplangtagr{esperanto}{eo-001}
+\blx@maplangtagr{estonian}{et-ee}
+\blx@maplangtagr{ethiopia}{am-et}
+\blx@maplangtagr{farsi}{fa-ir}
+\blx@maplangtagr{finnish}{fi-fi}
+\blx@maplangtagr{francais}{fr-fr}
+\blx@maplangtagr{french}{fr-fr}
+\blx@maplangtagr{frenchle}{fr-fr}
+\blx@maplangtagr{friulan}{fur-it}
+\blx@maplangtagr{galician}{gl-es}
+\blx@maplangtagr{german}{de}
+\blx@maplangtagr{germanb}{de-de}
+\blx@maplangtagr{greek}{el-gr}
+\blx@maplangtagr{hebrew}{he-il}
+\blx@maplangtagr{hindi}{hi-in}
+\blx@maplangtagr{ibygreek}{el-cy}
+\blx@maplangtagr{icelandic}{is-is}
+\blx@maplangtagr{indon}{id-id}
+\blx@maplangtagr{indonesia}{id-id}
+\blx@maplangtagr{interlingua}{ia-fr}
+\blx@maplangtagr{irish}{ga-ie}
+\blx@maplangtagr{italian}{it-it}
+\blx@maplangtagr{japanese}{ja-jp}
+\blx@maplangtagr{kannada}{kn-in}
+\blx@maplangtagr{lao}{lo-la}
+\blx@maplangtagr{latin}{la-latn}
+\blx@maplangtagr{latvian}{lv-lv}
+\blx@maplangtagr{lithuanian}{lt-lt}
+\blx@maplangtagr{lowersorbian}{dsb-de}
+\blx@maplangtagr{lsorbian}{dsb-de}
+\blx@maplangtagr{magyar}{hu-hu}
+\blx@maplangtagr{malay}{id-id}
+\blx@maplangtagr{malayalam}{ml-in}
+\blx@maplangtagr{marathi}{mr-in}
+\blx@maplangtagr{meyalu}{id-id}
+\blx@maplangtagr{mongolian}{mn-cyrl}
+\blx@maplangtagr{naustrian}{de-at}
+\blx@maplangtagr{newzealand}{en-nz}
+\blx@maplangtagr{ngerman}{de-de-1996}
+\blx@maplangtagr{nko}{ha-ng}
+\blx@maplangtagr{norsk}{nb-no}
+\blx@maplangtagr{norwegian}{nn-no}
+\blx@maplangtagr{nynorsk}{nn-no}
+\blx@maplangtagr{occitan}{oc-fr}
+\blx@maplangtagr{piedmontese}{pms-it}
+\blx@maplangtagr{pinyin}{pny}
+\blx@maplangtagr{polish}{pl-pl}
+\blx@maplangtagr{polutonikogreek}{el-gr}
+\blx@maplangtagr{portuges}{pt-pt}
+\blx@maplangtagr{portuguese}{pt-pt}
+\blx@maplangtagr{romanian}{ro-ro}
+\blx@maplangtagr{romansh}{rm-ch}
+\blx@maplangtagr{russian}{ru-ru}
+\blx@maplangtagr{samin}{se-no}
+\blx@maplangtagr{sanskrit}{sa-in}
+\blx@maplangtagr{scottish}{gd-gb}
+\blx@maplangtagr{serbian}{sr-latn}
+\blx@maplangtagr{serbianc}{sr-cyrl}
+\blx@maplangtagr{slovak}{sk-sk}
+\blx@maplangtagr{slovene}{sl-si}
+\blx@maplangtagr{slovenian}{sl-si}
+\blx@maplangtagr{spanish}{es-es}
+\blx@maplangtagr{swedish}{sv-se}
+\blx@maplangtagr{swiss}{de-ch}
+\blx@maplangtagr{swissgerman}{de-ch}
+\blx@maplangtagr{nswissgerman}{de-ch}
+\blx@maplangtagr{syriac}{syc}
+\blx@maplangtagr{tamil}{ta-in}
+\blx@maplangtagr{telugu}{te-in}
+\blx@maplangtagr{thai}{th-th}
+\blx@maplangtagr{thaicjk}{th-th}
+\blx@maplangtagr{tibetan}{bo-cn}
+\blx@maplangtagr{turkish}{tr-tr}
+\blx@maplangtagr{turkmen}{tk-tm}
+\blx@maplangtagr{ukrainian}{uk-ua}
+\blx@maplangtagr{urdu}{ur-in}
+\blx@maplangtagr{ukenglish}{en-uk}
+\blx@maplangtagr{uppersorbian}{hsb-de}
+\blx@maplangtagr{usenglish}{en-us}
+\blx@maplangtagr{usorbian}{hsb-de}
+\blx@maplangtagr{vietnamese}{vi-vn}
+\blx@maplangtagr{welsh}{cy-gb}
+
+\def\blx@bblend{%
+ % Create all namepart macros now that we know the valid bbl forms/langs
+ \def\do##1{%
+ \begingroup
+ \def\do####1{%
+ \begingroup
+ \def\do########1{%
+ \blx@kv@gdefkey{blx@opt@nameparts}{##1####1########1}{%
+ \csdef{namepart##1####1########1}{%
+ % begin language for name list part alternate
+ \edef\blx@tempa{\csuse{blx@msmaplang@########1}}%
+ \ifdef\blx@thefieldlangenv
+ {\iftoggle{blx@autofieldlangstrings}
+ {\blx@langsetup{\blx@tempa}% must call this to load the .lbx
+ \csuse{abx@extras@\blx@tempa}%
+ \csuse{abx@strings@\blx@tempa}}
+ {}%
+ \blx@hook@initfieldlang
+ \begingroup
+ \csname\blx@thefieldlangenv\expandafter\endcsname\expandafter{\blx@tempa}}
+ {}%
+ ################1%
+ \ifdef\blx@thefieldlangenv
+ {\blx@hook@endfieldlang
+ \csname end\blx@thefieldlangenv\endcsname
+ \endgroup}
+ {}}}%
+ \blx@kv@gdefkey{blx@opt@nameparts}{##1####1########1i}{%
+ \csdef{namepart##1####1########1i}{%
+ % begin language for name list part initials alternate
+ \edef\blx@tempa{\csuse{blx@msmaplang@########1}}%
+ \ifdef\blx@thefieldlangenv
+ {\iftoggle{blx@autofieldlangstrings}
+ {\blx@langsetup{\blx@tempa}% must call this to load the .lbx
+ \csuse{abx@extras@\blx@tempa}%
+ \csuse{abx@strings@\blx@tempa}}
+ {}%
+ \blx@hook@initfieldlang
+ \begingroup
+ \csname\blx@thefieldlangenv\expandafter\endcsname\expandafter{\blx@tempa}}
+ {}%
+ ################1%
+ \ifdef\blx@thefieldlangenv
+ {\blx@hook@endfieldlang
+ \csname end\blx@thefieldlangenv\endcsname
+ \endgroup}}}}%
+ \expandafter\docsvlist\expandafter{\blx@mslangs}%
+ \endgroup}%
+ \expandafter\docsvlist\expandafter{\blx@msforms}%
+ \endgroup}%
+ \expandafter\docsvlist\expandafter{\blx@datamodel@constant@nameparts}%
+ % Create all listitem macros now that we know the valid bbl forms/langs
+ \def\do##1{%
+ \begingroup
+ \def\do####1{%
+ \blx@kv@gdefkey{blx@opt@listitems}{##1####1}{%
+ \csdef{listitem##1####1}{%
+ % begin language for list item alternate
+ \edef\blx@tempa{\csuse{blx@msmaplang@####1}}%
+ \ifdef\blx@thefieldlangenv
+ {\iftoggle{blx@autofieldlangstrings}
+ {\blx@langsetup{\blx@tempa}% must call this to load the .lbx
+ \csuse{abx@extras@\blx@tempa}%
+ \csuse{abx@strings@\blx@tempa}}
+ {}%
+ \blx@hook@initfieldlang
+ \begingroup
+ \csname\blx@thefieldlangenv\expandafter\endcsname\expandafter{\blx@tempa}}
+ {}%
+ ########1%
+ \ifdef\blx@thefieldlangenv
+ {\blx@hook@endfieldlang
+ \csname end\blx@thefieldlangenv\endcsname
+ \endgroup}}}}%
+ \expandafter\docsvlist\expandafter{\blx@mslangs}%
+ \endgroup}%
+ \expandafter\docsvlist\expandafter{\blx@msforms}%
+ \def\blx@do@outer##1{%
+ \ifcsundef{blx@prelim@lastcites@##1}
+ {}
+ {\def\blx@do@inner####1{%
+ \ifinlistcs{####1}{blx@keyaliases@##1}
+ {\listcsxadd{blx@lastcites@##1}
+ {\csuse{blx@keyalias@##1@####1}}}
+ {\listcsgadd{blx@lastcites@##1}{####1}}}%
+ \forlistcsloop\blx@do@inner{blx@prelim@lastcites@##1}}}%
+ \forlistloop\blx@do@outer\blx@alllastrefsections
+ % Special warning for defernumbers when a citation cannot be found
+ \iftoggle{blx@defernumbers}
+ {\def\blx@do@outer##1{%
+ \ifcsundef{blx@lastcites@##1}
+ {}
+ {\def\blx@do@inner####1{%
+ \ifinlistcs{####1}{blx@entries@##1}
+ {}
+ {\blx@warning@noline{%
+ citation '####1'\MessageBreak
+ was not found at all in the .bbl file,\MessageBreak
+ bibliography labels cannot be generated,\MessageBreak
+ please correct the citation}}}%
+ \forlistcsloop\blx@do@inner{blx@lastcites@##1}}}%
+ \forlistloop\blx@do@outer\blx@alllastrefsections}
+ {}}
+
+% {<entrykey>}
+% Get the saved information on which citations were mentioned last run
+\protected\def\abx@aux@cite#1#2{%
+ \xifinlistcs{\detokenize{#2}}{blx@prelim@lastcites@#1}
+ {}
+ {\listcsxadd{blx@prelim@lastcites@#1}{\detokenize{#2}}}}
+
+% {<refcontext>}
+% Get the saved information on which refcontexts were mentioned last run
+\protected\def\abx@aux@refcontext#1{%
+ \xifinlist{\detokenize{#1}}\blx@lastrefcontexts
+ {}
+ {\listxadd\blx@lastrefcontexts{\detokenize{#1}}}}
+
+% {<sortingtemplatename>}
+% Get the saved information on which shorthand sorting templates were mentioned last run
+\protected\def\abx@aux@biblist#1{%
+ \ifinlist{#1}\blx@lastbiblists
+ {}
+ {\listgadd\blx@lastbiblists{#1}}}
+
+% Here we mustn't change the checksum if we used localnumbers from the
+% .aux file as this means that deferred numbering is
+% complete. Otherwise we get in an endless rerun loop because the
+% checksum due to number changes is always different.
+\blx@AtEndDocument{%
+ \def\abx@aux@number#1#2#3#4#5{%
+ \ifblank{#5}
+ {}
+ {\nottoggle{blx@localnumber}
+ {\blx@addchecksum{#1}{#5}}
+ {}}}}
+
+\blx@AtEndDocument{%
+ % Here we run some tests to decide if we need to issue re-run
+ % messages in certain circumstances. In general, if we add/remove
+ % any citations or add/remove any sorting templates, we need to re-run
+ % biber. Also, if we have to re-run biber, we need to defer writing
+ % the defernumbers .aux information because it will not yet be correct.
+ \begingroup
+ % Test to see if there are any .aux entries with defernums (localnum)
+ % information which are no longer in the .bbl. This is to catch
+ % when .bib entries are removed when using \nocite{*}. In this case,
+ % We need another run to remove the .aux localnumber info
+ \def\blx@do@outer#1{%
+ \def\blx@do@inner##1{%
+ \xifinlistcs{##1}{blx@entries@#1}
+ {}
+ {\blx@rerun@latex
+ \listbreak}}%
+ \forlistloop\blx@do@inner\blx@localnumbers}%
+ \forlistloop\blx@do@outer\blx@allrefsections
+ % Test to see if we *removed* any citations since last run
+ % (adding citations is dealt with naturally in \blx@citation@entry)
+ % If so, give a rerun biber message. This also sets the
+ % rerun biber toggle so defernums doesn't consume the localnumbers
+ % in the .aux but instead, re-writes them, which is what we need.
+ \def\blx@do@outer#1{%
+ \ifcsundef{blx@lastcites@#1}
+ {}
+ {\def\blx@do@inner##1{%
+ \ifinlistcs{##1}{blx@cites@#1}
+ {}
+ {\blx@logreq@active{}%
+ \listbreak}}%
+ \forlistcsloop\blx@do@inner{blx@lastcites@#1}}}%
+ \forlistloop\blx@do@outer\blx@alllastrefsections
+ % Special case - if we are using sortingtemplate with \citeorder anywhere,
+ % then changes in citation order matter and we need to re-run biber.
+ % So a special test to see if the cites from last run are identical in order.
+ % We have already tested for more or less cites between runs by now, we are
+ % testing here for exactly the same cites by treating the cite and
+ % lastcite lists as strings and comparing them. This doesn't apply
+ % to biblist sortingtemplates as nobody wants to sort biblists with
+ % "none", since it makes no sense
+ \togglefalse{blx@tempa}%
+ \def\do#1{%
+ \ifcsundef{blx@sortingtemplate@citeorder@relevant@#1}
+ {}
+ {\toggletrue{blx@tempa}%
+ \listbreak}}%
+ \dolistloop\blx@sortingtemplatenames
+ \iftoggle{blx@tempa}
+ {\ifdefstrequal\blx@allrefsections\blx@alllastrefsections
+ {\def\do#1{%
+ \ifcsundef{blx@cites@#1}
+ {\cslet{blx@cites@#1}\@empty}
+ {}%
+ \ifcsundef{blx@lastcites@#1}
+ {\cslet{blx@lastcites@#1}\@empty}
+ {}%
+ \ifcsstrequal{blx@cites@#1}{blx@lastcites@#1}
+ {}
+ {\blx@logreq@active{}%
+ \listbreak}}%
+ \dolistloop\blx@allrefsections}
+ {\blx@logreq@active{}}}
+ {}%
+ % if citecount is enabled we pass the counter on to Biber via the bcf
+ % for sorting, we need to rerun if anything here changed
+ \ifundef\blx@citecounter
+ {}
+ {\def\blx@do@outer#1{%
+ \ifcsundef{blx@cites@#1}
+ {}
+ {\def\blx@do@inner##1{%
+ \ifnumequal{0\csuse{blx@currcount@#1@\detokenize{##1}}}
+ {0\csuse{blx@count@#1@\detokenize{##1}}}
+ {}
+ {\blx@logreq@active{}%
+ \listbreak}}%
+ \forlistcsloop\blx@do@inner{blx@cites@#1}}}%
+ \forlistloop\blx@do@outer\blx@allrefsections}%
+ % Test if we removed any mention of a reference context since last run
+ % If we did, we need to re-run biber
+ \def\do#1{\ifinlist{#1}\blx@refcontexts{}{\blx@logreq@active{}}\relax}%
+ \dolistloop\blx@lastrefcontexts
+ % Test if we added any mention of a reference context since last run
+ % If we did, we need to re-run biber
+ \def\do#1{\ifinlist{#1}\blx@lastrefcontexts{}{\blx@logreq@active{}}\relax}%
+ \dolistloop\blx@refcontexts
+ % Test if we removed any mention of a biblist since last run.
+ % If we did, we need to re-run biber
+ \def\do#1{\ifinlist{#1}\blx@biblists{}{\blx@logreq@active{}}\relax}%
+ \dolistloop\blx@lastbiblists
+ % Test to see if we added any mention of a biblist since last run.
+ % If we did, we need to re-run biber
+ \def\do#1{\ifinlist{#1}\blx@lastbiblists{}{\blx@logreq@active{}}\relax}%
+ \dolistloop\blx@biblists
+ % If we have to run biber or latex again and we are using defernumbers,
+ % don't write the localnumber information to the .aux file yet as we will
+ % potentially have to regenerate sorting order first in biber
+ \iftoggle{blx@defernumbers}
+ {\iftoggle{blx@runbiber}
+ {}
+ {\def\do#1{\blx@auxwrite\@mainaux{}{#1}}
+ \dolistloop\blx@localnumaux}}
+ {}%
+ % Write out missing languages we still need to load
+ \forlistloop{\blx@lbx@writeloaderequest}{\blx@lbx@loadlist}%
+ % Issue rerun warning if we need to load a language babel/polyglossia
+ % hasn't told us about and that we are not loading it already from previous
+ % runs.
+ \def\do#1{\xifinlist{#1}{\blx@lbx@auxloadlist}{}{\blx@rerun@latex\listbreak}}%
+ \dolistloop\blx@lbx@loadlist
+ % Write md5 hash of .bbl to .aux if we need a Biber rerun.
+ % This needs to happen here and not in \blx@check@rerun together with
+ % the other rerun stuff, because \AfterEndDocument would be too
+ % late for .aux file writing.
+ \blx@aux@write@bbl@mdfivesum
+ \endgroup}
+
+% {<instcount>}{<entrykey>}{<refsection>}{<refcontext>}{<labelnumber>}
+\protected\def\blx@aux@number#1#2#3#4#5{%
+ \blx@bbl@addentryfield{\detokenize{#2}}{#3}{localnumber}{#4}{#5}%
+ \blx@bbl@addentryfield{\detokenize{#2}}{#3}{labelnumber}{#4}{#5}%
+ \csgdef{blx@localnumber@#3@\detokenize{#2}}{#5}%
+ \xifinlistcs{\detokenize{#2}}{blx@localnumbers@#3}
+ {}
+ {\listcsxadd{blx@localnumbers@#3}{\detokenize{#2}}}%
+ \global\toggletrue{blx@localnumber}%
+ \ifblank{#5}
+ {}
+ {\csgdef{blx@labelnumber@#3}{#5}}}
+
+% Called as part of bib output for an entry
+% Only used when defernumbers=true
+\def\blx@addlabelnumber{%
+ \begingroup
+ \nottoggle{blx@skiplab}
+ {\iftoggle{blx@labelnumber}
+ {\ifundef\abx@field@@@shorthand
+ % Need to know if we set any localnumber from .aux file, not
+ % just current item. Otherwise, we may just write new
+ % localnumbers but not existing ones
+ % Also, don't want to regenerate localnumber for any key in a
+ % refsection which we've already seen because this has the nasty
+ % side-effect of incrementing the localnum counter
+ % Also, have to create localnumber again if \nocite{*} as items
+ % could have been added to the .bib file without changing the cite
+ % information in the .tex
+ {\ifboolexpr { (not togl {blx@localnumber}
+ or
+ test {\ifinlist{*}\blx@nocites})
+ and
+ not test {\ifcsdef{blx@defer@\the\c@refsection @\blx@refcontext@context @\abx@field@@@entrykey}} }
+ {\iftoggle{blx@omitnumbers}
+ {\let\abx@field@@@localnumber\@empty}
+ {\csnumgdef{blx@labelnumber@\the\c@refsection}{%
+ \csuse{blx@labelnumber@\the\c@refsection}+1}%
+ \edef\abx@field@@@localnumber{%
+ \csuse{blx@labelnumber@\the\c@refsection}}%
+ \blx@bbl@addentryfield{\abx@field@@@entrykey}{\the\c@refsection}%
+ {localnumber}{\blx@refcontext@context}{\abx@field@@@localnumber}}}
+ {}%
+ % Issue re-run message if there was no localnumber in the .aux and
+ % \nocite{*} was used because this means that an entry was added to the .bib
+ % and was not yet recorded in the .aux. We will have generated a localnumber
+ % for such a case above and now we need to re-run to make sure it's in the .aux
+ % for the next run
+ \ifboolexpr { test {\ifinlist{*}\blx@nocites}
+ and
+ not test {\ifcsdef{blx@localnumber@\the\c@refsection @\abx@field@@@entrykey}} }
+ {\blx@rerun@latex}
+ {}%
+ % If localnumbers were already in the .aux, add them
+ % again from the .aux. This prevents some cycling
+ % problems where pagebreaks change after localnumber
+ % settles down and then we need another run which then
+ % regenerates localnumber requiring another run but then
+ % the pagebreaks change back again ... etc.
+ \ifcsundef{blx@defer@\the\c@refsection @\blx@refcontext@context @\abx@field@@@entrykey}
+ {\ifundef\abx@field@@@localnumber
+ {}
+ {\listxadd\blx@localnumaux{%
+ \string\abx@aux@number%
+ {\the\c@instcount}%
+ {\abx@field@@@entrykey}%
+ {\the\c@refsection}%
+ {\blx@refcontext@context}%
+ {\abx@field@@@localnumber}}%
+ % record that we have already generated and output localnum
+ % for this key in this refsection/refcontext
+ \global\cslet{blx@defer@\the\c@refsection @\blx@refcontext@context @\abx@field@@@entrykey}\@empty}}
+ {}}
+ {}}%
+ {}}
+ {}%
+ \endgroup}
+
+% {<datalistname>}
+\def\blx@bbl@dlist[#1]#2{%
+ \begingroup
+ \def\blx@dlist@type{#1}%
+ \def\blx@dlist@name{#2}}
+
+\def\blx@bbl@enddlist{%
+ \csnumgdef{blx@labelnumber@\the\c@refsection}{0}%
+ \endgroup}
+
+\def\blx@addpageref#1{%
+ \begingroup
+ \blx@tempcnta\z@
+ \let\blx@tempa\@empty
+ \def\do##1{%
+ \appto\blx@tempa{{##1}}%
+ \advance\blx@tempcnta\@ne}%
+ \dolistcsloop{blx@pref@\the\c@refsection @#1}%
+ \edef\blx@tempa{\endgroup
+ \noexpand\blx@bbl@listdef{}{}{pageref}{\the\blx@tempcnta}{\expandonce{\blx@tempa}}}%
+ \blx@tempa}
+
+%% Data input
+\def\blx@bblinput{%
+ \begingroup
+ \blx@info@noline{Trying to load bibliographic data..}%
+ \blx@blxinit
+ \blx@bblfile
+ \endgroup}
+
+\def\blx@bblfile{%
+ \blx@secinit
+ \begingroup
+ \blx@bblstart
+ \blx@ifsigned{\jobname}{bbl}
+ {\InputIfFileExists{\jobname.bbl}
+ {\blx@info@noline{... file '\jobname.bbl' found}%
+ \global\toggletrue{blx@bbldone}%
+ \blx@generate@bbl@mdfivesum@found{\jobname.bbl}}
+ {\blx@info@noline{... file '\jobname.bbl' not found}%
+ \typeout{No file \jobname.bbl.}%
+ \blx@generate@bbl@mdfivesum@notfound}}
+ {\blx@generate@bbl@mdfivesum@notfound}%
+ \blx@bblend
+ \endgroup
+ % Check if Biber rerun was not carried out.
+ % If so, ask for it again.
+ \blx@check@bbl@rerun@mdfivesum
+ % global sorting as this is called at BeginDocument
+ \csnumgdef{blx@labelnumber@\the\c@refsection}{0}}
+
+%% Bibliography
+
+% {<name>}{<start code>}[<end code>]{<item code>}
+\newrobustcmd*{\defbibenvironment}[4]{%
+ \long\csdef{blx@env@#1}{#2}%
+ \long\csdef{blx@endenv@#1}{#3}%
+ \long\csdef{blx@item@#1}{#4}}
+
+\defbibenvironment{bibliography}
+ {\list{}{%
+ \leftmargin\bibhang
+ \itemindent-\leftmargin
+ \itemsep\bibitemsep
+ \parsep\bibparsep}}
+ {\endlist}
+ {\item}
+
+\def\do#1{%
+ \defbibenvironment{#1}
+ {\list{\thefield{#1}}{%
+ \labelwidth\csname #1width\endcsname
+ \labelsep\biblabelsep
+ \leftmargin\labelwidth
+ \advance\leftmargin\labelsep
+ \itemsep\bibitemsep
+ \parsep\bibparsep
+ \def\makelabel####1{####1\hss}}}
+ {\endlist}
+ {\item}}
+\abx@dolabelfields
+
+% {<name>}[<default>]{<code>}
+\newrobustcmd*{\defbibheading}[1]{%
+ \@ifnextchar[%]
+ {\blx@defbibheading{blx@head@#1}}
+ {\blx@defbibheading{blx@head@#1}[\bibname]}}
+
+\def\blx@defbibheading#1[#2]{%
+ \csundef{#1}%
+ \expandafter\newcommand\csname#1\endcsname[1][{#2}]}
+
+% {<name>}{<text>}
+\newrobustcmd*{\defbibnote}[1]{%
+ \blx@defbibnote{#1}}
+
+\long\def\blx@defbibnote#1#2{%
+ \long\csdef{blx@note@#1}{#2}}
+
+% {<name>}{<code>}
+\newrobustcmd*{\defbibfilter}[2]{%
+ \begingroup
+ \def\blx@flt@error{\csname blx@flt@errortrue\endcsname}%
+ \let\not\blx@flt@not \let\NOT\not
+ \let\and\blx@flt@and \let\AND\and
+ \let\or\blx@flt@or \let\OR\or
+ \letcs\({blx@flt@(} \letcs\){blx@flt@)}%
+ \def\section##1{\blx@flt@error}%
+ \def\segment##1{segment=##1}%
+ \def\type##1{type=##1}%
+ \def\subtype##1{subtype=##1}%
+ \def\keyword##1{keyword={##1}}%
+ \def\category##1{category={##1}}%
+ \edef\blx@tempa{\noexpand\blx@defbibfilter{#2}}%
+ \ifdef\blx@flt@errortrue
+ {\blx@err@filter}
+ {\let\the\relax
+ \let\blx@flt@item\relax
+ \edef\blx@tempa{\blx@tempa}%
+ \ifdef\blx@flt@errortrue
+ {\blx@err@filter}
+ {\csxdef{blx@filter@#1}{\blx@tempa}}}%
+ \endgroup}
+
+\def\blx@defbibfilter#1{%
+ \blx@defbibfilter@i#1 &}
+\def\blx@defbibfilter@i#1 #2&{%
+ \blx@defbibfilter@ii#1==&%
+ \ifblank{#2}{}{\blx@defbibfilter@i#2 &}}
+\def\blx@defbibfilter@ii#1=#2=#3&{%
+ \ifblank{#2}
+ {\ifblank{#1}
+ {}
+ {\ifcsdef{blx@flt@#1}
+ {\csname blx@flt@#1\endcsname}
+ {\blx@flt@error}}}
+ {\ifcsdef{blx@flt@#1}
+ {\csname blx@flt@#1\endcsname{\detokenize{#2}}}
+ {\blx@flt@error}}}
+
+\def\blx@flt@and{ and }
+\def\blx@flt@or{ or }
+\def\blx@flt@not{ not }
+\csdef{blx@flt@(}{ ( }
+\csdef{blx@flt@)}{ ) }
+\def\blx@flt@segment#1{%
+ test {\xifinlistcs\blx@flt@item{blx@segm@\the\c@refsection @#1}}}
+\def\blx@flt@type#1{%
+ test {\xifinlistcs\blx@flt@item{blx@type@\the\c@refsection @#1}}}
+\def\blx@flt@subtype#1{%
+ test {\xifinlistcs\blx@flt@item{blx@subt@\the\c@refsection @#1}}}
+\def\blx@flt@keyword#1{%
+ test {\xifinlistcs\blx@flt@item{blx@keyw@\the\c@refsection @#1}}}
+\def\blx@flt@category#1{%
+ test {\xifinlistcs\blx@flt@item{blx@catg@#1}}}
+
+% {<name>}{<code>}
+\newrobustcmd*{\defbibcheck}[2]{%
+ \csdef{blx@bibcheck@#1}{%
+ \togglefalse{blx@skipentry}%
+ \def\skipentry{\toggletrue{blx@skipentry}}%
+ #2\undef\skipentry}}
+
+% options
+% We need a 2-pass structure for options in \printbibliography and
+% \printbiblist because the section has to be set before any
+% other options and this partly determines which list to use for later filtering
+\blx@kv@defkey{blx@bib1}{segment}{}
+\blx@kv@defkey{blx@bib1}{type}{}
+\blx@kv@defkey{blx@bib1}{nottype}{}
+\blx@kv@defkey{blx@bib1}{subtype}{}
+\blx@kv@defkey{blx@bib1}{notsubtype}{}
+\blx@kv@defkey{blx@bib1}{keyword}{}
+\blx@kv@defkey{blx@bib1}{notkeyword}{}
+\blx@kv@defkey{blx@bib1}{category}{}
+\blx@kv@defkey{blx@bib1}{notcategory}{}
+\blx@kv@defkey{blx@bib1}{filter}{}
+\blx@kv@defkey{blx@bib1}{check}{}
+\blx@kv@defkey{blx@bib1}{heading}{}
+\blx@kv@defkey{blx@bib1}{env}{}
+\blx@kv@defkey{blx@bib1}{title}{}
+\blx@kv@defkey{blx@bib1}{label}{}
+\blx@kv@defkey{blx@bib1}{prenote}{}
+\blx@kv@defkey{blx@bib1}{postnote}{}
+\blx@kv@defkey{blx@bib1}{omitnumbers}[]{}
+% Here we are using the first pass to see if there is an explicit setting for resetnumbers
+% If there isn't we will use the default behaviour where if there is a labelprefix,
+% resetnumbers will default to "true"
+\blx@kv@defkey{blx@bib1}{resetnumbers}[true]{%
+ \toggletrue{blx@resetnumsexplicit}}
+
+\blx@kv@defkey{blx@bib2}{section}{}
+\blx@kv@defkey{blx@bib2}{sorting}{}
+
+\blx@kv@defkey{blx@biblist1}{segment}{}
+\blx@kv@defkey{blx@biblist1}{type}{}
+\blx@kv@defkey{blx@biblist1}{nottype}{}
+\blx@kv@defkey{blx@biblist1}{subtype}{}
+\blx@kv@defkey{blx@biblist1}{notsubtype}{}
+\blx@kv@defkey{blx@biblist1}{keyword}{}
+\blx@kv@defkey{blx@biblist1}{notkeyword}{}
+\blx@kv@defkey{blx@biblist1}{category}{}
+\blx@kv@defkey{blx@biblist1}{notcategory}{}
+\blx@kv@defkey{blx@biblist1}{filter}{}
+\blx@kv@defkey{blx@biblist1}{check}{}
+\blx@kv@defkey{blx@biblist1}{heading}{}
+\blx@kv@defkey{blx@biblist1}{env}{}
+\blx@kv@defkey{blx@biblist1}{title}{}
+\blx@kv@defkey{blx@biblist1}{label}{}
+\blx@kv@defkey{blx@biblist1}{prenote}{}
+\blx@kv@defkey{blx@biblist1}{postnote}{}
+
+\blx@kv@defkey{blx@biblist2}{section}{}
+\blx@kv@defkey{blx@biblist2}{sorting}{}
+
+\blx@kv@defkey{blx@bib1}{section}{%
+ \ifcsundef{blx@sections@#1}
+ {\blx@err@nosec{#1}}
+ {\c@refsection#1\relax
+ \def\blx@tempe{#1}}}
+
+\blx@kv@defkey{blx@biblist1}{section}{%
+ \ifcsundef{blx@sections@#1}
+ {\blx@err@nosec{#1}}
+ {\c@refsection#1\relax
+ \def\blx@tempe{#1}}}
+
+\blx@kv@defkey{blx@bbg}{section}{%
+ \ifcsundef{blx@sections@#1}
+ {\blx@err@nosec{#1}}
+ {\c@refsection#1\relax}}
+
+\blx@kv@defkey{blx@bbc}{section}{%
+ \ifcsundef{blx@sections@#1}
+ {\blx@err@nosec{#1}}
+ {\c@refsection#1\relax}}
+
+\blx@kv@defkey{blx@bib2}{segment}{\blx@key@segment{#1}}
+\blx@kv@defkey{blx@biblist2}{segment}{\blx@key@segment{#1}}
+
+\def\blx@key@segment#1{%
+ \ifcsundef{blx@segm@\the\c@refsection @#1}
+ {\blx@warning{Segment '#1' not found in section '\the\c@refsection'}}
+ {\c@refsegment#1\relax
+ \blx@printbibchecks
+ \blx@filter\blx@tempa{blx@segm@\the\c@refsection @#1}}}
+
+\blx@kv@defkey{blx@bib2}{type}{\blx@key@type{#1}}
+\blx@kv@defkey{blx@biblist2}{type}{\blx@key@type{#1}}
+
+\def\blx@key@type#1{%
+ \ifcsundef{blx@type@\the\c@refsection @#1}
+ {\blx@warning{Type '#1' not found}%
+ \let\blx@tempa\@empty}
+ {\blx@printbibchecks
+ \iftoggle{blx@tempb}
+ {\togglefalse{blx@tempb}%
+ \blx@filter\blx@tempa{blx@type@\the\c@refsection @#1}}
+ {\let\blx@tempa\@empty
+ \blx@error
+ {'type' used multiple times}
+ {When passing multiple filter options, each entry\MessageBreak
+ must satisfy all conditions (AND conjunction),\MessageBreak
+ hence some options may not be used twice.\MessageBreak
+ Use 'filter' and '\string\defbibfilter' with OR conjunctions}}}}
+
+\blx@kv@defkey{blx@bib2}{nottype}{\blx@key@nottype{#1}}
+\blx@kv@defkey{blx@biblist2}{nottype}{\blx@key@nottype{#1}}
+
+\def\blx@key@nottype#1{%
+ \ifcsundef{blx@type@\the\c@refsection @#1}
+ {}
+ {\blx@printbibchecks
+ \blx@notfilter\blx@tempa{blx@type@\the\c@refsection @#1}}}
+
+\blx@kv@defkey{blx@bib2}{subtype}{\blx@key@subtype{#1}}
+\blx@kv@defkey{blx@biblist2}{subtype}{\blx@key@subtype{#1}}
+
+\def\blx@key@subtype#1{%
+ \ifcsundef{blx@subt@\the\c@refsection @#1}
+ {\blx@warning{Subtype '#1' not found}%
+ \let\blx@tempa\@empty}
+ {\blx@printbibchecks
+ \iftoggle{blx@tempb}
+ {\togglefalse{blx@tempb}%
+ \blx@filter\blx@tempa{blx@subt@\the\c@refsection @#1}}
+ {\let\blx@tempa\@empty
+ \blx@error
+ {'subtype' used multiple times}
+ {When passing multiple filter options, each entry\MessageBreak
+ must satisfy all conditions (AND conjunction),\MessageBreak
+ hence some options may not be used twice.\MessageBreak
+ Use 'filter' and '\string\defbibfilter' with OR conjunctions}}}}
+
+\blx@kv@defkey{blx@bib2}{notsubtype}{\blx@key@notsubtype{#1}}
+\blx@kv@defkey{blx@biblist2}{notsubtype}{\blx@key@notsubtype{#1}}
+
+\def\blx@key@notsubtype#1{%
+ \ifcsundef{blx@subt@\the\c@refsection @#1}
+ {}
+ {\blx@printbibchecks
+ \blx@notfilter\blx@tempa{blx@subt@\the\c@refsection @#1}}}
+
+\blx@kv@defkey{blx@bib2}{keyword}{\blx@key@keyword{#1}}
+\blx@kv@defkey{blx@biblist2}{keyword}{\blx@key@keyword{#1}}
+
+\def\blx@key@keyword#1{%
+ \ifcsundef{blx@keyw@\the\c@refsection @\detokenize{#1}}
+ {\blx@warning{Keyword '\detokenize{#1}' not found}%
+ \let\blx@tempa\@empty}
+ {\blx@printbibchecks
+ \blx@filter\blx@tempa{blx@keyw@\the\c@refsection @\detokenize{#1}}}}
+
+\blx@kv@defkey{blx@bib2}{notkeyword}{\blx@key@notkeyword{#1}}
+\blx@kv@defkey{blx@biblist2}{notkeyword}{\blx@key@notkeyword{#1}}
+
+\def\blx@key@notkeyword#1{%
+ \ifcsundef{blx@keyw@\the\c@refsection @\detokenize{#1}}
+ {}
+ {\blx@printbibchecks
+ \blx@notfilter\blx@tempa{blx@keyw@\the\c@refsection @\detokenize{#1}}}}
+
+\blx@kv@defkey{blx@bib2}{category}{\blx@key@category{#1}}
+\blx@kv@defkey{blx@biblist2}{category}{\blx@key@category{#1}}
+
+\def\blx@key@category#1{%
+ \ifcsundef{blx@catg@\detokenize{#1}}
+ {\blx@warning{Category '\detokenize{#1}' not found}%
+ \let\blx@tempa\@empty}
+ {\blx@printbibchecks
+ \blx@filter\blx@tempa{blx@catg@\detokenize{#1}}}}
+
+\blx@kv@defkey{blx@bib2}{notcategory}{\blx@key@notcategory{#1}}
+\blx@kv@defkey{blx@biblist2}{notcategory}{\blx@key@notcategory{#1}}
+
+\def\blx@key@notcategory#1{%
+ \ifcsundef{blx@catg@#1}
+ {}
+ {\blx@printbibchecks
+ \blx@notfilter\blx@tempa{blx@catg@#1}}}
+
+\blx@kv@defkey{blx@bib2}{filter}{\blx@key@filter{#1}}
+\blx@kv@defkey{blx@biblist2}{filter}{\blx@key@filter{#1}}
+
+\def\blx@key@filter#1{%
+ \ifcsdef{blx@filter@#1}
+ {\blx@printbibchecks
+ \blx@bibfilter\blx@tempa{blx@filter@#1}}
+ {\let\blx@tempa\@empty
+ \blx@error
+ {Filter '#1' not found}
+ {The filter '#1' could not be found.\MessageBreak
+ Use \string\defbibfilter\space to define it}}}
+
+\blx@kv@defkey{blx@bib2}{check}{\blx@key@bibcheck{#1}}
+\blx@kv@defkey{blx@biblist2}{check}{\blx@key@bibcheck{#1}}
+
+% empty bibcheck does nothing
+\cslet{blx@bibcheck@}\relax
+\def\blx@key@bibcheck#1{%
+ \ifcsdef{blx@bibcheck@#1}
+ {\letcs\blx@bibcheck{blx@bibcheck@#1}}
+ {\let\blx@tempa\@empty
+ \blx@error
+ {Check '#1' not found}
+ {The check '#1' could not be found.\MessageBreak
+ Use \string\defbibcheck\space to define it}}}
+
+\def\blx@default@theheading{bibliography}
+\blx@kv@defkey{blx@bibdefaults}{heading}{%
+ \blx@key@heading{\blx@default@theheading}{#1}}
+\blx@kv@defkey{blx@bhd}{heading}{%
+ \blx@key@heading{\blx@theheading}{#1}}
+\blx@kv@defkey{blx@bib2}{heading}{%
+ \blx@key@heading{\blx@theheading}{#1}}
+\blx@kv@defkey{blx@biblist2}{heading}{%
+ \blx@key@heading{\blx@theheading}{#1}}
+\blx@kv@defkey{blx@bbs}{heading}{%
+ \blx@key@heading{\blx@theheading}{#1}}
+\blx@kv@defkey{blx@bbg}{heading}{%
+ \blx@key@heading{\blx@theheading}{#1}}
+
+\def\blx@key@heading#1#2{%
+ \ifcsundef{blx@head@#2}
+ {\blx@error
+ {Heading '#2' not found}
+ {The heading '#2' could not be found.\MessageBreak
+ Use \string\defbibheading\space to define it}}
+ {\def#1{#2}}}
+
+\def\blx@default@theenv{bibliography}
+\blx@kv@defkey{blx@bibdefaults}{env}{%
+ \blx@key@env{\blx@default@theenv}{#1}}
+\blx@kv@defkey{blx@bib2}{env}{\blx@key@env{\blx@theenv}{#1}}
+\blx@kv@defkey{blx@biblist2}{env}{\blx@key@env{\blx@theenv}{#1}}
+\blx@kv@defkey{blx@bbs}{env}{\blx@key@env{\blx@theenv}{#1}}
+\blx@kv@defkey{blx@bbg}{env}{\blx@key@env{\blx@theenv}{#1}}
+\blx@kv@defkey{blx@bbc}{env}{\blx@key@env{\blx@theenv}{#1}}
+
+\def\blx@key@env#1#2{%
+ \ifcsundef{blx@env@#2}
+ {\blx@error
+ {Environment '#2' not found}
+ {The environment '#2' could not be found.\MessageBreak
+ Use \string\defbibenvironment\space to define it}}
+ {\def#1{#2}}}
+
+\let\blx@default@thetitle\@empty
+\blx@kv@defkey{blx@bibdefaults}{title}{%
+ \def\blx@default@thetitle{#1}}
+\blx@kv@defkey{blx@bhd}{title}{\def\blx@thetitle{#1}}
+\blx@kv@defkey{blx@bib2}{title}{\def\blx@thetitle{#1}}
+\blx@kv@defkey{blx@biblist2}{title}{\def\blx@thetitle{#1}}
+
+\blx@kv@defkey{blx@bhd}{label}{\def\blx@thelabel{#1}}
+\blx@kv@defkey{blx@bib2}{label}{\def\blx@thelabel{#1}}
+\blx@kv@defkey{blx@biblist2}{label}{\def\blx@thelabel{#1}}
+
+\cslet{blx@note@}\@empty
+\def\blx@key@bibnote#1#2{%
+ \ifcsundef{blx@note@#2}
+ {\blx@error
+ {Note '#2' not found}
+ {The note '#2' could not be found.\MessageBreak
+ Use \string\defbibnote\space to define it}}
+ {\def#1{#2}}}
+
+\let\blx@default@theprenote\@empty
+\blx@kv@defkey{blx@bibdefaults}{prenote}{%
+ \blx@key@bibnote{\blx@default@theprenote}{#1}}
+\blx@kv@defkey{blx@bib2}{prenote}{%
+ \blx@key@bibnote{\blx@theprenote}{#1}}
+\blx@kv@defkey{blx@biblist2}{prenote}{%
+ \blx@key@bibnote{\blx@theprenote}{#1}}
+\blx@kv@defkey{blx@bbs}{prenote}{%
+ \blx@key@bibnote{\blx@theprenote}{#1}}
+\blx@kv@defkey{blx@bbg}{prenote}{%
+ \blx@key@bibnote{\blx@theprenote}{#1}}
+\blx@kv@defkey{blx@bbc}{prenote}{%
+ \blx@key@bibnote{\blx@theprenote}{#1}}
+
+\let\blx@default@thepostnote\@empty
+\blx@kv@defkey{blx@bibdefaults}{postnote}{%
+ \blx@key@bibnote{\blx@default@thepostnote}{#1}}
+\blx@kv@defkey{blx@bib2}{postnote}{%
+ \blx@key@bibnote{\blx@thepostnote}{#1}}
+\blx@kv@defkey{blx@biblist2}{postnote}{%
+ \blx@key@bibnote{\blx@thepostnote}{#1}}
+\blx@kv@defkey{blx@bbs}{postnote}{%
+ \blx@key@bibnote{\blx@thepostnote}{#1}}
+\blx@kv@defkey{blx@bbg}{postnote}{%
+ \blx@key@bibnote{\blx@thepostnote}{#1}}
+\blx@kv@defkey{blx@bbc}{postnote}{%
+ \blx@key@bibnote{\blx@thepostnote}{#1}}
+
+
+\blx@kv@defkey{blx@bibdefaults}{locallabelwidth}{%
+ \blx@key@locallabelwidth{#1}}
+\blx@kv@defkey{blx@bib1}{locallabelwidth}[]{}
+\blx@kv@defkey{blx@biblist1}{locallabelwidth}[]{}
+\blx@kv@defkey{blx@bib2}{locallabelwidth}[true]{%
+ \blx@key@locallabelwidth{#1}}
+\blx@kv@defkey{blx@biblist2}{locallabelwidth}[true]{%
+ \blx@key@locallabelwidth{#1}}
+
+\def\blx@key@locallabelwidth#1{%
+ \ifstrequal{#1}{true}
+ {\let\blx@locallabelwidth@init\blx@locallabelwidth@setlengths
+ \let\blx@locallabelwidth@finish\blx@locallabelwidth@write}
+ {\let\blx@locallabelwidth@init\relax
+ \let\blx@locallabelwidth@finish\relax}}
+
+\blx@kv@defkey{blx@bib2}{resetnumbers}[true]{%
+ \iftoggle{blx@defernumbers}
+ {\ifstrequal{#1}{true}
+ {\csnumdef{blx@labelnumber@\the\c@refsection}{0}}
+ {\ifstrequal{#1}{false}
+ {}
+ {\csnumdef{blx@labelnumber@\the\c@refsection}{#1-1}}}}
+ {\blx@warning{%
+ Option 'resetnumbers' requires 'defernumbers=true'.\MessageBreak
+ Ignoring 'resetnumbers=true'}}}
+
+\blx@kv@defkey{blx@bib2}{omitnumbers}[true]{%
+ \ifstrequal{#1}{true}
+ {\iftoggle{blx@defernumbers}
+ {\toggletrue{blx@omitnumbers}}
+ {\blx@warning{%
+ Option 'omitnumbers' requires 'defernumbers=true'.\MessageBreak
+ Ignoring 'omitnumbers=true'}}}
+ {}}
+
+
+\newrobustcmd*{\DeclarePrintbibliographyDefaults}{%
+ \blx@kv@setkeys{blx@bibdefaults}}
+
+% [<options>]
+\newrobustcmd*{\printbibheading}{%
+ \begingroup
+ \edef\on@line{\on@line}%
+ \@ifnextchar[%]
+ {\blx@printbibheading}
+ {\blx@printbibheading[]}}
+
+\def\blx@printbibheading[#1]{%
+ \let\blx@theheading\blx@default@theheading
+ \let\blx@thetitle\blx@default@thetitle
+ \undef\blx@thelabel
+ \blx@safe@actives
+ \blx@kv@setkeys{blx@bhd}{#1}%
+ \blx@rest@actives
+ \blx@bibheading\blx@theheading\blx@thetitle
+ \blx@biblabel\blx@thelabel
+ \endgroup}
+
+% We use this to determine whether an explicit value for resetnumbers is passed to
+% \printbibliography, if not, then we use the default behaviour where a labelprefix forces
+% a reset. It is useful that we have a 2-pass structure for \printbibliography keys anyway.
+\newtoggle{blx@resetnumsexplicit}
+
+% [<options>]
+\newrobustcmd*{\printbibliography}{%
+ \begingroup
+ \delimcontext{bib}%
+ \edef\on@line{\on@line}%
+ \@ifnextchar[%]
+ {\blx@printbibliography}
+ {\blx@printbibliography[]}}
+
+\def\blx@printbibliography[#1]{%
+ \toggletrue{blx@tempa}%
+ \toggletrue{blx@tempb}%
+ \let\blx@theheading\blx@default@theheading
+ \let\blx@theenv\blx@default@theenv
+ \let\blx@theprenote\blx@default@theprenote
+ \let\blx@thepostnote\blx@default@thepostnote
+ \let\blx@thetitle\blx@default@thetitle
+ \undef\blx@thelabel
+ % defaults
+ \let\blx@tempa\@empty% before there is a .bbl, this must not be undef
+ \edef\blx@tempe{\the\c@refsection}% default refsection is current
+ \blx@safe@actives
+ \togglefalse{blx@resetnumsexplicit}%
+ \blx@kv@setkeys{blx@bib1}{#1}% First pass options keys - section and resetnumbers
+ % Is there a user-specified option for resetnumbers? If so, this overrides the default
+ % "labelprefix implies resetnumbers" behaviour
+ \iftoggle{blx@resetnumsexplicit}
+ {}
+ {\ifdefempty\blx@refcontext@labelprefix
+ {\ifdefempty\blx@refcontext@labelprefix@real}
+ {\@secondoftwo}
+ {}
+ {\blx@kv@setkeys{blx@bib2}{resetnumbers}}}%
+ \blx@rest@actives
+ \ifcsvoid{blx@dlist@entry@\blx@tempe @\blx@refcontext@context}
+ {}
+ {\letcs\blx@tempa{blx@dlist@entry@\blx@tempe @\blx@refcontext@context}}%
+ \blx@safe@actives
+ % Must reset omitnumbers as it's a global macro and if we don't, any
+ % \printbibliography following one with this set will inherit any
+ % previous "true" value
+ \togglefalse{blx@omitnumbers}%
+ \blx@kv@setkeys{blx@bib2}{#1}% ... now we have correct \blx@tempa, set rest of options
+ \blx@rest@actives
+ % Add datalist to list of seen datalists to prevent duplicates
+ \xifinlist{\blx@refcontext@context @\blx@tempe @entry}\blx@dlistnames
+ {}
+ {\listxadd\blx@dlistnames{\blx@refcontext@context @\blx@tempe @entry}%
+ \xappto\blx@dlists{%
+ \blx@xml@dlist{\blx@refcontext@context}{entry}{\blx@tempe}{\blx@xml@dlist@refcontext{\blx@refcontext@sortingtemplatename}{\blx@refcontext@sortingnamekeytemplatename}{\blx@refcontext@labelprefix@real}{\blx@refcontext@uniquenametemplatename}{\blx@refcontext@labelalphanametemplatename}}{}}}%
+ \ifdefvoid\blx@tempa
+ {\blx@warn@bibempty\endgroup}
+ {\blx@bibliography\blx@tempa}}
+
+% [<options>]
+\newrobustcmd*{\bibbysection}{%
+ \begingroup
+ \delimcontext{bib}%
+ \ifnum\c@blx@maxsection=\z@
+ \blx@warning{No reference sections found}%
+ \fi
+ \edef\on@line{\on@line}%
+ \@ifnextchar[%]
+ {\blx@bibbysection}
+ {\blx@bibbysection[]}}
+
+\def\blx@bibbysection[#1]{%
+ \let\blx@theheading\blx@default@theheading
+ \let\blx@theenv\blx@default@theenv
+ \let\blx@theprenote\blx@default@theprenote
+ \let\blx@thepostnote\blx@default@thepostnote
+ \let\blx@thetitle\blx@default@thetitle
+ \undef\blx@thelabel
+ \c@refsection\z@
+ \blx@safe@actives
+ \blx@kv@setkeys{blx@bbs}{#1}%
+ \blx@rest@actives
+ \togglefalse{blx@tempa}%
+ \blx@refsections}
+
+\def\blx@refsections{%
+ \ifcsvoid{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}
+ {}
+ {\toggletrue{blx@tempa}%
+ \begingroup
+ \expandafter\blx@bibliography\csname blx@dlist@entry@\the\c@refsection @\blx@refcontext@context\endcsname}%
+ \ifnum\c@refsection<\c@blx@maxsection
+ \advance\c@refsection\@ne
+ \expandafter\blx@refsections
+ \else
+ \iftoggle{blx@tempa}{}{\blx@warn@bibempty}%
+ \endgroup
+ \fi}
+
+% [<options>]
+\newrobustcmd*{\bibbysegment}{%
+ \begingroup
+ \delimcontext{bib}%
+ \edef\on@line{\on@line}%
+ \ifnum\csname blx@maxsegment@\the\c@refsection\endcsname=\z@
+ \blx@warning{No reference segments found}%
+ \fi
+ \@ifnextchar[%]
+ {\blx@bibbysegment}
+ {\blx@bibbysegment[]}}
+
+\def\blx@bibbysegment[#1]{%
+ \let\blx@theheading\blx@default@theheading
+ \let\blx@theenv\blx@default@theenv
+ \let\blx@theprenote\blx@default@theprenote
+ \let\blx@thepostnote\blx@default@thepostnote
+ \let\blx@thetitle\blx@default@thetitle
+ \undef\blx@thelabel
+ \c@refsegment\@ne
+ \blx@safe@actives
+ \blx@kv@setkeys{blx@bbg}{#1}%
+ \blx@rest@actives
+ \togglefalse{blx@tempa}%
+ \blx@refsegments}
+
+\def\blx@refsegments{%
+ \ifcsvoid{blx@segm@\the\c@refsection @\the\c@refsegment}
+ {}
+ {\toggletrue{blx@tempa}%
+ \begingroup
+ \let\blx@tempa\@empty
+ \ifcsvoid{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}
+ {}
+ {\letcs\blx@tempa{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}}%
+ \blx@filter\blx@tempa{blx@segm@\the\c@refsection @\the\c@refsegment}%
+ \blx@bibliography\blx@tempa}%
+ \ifnum\c@refsegment<\csname blx@maxsegment@\the\c@refsection\endcsname
+ \advance\c@refsegment\@ne
+ \expandafter\blx@refsegments
+ \else
+ \iftoggle{blx@tempa}{}{\blx@warn@bibempty}%
+ \endgroup
+ \fi}
+
+% [<options>]
+\newrobustcmd*{\bibbycategory}{%
+ \begingroup
+ \delimcontext{bib}%
+ \edef\on@line{\on@line}%
+ \ifx\blx@categories\@empty
+ \blx@warning{No categories found}%
+ \fi
+ \@ifnextchar[%]
+ {\blx@bibbycategory}
+ {\blx@bibbycategory[]}}
+
+\def\blx@bibbycategory[#1]{%
+ \let\blx@theheading\blx@default@theheading
+ \let\blx@theenv\blx@default@theenv
+ \let\blx@theprenote\blx@default@theprenote
+ \let\blx@thepostnote\blx@default@thepostnote
+ \let\blx@thetitle\blx@default@thetitle
+ \undef\blx@thelabel
+ \c@refsection\z@
+ \blx@safe@actives
+ \blx@kv@setkeys{blx@bbc}{#1}%
+ \blx@rest@actives
+ \togglefalse{blx@tempa}%
+ \forlistloop\blx@bibcategory\blx@categories
+ \blx@endbibcategory}
+
+\def\blx@bibcategory#1{%
+ \ifcsvoid{blx@catg@#1}
+ {}
+ {\toggletrue{blx@tempa}%
+ \begingroup
+ \blx@key@heading{\blx@theheading}{#1}%
+ \let\blx@tempa\@empty
+ \ifcsvoid{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}
+ {}
+ {\letcs\blx@tempa{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}}%
+ \blx@filter\blx@tempa{blx@catg@#1}%
+ \blx@bibliography\blx@tempa}}%
+
+\def\blx@endbibcategory{%
+ \iftoggle{blx@tempa}{}{\blx@warn@bibempty}%
+ \endgroup}
+
+% {<entrykey>,...}
+\def\blx@bibliography{%
+ \blx@bibheading\blx@theheading\blx@thetitle
+ \blx@biblabel\blx@thelabel
+ \blx@bibnote\blx@theprenote
+ \begingroup
+ \blx@bibinit
+ \let\@noitemerr\@empty
+ \let\blx@noitem\blx@warn@bibempty
+ \ifnum\bibinitsep=\z@
+ \let\blx@initsep\relax
+ \fi
+ \ifnum\bibnamesep=\z@
+ \let\blx@namesep\relax
+ \fi
+ \blx@locallabelwidth@init
+ \csuse{blx@env@\blx@theenv}%
+ \csuse{blx@hook@bibinit}%
+ \csuse{blx@hook@bibinit@next}%
+ \let\blx@do\blx@bibitem
+ \let\blx@done\blx@endbibliography
+ \blx@listloop}
+
+\def\blx@endbibliography{%
+ \csuse{blx@endenv@\blx@theenv}%
+ \blx@noitem
+ \blx@locallabelwidth@finish
+ \endgroup
+ \blx@bibnote\blx@thepostnote
+ \endgroup}
+
+\def\blx@bibheading#1#2{%
+ \begingroup
+ \edef\blx@tempa{\endgroup
+ \noexpand\blx@bibheading@i{\expandonce#1}{\expandonce#2}}%
+ \blx@tempa}
+
+\def\blx@bibheading@i#1#2{%
+ \let\newrefsection\relax
+ \let\newrefsegment\relax
+ \ifblank{#2}
+ {\csuse{blx@head@#1}}
+ {\csuse{blx@head@#1}[{#2}]}%
+ \let\newrefsection\blx@newrefsection
+ \let\newrefsegment\blx@newrefsegment}
+
+\def\blx@biblabel#1{%
+ \ifdefvoid#1
+ {}
+ {\expandafter\label\expandafter{#1}}}
+
+\def\blx@bibnote#1{%
+ \ifdefempty#1
+ {}
+ {\begingroup
+ \let\newrefsection\relax
+ \let\newrefsegment\relax
+ \noindent
+ \csuse{blx@note@#1}\par\nobreak
+ \endgroup}}
+
+\def\blx@bibinit{%
+ \iftoggle{blx@citation}
+ {}
+ {\toggletrue{blx@bibliography}}%
+ \blx@blxinit
+ \blx@resetdata
+ \csuse{blx@hook@bbxinit}%
+ \bibsetup\bibfont
+ \blx@setsfcodes
+ \csuse{blx@bibsetup}}
+
+% {<entrykey>}
+% output a bib item, this is why \blx@thelabelnumber is here so that
+% labelnumber is deferred if defernumbers=true
+\def\blx@bibitem#1{%
+ \blx@ifdata{#1}
+ {\begingroup
+ \blx@getdata{#1}%
+ \blx@bibcheck
+ \iftoggle{blx@skipentry}{}{%
+ \blx@setdefaultrefcontext{#1}%
+ \global\let\blx@noitem\@empty
+ \blx@setoptions@type\abx@field@@@entrytype
+ \blx@setoptions@entry
+ \blx@thelabelnumber
+ \addtocounter{instcount}\@ne
+ \iftoggle{blx@labelnumber}
+ {\blx@bbl@locallabelnumberwidth}
+ {}%
+ \iftoggle{blx@labelalpha}
+ {\blx@bbl@locallabelalphawidth}
+ {}%
+ \nottoggle{blx@skipbiblist}
+ {\blx@bbl@locallabelfields}
+ {}%
+ \csuse{blx@item@\blx@theenv}\relax
+ \blx@initsep
+ \blx@namesep
+ \csuse{blx@hook@bibitem}%
+ \blx@execute
+ \blx@initunit
+ \blx@anchor
+ \blx@beglangbib
+ \bibsentence
+ \blx@pagetracker
+ \blx@driver\abx@field@@@entrytype
+ \blx@postpunct
+ \blx@endlangbib}%
+ \endgroup}
+ {}}
+
+\let\blx@bibcheck\relax
+
+\def\blx@edef@refcontext#1{%
+ \edef\blx@refcontext@context{#1}%
+ \expandafter\edef\expandafter\blx@refcontext@context\expandafter{%
+ \expandafter\detokenize\expandafter{\blx@refcontext@context}}}
+
+\def\blx@xdef@refcontext#1{%
+ \edef\blx@refcontext@context{#1}%
+ \expandafter\xdef\expandafter\blx@refcontext@context\expandafter{%
+ \expandafter\detokenize\expandafter{\blx@refcontext@context}}}
+
+
+% This sets and saves to the .aux the default refcontext for an entry. The
+% default refcontext for an entry is the refcontext of the last
+% bibliography in the refsection in which it is actually printed. This
+% allows citations to default to selecting data from the correct
+% bibliography list in standard cases where entries are not listed in
+% multiple bibliographies
+\def\blx@setdefaultrefcontext#1{%
+ \ifinlistcs{#1}{blx@defaultrefcontexts@\the\c@refsection}
+ {}
+ {\listcsgadd{blx@defaultrefcontexts@\the\c@refsection}{#1}}%
+ \global\cslet{blx@assignedrefcontextbib@\the\c@refsection @#1}%
+ \blx@refcontext@context}
+% <refsection><key><refcontext>
+\def\abx@aux@defaultrefcontext#1#2#3{%
+ \csxdef{blx@assignedrefcontextbib@aux@#1@#2}{\detokenize{#3}}}
+% \abx@aux@defaultlabelprefix is a dummy only used by BibTeX to implement a
+% simple labelprefix not based on full refcontexts, which BibTeX does not
+% support.
+\let\abx@aux@defaultlabelprefix\@gobblethree
+
+\blx@AtEndDocument{%
+ % always add default refcontext declarations to .aux after biber run
+ \iftoggle{blx@bbldone}
+ {\def\do#1{%
+ \begingroup
+ \def\do##1{%
+ \blx@auxwrite\@mainaux{}{\string\abx@aux@defaultrefcontext{#1}{##1}{%
+ \csuse{blx@assignedrefcontextbib@#1@##1}}}%
+ \ifcsequal{blx@assignedrefcontextbib@#1@##1}
+ {blx@assignedrefcontextbib@aux@#1@##1}
+ {}
+ {\blx@rerun@latex}}%
+ \dolistcsloop{blx@defaultrefcontexts@#1}%
+ \endgroup}
+ \dolistloop\blx@allrefsections}
+ {}}
+
+\def\blx@initsep{%
+ \blx@imc@iffieldundef{sortinithash}
+ {}
+ {\ifnum\c@instcount>\@ne
+ \blx@imc@iffieldequals{sortinithash}\blx@previnithash
+ {}
+ {\addvspace{\bibinitsep}}%
+ \fi
+ \global\let\blx@previnithash\abx@field@@@sortinithash}}
+
+\def\blx@namesep{%
+ \ifnum\c@instcount>\@ne
+ \blx@imc@iffieldequals{fullhash}\blx@prevhash
+ {}
+ {\addvspace{\bibnamesep}}%
+ \fi
+ \global\let\blx@prevhash\abx@field@@@fullhash}
+
+\newrobustcmd*{\AtBeginBibliography}{\gappto\blx@hook@bibinit}
+\newrobustcmd*{\AtEveryBibitem}{\gappto\blx@hook@bibitem}
+\@onlypreamble\AtBeginBibliography
+\@onlypreamble\AtEveryBibitem
+
+\def\blx@imc@UseBibitemHook{\csuse{blx@hook@bibitem}}
+
+\blx@regimcs{\UseBibitemHook}
+
+\newrobustcmd*{\AtNextBibliography}{%
+ \ifundef\blx@hook@bibinit@next
+ {\gdef\blx@hook@bibinit@next{\global\undef\blx@hook@bibinit@next}}
+ {}%
+ \gappto\blx@hook@bibinit@next}
+
+% page tracker
+\def\blx@pagetracker@context{%
+ \blx@leavevmode
+ \ifbool{@filesw}
+ {\ifbool{pagetracker}
+ {\protected@write\@mainaux{}{%
+ \iftoggle{blx@footnote}
+ {\string\abx@aux@fnpage}
+ {\string\abx@aux@page}%
+ {\the\c@instcount}{\noexpand\the\c@page}}}
+ {}}
+ {}}
+
+% {<instcount>}{<page>}
+\protected\def\blx@aux@page#1#2{%
+ \csgdef{blx@page@#1}{#2}%
+ \blx@addpagesum{#1}{#2}}
+\protected\def\blx@aux@spread#1#2{%
+ \ifodd#2\relax
+ \csxdef{blx@page@#1}{\number\numexpr#2-1}%
+ \else
+ \csgdef{blx@page@#1}{#2}%
+ \fi
+ \blx@addpagesum{#1}{#2}}
+
+\protected\def\blx@aux@fnpage#1#2{%
+ \csgdef{blx@fnpage@#1}{#2}%
+ \blx@addpagesum{#1}{#2}}
+\protected\def\blx@aux@fnspread#1#2{%
+ \ifodd#2\relax
+ \csxdef{blx@fnpage@#1}{\number\numexpr#2-1}%
+ \else
+ \csgdef{blx@fnpage@#1}{#2}%
+ \fi
+ \blx@addpagesum{#1}{#2}}
+
+\blx@AtEndDocument{%
+ \def\abx@aux@page#1#2{\blx@addpagesum{#1}{#2}}%
+ \def\abx@aux@fnpage#1#2{\blx@addpagesum{#1}{#2}}}
+
+% hyperref interface
+\appto\blx@mkhyperref{%
+ \let\blx@anchors\@empty
+ \ifundef\hyper@natanchorstart
+ {\protected\def\blx@anchor{%
+ \xifinlist{\the\c@refsection @\abx@field@@@entrykey}{\blx@anchors}
+ {}
+ {\listxadd\blx@anchors{\the\c@refsection @\abx@field@@@entrykey}%
+ \hypertarget{cite.\the\c@refsection @\abx@field@@@entrykey}{}}}}
+ {\protected\def\blx@anchor{%
+ \xifinlist{\the\c@refsection @\abx@field@@@entrykey}{\blx@anchors}
+ {}
+ {\listxadd\blx@anchors{\the\c@refsection @\abx@field@@@entrykey}%
+ \hyper@natanchorstart{\the\c@refsection @\abx@field@@@entrykey}%
+ \hyper@natanchorend}}}}
+
+\appto\blx@mknohyperref{\let\blx@anchor\relax}
+
+\blx@kv@defkey{blx@biblist2}{driver}{\blx@key@driver{#1}}
+\blx@kv@defkey{blx@biblist1}{driver}{}
+
+\def\blx@key@driver#1{%
+ \def\blx@thebiblistdriver{#1}}
+
+% Custom bibliography list
+% [<options>]{biblistname}
+\newrobustcmd*{\printbiblist}[2][]{%
+ \begingroup
+ \delimcontext{biblist}%
+ \edef\on@line{\on@line}%
+ \toggletrue{blx@tempa}%
+ \toggletrue{blx@tempb}%
+ \def\blx@theheading{biblist}% default to biblist heading
+ \def\blx@theenv{#2}% default to list name
+ \def\blx@thebiblist{#2}%
+ \def\blx@thebiblistdriver{#2}%
+ \def\blx@thebiblistfilter{#2}%
+ \let\blx@theprenote\@empty
+ \let\blx@thepostnote\@empty
+ \let\blx@thetitle\@empty
+ \undef\blx@thelabel
+ % defaults
+ \let\blx@tempa\@empty% before there is a .bbl, this must not be undef
+ % default sorting template and template name for list is same name as list
+ % name, then current context if not found
+ \edef\blx@tempc{%
+ \ifcsdef{blx@sortingtemplate@#2}
+ {#2}
+ {\blx@refcontext@sortingtemplatename}}%
+ % locally define this since we want to fetch data from the datalist
+ % name after the list we are printing rather than the data in
+ % refcontext list.
+ % Note that the name must be unique so we prepend any filter name
+ % because the combination of options might not generate a unique name
+ % since sortschemename has a fallback to the refcontext scheme if there
+ % is no sortscheme named after the list
+ \blx@kv@setkeys{blx@biblist1}{#1}% Set section and biblistfilter only, if present ...
+ \blx@edef@refcontext{\blx@thebiblistfilter :\blx@tempc/%
+ \blx@refcontext@sortingnamekeytemplatename/%
+ \blx@refcontext@labelprefix/%
+ \blx@refcontext@uniquenametemplatename/%
+ \blx@refcontext@labelalphanametemplatename}%
+ \xifinlist\blx@tempc\blx@sortingtemplatenames
+ {}
+ {\listxadd\blx@sortingtemplatenames\blx@tempc}%
+ \let\blx@printbibchecks\relax
+ \edef\blx@tempe{\the\c@refsection}% default refsection is current
+ \blx@safe@actives
+ \blx@printbibchecks
+ % Add the sortingtemplate to the list of sortingtemplates for this biblist
+ % so we can compare on next run
+ \xifinlist\blx@tempc\blx@biblists
+ {}
+ {\listxadd\blx@biblists\blx@tempc}%
+ \blx@auxwrite\@mainaux{}{\string\abx@aux@biblist{\blx@tempc}}%
+ \blx@rest@actives
+ \ifcsvoid{blx@dlist@list@\blx@tempe @\blx@refcontext@context}
+ {}
+ {\letcs\blx@tempa{blx@dlist@list@\blx@tempe @\blx@refcontext@context}}%
+ \blx@safe@actives
+ \blx@kv@setkeys{blx@biblist2}{#1}% ... now we have correct \blx@tempa, set rest of options
+ \ifundef\blx@bibcheck
+ {\ifcsdef{blx@bibcheck@#2}
+ {\letcs\blx@bibcheck{blx@bibcheck@#2}}
+ {}}
+ {}%
+ \blx@rest@actives
+ % Add datalist to list of seen datalists to prevent duplicates
+ \xifinlist{\blx@refcontext@context @\blx@tempe @list}\blx@dlistnames
+ {}
+ {\listxadd\blx@dlistnames{\blx@refcontext@context @\blx@tempe @list}%
+ \xappto\blx@dlists{%
+ \blx@xml@dlist{\blx@refcontext@context}{list}{\blx@tempe}{\blx@xml@dlist@refcontext{\blx@tempc}{\blx@refcontext@sortingnamekeytemplatename}{\blx@refcontext@labelprefix@real}{\blx@refcontext@uniquenametemplatename}{\blx@refcontext@labelalphanametemplatename}}{\csuse{blx@biblistfilters@\blx@thebiblistfilter}}}}%
+ \ifdefvoid\blx@tempa
+ {\blx@warn@biblistempty{#2}\endgroup}
+ {\blx@biblist\blx@tempa}}
+
+\def\blx@printbibchecks{%
+ \togglefalse{blx@tempa}%
+ \iftoggle{blx@defernumbers}
+ {\global\let\blx@printbibchecks\relax}
+ {\iftoggle{blx@labelnumber}
+ {\ifundef\blx@printbibchecks@suppresswarn
+ {\blx@warning@noline{%
+ Split bibliography detected.\MessageBreak
+ Many simple split bibliography setups with\MessageBreak
+ non-overlapping bibliographies benefit from%
+ \MessageBreak
+ setting 'defernumbers=true'.\MessageBreak
+ See the documentation for details.\MessageBreak
+ This warning can be suppressed with\MessageBreak
+ '\string\BiblatexSplitbibDefernumbersWarningOff'}}
+ {}}
+ {\global\let\blx@printbibchecks\relax}}}
+
+% {<entrykey>,...}
+\def\blx@biblist{%
+ \if@twocolumn
+ \@restonecoltrue\onecolumn
+ \else
+ \@restonecolfalse
+ \fi
+ \blx@bibheading\blx@theheading\blx@thetitle
+ \blx@biblabel\blx@thelabel
+ \blx@bibnote\blx@theprenote
+ \begingroup
+ \blx@bibinit
+ \let\@noitemerr\@empty
+ \def\blx@noitem{\blx@warn@biblistempty{\blx@thebiblist}}%
+ \blx@locallabelwidth@init
+ \csuse{blx@env@\blx@theenv}%
+ \csuse{blx@hook@biblistinit@\blx@thebiblist}%
+ \let\blx@do\blx@biblistitem
+ \let\blx@done\blx@endbiblist
+ \blx@listloop}
+
+\def\blx@endbiblist{%
+ \csuse{blx@endenv@\blx@theenv}%
+ \blx@noitem
+ \blx@locallabelwidth@finish
+ \endgroup
+ \blx@bibnote\blx@thepostnote
+ \endgroup
+ \if@restonecol\twocolumn\fi}
+
+% {<biblistname>}
+\newrobustcmd*{\AtBeginBiblist}[1]{\csgappto{blx@hook@biblistinit@#1}}
+\newrobustcmd*{\AtEveryBiblistitem}[1]{\csgappto{blx@hook@biblistitem@#1}}
+\@onlypreamble\AtBeginBiblist
+\@onlypreamble\AtEveryBiblistitem
+
+% {<entrykey>}
+\def\blx@biblistitem#1{%
+ \blx@ifdata{#1}
+ {\begingroup
+ \blx@getdata{#1}%
+ \blx@bibcheck
+ \iftoggle{blx@skipentry}{}{%
+ \blx@setdefaultrefcontext{#1}%
+ \global\let\blx@noitem\@empty
+ \blx@setoptions@type\abx@field@@@entrytype
+ \blx@setoptions@entry
+ \addtocounter{instcount}\@ne
+ \iftoggle{blx@labelnumber}
+ {\blx@bbl@locallabelnumberwidth}
+ {}%
+ \iftoggle{blx@labelalpha}
+ {\blx@bbl@locallabelalphawidth}
+ {}%
+ \nottoggle{blx@skipbiblist}
+ {\blx@bbl@locallabelfields}
+ {}%
+ \csuse{blx@item@\blx@theenv}\relax
+ \csuse{blx@hook@biblistitem@\blx@thebiblist}%
+ \blx@execute
+ \blx@initunit
+ \blx@beglangbib
+ \bibsentence
+ \blx@pagetracker
+ \blx@driver{\blx@thebiblistdriver}%
+ \blx@postpunct
+ \blx@endlangbib}%
+ \endgroup}
+ {}}
+
+% Just a default in case .bbx doesn't define it. standard.bbx defines
+% it to print a complete entry, like the bibliography.
+\DeclareBibliographyDriver{shorthand}{%
+ \iffieldundef{shorttitle}
+ {\printfield{title}}
+ {\printfield{shorttitle}}}
+
+% Reference contexts
+\newcommand*{\DeclareRefcontext}[2]{%
+ \csgdef{blx@refcontext@name@#1}{#2}}
+\@onlypreamble\DeclareRefcontext
+
+\def\newrefcontext{%
+ \endrefcontext
+ \refcontext}
+
+% Backwards compat for older \refcontext[] format
+\def\refcontext{%
+ \@ifnextchar[%]
+ {\refcontext@i}
+ {\refcontext@i[]}}
+
+\def\refcontext@i[#1]{%
+ \@ifnextchar\bgroup
+ {\refcontext@ii[{#1}]}
+ {\refcontext@ii[{#1}]{}}}
+
+\newcommand*{\refcontext@ii}[2][]{%
+ \iftoggle{blx@refcontext}
+ {\blx@err@nestenv{refcontext}%
+ \endrefcontext}
+ {\toggletrue{blx@refcontext}%
+ % Set refcontext from named refcontext, if given
+ \ifblank{#2}
+ {}
+ {\begingroup
+ \edef\blx@tempa{\endgroup%
+ \noexpand\blx@kv@setkeys{blx@refcontext}{\csuse{blx@refcontext@name@#2}}}%
+ \blx@tempa}%
+ % Override with explicit refcontext keyvals, if given
+ \def\blx@gdef@or@def{\gdef}%
+ \def\blx@xdef@or@edef{\xdef}%
+ \blx@kv@setkeys{blx@refcontext}{#1}%
+ % Add the sortingtemplate to the list of sortingtemplates so we can track
+ % special cases like sorting=none which need cite order change detection
+ \xifinlist\blx@refcontext@sortingtemplatename\blx@sortingtemplatenames
+ {}
+ {\listxadd\blx@sortingtemplatenames\blx@refcontext@sortingtemplatename}%
+ \blx@xdef@refcontext{%
+ \blx@refcontext@sortingtemplatename/%
+ \blx@refcontext@sortingnamekeytemplatename/%
+ \blx@refcontext@labelprefix/%
+ \blx@refcontext@uniquenametemplatename/%
+ \blx@refcontext@labelalphanametemplatename}%
+ % Add the refcontext to the list of refcontexts so we can compare on next run
+ \xifinlist\blx@refcontext@context\blx@refcontexts
+ {}
+ {\listxadd\blx@refcontexts\blx@refcontext@context}%
+ \blx@auxwrite\@mainaux{}{\string\abx@aux@refcontext{\blx@refcontext@context}}%
+ \ifcsundef{blx@sortingtemplate@\blx@refcontext@sortingtemplatename}
+ {\blx@err@invopt{sorting=\blx@refcontext@sortingtemplatename}{}}
+ {}%
+ \ifcsundef{blx@sortingnamekeytemplate@\blx@refcontext@sortingnamekeytemplatename}
+ {\blx@err@invopt{sortingnamekeytemplate=\blx@refcontext@sortingnamekeytemplatename}{}}
+ {}%
+ \ifcsundef{blx@uniquenametemplate@\blx@refcontext@uniquenametemplatename}
+ {\blx@err@invopt{uniquenametemplate=\blx@refcontext@uniquenametemplatename}{}}
+ {}%
+ \ifcsundef{blx@labelalphanametemplate@\blx@refcontext@labelalphanametemplatename}
+ {\blx@err@invopt{labelalphanametemplate=\blx@refcontext@labelalphanametemplatename}{}}
+ {}}}
+
+% Reset to global sorting etc. when we leave a ref context (since they can't be nested)
+\protected\def\endrefcontext{%
+ \togglefalse{blx@refcontext}%
+ \global\let\blx@refcontext@labelprefix\@empty
+ \global\let\blx@refcontext@labelprefix@real\@empty
+ \xdef\blx@refcontext@sortingtemplatename{\blx@sorting}%
+ \gdef\blx@refcontext@sortingnamekeytemplatename{global}%
+ \gdef\blx@refcontext@uniquenametemplatename{global}%
+ \gdef\blx@refcontext@labelalphanametemplatename{global}%
+ \blx@xdef@refcontext{%
+ \blx@refcontext@sortingtemplatename/%
+ \blx@refcontext@sortingnamekeytemplatename/%
+ /%
+ \blx@refcontext@uniquenametemplatename/%
+ \blx@refcontext@labelalphanametemplatename}}
+
+% local version of \newrefcontext
+\def\localrefcontext{%
+ \@ifnextchar[%]
+ {\localrefcontext@i}
+ {\localrefcontext@i[]}}
+
+\def\localrefcontext@i[#1]{%
+ \@ifnextchar\bgroup
+ {\localrefcontext@ii[{#1}]}
+ {\localrefcontext@ii[{#1}]{}}}
+
+\newcommand*{\localrefcontext@ii}[2][]{%
+ \ifblank{#2}
+ {}
+ {\begingroup
+ \edef\blx@tempa{\endgroup%
+ \noexpand\blx@kv@setkeys{blx@refcontext}{\csuse{blx@refcontext@name@#2}}}%
+ \blx@tempa}%
+ % Override with explicit refcontext keyvals, if given
+ \def\blx@gdef@or@def{\def}%
+ \def\blx@xdef@or@edef{\edef}%
+ \blx@kv@setkeys{blx@refcontext}{#1}%
+ % Add the sortingtemplate to the list of sortingtemplates so we can track
+ % special cases like sorting=none which need cite order change detection
+ \xifinlist\blx@refcontext@sortingtemplatename\blx@sortingtemplatenames
+ {}
+ {\listxadd\blx@sortingtemplatenames\blx@refcontext@sortingtemplatename}%
+ \blx@edef@refcontext{%
+ \blx@refcontext@sortingtemplatename/%
+ \blx@refcontext@sortingnamekeytemplatename/%
+ \blx@refcontext@labelprefix/%
+ \blx@refcontext@uniquenametemplatename/%
+ \blx@refcontext@labelalphanametemplatename}%
+ % Add the refcontext to the list of refcontexts so we can compare on next run
+ \xifinlist\blx@refcontext@context\blx@refcontexts
+ {}
+ {\listxadd\blx@refcontexts\blx@refcontext@context}%
+ \blx@auxwrite\@mainaux{}{\string\abx@aux@refcontext{\blx@refcontext@context}}%
+ \ifcsundef{blx@sortingtemplate@\blx@refcontext@sortingtemplatename}
+ {\blx@err@invopt{sorting=\blx@refcontext@sortingtemplatename}{}}
+ {}%
+ \ifcsundef{blx@sortingnamekeytemplate@\blx@refcontext@sortingnamekeytemplatename}
+ {\blx@err@invopt{sortingnamekeytemplate=\blx@refcontext@sortingnamekeytemplatename}{}}
+ {}%
+ \ifcsundef{blx@uniquenametemplate@\blx@refcontext@uniquenametemplatename}
+ {\blx@err@invopt{uniquenametemplate=\blx@refcontext@uniquenametemplatename}{}}
+ {}%
+ \ifcsundef{blx@labelalphanametemplate@\blx@refcontext@labelalphanametemplatename}
+ {\blx@err@invopt{labelalphanametemplate=\blx@refcontext@labelalphanametemplatename}{}}
+ {}}
+
+\def\blx@gdef@or@def{\gdef}
+\def\blx@xdef@or@edef{\xdef}
+
+% Meta option to set all name template options
+\blx@kv@defkey{blx@refcontext}{nametemplates}{%
+ \blx@gdef@or@def\blx@refcontext@sortingnamekeytemplatename{#1}%
+ \blx@gdef@or@def\blx@refcontext@uniquenametemplatename{#1}%
+ \blx@gdef@or@def\blx@refcontext@labelalphanametemplatename{#1}}
+
+\blx@kv@defkey{blx@refcontext}{msform}{\def\blx@msform{#1}}
+\blx@kv@defkey{blx@refcontext}{mslang}{\def\blx@mslang{#1}}
+\blx@kv@defkey{blx@refcontext}{sorting}{\blx@gdef@or@def\blx@refcontext@sortingtemplatename{#1}}
+\blx@kv@defkey{blx@refcontext}{sortingnamekeytemplatename}{\blx@gdef@or@def\blx@refcontext@sortingnamekeytemplatename{#1}}
+\blx@kv@defkey{blx@refcontext}{uniquenametemplatename}{\blx@gdef@or@def\blx@refcontext@uniquenametemplatename{#1}}
+\blx@kv@defkey{blx@refcontext}{labelalphanametemplatename}{\blx@gdef@or@def\blx@refcontext@labelalphanametemplatename{#1}}
+
+% labelprefix cannot be used as is because it is used to construct the internal
+% refcontext name which is referenced/expanded a lot all over the place. So,
+% we hash the given input and use the safe hash as internal name.
+% But that is not enough since the MD5 hash function expands the argument all
+% the way and so unexpandable content like \dag breaks.
+% Unexpandable content should be protected with \detokenize.
+\blx@kv@defkey{blx@refcontext}{labelprefix}{%
+ \blx@xdef@or@edef\blx@refcontext@labelprefix{\blx@mdfivesum{#1}}%
+ \blx@gdef@or@def\blx@refcontext@labelprefix@real{#1}%
+ \iftoggle{blx@defernumbers}
+ {}%
+ {\iftoggle{blx@labelnumber}
+ {\blx@warning{%
+ Option 'labelprefix' requires global\MessageBreak
+ 'defernumbers=true'}}
+ {}}}
+
+
+% [refcontext keys]{<keyword1>,<keyword2>,...}
+\newcommand*{\assignrefcontextkeyws}{%
+ \@ifstar
+ {\blx@assignrefcontextkeyws[*]}
+ {\blx@assignrefcontextkeyws[]}}
+
+\def\blx@assignrefcontextkeyws[#1][#2]#3{%
+ \edef\blx@tempa{\blx@sorting}%
+ \def\blx@tempb{global}%
+ \let\blx@tempc\@empty%
+ \def\blx@tempd{global}%
+ \def\blx@tempe{global}%
+ \blx@kv@setkeys{blx@assignrefcontextmeta}{#2}%
+ \blx@kv@setkeys{blx@assignrefcontext}{#2}%
+ \def\do##1{%
+ \listxadd\blx@assignedrefcontextkeywlist{##1}%
+ \csxdef{blx@assignedrefcontextkeyws#1@\the\c@refsection @##1}%
+ {\blx@tempa/\blx@tempb/\blx@tempc/\blx@tempd/\blx@tempe}}%
+ \docsvlist{#3}}
+
+% [refcontext keys]{<category1>,<category2>,...}
+\newcommand*{\assignrefcontextcats}{%
+ \@ifstar
+ {\blx@assignrefcontextcats[*]}
+ {\blx@assignrefcontextcats[]}}
+
+\def\blx@assignrefcontextcats[#1][#2]#3{%
+ \edef\blx@tempa{\blx@sorting}%
+ \def\blx@tempb{global}%
+ \let\blx@tempc\@empty%
+ \def\blx@tempd{global}%
+ \def\blx@tempe{global}%
+ \blx@kv@setkeys{blx@assignrefcontextmeta}{#2}%
+ \blx@kv@setkeys{blx@assignrefcontext}{#2}%
+ \def\do##1{%
+ \listxadd\blx@assignedrefcontextcatlist{##1}%
+ \csxdef{blx@assignedrefcontextcats#1@\the\c@refsection @##1}%
+ {\blx@tempa/\blx@tempb/\blx@tempc/\blx@tempd/\blx@tempe}}%
+ \docsvlist{#3}}
+
+% [refcontext keys]{<entrykey1>,<entrykey2>,...}
+\newcommand*{\assignrefcontextentries}{%
+ \@ifstar
+ {\blx@assignrefcontextentries[*]}
+ {\blx@assignrefcontextentries[]}}
+
+\def\blx@assignrefcontextentries[#1][#2]#3{%
+ \edef\blx@tempa{\blx@sorting}%
+ \def\blx@tempb{global}%
+ \let\blx@tempc\@empty%
+ \def\blx@tempd{global}%
+ \def\blx@tempe{global}%
+ \blx@kv@setkeys{blx@assignrefcontextmeta}{#2}%
+ \blx@kv@setkeys{blx@assignrefcontext}{#2}%
+ \def\do##1{%
+ \csxdef{blx@assignedrefcontextkeys#1@\the\c@refsection @##1}%
+ {\blx@tempa/\blx@tempb/\blx@tempc/\blx@tempd/\blx@tempe}}%
+ \docsvlist{#3}}
+
+% This makes sure that named refcontexts set options first
+% Note that the docs say that "name=default" selects the global default
+% refcontext and this is because this won't set anything and the defaults
+% in the above macros will take effect.
+\blx@kv@defkey{blx@assignrefcontextmeta}{name}{%
+ \begingroup
+ \edef\blx@tempf{\endgroup%
+ \noexpand\blx@kv@setkeys{blx@assignrefcontext}{\csuse{blx@refcontext@name@#1}}}%
+ \blx@tempf}
+\blx@kv@defkey{blx@assignrefcontextmeta}{nametemplates}{}
+\blx@kv@defkey{blx@assignrefcontextmeta}{sorting}{}
+\blx@kv@defkey{blx@assignrefcontextmeta}{sortingnamekeytemplatename}{}
+\blx@kv@defkey{blx@assignrefcontextmeta}{labelprefix}{}
+\blx@kv@defkey{blx@assignrefcontextmeta}{uniquenametemplatename}{}
+\blx@kv@defkey{blx@assignrefcontextmeta}{labelalphanametemplatename}{}
+
+% Meta option to set all name template options
+\blx@kv@defkey{blx@assignrefcontext}{name}{}
+\blx@kv@defkey{blx@assignrefcontext}{nametemplates}{%
+ \def\blx@tempb{#1}%
+ \def\blx@tempd{#1}%
+ \def\blx@tempe{#1}}
+\blx@kv@defkey{blx@assignrefcontext}{sorting}{\def\blx@tempa{#1}}
+\blx@kv@defkey{blx@assignrefcontext}{sortingnamekeytemplatename}{\def\blx@tempb{#1}}
+\blx@kv@defkey{blx@assignrefcontext}{labelprefix}{\edef\blx@tempc{\blx@mdfivesum{#1}}}
+\blx@kv@defkey{blx@assignrefcontext}{uniquenametemplatename}{\def\blx@tempd{#1}}
+\blx@kv@defkey{blx@assignrefcontext}{labelalphanametemplatename}{\def\blx@tempe{#1}}
+
+% Manually force a refcontext datalist in the .bcf
+\newcommand*{\GenRefcontextData}[1]{%
+ \begingroup
+ \edef\blx@tempb{\the\c@refsection}%
+ \def\blx@tempc{global}%
+ \def\blx@tempd{global}%
+ \def\blx@tempe{global}%
+ \let\blx@tempf\blx@sorting%
+ \let\blx@tempg\@empty%
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@refcontextmanual}{#1}}%
+ \def\blx@tempa{\blx@tempf/\blx@tempc/\blx@tempg/\blx@tempd/\blx@tempe}%
+ \xifinlist{\blx@tempa @\blx@tempb @entry}\blx@dlistnames
+ {}
+ {\listxadd\blx@dlistnames{\blx@tempa @\blx@tempb @entry}%
+ \xappto\blx@dlists{%
+ \blx@xml@dlist{\blx@tempa}{entry}{\blx@tempb}{\blx@xml@dlist@refcontext{\blx@tempf}{\blx@tempc}{\blx@tempg}{\blx@tempd}{\blx@tempe}}{}}}%
+ \endgroup}
+
+% Meta option to set all name template options
+\blx@kv@defkey{blx@refcontextmanual}{nametemplates}{%
+ \def\blx@tempc@sortingnamekeytemplatename{#1}%
+ \def\blx@tempd@uniquenametemplatename{#1}%
+ \def\blx@tempe@labelalphanametemplatename{#1}}
+\blx@kv@defkey{blx@refcontextmanual}{sorting}{\def\blx@tempf{#1}}
+\blx@kv@defkey{blx@refcontextmanual}{sortingnamekeytemplatename}{\def\blx@tempc{#1}}
+\blx@kv@defkey{blx@refcontextmanual}{uniquenametemplatename}{\def\blx@tempd{#1}}
+\blx@kv@defkey{blx@refcontextmanual}{labelalphanametemplatename}{\def\blx@tempe{#1}}
+\blx@kv@defkey{blx@refcontextmanual}{labelprefix}{%
+ \def\blx@tempg{#1}%
+ \iftoggle{blx@defernumbers}
+ {}%
+ {\iftoggle{blx@labelnumber}
+ {\blx@warning{%
+ Option 'labelprefix' requires global\MessageBreak
+ 'defernumbers=true'}}
+ {}}}
+
+% Reference sections
+\newrobustcmd*{\AtBeginRefsection}{\gappto\blx@hook@refsectioninit}
+\@onlypreamble\AtBeginRefsection
+
+\newrobustcmd*{\newrefsection}{%
+ \endrefcontext
+ \ifnum\c@refsection>\z@
+ \endrefsection
+ \fi
+ \refsection}
+\let\blx@newrefsection\newrefsection
+
+\newrobustcmd*{\refsection}{%
+ \begingroup
+ \edef\on@line{\on@line}%
+ \ifnum\c@refsection>\z@
+ \blx@err@nestenv{refsection}%
+ \blx@endrefsection
+ \fi
+ \ifnum\c@refsegment>\z@
+ \blx@err@nestenv{refsection}%
+ \blx@endrefsegment
+ \fi
+ \@ifnextchar[%]
+ {\blx@refsection}
+ {\blx@refsection[]}}
+
+\def\blx@refsection{%
+ \begingroup
+ \blx@hook@fileverb
+ \blx@refsection@i}
+
+\def\blx@refsection@i[#1]{%
+ \endgroup
+ \stepcounter{blx@maxsection}%
+ \setcounter{refsection}{\value{blx@maxsection}}%
+ \csuse{blx@hook@refsectioninit}%
+ \xifinlist{\the\c@refsection}\blx@allrefsections
+ {}
+ {\listxadd\blx@allrefsections{\the\c@refsection}}%
+ \ifcsdef{blx@defaultrefcontexts@\the\c@refsection}
+ {}
+ {\global\cslet{blx@defaultrefcontexts@\the\c@refsection}\@empty}%
+ \blx@providecount{blx@maxsegment@\the\c@refsection}%
+ \blx@providecount{blx@sectionciteorder@\the\c@refsection}%
+ \blx@inf@refsec
+ \blx@secinit
+ \if@filesw
+ \blx@auxwrite\@mainaux{}{%
+ \string\abx@aux@refsection{\the\c@refsection}{\the\c@page}}%
+ \ifblank{#1}
+ {}
+ {\let\blx@bibfiles\@empty
+ % globals should be first as it might contain macros needed for others
+ \forlistloop{\listadd\blx@bibfiles}\blx@bibfiles@global}%
+ \blx@xsanitizeafter{\forcsvlist\blx@refsection@addfile}{#1}%
+ \blx@refsection@ii
+ \fi
+ \blx@info{Setting label 'refsection:\the\c@refsection'}%
+ \label{refsection:\the\c@refsection}%
+ \endgroup}
+
+\def\blx@refsection@addfile#1{%
+ \ifcsdef{blx@res@labl@#1}
+ {\blx@refsection@addfile@i{\csuse{blx@res@labl@#1}}}
+ {\blx@refsection@addfile@i{#1}}}
+
+\def\blx@refsection@addfile@i#1{%
+ \ifcsdef{blx@res@loca@#1}
+ {\listeadd\blx@bibfiles{#1}}
+ {\listeadd\blx@bibfiles{\blx@stripbib{#1}\detokenize{.bib}}}}
+
+\def\blx@refsection@ii{%
+ \blx@regbibfiles\jobname\blx@bibfiles
+ \begingroup
+ \let\blx@tempa\@empty
+ \blx@bibdata\blx@tempa\blx@bibfiles
+ \blx@auxwrite\blx@bcfout
+ {\let\do\blx@datasource}
+ {\blx@xml@endsection\blx@nl
+ \blx@xml@comment{SECTION \the\c@refsection}%
+ \blx@xml@bibdata{\the\c@refsection}{\blx@tempa}%
+ \blx@xml@section{\the\c@refsection}}%
+ \endgroup}
+
+\protected\def\endrefsection{%
+ \endrefcontext
+ \blx@endrefsection
+ \blx@inf@refsec}
+
+\def\blx@endrefsection{%
+ \blx@endrefsegment
+ \blx@providecount{blx@sectionciteorder@\the\c@refsection}%
+ % make sure we always output aliases to the .bcf otherwise after their
+ % first resolution by biber, they will be invisible to subsequent biber
+ % runs since biblatex will resolve the \keyalias{} macro to the main
+ % entry key, biber won't put \keyalias{}in the .bbl on subsequent runs
+ % and biblatex will report a missing citekey
+ \ifcsempty{blx@keyaliases@\the\c@refsection}
+ {}
+ {\def\do##1{%
+ \blx@xmlsanitizeafter{\def\blx@tempa}{##1}%
+ % Make sure this counter exists. Sometimes it might not when using, e.g:
+ % refsection=chapter and \includeonly to put in the chapters or when
+ % inserting citations into table of contents
+ \global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne
+ \blx@auxwrite\blx@bcfout{}{%
+ \blx@xml@citekey{\blx@tempa}{}
+ {\expandafter\the\csname blx@sectionciteorder@\the\c@refsection\endcsname}{1}}}%
+ \dolistcsloop{blx@keyaliases@\the\c@refsection}}%
+ % output key counts (for \citecount sorting) if citecounter option is not false
+ \ifcsundef{blx@cites@\the\c@refsection}
+ {}
+ {\ifundef\blx@citecounter
+ {}
+ {\def\do##1{%
+ \ifcsundef{blx@currcount@\the\c@refsection @##1}
+ {\csdef{blx@currcount@\the\c@refsection @##1}{0}}
+ {}%
+ \blx@auxwrite\blx@bcfout{}
+ {\blx@xml@citekeycount{##1}{\csuse{blx@currcount@\the\c@refsection @##1}}}}%
+ \dolistcsloop{blx@cites@\the\c@refsection}}}%
+ \ifnum\c@refsection>\z@
+ \blx@auxwrite\blx@bcfout{}{%
+ \blx@xml@endsection\blx@nl
+ \blx@xml@comment{SECTION 0 (cont.)}%
+ \blx@xml@section{0}}%
+ \fi
+ \global\c@refsection\z@}
+
+\blx@AtEndDocument{%
+ \endrefcontext
+ % close non-0 refsection if active
+ \ifnum\c@refsection>\z@
+ \blx@endrefsection
+ \fi
+ % close refsection 0
+ \blx@endrefsection
+ \def\abx@aux@refsection#1#2{\blx@addchecksum{#1}{#2}}}
+
+\protected\def\abx@aux@refsection#1#2{%
+ \listgadd\blx@alllastrefsections{#1}%
+ \ifnum#1>\c@blx@maxsection
+ \setcounter{blx@maxsection}{#1}%
+ \fi
+ \blx@addchecksum{#1}{#2}}
+
+% Reference segments
+\newrobustcmd*{\newrefsegment}{%
+ \ifnum\c@refsegment>\z@
+ \blx@endrefsegment
+ \fi
+ \refsegment}
+\let\blx@newrefsegment\newrefsegment
+
+\newrobustcmd*{\refsegment}{%
+ \ifnum\c@refsegment>\z@
+ \blx@err@nestenv{refsegment}%
+ \blx@endrefsegment
+ \fi
+ \global\advance\csname blx@maxsegment@\the\c@refsection\endcsname\@ne
+ \setcounter{refsegment}{\csuse{blx@maxsegment@\the\c@refsection}}%
+ \blx@inf@refseg
+ \blx@info{Setting label 'refsegment:\the\c@refsection\the\c@refsegment'}%
+ \label{refsegment:\the\c@refsection\the\c@refsegment}%
+ \ifcsundef{blx@segm@\the\c@refsection @\the\c@refsegment}
+ {\global\cslet{blx@segm@\the\c@refsection @\the\c@refsegment}\@empty}
+ {}}
+
+\protected\def\endrefsegment{%
+ \blx@endrefsegment
+ \blx@inf@refseg}
+
+\def\blx@endrefsegment{%
+ \global\c@refsegment\z@}
+
+% Reference section/segment auto-reset
+% we are prepending to the commands so that the resets happen before
+% the part title is typeset otherwise \cites in there could be "ibid"
+% which makes no sense
+
+% option switch
+%{<option level counter>}{<patch>}{<pre>}{<post>}
+\def\blx@patchsection@switch#1#2#3#4{%
+ \AtEndPreamble{%
+ #3%
+ \ifcase#1
+ \or % 1: part
+ \blx@refpatch@part{#2}%
+ \or % 2: chapter
+ \blx@refpatch@chapter{#2}%
+ \or % 3: section
+ \blx@refpatch@sect{section}{#2}{1}%
+ \or % 4: subsection
+ \blx@refpatch@sect{subsection}{#2}{2}%
+ \or % 5: chapter+ = part, chapter
+ \blx@refpatch@part{#2}%
+ \blx@refpatch@chapter{#2}%
+ \or % 6: section+ = part, chapter, section
+ \blx@refpatch@part{#2}%
+ \ifundef\chapter
+ {}
+ {\blx@refpatch@chapter{#2}}%
+ \blx@refpatch@sect{section}{#2}{1}%
+ \or % 7: subsection+ = part, chapter, section, subsection
+ \blx@refpatch@part{#2}%
+ \ifundef\chapter
+ {}
+ {\blx@refpatch@chapter{#2}}%
+ \blx@refpatch@sect{section}{#2}{1}%
+ \blx@refpatch@sect{subsection}{#2}{2}%
+ \fi
+ #4%
+ }%
+}
+
+%% Patching all the different document classes and their sectioning
+%% commands is ... messy at best
+%% For now we do the big three: (1) Standard classes, (2) KOMA-Script
+%% and (3) memoir.
+%%
+%% Timing of the patch can be tricky.
+%% Ideally we want the code to be executed when all counters have
+%% been increased so the labels attach to the right thing, but
+%% at the same time we want the code to be executed before the heading
+%% is typeset so it already applies to the text in the heading.
+%% Bonus points for actually executing the code on the correct page.
+
+%% memoir has hooks for section headings that we can use here
+%% see 18.25 'Heading Hooks' of the manual (v3.7h, 2018/12/12)
+%% they are in a good position, when the counters have been
+%% increased but heading text not yet typeset.
+%% The manual suggests this hooks have been around since 2005 or so,
+%% so we take them for granted.
+
+%% Newer versions of KOMA-Script (>=3.27) (will) have a hook system
+%% that we can use for that purpose as well.
+%% This is fairly new, so we need to have a fallback for older versions.
+
+%% The standard classes are tricky.
+%% We insert something in \@startsection to get the level number
+%% and then patch \@sect and \@ssect so the label attaches to the
+%% right thing.
+
+%% Test for correct KOMA patch method
+% KOMA 3.27 has \AddtoDoHook
+\newcommand*{\blx@ifkoma@AddtoDoHook}{%
+ \ifcsundef{KOMAClassName}
+ {\@secondoftwo}
+ {\ifcsundef{AddtoDoHook}
+ {\@secondoftwo}
+ {\@firstoftwo}}}
+
+% KOMA 3.26 has \startsection@secnumdepth for some testing
+\newcommand*{\blx@ifkoma@startsection}{%
+ \ifcsundef{KOMAClassName}
+ {\@secondoftwo}
+ {\ifcsundef{startsection@secnumdepth}
+ {\@secondoftwo}
+ {\@firstoftwo}}}
+
+\newcommand*{\blx@ifmemoir}{\@ifclassloaded{memoir}}
+
+% Note that \ExecuteDoHook always feeds an argument to the code, here that is
+% going to be an empty group, which we explicitly gobble to avoid trouble.
+\def\blx@refpatch@koma@AddtoDoHook#1#2{%
+ \AddtoDoHook{heading/begingroup/#1}{#2\@gobble}}
+
+% \part
+\def\blx@refpatch@part@memoir#1{%
+ \apptocmd\mempartinfo{#1}
+ {}{\blx@err@patch{\string\mempartinfo}}%
+ \apptocmd\mempartstarinfo{#1}
+ {}{\blx@err@patch{\string\mempartstarinfo}}}
+
+\def\blx@refpatch@part@std#1{%
+ \toggletrue{blx@tempa}%
+ \def\do##1{%
+ \pretocmd##1{#1}
+ {\togglefalse{blx@tempa}\listbreak}
+ {}}%
+ \docsvlist{%
+ \H@old@part,% hyperref
+ \NR@part,% nameref
+ \@part}% latex/koma-script/memoir
+ \iftoggle{blx@tempa}
+ {\blx@err@patch{\string\@part}}
+ {}%
+ \let\do\noexpand}
+
+\def\blx@refpatch@part#1{%
+ \ifundef\part
+ {\blx@err@nodocdiv{part}}
+ {\blx@ifkoma@AddtoDoHook
+ {\blx@refpatch@koma@AddtoDoHook{part}{#1}}
+ {\blx@ifmemoir
+ {\blx@refpatch@part@memoir{#1}}
+ {\blx@refpatch@part@std{#1}}}}}
+
+% \chapter
+\def\blx@refpatch@chapter@memoir#1{%
+ \apptocmd\memchapinfo{#1}
+ {}{\blx@err@patch{\string\memchapinfo}}%
+ \apptocmd\memchapstarinfo{#1}
+ {}{\blx@err@patch{\string\memchapstarinfo}}%
+ \apptocmd\memappchapinfo{#1}
+ {}{\blx@err@patch{\string\memappchapinfo}}%
+ \apptocmd\memappchapstarinfo{#1}
+ {}{\blx@err@patch{\string\memappchapstarinfo}}%
+}
+
+\def\blx@refpatch@chapter@std#1{%
+ \pretocmd\@makechapterhead{#1}
+ {}
+ {\blx@err@patch{\string\@makechapterhead}}
+ \pretocmd\@makeschapterhead{#1}
+ {}
+ {\blx@err@patch{\string\@makeschapterhead}}}
+
+\def\blx@refpatch@chapter#1{%
+ \ifundef\chapter
+ {\blx@err@nodocdiv{chapter}}
+ {\blx@ifkoma@AddtoDoHook
+ {\blx@refpatch@koma@AddtoDoHook{chapter}{#1}}
+ {\blx@ifmemoir
+ {\blx@refpatch@chapter@memoir{#1}}
+ {\blx@refpatch@chapter@std{#1}}}}}
+
+% \section, \subsection
+% {<section csname>}{<patch code>}{<section level number>}
+\def\blx@refpatch@sect#1#2#3{%
+ \ifcsundef{#1}
+ {\blx@err@nodocdiv{#1}\@gobbletwo}
+ {\blx@ifkoma@AddtoDoHook
+ {\blx@refpatch@koma@AddtoDoHook{#1}{#2}}
+ {\blx@ifkoma@startsection
+ {\blx@refpatch@sect@koma@startsection{#2}{#3}}
+ {\blx@ifmemoir
+ {\blx@refpatch@sect@memoir{#1}{#2}}
+ {\blx@refpatch@sect@std{#2}{#3}}}}}}
+
+% KOMA >= 3.26 defines \startsection@secnumdepth to check the sectioning level,
+% so we can now use \At@startsection.
+% Starting from 3.27 we use AddtoDoHook, so this is a short-lived
+% intermezzo.
+\def\blx@refpatch@sect@koma@startsection#1#2{%
+ \At@startsection{\ifnumequal{\startsection@secnumdepth}{#2}{#1}{}}}
+
+% The memoir classes have a nice hook we can use
+% {<section csname>}{<patch code>}
+\edef\blx@refpatch@sect@memoir#1#2{%
+ \apptocmd\noexpand\memsecinfo
+ {\noexpand\blx@refpatch@sect@memoir@i{\string#1}{#1}{#2}}
+ {}{\noexpand\blx@err@patch{\string\memsecinfo}}%
+ \apptocmd\noexpand\memsecstarinfo
+ {\noexpand\blx@refpatch@sect@memoir@i{\string#1}{#1}{#2}}
+ {}{\noexpand\blx@err@patch{\string\memsecstarinfo}}}
+
+\def\blx@refpatch@sect@memoir@i#1#2#3{%
+ \ifstrequal{#1}{#2}{#3}{}}
+
+% The standard classes have \@startsection, \@sect and \@ssect.
+% \@startsection is used by unstarred and starred sections alike
+% but it comes in too early if we set labels.
+% The counter is only stepped in \@sect, so we need to patch
+% that if we want \labels to attach to the right thing.
+% But then we also need to patch \@ssect for starred/un-numbered
+% sections. Unfortunately, \@ssect doesn't know the level number
+% so we patch \@startsection to remember the level number
+% in blx@refpatch@current@sectlevel
+% and then patch \@sect and \@ssect with the actual code
+% testing against blx@refpatch@current@sectlevel.
+
+% {<do initialization>}{<csv list to do>}{<error>}
+\def\blx@refpatch@docsvlist#1#2#3{%
+ \toggletrue{blx@tempa}%
+ #1%
+ \docsvlist{#2}%
+ \iftoggle{blx@tempa}
+ {#3}
+ {}%
+ \let\do\noexpand}
+
+\newtoggle{blx@refpatch@sect@std@pre@done}
+
+\def\blx@refpatch@sect@std@pre{%
+ \iftoggle{blx@refpatch@sect@std@pre@done}
+ {}
+ {\blx@refpatch@docsvlist
+ {\blx@refpatch@sect@std@pre@defdo}
+ {\scr@startsection,
+ \@startsection}
+ {\blx@err@patch{\string\@startsection}}
+ \global\toggletrue{blx@refpatch@sect@std@pre@done}}}
+
+\edef\blx@refpatch@sect@std@pre@defdo{%
+ \def\noexpand\do##1{%
+ \pretocmd##1
+ {\csnumdef{blx@refpatch@current@sectlevel}{\string#2}}
+ {\togglefalse{blx@tempa}\noexpand\listbreak}
+ {}}}
+
+\edef\blx@refpatch@sect@std@defdo@sect#1#2{%
+ \def\noexpand\do##1{%
+ \patchcmd##1%
+ {\noexpand\@tempskipa \string#5\noexpand\relax}
+ {\noexpand\blx@refpatch@sect@std@testandruncode{#1}{#2}%
+ \noexpand\@tempskipa \string#5\noexpand\relax}
+ {\togglefalse{blx@tempa}\noexpand\listbreak}
+ {}}}
+
+\edef\blx@refpatch@sect@std@defdo@ssect#1#2{%
+ \def\noexpand\do##1{%
+ \patchcmd##1%
+ {\noexpand\@tempskipa \string#3\noexpand\relax}
+ {\noexpand\blx@refpatch@sect@std@testandruncode{#1}{#2}%
+ \noexpand\@tempskipa \string#3\noexpand\relax}
+ {\togglefalse{blx@tempa}\noexpand\listbreak}
+ {}}}
+
+% {<patch code>}{<section level number>}
+\def\blx@refpatch@sect@std#1#2{%
+ \blx@refpatch@sect@std@pre
+ % \@sect for numbered (unstarred) sections
+ \blx@refpatch@docsvlist
+ {\blx@refpatch@sect@std@defdo@sect{#1}{#2}}
+ {\H@old@sectm@m,% memoir+hyperref (what a mess...)
+ \M@sect,% memoir
+ \H@old@sect,% hyperref
+ \NR@sect,% nameref
+ \scr@sect,% koma-script 3.x
+ \scr@startsection,% bad hack for koma 3.15 <= v <= 3.25
+ \@sect}
+ {\blx@err@patch{\string\@sect}}
+ % \@ssect for un-numbered (starred) sections
+ \blx@refpatch@docsvlist
+ {\blx@refpatch@sect@std@defdo@ssect{#1}{#2}}
+ {\H@old@ssectm@m,% memoir+hyperref (what a mess...)
+ \M@ssect,% memoir
+ \H@old@ssect,% hyperref
+ \NR@ssect,% nameref
+ \scr@ssect,% koma-script 3.x
+ \@ssect}
+ {\blx@err@patch{\string\@ssect}}}
+
+\def\blx@refpatch@sect@std@testandruncode#1#2{%
+ \ifnumequal{#2}{0\csuse{blx@refpatch@current@sectlevel}}
+ {#1}
+ {}}
+
+% Bibliography categories
+
+\let\blx@categories\@empty
+
+% {<category>}
+\newrobustcmd*{\DeclareBibliographyCategory}[1]{%
+ \ifcsundef{blx@catg@#1}
+ {\global\cslet{blx@catg@#1}\@empty
+ \listgadd\blx@categories{#1}}
+ {\blx@error
+ {Category '#1' already declared}
+ {The bibliography category '#1'\MessageBreak
+ has already been declared}}}
+\@onlypreamble\DeclareBibliographyCategory
+
+% {<category>}{<entrykey>,...}
+\newrobustcmd*{\addtocategory}[2]{%
+ \ifcsundef{blx@catg@#1}
+ {\blx@error
+ {Category '#1' not declared}
+ {Use \string\DeclareBibliographyCategory\space to declare}}
+ {\blx@AfterPreamble{%
+ \blx@xsanitizeafter{\forcsvlist{\blx@addtocategory{#1}}}{#2}}}}
+
+% {<category>}{<entrykey>,...}
+\def\blx@addtocategory#1#2{%
+ % If we are adding a set member to a category, make sure we also add the
+ % set parent if it is cited. If it is cited, we should be using the set
+ % parent in the category, not the set child member. blx@setc@... will
+ % only exist if the set parent is also cited as it is only defined when a
+ % member contains \inset which only happens when the set parent is cited.
+ \ifcsdef{blx@setc@\the\c@refsection @#2}
+ {\blx@auxwrite\@mainaux{}{\string\abx@aux@category{#1}{\csuse{blx@setc@\the\c@refsection @#2}}}%
+ \abx@aux@category{#1}{\csuse{blx@setc@\the\c@refsection @#2}}}
+ {}%
+ \blx@auxwrite\@mainaux{}{\string\abx@aux@category{#1}{#2}}%
+ \abx@aux@category{#1}{#2}}
+
+% {<category>}{<entrykey>,...}
+\protected\def\abx@aux@category#1#2{%
+ \xifinlistcs{\detokenize{#2}}{blx@catg@#1}
+ {}
+ {\listcsxadd{blx@catg@#1}{\detokenize{#2}}}}
+
+\blx@AtEndDocument{\let\abx@aux@category\@gobbletwo}
+
+% [<options>]{<resource>,...}
+\renewrobustcmd*{\bibliography}[1]{%
+ \begingroup
+ \def\blx@tempa{file}%
+ \def\blx@tempb{bibtex}%
+ \def\blx@tempc{local}%
+ \undef\blx@tempd
+ \let\blx@tempe\@empty
+ \blx@xsanitizeafter{\forcsvlist\blx@addbib@legacy}{#1}%
+ \endgroup}
+\@onlypreamble\bibliography
+
+\def\blx@addbib@legacy#1{%
+ \begingroup
+ \edef\blx@tempa{\endgroup
+ \noexpand\blx@addbib@resource{\blx@stripbib{#1}\detokenize{.bib}}}%
+ \blx@tempa}
+
+\def\blx@stripbib#1{%
+ \expandafter\blx@stripbib@i\detokenize{#1.bib}&}
+\edef\blx@stripbib@i{%
+ \def\noexpand\blx@stripbib@i##1\detokenize{.bib}##2&}
+\blx@stripbib@i{#1}
+
+% [<options>]{<resource>,...}
+\newrobustcmd*{\addbibresource}{%
+ \blx@addbib\blx@addbib@resource}
+\@onlypreamble\addbibresource
+
+\newrobustcmd*{\addglobalbib}{%
+ \blx@addbib\blx@addbib@global}
+\@onlypreamble\addglobalbib
+
+\newrobustcmd*{\addsectionbib}{%
+ \blx@addbib\blx@addbib@register}
+\@onlypreamble\addsectionbib
+
+\def\blx@addbib#1{%
+ \@ifnextchar[%]
+ {\blx@addbib@i{#1}}
+ {\blx@addbib@i{#1}[]}}
+
+% kill all spaces and %
+% see https://github.com/plk/biblatex/issues/1026
+\def\blx@addbib@i#1[#2]{%
+ \begingroup
+ \@ifnextchar\bgroup
+ {\blx@hook@fileverb\blx@addbib@ii{#1}{#2}}%
+ {\blx@hook@fileverb\blx@addbib@ii{#1}{#2}}}
+
+\def\blx@addbib@ii#1#2#3{%
+ \endgroup
+ \begingroup
+ \def\blx@tempa{file}%
+ \def\blx@tempb{bibtex}%
+ \def\blx@tempc{local}%
+ \undef\blx@tempd
+ \let\blx@tempe\@empty
+ \def\blx@tempf{false}%
+ \blx@kv@setkeys{blx@addbib}{#2}%
+ \blx@xsanitizeafter{#1}{#3}%
+ \endgroup}
+
+\def\blx@hook@fileverb{%
+ \let\do\@makeother
+ \dospecials
+ \catcode`\\=\z@
+ \catcode`\{=\@ne
+ \catcode`\}=\tw@}
+
+\blx@kv@defkey{blx@addbib}{type}{\def\blx@tempa{#1}}
+\blx@kv@defkey{blx@addbib}{datatype}{\def\blx@tempb{#1}}
+\blx@kv@defkey{blx@addbib}{location}{\def\blx@tempc{#1}}
+\blx@kv@defkey{blx@addbib}{label}{\edef\blx@tempd{\detokenize{#1}}}
+\blx@kv@defkey{blx@addbib}{bibencoding}{\def\blx@tempe{#1}}
+\blx@kv@defkey{blx@addbib}{glob}[true]{\def\blx@tempf{#1}}
+
+% \blx@res@type@<resource> resource -> type
+% \blx@res@data@<resource> resource -> datatype
+% \blx@res@loca@<resource> resource -> datatype
+% \blx@res@labl@<resource> label -> resource
+% \blx@res@glob@<resource> glob -> true|false
+
+\def\blx@addbib@register#1{%
+ \csxdef{blx@res@type@#1}{\blx@tempa}%
+ \csxdef{blx@res@data@#1}{\blx@tempb}%
+ \csxdef{blx@res@loca@#1}{\blx@tempc}%
+ \csxdef{blx@res@bibencoding@#1}{\blx@tempe}%
+ \ifdef\blx@tempf
+ {\csxdef{blx@res@glob@#1}{\blx@tempf}}
+ {}%
+ \ifdef\blx@tempd
+ {\csxdef{blx@res@labl@\blx@tempd}{#1}}
+ {}}
+
+\def\blx@addbib@resource#1{%
+ \blx@addbib@register{#1}%
+ \listgadd\blx@bibfiles{#1}%
+ \blx@regbibfile\jobname{#1}}
+
+\def\blx@addbib@global#1{%
+ \blx@addbib@resource{#1}%
+ \listgadd\blx@bibfiles@global{#1}}
+
+\let\blx@bibfiles\@empty
+\let\blx@bibfiles@global\@empty
+
+\def\blx@bibdata#1#2{%
+ \forlistloop{\blx@bibdata@i{#1}}#2}
+\def\blx@bibdata@i#1#2{%
+ \blx@xmlsanitizeafter{\blx@bibdata@ii{#1}{#2}}{#2}}
+\def\blx@bibdata@ii#1#2#3{%
+ \eappto#1{%
+ \blx@xml@datasource
+ {\ifcsdef{blx@res@type@#2}
+ {\csuse{blx@res@type@#2}}
+ {file}}
+ {\ifcsdef{blx@res@data@#2}
+ {\csuse{blx@res@data@#2}}
+ {bibtex}}
+ {\ifcsvoid{blx@res@bibencoding@#2}
+ {}
+ { encoding="\csuse{blx@res@bibencoding@#2}"}}
+ {\ifcsvoid{blx@res@glob@#2}
+ {}
+ { glob="\csuse{blx@res@glob@#2}"}}
+ {#3}}}
+
+%% Citations
+
+\newrobustcmd*{\AtEveryCite}{\gappto\blx@hook@cite}
+\newrobustcmd*{\AtEveryCitekey}{\gappto\blx@hook@citekey}
+\newrobustcmd*{\AtEveryMultiCite}{\gappto\blx@hook@mcite}
+\@onlypreamble\AtEveryCite
+\@onlypreamble\AtEveryCitekey
+\@onlypreamble\AtEveryMultiCite
+
+\newrobustcmd*{\AtEachCitekey}{%
+ \iftoggle{blx@citation}{\appto\blx@hook@citekey}{\@gobble}}
+
+\let\blx@hook@entrykey\@gobble
+\newrobustcmd*{\AtEveryEntrykey}{%
+ \apptocmd{\blx@hook@entrykey}}
+\@onlypreamble\AtEveryEntrykey
+
+\def\blx@imc@UseEveryCiteHook{\csuse{blx@hook@cite}}
+\def\blx@imc@UseEveryCitekeyHook{\csuse{blx@hook@citekey}}
+\def\blx@imc@UseEveryMultiCiteHook{\csuse{blx@hook@mcite}}
+
+\newrobustcmd*{\AtNextCite}{%
+ \ifundef\blx@hook@cite@next
+ {\gdef\blx@hook@cite@next{\global\undef\blx@hook@cite@next}}
+ {}%
+ \gappto\blx@hook@cite@next}
+
+\newrobustcmd*{\AtNextCitekey}{%
+ \ifundef\blx@hook@citekey@next
+ {\gdef\blx@hook@citekey@next{\global\undef\blx@hook@citekey@next}}
+ {}%
+ \gappto\blx@hook@citekey@next}
+
+\newrobustcmd*{\AtNextMultiCite}{%
+ \ifundef\blx@hook@mcite@next
+ {\gdef\blx@hook@mcite@next{\global\undef\blx@hook@mcite@next}}
+ {}%
+ \gappto\blx@hook@mcite@next}
+
+\def\blx@imc@UseNextCiteHook{\csuse{blx@hook@cite@next}}
+\def\blx@imc@UseNextCitekeyHook{\csuse{blx@hook@citekey@next}}
+\def\blx@imc@UseNextMultiCiteHook{\csuse{blx@hook@mcite@next}}
+
+\def\blx@imc@DeferNextCitekeyHook{\undef\blx@hook@citekey@next}
+
+\blx@regimcs{%
+ \UseEveryCiteHook \UseEveryCitekeyHook \UseEveryMultiCiteHook
+ \UseNextCiteHook \UseNextCitekeyHook \UseNextMultiCiteHook
+ \DeferNextCitekeyHook}
+
+% {<style>}
+
+\newrobustcmd*{\RequireCitationStyle}[1]{%
+ \blx@inputonce{#1.cbx}{citation style '#1'}{}{}{}
+ {\blx@error
+ {Style '#1' not found}
+ {The citation style '#1' could not be found}}}
+\@onlypreamble\RequireCitationStyle
+
+% {<code>}
+
+\newrobustcmd*{\InitializeCitationStyle}{\appto\blx@hook@cbxinit}
+\@onlypreamble\InitializeCitationStyle
+
+% {<code>}
+
+\newrobustcmd*{\OnManualCitation}{\appto\blx@hook@mancite}
+\@onlypreamble\OnManualCitation
+
+\newrobustcmd*{\mancite}{%
+ \csuse{blx@hook@mancite}%
+ \blx@ibidreset
+ \blx@idemreset
+ \blx@opcitreset
+ \blx@loccitreset}
+
+% {<entrykey>}{<message>}
+% Wrapper to track cite keys which are \nocited
+\def\blx@nocitation#1#2{%
+ \ifinlist{#1}\blx@nocites
+ {}
+ {\listgadd\blx@nocites{#1}}%
+ \blx@citation@i{#1}{#2}}
+
+% {<entrykey>}{<message>}
+% Just a wrapper to suppress citation tracking in toc/lof etc.
+\def\blx@citation#1#2{%
+ \ifinlist{#1}\blx@directcites
+ {}
+ {\listgadd\blx@directcites{#1}}%
+ \blx@citation@i{#1}{#2}}
+
+\def\blx@citation@i#1#2{%
+ \ifbool{citerequest}
+ {\blx@citation@entry{#1}{#2}}
+ {}}
+
+\def\blx@citation@entry#1#2{%
+ \blx@bibreq{#1}%
+ \ifinlistcs{#1}{blx@cites@\the\c@refsection}
+ {}
+ {\listcsgadd{blx@cites@\the\c@refsection}{#1}}%
+ \blx@auxwrite\@mainaux{}{\string\abx@aux@cite{\the\c@refsection}{#1}}%
+ \ifinlistcs{#1}{blx@segm@\the\c@refsection @\the\c@refsegment}
+ {}
+ {\listcsgadd{blx@segm@\the\c@refsection @\the\c@refsegment}{#1}}%
+ \blx@auxwrite\@mainaux{}{\string\abx@aux@segm{\the\c@refsection}%
+ {\the\c@refsegment}%
+ {\detokenize{#1}}}%
+ \blx@ifdata{#1}
+ {}
+ {\ifcsdef{blx@miss@\the\c@refsection}
+ {\ifinlistcs{#1}{blx@miss@\the\c@refsection}
+ {\@latex@warning{#2{#1}}}
+ {\blx@logreq@active{#2{#1}}}}
+ {\blx@logreq@active{#2{#1}}}}%
+ \blx@hook@entrykey{#1}}
+
+\protected\def\abx@aux@segm#1#2#3{%
+ \xifinlistcs{\detokenize{#3}}{blx@segm@#1@#2}
+ {}
+ {\listcsxadd{blx@segm@#1@#2}{\detokenize{#3}}}}
+
+\def\blx@nocitation@all{%
+ \ifinlist{*}\blx@nocites
+ {}
+ {\listgadd\blx@nocites{*}}%
+ \blx@citation@all}
+
+\def\blx@citation@all{%
+ \blx@auxwrite\@mainaux{}{\string\abx@aux@nociteall}%
+ \ifbool{citerequest}
+ {\global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne
+ \blx@bibreq{*}%
+ \global\csletcs
+ {blx@segm@\the\c@refsection @\the\c@refsegment}
+ {blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}%
+ \ifcsvoid{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}
+ {\blx@logreq@active{}}
+ {}}
+ {}}
+
+\def\abx@aux@nociteall{%
+ \listgadd\blx@nocites{*}}
+
+\protected\def\blx@bibreq#1{%
+ \advance\blx@tempcntc\@ne% holds internal \cite{} citation order
+ \begingroup
+ \blx@xmlsanitizeafter{\def\blx@tempa}{#1}%
+ \let\blx@tempb\@empty
+ % Only output as \nocited if a key wasn't also directly \cite'd
+ % Since citekey output is sequential as cites are read, the .bcf might contain
+ % duplicate keys with differring nocite attributes if \nocite{X} and \cite{X} both occur
+ % but biber deals with this and priorities \cites
+ \ifboolexpr{test {\ifinlist{#1}\blx@nocites}
+ and
+ not test {\ifinlist{#1}\blx@directcites}}
+ {\def\blx@tempb{ nocite="1"}}
+ {}%
+ \blx@auxwrite\blx@bcfout{}{\blx@xml@citekey{\blx@tempa}{\blx@tempb}%
+ {\expandafter\the\csname blx@sectionciteorder@\the\c@refsection\endcsname}%
+ {\expandafter\the\csname blx@tempcntc\endcsname}}%
+ % citeall is always order "0" - this makes no real difference as biber
+ % ignores all other citekeys in the section if citeall is present
+ % \ifstrequal{*}{#1}
+ % {\blx@auxwrite\blx@bcfout{}{\blx@xml@citekey{\blx@tempa}{\blx@tempb}{0}}}
+ % {\blx@auxwrite\blx@bcfout{}{\blx@xml@citekey{\blx@tempa}{\blx@tempb}{%
+ % \expandafter\the\csname blx@sectionciteorder@\the\c@refsection\endcsname}}}%
+ \endgroup}
+
+% {<set>}{<key1,key2,key3>}
+\newrobustcmd*{\defbibentryset}[2]{%
+ \@bsphack
+ \begingroup
+ \blx@xsanitizeafter{\def\blx@tempa}{#1}%
+ \let\blx@tempb\@empty
+ \let\blx@tempc\@empty
+ \blx@xsanitizeafter{\forcsvlist\blx@defentryset@add}{#2}%
+ \ifcsdef{blx@set@\the\c@refsection @\blx@tempa}
+ {\expandafter\ifdefequal
+ \csname blx@set@\the\c@refsection @\blx@tempa\endcsname
+ \blx@tempb
+ {}
+ {\blx@error
+ {Conflicting definitions of '\blx@tempa'}
+ {The entry set '\blx@tempa' has been defined before.%
+ \MessageBreak
+ old: \blx@tempa\space = %
+ \csuse{blx@set@\the\c@refsection @\blx@tempa}\MessageBreak
+ new: \blx@tempa\space = \blx@tempb\MessageBreak
+ I'm ignoring the new definition}}}
+ {\global\cslet{blx@set@\the\c@refsection @\blx@tempa}\blx@tempb
+ \edef\blx@tempa{%
+ \blx@AfterPreamble{\blx@setreq{\blx@tempa}{\blx@tempb}}}%
+ \blx@tempa}%
+ \endgroup
+ \@esphack}
+
+\def\blx@defentryset@add#1{%
+ \edef\blx@tempb{\blx@tempb\blx@tempc#1}%
+ \def\blx@tempc{,}}
+
+\protected\def\blx@setreq#1#2{%
+ \begingroup
+ \blx@xmlsanitizeafter{\def\blx@tempa}{#1}%
+ \blx@xmlsanitizeafter{\def\blx@tempb}{#2}%
+ \blx@auxwrite\blx@bcfout{}{\blx@xml@citeset{\blx@tempa}{\blx@tempb}}%
+ \endgroup}
+
+
+\def\abx@warn@emptycite{%
+ \abx@warn@emptycite@print
+ \abx@warn@emptycite@log}
+
+\def\abx@warn@emptycite@print@text{%
+ \textless empty citation\textgreater}
+
+\def\abx@warn@emptycite@print{%
+ \abx@missing@entry{\abx@warn@emptycite@print@text}}
+
+\def\abx@warn@emptycite@log{%
+ \@latex@warning{\blx@msg@cundefon{}}}
+
+
+% {<entrykey>,...}
+% a crude way to check for a do-nothing argument:
+% loop over it to see what happens
+\protected\def\blx@citeloop#1{%
+ \togglefalse{blx@tempa}%
+ \def\do{\toggletrue{blx@tempa}\listbreak}%
+ \expandafter\docsvlist\expandafter{\detokenize{#1}}%
+ \iftoggle{blx@tempa}
+ {\expandafter\blx@citeloop@i\expandafter{\detokenize{#1}}}
+ {\abx@warn@emptycite}}
+\protected\def\blx@citeloop@i#1{%
+ \begingroup
+ % This must be here and not after \blx@citeadd as this changes the refcontext
+ \letcs\blx@tempb{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}%
+ \ifundef\blx@tempb
+ {\let\blx@tempb\@empty}
+ {}%
+ % Make sure this counter exists. Sometimes it might not when using, e.g:
+ % refsection=chapter and \includeonly to put in the chapters or when
+ % inserting citations into table of contents
+ \blx@providecount{blx@sectionciteorder@\the\c@refsection}%
+ \global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne
+ \blx@tempcnta\z@
+ \blx@tempcntb\z@
+ \blx@tempcntc\z@
+ \let\blx@tempa\@empty
+ \forcsvlist\blx@citeadd{#1}% adds to \blx@tempa
+ \blx@thenotecheck
+ \ifnum\blx@tempcnta>\z@
+ \ifnum\blx@tempcntb>\z@
+ \multicitedelim
+ \fi
+ \else
+ \blx@postpunct@saved
+ \fi
+ % \blx@tempb is a sorted list of all cites, \blx@tempa is the list of cites to
+ % sort using this list
+ \blx@thecitesort
+ \edef\blx@tempa{\endgroup
+ \c@citecount\z@
+ \c@citetotal\the\blx@tempcnta\relax
+ \unexpanded{\forlistloop\blx@citeprint}{\blx@tempb}}%
+ \blx@tempa}
+
+\def\blx@notecheck{%
+ \ifnum\blx@tempcnta>\@ne
+ \blx@warning{%
+ Package option 'sortcites' enabled.\MessageBreak
+ Verify postnote placement}%
+ \fi}
+
+\def\blx@citesort{%
+ \ifnum\blx@tempcnta>\@ne
+ \blx@filtercitesort\blx@tempb{blx@tempa}%
+ \else
+ \blx@citenosort
+ \fi}
+
+\def\blx@citenosort{%
+ \let\blx@tempb\blx@tempa}
+
+\def\abx@missing@entry#1{%
+ \abx@missing{#1}}
+
+% {<entrykey>}
+\def\blx@citeadd#1{%
+ \ifcsdef{blx@keyalias@\the\c@refsection @#1}
+ {\letcs\blx@realkey{blx@keyalias@\the\c@refsection @#1}}
+ {\def\blx@realkey{#1}}%
+ \expandafter\blx@getrefcontext\expandafter{\blx@realkey}% needed for \ifdata
+ \expandafter\blx@citation\expandafter{\blx@realkey}\blx@msg@cundefon
+ \expandafter\blx@ifdata\expandafter{\blx@realkey}
+ {\advance\blx@tempcnta\@ne
+ \listeadd\blx@tempa{\blx@realkey}}
+ {\ifnum\blx@tempcntb>\z@\multicitedelim\fi
+ \expandafter\abx@missing@entry\expandafter{\blx@realkey}%
+ \advance\blx@tempcntb\@ne}}
+
+% set default refcontext for one citation key
+% and then override with data from auto-assign \assignrefcontext* macros, if any
+% <entrykey>
+\def\blx@getrefcontext#1{%
+ % Save refcontext for restoration at end of \citeprint
+ \let\blx@refcontext@context@saved\blx@refcontext@context
+ % Get the default refcontext
+ % If there was one due to appearance in a bib/biblist, use it
+ % otherwise fall back on global refcontext. This can happen for cites
+ % made (a bit strangely but some styles do this) inside a biblist
+ % which never appear in any printed bib/biblist and therefore have no default
+ % refcontext defined
+ \ifcsdef{blx@assignedrefcontextbib@aux@\the\c@refsection @#1}
+ {\letcs\blx@refcontext@context{blx@assignedrefcontextbib@aux@\the\c@refsection @#1}}
+ {\blx@edef@refcontext{\blx@sorting/global//global/global}}%
+ % assignment via keyword list
+ \ifdef\blx@assignedrefcontextkeywlist
+ {\def\do##1{%
+ \blx@imc@ifentrykeyword{#1}{##1}
+ {% weak version
+ \ifboolexpr{test {\ifcsdef{blx@assignedrefcontextkeyws*@\the\c@refsection @##1}}
+ and
+ not togl {blx@refcontext}}% inside explicit non-global refcontext
+ {\letcs\blx@refcontext@context{blx@assignedrefcontextkeyws*@\the\c@refsection @##1}}
+ {}%
+ % strong version
+ \ifcsdef{blx@assignedrefcontextkeyws@\the\c@refsection @##1}
+ {\letcs\blx@refcontext@context{blx@assignedrefcontextkeyws@\the\c@refsection @##1}}
+ {}}
+ {}}%
+ \dolistloop\blx@assignedrefcontextkeywlist}
+ {}%
+ % assignment via category
+ \ifdef\blx@assignedrefcontextcatlist
+ {\def\do##1{%
+ \blx@imc@ifentrycategory{#1}{##1}
+ {% weak version
+ \ifboolexpr{test {\ifcsdef{blx@assignedrefcontextcats*@\the\c@refsection @##1}}
+ and
+ not togl {blx@refcontext}}% inside explicit non-global refcontext
+ {\letcs\blx@refcontext@context{blx@assignedrefcontextcats*@\the\c@refsection @##1}}
+ {}%
+ % strong version
+ \ifcsdef{blx@assignedrefcontextcats@\the\c@refsection @##1}
+ {\letcs\blx@refcontext@context{blx@assignedrefcontextcats@\the\c@refsection @##1}}
+ {}}
+ {}}%
+ \dolistloop\blx@assignedrefcontextcatlist}
+ {}%
+ % assignment via entrykeys
+ % weak version
+ \nottoggle{blx@refcontext}
+ {\ifcsdef{blx@assignedrefcontextkeys*@\the\c@refsection @*}
+ {\letcs\blx@refcontext@context{blx@assignedrefcontextkeys*@\the\c@refsection @*}}
+ {\ifcsdef{blx@assignedrefcontextkeys*@\the\c@refsection @#1}
+ {\letcs\blx@refcontext@context{blx@assignedrefcontextkeys*@\the\c@refsection @#1}}
+ {}}}
+ {}%
+ % strong version
+ \ifcsdef{blx@assignedrefcontextkeys@\the\c@refsection @*}
+ {\letcs\blx@refcontext@context{blx@assignedrefcontextkeys@\the\c@refsection @*}}
+ {\ifcsdef{blx@assignedrefcontextkeys@\the\c@refsection @#1}
+ {\letcs\blx@refcontext@context{blx@assignedrefcontextkeys@\the\c@refsection @#1}}
+ {}}}
+
+% {<entrykey>}
+\protected\def\blx@citeprint#1{%
+ \blx@getrefcontext{#1}%
+ \advance\c@citecount\@ne
+ \addtocounter{instcount}\@ne
+ \ifnum\c@citecount=\@ne
+ \blx@getdata@cite{#1}%
+ \blx@precode
+ \ifnum\c@citetotal>\@ne
+ \blx@resetdata
+ \fi
+ \else
+ \blx@dlimcode
+ \fi
+ \begingroup
+ \ifnum\c@citetotal>\@ne
+ \blx@getdata@cite{#1}%
+ \fi
+ \blx@entrysetcount
+ \blx@setoptions@type\abx@field@@@entrytype
+ \blx@setoptions@entry
+ \blx@backref{#1}%
+ \blx@pagetracker
+ \csuse{blx@hook@citekey}%
+ \csuse{blx@hook@citekey@next}%
+ \blx@beglangcite
+ \blx@execute
+ \blx@loopcode
+ \blx@citecounter
+ \blx@citetracker
+ \blx@ibidtracker
+ \blx@idemtracker
+ \blx@opcittracker
+ \blx@loccittracker
+ \ifnum\c@citecount=\c@citetotal
+ \def\blx@thecheckpunct{\blx@err@nestcite\@gobble}%
+ \blx@postcode
+ \blx@postpunct@saved
+ \fi
+ \blx@endlangcite
+ \endgroup
+ \let\blx@refcontext@context\blx@refcontext@context@saved}
+
+% cite counter
+\def\blx@citecounter@global{%
+ \ifbool{@filesw}
+ {\ifbool{citetracker}
+ {\abx@curr@count{\the\c@refsection}{\abx@field@@@entrykey}%
+ \immediate\write\@mainaux{%
+ \string\abx@aux@count
+ {\the\c@refsection}{\abx@field@@@entrykey}}}
+ {}}
+ {}}
+
+\def\blx@citecounter@context{%
+ \ifbool{@filesw}
+ {\ifbool{citetracker}
+ {\iftoggle{blx@footnote}
+ {\abx@curr@fncount}
+ {\abx@curr@count}
+ {\the\c@refsection}{\abx@field@@@entrykey}%
+ \immediate\write\@mainaux{%
+ \iftoggle{blx@footnote}
+ {\string\abx@aux@fncount}
+ {\string\abx@aux@count}%
+ {\the\c@refsection}{\abx@field@@@entrykey}}}
+ {}}
+ {}}
+
+% {<refsection>}{<entrykey>}
+% set maxcitecounter as well, note that we also define a maxcitecounter across
+% all refsections, but that does not have a high-level interface
+\protected\def\blx@aux@count#1#2{%
+ \csnumgdef{blx@count@#1@\detokenize{#2}}{%
+ \csuse{blx@count@#1@\detokenize{#2}}+1}%
+ \ifnumgreater{\csuse{blx@count@#1@\detokenize{#2}}}{%
+ 0\csuse{blx@maxcitecounter@#1}}
+ {\csnumgdef{blx@maxcitecounter@#1}{%
+ \csuse{blx@count@#1@\detokenize{#2}}}}
+ {}%
+ \ifnumgreater{\csuse{blx@count@#1@\detokenize{#2}}}{%
+ 0\csuse{blx@maxcitecounter}}
+ {\csnumgdef{blx@maxcitecounter}{%
+ \csuse{blx@count@#1@\detokenize{#2}}}}
+ {}}
+
+\protected\def\blx@aux@fncount#1#2{%
+ \csnumgdef{blx@fncount@#1@\detokenize{#2}}{%
+ \csuse{blx@fncount@#1@\detokenize{#2}}+1}%
+ \ifnumgreater{\csuse{blx@fncount@#1@\detokenize{#2}}}{%
+ 0\csuse{blx@maxfncitecounter@#1}}
+ {\csnumgdef{blx@maxfncitecounter@#1}{%
+ \csuse{blx@fncount@#1@\detokenize{#2}}}}
+ {}%
+ \ifnumgreater{\csuse{blx@fncount@#1@\detokenize{#2}}}{%
+ 0\csuse{blx@maxfncitecounter}}
+ {\csnumgdef{blx@maxfncitecounter}{%
+ \csuse{blx@fncount@#1@\detokenize{#2}}}}
+ {}}
+
+\let\abx@aux@count\@gobbletwo
+\let\abx@aux@fncount\@gobbletwo
+
+\protected\def\blx@curr@count#1#2{%
+ \csnumgdef{blx@currcount@#1@#2}{%
+ \csuse{blx@currcount@#1@#2}+1}}
+
+\protected\def\blx@curr@fncount#1#2{%
+ \csnumgdef{blx@currfncount@#1@#2}{%
+ \csuse{blx@currfncount@#1@#2}+1}}
+
+\let\abx@curr@count\@gobbletwo
+\let\abx@curr@fncount\@gobbletwo
+
+\blx@AtEndDocument{%
+ \let\abx@aux@count\@gobbletwo
+ \let\abx@aux@fncount\@gobbletwo
+ \let\abx@curr@count\@gobbletwo
+ \let\abx@curr@fncount\@gobbletwo}
+
+\protected\def\blx@setcitecounter@global{%
+ \c@citecounter0%
+ \csuse{blx@count@\the\c@refsection @\abx@field@@@entrykey}%
+ \relax
+ \c@maxcitecounter0%
+ \csuse{blx@maxcitecounter@\the\c@refsection}%
+ \relax}
+
+\protected\def\blx@setcitecounter@context{%
+ \c@citecounter0%
+ \iftoggle{blx@footnote}
+ {\csuse{blx@fncount@\the\c@refsection @\abx@field@@@entrykey}}
+ {\csuse{blx@count@\the\c@refsection @\abx@field@@@entrykey}}%
+ \relax
+ \c@maxcitecounter0%
+ \iftoggle{blx@footnote}
+ {\csuse{blx@maxfncitecounter@\the\c@refsection}}
+ {\csuse{blx@maxcitecounter@\the\c@refsection}}%
+ \relax}
+
+% cite tracker
+\def\blx@citetracker@global{%
+ \ifbool{citetracker}
+ {\xifinlistcs\abx@field@@@entrykey{blx@bsee@\the\c@refsection}
+ {}
+ {\listcsxadd{blx@bsee@\the\c@refsection}\abx@field@@@entrykey}}
+ {}}
+
+\def\blx@citetracker@context{%
+ \ifbool{citetracker}
+ {\iftoggle{blx@footnote}
+ {\xifinlistcs\abx@field@@@entrykey{blx@fsee@\the\c@refsection}
+ {}
+ {\listcsxadd{blx@fsee@\the\c@refsection}\abx@field@@@entrykey}}
+ {\xifinlistcs\abx@field@@@entrykey{blx@bsee@\the\c@refsection}
+ {}
+ {\listcsxadd{blx@bsee@\the\c@refsection}\abx@field@@@entrykey}}}
+ {}}
+
+\protected\appto\abx@savetrackers{%
+ \global\csletcs{blx@saved@bsee@\the\c@refsection}{blx@bsee@\the\c@refsection}%
+ \global\csletcs{blx@saved@fsee@\the\c@refsection}{blx@fsee@\the\c@refsection}}
+
+\protected\appto\abx@resttrackers{%
+ \global\csletcs{blx@bsee@\the\c@refsection}{blx@saved@bsee@\the\c@refsection}%
+ \global\csletcs{blx@fsee@\the\c@refsection}{blx@saved@fsee@\the\c@refsection}}
+
+\protected\appto\abx@cleartrackers{%
+ \global\cslet{blx@saved@bsee@\the\c@refsection}\@empty
+ \global\cslet{blx@saved@fsee@\the\c@refsection}\@empty}
+
+% ibidem tracker
+\def\blx@ibidtracker@global{%
+ \ifbool{citetracker}
+ {\global\let\blx@lastkey@text\abx@field@@@entrykey}
+ {}}
+
+\def\blx@ibidtracker@context{%
+ \ifbool{citetracker}
+ {\iftoggle{blx@footnote}
+ {\global\let\blx@lastkey@foot\abx@field@@@entrykey}
+ {\global\let\blx@lastkey@text\abx@field@@@entrykey}}
+ {}}
+
+\def\blx@ibidtracker@strict{%
+ \blx@ifcitesingle
+ {\blx@ibidtracker@global}
+ {\blx@ibidreset@global}}%
+
+\def\blx@ibidtracker@constrict{%
+ \blx@ifcitesingle
+ {\iftoggle{blx@footnote}
+ {\blx@mpfnsave}
+ {}%
+ \blx@ibidtracker@context}
+ {\blx@ibidreset@context}}%
+
+\def\blx@ibidreset@force{%
+ \global\undef\blx@lastkey@text
+ \global\undef\blx@lastkey@foot
+ \blx@mpfnreset}
+
+\def\blx@ibidreset@global{%
+ \global\undef\blx@lastkey@text}
+
+\def\blx@ibidreset@context{%
+ \iftoggle{blx@footnote}
+ {\blx@mpfnreset
+ \global\undef\blx@lastkey@foot}
+ {\global\undef\blx@lastkey@text}}
+
+\protected\appto\abx@savetrackers{%
+ \global\let\blx@saved@lastkey@text\blx@lastkey@text
+ \global\let\blx@saved@lastkey@foot\blx@lastkey@foot}
+
+\protected\appto\abx@resttrackers{%
+ \global\let\blx@lastkey@text\blx@saved@lastkey@text
+ \global\let\blx@lastkey@foot\blx@saved@lastkey@foot}
+
+\protected\appto\abx@cleartrackers{%
+ \global\undef\blx@saved@lastkey@text
+ \global\undef\blx@saved@lastkey@foot}
+
+% idem tracker
+\def\blx@idemtracker@global{%
+ \ifbool{citetracker}
+ {\global\let\blx@lasthash@text\abx@field@@@fullhash}
+ {}}
+
+\def\blx@idemtracker@context{%
+ \ifbool{citetracker}
+ {\iftoggle{blx@footnote}
+ {\global\let\blx@lasthash@foot\abx@field@@@fullhash}
+ {\global\let\blx@lasthash@text\abx@field@@@fullhash}}
+ {}}
+
+\let\blx@idemtracker@strict\blx@idemtracker@global
+
+\def\blx@idemtracker@constrict{%
+ \iftoggle{blx@footnote}
+ {\blx@mpfnsave}
+ {}%
+ \blx@idemtracker@context}
+
+\def\blx@idemreset@force{%
+ \global\undef\blx@lasthash@text
+ \global\undef\blx@lasthash@foot
+ \blx@mpfnreset}
+
+\def\blx@idemreset@global{%
+ \global\undef\blx@lasthash@text}
+
+\def\blx@idemreset@context{%
+ \iftoggle{blx@footnote}
+ {\blx@mpfnreset
+ \global\undef\blx@lasthash@foot}
+ {\global\undef\blx@lasthash@text}}
+
+\protected\appto\abx@savetrackers{%
+ \global\let\blx@saved@lasthash@text\blx@lasthash@text
+ \global\let\blx@saved@lasthash@text\blx@lasthash@text}
+
+\protected\appto\abx@resttrackers{%
+ \global\let\blx@lasthash@text\blx@saved@lasthash@text
+ \global\let\blx@lasthash@text\blx@saved@lasthash@text}
+
+\protected\appto\abx@cleartrackers{%
+ \global\undef\blx@saved@lasthash@text
+ \global\undef\blx@saved@lasthash@foot}
+
+% opcit tracker
+\def\blx@opcittracker@global{%
+ \ifbool{citetracker}
+ {\blx@opcit@tracker{text}}
+ {}}
+
+\def\blx@opcittracker@context{%
+ \ifbool{citetracker}
+ {\iftoggle{blx@footnote}
+ {\blx@opcit@tracker{foot}}
+ {\blx@opcit@tracker{text}}}
+ {}}
+
+\def\blx@opcittracker@strict{%
+ \blx@ifcitesingle
+ {\blx@opcittracker@global}
+ {\blx@opcitreset@global}}%
+
+\def\blx@opcittracker@constrict{%
+ \blx@ifcitesingle
+ {\iftoggle{blx@footnote}
+ {\blx@mpfnsave}
+ {}%
+ \blx@opcittracker@context}
+ {\blx@opcitreset@context}}%
+
+\def\blx@opcit@tracker#1{%
+ \blx@imc@iffieldundef{namehash}
+ {}
+ {\global\cslet{blx@lastkey@#1@\abx@field@@@namehash}\abx@field@@@entrykey
+ \xifinlistcs\abx@field@@@namehash{blx@trackhash@#1}
+ {}
+ {\listcsxadd{blx@trackhash@#1}\abx@field@@@namehash}}}
+
+\def\blx@opcit@reset#1{%
+ \begingroup
+ \def\do##1{\global\csundef{blx@lastkey@#1@##1}}%
+ \dolistcsloop{blx@trackhash@#1}%
+ \global\cslet{blx@trackhash@#1}\@empty
+ \endgroup}
+
+\def\blx@opcitreset@force{%
+ \blx@opcit@reset{text}%
+ \blx@opcit@reset{foot}%
+ \blx@mpfnreset}
+
+\def\blx@opcitreset@global{%
+ \blx@opcit@reset{text}}
+
+\def\blx@opcitreset@context{%
+ \iftoggle{blx@footnote}
+ {\blx@opcit@reset{foot}%
+ \blx@mpfnreset}
+ {\blx@opcit@reset{text}}}
+
+\let\blx@trackhash@text\@empty
+\let\blx@trackhash@foot\@empty
+
+\protected\appto\abx@savetrackers{%
+ \begingroup
+ \def\do#1{\global\csletcs{blx@saved@lastkey@text@#1}{blx@lastkey@text@#1}}%
+ \dolistloop\blx@trackhash@text
+ \global\let\blx@saved@trackhash@text\blx@trackhash@text
+ \def\do#1{\global\csletcs{blx@saved@lastkey@foot@#1}{blx@lastkey@foot@#1}}%
+ \dolistloop\blx@trackhash@foot
+ \global\let\blx@saved@trackhash@foot\blx@trackhash@foot
+ \endgroup}
+
+\protected\appto\abx@resttrackers{%
+ \begingroup
+ \blx@opcit@reset{text}%
+ \global\let\blx@trackhash@text\blx@saved@trackhash@text
+ \def\do#1{\global\csletcs{blx@lastkey@text@#1}{blx@saved@lastkey@text@#1}}%
+ \dolistloop\blx@trackhash@text
+ \blx@opcit@reset{foot}%
+ \global\let\blx@trackhash@foot\blx@saved@trackhash@foot
+ \def\do#1{\global\csletcs{blx@lastkey@foot@#1}{blx@saved@lastkey@foot@#1}}%
+ \dolistloop\blx@trackhash@foot
+ \endgroup}
+
+\protected\appto\abx@cleartrackers{%
+ \begingroup
+ \def\do#1{\global\csundef{blx@saved@lastkey@text@#1}}%
+ \dolistloop\blx@saved@trackhash@text
+ \global\undef\blx@saved@trackhash@text
+ \def\do#1{\global\csundef{blx@saved@lastkey@foot@#1}}%
+ \dolistloop\blx@saved@trackhash@foot
+ \global\undef\blx@saved@trackhash@foot
+ \endgroup}
+
+% loccit tracker
+\def\blx@loccittracker@global{%
+ \ifbool{citetracker}
+ {\blx@loccit@tracker{text}}
+ {}}
+
+\def\blx@loccittracker@context{%
+ \ifbool{citetracker}
+ {\iftoggle{blx@footnote}
+ {\blx@loccit@tracker{foot}}
+ {\blx@loccit@tracker{text}}}
+ {}}
+
+\def\blx@loccittracker@strict{%
+ \ifbool{citetracker}
+ {\blx@loccit@stricttracker{text}}
+ {}}
+
+\def\blx@loccittracker@constrict{%
+ \ifbool{citetracker}
+ {\iftoggle{blx@footnote}
+ {\blx@mpfnsave
+ \blx@loccit@stricttracker{foot}}
+ {\blx@loccit@stricttracker{text}}}
+ {}}
+
+\def\blx@loccit@tracker#1{%
+ \global\csundef{blx@lastnote@#1@\abx@field@@@entrykey}%
+ \blx@imc@iffieldundef{postnote}
+ {}
+ {\global\cslet{blx@lastnote@#1@\abx@field@@@entrykey}\abx@field@@@postnote
+ \xifinlistcs\abx@field@@@entrykey{blx@trackkeys@#1}
+ {}
+ {\listcsxadd{blx@trackkeys@#1}\abx@field@@@entrykey}}}
+
+\def\blx@loccit@stricttracker#1{%
+ \global\csundef{blx@lastnote@#1@\abx@field@@@entrykey}%
+ \blx@imc@iffieldundef{postnote}
+ {}
+ {\blx@ifcitesingle
+ {\expandafter\blx@imc@ifpages
+ \expandafter{\abx@field@@@postnote}
+ {\global\cslet{blx@lastnote@#1@\abx@field@@@entrykey}\abx@field@@@postnote
+ \xifinlistcs\abx@field@@@entrykey{blx@trackkeys@#1}
+ {}
+ {\listcsxadd{blx@trackkeys@#1}\abx@field@@@entrykey}}
+ {}}
+ {}}}
+
+\def\blx@loccit@reset#1{%
+ \begingroup
+ \def\do##1{\global\csundef{blx@lastnote@#1@##1}}%
+ \dolistcsloop{blx@trackkeys@#1}%
+ \global\cslet{blx@trackkeys@#1}\@empty
+ \endgroup}
+
+\def\blx@loccitreset@force{%
+ \blx@loccit@reset{text}%
+ \blx@loccit@reset{foot}%
+ \blx@mpfnreset}
+
+\def\blx@loccitreset@global{%
+ \blx@loccit@reset{text}}
+
+\def\blx@loccitreset@context{%
+ \iftoggle{blx@footnote}
+ {\blx@loccit@reset{foot}%
+ \blx@mpfnreset}
+ {\blx@loccit@reset{text}}}
+
+\let\blx@trackkeys@text\@empty
+\let\blx@trackkeys@foot\@empty
+
+\protected\appto\abx@savetrackers{%
+ \begingroup
+ \def\do#1{\global\csletcs{blx@saved@lastnote@text@#1}{blx@lastnote@text@#1}}%
+ \dolistloop\blx@trackkeys@text
+ \global\let\blx@saved@trackkeys@text\blx@trackkeys@text
+ \def\do#1{\global\csletcs{blx@saved@lastnote@foot@#1}{blx@lastnote@foot@#1}}%
+ \dolistloop\blx@trackkeys@foot
+ \global\let\blx@saved@trackkeys@foot\blx@trackkeys@foot
+ \endgroup}
+
+\protected\appto\abx@resttrackers{%
+ \begingroup
+ \blx@loccit@reset{text}%
+ \global\let\blx@trackkeys@text\blx@saved@trackkeys@text
+ \def\do#1{\global\csletcs{blx@lastnote@text@#1}{blx@saved@lastnote@text@#1}}%
+ \dolistloop\blx@trackkeys@text
+ \blx@loccit@reset{foot}%
+ \global\let\blx@trackkeys@foot\blx@saved@trackkeys@foot
+ \def\do#1{\global\csletcs{blx@lastnote@foot@#1}{blx@saved@lastnote@foot@#1}}%
+ \dolistloop\blx@trackkeys@foot
+ \endgroup}
+
+\protected\appto\abx@cleartrackers{%
+ \begingroup
+ \def\do#1{\global\csundef{blx@saved@lastnote@text@#1}}%
+ \dolistloop\blx@saved@trackkeys@text
+ \global\undef\blx@saved@trackkeys@text
+ \def\do#1{\global\csundef{blx@saved@lastnote@foot@#1}}%
+ \dolistloop\blx@saved@trackkeys@foot
+ \global\undef\blx@saved@trackkeys@foot
+ \endgroup}
+
+\def\blx@addbackref#1{%
+ \ifcsdef{blx@setp@\the\c@refsection @#1}
+ {\ifcase\blx@backrefsetstyle
+ \blx@addbackref@i{#1}%
+ \or
+ \blx@addbackref@ii{setp}{#1}%
+ \or
+ \blx@addbackref@i{#1}%
+ \or
+ \blx@addbackref@i{#1}%
+ \or
+ \blx@addbackref@i{#1}%
+ \blx@addbackref@ii{setp}{#1}%
+ \or
+ \blx@addbackref@i{#1}%
+ \blx@addbackref@ii{setp}{#1}%
+ \fi}
+ {\ifcsdef{blx@setc@\the\c@refsection @#1}
+ {\ifcase\blx@backrefsetstyle
+ \blx@addbackref@ii{setc}{#1}%
+ \or
+ \blx@addbackref@i{#1}%
+ \or
+ \blx@addbackref@i{#1}%
+ \or
+ \blx@addbackref@i{#1}%
+ \blx@addbackref@ii{setc}{#1}%
+ \or
+ \blx@addbackref@i{#1}%
+ \or
+ \blx@addbackref@i{#1}%
+ \blx@addbackref@ii{setc}{#1}%
+ \fi}
+ {\blx@addbackref@i{#1}}}}
+
+\def\blx@addbackref@i#1{%
+ \ifbacktracker
+ \blx@leavevmode
+ \if@filesw
+ \protected@write\@mainaux{}{\string\abx@aux@backref
+ {\the\c@instcount}{#1}{\the\c@refsection}%
+ {\thepage}{\noexpand\the\c@page}}%
+ \fi
+ \fi}
+
+\def\blx@addbackref@ii#1#2{%
+ \expandafter\expandafter\expandafter\forcsvlist
+ \expandafter\expandafter\expandafter\blx@addbackref@i
+ \expandafter\expandafter\expandafter{%
+ \csname blx@#1@\the\c@refsection @#2\endcsname}}
+
+% {<instcount>}{<entrykey>}{<refsection>}{<page>}{<page int>}
+\protected\def\blx@aux@backref#1#2#3#4#5{%
+ \ifcsundef{blx@pref@#3@\detokenize{#2}}
+ {\global\cslet{blx@pref@#3@\detokenize{#2}}\@empty
+ \expandafter\blx@onlypreamble\csname blx@pref@#3@\detokenize{#2}\endcsname}
+ {}%
+ \blx@ifprintableinlistcs{#4}{blx@pref@#3@\detokenize{#2}}
+ {}
+ {\listcsgadd{blx@pref@#3@\detokenize{#2}}{#4}}%
+ \blx@addpagesum{#1}{#5}}
+
+\blx@AtEndDocument{%
+ \def\abx@aux@backref#1#2#3#4#5{\blx@addpagesum{#1}{#5}}}
+
+% {<true>}{<false>}
+\def\blx@ifcitesingle{%
+ \ifnum\c@citetotal=\@ne
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+
+% hyperref interface
+\appto\blx@mkhyperref{%
+ \protected\def\blx@imc@bibhyperref{%
+ \@ifnextchar[%]
+ {\blx@bibhyperref}
+ {\blx@bibhyperref[\abx@field@@@entrykey]}}%
+ \ifundef\hyper@natanchorstart
+ {\long\def\blx@bibhyperref[#1]#2{%
+ \blx@sfsave\hyperlink{cite.\the\c@refsection @#1}{\blx@sfrest
+ #2%
+ \blx@sfsave}\blx@sfrest}%
+ \protected\long\def\blx@imc@bibhyperlink#1#2{%
+ \blx@sfsave\hyperlink{cite.\the\c@refsection:#1}{\blx@sfrest
+ #2%
+ \blx@sfsave}\blx@sfrest}%
+ \protected\long\def\blx@imc@bibhypertarget#1#2{%
+ \blx@sfsave\hypertarget{cite.\the\c@refsection:#1}{\blx@sfrest
+ #2%
+ \blx@sfsave}\blx@sfrest}}%
+ {\long\def\blx@bibhyperref[#1]#2{%
+ \blx@sfsave\hyper@natlinkstart{\the\c@refsection @#1}\blx@sfrest
+ #2%
+ \blx@sfsave\hyper@natlinkend\blx@sfrest}%
+ \protected\long\def\blx@imc@bibhyperlink#1#2{%
+ \blx@sfsave\hyper@natlinkstart{\the\c@refsection:#1}\blx@sfrest
+ #2%
+ \blx@sfsave\hyper@natlinkend\blx@sfrest}%
+ \protected\long\def\blx@imc@bibhypertarget#1#2{%
+ \blx@sfsave\hyper@natanchorstart{\the\c@refsection:#1}\blx@sfrest
+ #2%
+ \blx@sfsave\hyper@natanchorend\blx@sfrest}}
+ \let\blx@imc@ifhyperref\@firstoftwo
+ \def\blx@sf{\spacefactor}%
+ \def\blx@sfsave{%
+ \blx@leavevmode
+ \numgdef\blx@sf{\spacefactor}}%
+ \def\blx@sfrest{%
+ \ifhmode\spacefactor\blx@sf\relax\fi
+ \gdef\blx@sf{\spacefactor}}}
+
+\appto\blx@mknohyperref{%
+ \protected\def\blx@imc@bibhyperref{\@ifnextchar[\blx@nohyperref\@firstofone}%
+ \def\blx@nohyperref[#1]#2{#2}%
+ \let\blx@imc@bibhyperlink\@secondoftwo
+ \let\blx@imc@bibhypertarget\@secondoftwo
+ \let\blx@imc@ifhyperref\@secondoftwo}
+
+\blx@regimcs{%
+ \bibhyperref \bibhyperlink \bibhypertarget \ifhyperref}
+
+% {<entrykey>,...}
+\protected\def\nocite#{\blx@nocite}
+
+\def\blx@nocite#1{%
+ \@bsphack
+ \blx@AfterPreamble{%
+ \ifstrequal{*}{#1}
+ {\blx@nocitation@all}
+ {\blx@xsanitizeafter{\forcsvlist\blx@nocite@do}{#1}}}%
+ \@esphack}
+
+\def\blx@nocite@do#1{%
+ % Make sure this counter exists. Sometimes it might not when using, e.g:
+ % refsection=chapter and \includeonly to put in the chapters or when
+ % inserting citations into table of contents
+ \blx@providecount{blx@sectionciteorder@\the\c@refsection}%
+ \global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne
+ \blx@nocitation{#1}\blx@msg@cundef}
+
+% {<macro>}[<arg1>][<arg2>]{<arg3>}
+% => <macro>{<arg1>}{<arg2>}{<arg3>}
+\protected\def\blx@citeargs#1{%
+ \@ifnextchar[%]
+ {\blx@citeargs@i{#1}}
+ {\blx@citeargs@iii{#1{}{}}}}
+\long\def\blx@citeargs@i#1[#2]{%
+ \@ifnextchar[%]
+ {\blx@citeargs@ii{#1{#2}}}
+ {\blx@citeargs@iii{#1{}{#2}}}}
+\long\def\blx@citeargs@ii#1[#2]{%
+ \blx@citeargs@iii{#1{#2}}}
+\long\def\blx@citeargs@iii#1#2{%
+ \blx@xsanitizeafter{#1}{#2}}
+
+% {<macro>}(<arg1>)(<arg2>)
+% => <macro>{<arg1>}{<arg2>}
+\protected\def\blx@multiargs#1{%
+ \@ifnextchar(%)
+ {\blx@multiargs@i{#1}}
+ {#1{}{}}}
+\long\def\blx@multiargs@i#1(#2){%
+ \@ifnextchar(%)
+ {\blx@multiargs@ii{#1{#2}}}
+ {#1{}{#2}}}
+\long\def\blx@multiargs@ii#1(#2){#1{#2}}
+
+% {<macro>}[<arg1>][<arg2>]{<arg3>}<punct>
+% => <macro>{<arg1>}{<arg2>}{<arg3>}{<punctcmd>}
+\protected\def\blx@citepunct#1{%
+ \blx@citeargs{\blx@citepunct@i{#1}}}
+\long\def\blx@citepunct@i#1#2#3#4{%
+ \blx@thecheckpunct{#1{#2}{#3}{#4}}}
+
+% {<csname>}[<arg1>][<arg2>]{arg3}[arg4][arg5][arg6]{arg7}<punct>
+% => <macro>{<arg1>}{<arg2>}{<arg3>}{<arg4>}{<arg5>}{<arg6>}{arg7}{<punctcmd>}
+\protected\def\blx@citexpunct#1{%
+ \blx@citeargs{\blx@citexpunct@i{#1}}}
+\long\def\blx@citexpunct@i#1#2#3#4{%
+ \@ifnextchar[%]
+ {\blx@citexpunct@ii{#1}{{#2}{#3}{#4}}}
+ {\blx@citexpunct@ii{#1}{{#2}{#3}{#4}}[#1]}}
+\long\def\blx@citexpunct@ii#1#2[#3]{%
+ \@ifnextchar[%]
+ {\blx@citexpunct@iii{#1}{#2{#3}}}
+ {\blx@citexpunct@iii{#1}{#2{#3}}[\blx@msform]}}
+ \long\def\blx@citexpunct@iii#1#2[#3]{%
+ \@ifnextchar[%]
+ {\blx@citexpunct@iv{#1}{#2{#3}}}
+ {\blx@citexpunct@iv{#1}{#2{#3}}[\blx@mslang]}}
+\long\def\blx@citexpunct@iv#1#2[#3]#4{%
+ \blx@thecheckpunct{\blxcitecmd{#1}#2{#3}{#4}}}
+
+% {<code>}<punct> => <code>{<punctcmd>}
+\long\def\blx@checkpunct#1{%
+ \begingroup
+ \def\blx@tempa{\endgroup#1}%
+ \futurelet\blx@tempb\blx@checkpunct@i}
+\def\blx@checkpunct@i{%
+ \expandafter\blx@checkpunct@ii\blx@autopunct&}
+\def\blx@checkpunct@ii#1{%
+ \ifx#1&%
+ \expandafter\blx@checkpunct@iii
+ \fi
+ \ifx#1\blx@tempb
+ \expandafter\blx@checkpunct@iv
+ \fi
+ \blx@checkpunct@ii}
+\def\blx@checkpunct@iii#1\blx@checkpunct@ii{%
+ \global\undef\abx@field@@@postpunct
+ \blx@tempa{\blx@postpunct}}
+\def\blx@checkpunct@iv#1\blx@checkpunct@ii#2&#3{%
+ \gdef\abx@field@@@postpunct{#3}%
+ \edef\blx@tempa{%
+ \expandonce\blx@tempa{%
+ \ifcsdef{blx@pm@\detokenize{#3}}
+ {\csname blx@imc@add\csname blx@pm@\detokenize{#3}\endcsname
+ \endcsname}
+ {\noexpand#3}}}%
+ \blx@tempa}
+
+\long\def\blx@nocheckpunct#1{#1{}}
+
+\protected\def\blx@citeinit{%
+ \iftoggle{blx@bibliography}
+ {}
+ {\toggletrue{blx@citation}}%
+ \blx@blxinit
+ \citesetup
+ \blx@setsfcodes
+ \blx@postpunct@agroup
+ \blx@resetdata
+ \blx@leavevmode
+ \csuse{blx@hook@cite}%
+ \csuse{blx@hook@cite@next}%
+ \let\blx@citeinit\blx@resetdata}
+
+\protected\def\blx@citecmdinit{%
+ \blx@leavevmode@cite
+ \iftoggle{blx@bibliography}
+ {}
+ {\blx@initunit}}
+
+% *{<command>}[<wrapper>]{<precode>}{<loopcode>}{<delimcode>}{<postcode>}
+\newrobustcmd*{\DeclareCiteCommand}{%
+ \@ifstar{\blx@defcitecmd*}{\blx@defcitecmd{}}}
+
+\def\blx@defcitecmd#1#2{%
+ \begingroup
+ \escapechar\m@ne
+ \edef\blx@tempa{\endgroup
+ \noexpand\blx@defcitecmd@i{#1}{\string#2}}%
+ \blx@tempa}
+
+\def\blx@defcitecmd@i#1#2{%
+ \listadd\blx@citecmds{#2}%
+ \blx@checkcitecmd{#2}{#1}%
+ \protected\csdef{#2}{%
+ \blx@citecmdinit
+ \@ifstar
+ {\blx@citepunct{\blxcitecmd{#2*}}}
+ {\blx@citepunct{\blxcitecmd{#2}}}}%
+ \@ifnextchar[%]
+ {\blx@defcitecmd@iii{#2#1}}
+ {\blx@defcitecmd@ii{#2#1}}}
+
+\long\def\blx@defcitecmd@ii#1{%
+ \csundef{blx@defcite@wrapper@#1}%
+ \blx@defcitecmd@iv{#1}%
+ \blx@defcitecmd@v{#1}}
+
+\long\def\blx@defcitecmd@iii#1[#2]{%
+ \csdef{blx@defcite@wrapper@#1}{#2}%
+ \blx@defcitecmd@iv{#1}%
+ \blx@defcitecmd@v{#1}}
+
+\long\def\blx@defcitecmd@iv#1{%
+ \protected\long\csedef{blx@cite@#1}##1##2##3##4{%
+ \ifboolexpe{test {\ifcsundef{blx@defcite@wrapper@#1}}
+ and
+ (test {\ifcsundef{blx@citepunct@#1}}
+ or
+ test {\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@c}})}
+ {}
+ {\begingroup
+ \blx@citeinit}%
+ \ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@l}
+ {\noexpand\unspace##4}
+ {}%
+ \ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@f}
+ {\noexpand\iftoggle{blx@footnote}{}{\unspace##4}}
+ {}%
+ \ifcsundef{blx@defcite@wrapper@#1}
+ {\blxciteicmd{#1}{##1}{##2}{##3}{%
+ \ifcsundef{blx@citepunct@#1}{##4}{}%
+ \ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@c}{##4}{}}}
+ {\csexpandonce{blx@defcite@wrapper@#1}{%
+ \blxciteicmd{#1}{##1}{##2}{##3}{%
+ \ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@c}{##4}{}}}%
+ \ifcsundef{blx@citepunct@#1}{##4}{}}%
+ \ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@r}{##4}{}%
+ \ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@f}
+ {\noexpand\iftoggle{blx@footnote}{##4}{}}
+ {}%
+ \ifboolexpe{test {\ifcsundef{blx@defcite@wrapper@#1}}
+ and
+ (test {\ifcsundef{blx@citepunct@#1}}
+ or
+ test {\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@c}})}
+ {}
+ {\endgroup}}}
+
+\long\def\blx@defcitecmd@v#1#2#3#4#5{%
+ \protected\long\csdef{blx@citei@#1}##1##2##3##4{%
+ \ifblank{##1}
+ {}
+ {\def\abx@field@@@prenote{##1}}%
+ \ifblank{##2}
+ {\let\blx@thenotecheck\relax}
+ {\def\abx@field@@@postnote{##2}%
+ \iftoggle{blx@volcite}
+ {\blx@defvolcitepostnote##2}
+ {}}%
+ \def\blx@precode{\delimcontext{#1}#2}%
+ \def\blx@loopcode{#3}%
+ \def\blx@dlimcode{#4}%
+ \def\blx@postcode{#5}%
+ \def\blx@postpunct@saved{##4}%
+ \blx@citeloop{##3}%
+ \endgroup}}
+
+% {<type>}{<name>}{*}
+\def\blx@checkcitecmd#1#2{%
+ \ifblank{#2}
+ {\ifcsdef{blx@cite@#1}
+ {\blx@info{Redefining '\@backslashchar#1'}}
+ {\ifcsundef{#1}
+ {}
+ {\blx@warning@noline{Redefining '\@backslashchar#1'}}}%
+ \ifcsdef{blx@cite@#1*}
+ {}
+ {\csedef{blx@cite@#1*}{%
+ \expandafter\noexpand\csname blx@cite@#1\endcsname}%
+ \csedef{blx@citei@#1*}{%
+ \expandafter\noexpand\csname blx@citei@#1\endcsname}}}
+ {\ifcsdef{blx@cite@#1}
+ {}
+ {\csdef{blx@cite@#1}{\blx@err@citecmd{#1}}%
+ \csdef{blx@citei@#1}{\blx@err@citecmd{#1}}}}}
+
+% {<name>}{prenote}{postnote}{citekey}{punct}
+\newrobustcmd*{\blxcitecmd}[1]{%
+ \ifcsundef{blx@cite@#1}
+ {\blx@err@citecmd{#1}}
+ {\csuse{blx@cite@#1}}}
+
+\newrobustcmd*{\blxciteicmd}[1]{%
+ \begingroup
+ \blx@citeinit
+ \ifcsundef{blx@citei@#1}
+ {\blx@err@citecmd{#1}}
+ {\csuse{blx@citei@#1}}}
+
+% {<multicitecount>}{<name>}{prenote}{postnote}{citekey}{punct}
+\protected\def\blxmciteicmd#1{%
+ \c@multicitecount#1\relax
+ \blxciteicmd}
+
+% {<multicitetotal>}{<multiprenote>}{<multipostnote>}
+\protected\def\blxmcites#1#2#3{%
+ \begingroup
+ \blx@citeinit
+ \c@multicitecount\z@
+ \c@multicitetotal#1\relax
+ \ifnum\c@multicitetotal>\@ne
+ \let\blx@ifcitesingle\@secondoftwo
+ \fi
+ \csuse{blx@hook@mcite}%
+ \csuse{blx@hook@mcite@next}%
+ \ifblank{#2}%
+ {}
+ {\def\abx@field@@@multiprenote{#2}}%
+ \ifblank{#3}%
+ {}
+ {\def\abx@field@@@multipostnote{#3}}%
+ \usebibmacro{multiprenote}}
+
+\protected\def\blxendmcites{%
+ \usebibmacro{multipostnote}%
+ \endgroup}
+
+% {<command>}[<wrapper>]{<cite>}{<delimiter>}
+\newrobustcmd{\DeclareMultiCiteCommand}[1]{%
+ \ifundef#1%
+ {}
+ {\blx@info{Redefining '\string#1'}}%
+ \@ifnextchar[%]
+ {\blx@defmcitecmd{#1}}
+ {\blx@defmcitecmd{#1}[\@firstofone]}}
+
+\def\blx@defmcitecmd#1[#2]#3#4{%
+ \begingroup
+ \escapechar\m@ne
+ \edef\blx@tempa{\endgroup
+ \listadd\noexpand\blx@citecmds{\string#1}%
+ \protected\def\noexpand#1{%
+ \blx@citecmdinit
+ \noexpand\@ifstar
+ {\expandafter\noexpand
+ \csname blx@mcite@\string#1\endcsname*%
+ \expandafter\noexpand
+ \csname blx@mcitei@\string#1\endcsname}
+ {\expandafter\noexpand
+ \csname blx@mcite@\string#1\endcsname{}%
+ \expandafter\noexpand
+ \csname blx@mcitei@\string#1\endcsname}}%
+ \protected\csdef{blx@mcite@\string#1}####1####2{%
+ \begingroup
+ \blx@citeinit
+ \noexpand\blx@multicite
+ ####2%
+ {\unexpanded{#2}}%
+ {\string#3####1}%
+ {\unexpanded{#4}}}%
+ \protected\long\csdef{blx@mcitei@\string#1}%
+ }%
+ \blx@tempa##1##2##3{##1{##2}##3\endgroup}}
+
+% {<command>}{<wrapper>}{<citecmd>}{<delimiter>} =>
+% <init><command>{<wrapper>}{<cites>}{<punct>}
+\def\blx@multicite#1#2#3#4{%
+ \begingroup
+ \csuse{blx@hook@mcite@before}%
+ \def\blx@tempa{#1}%
+ \def\blx@tempb{#2}%
+ \def\blx@tempc{#3}%
+ \def\blx@tempd{#4}%
+ \c@multicitetotal\z@
+ \blx@multiargs\blx@multicite@i}
+
+\def\blx@multicite@i#1#2{%
+ \ifblank{#1}%
+ {\let\abx@field@@@multiprenote\@empty}%
+ {\def\abx@field@@@multiprenote{#1}}%
+ \ifblank{#2}%
+ {\let\abx@field@@@multipostnote\@empty}%
+ {\def\abx@field@@@multipostnote{#2}}%
+ \let\blx@tempe\@empty
+ \let\blx@tempf\@empty
+ \togglefalse{blx@tempa}%
+ \blx@multiparse}
+
+\def\blx@multicite@add#1#2#3{%
+ \togglefalse{blx@tempa}%
+ \advance\c@multicitetotal\@ne
+ \eappto\blx@tempe{%
+ \expandonce\blx@tempf
+ \blxmciteicmd{\the\c@multicitetotal}%
+ {\expandonce\blx@tempc}\unexpanded{{#1}{#2}{#3}}{}}%
+ \let\blx@tempf\blx@tempd
+ \blx@multiparse}
+
+\def\blx@multicite@end#1{%
+ \edef\blx@tempa{\endgroup
+ \expandonce\blx@tempa
+ {\expandonce\blx@tempb}%
+ {\blxmcites
+ {\the\c@multicitetotal}%
+ {\expandonce\abx@field@@@multiprenote}%
+ {\expandonce\abx@field@@@multipostnote}%
+ \expandonce\blx@tempe
+ \blxendmcites}%
+ {#1}%
+ \iftoggle{blx@tempa}{\relax\space}{}}%
+ \blx@tempa}
+
+\def\blx@multiparse{%
+ \futurelet\@let@token\blx@multiparse@i}
+
+\def\blx@multiparse@i{%
+ \ifx\@let@token\relax
+ \blx@multiparse@ii{\blx@multicite@end{}}%
+ \fi
+ \ifx\@let@token[%]
+ \blx@multiparse@ii{\blx@citeargs\blx@multicite@add}%
+ \fi
+ \ifx\@let@token\bgroup
+ \blx@multiparse@ii{\blx@citeargs\blx@multicite@add}%
+ \fi
+ \ifx\@let@token\@sptoken
+ \blx@multiparse@ii\blx@multiparse@iii
+ \fi
+ \iftrue
+ \iftoggle{blx@tempa}
+ {\blx@multiparse@ii{\blx@multicite@end{}}}
+ {\blx@multiparse@ii{\blx@thecheckpunct\blx@multicite@end}}%
+ \fi
+ &}
+
+\def\blx@multiparse@ii#1#2&{\fi#1}
+\csdef{blx@multiparse@iii} {\toggletrue{blx@tempa}\blx@multiparse}
+
+% {<name>}[l|i|r]{<cite>}{<multicite>}
+\newrobustcmd*{\DeclareAutoCiteCommand}[1]{%
+ \ifcsundef{blx@acite@#1}
+ {}
+ {\blx@info{Redefining autocite command '#1'}}%
+ \@ifnextchar[%]
+ {\blx@defautocmd@i{#1}}
+ {\blx@defautocmd@i{#1}[r]}}
+
+\def\blx@defautocmd@i#1[#2]#3#4{%
+ \begingroup
+ \escapechar\m@ne
+ \edef\blx@tempa{\endgroup
+ \noexpand\blx@defautocmd@ii{#1}{#2}%
+ {\string#3}{\string#4}}%
+ \blx@tempa}
+
+\def\blx@defautocmd@ii#1#2#3#4{%
+ \protected\csedef{blx@acite@#1}{%
+ \blx@citecmdinit
+ \noexpand\@ifstar
+ {\blx@citepunct{\expandafter\noexpand
+ \csname blx@acitei@#1\endcsname*}}
+ {\blx@citepunct{\expandafter\noexpand
+ \csname blx@acitei@#1\endcsname{}}}}%
+ \protected\csedef{blx@acitei@#1}##1##2##3##4##5{%
+ \begingroup
+ \blx@citeinit
+ \if l#2\noexpand\unspace##5\fi
+ \if f#2\noexpand\iftoggle{blx@footnote}{}{\unspace##5}\fi
+ \blxcitecmd{#3##1}{##2}{##3}{##4}{}%
+ \if r#2##5\fi
+ \if f#2\noexpand\iftoggle{blx@footnote}{##5}{}\fi
+ \endgroup}%
+ \protected\csedef{blx@macite@#1}{%
+ \blx@citecmdinit
+ \noexpand\@ifstar
+ {\expandafter\noexpand
+ \csname blx@macitei@#1\endcsname*%
+ \expandafter\noexpand
+ \csname blx@maciteii@#1\endcsname}
+ {\expandafter\noexpand
+ \csname blx@macitei@#1\endcsname{}%
+ \expandafter\noexpand
+ \csname blx@maciteii@#1\endcsname}}%
+ \csedef{blx@macitei@#1}{\csname blx@mcite@#4\endcsname}%
+ \protected\csedef{blx@maciteii@#1}##1##2##3{%
+ \if l#2\noexpand\unspace##3\fi
+ \if f#2\noexpand\iftoggle{blx@footnote}{}{\unspace##3}\fi
+ ##1{##2}%
+ \if r#2##3\fi
+ \if f#2\noexpand\iftoggle{blx@footnote}{##3}{}\fi
+ \endgroup}}
+
+% {<characters>}
+\newrobustcmd*{\DeclareAutoPunctuation}[1]{%
+ \ifblank{#1}
+ {\let\blx@thecheckpunct\blx@nocheckpunct}
+ {\let\blx@thecheckpunct\blx@checkpunct
+ \def\blx@autopunct{#1}}}
+
+% {<command>}{<pos marker>}
+% pos markers are:
+% l: move punctuation before the command (i.e. left of it)
+% r: leave punctuation after the command (i.e. to the right)
+% f: like l in normal text, like r in footnotes
+% c: pass on to the cite command,
+% the punctuation will eventually end up as field 'postpunct'
+% d: discard the punctuation
+% o (or any other value): restores the old standard behaviour
+% r for wrapped citation commands,
+% c for unwrapped ones
+\newrobustcmd*{\DeclareCitePunctuationPosition}[2]{%
+ \begingroup
+ \escapechar\m@ne
+ \edef\blx@tempa{\endgroup
+ \noexpand\blx@defcitepunctpos@i{\string#1}{#2}}%
+ \blx@tempa}
+
+\def\blx@citepunctid@pos@l{l}
+\def\blx@citepunctid@pos@r{r}
+\def\blx@citepunctid@pos@f{f}
+\def\blx@citepunctid@pos@c{c}
+\def\blx@citepunctid@pos@d{d}
+
+\def\blx@defcitepunctpos@i#1#2{%
+ \ifcsundef{blx@citepunctid@pos@#2}
+ {\csundef{blx@citepunct@#1}}
+ {\csletcs{blx@citepunct@#1}{blx@citepunctid@pos@#2}}%
+ \blx@defcitecmd@iv{#1}}
+
+\AfterEndPreamble{% babel
+ \begingroup
+ \makeatletter
+ \endlinechar\m@ne
+ \scantokens\expandafter{%
+ \expandafter\gdef
+ \expandafter\blx@autopunct
+ \expandafter{\blx@autopunct}}%
+ \endgroup}
+
+\listadd\blx@citecmds{citefield}
+% [<prenote>][<postnote>]{<entrykey>,...}[<format>][msform][mslang]{<field>}<punct>
+\newrobustcmd*{\citefield}{\blx@citexpunct{citefield}}
+\long\csdef{blx@cite@citefield}#1#2#3#4#5#6#7#8{%
+ \begingroup
+ \blx@citecmdinit
+ \blx@citeinit
+ \ifblank{#1}
+ {}
+ {\def\abx@field@@@prenote{#1}}%
+ \ifblank{#2}
+ {\let\blx@thenotecheck\relax}
+ {\def\abx@field@@@postnote{#2}}%
+ \def\blx@precode{\usebibmacro{prenote}}%
+ \def\blx@loopcode{%
+ \iffieldundef[{#5}][{#6}]{#7}
+ {\blx@warning@entry{'#7' undefined or not a field}%
+ \abx@missing{#7}}
+ {\printfield[{#4}][{#5}][{#6}]{#7}}}%
+ \def\blx@dlimcode{\multicitedelim}%
+ \def\blx@postpunct@saved{#8}%
+ \ifblank{#2}
+ {\let\blx@postcode\@empty}
+ {\def\blx@postcode{\usebibmacro{postnote}}}%
+ \boolfalse{citetracker}%
+ \boolfalse{pagetracker}%
+ \blx@citeloop{#3}%
+ \endgroup}
+
+\listadd\blx@citecmds{citelist}
+% [<prenote>][<postnote>]{<entrykey>,...}[<format>][<msform>][<mslang>]{<list>}<punct>
+\newrobustcmd*{\citelist}{\blx@citexpunct{citelist}}
+\long\csdef{blx@cite@citelist}#1#2#3#4#5#6#7#8{%
+ \begingroup
+ \blx@citecmdinit
+ \blx@citeinit
+ \ifblank{#1}
+ {}
+ {\def\abx@field@@@prenote{#1}}%
+ \ifblank{#2}
+ {\let\blx@thenotecheck\relax}
+ {\def\abx@field@@@postnote{#2}}%
+ \def\blx@precode{\usebibmacro{prenote}}%
+ \def\blx@loopcode{%
+ \iflistundef[{#5}][{#6}]{#7}
+ {\blx@warning@entry{'#7' undefined or not a literal list}%
+ \abx@missing{#7}}
+ {\printlist[{#4}][][{#5}][{#6}]{#7}}}%
+ \def\blx@dlimcode{\multicitedelim}%
+ \def\blx@postpunct@saved{#8}%
+ \ifblank{#2}
+ {\let\blx@postcode\@empty}
+ {\def\blx@postcode{\usebibmacro{postnote}}}%
+ \boolfalse{citetracker}%
+ \boolfalse{pagetracker}%
+ \blx@citeloop{#3}%
+ \endgroup}
+
+\listadd\blx@citecmds{citename}
+% [<prenote>][<postnote>]{<entrykey>,...}[<format>][<msform>][<mslang>]{<namelist>}<punct>
+\newrobustcmd*{\citename}{\blx@citexpunct{citename}}
+\long\csdef{blx@cite@citename}#1#2#3#4#5#6#7#8{%
+ \begingroup
+ \blx@citecmdinit
+ \blx@citeinit
+ \ifblank{#1}
+ {}
+ {\def\abx@field@@@prenote{#1}}%
+ \ifblank{#2}
+ {\let\blx@thenotecheck\relax}
+ {\def\abx@field@@@postnote{#2}}%
+ \def\blx@precode{\usebibmacro{prenote}}%
+ \def\blx@loopcode{%
+ \ifnameundef[{#5}][{#6}]{#7}
+ {\blx@warning@entry{'#7' undefined or not a name list}%
+ \abx@missing{#7}}
+ {\printnames[{#4}][][{#5}][{#6}]{#7}}}%
+ \def\blx@dlimcode{\multicitedelim}%
+ \def\blx@postpunct@saved{#8}%
+ \ifblank{#2}
+ {\let\blx@postcode\@empty}
+ {\def\blx@postcode{\usebibmacro{postnote}}}%
+ \boolfalse{citetracker}%
+ \boolfalse{pagetracker}%
+ \blx@citeloop{#3}%
+ \endgroup}
+
+\renewrobustcmd*{\cite}{\blx@err@citecmd\cite}
+\let\blx@cite@cite\relax
+\newrobustcmd*{\parencite}{\blx@warn@citecmd\parencite\cite}
+\let\blx@cite@parencite\relax
+\newrobustcmd*{\footcite}{\blx@warn@citecmd\footcite\cite}
+\let\blx@cite@footcite\relax
+\newrobustcmd*{\footcitetext}{\blx@warn@citecmd\footcitetext\cite}
+\let\blx@cite@footcitetext\relax
+\newrobustcmd*{\smartcite}{\blx@warn@citecmd\smartcite\cite}
+\let\blx@cite@smartcite\relax
+\newrobustcmd*{\textcite}{\blx@warn@citecmd\textcite\cite}
+\let\blx@cite@textcite\relax
+\newrobustcmd*{\supercite}{\blx@warn@citecmd\supercite\cite}
+\let\blx@cite@supercite\relax
+
+%% ifthen interface
+
+\def\blx@TE#1#2{%
+ \TE@throw
+ \unexpanded{%
+ \iftrue\@nameuse{fi}%
+ #1{\@nameuse{iftrue}}{\@nameuse{iffalse}}}#2}
+
+\def\blx@xTE#1#2{%
+ \TE@throw
+ \unexpanded{\iftrue\@nameuse{fi}}%
+ #1\unexpanded{{\@nameuse{iftrue}}{\@nameuse{iffalse}}}#2}
+
+\let\blx@TE@hook\@empty
+
+\appto\blx@blxinit{%
+ \appto\blx@TE@hook{%
+ \def\ifhyperref{\blx@TE\blx@imc@ifhyperref}%
+ \def\ifmorenames{\blx@TE\blx@imc@ifmorenames}%
+ \def\ifmoreitems{\blx@TE\blx@imc@ifmoreitems}%
+ \def\iffirstcitekey{\blx@TE\blx@imc@iffirstcitekey}%
+ \def\iflastcitekey{\blx@TE\blx@imc@iflastcitekey}%
+ \def\ifciteseen{\blx@TE\blx@imc@ifciteseen}%
+ \def\ifentryseen{\blx@TE\blx@imc@ifentryseen}%
+ \def\ifentryinbib{\blx@TE\blx@imc@ifentryinbib}%
+ \def\ifciteibid{\blx@TE\blx@imc@ifciteibid}%
+ \def\ifciteidem{\blx@TE\blx@imc@ifciteidem}%
+ \def\ifopcit{\blx@TE\blx@imc@ifopcit}%
+ \def\ifloccit{\blx@TE\blx@imc@ifloccit}%
+ \def\ifsamepage{\blx@TE\blx@imc@ifsamepage}%
+ \def\iffirstonpage{\blx@TE\blx@imc@iffirstonpage}%
+ \def\ifcurrentfield#1{\blx@TE{\blx@imc@ifcurrentfield{#1}}}%
+ \def\ifcurrentlist#1{\blx@TE{\blx@imc@ifcurrentlist{#1}}}%
+ \def\ifcurrentname#1{\blx@TE{\blx@imc@ifcurrentname{#1}}}%
+ \def\ifentrytype#1{\blx@TE{\blx@imc@ifentrytype{#1}}}%
+ \DeclareExpandableDocumentCommand{\iffieldxref}{O{\blx@msform} O{\blx@lmslang} m}{\blx@TE{\blx@imc@iffieldxref[{#1}][{#2}]{#3}}}%
+ \DeclareExpandableDocumentCommand{\iffieldequalcs}{O{\blx@msform} O{\blx@lmslang} m m}{\blx@TE{\blx@imc@iffieldequalcs[{#1}][{#2}]{#3}{#4}}}%
+ \DeclareExpandableDocumentCommand{\iffieldequals}{O{\blx@msform} O{\blx@lmslang} m m}{\blx@TE{\blx@imc@iffieldequals[{#1}][{#2}]{#3}{#4}}}%
+ \DeclareExpandableDocumentCommand{\iffieldequalstr}{O{\blx@msform} O{\blx@lmslang} m m}{\blx@TE{\blx@imc@iffieldequalstr[{#1}][{#2}]{#3}{#4}}}%
+ \DeclareExpandableDocumentCommand{\iffieldsequal}{O{\blx@msform} O{\blx@lmslang} m O{\blx@msform} O{\blx@lmslang} m}{\blx@TE{\blx@imc@iffieldsequal[{#1}][{#2}]{#3}[{#4}][{#5}]{#6}}}%
+ \def\ifbibmacroundef#1{\blx@TE{\blx@imc@ifbibmacroundef{#1}}}%
+ \DeclareExpandableDocumentCommand{\ifentryfieldundef}{m}{\blx@TE{\blx@imc@ifentryfieldundef{#1}}}%
+ \DeclareExpandableDocumentCommand{\iffieldundef}{O{\blx@msform} O{\blx@lmslang} m}{\blx@TE{\blx@imc@iffieldundef[{#1}][{#2}]{#3}}}%
+ \DeclareExpandableDocumentCommand{\iflistxref}{O{\blx@msform} O{\blx@lmslang} m}{\blx@TE{\blx@imc@iflistxref[{#1}][{#2}]{#3}}}%
+ \DeclareExpandableDocumentCommand{\iflistequalcs}{O{\blx@msform} O{\blx@lmslang} m m}{\blx@TE{\blx@imc@iflistequalcs[{#1}][{#2}]{#3}{#4}}}%
+ \DeclareExpandableDocumentCommand{\iflistequals}{O{\blx@msform} O{\blx@lmslang} m m}{\blx@TE{\blx@imc@iflistequals[{#1}][{#2}]{#3}{#4}}}%
+ \DeclareExpandableDocumentCommand{\iflistssequal}{O{\blx@msform} O{\blx@lmslang} m O{\blx@msform} O{\blx@lmslang} m}{\blx@TE{\blx@imc@iflistsequal[{#1}][{#2}]{#3}[{#4}][{#5}]{#6}}}%
+ \DeclareExpandableDocumentCommand{\iflistundef}{O{\blx@msform} O{\blx@lmslang} m}{\blx@TE{\blx@imc@iflistundef[{#1}][{#2}]{#3}}}%
+ \DeclareExpandableDocumentCommand{\ifnameequalcs}{O{\blx@msform} O{\blx@lmslang} m m}{\blx@TE{\blx@imc@ifnameequalcs[{#1}][{#2}]{#3}{#4}}}%
+ \DeclareExpandableDocumentCommand{\ifnameequals}{O{\blx@msform} O{\blx@lmslang} m m}{\blx@TE{\blx@imc@ifnameequals[{#1}][{#2}]{#3}{#4}}}%
+ \DeclareExpandableDocumentCommand{\ifnamesequal}{O{\blx@msform} O{\blx@lmslang} m O{\blx@msform} O{\blx@lmslang} m}{\blx@TE{\blx@imc@ifnamesequal[{#1}][{#2}]{#3}[{#4}][{#5}]{#6}}}%
+ \DeclareExpandableDocumentCommand{\ifnameundef}{O{\blx@msform} O{\blx@lmslang} m}{\blx@TE{\blx@imc@ifnameundef[{#1}][{#2}]{#3}}}%
+ \DeclareExpandableDocumentCommand{\ifnamexref}{O{\blx@msform} O{\blx@lmslang} m}{\blx@TE{\blx@imc@ifnamexref[{#1}][{#2}]{#3}}}%
+ \def\ifcategory#1{\blx@TE{\blx@imc@ifcategory{#1}}}%
+ \def\ifkeyword#1{\blx@TE{\blx@imc@ifkeyword{#1}}}%
+ \def\ifentrycategory#1#2{\blx@TE{\blx@imc@ifentrycategory{#1}{#2}}}%
+ \def\ifentrykeyword#1#2{\blx@TE{\blx@imc@ifentrykeyword{#1}{#2}}}%
+ \def\ifcapital{\blx@TE\blx@imc@ifcapital}%
+ \def\ifinteger#1{\blx@TE{\blx@imc@ifinteger{#1}}}%
+ \DeclareExpandableDocumentCommand{\iffieldint}{O{\blx@msform} O{\blx@lmslang} m}{\blx@TE{\blx@imc@iffieldint[{#1}][{#2}]{#3}}}%
+ \def\ifnumeral#1{\blx@TE{\blx@imc@ifnumeral{#1}}}%
+ \def\ifnumerals#1{\blx@TE{\blx@imc@ifnumerals{#1}}}%
+ \def\ifpages#1{\blx@TE{\blx@imc@ifpages{#1}}}%
+ \DeclareExpandableDocumentCommand{\iffieldnum}{O{\blx@msform} O{\blx@lmslang} m}{\blx@TE{\blx@imc@iffieldnum[{#1}][{#2}]{#3}}}%
+ \DeclareExpandableDocumentCommand{\iffieldnums}{O{\blx@msform} O{\blx@lmslang} m}{\blx@TE{\blx@imc@iffieldnums[{#1}][{#2}]{#3}}}%
+ \DeclareExpandableDocumentCommand{\iffieldpages}{O{\blx@msform} O{\blx@lmslang} m}{\blx@TE{\blx@imc@iffieldpages[{#1}][{#2}]{#3}}}%
+ \def\ifbibstring#1{\blx@TE{\blx@imc@ifbibstring{#1}}}%
+ \DeclareExpandableDocumentCommand{\iffieldbibstring}{O{\blx@msform} O{\blx@lmslang} m}{\blx@TE{\blx@imc@iffieldbibstring[{#1}][{#2}]{#3}}}%
+ \DeclareExpandableDocumentCommand{\iffieldplusstringbibstring}{O{\blx@msform} O{\blx@lmslang} m m}{\blx@TE{\blx@imc@iffieldplusstringbibstring[{#1}][{#2}]{#3}{#4}}}%
+ \def\ifnatbibmode{\blx@TE{\iftoggle{blx@natbib}}}%
+ \def\ifcitation{\blx@TE{\iftoggle{blx@citation}}}%
+ \def\ifvolcite{\blx@TE{\iftoggle{blx@volcite}}}%
+ \def\ifbibliography{\blx@TE{\iftoggle{blx@bibliography}}}%
+ \def\ifciteindex{\blx@TE{\iftoggle{blx@citeindex}}}%
+ \def\ifbibindex{\blx@TE{\iftoggle{blx@bibindex}}}%
+ \def\iffootnote{\blx@TE{\iftoggle{blx@footnote}}}%
+ \def\ifuseprefix{\blx@TE{\iftoggle{blx@useprefix}}}%
+ \def\ifterseinits{\blx@TE{\iftoggle{blx@terseinits}}}%
+ \def\ifsingletitle{\blx@TE{\iftoggle{abx@bool@singletitle}}}%
+ \def\ifnocite{\blx@TE{\iftoggle{abx@bool@nocite}}}%
+ \def\ifuniquetitle{\blx@TE{\iftoggle{abx@bool@uniquetitle}}}%
+ \def\ifuniquebaretitle{\blx@TE{\iftoggle{abx@bool@uniquebaretitle}}}%
+ \def\ifuniquework{\blx@TE{\iftoggle{abx@bool@uniquework}}}%
+ \def\ifuniqueprimaryauthor{\blx@TE{\iftoggle{abx@bool@uniqueprimaryauthor}}}%
+ \def\ifandothers#1{\blx@TE{\iftoggle{abx@bool@more#1}}}%
+ \def\iflabeldateisdate{\blx@TE\blx@imc@iflabeldateisdate}%
+ \def\ifdatehasyearonlyprecision#1{%
+ \blx@TE{\blx@imc@ifdatehasyearonlyprecision{#1}}}%
+ \def\ifdatehastime#1{\blx@TE{\blx@imc@ifdatehastime{#1}}}%
+ \def\ifdateshavedifferentprecision#1#2{%
+ \blx@TE{\blx@imc@ifdateshavedifferentprecision{#1}{#2}}}%
+ \def\ifdateyearsequal#1#2{%
+ \blx@TE{\blx@imc@ifdateyearsequal{#1}{#2}}}}}
+
+% {<listmacro>}{<filtercsname>} => matches in <listmacro>
+\protected\def\blx@bibfilter#1#2{%
+ \begingroup
+ \edef\blx@do##1{%
+ \def\noexpand\blx@flt@item{##1}%
+ \ifboolexpr{\csexpandonce{#2}}%
+ {\listadd\noexpand\blx@tempa{##1}}%
+ {}}%
+ \let\blx@done\relax
+ \edef\blx@tempa{%
+ \let\noexpand\blx@tempa\noexpand\@empty
+ \blx@listloop{#1}}%
+ \blx@tempa
+ \edef\blx@tempa{\endgroup
+ \def\noexpand#1{\blx@tempa}}%
+ \blx@tempa}
+
+%% Auxiliary macros
+\newrobustcmd*{\mkbibquote}{\blx@enquote}
+\protected\def\blx@imc@mkbibquote{%
+ \blx@ifuspunct\blx@usquote\blx@enquote}
+
+\def\blx@usquote{%
+ \ifnum\@quotelevel>\z@
+ \expandafter\blx@usiquote
+ \else
+ \expandafter\blx@usoquote
+ \fi}
+
+\long\def\blx@usoquote#1{%
+ \begingroup
+ \blx@initoquote
+ \blx@textooquote#1%
+ \futurelet\@let@token\blx@usoquote@i}
+
+\def\blx@usoquote@i{%
+ \blx@usqcheck
+ {\ifx\blx@postpunct\@empty\else\blx@dopostpunct\fi
+ \blx@textcoquote\endgroup}
+ {\blx@setpostpunct\blx@textcoquote\endgroup}}
+
+\long\def\blx@usiquote#1{%
+ \begingroup
+ \blx@initiquote
+ \blx@textoiquote#1%
+ \futurelet\@let@token\blx@usiquote@i}
+
+\def\blx@usiquote@i{%
+ \blx@usqcheck
+ {\blx@textciquote\endgroup}
+ {\blx@setpostpunct\blx@textciquote\endgroup}}
+
+\long\def\blx@usqcheck#1#2{%
+ \def\blx@tempa{#1}%
+ \def\blx@tempb{#2}%
+ \ifx\@let@token\space
+ \blx@usqcheck@i\blx@tempa
+ \fi
+ \ifx\@let@token\@sptoken
+ \blx@usqcheck@i\blx@tempa
+ \fi
+ \if\noexpand\@let@token\relax
+ \expandafter\blx@usqcheck@iv
+ \fi
+ \expandafter\blx@usqcheck@ii\blx@quotepunct\relax&}
+
+\long\def\blx@usqcheck@i#1#2&{\fi#1}
+
+\long\def\blx@usqcheck@ii#1{%
+ \if\noexpand#1\relax
+ \blx@usqcheck@i\blx@tempa
+ \fi
+ \if\noexpand#1\noexpand\@let@token
+ \blx@usqcheck@i{\blx@usqcheck@iii\blx@tempa}%
+ \fi
+ \blx@usqcheck@ii
+}
+
+\long\def\blx@usqcheck@iii#1#2{#2#1}
+
+\long\def\blx@usqcheck@iv#1&#2{%
+ \begingroup
+ \escapechar=-1 %
+ \edef\blx@tempa{\expandafter\@gobble\string#2}%
+ \expandafter\endgroup
+ \ifx\blx@tempa\@empty
+ \else
+ \blx@usqcheck@i\blx@tempb
+ \fi
+ #1&#2%
+}
+
+\newrobustcmd*{\mkbibemph}{\emph}
+\protected\long\def\blx@imc@mkbibemph#1{%
+ \emph{#1}\blx@imc@setpunctfont\emph}
+
+\newrobustcmd*{\mkbibbold}{\textbf}
+\protected\long\def\blx@imc@mkbibbold#1{%
+ \textbf{#1}\blx@imc@setpunctfont\textbf}
+
+\newrobustcmd*{\mkbibitalic}{\textit}
+\protected\long\def\blx@imc@mkbibitalic#1{%
+ \textit{#1}\blx@imc@setpunctfont\textit}
+
+\blx@regimcs{\mkbibquote \mkbibemph \mkbibbold \mkbibitalic}
+
+\newcommand*{\bibleftparen}{\blx@postpunct(}
+\newcommand*{\bibrightparen}{\blx@postpunct)\midsentence}
+\newcommand*{\bibleftbracket}{\blx@postpunct[}
+\newcommand*{\bibrightbracket}{\blx@postpunct]\midsentence}
+
+\def\blx@parenlevel{%
+ \iftoggle{blx@footnote}
+ {\blx@parenlevel@foot}
+ {\blx@parenlevel@text}}
+
+\newrobustcmd*{\blx@bibopenparen}{%
+ \blx@opencheck\bibopenparen
+ \blx@postpunct
+ \ifnum\blx@parenlevel=\z@
+ \global\blx@parenlevel\@ne
+ \global\c@parenlevel\@ne
+ \expandafter\bibleftparen
+ \else
+ \expandafter\blx@openparen
+ \fi}
+
+\newrobustcmd*{\blx@bibopenbracket}{%
+ \blx@opencheck\bibopenbracket
+ \blx@postpunct
+ \ifnum\blx@parenlevel=\z@
+ \global\blx@parenlevel1002
+ \global\c@parenlevel\@ne
+ \expandafter\bibleftbracket
+ \else
+ \expandafter\blx@openparen
+ \fi}
+
+\newrobustcmd*{\blx@bibcloseparen}{%
+ \blx@closecheck\bibcloseparen
+ \blx@postpunct\blx@closeparen}
+
+\newrobustcmd*{\blx@bibclosebracket}{%
+ \blx@closecheck\bibclosebracket
+ \blx@postpunct\blx@closeparen}
+
+\def\blx@openparen{%
+ \ifodd\blx@parenlevel
+ \global\advance\blx@parenlevel\@ne
+ \global\advance\c@parenlevel\@ne
+ \expandafter\bibleftbracket
+ \else
+ \global\advance\blx@parenlevel\@ne
+ \global\advance\c@parenlevel\@ne
+ \expandafter\bibleftparen
+ \fi}
+
+\def\blx@closeparen{%
+ \ifodd\blx@parenlevel
+ \blx@closeparen@i
+ \expandafter\bibrightparen
+ \else
+ \blx@closeparen@i
+ \expandafter\bibrightbracket
+ \fi}
+
+\def\blx@closeparen@i{%
+ \ifnum\blx@parenlevel=1002
+ \global\blx@parenlevel\z@
+ \global\c@parenlevel\z@
+ \else
+ \global\advance\blx@parenlevel\m@ne
+ \global\advance\c@parenlevel\m@ne
+ \fi}
+
+\def\blx@opencheck#1{%
+ \ifnum\numexpr\blx@parenlevel+\@ne
+ \ifnum\blx@parenlevel>\@m -1001\fi
+ >\c@maxparens
+ \blx@err@nestparen{\string#1}%
+ \blx@errormark
+ \fi}
+
+\def\blx@closecheck#1{%
+ \ifnum\numexpr\blx@parenlevel
+ \ifnum\blx@parenlevel>\@m -1001\fi
+ >\c@maxparens
+ \blx@err@nestparen{\string#1}%
+ \blx@errormark
+ \fi
+ \ifnum\blx@parenlevel<\@ne
+ \blx@err@matchparen{Unmatched \string#1}%
+ \blx@errormark
+ \fi}
+
+\protected\def\blx@errormark{%
+ \rule[0.25ex]{1.25ex}{1.25ex}}
+
+\blx@AtEndDocument{%
+ \unless\ifnum\blx@parenlevel@text=\z@
+ \blx@err@matchparen{%
+ Unbalanced parentheses or brackets in the document body}%
+ \fi
+ \unless\ifnum\blx@parenlevel@foot=\z@
+ \blx@err@matchparen{%
+ Unbalanced parentheses or brackets in a foot or endnote}%
+ \fi}
+
+\newrobustcmd{\mkbibparens}[1]{%
+ \begingroup
+ \blx@blxinit
+ \blx@setsfcodes
+ \bibopenparen#1\bibcloseparen
+ \endgroup}
+
+\newrobustcmd{\mkbibbrackets}[1]{%
+ \begingroup
+ \blx@blxinit
+ \blx@setsfcodes
+ \bibopenbracket#1\bibclosebracket
+ \endgroup}
+
+\newrobustcmd*{\parentext}{\mkbibparens}
+\newrobustcmd*{\brackettext}{\mkbibbrackets}
+
+\newrobustcmd{\mkbibsuperscript}[1]{%
+ \unspace\allowhyphens\textsuperscript{%
+ \begingroup
+ \protected\long\def\mkbibsuperscript##1{%
+ \blx@warning{Nested superscript}%
+ \mkbibbrackets{##1}}%
+ #1\endgroup}}
+
+\newrobustcmd{\mkbibfootnote}{\blx@mkbibfootnote{}}
+\newrobustcmd{\mkbibfootnotetext}{\blx@mkbibfootnote{text}}
+\newrobustcmd{\blx@mkbibfootnote}[2]{%
+ \iftoggle{blx@footnote}
+ {\blx@warning{Nested notes}%
+ \addspace\mkbibparens{#2}}
+ {\unspace
+ \ifnum\blx@notetype=\tw@
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ {\csuse{blx@theendnote#1}{\protecting{\blxmkbibnote{end}{#2}}}}
+ {\csuse{footnote#1}{\protecting{\blxmkbibnote{foot}{#2}}}}}}
+
+\newrobustcmd{\mkbibendnote}{\blx@mkbibendnote{}}
+\newrobustcmd{\mkbibendnotetext}{\blx@mkbibendnote{text}}
+\newrobustcmd{\blx@mkbibendnote}[2]{%
+ \iftoggle{blx@footnote}
+ {\blx@warning{Nested notes}%
+ \addspace\mkbibparens{#2}}
+ {\unspace
+ \ifnum\blx@notetype=\@ne
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ {\csuse{footnote#1}{\protecting{\blxmkbibnote{foot}{#2}}}}
+ {\csuse{blx@theendnote#1}{\protecting{\blxmkbibnote{end}{#2}}}}}}
+
+\newrobustcmd{\blxmkbibnote}[2]{%
+ \begingroup
+ \blx@blxinit
+ \blx@setsfcodes
+ \blx@postpunct@agroup
+ \toggletrue{blx@footnote}%
+ \csuse{bib#1notewrapper}{#2}%
+ \endgroup}
+
+\newcommand{\bibfootnotewrapper}[1]{%
+ \bibsentence#1\addperiod}
+
+\newcommand{\bibendnotewrapper}[1]{%
+ \bibsentence#1\addperiod}
+
+\AtEndPreamble{%
+ \def\blx@theendnote{\blx@err@endnote\footnote}%
+ \def\blx@theendnotetext{\blx@err@endnote\footnotetext}%
+ \ifdef\endnote
+ {\def\blx@theendnote{\endnote}%
+ \ifdef\endnotetext
+ {\def\blx@theendnotetext{\endnotetext}}
+ {}}
+ {\ifdef\pagenote
+ {\def\blx@theendnote{\pagenote}%
+ \ifdef\pagenotetext
+ {\def\blx@theendnotetext{\pagenotetext}}
+ {}}
+ {}}}
+
+\newrobustcmd*{\mknumalph}[1]{%
+ \begingroup
+ \blx@tempcnta=#1\relax
+ \ifnum\blx@tempcnta>702 %
+ \else
+ \ifnum\blx@tempcnta>26 %
+ \advance\blx@tempcnta\m@ne
+ \divide\blx@tempcnta26\relax
+ \blx@numalph\blx@tempcnta
+ \multiply\blx@tempcnta26\relax
+ \blx@tempcnta=\numexpr#1-\blx@tempcnta\relax
+ \fi
+ \fi
+ \blx@numalph\blx@tempcnta
+ \endgroup}
+\def\blx@numalph#1{%
+ \ifcase#1\relax\blx@warning@entry{Value out of range}\number#1\or
+ a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m\or
+ n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\else
+ \blx@warning@entry{Value out of range}\number#1\fi}
+
+% {<macro>}[<pre>]{<vol>}[<post>] => <macro>{<pre>}{{<vol>}{<post>}}
+
+\newrobustcmd*{\volcitecmd}{%
+ \AtNextCite{%
+ \toggletrue{blx@volcite}%
+ \csuse{blx@hook@volcite}}%
+ \begingroup\let\blx@citeargs\blx@volciteargs}
+
+\protected\def\blx@volciteargs#1{%
+ \endgroup
+ \@ifnextchar[%]
+ {\blx@volciteargs@i{#1}}
+ {\blx@volciteargs@i{#1}[]}}
+
+\long\def\blx@volciteargs@i#1[#2]#3{%
+ \@ifnextchar[%]
+ {\blx@volciteargs@ii{#1}{#2}{#3}}
+ {\blx@citeargs@iii{#1{#2}{{#3}{}}}}}
+
+\long\def\blx@volciteargs@ii#1#2#3[#4]{%
+ \blx@citeargs@iii{#1{#2}{{#3}{#4}}}}
+
+\newrobustcmd*{\multivolcitecmd}{%
+ \AtNextCite{%
+ \toggletrue{blx@volcite}%
+ \csuse{blx@hook@volcite}}%
+ \def\blx@hook@mcite@before{%
+ \global\undef\blx@hook@mcite@before
+ \let\blx@citeargs\blx@volmciteargs}}
+
+\protected\def\blx@volmciteargs#1{%
+ \@ifnextchar[%]
+ {\blx@volciteargs@i{#1}}
+ {\blx@volciteargs@i{#1}[]}}
+
+\long\def\blx@defvolcitepostnote#1#2{%
+ \def\abx@field@@@volcitevolume{#1}%
+ \ifblank{#2}
+ {}
+ {\def\abx@field@@@volcitepages{#2}}}
+
+\newrobustcmd*{\AtVolcite}{%
+ \@ifstar
+ {\global\undef\blx@hook@volcite
+ \gappto\blx@hook@volcite}
+ {\gappto\blx@hook@volcite}}
+\@onlypreamble\AtVolcite
+\def\blx@imc@UseVolciteHook{\csuse{blx@hook@volcite}}
+\blx@regimcs{\UseVolciteHook}
+
+\AtVolcite{%
+ \DeclareFieldAlias{postnote}{volcitenote}}
+
+%% Control file
+
+\begingroup
+\let~\space
+\@makeother\<
+\@makeother\>
+\@makeother\.
+\@makeother\:
+\@makeother\?
+\@makeother\"
+\@makeother\-
+\@makeother\=
+\@makeother\/
+\xdef\blx@xml@file{%
+ \blx@sig@bcf\blx@nl
+ \blx@ver@bcf\blx@nl}
+\xdef\blx@xml@endfile{%
+ </bcf:controlfile>}
+\xdef\blx@xml@comment#1{%
+ ~~<!-- #1 -->\blx@nl}
+\xdef\blx@xml@options#1#2#3{%
+ ~~<bcf:options%
+ \noexpand\ifblank{#1}{}{ component="#1"}%
+ \noexpand\ifblank{#2}{}{ type="#2"}%
+ >\blx@nl
+ #3%
+ ~~</bcf:options>\blx@nl}
+\xdef\blx@xml@option#1#2{%
+ ~~~~<bcf:option type="#1">\blx@nl
+ #2%
+ ~~~~</bcf:option>\blx@nl}
+\xdef\blx@xml@ordered#1#2#3{%
+ ~~~~~~<bcf:value order="#1"#2%
+ >#3</bcf:value>\blx@nl}
+
+\xdef\blx@xml@datafieldset#1#2{%
+ ~~<bcf:datafieldset name="#1">\blx@nl
+ #2%
+ ~~</bcf:datafieldset>\blx@nl}
+
+\xdef\blx@xml@datafieldsets@member#1{%
+ ~~~~<bcf:member#1/>\blx@nl}
+
+\xdef\blx@xml@transliteration#1#2{%
+ ~~<bcf:transliteration entrytype="#1">\blx@nl
+ #2%
+ ~~</bcf:transliteration>\blx@nl}
+\xdef\blx@xml@translit#1#2#3#4{%
+ ~~~~<bcf:translit #1target="#2" from="#3" to="#4"/>\blx@nl}
+
+\xdef\blx@xml@sourcemap#1{%
+ ~~<bcf:sourcemap>\blx@nl
+ #1%
+ ~~</bcf:sourcemap>\blx@nl}
+\xdef\blx@xml@sourcemap@maps#1#2{%
+ ~~~~<bcf:maps#1>\blx@nl
+ #2%
+ ~~~~</bcf:maps>\blx@nl}
+\xdef\blx@xml@sourcemap@map#1#2{%
+ ~~~~~~<bcf:map#1>\blx@nl
+ #2%
+ ~~~~~~</bcf:map>\blx@nl}
+\xdef\blx@xml@sourcemap@perdatasource#1{%
+ ~~~~~~~~<bcf:per\string_datasource>#1</bcf:per\string_datasource>\blx@nl}
+\xdef\blx@xml@sourcemap@pertype#1{%
+ ~~~~~~~~<bcf:per\string_type>#1</bcf:per\string_type>\blx@nl}
+\xdef\blx@xml@sourcemap@pernottype#1{%
+ ~~~~~~~~<bcf:per\string_nottype>#1</bcf:per\string_nottype>\blx@nl}
+\xdef\blx@xml@sourcemap@step#1{%
+ ~~~~~~~~<bcf:map\string_step#1/>\blx@nl}
+
+\xdef\blx@xml@labelalphanametemplate#1#2{%
+ ~~<bcf:labelalphanametemplate name="#1">\blx@nl
+ #2%
+ ~~</bcf:labelalphanametemplate>\blx@nl}
+\xdef\blx@xml@labelalphanametemplatenamepart#1#2#3{%
+ ~~~~<bcf:namepart #1#2>#3</bcf:namepart>\blx@nl}
+
+\xdef\blx@xml@labelalphatemplate#1#2{%
+ ~~<bcf:labelalphatemplate type="#1">\blx@nl
+ #2%
+ ~~</bcf:labelalphatemplate>\blx@nl}
+\xdef\blx@xml@labelalpha@element#1#2{%
+ ~~~~<bcf:labelelement order="#1">\blx@nl
+ #2%
+ ~~~~</bcf:labelelement>\blx@nl}
+\xdef\blx@xml@labelalpha@part#1#2{%
+ ~~~~~~<bcf:labelpart#1>#2</bcf:labelpart>\blx@nl}
+
+\xdef\blx@xml@extradate#1{%
+ ~~<bcf:extradatespec>\blx@nl
+ #1%
+ ~~</bcf:extradatespec>\blx@nl}
+\xdef\blx@xml@extradatescope#1{%
+ ~~~~<bcf:scope>\blx@nl
+ #1%
+ ~~~~</bcf:scope>\blx@nl}
+\xdef\blx@xml@edordered#1#2{%
+ ~~~~~~<bcf:field order="#1">#2</bcf:field>\blx@nl}
+
+\xdef\blx@xml@inheritance#1{%
+ ~~<bcf:inheritance>\blx@nl
+ #1%
+ ~~</bcf:inheritance>\blx@nl}
+\xdef\blx@xml@inherit@defaults#1#2{%
+ ~~~~<bcf:defaults#1>\blx@nl
+ #2%
+ ~~~~</bcf:defaults>\blx@nl}
+\xdef\blx@xml@inherit@data#1#2{%
+ ~~~~<bcf:inherit#1>\blx@nl
+ #2%
+ ~~~~</bcf:inherit>\blx@nl}
+\xdef\blx@xml@inherit@type#1#2#3{%
+ ~~~~~~<bcf:type\string_pair source="#1" target="#2"#3/>\blx@nl}
+\xdef\blx@xml@inherit@field#1#2#3{%
+ ~~~~~~<bcf:field source="#1" target="#2"#3/>\blx@nl}
+\xdef\blx@xml@inherit@block#1{%
+ ~~~~~~<bcf:field source="#1" skip="true"/>\blx@nl}
+
+\xdef\blx@xml@nosorts#1{%
+ ~~<bcf:nosorts>\blx@nl
+ #1%
+ ~~</bcf:nosorts>\blx@nl}
+\xdef\blx@xml@nosort#1#2{%
+ ~~~~<bcf:nosort field="#1" value="#2"/>\blx@nl}
+
+\xdef\blx@xml@nonamestrings#1{%
+ ~~<bcf:nonamestrings>\blx@nl
+ #1%
+ ~~</bcf:nonamestrings>\blx@nl}
+\xdef\blx@xml@nonamestring#1#2{%
+ ~~~~<bcf:nonamestring field="#1" value="#2"/>\blx@nl}
+
+\xdef\blx@xml@noinits#1{%
+ ~~<bcf:noinits>\blx@nl
+ #1%
+ ~~</bcf:noinits>\blx@nl}
+\xdef\blx@xml@noinit#1{%
+ ~~~~<bcf:noinit value="#1"/>\blx@nl}
+
+\xdef\blx@xml@nolabels#1{%
+ ~~<bcf:nolabels>\blx@nl
+ #1%
+ ~~</bcf:nolabels>\blx@nl}
+\xdef\blx@xml@nolabel#1{%
+ ~~~~<bcf:nolabel value="#1"/>\blx@nl}
+
+\xdef\blx@xml@nolabelwidthcounts#1{%
+ ~~<bcf:nolabelwidthcounts>\blx@nl
+ #1%
+ ~~</bcf:nolabelwidthcounts>\blx@nl}
+\xdef\blx@xml@nolabelwidthcount#1{%
+ ~~~~<bcf:nolabelwidthcount value="#1"/>\blx@nl}
+
+\xdef\blx@xml@uniquenametemplate#1#2{%
+ ~~<bcf:uniquenametemplate name="#1">\blx@nl%
+ #2%
+ ~~</bcf:uniquenametemplate>\blx@nl}
+
+\xdef\blx@xml@uniquenametemplatenamepart#1#2#3{%
+ ~~~~<bcf:namepart #1#2>#3</bcf:namepart>\blx@nl}
+
+\xdef\blx@xml@sortingnamekeytemplate#1#2#3{%
+ ~~<bcf:sortingnamekeytemplate name="#1" visibility="#2">\blx@nl%
+ #3%
+ ~~</bcf:sortingnamekeytemplate>\blx@nl}
+
+\xdef\blx@xml@sortingnamekeykeypart#1#2{%
+ ~~~~<bcf:keypart#1>\blx@nl
+ #2%
+ ~~~~</bcf:keypart>\blx@nl}
+
+\xdef\blx@xml@sortingnamekeynamepart#1#2#3{%
+ ~~~~~~<bcf:part type="namepart"#1#2>#3</bcf:part>\blx@nl}
+
+\xdef\blx@xml@sortingnamekeyliteral#1#2{%
+ ~~~~~~<bcf:part type="literal"#1>#2</bcf:part>\blx@nl}
+
+\xdef\blx@xml@sortingtemplate#1#2#3{%
+ ~~<bcf:sortingtemplate name="#1"#2>\blx@nl%
+ #3%
+ ~~</bcf:sortingtemplate>\blx@nl}
+\xdef\blx@xml@presort#1#2{%
+ ~~<bcf:presort\noexpand\ifblank{#1}{}{ type="#1"}>%
+ #2</bcf:presort>\blx@nl}
+
+\xdef\blx@xml@sortexclude#1#2{%
+ ~~<bcf:sortexclusion\noexpand\ifblank{#1}{}{ type="#1"}>\blx@nl
+ #2%
+ ~~</bcf:sortexclusion>\blx@nl}
+\xdef\blx@xml@exclude#1{%
+ ~~~~<bcf:exclusion>#1</bcf:exclusion>\blx@nl}
+\xdef\blx@xml@sortinclude#1#2{%
+ ~~<bcf:sortinclusion\noexpand\ifblank{#1}{}{ type="#1"}>\blx@nl
+ #2%
+ ~~</bcf:sortinclusion>\blx@nl}
+\xdef\blx@xml@include#1{%
+ ~~~~<bcf:inclusion>#1</bcf:inclusion>\blx@nl}
+\xdef\blx@xml@sort#1#2{%
+ ~~~~<bcf:sort #1>\blx@nl
+ #2%
+ ~~~~</bcf:sort>\blx@nl}
+\xdef\blx@xml@sortitem#1#2{%
+ ~~~~~~<bcf:sortitem #1>#2</bcf:sortitem>\blx@nl}
+\xdef\blx@xml@section#1{%
+ ~~<bcf:section number="#1">}
+\xdef\blx@xml@endsection{%
+ ~~</bcf:section>}
+
+\xdef\blx@xml@dlist@refcontext#1#2#3#4#5{%
+ ~~~~~~~~~~~~~~~~sortingtemplatename="#1"\blx@nl
+ ~~~~~~~~~~~~~~~~sortingnamekeytemplatename="#2"\blx@nl
+ ~~~~~~~~~~~~~~~~labelprefix="#3"\blx@nl
+ ~~~~~~~~~~~~~~~~uniquenametemplatename="#4"\blx@nl
+ ~~~~~~~~~~~~~~~~labelalphanametemplatename="#5"}
+\xdef\blx@xml@dlist#1#2#3#4#5{%
+ ~~<bcf:datalist section="#3"\blx@nl
+ ~~~~~~~~~~~~~~~~name="#1"\blx@nl
+ ~~~~~~~~~~~~~~~~type="#2"\blx@nl
+ #4>\blx@nl
+ #5%
+ ~~</bcf:datalist>\blx@nl}
+\xdef\blx@xml@dlistfilterorbegin{%
+ ~~~~<bcf:filteror>\blx@nl}
+\xdef\blx@xml@dlistfilterorend{%
+ ~~~~</bcf:filteror>\blx@nl}
+\xdef\blx@xml@dlistfilter#1#2{%
+ ~~~~<bcf:filter type="#1">#2</bcf:filter>\blx@nl}
+
+\xdef\blx@xml@bibdata#1#2{%
+ ~~<bcf:bibdata section="#1">\blx@nl
+ #2%
+ ~~</bcf:bibdata>\blx@nl}
+\xdef\blx@xml@datasource#1#2#3#4#5{%
+ ~~~~<bcf:datasource type="#1" datatype="#2"#3#4>#5</bcf:datasource>\blx@nl}
+\xdef\blx@xml@citekey#1#2#3#4{%
+ ~~~~<bcf:citekey order="#3" intorder="#4"#2>#1</bcf:citekey>}
+\xdef\blx@xml@citeset#1#2{%
+ ~~~~<bcf:citekey type="set" members="#2">#1</bcf:citekey>}
+\xdef\blx@xml@citekeycount#1#2{%
+ ~~~~<bcf:citekeycount count="#2">#1</bcf:citekeycount>}
+\xdef\blx@xml@svalue#1#2{%
+ \blx@xml@option{singlevalued}{%
+ ~~~~~~<bcf:key>#1</bcf:key>\blx@nl
+ ~~~~~~<bcf:value>#2</bcf:value>\blx@nl}}
+\xdef\blx@xml@mvalue#1#2{%
+ \blx@xml@option{multivalued}{%
+ ~~~~~~<bcf:key>#1</bcf:key>\blx@nl
+ #2}}
+\xdef\blx@xml@toggle#1{%
+ \blx@xml@svalue{#1}{\noexpand\iftoggle{blx@#1}{1}{0}}}
+\xdef\blx@xml@options@scope#1#2{%
+ ~~<bcf:optionscope type="#1">\blx@nl
+ #2%
+ ~~</bcf:optionscope>\blx@nl}
+\xdef\blx@xml@option@scope#1#2{% GLOBAL/TYPE scope
+ ~~~~<bcf:option datatype="#1">#2</bcf:option>\blx@nl}
+\xdef\blx@xml@option@entryscope#1#2{% ENTRY scope
+ ~~~~<bcf:option datatype="#1"\noexpand\ifcsdef{blx@bcf@backendout@entry@#2}{ backendout="1"}{}\noexpand\ifcsdef{blx@bcf@backendin@entry@#2}{ backendin="\noexpand\csuse{blx@bcf@backendin@entry@#2}"}{}>#2</bcf:option>\blx@nl}
+\xdef\blx@xml@option@namelistscope#1#2{% NAMELIST scope
+ ~~~~<bcf:option datatype="#1"\noexpand\ifcsdef{blx@bcf@backendout@namelist@#2}{ backendout="1"}{}\noexpand\ifcsdef{blx@bcf@backendin@namelist@#2}{ backendin="\noexpand\csuse{blx@bcf@backendin@namelist@#2}"}{}>#2</bcf:option>\blx@nl}
+\xdef\blx@xml@option@namescope#1#2{% NAME scope
+ ~~~~<bcf:option datatype="#1"\noexpand\ifcsdef{blx@bcf@backendout@name@#2}{ backendout="1"}{}\noexpand\ifcsdef{blx@bcf@backendin@name@#2}{ backendin="\noexpand\csuse{blx@bcf@backendin@name@#2}"}{}>#2</bcf:option>\blx@nl}
+\endgroup
+
+\def\blx@bcf@options@global{%
+ \blx@xml@comment{GLOBAL}%
+ \blx@xml@options{biblatex}{global}{%
+ \blx@xml@svalue{alphaothers}{\labelalphaothers}%
+ \blx@xml@mvalue{extradatecontext}{\blx@bcf@extradatecontext}%
+ \blx@xml@toggle{labelalpha}%
+ \blx@xml@mvalue{labelnamespec}{\blx@bcf@labelnamespec}%
+ \blx@xml@toggle{labeltitle}%
+ \blx@xml@mvalue{labeltitlespec}{\blx@bcf@labeltitlespec}%
+ \blx@xml@toggle{labeltitleyear}%
+ \blx@xml@toggle{labeldateparts}%
+ \blx@xml@mvalue{labeldatespec}{\blx@bcf@labeldatespec}%
+ \blx@xml@toggle{julian}%
+ \blx@xml@svalue{gregorianstart}{\blx@gregorianstart}%
+ \blx@xml@svalue{maxalphanames}{\blx@maxalphanames}%
+ \blx@xml@svalue{maxbibnames}{\blx@maxbibnames}%
+ \blx@xml@svalue{maxcitenames}{\blx@maxcitenames}%
+ \blx@xml@svalue{maxsortnames}{\blx@maxsortnames}%
+ \blx@xml@svalue{maxitems}{\blx@maxitems}%
+ \blx@xml@svalue{minalphanames}{\blx@minalphanames}%
+ \blx@xml@svalue{minbibnames}{\blx@minbibnames}%
+ \blx@xml@svalue{mincitenames}{\blx@mincitenames}%
+ \blx@xml@svalue{minsortnames}{\blx@minsortnames}%
+ \blx@xml@svalue{minitems}{\blx@minitems}%
+ \blx@xml@toggle{nohashothers}%
+ \blx@xml@toggle{noroman}%
+ \blx@xml@toggle{nosortothers}%
+ \blx@xml@toggle{pluralothers}%
+ \blx@xml@toggle{singletitle}%
+ \blx@xml@toggle{skipbib}%
+ \blx@xml@toggle{skipbiblist}%
+ \blx@xml@toggle{skiplab}%
+ \blx@xml@svalue{sortalphaothers}{\sortalphaothers}%
+ \blx@xml@svalue{sortlocale}{\blx@sortlocale}%
+ \blx@xml@svalue{sortingtemplatename}{\blx@sorting}%
+ \blx@xml@toggle{sortsets}%
+ \blx@xml@svalue{uniquelist}{\blx@uniquelist}%
+ \blx@xml@svalue{uniquename}{\blx@uniquename}%
+ \blx@xml@toggle{uniqueprimaryauthor}%
+ \blx@xml@toggle{uniquetitle}%
+ \blx@xml@toggle{uniquebaretitle}%
+ \blx@xml@toggle{uniquework}%
+ \blx@xml@toggle{useprefix}%
+ \blx@xml@nametoggles
+ }%
+}
+
+\def\blx@bcf@options@type#1{%
+ \blx@xml@comment{#1}%
+ \blx@xml@options{biblatex}{#1}{%
+ \blx@xml@mvalue{extradatecontext}{%
+ \ifcsdef{blx@bcf@extradatecontext@#1}
+ {\csuse{blx@bcf@extradatecontext@#1}}
+ {\blx@bcf@extradatecontext}}%
+ \blx@xml@toggle{labelalpha}%
+ \blx@xml@mvalue{labelnamespec}{%
+ \ifcsdef{blx@bcf@labelnamespec@#1}
+ {\csuse{blx@bcf@labelnamespec@#1}}
+ {\blx@bcf@labelnamespec}}%
+ \blx@xml@toggle{labeltitle}%
+ \blx@xml@mvalue{labeltitlespec}{%
+ \ifcsdef{blx@bcf@labeltitlespec@#1}
+ {\csuse{blx@bcf@labeltitlespec@#1}}
+ {\blx@bcf@labeltitlespec}}%
+ \blx@xml@toggle{labeltitleyear}%
+ \blx@xml@toggle{labeldateparts}%
+ \blx@xml@mvalue{labeldatespec}{%
+ \ifcsdef{blx@bcf@labeldatespec@#1}
+ {\csuse{blx@bcf@labeldatespec@#1}}
+ {\blx@bcf@labeldatespec}}%
+ \blx@xml@svalue{maxalphanames}{\blx@maxalphanames}%
+ \blx@xml@svalue{maxbibnames}{\blx@maxbibnames}%
+ \blx@xml@svalue{maxcitenames}{\blx@maxcitenames}%
+ \blx@xml@svalue{maxsortnames}{\blx@maxsortnames}%
+ \blx@xml@svalue{maxitems}{\blx@maxitems}%
+ \blx@xml@svalue{minalphanames}{\blx@minalphanames}%
+ \blx@xml@svalue{minbibnames}{\blx@minbibnames}%
+ \blx@xml@svalue{mincitenames}{\blx@mincitenames}%
+ \blx@xml@svalue{minsortnames}{\blx@minsortnames}%
+ \blx@xml@svalue{minitems}{\blx@minitems}%
+ \blx@xml@toggle{nohashothers}%
+ \blx@xml@toggle{noroman}%
+ \blx@xml@toggle{nosortothers}%
+ \blx@xml@toggle{singletitle}%
+ \blx@xml@toggle{skipbib}%
+ \blx@xml@toggle{skipbiblist}%
+ \blx@xml@toggle{skiplab}%
+ \blx@xml@svalue{uniquelist}{\blx@uniquelist}%
+ \blx@xml@svalue{uniquename}{\blx@uniquename}%
+ \blx@xml@toggle{uniqueprimaryauthor}%
+ \blx@xml@toggle{uniquetitle}%
+ \blx@xml@toggle{uniquebaretitle}%
+ \blx@xml@toggle{uniquework}%
+ \blx@xml@toggle{useprefix}%
+ \blx@xml@nametoggles
+ }%
+}
+
+\def\blx@ctrlwrite{%
+ \begingroup
+ \blx@safe@actives
+ \let\protect\string
+ % options
+ \protected@edef\labelalphaothers{\labelalphaothers}%
+ \protected@edef\sortalphaothers{\sortalphaothers}%
+ \blx@xmlsanitizeafter{\def\labelalphaothers}{\labelalphaothers}%
+ \blx@xmlsanitizeafter{\def\sortalphaothers}{\sortalphaothers}%
+ % Expand the global use* name toggles
+ \let\blx@xml@nametoggles\@empty
+ \def\do##1{\eappto\blx@xml@nametoggles{\blx@xml@toggle{use##1}}}%
+ \abx@donames
+ \edef\blx@tempa{%
+ \blx@xml@file
+ \blx@xml@comment{BIBER OPTIONS}%
+ \blx@xml@options{biber}{global}{%
+ \blx@xml@svalue{output_encoding}{\blx@texencoding}%
+ \blx@xml@svalue{input_encoding}{\blx@bibencoding}%
+ \blx@xml@toggle{debug}%
+ \blx@xml@svalue{mincrossrefs}{\blx@mincrossrefs}%
+ \blx@xml@svalue{minxrefs}{\blx@minxrefs}%
+ \blx@xml@svalue{mslang}{\blx@gmslang}%
+ \blx@xml@toggle{sortcase}%
+ \blx@xml@toggle{sortupper}%
+ }%
+ \blx@xml@comment{BIBLATEX OPTIONS}%
+ \blx@bcf@options@global
+ }%
+ \ifdef\blx@opts@type
+ {\def\do##1{%
+ \begingroup
+ \let\protect\relax
+ \blx@setoptions@type{##1}%
+ % Expand the type use* name toggles
+ \let\blx@xml@nametoggles\@empty
+ \def\do####1{\eappto\blx@xml@nametoggles{\blx@xml@toggle{use####1}}}%
+ \abx@donames
+ \blx@checkoptions@type
+ \xappto\blx@tempa{\blx@bcf@options@type{##1}}%
+ \endgroup}%
+ \dolistloop\blx@opts@type}
+ {}%
+ % options scope
+ % GLOBAL
+ \def\do##1{%
+ \begingroup
+ \def\do####1{\xappto\blx@bcf@options@scope@global{\blx@xml@option@scope{##1}{####1}}}%
+ \dolistcsloop{blx@globalopts@##1}%
+ \endgroup}%
+ \dolistloop\blx@globalopts@datatypes
+ % ENTRYTYPE
+ \def\do##1{%
+ \begingroup
+ \def\do####1{\xappto\blx@bcf@options@scope@type{\blx@xml@option@scope{##1}{####1}}}%
+ \dolistcsloop{blx@typeopts@##1}%
+ \endgroup}%
+ \dolistloop\blx@typeopts@datatypes
+ % ENTRY
+ \def\do##1{%
+ \begingroup
+ \def\do####1{\xappto\blx@bcf@options@scope@entry{\blx@xml@option@entryscope{##1}{####1}}}%
+ \dolistcsloop{blx@entryopts@##1}%
+ \endgroup}%
+ \dolistloop\blx@entryopts@datatypes
+ % NAMELIST
+ \def\do##1{%
+ \begingroup
+ \def\do####1{\xappto\blx@bcf@options@scope@namelist{\blx@xml@option@namelistscope{##1}{####1}}}%
+ \dolistcsloop{blx@namelistopts@##1}%
+ \endgroup}%
+ \dolistloop\blx@entryopts@datatypes
+ % NAME
+ \def\do##1{%
+ \begingroup
+ \def\do####1{\xappto\blx@bcf@options@scope@name{\blx@xml@option@namescope{##1}{####1}}}%
+ \dolistcsloop{blx@nameopts@##1}%
+ \endgroup}%
+ \dolistloop\blx@entryopts@datatypes
+
+ \eappto\blx@tempa{%
+ \blx@xml@comment{BIBLATEX OPTION SCOPE}%
+ \blx@xml@options@scope{GLOBAL}{\blx@bcf@options@scope@global}%
+ \blx@xml@options@scope{ENTRYTYPE}{\blx@bcf@options@scope@type}%
+ \blx@xml@options@scope{ENTRY}{\blx@bcf@options@scope@entry}%
+ \blx@xml@options@scope{NAMELIST}{\blx@bcf@options@scope@namelist}%
+ \blx@xml@options@scope{NAME}{\blx@bcf@options@scope@name}}
+ % datafieldsets
+ \def\do##1{%
+ \xappto\blx@bcf@datafieldsets{\blx@xml@datafieldset{##1}{\csuse{blx@datafieldsetmembers@##1}}}}
+ \dolistloop\blx@datafieldsets
+
+ \eappto\blx@tempa{%
+ \blx@xml@comment{DATAFIELDSETS}%
+ \blx@bcf@datafieldsets}%
+ % sourcemap
+ \ifbool{sourcemap}
+ {\eappto\blx@tempa{%
+ \blx@xml@comment{SOURCEMAP}%
+ \blx@xml@sourcemap{%
+ \ifdef\blx@sourcemap@user
+ {\blx@sourcemap@user}
+ {}%
+ \ifdef\blx@sourcemap@style
+ {\blx@sourcemap@style}
+ {}%
+ \ifdef\blx@sourcemap@defaults@bibtex
+ {\blx@sourcemap@defaults@bibtex}
+ {}%
+ \ifdef\blx@sourcemap@defaults@biblatexml
+ {\blx@sourcemap@defaults@biblatexml}
+ {}}}}
+ {}%
+ % labelalpha name template
+ \eappto\blx@tempa{\blx@xml@comment{LABELALPHA NAME TEMPLATE}}%
+ \def\do##1{%
+ \eappto\blx@tempa{%
+ \blx@xml@labelalphanametemplate{##1}{\csuse{blx@labelalphanametemplate@##1}}}}%
+ \dolistloop\blx@lantemplatespecs
+ % labelalpha template
+ \eappto\blx@tempa{%
+ \blx@xml@comment{LABELALPHA TEMPLATE}}%
+ \def\do##1{%
+ \eappto\blx@tempa{%
+ \blx@xml@labelalphatemplate{##1}{%
+ \csuse{blx@labelalphatemplate@##1}}}}%
+ \dolistloop\blx@latem@type
+ % extradate specification
+ \eappto\blx@tempa{%
+ \blx@xml@comment{EXTRADATE}%
+ \blx@xml@extradate{\csuse{blx@bcf@extradatespec}}}%
+ % data inheritance
+ \eappto\blx@tempa{%
+ \blx@xml@comment{INHERITANCE}%
+ \blx@xml@inheritance{%
+ \csuse{blx@inherit@default}%
+ \csuse{blx@inherit@data}}}%
+ % noinit
+ \ifcsdef{blx@noinit}
+ {\eappto\blx@tempa{%
+ \blx@xml@comment{NOINIT}%
+ \blx@xml@noinits{%
+ \csuse{blx@noinit}}}}%
+ {}%
+ % nolabel
+ \ifcsdef{blx@nolabel}
+ {\eappto\blx@tempa{%
+ \blx@xml@comment{NOLABEL}%
+ \blx@xml@nolabels{%
+ \csuse{blx@nolabel}}}}%
+ {}%
+ % nolabel
+ \ifcsdef{blx@nolabelwidthcount}
+ {\eappto\blx@tempa{%
+ \blx@xml@comment{NOLABELWIDTHCOUNT}%
+ \blx@xml@nolabelwidthcounts{%
+ \csuse{blx@nolabelwidthcount}}}}%
+ {}%
+ % nosort
+ \ifcsdef{blx@nosort}
+ {\eappto\blx@tempa{%
+ \blx@xml@comment{NOSORT}%
+ \blx@xml@nosorts{%
+ \csuse{blx@nosort}}}}%
+ {}%
+ % nonamestrings
+ \ifcsdef{blx@nonamestring}
+ {\eappto\blx@tempa{%
+ \blx@xml@comment{NONAMESTRING}%
+ \blx@xml@nonamestrings{%
+ \csuse{blx@nonamestring}}}}%
+ {}%
+ % transliteration
+ \ifdefempty\blx@translits
+ {}
+ {\eappto\blx@tempa{\blx@xml@comment{TRANSLITERATION}}%
+ \def\do##1{%
+ \eappto\blx@tempa{\blx@xml@transliteration{##1}{\csuse{blx@translit@##1}}}}%
+ \dolistloop\blx@translits}%
+ % uniquenametemplate
+ \eappto\blx@tempa{\blx@xml@comment{UNIQUENAME TEMPLATES}}%
+ \def\do##1{%
+ \eappto\blx@tempa{%
+ \blx@xml@uniquenametemplate{##1}{\csuse{blx@uniquenametemplate@##1}}}}%
+ \dolistloop\blx@untemplatespecs
+ % sortingnamekeytemplate
+ \eappto\blx@tempa{\blx@xml@comment{SORTING NAME KEY TEMPLATES}}%
+ \def\do##1{%
+ \eappto\blx@tempa{%
+ \blx@xml@sortingnamekeytemplate{##1}{\csuse{blx@sortingnamekeytemplatesvisibility@##1}}{\csuse{blx@sortingnamekeytemplate@##1}}}}%
+ \dolistloop\blx@sortingnamekeytemplates
+ % presort/sorting excludes/sorting includes
+ \def\do##1{%
+ \eappto\blx@bcf@presort{\csuse{blx@bcf@presort@##1}}%
+ \eappto\blx@bcf@exclude{\csuse{blx@bcf@exclude@##1}}%
+ \eappto\blx@bcf@include{\csuse{blx@bcf@include@##1}}}%
+ \abx@doentrytypes
+ \do{*}% entrytype wildcard
+ \eappto\blx@tempa{%
+ \blx@bcf@presort
+ \blx@bcf@exclude
+ \blx@bcf@include}%
+ % datamodel
+ \eappto\blx@tempa{%
+ \blx@xml@comment{DATA MODEL}%
+ \blx@xml@datamodel{%
+ \blx@xml@datamodel@constants{%
+ \blx@bcf@datamodel@constants
+ }%
+ \blx@xml@datamodel@entrytypes{%
+ \blx@bcf@datamodel@entrytypes
+ }%
+ \blx@xml@datamodel@fields{%
+ \blx@bcf@datamodel@fields
+ }%
+ \blx@bcf@datamodel@entryfields
+ \blx@bcf@datamodel@multiscript@entryfields
+ \blx@bcf@datamodel@constraints
+ }%
+ }%
+ % files
+ \let\blx@tempb\@empty
+ \blx@bibdata\blx@tempb\blx@bibfiles
+ \eappto\blx@tempa{%
+ \blx@xml@comment{CITATION DATA}%
+ \blx@xml@comment{SECTION 0}%
+ \blx@xml@bibdata{0}{\blx@tempb}%
+ \blx@xml@section{0}%
+ }%
+ \immediate\openout\blx@bcfout\jobname.bcf\relax
+ \blx@auxwrite\blx@bcfout{}{\blx@tempa}%
+ \global\undef\blx@tempa
+ \endgroup
+ \AfterEndDocument{%
+ \def\do##1{%
+ \csxappto{blx@sortingtemplates}{%
+ \blx@xml@sortingtemplate{##1}
+ {\ifcsdef{blx@sortdef@locale@##1}{ locale="\csuse{blx@sortdef@locale@##1}"}{}}
+ {\csuse{blx@sortingtemplate@##1}}}}%
+ \dolistloop\blx@sortingtemplatenames
+ \blx@auxwrite\blx@bcfout{}{%
+ \blx@xml@endsection\blx@nl
+ \blx@xml@comment{SORTING TEMPLATES}%
+ \csuse{blx@sortingtemplates}%
+ \blx@xml@comment{DATALISTS}%
+ \csuse{blx@dlists}%
+ \blx@xml@endfile}%
+ \immediate\closeout\blx@bcfout}}
+
+%% Customisation
+
+% nolabel
+\newrobustcmd*{\DeclareNolabel}[1]{%
+ \begingroup
+ \let\nolabel\blx@nolabel@setup
+ \let\blx@tempa\@empty
+ #1%
+ \global\let\blx@nolabel\blx@tempa
+ \endgroup}
+\@onlypreamble\DeclareNolabel
+
+\newcommand*{\blx@nolabel@setup}[1]{%
+ \eappto\blx@tempa{%
+ \blx@xml@nolabel{#1}}}
+
+% nolabelwidthcount
+\newrobustcmd*{\DeclareNolabelwidthcount}[1]{%
+ \begingroup
+ \let\nolabel\blx@nolabelwidthcount@setup
+ \let\blx@tempa\@empty
+ #1%
+ \global\let\blx@nolabelwidthcount\blx@tempa
+ \endgroup}
+\@onlypreamble\DeclareNolabelwidthcount
+
+\newcommand*{\blx@nolabelwidthcount@setup}[1]{%
+ \eappto\blx@tempa{%
+ \blx@xml@nolabelwidthcount{#1}}}
+
+% nosort
+\newrobustcmd*{\DeclareNosort}[1]{%
+ \begingroup
+ \let\nosort\blx@nosort@setup
+ \let\blx@tempa\@empty
+ #1%
+ \global\let\blx@nosort\blx@tempa
+ \endgroup}
+\@onlypreamble\DeclareNosort
+
+\newcommand*{\blx@nosort@setup}[2]{%
+ \eappto\blx@tempa{%
+ \blx@xml@nosort{#1}{#2}}}
+
+% nonamestring
+\newrobustcmd*{\DeclareNonamestring}[1]{%
+ \begingroup
+ \let\nonamestring\blx@nonamestring@setup
+ \let\blx@tempa\@empty
+ #1%
+ \global\let\blx@nonamestring\blx@tempa
+ \endgroup}
+\@onlypreamble\DeclareNonamestring
+
+\newcommand*{\blx@nonamestring@setup}[2]{%
+ \eappto\blx@tempa{%
+ \blx@xml@nonamestring{#1}{#2}}}
+
+% noinit
+\newrobustcmd*{\DeclareNoinit}[1]{%
+ \begingroup
+ \let\noinit\blx@noinit@setup
+ \let\blx@tempa\@empty
+ #1%
+ \global\let\blx@noinit\blx@tempa
+ \endgroup}
+\@onlypreamble\DeclareNoinit
+
+\newcommand*{\blx@noinit@setup}[1]{%
+ \eappto\blx@tempa{%
+ \blx@xml@noinit{#1}}}
+
+% datafieldsets
+\newrobustcmd*{\DeclareDatafieldSet}[2]{%
+ \begingroup
+ \let\member\blx@datafieldset@member
+ \let\blx@tempa\@empty
+ \def\blx@setname{#1}
+ \cslet{blx@datafieldset@#1}\@empty
+ #2%
+ \csxdef{blx@datafieldsetmembers@#1}{\blx@tempa}%
+ \listgadd\blx@datafieldsets{#1}%
+ \global\csletcs{datafieldset#1}{blx@datafieldset@#1}% expose user-facing macro
+ \endgroup}
+\@onlypreamble\DeclareDatafieldSet
+
+\newcommand*{\blx@datafieldset@member}[1][2]{%
+ \let\blx@dm@fieldtype\@empty
+ \let\blx@dm@datatype\@empty
+ \let\blx@member@field\@empty
+ \let\blx@tempb\@empty
+ \blx@kv@setkeys{blx@datafieldsets@member}{#1}%
+ \eappto\blx@tempa{%
+ \blx@xml@datafieldsets@member{\blx@tempb}}%
+ \ifdefempty\blx@member@field
+ {}
+ {\listcsxadd{blx@datafieldset@\blx@setname}{\blx@member@field}}%
+ % Set some internal macros in case biblatex needs to use the set
+ \ifboolexpr{%
+ not test {\ifdefempty{\blx@dm@fieldtype}}
+ and
+ not test {\ifdefempty{\blx@dm@datatype}}}
+ {\def\do##1{%
+ \listcsxadd{blx@datafieldset@\blx@setname}{##1}}
+ \dolistcsloop{blx@datamodelfields@types@\blx@dm@fieldtype @\blx@dm@datatype}}
+ {\ifdefempty{\blx@dm@fieldtype}
+ {}
+ {\def\do##1{%
+ \listcsxadd{blx@datafieldset@\blx@setname}{##1}}
+ \dolistcsloop{blx@datamodelfields@fieldtypes@\blx@dm@fieldtype}}%
+ \ifdefempty{\blx@dm@datatype}
+ {}
+ {\def\do##1{%
+ \listcsxadd{blx@datafieldset@\blx@setname}{##1}}
+ \dolistcsloop{blx@datamodelfields@datatypes@\blx@dm@datatype}}}}
+
+\blx@kv@defkey{blx@datafieldsets@member}{datatype}{% characters
+ \appto\blx@tempb{ datatype="#1"}%
+ \def\blx@dm@datatype{#1}}
+\blx@kv@defkey{blx@datafieldsets@member}{fieldtype}{% characters
+ \appto\blx@tempb{ fieldtype="#1"}%
+ \def\blx@dm@fieldtype{#1}}
+\blx@kv@defkey{blx@datafieldsets@member}{field}{% characters
+ \appto\blx@tempb{ field="#1"}%
+ \def\blx@member@field{#1}}
+
+% sourcemap
+\newrobustcmd*{\DeclareSourcemap}[1]{%
+ \booltrue{sourcemap}%
+ \begingroup
+ \let\maps\blx@usersourcemap@maps
+ \let\blx@tempa\@empty
+ #1%
+ \xappto\blx@sourcemap@user\blx@tempa%
+ \endgroup}
+\@onlypreamble\DeclareSourcemap
+
+\newrobustcmd*{\DeclareStyleSourcemap}[1]{%
+ \booltrue{sourcemap}%
+ \begingroup
+ \let\maps\blx@stylesourcemap@maps
+ \let\blx@tempa\@empty
+ #1%
+ \xappto\blx@sourcemap@style\blx@tempa%
+ \endgroup}
+
+\@onlypreamble\DeclareStyleSourcemap
+
+\newrobustcmd*{\DeclareDriverSourcemap}[2][]{%
+ \booltrue{sourcemap}%
+ \begingroup
+ \let\blx@tempa\@empty
+ \let\blx@tempb\@empty
+ \let\blx@tempc\@empty
+ \let\blx@tempd\@empty
+ \let\map\blx@sourcemap@map
+ #2%
+ \ifblank{#1}
+ {\blx@kv@setkeys{blx@sourcemap@maps}{datatype=bibtex, level=driver}}
+ {\blx@kv@setkeys{blx@sourcemap@maps}{#1, level=driver}}%
+ \eappto\blx@tempa{%
+ \blx@xml@sourcemap@maps{\blx@tempb}{\blx@tempc}}%
+ \csxdef{blx@sourcemap@defaults@\blx@tempd}{\blx@tempa}%
+ \endgroup}
+\@onlypreamble\DeclareDriverSourcemap
+
+\newcommand*{\blx@usersourcemap@maps}[2][]{%
+ \let\blx@tempb\@empty
+ \let\blx@tempc\@empty
+ \let\map\blx@sourcemap@map
+ \ifblank{#1}
+ {\blx@kv@setkeys{blx@sourcemap@maps}{datatype=bibtex, level=user}}
+ {\blx@kv@setkeys{blx@sourcemap@maps}{#1, level=user}}%
+ #2%
+ \eappto\blx@tempa{%
+ \blx@xml@sourcemap@maps{\blx@tempb}{\blx@tempc}}}
+
+\newcommand*{\blx@stylesourcemap@maps}[2][]{%
+ \let\blx@tempb\@empty
+ \let\blx@tempc\@empty
+ \let\map\blx@sourcemap@map
+ \ifblank{#1}
+ {\blx@kv@setkeys{blx@sourcemap@maps}{datatype=bibtex, level=style}}
+ {\blx@kv@setkeys{blx@sourcemap@maps}{#1, level=style}}%
+ #2%
+ \eappto\blx@tempa{%
+ \blx@xml@sourcemap@maps{\blx@tempb}{\blx@tempc}}}
+
+\blx@kv@defkey{blx@sourcemap@maps}{datatype}{% characters
+ \eappto\blx@tempb{ datatype="#1"}%
+ \eappto\blx@tempd{#1}}
+\blx@kv@defkey{blx@sourcemap@maps}{overwrite}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempb{ map\string_overwrite="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@maps}{level}{% user|style|driver
+ \appto\blx@tempb{ level="#1"}}
+
+\newcommand*{\blx@sourcemap@map}[2][]{%
+ \let\blx@tempm\@empty
+ \let\blx@tempe\@empty
+ \let\perdatasource\blx@sourcemap@perdatasource
+ \let\pertype\blx@sourcemap@pertype
+ \let\pernottype\blx@sourcemap@pernottype
+ \let\step\blx@sourcemap@step
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@sourcemap@map}{#1}}%
+ #2%
+ \eappto\blx@tempc{%
+ \blx@xml@sourcemap@map{\blx@tempm}{\blx@tempe}}}
+
+\blx@kv@defkey{blx@sourcemap@map}{overwrite}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempm{ map\string_overwrite="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@map}{foreach}{% characters
+ \eappto\blx@tempm{ map\string_foreach="#1"}}
+\blx@kv@defkey{blx@sourcemap@map}{refsection}{% integer
+ \eappto\blx@tempm{ refsection="#1"}}
+
+\newcommand*{\blx@sourcemap@perdatasource}[1]{%
+ \eappto\blx@tempe{%
+ \blx@xml@sourcemap@perdatasource{#1}}}
+
+\newcommand*{\blx@sourcemap@pertype}[1]{%
+ \eappto\blx@tempe{%
+ \blx@xml@sourcemap@pertype{#1}}}
+
+\newcommand*{\blx@sourcemap@pernottype}[1]{%
+ \eappto\blx@tempe{%
+ \blx@xml@sourcemap@pernottype{#1}}}
+
+\newcommand*{\blx@sourcemap@step}[1][2]{%
+ \let\blx@tempf\@empty
+ \blx@kv@setkeys{blx@sourcemap@step}{#1}%
+ \eappto\blx@tempe{%
+ \blx@xml@sourcemap@step{\blx@tempf}}}
+
+\blx@kv@defkey{blx@sourcemap@step}{typesource}{% characters
+ \eappto\blx@tempf{ map\string_type\string_source="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{typetarget}{% characters
+ \eappto\blx@tempf{ map\string_type\string_target="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{final}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempf{ map\string_final="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@step}{cited}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempf{ map\string_entrykey\string_cited="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@step}{nocited}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempf{ map\string_entrykey\string_nocited="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@step}{citedornocited}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempf{ map\string_entrykey\string_citedornocited="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@step}{allnocited}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempf{ map\string_entrykey\string_allnocited="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@step}{starnocited}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempf{ map\string_entrykey\string_starnocited="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@step}{fieldsource}{% characters
+ \eappto\blx@tempf{ map\string_field\string_source="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{fieldsourcemsform}{% characters
+ \eappto\blx@tempf{ map\string_field\string_source\string_form="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{fieldsourcemslang}{% characters
+ \eappto\blx@tempf{ map\string_field\string_source\string_lang="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{notfield}{% characters
+ \eappto\blx@tempf{ map\string_notfield="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{fieldtarget}{% characters
+ \eappto\blx@tempf{ map\string_field\string_target="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{fieldtargetmsform}{% characters
+ \eappto\blx@tempf{ map\string_field\string_target\string_form="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{fieldtargetmslang}{% characters
+ \eappto\blx@tempf{ map\string_field\string_target\string_lang="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{fieldset}{% characters
+ \eappto\blx@tempf{ map\string_field\string_set="#1"}}
+% We are sanitising the XML here as it's the value of an attribute which
+% might contain quotes or ampersands (URLs, for example)
+\blx@kv@defkey{blx@sourcemap@step}{fieldvalue}{% characters
+ \blx@xmlsanitizeafter{\def\blx@temps}{#1}%
+ \eappto\blx@tempf{ map\string_field\string_value="\blx@temps"}}
+\blx@kv@defkey{blx@sourcemap@step}{append}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempf{ map\string_append="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@step}{appendstrict}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempf{ map\string_appendstrict="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@step}{null}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempf{ map\string_null="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@step}{entrynull}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempf{ map\string_entry\string_null="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@step}{entrynocite}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempf{ map\string_entry\string_nocite="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@step}{entrynew}{% characters
+ \appto\blx@tempf{ map\string_entry\string_new="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{entrynewtype}{% characters
+ \appto\blx@tempf{ map\string_entry\string_newtype="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{entrytarget}{% characters
+ \appto\blx@tempf{ map\string_entrytarget="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{entryclone}{% characters
+ \appto\blx@tempf{ map\string_entry\string_clone="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{origfield}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempf{ map\string_origfield="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@step}{origfieldval}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempf{ map\string_origfieldval="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@step}{origentrytype}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempf{ map\string_origentrytype="1"}}
+ {}}
+\blx@kv@defkey{blx@sourcemap@step}{match}{% characters
+ \appto\blx@tempf{ map\string_match="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{matchi}{% characters
+ \appto\blx@tempf{ map\string_matchi="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{matches}{% characters
+ \appto\blx@tempf{ map\string_matches="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{matchesi}{% characters
+ \appto\blx@tempf{ map\string_matchesi="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{notmatch}{% characters
+ \appto\blx@tempf{ map\string_notmatch="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{notmatchi}{% characters
+ \appto\blx@tempf{ map\string_notmatchi="#1"}}
+\blx@kv@defkey{blx@sourcemap@step}{replace}{% characters
+ \eappto\blx@tempf{ map\string_replace="#1"}}
+
+% [<specname>]{<spec>}
+\newrobustcmd*{\DeclareLabelalphaNameTemplate}[2][]{%
+ \begingroup
+ \ifblank{#1}
+ {\def\blx@lantname{global}}% default
+ {\def\blx@lantname{#1}}%
+ \let\namepart\blx@lantem@namepart
+ \let\blx@tempa\@empty
+ \blx@tempcnta\z@
+ #2%
+ \global\cslet{blx@labelalphanametemplate@\blx@lantname}\blx@tempa
+ \xifinlist\blx@lantname\blx@lantemplatespecs
+ {}
+ {\listxadd\blx@lantemplatespecs\blx@lantname}%
+ \endgroup}
+\@onlypreamble\DeclareLabelalphaNameTemplate
+\blx@DeclareBackendOption{global}[xml]{labelalphanametemplate}
+\DeclareBiblatexOption{entry,namelist,name}[string]{labelalphanametemplatename}{%
+ \def\blx@refcontext@labelalphanametemplatename{#1}}
+
+\newcommand*{\blx@lantem@namepart}[2][]{%
+ \advance\blx@tempcntb\@ne
+ \edef\blx@tempe{order="\the\blx@tempcntb"}%
+ \let\blx@tempc\@empty
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@lantem@namepart}{#1}}%
+ \eappto\blx@tempa{%
+ \blx@xml@labelalphanametemplatenamepart{\blx@tempe}{\blx@tempc}{#2}}}
+
+\blx@kv@defkey{blx@lantem@namepart}{use}[true]{% use* option for namepart true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ use="1"}}
+ {}}
+
+\blx@kv@defkey{blx@lantem@namepart}{pre}[true]{% pre option for namepart true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ pre="1"}}
+ {}}
+
+\blx@kv@defkey{blx@lantem@namepart}{compound}[true]{% base option for namepart true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ substring\string_compound="1"}}
+ {}}
+
+\blx@kv@defkey{blx@lantem@namepart}{strwidth}{% integer
+ \eappto\blx@tempc{ substring\string_width="#1"}}
+
+\blx@kv@defkey{blx@lantem@field}{strside}{% left|right
+ \ifstrequal{#1}{right}
+ {\eappto\blx@tempc{ substring\string_side="right"}}
+ {\eappto\blx@tempc{ substring\string_side="left"}}}
+
+% [<entrytype>]{<spec>}
+\newrobustcmd*{\DeclareLabelalphaTemplate}[2][]{%
+ \ifblank{#1}
+ {\blx@latem{#2}{global}}
+ {\forcsvlist{\blx@latem{#2}}{#1}}}
+\@onlypreamble\DeclareLabelalphaTemplate
+\blx@DeclareBackendOption{global,type}[xml]{labelalphatemplate}
+
+\def\blx@latem#1#2{%
+ \begingroup
+ \let\labelelement\blx@latem@element
+ \let\field\blx@latem@field
+ \let\literal\blx@latem@literal
+ \blx@tempcnta\z@
+ \let\blx@tempa\@empty
+ #1%
+ \ifdef\blx@latem@type
+ {\ifinlist{#2}\blx@latem@type
+ {\global\cslet{blx@labelalphatemplate@#2}\blx@tempa}
+ {\listgadd\blx@latem@type{#2}%
+ \global\cslet{blx@labelalphatemplate@#2}\blx@tempa}}
+ {\listgadd\blx@latem@type{#2}%
+ \global\cslet{blx@labelalphatemplate@#2}\blx@tempa}%
+ \endgroup}
+
+\newcommand*{\blx@latem@element}[1]{%
+ \advance\blx@tempcnta\@ne
+ \let\blx@tempb\@empty
+ #1%
+ \eappto\blx@tempa{%
+ \blx@xml@labelalpha@element{\the\blx@tempcnta}{\blx@tempb}}}
+
+\newcommand*{\blx@latem@literal}[1]{%
+ \blx@xmlsanitizeafter{\def\blx@temps}{#1}%
+ \eappto\blx@tempb{%
+ \blx@xml@labelalpha@part{}{\expandafter\regexp\expandafter{\blx@temps}}}}
+
+\newcommand*{\blx@latem@field}[2][]{%
+ \let\blx@tempc\@empty
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@latem@field}{#1}}%
+ \eappto\blx@tempb{%
+ \blx@xml@labelalpha@part{\blx@tempc}{#2}}}
+
+\blx@kv@defkey{blx@latem@field}{form}{% string
+ \appto\blx@tempc{ form="#1"}}
+\blx@kv@defkey{blx@latem@field}{lang}{% string
+ \appto\blx@tempc{ lang="#1"}}
+\blx@kv@defkey{blx@latem@field}{uppercase}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ uppercase="1"}}
+ {}}
+\blx@kv@defkey{blx@latem@field}{lowercase}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ lowercase="1"}}
+ {}}
+\blx@kv@defkey{blx@latem@field}{final}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ final="1"}}
+ {}}
+\blx@kv@defkey{blx@latem@field}{strwidth}{% integer
+ \eappto\blx@tempc{ substring\string_width="#1"}}
+\blx@kv@defkey{blx@latem@field}{varwidth}[true]{% "v"
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ substring\string_width="v"}}
+ {}}
+\blx@kv@defkey{blx@latem@field}{varwidthnorm}[true]{% "vf"
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ substring\string_width="vf"}}
+ {}}
+\blx@kv@defkey{blx@latem@field}{varwidthlist}[true]{% "l"
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ substring\string_width="l"}}
+ {}}
+\blx@kv@defkey{blx@latem@field}{strfixedcount}{%
+ \eappto\blx@tempc{ substring\string_fixed\string_threshold="#1"}}
+\blx@kv@defkey{blx@latem@field}{strwidthmax}{%
+ \eappto\blx@tempc{ substring\string_width\string_max="#1"}}
+\blx@kv@defkey{blx@latem@field}{strside}{% left|right
+ \ifstrequal{#1}{right}
+ {\eappto\blx@tempc{ substring\string_side="right"}}
+ {\eappto\blx@tempc{ substring\string_side="left"}}}
+\blx@kv@defkey{blx@latem@field}{namessep}{%
+ \eappto\blx@tempc{ namessep="#1"}}
+\blx@kv@defkey{blx@latem@field}{ifnames}{%
+ \eappto\blx@tempc{ ifnames="#1"}}
+\blx@kv@defkey{blx@latem@field}{names}{%
+ \eappto\blx@tempc{ names="#1"}}
+\blx@kv@defkey{blx@latem@field}{noalphaothers}[true]{%
+ \eappto\blx@tempc{ noalphaothers="1"}}
+\blx@kv@defkey{blx@latem@field}{padchar}{%
+ \blx@xmlsanitizeafter{\def\blx@temps}{#1}%
+ \eappto\blx@tempc{ pad\string_char="\expandafter\regexp\expandafter{\blx@temps}"}}
+\blx@kv@defkey{blx@latem@field}{padside}{% left|right
+ \ifstrequal{#1}{left}
+ {\eappto\blx@tempc{ pad\string_side="left"}}
+ {\eappto\blx@tempc{ pad\string_side="right"}}}
+
+% [<exceptions>]{<options>}
+\newrobustcmd*{\DefaultInheritance}[2][]{%
+ \begingroup
+ \let\blx@tempf\@empty
+ \ifblank{#2}
+ {}
+ {\blx@kv@setkeys{blx@inherit@default}{#2}}%
+ \edef\blx@tempa{\space
+ inherit\string_all="\iftoggle{blx@inherit@all}{true}{false}"\space
+ override\string_target="\iftoggle{blx@inherit@override}{true}{false}"%
+ \blx@tempf}%
+ \let\blx@tempb\@empty
+ \let\except\blx@inherit@except
+ #1%
+ \xdef\blx@inherit@default{%
+ \blx@xml@inherit@defaults{\blx@tempa}{\blx@tempb}}%
+ \endgroup}
+\@onlypreamble\DefaultInheritance
+
+\newtoggle{blx@inherit@all}
+\newtoggle{blx@inherit@override}
+
+\blx@kv@defkey{blx@inherit@default}{all}[true]{% true|false
+ \settoggle{blx@inherit@all}{#1}}
+\blx@kv@defkey{blx@inherit@default}{override}[true]{% true|false
+ \settoggle{blx@inherit@override}{#1}}
+\blx@kv@defkey{blx@inherit@default}{ignore}{% csv list
+ \edef\blx@tempf{ ignore="#1"}}
+
+% {<source>}{<target>}{<options>}
+\newcommand*{\blx@inherit@except}[3]{%
+ \let\blx@tempc\@empty
+ \ifblank{#3}
+ {}
+ {\blx@kv@setkeys{blx@inherit@except}{#3}}%
+ \eappto\blx@tempb{%
+ \blx@xml@inherit@type{#1}{#2}{\blx@tempc}}}
+
+\blx@kv@defkey{blx@inherit@except}{all}[true]{% true|false
+ \eappto\blx@tempc{ inherit\string_all="#1"}}
+\blx@kv@defkey{blx@inherit@except}{override}[true]{% true|false
+ \eappto\blx@tempc{ override\string_target="#1"}}
+\blx@kv@defkey{blx@inherit@except}{ignore}{% csv list
+ \eappto\blx@tempc{ ignore="#1"}}
+
+% {<type,type,...>}{<type,type,...>}{<spec>}
+\newrobustcmd*{\DeclareDataInheritance}[4][]{%
+ \begingroup
+ \let\blx@tempa\@empty
+ \let\blx@tempf\@empty
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@inherit}{#1}}%
+ \forcsvlist{\blx@inherit@i{#3}}{#2}%
+ \let\blx@tempb\@empty
+ \let\inherit\blx@inherit@field
+ \let\noinherit\blx@inherit@block
+ #4%
+ \xappto\blx@inherit@data{%
+ \blx@xml@inherit@data{\blx@tempf}{%
+ \blx@tempa
+ \blx@tempb}}%
+ \endgroup}
+\@onlypreamble\DeclareDataInheritance
+
+\def\blx@inherit@i#1#2{%
+ \forcsvlist{\blx@inherit@ii{#2}}{#1}}
+
+\def\blx@inherit@ii#1#2{%
+ \eappto\blx@tempa{\blx@xml@inherit@type{#1}{#2}{}}}
+
+\blx@DeclareBackendOption{global}[xml]{inheritance}
+
+% [<options>]{<source>}{<target>}
+\newcommand*{\blx@inherit@field}[3][]{%
+ \let\blx@tempc\@empty
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@inherit@field}{#1}}%
+ \eappto\blx@tempb{%
+ \blx@xml@inherit@field{#2}{#3}{\blx@tempc}}}
+
+\newcommand*{\blx@inherit@block}[1]{%
+ \eappto\blx@tempb{\blx@xml@inherit@block{#1}}}
+
+\blx@kv@defkey{blx@inherit}{ignore}{% csv list
+ \edef\blx@tempf{ ignore="#1"}}
+
+\blx@kv@defkey{blx@inherit@field}{override}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\edef\blx@tempc{ override\string_target="true"}}
+ {\edef\blx@tempc{ override\string_target="false"}}}
+
+\newrobustcmd*{\ResetDataInheritance}{%
+ \global\csundef{blx@inherit@data}}
+\@onlypreamble\ResetDataInheritance
+
+% {<name>}{<spec>}
+\newrobustcmd*{\DeclareBiblistFilter}[2]{%
+ \begingroup
+ \let\filteror\blx@biblistfilteror
+ \let\filter\blx@biblistfilter
+ \let\blx@tempa\@empty
+ #2%
+ \global\cslet{blx@biblistfilters@#1}\blx@tempa
+ \endgroup}
+\@onlypreamble\DeclareBiblistFilter
+
+\newcommand*{\blx@biblistfilteror}[1]{%
+ \eappto\blx@tempa{\blx@xml@dlistfilterorbegin}%
+ #1%
+ \eappto\blx@tempa{\blx@xml@dlistfilterorend}}
+
+\newcommand*{\blx@biblistfilter}[1][2]{%
+ \let\blx@tempc\@empty
+ \let\blx@tempd\@empty
+ \blx@kv@setkeys{blx@biblistfilter@filter}{#1}%
+ \eappto\blx@tempa{%
+ \blx@xml@dlistfilter{\blx@tempc}{\blx@tempd}}}
+
+\blx@kv@defkey{blx@biblistfilter@filter}{type}{%
+ \def\blx@tempc{#1}}
+\blx@kv@defkey{blx@biblistfilter@filter}{filter}{%
+ \def\blx@tempd{#1}}
+
+% Predefine filters for label fields
+\def\do#1{\DeclareBiblistFilter{#1}{\filter[type=field,filter=#1]}}
+\abx@dolabelfields
+
+\blx@kv@defkey{blx@biblist1}{biblistfilter}{\blx@key@biblistfilter{#1}}
+\blx@kv@defkey{blx@biblist2}{biblistfilter}{}
+
+\def\blx@key@biblistfilter#1{%
+ \ifcsundef{blx@biblistfilters@#1}
+ {\blx@error
+ {BiblistFilter '#1' not found}
+ {The BiblistFilter '#1' could not be found.\MessageBreak
+ Use '\string\DeclareBiblistFilter' to define it}}
+ {\def\blx@thebiblistfilter{#1}}}
+
+% [<entrytype>]{specification}
+\newrobustcmd*{\DeclareSortTranslit}[2][]{%
+ \begingroup
+ \ifblank{#1}
+ {\def\blx@tempa{*}}
+ {\def\blx@tempa{#1}}%
+ \let\translit\blx@translit@setup
+ \let\blx@tempb\@empty
+ #2%
+ \global\cslet{blx@translit@\blx@tempa}\blx@tempb
+ \xifinlist\blx@tempa\blx@translits
+ {}
+ {\listxadd\blx@translits\blx@tempa}%
+ \endgroup}
+\@onlypreamble\DeclareSortTranslit
+\blx@DeclareBackendOption{global,type}[xml]{translit}
+
+% [<langids>]{<field or set>}{translitsource}{translittarget}
+\newcommand*{\blx@translit@setup}[4][]{%
+ \eappto\blx@tempb{%
+ \ifblank{#1}
+ {\blx@xml@translit{}{#2}{#3}{#4}}
+ {\blx@xml@translit{langids="#1" }{#2}{#3}{#4}}}}
+
+% [<specname>]{<spec>}
+\newrobustcmd*{\DeclareUniquenameTemplate}[2][]{%
+ \begingroup
+ \ifblank{#1}
+ {\def\blx@untname{global}}% default
+ {\def\blx@untname{#1}}%
+ \let\namepart\blx@untemp@namepart
+ \let\blx@tempa\@empty
+ \blx@tempcnta\z@
+ #2%
+ \global\cslet{blx@uniquenametemplate@\blx@untname}\blx@tempa
+ \xifinlist\blx@untname\blx@untemplatespecs
+ {}
+ {\listxadd\blx@untemplatespecs\blx@untname}%
+ \endgroup}
+\@onlypreamble\DeclareUniquenameTemplate
+\blx@DeclareBackendOption{global}[xml]{uniquenametemplate}
+\DeclareBiblatexOption{entry,namelist,name}[string]{uniquenametemplatename}{%
+ \def\blx@refcontext@uniquenametemplatename{#1}}
+
+\newcommand*{\blx@untemp@namepart}[2][]{%
+ \advance\blx@tempcntb\@ne
+ \edef\blx@tempe{order="\the\blx@tempcntb"}%
+ \let\blx@tempc\@empty
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@untemp@namepart}{#1}}%
+ \eappto\blx@tempa{%
+ \blx@xml@uniquenametemplatenamepart{\blx@tempe}{\blx@tempc}{#2}}}
+
+\blx@kv@defkey{blx@untemp@namepart}{use}[true]{% use* option for namepart true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ use="1"}}
+ {}}
+
+\blx@kv@defkey{blx@untemp@namepart}{base}[true]{% base option for namepart true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ base="1"}}
+ {}}
+
+\blx@kv@defkey{blx@untemp@namepart}{disambiguation}{% disambiguation option for namepart none|inits|full|fullonly
+ \appto\blx@tempc{ disambiguation="#1"}}
+
+% [<templatename>]{<template>}
+\newrobustcmd*{\DeclareSortingNamekeyTemplate}[2][]{%
+ \begingroup
+ \ifblank{#1}
+ {\def\blx@snkname{global}}% default
+ {\def\blx@snkname{#1}}%
+ \let\namepart\blx@sortnk@namepart
+ \let\keypart\blx@sortnk@keypart
+ \let\literal\blx@sortnk@literal
+ \let\visibility\blx@sortnk@visibility
+ \csgdef{blx@sortingnamekeytemplatesvisibility@\blx@snkname}{sort}% default
+ \let\blx@tempa\@empty
+ \blx@tempcnta\z@
+ #2%
+ \global\cslet{blx@sortingnamekeytemplate@\blx@snkname}\blx@tempa
+ \xifinlist\blx@snkname\blx@sortingnamekeytemplates
+ {}
+ {\listxadd\blx@sortingnamekeytemplates\blx@snkname}%
+ \endgroup}
+\@onlypreamble\DeclareSortingNamekeyTemplate
+\blx@DeclareBackendOption{global}[xml]{sortingnamekeytemplate}
+\DeclareBiblatexOption{entry,namelist,name}[string]{sortingnamekeytemplatename}{%
+ \def\blx@refcontext@sortingnamekeytemplatename{#1}}
+
+% User-mode macro for checking sorting name template options
+\def\ifuniquenametemplatename#1{%
+ \expandafter\ifstrequal\expandafter{\blx@refcontext@uniquenametemplatename}{#1}}
+\def\iflabelalphanametemplatename#1{%
+ \expandafter\ifstrequal\expandafter{\blx@refcontext@labelalphanametemplatename}{#1}}
+\def\ifsortingnamekeytemplatename#1{%
+ \expandafter\ifstrequal\expandafter{\blx@refcontext@sortingnamekeytemplatename}{#1}}
+
+\newcommand*{\blx@sortnk@keypart}[1]{%
+ \advance\blx@tempcnta\@ne
+ \blx@tempcntb\z@
+ \edef\blx@tempd{ order="\the\blx@tempcnta"}%
+ \let\blx@tempb\@empty
+ #1%
+ \eappto\blx@tempa{%
+ \blx@xml@sortingnamekeykeypart{\blx@tempd}{\blx@tempb}}}
+
+\newcommand*{\blx@sortnk@literal}[1]{%
+ \advance\blx@tempcntb\@ne
+ \edef\blx@tempe{ order="\the\blx@tempcntb"}%
+ \let\blx@tempc\@empty
+ \eappto\blx@tempb{%
+ \blx@xml@sortingnamekeyliteral{\blx@tempe}{#1}}}
+
+\newcommand*{\blx@sortnk@visibility}[1]{%
+ \csgdef{blx@sortingnamekeytemplatesvisibility@\blx@snkname}{#1}}
+
+\newcommand*{\blx@sortnk@namepart}[2][]{%
+ \advance\blx@tempcntb\@ne
+ \edef\blx@tempe{ order="\the\blx@tempcntb"}%
+ \let\blx@tempc\@empty
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@sortnk@namepart}{#1}}%
+ \eappto\blx@tempb{%
+ \blx@xml@sortingnamekeynamepart{\blx@tempe}{\blx@tempc}{#2}}}
+
+\blx@kv@defkey{blx@sortnk@namepart}{use}[true]{% use* option for namepart true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ use="1"}}
+ {\appto\blx@tempc{ use="0"}}}
+
+\blx@kv@defkey{blx@sortnk@namepart}{inits}[true]{% initials only option for namepart true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ inits="1"}}
+ {\appto\blx@tempc{ inits="0"}}}
+
+% [options]{<templatename>}{<template>}
+\newrobustcmd*{\DeclareSortingTemplate}[3][]{%
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@sortdef@sorting}{#1}%
+ \csxdef{blx@sortdef@locale@#2}{\blx@templ}}%
+ \begingroup
+ \def\name{%LEGACY(<2.0)
+ \blx@warning@noline{%
+ '\string\name' is deprecated in sorting specifications, please use '\string\field'}%
+ \blx@sortdef@field}%
+ \def\list{%LEGACY(<2.0)
+ \blx@warning@noline{%
+ '\string\list' is deprecated in sorting specifications, please use '\string\field'}%
+ \blx@sortdef@field}%
+ \let\sort\blx@sortdef@sort
+ \let\field\blx@sortdef@field
+ \let\literal\blx@sortdef@literal
+ \global\csundef{blx@sortingtemplate@citeorder@relevant@#2}%
+ \def\citeorder{%
+ \global\cslet{blx@sortingtemplate@citeorder@relevant@#2}\@empty
+ \blx@sortdef@field{citeorder}}%
+ \def\intciteorder{%
+ \blx@sortdef@field{intciteorder}}%
+ \def\citecount{%
+ \blx@sortdef@field{citecount}}%
+ \blx@tempcnta\z@
+ \let\blx@tempa\@empty
+ #3%
+ \global\cslet{blx@sortingtemplate@#2}\blx@tempa
+ \endgroup}
+\@onlypreamble\DeclareSortingTemplate
+\blx@DeclareBackendOption{global}[xml]{sortingtemplate}
+
+\blx@kv@defkey{blx@sortdef@sorting}{locale}{% locale name
+ \def\blx@templ{#1}}
+
+\newcommand*{\blx@sortdef@sort}[2][]{%
+ \advance\blx@tempcnta\@ne
+ \blx@tempcntb\z@
+ \let\blx@tempb\@empty
+ \edef\blx@tempc{order="\the\blx@tempcnta"}%
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@sortdef@sort}{#1}}%
+ \let\do\@firstofone
+ #2%
+ \eappto\blx@tempa{%
+ \blx@xml@sort{\blx@tempc}{\blx@tempb}}}
+
+\blx@kv@defkey{blx@sortdef@sort}{locale}{% locale name
+ \eappto\blx@tempc{ locale="#1"}}
+\blx@kv@defkey{blx@sortdef@sort}{direction}{% ascending|descending
+ \ifstrequal{#1}{ascending}
+ {\eappto\blx@tempc{ sort\string_direction="ascending"}}
+ {\eappto\blx@tempc{ sort\string_direction="descending"}}}
+\blx@kv@defkey{blx@sortdef@sort}{final}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ final="1"}}
+ {}}
+\blx@kv@defkey{blx@sortdef@sort}{sortcase}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ sortcase="1"}}
+ {\appto\blx@tempc{ sortcase="0"}}}
+\blx@kv@defkey{blx@sortdef@sort}{sortupper}[true]{% true|false
+ \ifstrequal{#1}{true}
+ {\appto\blx@tempc{ sortupper="1"}}
+ {\appto\blx@tempc{ sortupper="0"}}}
+
+\newcommand*{\blx@sortdef@field}[2][]{%
+ \advance\blx@tempcntb\@ne
+ \edef\blx@tempd{order="\the\blx@tempcntb"}%
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@sortdef@field}{#1}}%
+ \eappto\blx@tempb{%
+ \blx@xml@sortitem{\blx@tempd}{#2}}}
+
+\blx@kv@defkey{blx@sortdef@field}{form}{% string
+ \eappto\blx@tempd{ form="#1"}}
+\blx@kv@defkey{blx@sortdef@field}{lang}{% string
+ \eappto\blx@tempd{ lang="#1"}}
+\blx@kv@defkey{blx@sortdef@field}{padside}{% left|right
+ \ifstrequal{#1}{right}
+ {\eappto\blx@tempd{ pad\string_side="right"}}
+ {\eappto\blx@tempd{ pad\string_side="left"}}}
+\blx@kv@defkey{blx@sortdef@field}{padwidth}{% integer
+ \eappto\blx@tempd{ pad\string_width="#1"}}
+\blx@kv@defkey{blx@sortdef@field}{padchar}{% character
+ \blx@xmlsanitizeafter{\def\blx@tempe}{#1}%
+ \eappto\blx@tempd{ pad\string_char="\blx@tempe"}}
+\blx@kv@defkey{blx@sortdef@field}{strside}{% left|right
+ \ifstrequal{#1}{right}
+ {\eappto\blx@tempd{ substring\string_side="right"}}
+ {\eappto\blx@tempd{ substring\string_side="left"}}}
+\blx@kv@defkey{blx@sortdef@field}{strwidth}{% integer
+ \eappto\blx@tempd{ substring\string_width="#1"}}
+
+\def\blx@sortdef@literal#1{%
+ \advance\blx@tempcntb\@ne
+ \blx@xmlsanitizeafter{\def\blx@tempe}{#1}%
+ \eappto\blx@tempb{%
+ \blx@xml@sortitem{literal="1" order="\the\blx@tempcntb"}{\blx@tempe}}}
+
+% [<type,type,...>]{<string>}
+\newrobustcmd*{\DeclarePresort}[2][]{%
+ \begingroup
+ \blx@xmlsanitizeafter{\def\blx@tempa}{#2}%
+ \ifblank{#1}
+ {\xdef\blx@bcf@presort{\blx@xml@presort{}{\blx@tempa}}}
+ {\notblank{#2}
+ {\forcsvlist{\blx@defpresort\blx@tempa}{#1}}
+ {\forcsvlist\blx@undefpresort{#1}}}%
+ \endgroup}
+\@onlypreamble\DeclarePresort
+\blx@DeclareBackendOption{global,type,entry}[string]{presort}
+
+\def\blx@defpresort#1#2{%
+ \csxdef{blx@bcf@presort@#2}{\blx@xml@presort{#2}{#1}}}
+\def\blx@undefpresort#1{%
+ \global\csundef{blx@bcf@presort@#1}}
+
+% {<entrytype,...>}{<field,...>}
+\newrobustcmd*{\DeclareSortExclusion}[2]{%
+ \forcsvlist{\blx@sortexclude{#2}}{#1}}
+\blx@DeclareBackendOption{type}[xml]{sortexclusion}
+
+% {<field>}{<entrytype>}
+\def\blx@sortexclude#1#2{%
+ \begingroup
+ \ifblank{#1}
+ {\global\csundef{blx@bcf@exclude@#2}}
+ {\let\blx@tempa\@empty
+ \forcsvlist\blx@sortexclude@i{#1}%
+ \csxdef{blx@bcf@exclude@#2}{%
+ \blx@xml@sortexclude{#2}{\blx@tempa}}}
+ \endgroup}
+
+\def\blx@sortexclude@i#1{%
+ \appto\blx@tempa{\blx@xml@exclude{#1}}}
+
+% {<entrytype,...>}{<field,...>}
+\newrobustcmd*{\DeclareSortInclusion}[2]{%
+ \forcsvlist{\blx@sortinclude{#2}}{#1}}
+\blx@DeclareBackendOption{type}[xml]{sortinclusion}
+
+% {<field>}{<entrytype>}
+\def\blx@sortinclude#1#2{%
+ \begingroup
+ \ifblank{#1}
+ {\global\csundef{blx@bcf@include@#2}}
+ {\let\blx@tempa\@empty
+ \forcsvlist\blx@sortinclude@i{#1}%
+ \csxdef{blx@bcf@include@#2}{%
+ \blx@xml@sortinclude{#2}{\blx@tempa}}}
+ \endgroup}
+
+\def\blx@sortinclude@i#1{%
+ \appto\blx@tempa{\blx@xml@include{#1}}}
+
+% {<field,field,...>}
+\newrobustcmd*{\DeclareExtradate}[1]{%
+ \begingroup
+ \let\blx@tempa\@empty
+ \let\scope\blx@extradate@scope
+ #1%
+ \global\let\blx@bcf@extradatespec\blx@tempa
+ \endgroup}
+\@onlypreamble\DeclareExtradate
+\blx@DeclareBackendOption{global}[xml]{extradatespec}
+
+\newrobustcmd*{\blx@extradate@scope}[1]{%
+ \let\blx@tempb\@empty
+ \let\field\blx@ordereded@field
+ #1%
+ \csxappto{blx@tempa}{%
+ \noexpand\blx@xml@extradatescope{\blx@tempb}}}
+
+\newcommand*{\blx@ordereded@field}[1]{%
+ \advance\blx@tempcnta\@ne
+ \csxappto{blx@tempb}{%
+ \noexpand\blx@xml@edordered{\the\blx@tempcnta}{#1}}}
+
+% [<type,type,...>]{<field,field,...>}
+\newrobustcmd*{\DeclareExtradateContext}[2][]{%
+ \begingroup
+ \let\blx@tempa\@empty
+ \def\blx@tempb{extradatecontext}%
+ \let\field\blx@ordered@field
+ \ifblank{#1}
+ {\global\cslet{blx@bcf@extradatecontext}\@empty}
+ {\def\blx@tempa{#1}%
+ \def\do##1{\global\cslet{blx@bcf@extradatecontext@##1}\@empty}%
+ \expandafter\docsvlist\expandafter{#1}}%
+ #2%
+ \endgroup}
+\@onlypreamble\DeclareExtradateContext
+\blx@DeclareBackendOption{global,type}[xml]{extradatecontext}
+
+\newrobustcmd*{\DeclareLabelname}[2][]{%
+ \begingroup
+ \let\blx@tempa\@empty
+ \def\blx@tempb{labelnamespec}%
+ \let\field\blx@ordered@field
+ \ifblank{#1}
+ {\global\cslet{blx@bcf@labelnamespec}\@empty}
+ {\def\blx@tempa{#1}%
+ \def\do##1{\global\cslet{blx@bcf@labelnamespec@##1}\@empty}%
+ \expandafter\docsvlist\expandafter{#1}}%
+ #2%
+ \endgroup}
+\@onlypreamble\DeclareLabelname
+\blx@DeclareBackendOption{global,type}[xml]{labelnamespec}
+
+\newrobustcmd*{\DeclareLabeltitle}[2][]{%
+ \begingroup
+ \let\blx@tempa\@empty
+ \def\blx@tempb{labeltitlespec}%
+ \let\field\blx@ordered@field
+ \ifblank{#1}
+ {\global\cslet{blx@bcf@labeltitlespec}\@empty}
+ {\def\blx@tempa{#1}%
+ \def\do##1{\global\cslet{blx@bcf@labeltitlespec@##1}\@empty}%
+ \expandafter\docsvlist\expandafter{#1}}%
+ #2%
+ \endgroup}
+\@onlypreamble\DeclareLabeltitle
+\blx@DeclareBackendOption{global,type}[xml]{labeltitlespec}
+
+\newrobustcmd*{\DeclareLabeldate}[2][]{%
+ \begingroup
+ \let\blx@tempa\@empty
+ \def\blx@tempb{labeldatespec}%
+ \let\field\blx@orderedld@field
+ \let\literal\blx@orderedld@literal
+ \ifblank{#1}
+ {\global\cslet{blx@bcf@labeldatespec}\@empty}
+ {\def\blx@tempa{#1}%
+ \def\do##1{\global\cslet{blx@bcf@labeldatespec@##1}\@empty}%
+ \expandafter\docsvlist\expandafter{#1}}%
+ #2%
+ \endgroup}
+\@onlypreamble\DeclareLabeldate
+\blx@DeclareBackendOption{global,type}[xml]{labeldatespec}
+
+\blx@kv@defkey{blx@ordered@field}{form}{% string
+ \appto\blx@tempc{ form="#1"}}
+\blx@kv@defkey{blx@ordered@field}{lang}{% string
+ \appto\blx@tempc{ lang="#1"}}
+
+\newcommand*{\blx@ordered@field}[2][]{%
+ \let\blx@tempc\@empty
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@ordered@field}{#1}}%
+ \advance\blx@tempcnta\@ne
+ \ifdefempty{\blx@tempa}
+ {\csxappto{blx@bcf@\blx@tempb}{%
+ \noexpand\blx@xml@ordered{\the\blx@tempcnta}{\blx@tempc}{#2}}}
+ {\def\do##1{%
+ \blx@addtypeopt{##1}%
+ \csxappto{blx@bcf@\blx@tempb @##1}{%
+ \noexpand\blx@xml@ordered{\the\blx@tempcnta}{\blx@tempc}{#2}}}%
+ \expandafter\docsvlist\expandafter{\blx@tempa}}}
+
+\newcommand*{\blx@orderedld@field}[2][]{%
+ \let\blx@tempc\@empty
+ \ifblank{#1}
+ {}
+ {\blx@kv@setkeys{blx@ordered@field}{#1}}%
+ \advance\blx@tempcnta\@ne
+ \ifdefempty{\blx@tempa}
+ {\csxappto{blx@bcf@\blx@tempb}{%
+ \noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="field"\blx@tempc}{#2}}}
+ {\def\do##1{%
+ \blx@addtypeopt{##1}%
+ \csxappto{blx@bcf@\blx@tempb @##1}{%
+ \noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="field"\blx@tempc}{#2}}}%
+ \expandafter\docsvlist\expandafter{\blx@tempa}}}
+
+\newcommand*{\blx@orderedld@literal}[1]{%
+ \advance\blx@tempcnta\@ne
+ \ifdefempty{\blx@tempa}
+ {\csxappto{blx@bcf@\blx@tempb}{%
+ \noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="string"}{#1}}}
+ {\def\do##1{%
+ \blx@addtypeopt{##1}%
+ \csxappto{blx@bcf@\blx@tempb @##1}{%
+ \noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="string"}{#1}}}%
+ \expandafter\docsvlist\expandafter{\blx@tempa}}}
+
+%% Package options
+
+% [<entrytype,entrytype,...>]{<options>}
+
+\newrobustcmd*{\ExecuteBibliographyOptions}[2][]{%
+ \ifblank{#1}
+ {\blx@kv@setkeys{blx@opt@pre}{#2}}
+ {\forcsvlist{\blx@typeoptions{#2}}{#1}}}
+\@onlypreamble\ExecuteBibliographyOptions
+
+\def\blx@typeoptions#1#2{%
+ \blx@addtypeopt{#2}%
+ \csappto{blx@opts@type@#2}{#1,}}
+
+\def\blx@addtypeopt#1{%
+ \notblank{#1}
+ {\ifdef\blx@opts@type
+ {\ifinlist{#1}\blx@opts@type
+ {}
+ {\listgadd\blx@opts@type{#1}}}
+ {\listgadd\blx@opts@type{#1}}}
+ {}}
+
+% load-time only
+
+% Have to have a dummy for this as it's set much earlier but is passed
+% through to here where we just ignore it
+\blx@kv@defkey{blx@opt@ldt}{datamodel}{}
+
+\blx@kv@defkey{blx@opt@ldt}{backend}{%
+ \ifstrequal{#1}{biber}
+ {}
+ {\ifboolexpr{
+ test {\ifstrequal{#1}{bibtex}}
+ or
+ test {\ifstrequal{#1}{bibtex8}}}
+ {\settoggle{blx@bibtex}{true}%
+ \newtoggle{blx@bibtex8}%
+ \ifstrequal{#1}{bibtex8}
+ {\settoggle{blx@bibtex8}{true}}
+ {}}%
+ {\blx@err@invopt{backend=#1}{}}}}
+
+\blx@kv@defkey{blx@opt@ldt}{style}{%
+ \def\blx@cbxfile{#1}%
+ \def\blx@bbxfile{#1}}
+
+\blx@kv@defkey{blx@opt@ldt}{bibstyle}{%
+ \def\blx@bbxfile{#1}}
+
+\blx@kv@defkey{blx@opt@ldt}{citestyle}{%
+ \def\blx@cbxfile{#1}}
+
+\blx@kv@defkey{blx@opt@ldt}{natbib}[true]{%
+ \settoggle{blx@natbib}{#1}}
+
+\blx@kv@defkey{blx@opt@ldt}{mcite}[true]{%
+ \settoggle{blx@mcite}{#1}}
+
+\blx@kv@defkey{blx@opt@ldt}{noerroretextools}[true]{%
+ \blx@warning@noline{%
+ The option 'noerroretextools' is deprecated.\MessageBreak
+ Define the control sequence '\string\blx@noerroretextools'\MessageBreak
+ before loading biblatex instead}%
+ \ifstrequal{#1}{true}
+ {\global\cslet{blx@noerroretextools}\@empty}
+ {\global\csundef{blx@noerroretextools}}}
+
+% load-time and preamble
+
+\DeclareBibliographyOption[boolean]{debug}[true]{%
+ \settoggle{blx@debug}{#1}}
+
+\DeclareBibliographyOption[boolean]{loadfiles}[true]{%
+ \settoggle{blx@loadfiles}{#1}}
+
+\DeclareBibliographyOption[integer]{mincrossrefs}{%
+ \ifnum#1<\z@
+ \def\blx@mincrossrefs{1}%
+ \else
+ \def\blx@mincrossrefs{#1}%
+ \fi}
+
+\DeclareBibliographyOption[integer]{minxrefs}{%
+ \ifnum#1<\z@
+ \def\blx@minxrefs{1}%
+ \else
+ \def\blx@minxrefs{#1}%
+ \fi}
+\def\blx@minxrefs{2}
+
+\DeclareBibliographyOption[string]{texencoding}{%
+ \ifstrequal{#1}{auto}
+ {\undef\blx@texencoding@fromoption}
+ {\def\blx@texencoding@fromoption{#1}}}
+
+\DeclareBibliographyOption[string]{bibencoding}{%
+ \ifcsdef{blx@bibenc@#1}
+ {\letcs\blx@bibencoding{blx@bibenc@#1}}
+ {\def\blx@bibencoding{#1}}}
+
+\def\abx@mapbibenc#1#2{\csdef{blx@bibenc@#1}{#2}}
+\abx@mapbibenc{inputenc}{auto}
+\abx@mapbibenc{x-ascii}{ascii}
+
+\def\abx@mapinpenc#1#2{\csdef{blx@inpenc@#1}{#2}}
+\abx@mapinpenc{utf8x}{utf8}
+\abx@mapinpenc{lutf8}{utf8}
+\abx@mapinpenc{x-ascii}{ascii}
+
+\DeclareBibliographyOption[boolean]{safeinputenc}[true]{%
+ \settoggle{blx@safeinputenc}{#1}}
+\newtoggle{blx@safeinputenc}
+
+% global "sorting" option becomes "sortingtemplatename" in the .bcf and so
+% don't use \DeclareBibliographyOption. This is a legacy naming issue
+% unlikely to be corrected as "sorting" is an obvious name for biblatex users
+% "sorting" is used in the .bcf for the actual sorting template definitions and is
+% an XML format option
+\blx@kv@defkey{blx@opt@pre}{sorting}{%
+ \def\blx@sorting{#1}%
+ \def\blx@refcontext@sortingtemplatename{#1}}
+\blx@DeclareBackendOption{global}[string]{sortingtemplatename}
+
+\AtEndPreamble{%
+ \ifcsdef{blx@sortingtemplate@\blx@sorting}
+ {}
+ {\blx@err@invopt{sorting=\blx@sorting}{}%
+ \def\blx@sorting{nty}%
+ \def\blx@refcontext@sortingtemplatename{nty}}%
+ \listxadd\blx@sortingtemplatenames\blx@sorting
+ \def\blx@refcontext@sortingnamekeytemplatename{global}%
+ \let\blx@refcontext@labelprefix\@empty
+ \let\blx@refcontext@labelprefix@real\@empty
+ \def\blx@refcontext@uniquenametemplatename{global}%
+ \def\blx@refcontext@labelalphanametemplatename{global}%
+ \blx@xdef@refcontext{%
+ \blx@refcontext@sortingtemplatename/%
+ \blx@refcontext@sortingnamekeytemplatename/%
+ \blx@refcontext@labelprefix/%
+ \blx@refcontext@uniquenametemplatename/%
+ \blx@refcontext@labelalphanametemplatename}%
+ \listxadd\blx@refcontexts\blx@refcontext@context}
+
+\DeclareBibliographyOption[boolean]{sortcase}[true]{%
+ \settoggle{blx@sortcase}{#1}}
+
+\DeclareBibliographyOption[boolean]{sortupper}[true]{%
+ \settoggle{blx@sortupper}{#1}}
+
+\DeclareBiblatexOption{global,type}[integer]{maxnames}{%
+ \numdef\blx@maxcitenames{#1}%
+ \numdef\blx@maxbibnames{#1}%
+ \numdef\blx@maxsortnames{#1}%
+ \c@maxnames#1\relax}
+\DeclareBiblatexOption{global,type}[integer]{minnames}{%
+ \numdef\blx@mincitenames{#1}%
+ \numdef\blx@minbibnames{#1}%
+ \numdef\blx@minsortnames{#1}%
+ \c@minnames#1\relax}
+% the per-entry option is resolved by Biber directly
+\blx@DeclareBackendOption{entry}[integer]{maxnames}
+\blx@DeclareBackendOption{entry}[integer]{minnames}
+\gdef\blx@bcf@backendin@entry@maxnames{maxcitenames,maxbibnames,maxsortnames}%
+\gdef\blx@bcf@backendin@entry@minnames{mincitenames,minbibnames,minsortnames}%
+
+
+\DeclareBiblatexOption{global,type,entry}[integer]{maxbibnames}{%
+ \numdef\blx@maxbibnames{#1}%
+ \numdef\blx@maxsortnames{#1}%
+ \iftoggle{blx@bibliography}
+ {\c@maxnames#1\relax}
+ {}}
+\DeclareBiblatexOption{global,type,entry}[integer]{minbibnames}{%
+ \numdef\blx@minbibnames{#1}%
+ \numdef\blx@minsortnames{#1}%
+ \iftoggle{blx@bibliography}
+ {\c@minnames#1\relax}
+ {}}
+
+\DeclareBiblatexOption{global,type,entry}[integer]{maxcitenames}{%
+ \numdef\blx@maxcitenames{#1}%
+ \iftoggle{blx@bibliography}
+ {}
+ {\c@maxnames#1\relax}}
+\DeclareBiblatexOption{global,type,entry}[integer]{mincitenames}{%
+ \numdef\blx@mincitenames{#1}%
+ \iftoggle{blx@bibliography}
+ {}
+ {\c@minnames#1\relax}}
+
+\DeclareBiblatexOption{global,type,entry}[integer]{maxsortnames}{%
+ \numdef\blx@maxsortnames{#1}}
+\DeclareBiblatexOption{global,type,entry}[integer]{minsortnames}{%
+ \numdef\blx@minsortnames{#1}}
+
+\appto\blx@checkoptions@global{%
+ \blx@maxmin@num{maxbibnames}{minbibnames}\blx@maxbibnames\blx@minbibnames
+ \blx@maxmin@num{maxcitenames}{mincitenames}\blx@maxcitenames\blx@mincitenames
+ \blx@maxmin@num{maxsortnames}{minsortnames}\blx@maxsortnames\blx@minsortnames}
+\appto\blx@checkoptions@type{%
+ \blx@maxmin@num{maxbibnames}{minbibnames}\blx@maxbibnames\blx@minbibnames
+ \blx@maxmin@num{maxcitenames}{mincitenames}\blx@maxcitenames\blx@mincitenames
+ \blx@maxmin@num{maxsortnames}{minsortnames}\blx@maxsortnames\blx@minsortnames}
+\appto\blx@checkoptions@entry{%
+ \blx@maxmin@cnt{maxnames}{minnames}\c@maxnames\c@minnames}
+
+\DeclareBiblatexOption{global,type,entry}[integer]{maxitems}{%
+ \numdef\blx@maxitems{#1}%
+ \c@maxitems#1\relax}
+\DeclareBiblatexOption{global,type,entry}[integer]{minitems}{%
+ \numdef\blx@minitems{#1}%
+ \c@minitems#1\relax}
+
+\appto\blx@checkoptions@global{%
+ \blx@maxmin@num{maxitems}{minitems}\blx@maxitems\blx@minitems}
+\appto\blx@checkoptions@type{%
+ \blx@maxmin@num{maxitems}{minitems}\blx@maxitems\blx@minitems}
+\appto\blx@checkoptions@entry{%
+ \blx@maxmin@cnt{maxitems}{minitems}\c@maxitems\blx@minitems}
+
+\DeclareBiblatexOption{global,type,entry}[integer]{maxalphanames}{%
+ \numdef\blx@maxalphanames{#1}}
+\DeclareBiblatexOption{global,type,entry}[integer]{minalphanames}{%
+ \numdef\blx@minalphanames{#1}}
+
+\appto\blx@checkoptions@global{%
+ \blx@maxmin@num{maxalphanames}{minalphanames}\blx@maxalphanames\blx@minalphanames}
+\appto\blx@checkoptions@type{%
+ \blx@maxmin@num{maxalphanames}{minalphanames}\blx@maxalphanames\blx@minalphanames}
+
+\def\blx@maxmin@num#1#2#3#4{%
+ \ifnumless#3\@ne
+ {\blx@err@invopt{#1=#3}{'#1' must be greater than zero}%
+ \let#3\@ne}
+ {}%
+ \ifnumless#4\@ne
+ {\blx@err@invopt{#2=#4}{'#2' must be greater than zero}%
+ \let#4\@ne}
+ {}%
+ \ifnumless#3#4
+ {\blx@err@confopt{#1/#2}{'#1' must be greater than or equal to '#2'}%
+ \let#3#4}
+ {}}
+
+\def\blx@maxmin@cnt#1#2#3#4{%
+ \ifnumless#3\@ne
+ {\blx@err@invopt{#1=\number#3}{'#1' must be greater than zero}%
+ #3\@ne}
+ {}%
+ \ifnumless#4\@ne
+ {\blx@err@invopt{#2=\number#4}{'#2' must be greater than zero}%
+ #4\@ne}
+ {}%
+ \ifnumless#3#4
+ {\blx@err@confopt{#1/#2}{'#1' must be greater than or equal to '#2'}%
+ #3=#4}
+ {}}
+
+\DeclareBiblatexOption{global,type,entry,namelist,name}[boolean]{terseinits}[true]{%
+ \ifstrequal{#1}{true}
+ {\toggletrue{blx@terseinits}
+ \renewrobustcmd*{\bibinitperiod}{}
+ \renewrobustcmd*{\bibinitdelim}{}
+ \renewrobustcmd*{\bibinithyphendelim}{}}
+ {\togglefalse{blx@terseinits}
+ \renewrobustcmd*{\bibinitperiod}{\adddot}
+ \renewrobustcmd*{\bibinitdelim}{\addnbspace}
+ \renewrobustcmd*{\bibinithyphendelim}{\adddot\mbox{-}}}}
+
+\DeclareBiblatexOption{global,type,entry}[boolean]{abbreviate}[true]{%
+ \ifstrequal{#1}{true}
+ {\def\abx@str{abx@sstr}}
+ {\def\abx@str{abx@lstr}}}
+
+\DeclareBiblatexOption{global,type,entry}[boolean]{dateabbrev}[true]{%
+ \ifstrequal{#1}{true}
+ {\let\abx@bibmonth\blx@imc@bibsstring
+ \let\abx@bibyeardivision\blx@imc@bibsstring}
+ {\let\abx@bibmonth\blx@imc@biblstring
+ \let\abx@bibyeardivision\blx@imc@biblstring}}
+
+\DeclareBibliographyOption[string]{sortlocale}{%
+ \edef\blx@sortlocale{\detokenize{#1}}}
+
+\DeclareBibliographyOption[string]{language}{%
+ \togglefalse{blx@autolangbib}%
+ \togglefalse{blx@autolangcite}%
+ \undef\blx@languagename
+ \undef\blx@forcelanguagename
+ \ifboolexpr{
+ test {\ifstrequal{#1}{auto}}
+ or
+ test {\ifstrequal{#1}{autobib}}
+ or
+ test {\ifstrequal{#1}{autocite}}
+ }
+ {\def\blx@languagename{english}%
+ \ifstrequal{#1}{auto}
+ {\toggletrue{blx@autolangbib}%
+ \toggletrue{blx@autolangcite}}
+ {}%
+ \ifstrequal{#1}{autobib}
+ {\toggletrue{blx@autolangbib}}
+ {}%
+ \ifstrequal{#1}{autocite}
+ {\toggletrue{blx@autolangcite}}
+ {}}
+ % If language is explicit, we do want to auto-switch but only to the
+ % selected language
+ {\blx@altfile{#1.lbx}%
+ \ifdefempty\blx@fnext
+ {\blx@error
+ {Language '#1' not supported}
+ {Failed to find a matching '#1.lbx' file}}}
+ {\toggletrue{blx@autolangbib}%
+ \toggletrue{blx@autolangcite}%
+ \edef\blx@languagename{#1}%
+ \edef\blx@forcelanguagename{#1}}}
+
+\DeclareBiblatexOption{global,type,entry}[boolean]{clearlang}[true]{%
+ \settoggle{blx@clearlang}{#1}}
+
+\DeclareBibliographyOption[string]{autolang}{%
+ \blx@autolang@i{#1}}
+
+\def\blx@autolang@i#1{%
+ \ifcsdef{blx@opt@autolang@#1}
+ {\csuse{blx@opt@autolang@#1}}
+ {\blx@err@invopt{autolang=#1}{}}}
+
+\def\blx@opt@autolang@none{%
+ \undef\blx@thelangenv
+ \let\blx@hook@initlang\@empty
+ \let\blx@hook@endlang\@empty}
+\def\blx@opt@autolang@hyphen{%
+ \def\blx@thelangenv{hyphenrules}%
+ \let\blx@hook@initlang\@empty
+ \let\blx@hook@endlang\@empty}
+\csdef{blx@opt@autolang@other*}{%
+ \def\blx@thelangenv{otherlanguage*}%
+ \def\blx@hook@initlang{\@quotereset\@ne}%
+ \def\blx@hook@endlang{\blx@postpunct}}
+\def\blx@opt@autolang@other{%
+ \def\blx@thelangenv{otherlanguage}%
+ \def\blx@hook@initlang{\@quotereset\@ne}%
+ \def\blx@hook@endlang{\blx@postpunct}}
+\def\blx@opt@autolang@langname{%
+ \@ifpackageloaded{polyglossia}
+ {\def\blx@thelangenv{langname}}
+ {\def\blx@thelangenv{otherlanguage}}%
+ \def\blx@hook@initlang{\@quotereset\@ne}%
+ \def\blx@hook@endlang{\blx@postpunct}}
+
+\DeclareBibliographyOption[string]{langhook}{%
+ \ifstrequal{#1}{captions}
+ {\@firstoftwo}
+ {\ifstrequal{#1}{extras}}
+ {\def\blx@langhook{#1}}
+ {\blx@err@invopt{langhook=#1}{}}}
+
+
+\DeclareBibliographyOption[string]{autofieldlang}{%
+ \blx@autofieldlang@i{#1}}
+
+\def\blx@autofieldlang@i#1{%
+ \ifcsdef{blx@opt@autofieldlang@#1}
+ {\csuse{blx@opt@autofieldlang@#1}}
+ {\blx@err@invopt{autofieldlang=#1}{}}}
+
+\def\blx@opt@autofieldlang@none{%
+ \undef\blx@thefieldlangenv
+ \let\blx@hook@initfieldlang\@empty
+ \let\blx@hook@endfieldlang\@empty}
+\def\blx@opt@autofieldlang@hyphen{%
+ \def\blx@thefieldlangenv{hyphenrules}%
+ \let\blx@hook@initfieldlang\@empty
+ \let\blx@hook@endfieldlang\@empty}
+\def\blx@opt@autofieldlang@other{%
+ \def\blx@thefieldlangenv{otherlanguage}%
+ \def\blx@hook@initfieldlang{\@quotereset\@ne}%
+ \def\blx@hook@endfieldlang{\blx@postpunct}}
+\csdef{blx@opt@autofieldlang@other*}{%
+ \def\blx@thefieldlangenv{otherlanguage*}%
+ \def\blx@hook@initfieldlang{\@quotereset\@ne}%
+ \def\blx@hook@endfieldlang{\blx@postpunct}}
+\def\blx@opt@autofieldlang@langname{%
+ \@ifpackageloaded{polyglossia}
+ {\def\blx@thefieldlangenv{langname}}
+ {\def\blx@thefieldlangenv{otherlanguage}}%
+ \def\blx@hook@initfieldlang{\@quotereset\@ne}%
+ \def\blx@hook@endfieldlang{\blx@postpunct}}
+
+\DeclareBibliographyOption{autofieldlangstrings}[true]{%
+ \settoggle{blx@autofieldlangstrings}{#1}}
+
+\DeclareBibliographyOption{dynamiclabel}[true]{%
+ \settoggle{blx@dynamiclabel}{#1}}
+
+\DeclareBiblatexOption{global,type,entry}[string]{indexing}[true]{%
+ \blx@opt@index{#1}}
+\def\blx@opt@index#1{%
+ \ifcsdef{blx@opt@index@#1}
+ {\csuse{blx@opt@index@#1}}
+ {\blx@err@invopt{indexing=#1}{}}}
+\def\blx@opt@index@true{%
+ \toggletrue{blx@citeindex}%
+ \toggletrue{blx@bibindex}}
+\def\blx@opt@index@false{%
+ \togglefalse{blx@citeindex}%
+ \togglefalse{blx@bibindex}}
+\def\blx@opt@index@cite{%
+ \toggletrue{blx@citeindex}%
+ \togglefalse{blx@bibindex}}
+\def\blx@opt@index@bib{%
+ \togglefalse{blx@citeindex}%
+ \toggletrue{blx@bibindex}}
+
+\DeclareBibliographyOption[boolean]{sortcites}[true]{%
+ \ifstrequal{#1}{true}
+ {\let\blx@thecitesort\blx@citesort
+ \let\blx@thenotecheck\blx@notecheck
+ \booltrue{sortcites}}
+ {\let\blx@thecitesort\blx@citenosort
+ \let\blx@thenotecheck\relax}}
+
+\DeclareBibliographyOption[boolean]{sortsets}[true]{%
+ \settoggle{blx@sortsets}{#1}}
+
+\DeclareBibliographyOption[string]{hyperref}[true]{%
+ \ifcsdef{blx@opt@hyperref@#1}
+ {\letcs\blx@hyperref{blx@opt@hyperref@#1}}
+ {\blx@err@invopt{hyperref=#1}{}}}
+\def\blx@opt@hyperref@false{0}
+\def\blx@opt@hyperref@true{1}
+\def\blx@opt@hyperref@auto{2}
+\def\blx@opt@hyperref@manual{3}
+
+\def\blx@warn@usedmanualhyperrefs#1{%
+ \blx@warning@noline{The command '\string#1' can\MessageBreak
+ only be used with 'hyperref=manual'}}
+\def\blx@warn@multiplemanualhyperrefs{%
+ \blx@warning@noline{You must call either '\string\BiblatexManualHyperrefOn'\MessageBreak
+ or '\string\BiblatexManualHyperrefOff' exactly once.\MessageBreak
+ Subsequent calls to either command will be ignored}}
+\def\BiblatexManualHyperrefOn{%
+ \ifnum\blx@hyperref=\thr@@
+ \blx@mkhyperref
+ \global\undef\blx@mkhyperref
+ \global\undef\blx@mknohyperref
+ \global\let\BiblatexManualHyperrefOn\blx@warn@multiplemanualhyperrefs
+ \global\let\BiblatexManualHyperrefOff\blx@warn@multiplemanualhyperrefs
+ \else
+ \blx@warn@usedmanualhyperrefs{\BiblatexManualHyperrefOn}%
+ \fi}
+\def\BiblatexManualHyperrefOff{%
+ \ifnum\blx@hyperref=\thr@@
+ \blx@mknohyperref
+ \global\undef\blx@mkhyperref
+ \global\undef\blx@mknohyperref
+ \global\let\BiblatexManualHyperrefOn\blx@warn@multiplemanualhyperrefs
+ \global\let\BiblatexManualHyperrefOff\blx@warn@multiplemanualhyperrefs
+ \else
+ \blx@warn@usedmanualhyperrefs{\BiblatexManualHyperrefOff}%
+ \fi}
+
+\DeclareBibliographyOption[boolean]{backref}[true]{%
+ \ifstrequal{#1}{true}
+ {\let\blx@backref\blx@addbackref
+ \let\abx@aux@backref\blx@aux@backref
+ \booltrue{backtracker}}
+ {\let\blx@backref\@gobble
+ \let\abx@aux@backref\@gobblefive
+ \boolfalse{backtracker}}}
+
+\DeclareBibliographyOption[string]{backrefsetstyle}{%
+ \ifcsdef{blx@opt@backrefsetstyle@#1}
+ {\letcs\blx@backrefsetstyle{blx@opt@backrefsetstyle@#1}}
+ {\blx@err@invopt{backrefsetstyle=#1}{}}}
+\def\blx@opt@backrefsetstyle@setonly{0}
+\def\blx@opt@backrefsetstyle@memonly{1}
+\def\blx@opt@backrefsetstyle@setormem{2}
+\def\blx@opt@backrefsetstyle@setandmem{3}
+\def\blx@opt@backrefsetstyle@memandset{4}
+\def\blx@opt@backrefsetstyle@setplusmem{5}
+
+\newtoggle{blx@backreffloats}
+\DeclareBibliographyOption[boolean]{backreffloats}[true]{%
+ \settoggle{blx@backreffloats}{#1}}
+
+\appto\blx@mkhyperref{%
+ \ifHy@plainpages
+ \blx@warning@noline{%
+ hyperref package option 'plainpages' enabled.\MessageBreak
+ This may cause problems with hyperlinked back\MessageBreak
+ references. 'plainpages=false' is recommended}%
+ \fi
+ \ifHy@pageanchor\else
+ \blx@warning@noline{%
+ hyperref package option 'pageanchor' disabled.\MessageBreak
+ This will cause problems with hyperlinked back\MessageBreak
+ references. 'pageanchor=true' is required}%
+ \fi}
+
+\def\blx@optprocess@block#1{%
+ \ifcsdef{blx@opt@block@#1}
+ {\csuse{blx@opt@block@#1}}
+ {\blx@err@invopt{block=#1}{}}}
+
+\DeclareBibliographyOption[string]{block}{%
+ \blx@optprocess@block{#1}}
+
+\blx@kv@defkey{blx@bib1}{block}{}
+\blx@kv@defkey{blx@bib2}{block}{\blx@optprocess@block{#1}}
+\blx@kv@defkey{blx@biblist1}{block}{}
+\blx@kv@defkey{blx@biblist2}{block}{\blx@optprocess@block{#1}}
+
+\blx@kv@defkey{blx@bbs}{block}{\blx@optprocess@block{#1}}
+\blx@kv@defkey{blx@bbg}{block}{\blx@optprocess@block{#1}}
+
+\def\blx@opt@block@none{%
+ \let\blx@bibsetup\@empty
+ \let\newblockpunct\@empty}
+\def\blx@opt@block@par{%
+ \let\blx@bibsetup\@empty
+ \def\newblockpunct{\par}}
+\def\blx@opt@block@nbpar{%
+ \def\blx@bibsetup{\interlinepenalty\@M}%
+ \def\newblockpunct{\par\nobreak}}
+\def\blx@opt@block@space{%
+ \let\blx@bibsetup\@empty
+ \def\newblockpunct{%
+ \unspace\space
+ \hskip 0.11em
+ \@plus 0.33em
+ \@minus 0.07em}}
+\def\blx@opt@block@ragged{%
+ \let\blx@bibsetup\raggedright
+ \def\newblockpunct{%
+ \unspace\penalty-9\relax\space}}
+
+\DeclareBibliographyOption[string]{pagetracker}[true]{%
+ \ifcsdef{blx@opt@pagetracker@#1}
+ {\csuse{blx@opt@pagetracker@#1}}
+ {\blx@err@invopt{pagetracker=#1}{}}}
+\def\blx@opt@pagetracker@true{%
+ \if@twoside
+ \blx@opt@pagetracker@spread
+ \else
+ \blx@opt@pagetracker@page
+ \fi}
+\def\blx@opt@pagetracker@false{%
+ \let\blx@pagetracker\relax
+ \let\abx@aux@page\@gobbletwo
+ \let\abx@aux@fnpage\@gobbletwo
+ \boolfalse{pagetracker}}
+\def\blx@opt@pagetracker@page{%
+ \let\blx@pagetracker\blx@pagetracker@context
+ \let\abx@aux@page\blx@aux@page
+ \let\abx@aux@fnpage\blx@aux@fnpage
+ \booltrue{pagetracker}}
+\def\blx@opt@pagetracker@spread{%
+ \if@twoside
+ \let\blx@pagetracker\blx@pagetracker@context
+ \let\abx@aux@page\blx@aux@spread
+ \let\abx@aux@fnpage\blx@aux@fnspread
+ \booltrue{pagetracker}%
+ \else
+ \blx@warning@noline{%
+ LaTeX not in twoside mode\MessageBreak
+ Falling back to 'pagetracker=page'}%
+ \blx@opt@pagetracker@page
+ \fi}
+
+\DeclareBibliographyOption[string]{citecounter}[true]{%
+ \ifcsdef{blx@opt@citecounter@#1}
+ {\csuse{blx@opt@citecounter@#1}}
+ {\blx@err@invopt{citecounter=#1}{}}}
+\def\blx@opt@citecounter@true{%
+ \let\blx@setcitecounter\blx@setcitecounter@global
+ \let\blx@citecounter\blx@citecounter@global
+ \let\abx@aux@count\blx@aux@count
+ \let\abx@aux@fncount\blx@aux@fncount
+ \let\abx@curr@count\blx@curr@count
+ \let\abx@curr@fncount\blx@curr@fncount
+ \booltrue{citetracker}}
+\def\blx@opt@citecounter@context{%
+ \let\blx@setcitecounter\blx@setcitecounter@context
+ \let\blx@citecounter\blx@citecounter@context
+ \let\abx@aux@count\blx@aux@count
+ \let\abx@aux@fncount\blx@aux@fncount
+ \let\abx@curr@count\blx@curr@count
+ \let\abx@curr@fncount\blx@curr@fncount
+ \booltrue{citetracker}}
+\def\blx@opt@citecounter@false{%
+ \let\blx@setcitecounter\relax
+ \let\blx@citecounter\relax
+ \let\abx@aux@count\@gobbletwo
+ \let\abx@aux@fncount\@gobbletwo
+ \let\abx@curr@count\@gobbletwo
+ \let\abx@curr@fncount\@gobbletwo
+ \boolfalse{citetracker}}
+
+\DeclareBiblatexOption{global,type,entry}[string]{citetracker}[true]{%
+ \ifcsdef{blx@opt@citetracker@#1}
+ {\csuse{blx@opt@citetracker@#1}}
+ {\blx@err@invopt{citetracker=#1}{}}}
+\def\blx@opt@citetracker@true{%
+ \let\blx@imc@ifciteseen\blx@ifciteseen@global
+ \let\blx@imc@ifentryseen\blx@ifentryseen@global
+ \let\blx@citetracker\blx@citetracker@global
+ \booltrue{citetracker}}
+\def\blx@opt@citetracker@false{%
+ \let\blx@imc@ifciteseen\@secondoftwo
+ \protected\long\def\blx@imc@ifentryseen##1##2##3{##3}%
+ \let\blx@citetracker\relax}
+\def\blx@opt@citetracker@context{%
+ \let\blx@imc@ifciteseen\blx@ifciteseen@context
+ \let\blx@imc@ifentryseen\blx@ifentryseen@context
+ \let\blx@citetracker\blx@citetracker@context
+ \booltrue{citetracker}}
+\def\blx@opt@citetracker@strict{%
+ \let\blx@imc@ifciteseen\blx@ifciteseen@global
+ \let\blx@imc@ifentryseen\blx@ifentryseen@global
+ \def\blx@citetracker{%
+ \blx@ifcitesingle{\blx@citetracker@global}{}}%
+ \booltrue{citetracker}}
+\def\blx@opt@citetracker@constrict{%
+ \let\blx@imc@ifciteseen\blx@ifciteseen@context
+ \let\blx@imc@ifentryseen\blx@ifentryseen@context
+ \def\blx@citetracker{%
+ \blx@ifcitesingle{\blx@citetracker@context}{}}%
+ \booltrue{citetracker}}
+
+\DeclareBiblatexOption{global,type,entry}[string]{ibidtracker}[true]{%
+ \ifcsdef{blx@opt@ibidtracker@#1}
+ {\csuse{blx@opt@ibidtracker@#1}}
+ {\blx@err@invopt{ibidtracker=#1}{}}}
+\def\blx@opt@ibidtracker@true{%
+ \let\blx@imc@ifciteibid\blx@ifciteibid@global
+ \let\blx@ibidtracker\blx@ibidtracker@global
+ \let\blx@ibidreset\blx@ibidreset@global
+ \booltrue{citetracker}}
+\def\blx@opt@ibidtracker@false{%
+ \let\blx@imc@ifciteibid\@secondoftwo
+ \let\blx@ibidtracker\relax
+ \let\blx@ibidreset\relax}
+\def\blx@opt@ibidtracker@context{%
+ \let\blx@imc@ifciteibid\blx@ifciteibid@context
+ \let\blx@ibidtracker\blx@ibidtracker@context
+ \let\blx@ibidreset\blx@ibidreset@context
+ \booltrue{citetracker}}
+\def\blx@opt@ibidtracker@strict{%
+ \let\blx@imc@ifciteibid\blx@ifciteibid@strict
+ \let\blx@ibidtracker\blx@ibidtracker@strict
+ \let\blx@ibidreset\blx@ibidreset@global
+ \booltrue{citetracker}}
+\def\blx@opt@ibidtracker@constrict{%
+ \let\blx@imc@ifciteibid\blx@ifciteibid@constrict
+ \let\blx@ibidtracker\blx@ibidtracker@constrict
+ \let\blx@ibidreset\blx@ibidreset@context
+ \booltrue{citetracker}}
+
+\DeclareBiblatexOption{global,type,entry}[string]{idemtracker}[true]{%
+ \ifcsdef{blx@opt@idemtracker@#1}
+ {\csuse{blx@opt@idemtracker@#1}}
+ {\blx@err@invopt{idemtracker=#1}{}}}
+\def\blx@opt@idemtracker@true{%
+ \let\blx@imc@ifciteidem\blx@ifciteidem@global
+ \let\blx@idemtracker\blx@idemtracker@global
+ \let\blx@idemreset\blx@idemreset@global
+ \booltrue{citetracker}}
+\def\blx@opt@idemtracker@false{%
+ \let\blx@imc@ifciteidem\@secondoftwo
+ \let\blx@idemtracker\relax
+ \let\blx@idemreset\relax}
+\def\blx@opt@idemtracker@context{%
+ \let\blx@imc@ifciteidem\blx@ifciteidem@context
+ \let\blx@idemtracker\blx@idemtracker@context
+ \let\blx@idemreset\blx@idemreset@context
+ \booltrue{citetracker}}
+\def\blx@opt@idemtracker@strict{%
+ \let\blx@imc@ifciteidem\blx@ifciteidem@strict
+ \let\blx@idemtracker\blx@idemtracker@strict
+ \let\blx@idemreset\blx@idemreset@global
+ \booltrue{citetracker}}
+\def\blx@opt@idemtracker@constrict{%
+ \let\blx@imc@ifciteidem\blx@ifciteidem@constrict
+ \let\blx@idemtracker\blx@idemtracker@constrict
+ \let\blx@idemreset\blx@idemreset@context
+ \booltrue{citetracker}}
+
+\DeclareBiblatexOption{global,type,entry}[string]{opcittracker}[true]{%
+ \ifcsdef{blx@opt@opcittracker@#1}
+ {\csuse{blx@opt@opcittracker@#1}}
+ {\blx@err@invopt{opcittracker=#1}{}}}
+\def\blx@opt@opcittracker@true{%
+ \let\blx@imc@ifopcit\blx@ifopcit@global
+ \let\blx@opcittracker\blx@opcittracker@global
+ \let\blx@opcitreset\blx@opcitreset@global
+ \booltrue{citetracker}}
+\def\blx@opt@opcittracker@false{%
+ \let\blx@imc@ifopcit\@secondoftwo
+ \let\blx@opcittracker\relax
+ \let\blx@opcitreset\relax}
+\def\blx@opt@opcittracker@context{%
+ \let\blx@imc@ifopcit\blx@ifopcit@context
+ \let\blx@opcittracker\blx@opcittracker@context
+ \let\blx@opcitreset\blx@opcitreset@context
+ \booltrue{citetracker}}
+\def\blx@opt@opcittracker@strict{%
+ \let\blx@imc@ifopcit\blx@ifopcit@strict
+ \let\blx@opcittracker\blx@opcittracker@strict
+ \let\blx@opcitreset\blx@opcitreset@global
+ \booltrue{citetracker}}
+\def\blx@opt@opcittracker@constrict{%
+ \let\blx@imc@ifopcit\blx@ifopcit@constrict
+ \let\blx@opcittracker\blx@opcittracker@constrict
+ \let\blx@opcitreset\blx@opcitreset@context
+ \booltrue{citetracker}}
+
+\DeclareBiblatexOption{global,type,entry}[string]{loccittracker}[true]{%
+ \ifcsdef{blx@opt@loccittracker@#1}
+ {\csuse{blx@opt@loccittracker@#1}}
+ {\blx@err@invopt{loccittracker=#1}{}}}
+\def\blx@opt@loccittracker@true{%
+ \let\blx@imc@ifloccit\blx@ifloccit@global
+ \let\blx@loccittracker\blx@loccittracker@global
+ \let\blx@loccitreset\blx@loccitreset@global
+ \booltrue{citetracker}}
+\def\blx@opt@loccittracker@false{%
+ \let\blx@imc@ifloccit\@secondoftwo
+ \let\blx@loccittracker\relax
+ \let\blx@loccitreset\relax}
+\def\blx@opt@loccittracker@context{%
+ \let\blx@imc@ifloccit\blx@ifloccit@context
+ \let\blx@loccittracker\blx@loccittracker@context
+ \let\blx@loccitreset\blx@loccitreset@context
+ \booltrue{citetracker}}
+\def\blx@opt@loccittracker@strict{%
+ \let\blx@imc@ifloccit\blx@ifloccit@strict
+ \let\blx@loccittracker\blx@loccittracker@strict
+ \let\blx@loccitreset\blx@loccitreset@global
+ \booltrue{citetracker}}
+\def\blx@opt@loccittracker@constrict{%
+ \let\blx@imc@ifloccit\blx@ifloccit@constrict
+ \let\blx@loccittracker\blx@loccittracker@constrict
+ \let\blx@loccitreset\blx@loccitreset@context
+ \booltrue{citetracker}}
+
+\newtoggle{blx@trackfloats}
+\DeclareBibliographyOption[boolean]{trackfloats}[true]{%
+ \settoggle{blx@trackfloats}{#1}}
+
+
+\DeclareBibliographyOption[boolean]{parentracker}[true]{%
+ \ifstrequal{#1}{true}
+ {\let\bibopenparen\blx@bibopenparen
+ \let\bibcloseparen\blx@bibcloseparen
+ \let\bibopenbracket\blx@bibopenbracket
+ \let\bibclosebracket\blx@bibclosebracket}
+ {\protected\def\bibopenparen{\bibleftparen}%
+ \protected\def\bibcloseparen{\bibrightparen}%
+ \protected\def\bibopenbracket{\bibleftbracket}%
+ \protected\def\bibclosebracket{\bibrightbracket}}}
+
+\DeclareBibliographyOption[integer]{maxparens}{%
+ \ifnumless{#1}{1}
+ {\blx@err@invopt{maxparens=#1}{}}
+ {\setcounter{maxparens}{#1}}}
+
+\newtoggle{blx@labeldateusetime}
+\DeclareBibliographyOption[boolean]{labeldateusetime}[true]{%
+ \ifstrequal{#1}{true}
+ {\toggletrue{blx@labeldateusetime}}
+ {\togglefalse{blx@labeldateusetime}}}
+
+\DeclareBibliographyOption[string]{labeldate}{%
+ % 'true' or 'false' means that the user thinks that this is the old 'labeldate'
+ % option which is now 'labeldateparts' (which is a boolean).
+ \ifboolexpr{%
+ test {\ifstrequal{#1}{true}}
+ or
+ test {\ifstrequal{#1}{false}}}
+ {\blx@warning@noline{%
+ 'labeldate' option used to determine whether to provide label date fields and\MessageBreak
+ extradate field is renamed to 'labeldateparts', setting this instead. This option is
+ now used to set the format of the labeldate}%
+ \settoggle{blx@labeldateparts}{#1}}
+ {\ifstrequal{#1}{iso8601}
+ {\blx@warning@noline{%
+ 'iso8601' date format specifier is deprecated.\MessageBreak
+ Use 'iso' instead}%
+ \def\blx@dateformat@labeldate{iso}%
+ \renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}}
+ {\ifstrequal{#1}{edtf}
+ {\blx@warning@noline{%
+ 'edtf' date format specifier is deprecated.\MessageBreak
+ Use 'iso' instead}%
+ \def\blx@dateformat@labeldate{iso}%
+ \renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}}
+ {\def\blx@dateformat@labeldate{#1}}}%
+ \ifstrequal{#1}{ymd}
+ {\renewrobustcmd*{\bibdaterangesep}{\slash}%
+ \renewrobustcmd*{\bibtimerangesep}{\slash}%
+ \renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}}
+ {}%
+ \ifstrequal{#1}{iso}% bibdaterangesep hard-coded to slash, no extra space before prefices
+ {\renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}}
+ {}%
+ \ifcsdef{mkdaterange#1}
+ {\protected\def\blx@imc@printlabeldate{\csuse{mkdaterange#1}{label}}
+ \protected\def\blx@imc@printlabeldateextra{\csuse{mkdaterange#1extra}{label}}}
+ {\ifcsdef{mkbibrange#1}%LEGACY(<3.5)
+ {\protected\def\blx@imc@printlabeldate{\csuse{mkbibrange#1}{label}}
+ \protected\def\blx@imc@printlabeldateextra{\csuse{mkbibrange#1extra}{label}}}
+ {\blx@err@invopt{labeldate=#1}{}}}}}
+
+\DeclareBibliographyOption[string]{labeltime}{%
+ \ifcsdef{mktimerange#1}
+ {\def\blx@timeformat@labeltime{#1}%
+ \protected\def\blx@imc@printlabeltime{\csuse{mktimerange#1}{label}}}
+ {\blx@err@invopt{labeltime=#1}{}}}
+
+% Date meta-information
+\DeclareBibliographyOption[string]{dateera}{%
+ \ifboolexpr{%
+ test {\ifstrequal{#1}{astronomical}}
+ or
+ test {\ifstrequal{#1}{secular}}
+ or
+ test {\ifstrequal{#1}{christian}}}
+ {\def\blx@dateera{#1}%
+ \ifstrequal{#1}{secular}
+ {\def\blx@dateera@bce{beforecommonera}%
+ \def\blx@dateera@ce{commonera}}
+ {}%
+ \ifstrequal{#1}{christian}
+ {\def\blx@dateera@bce{beforechrist}%
+ \def\blx@dateera@ce{annodomini}}
+ {}}
+ {\blx@err@invopt{dateera=#1}{}}}
+
+% Effectively turns off dateeraauto since it's only used on ce dates which
+% are never less than zero (as that would be a bce date)
+\numdef\blx@dateeraauto{0}
+\DeclareBibliographyOption[integer]{dateeraauto}{%
+ \numdef\blx@dateeraauto{#1}}
+
+\newtoggle{blx@datecirca}
+\DeclareBibliographyOption[boolean]{datecirca}[true]{%
+ \ifstrequal{#1}{true}
+ {\toggletrue{blx@datecirca}%
+ \protected\def\datecircaprint{%
+ \ifdatecirca{\bibstring{circa}\printdelim{datecircadelim}}{}}%
+ \protected\def\enddatecircaprint{%
+ \ifenddatecirca{\bibstring{circa}\printdelim{datecircadelim}}{}}%
+ \protected\def\datecircaprintedtf{%LEGACY(<3.9)
+ \blx@warning@noline{%
+ '\string\datecircaprintedtf' is deprecated.
+ Please use '\string\datecircaprintiso'}%
+ \datecircaprintiso}%
+ \protected\def\enddatecircaprintedtf{%LEGACY(<3.9)
+ \blx@warning@noline{%
+ '\string\enddatecircaprintedtf' is deprecated.
+ Please use '\string\enddatecircaprintiso'}%
+ \enddatecircaprintiso}%
+ \protected\def\datecircaprintiso{%
+ \ifdatecirca{\textasciitilde}{}}%
+ \protected\def\enddatecircaprintiso{%
+ \ifenddatecirca{\textasciitilde}{}}}
+ {\togglefalse{blx@datecirca}}}
+
+\newtoggle{blx@dateuncertain}
+\DeclareBibliographyOption[boolean]{dateuncertain}[true]{%
+ \ifstrequal{#1}{true}
+ {\toggletrue{blx@dateuncertain}%
+ \protected\def\dateuncertainprint{%
+ \ifdateuncertain{\bibdateuncertain}{}}%
+ \protected\def\enddateuncertainprint{%
+ \ifenddateuncertain{\bibdateuncertain}{}}}
+ {\togglefalse{blx@dateuncertain}}}
+
+% *time format options - auto-created for all datamodel date fields
+% *date format options - auto-created for all datamodel date fields
+% *dateusetime options - auto-created for all datamodel date fields
+% Date metadata toggles are defined in one of the \abx@dobooleans calls
+\def\do#1{%
+ \DeclareBibliographyOption[string]{#1date}{%
+ \ifstrequal{##1}{iso8601}
+ {\blx@warning@noline{'iso8601' date format specifier is deprecated.\MessageBreak
+ Use 'iso' instead}%
+ \csdef{blx@dateformat@#1date}{iso}}
+ {\ifstrequal{##1}{edtf}
+ {\blx@warning@noline{'edtf' date format specifier is deprecated.\MessageBreak
+ Use 'iso' instead}%
+ \csdef{blx@dateformat@#1date}{iso}}
+ {\csdef{blx@dateformat@#1date}{##1}}}%
+ \ifstrequal{##1}{ymd}
+ {\renewrobustcmd*{\bibdaterangesep}{\slash}%
+ \renewrobustcmd*{\bibtimerangesep}{\slash}%
+ \renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}}
+ {}%
+ \ifcsdef{mkdaterange##1}
+ {\protected\csedef{blx@imc@print#1date}{\noexpand\csuse{mkdaterange##1}{#1}}%
+ \protected\csedef{blx@imc@print#1dateextra}{\noexpand\csuse{mkdaterange##1extra}{#1}}}
+ {\ifcsdef{mkbibrange##1}%LEGACY(<3.5)
+ {\blx@warning@noline{%
+ '\string\mkbibrange##1(extra)' date range macro in style is deprecated,\MessageBreak
+ please define '\string\mkdaterange##1(extra)' instead}%
+ \protected\csedef{blx@imc@print#1date}{\noexpand\csuse{mkbibrange##1}{#1}}%
+ \protected\csedef{blx@imc@print#1dateextra}{\noexpand\csuse{mkbibrange##1extra}{#1}}}
+ {\blx@err@invopt{#1date=##1}{}}}}%
+ % Default for new date fields is "comp" but this is overridden below by
+ % biblatex defaults
+ \blx@kv@setkeys{blx@opt@pre}{#1date=comp}%
+ % Time format options
+ \DeclareBibliographyOption[string]{#1time}{%
+ \csdef{blx@timeformat@#1time}{##1}%
+ \ifcsdef{mktimerange##1}
+ {\protected\csedef{blx@imc@print#1time}{\csuse{mktimerange##1}{#1}}}
+ {\blx@err@invopt{#1time=##1}{}}}%
+ % Default for new time fields is "24h"
+ \blx@kv@setkeys{blx@opt@pre}{#1time=24h}%
+ % Boolean to determine if times are printed with dates
+ \newtoggle{blx@#1dateusetime}%
+ \DeclareBibliographyOption[boolean]{#1dateusetime}[true]{%
+ \settoggle{blx@#1dateusetime}{##1}}}
+\abx@dodatetypes
+
+\DeclareBibliographyOption[string]{alldatesusetime}{%
+ \def\do##1{\ExecuteBibliographyOptions{##1usetime=#1}}%
+ \abx@dodates
+ \do{labeldate}}
+
+\DeclareBibliographyOption[string]{alldates}{%
+ \def\do##1{\ExecuteBibliographyOptions{##1=#1}}%
+ \abx@dodates
+ \do{labeldate}}
+
+\DeclareBibliographyOption[string]{alltimes}{%
+ \def\do##1{%
+ \ExecuteBibliographyOptions{##1time=#1}}%
+ \abx@dodatetypes
+ \do{label}}
+
+\newtoggle{blx@julian}
+\def\blx@gregorianstart{1582-10-15}
+\DeclareBibliographyOption[boolean]{julian}[true]{%
+ \ifstrequal{#1}{true}
+ {\toggletrue{blx@julian}}
+ {\togglefalse{blx@julian}}}
+
+\DeclareBibliographyOption[string]{gregorianstart}{%
+ \def\blx@gregorianstart{#1}}
+
+\DeclareBibliographyOption[string]{msform}{%
+ \def\blx@msform{#1}}
+
+\newtoggle{blx@datezeros}\toggletrue{blx@datezeros}
+\DeclareBibliographyOption[boolean]{datezeros}[true]{%
+ \ifstrequal{#1}{true}
+ {\toggletrue{blx@datezeros}%
+ \let\blx@imc@mkyearzeros\blx@imc@forcezerosy
+ \let\blx@imc@mkmonthzeros\blx@imc@forcezerosmdt
+ \let\blx@imc@mkdayzeros\blx@imc@forcezerosmdt}
+ {\togglefalse{blx@datezeros}%
+ \let\blx@imc@mkyearzeros\blx@imc@stripzeros
+ \let\blx@imc@mkmonthzeros\blx@imc@stripzeros
+ \let\blx@imc@mkdayzeros\blx@imc@stripzeros}}
+
+\newtoggle{blx@timezeros}\toggletrue{blx@timezeros}
+\DeclareBibliographyOption[boolean]{timezeros}[true]{%
+ \ifstrequal{#1}{true}
+ {\toggletrue{blx@timezeros}%
+ \let\blx@imc@mktimezeros\blx@imc@forcezerosmdt}
+ {\togglefalse{blx@timezeros}%
+ \let\blx@imc@mktimezeros\blx@imc@stripzeros}}
+
+\newtoggle{blx@timezones}
+\DeclareBibliographyOption[boolean]{timezones}[true]{%
+ \ifstrequal{#1}{true}
+ {\toggletrue{blx@timezones}}
+ {\togglefalse{blx@timezones}}}
+
+\newtoggle{blx@seconds}
+\DeclareBibliographyOption[boolean]{seconds}[true]{%
+ \ifstrequal{#1}{true}
+ {\toggletrue{blx@seconds}}
+ {\togglefalse{blx@seconds}}}
+
+\DeclareBibliographyOption[string]{autocite}{%
+ \ifcsundef{blx@acite@#1}
+ {\blx@error
+ {Autocite command '#1' undefined}
+ {The autocite command '#1' has not been defined by
+ the\MessageBreak selected citation style}}
+ {\letcs\autocite{blx@acite@#1}%
+ \letcs\autocites{blx@macite@#1}}}
+
+\DeclareBibliographyOption[string]{notetype}{%
+ \ifcsdef{blx@opt@notetype@#1}
+ {\blx@notetype\csuse{blx@opt@notetype@#1}}
+ {\blx@err@invopt{notetype=#1}{}}}
+\cslet{blx@opt@notetype@foot+end}\z@
+\let\blx@opt@notetype@footonly\@ne
+\let\blx@opt@notetype@endonly\tw@
+
+\DeclareBibliographyOption[boolean]{autopunct}[true]{%
+ \ifstrequal{#1}{true}
+ {\DeclareAutoPunctuation{.,;:!?}}
+ {\DeclareAutoPunctuation{}}}
+
+\DeclareBibliographyOption[boolean]{punctfont}[true]{%
+ \ifstrequal{#1}{true}
+ {\let\blx@ifpuncthook\@firstoftwo}
+ {\let\blx@ifpuncthook\@secondoftwo}}
+
+\DeclareBibliographyOption[boolean]{labelnumber}[true]{%
+ \settoggle{blx@labelnumber}{#1}%
+ \iftoggle{blx@labelnumber}
+ {}
+ {\blx@kv@setkeys{blx@opt@pre}{defernumbers=false}}}
+\DeclareBiblatexOption{type,entry}[boolean]{labelnumber}[true]{%
+ \settoggle{blx@labelnumber}{#1}}
+
+\DeclareBiblatexOption{global,type,entry}[boolean]{labelalpha}[true]{%
+ \settoggle{blx@labelalpha}{#1}}
+
+\DeclareBiblatexOption{global,type,entry}[boolean]{labeltitle}[true]{%
+ \settoggle{blx@labeltitle}{#1}}
+
+\DeclareBiblatexOption{global,type,entry}[boolean]{labeltitleyear}[true]{%
+ \settoggle{blx@labeltitleyear}{#1}}
+
+\DeclareBiblatexOption{global,type,entry}[boolean]{labeldateparts}[true]{%
+ \settoggle{blx@labeldateparts}{#1}}
+
+\DeclareBiblatexOption{global,type}[string]{uniquelist}[true]{%
+ \ifcsdef{blx@opt@uniquelist@#1}
+ {\letcs\blx@uniquelist{blx@opt@uniquelist@#1}}
+ {\blx@err@invopt{uniquelist=#1}{}}}
+\def\blx@opt@uniquelist@false{false}
+\def\blx@opt@uniquelist@true{true}
+\def\blx@opt@uniquelist@minyear{minyear}
+
+\DeclareBiblatexOption{global}[boolean]{pluralothers}[true]{%
+ \settoggle{blx@pluralothers}{#1}}
+
+\blx@DeclareBackendOption{entry,namelist}[string]{uniquelist}
+
+\DeclareBiblatexOption{global,type}[boolean]{nohashothers}[true]{%
+ \settoggle{blx@nohashothers}{#1}}
+\blx@DeclareBackendOption{entry,namelist}[boolean]{nohashothers}
+
+\DeclareBiblatexOption{global,type}[boolean]{nosortothers}[true]{%
+ \settoggle{blx@nosortothers}{#1}}
+\blx@DeclareBackendOption{entry,namelist}[boolean]{nosortothers}
+
+\DeclareBiblatexOption{global,type}[string]{uniquename}[true]{%
+ \ifcsdef{blx@opt@uniquename@#1}
+ {\letcs\blx@uniquename{blx@opt@uniquename@#1}}
+ {\blx@err@invopt{uniquename=#1}{}}}
+\def\blx@opt@uniquename@false{false}
+\def\blx@opt@uniquename@init{init}
+\def\blx@opt@uniquename@true{full}
+\def\blx@opt@uniquename@full{full}
+\def\blx@opt@uniquename@allinit{allinit}
+\def\blx@opt@uniquename@allfull{allfull}
+\def\blx@opt@uniquename@mininit{mininit}
+\def\blx@opt@uniquename@minfull{minfull}
+
+\blx@DeclareBackendOption{entry,namelist,name}[string]{uniquename}
+
+\DeclareBiblatexOption{global,type}[boolean]{noroman}[true]{%
+ \settoggle{blx@noroman}{#1}}
+\blx@DeclareBackendOption{entry}[boolean]{noroman}
+
+\DeclareBiblatexOption{global,type}[boolean]{singletitle}[true]{%
+ \settoggle{blx@singletitle}{#1}}
+\blx@DeclareBackendOption{entry}[boolean]{singletitle}
+
+\DeclareBiblatexOption{global,type}[boolean]{uniquetitle}[true]{%
+ \settoggle{blx@uniquetitle}{#1}}
+\blx@DeclareBackendOption{entry}[boolean]{uniquetitle}
+
+\DeclareBiblatexOption{global,type}[boolean]{uniquebaretitle}[true]{%
+ \settoggle{blx@uniquebaretitle}{#1}}
+\blx@DeclareBackendOption{entry}[boolean]{uniquebaretitle}
+
+\DeclareBiblatexOption{global,type}[boolean]{uniquework}[true]{%
+ \settoggle{blx@uniquework}{#1}}
+\blx@DeclareBackendOption{entry}[boolean]{uniquework}
+
+\DeclareBiblatexOption{global,type}[boolean]{uniqueprimaryauthor}[true]{%
+ \settoggle{blx@uniqueprimaryauthor}{#1}}
+\blx@DeclareBackendOption{entry}[boolean]{uniqueprimaryauthor}
+
+
+\DeclareBibliographyOption[boolean]{defernumbers}[true]{%
+ \settoggle{blx@defernumbers}{#1}%
+ \iftoggle{blx@defernumbers}
+ {\blx@kv@setkeys{blx@opt@pre}{labelnumber}%
+ \let\blx@thelabelnumber\blx@addlabelnumber
+ \let\abx@aux@number\blx@aux@number}
+ {\let\blx@thelabelnumber\relax
+ \let\abx@aux@number\@gobblefive}}
+
+\DeclareBibliographyOption[boolean]{locallabelwidth}[true]{%
+ \blx@key@locallabelwidth{#1}}
+
+
+\DeclareBibliographyOption[string]{refsection}{%
+ \ifcsdef{blx@opt@refsection@#1}
+ {\letcs\blx@refsecreset@level{blx@opt@refsection@#1}}
+ {\blx@err@invopt{refsection=#1}{}}}
+\csdef{blx@opt@refsection@none}{0}
+\csdef{blx@opt@refsection@part}{1}
+\csdef{blx@opt@refsection@chapter}{2}
+\csdef{blx@opt@refsection@section}{3}
+\csdef{blx@opt@refsection@subsection}{4}
+\csdef{blx@opt@refsection@chapter+}{5}
+\csdef{blx@opt@refsection@section+}{6}
+\csdef{blx@opt@refsection@subsection+}{7}
+
+\blx@patchsection@switch{\blx@refsecreset@level}{\newrefsection}{}{}
+
+\DeclareBibliographyOption[string]{refsegment}{%
+ \ifcsdef{blx@opt@refsegment@#1}
+ {\letcs\blx@refsegreset@level{blx@opt@refsegment@#1}}
+ {\blx@err@invopt{refsegment=#1}{}}}
+\csdef{blx@opt@refsegment@none}{0}
+\csdef{blx@opt@refsegment@part}{1}
+\csdef{blx@opt@refsegment@chapter}{2}
+\csdef{blx@opt@refsegment@section}{3}
+\csdef{blx@opt@refsegment@subsection}{4}
+\csdef{blx@opt@refsegment@chapter+}{5}
+\csdef{blx@opt@refsegment@section+}{6}
+\csdef{blx@opt@refsegment@subsection+}{7}
+
+\blx@patchsection@switch{\blx@refsegreset@level}
+ {\newrefsegment}
+ {\ifnumgreater\blx@refsegreset@level\z@
+ {\ifnumgreater\blx@refsegreset@level\blx@refsecreset@level
+ {}
+ {\blx@err@confopt
+ {refsegment/refsection}
+ {The 'refsegment' option must point to a
+ lower-level\MessageBreak document division
+ than 'refsection'}%
+ \def\blx@refsegreset@level{0}}}
+ {}}
+ {}
+
+\DeclareBibliographyOption[string]{citereset}{%
+ \ifcsdef{blx@opt@citereset@#1}
+ {\letcs\blx@citereset@level{blx@opt@citereset@#1}}
+ {\blx@err@invopt{citereset=#1}{}}}
+\csdef{blx@opt@citereset@none}{0}
+\csdef{blx@opt@citereset@part}{1}
+\csdef{blx@opt@citereset@chapter}{2}
+\csdef{blx@opt@citereset@section}{3}
+\csdef{blx@opt@citereset@subsection}{4}
+\csdef{blx@opt@citereset@chapter+}{5}
+\csdef{blx@opt@citereset@section+}{6}
+\csdef{blx@opt@citereset@subsection+}{7}
+
+\blx@patchsection@switch{\blx@citereset@level}{\citereset\blx@inf@creset}{}{}
+
+\DeclareBibliographyOption[boolean]{bibwarn}[true]{%
+ \ifstrequal{#1}{true}
+ {\def\blx@bbl@thewarn{\blx@bbl@warn}}
+ {\let\blx@bbl@thewarn\@gobble}}
+
+% Name field options
+\def\do#1{%
+ \DeclareBiblatexOption{global,type,entry}[boolean]{use#1}[true]{%
+ \settoggle{blx@use#1}{##1}}}
+\abx@donames
+
+% Entry options
+\DeclareBiblatexOption{global,type,entry,namelist,name}[boolean]{useprefix}[true]{%
+ \settoggle{blx@useprefix}{#1}}
+
+\DeclareBiblatexOption{global,type,entry}[boolean]{skipbib}[true]{%
+ \settoggle{blx@skipbib}{#1}}
+
+\DeclareBiblatexOption{global,type,entry}[boolean]{skipbiblist}[true]{%
+ \settoggle{blx@skipbiblist}{#1}}
+
+\DeclareBiblatexOption{global,type,entry}[boolean]{skiplab}[true]{%
+ \settoggle{blx@skiplab}{#1}}
+
+\DeclareBiblatexOption{global,type}[boolean]{dataonly}[true]{%
+ \settoggle{blx@skipbib}{#1}%
+ \settoggle{blx@skipbiblist}{#1}%
+ \settoggle{blx@skiplab}{#1}}
+% the entry option is resolved by Biber
+\blx@DeclareBackendOption{entry}[boolean]{dataonly}
+% This is handled in a special way by by biber. It indicates what to set for various options
+% if the dataonly option is "true". If biber finds dataonly=false
+% in an entry, the booleans here will be reversed (skip*) and the unique* options (which are not
+% booleans) will be ignored, defaulting to higher scope values. biber assumes
+% that \blx@bcf@backendin@entry@* options are boolean options as otherwise, negating them
+% per-entry makes little sense and it is not clear what to do with such lower-scope overrides.
+\gdef\blx@bcf@backendin@entry@dataonly{uniquename=false,uniquelist=false,%
+ skipbib=true,skipbiblist=true,skiplab=true}
+
+% Option processor/scheduler
+\DeclareOption*{%
+ \begingroup
+ \def\blx@tempa#1=#2&{#1}%
+ \edef\blx@tempa{%
+ \expandafter\blx@tempa\CurrentOption=&}%
+ \blx@kv@ifkeyundef{blx@opt@ldt}{\blx@tempa}
+ {% now it becomes messy,
+ % we need to intercept the bibtexcaseprotection option
+ % because it is only defined by the case changing code
+ % which is loaded after load-time options are processed
+ \ifdefstring\blx@tempa{bibtexcaseprotection}
+ {\endgroup
+ \edef\blx@deferoption@bibtexcaseprotection{\CurrentOption}}
+ {\endgroup
+ \eappto\blx@theoptions{\CurrentOption,}}}
+ {\edef\blx@tempa{\endgroup
+ \noexpand\blx@kv@setkeys{blx@opt@ldt}{\CurrentOption}}%
+ \blx@tempa}}
+
+\def\blx@processoptions{%
+ \ifundef\blx@theoptions
+ {}
+ {\begingroup
+ \edef\blx@tempa{\endgroup
+ \noexpand\blx@kv@setkeys{blx@opt@pre}{\blx@theoptions}}%
+ \blx@tempa}}
+
+%% Initial setup
+
+\define@key{blx@opt@ldt}{casechanger}[auto]{%
+ \ifcsundef{blx@opt@casechanger@#1}
+ {\blx@err@invopt
+ {casechanger=#1}
+ {Valid options for 'casechanger' are 'auto', 'expl3' and
+ 'latex2e'}}
+ {\csletcs{blx@deferoption@casechanger}{blx@opt@casechanger@#1}}}
+
+
+\csdef{blx@opt@casechanger@auto}{%
+ \ifdefstring{\blx@texencoding}{utf8}
+ {\blx@info@noline{Document encoding is UTF8 ...}%
+ \RequirePackage{expl3}[2020/04/06]%
+ \@ifpackagelater{expl3}{2020/04/06}
+ {\blx@info@noline{... and expl3\MessageBreak\csuse{ver@expl3.sty}\MessageBreak
+ is new enough (at least 2020/04/06),\MessageBreak
+ setting 'casechanger=expl3'}%
+ \csuse{blx@opt@casechanger@expl3}}
+ {\blx@info@noline{... but expl3\MessageBreak\csuse{ver@expl3.sty}\MessageBreak
+ is too old (older than 2020/04/06),\MessageBreak
+ setting 'casechanger=latex2e'}%
+ \csuse{blx@opt@casechanger@latex2e}}}
+ {\blx@info@noline{%
+ Document encoding not detected as UTF8.\MessageBreak
+ Setting 'casechanger=latex2e'}%
+ \csuse{blx@opt@casechanger@latex2e}}}
+
+\csdef{blx@opt@casechanger@latex2e}{%
+ \RequirePackage{blx-case-latex2e\abx@filespf}}
+\csletcs{blx@opt@casechanger@2e}{blx@opt@casechanger@latex2e}
+
+\csdef{blx@opt@casechanger@expl3}{%
+ \ifdefstring{\blx@texencoding}{utf8}
+ {}
+ {\blx@warning@noline{%
+ The expl3 case changer code should only be used\MessageBreak
+ with UTF-8 encoding.\MessageBreak
+ But the document encoding was detected as
+ '\blx@texencoding'.\MessageBreak
+ Case changing macros may break\MessageBreak
+ if used with non-ASCII characters}}%
+ \RequirePackage{blx-case-expl3\abx@filespf}}
+\csletcs{blx@opt@casechanger@3}{blx@opt@casechanger@expl3}
+
+% default to auto
+\csletcs{blx@deferoption@casechanger}{blx@opt@casechanger@auto}
+
+% This is a bit unfortunate, but we need some more definitions after
+% loading the case changing code.
+\def\blx@casechange@postload{%
+ % Language fallback, in order:
+ % * explicit option language=<lang>, which overrides everything
+ % * langid field of entry
+ % * babel/polyglossia lang
+ % * main document lang (we should never reach this)
+ % * <empty> (we should *definitely* never reach this)
+ % Everything here is expandable so that
+ % \blx@mksc@lang expands to the language name.
+ \def\blx@mksc@lang{%
+ \ifundef\blx@forcelanguagename
+ {\ifundef\abx@field@langid
+ {\ifundef\blx@languagename
+ {\ifundef\blx@main@language
+ {}
+ {\blx@main@language}}
+ {\blx@languagename}}
+ {\abx@field@langid}}
+ {\blx@forcelanguagename}}%
+ %
+ \DeclareCaseLangs{%
+ american,british,canadian,
+ english,USenglish,UKenglish,
+ australian,newzealand}%
+ % Textcase defines \NoCaseChange as \let\NoCaseChange\@firstofone
+ \ifundef\NoCaseChange
+ {\let\NoCaseChange\@firstofone}
+ {}%
+ % we also need to defer the bibtexcaseprotection option until after we load
+ % the case changing code
+ \ifundef\blx@deferoption@bibtexcaseprotection
+ {}
+ {\begingroup
+ \edef\blx@tempa{\endgroup
+ \noexpand\blx@kv@setkeys{blx@opt@pre}{%
+ \blx@deferoption@bibtexcaseprotection}}%
+ \blx@tempa}}
+% That's it for the case change code
+
+% Set defaults
+\blx@kv@setkeys{blx@opt@ldt}{style=numeric}
+\blx@kv@setkeys{blx@opt@pre}{%
+ sorting=nty,sortlocale=auto,sortcase,sortupper,sortcites=false,pluralothers=false,
+ maxnames=3,minnames=1,maxalphanames=3,minalphanames=1,
+ maxitems=3,minitems=1,mincrossrefs=2,minxrefs=2,
+ useauthor=true,useeditor=true,usetranslator=false,
+ indexing=false,abbreviate=true,dateabbrev=true,dateera=astronomical,
+ backref=false,backrefsetstyle=setonly,backreffloats=true,
+ pagetracker=false,
+ ibidtracker=false,idemtracker=false,opcittracker=false,loccittracker=false,
+ citetracker=false,trackfloats=false,
+ citecounter=false,block=none,language=autobib,clearlang=true,autolang=none,
+ autofieldlang=none,autofieldlangstrings=false,date=comp,labeldate=year,origdate=comp,
+ eventdate=comp,urldate=short,autopunct=true,punctfont=false,defernumbers=false,
+ timezeros=true,refsection=none,refsegment=none,citereset=none,hyperref=auto,
+ parentracker,maxparens=3,bibencoding=auto,bibwarn,timezones=false,
+ seconds=false,julian=false,labeltime=24h,locallabelwidth=false,msform=default,
+ dynamiclabel=false,langhook=captions}
+
+% Load Unicode enhancements (only for LuaTeX and XeTeX)
+\ifboolexpr{
+ not test {\ifundef\XeTeXrevision}
+ or
+ not test {\ifundef\luatexversion}}
+ {\blx@inputonce{blx-unicode.def}{enhanced support for Unicode engines}{}{}{}{}}
+ {}
+
+% Load compatibility code
+\blx@inputonce{blx-compat.def}{compatibility code}{}{}{}{}
+
+
+% Restore catcodes
+\blx@catcodes
+\undef\blx@catcodes
+
+% Process load-time options
+\ProcessOptions*
+
+% Switch to BibTeX support if requested
+\iftoggle{blx@bibtex}
+ {\blx@inputonce{blx-bibtex.def}{BibTeX backend compatibility}{}{}{}{}}
+ {}
+
+% Load citation and bibliography styles, configuration file
+\blx@inputonce{biblatex.def}{generic definitions}{}{}{}{}
+\iftoggle{blx@natbib}
+ {\blx@inputonce{blx-natbib.def}{natbib compatibility}{}{}{}{}}
+ {}
+\iftoggle{blx@mcite}
+ {\blx@inputonce{blx-mcite.def}{mcite-like commands}{}{}{}{}}
+ {}
+\RequireBibliographyStyle{\blx@bbxfile}
+\RequireCitationStyle{\blx@cbxfile}
+\blx@secinit
+\citereset
+\blx@inputonce{biblatex.cfg}{configuration file}{}{}{}{}
+
+% Process preamble options
+\blx@processoptions
+
+% first stab at guessing the file encoding
+\def\blx@guesstexencoding{%
+ \ifdef\blx@texencoding@fromoption
+ {\let\blx@texencoding\blx@texencoding@fromoption
+ \blx@info@noline{%
+ Input encoding '\blx@texencoding' specified}}
+ {\ifundef\inputencodingname
+ {\ifundef\XeTeXrevision
+ {\ifundef\luatexversion
+ {\def\blx@texencoding{ascii}%
+ \blx@info@noline{%
+ No input encoding detected.\MessageBreak
+ Assuming '\blx@texencoding'}}
+ {\def\blx@texencoding{utf8}%
+ \blx@info@noline{%
+ LuaTeX detected.\MessageBreak
+ Assuming input encoding '\blx@texencoding'}}}
+ {\def\blx@texencoding{utf8}%
+ \blx@info@noline{%
+ XeTeX detected.\MessageBreak
+ Assuming input encoding '\blx@texencoding'}}}
+ {\ifcsdef{blx@inpenc@\inputencodingname}
+ {\letcs\blx@texencoding{blx@inpenc@\inputencodingname}}
+ {\let\blx@texencoding\inputencodingname}%
+ \blx@info@noline{%
+ Input encoding '\blx@texencoding' detected}}}}
+
+\blx@guesstexencoding
+\let\blx@texencoding@firstguess\blx@texencoding
+
+% this ultimately loads either
+% blx-case-expl3.def or blx-case-latex2e.def
+\blx@deferoption@casechanger
+\blx@casechange@postload
+
+
+% Deferred setup at end of preamble
+\AtEndPreamble{%
+ \blx@checkoptions@global
+ \c@maxnames\blx@maxcitenames\relax
+ \c@minnames\blx@mincitenames\relax
+ \c@maxitems\blx@maxitems\relax
+ \c@minitems\blx@minitems\relax
+ \togglefalse{abx@bool@xinits}
+ \def\do#1{\iftoggle{abx@bool@#1inits}{\toggletrue{abx@bool@xinits}}{}}
+ \abx@donameparts
+ \iftoggle{abx@bool@xinits}
+ {\ifdefstrequal\blx@uniquename\blx@opt@uniquename@full
+ {\blx@warn@conflopt{%
+ '<namepart>inits' conflicts with 'uniquename=full'.\MessageBreak
+ Setting 'uniquename=init'}%
+ \blx@kv@setkeys{blx@opt@pre}{uniquename=init}}
+ {}%
+ \ifdefstrequal\blx@uniquename\blx@opt@uniquename@allfull
+ {\blx@warn@conflopt{%
+ '<namepart>inits' conflicts with 'uniquename=allfull'.\MessageBreak
+ Setting 'uniquename=allinit}%
+ \blx@kv@setkeys{blx@opt@pre}{uniquename=allinit}}
+ {}%
+ \ifdefstrequal\blx@uniquename\blx@opt@uniquename@minfull
+ {\blx@warn@conflopt{%
+ '<namepart>inits' conflicts with 'uniquename=minfull'.\MessageBreak
+ Setting 'uniquename=mininit}%
+ \blx@kv@setkeys{blx@opt@pre}{uniquename=mininit}}
+ {}}
+ {}%
+ \nottoggle{blx@labeldateparts}
+ {\ifdefstrequal\blx@uniquelist\blx@opt@uniquelist@minyear
+ {\blx@warn@conflopt{%
+ 'uniquelist=minyear' requires 'labeldateparts'.\MessageBreak
+ Setting 'uniquelist=true'}%
+ \blx@kv@setkeys{blx@opt@pre}{uniquelist}}
+ {}}
+ {}%
+ \def\do#1{%
+ \ifcsstring{blx@dateformat@#1}{iso}
+ {\blx@stripfromendinto{#1}{date}\blx@datetype
+ \ifdefstring\blx@dateera{astronomical}{}
+ {\blx@warn@conflopt{%
+ '#1=iso' requires 'dateera=astronomical'.\MessageBreak
+ Setting 'dateera=astronomical'}%
+ \blx@kv@setkeys{blx@opt@pre}{dateera=astronomical}}%
+ \ifcsstring{blx@timeformat@\blx@datetype time}{24h}%
+ {}
+ {\blx@warn@conflopt{%
+ '#1=iso' requires '\blx@datetype time=24h'.\MessageBreak
+ Setting '\blx@datetype time=24h'}%
+ \blx@kv@setkeys{blx@opt@pre}{\blx@datetype time=24h}}%
+ \iftoggle{blx@julian}
+ {\blx@warn@conflopt{%
+ '#1=iso' requires 'julian=false'.\MessageBreak
+ Setting 'julian=false'}%
+ \blx@kv@setkeys{blx@opt@pre}{julian=false}}
+ {}%
+ \nottoggle{blx@datezeros}
+ {\blx@warn@conflopt{%
+ '#1=iso' requires 'datezeros=true'.\MessageBreak
+ Setting 'datezeros=true'}%
+ \blx@kv@setkeys{blx@opt@pre}{datezeros=true}}
+ {}%
+ \nottoggle{blx@timezeros}
+ {\blx@warn@conflopt{%
+ '#1=iso' requires 'timezeros=true'.\MessageBreak
+ Setting 'timezeros=true'}%
+ \blx@kv@setkeys{blx@opt@pre}{timezeros=true}}
+ {}%
+ \nottoggle{blx@seconds}
+ {\blx@warn@conflopt{%
+ '#1=iso' requires 'seconds=true'.\MessageBreak
+ Setting 'seconds=true'}%
+ \blx@kv@setkeys{blx@opt@pre}{seconds=true}}
+ {}}
+ {}}%
+ \abx@dodates
+ \do{labeldate}}
+
+
+
+\def\blx@checkencoding{%
+ \blx@guesstexencoding
+ \ifdefstrequal\blx@texencoding@firstguess\blx@texencoding
+ {}
+ {\blx@warning@noline{%
+ Initial guess for file encoding (\blx@texencoding@firstguess)\MessageBreak
+ and new guess (\blx@texencoding) do not match.\MessageBreak
+ Please set up your document encoding *before*\MessageBreak
+ loading biblatex.\MessageBreak
+ The case changing code might not work as expected}}%
+ \ifdef\blx@bibencoding
+ {\ifdefstring\blx@bibencoding{ascii}
+ {\blx@info@noline{%
+ Data encoding '\blx@bibencoding' specified.\MessageBreak
+ No need to reencode data}}
+ {\ifdefstring\blx@bibencoding{auto}
+ {\let\blx@bibencoding\blx@texencoding
+ \blx@info@noline{%
+ Automatic encoding selection.\MessageBreak
+ Assuming data encoding '\blx@bibencoding'}}
+ {\ifdefstrequal\blx@bibencoding\blx@texencoding
+ {\blx@info@noline{%
+ Data encoding '\blx@bibencoding' specified.\MessageBreak
+ No need to reencode data}}
+ {\blx@info@noline{%
+ Data encoding '\blx@bibencoding' specified.\MessageBreak
+ Backend will reencode on the fly}}}}}
+ {\def\blx@bibencoding{ascii}%
+ \blx@info@noline{%
+ Data encoding not specified.\MessageBreak
+ Assuming '\blx@bibencoding'}}%
+ \ifboolexpr{%
+ togl {blx@safeinputenc}
+ and ( test {\@ifpackageloaded{inputenc}}
+ or
+ test {\@ifpackageloaded{inputenx}} )
+ }
+ {\def\blx@texencoding{ascii}%
+ \blx@info@noline{%
+ Input encoding '\blx@texencoding' forced by\MessageBreak
+ 'safeinputenc' option}}
+ {}%
+}
+
+% Deferred last minute setup
+\AtBeginDocument{%
+ \blx@auxwrite\@mainaux{}{\string\abx@aux@refcontext{\blx@refcontext@context}}
+ \blx@checkencoding
+ \if@filesw
+ \blx@ctrlwrite
+ \fi
+ \blx@bblinput
+ \setcounter{blx@maxsection}{0}%
+ \csuse{blx@hook@refsectioninit}%
+ \csuse{abx@preamble}%
+ \blx@inf@refsec
+ \blx@inf@refseg}
+
+\AtEndOfPackage{%
+ % Data model macros are forbidden after package load is finished
+ \def\blx@warn@dm#1{\blx@warning@noline{Data model macro '#1' cannot be used in preamble}}
+ \def\ResetDatamodelEntrytypes{\blx@warn@dm{ResetDatamodelEntrytypes}}
+ \def\ResetDatamodelFields{\blx@warn@dm{ResetDatamodelFields}}
+ \def\ResetDatamodelEntryfields{\blx@warn@dm{ResetDatamodelEntryfields}}
+ \def\ResetDatamodelConstraints{\blx@warn@dm{ResetDatamodelConstraints}}
+ \renewcommand*{\DeclareDatamodelMultiscriptEntryfields}[1]{\blx@warn@dm{DeclareDatamodelMultiscriptEntryfields}}
+ \renewcommand*{\DeclareDatamodelEntrytypes}[2][]{\blx@warn@dm{DeclareDatamodelEntrytypes}}
+ \renewcommand*{\DeclareDatamodelFields}[2][]{\blx@warn@dm{DeclareDatamodelFields}}
+ \renewcommand*{\DeclareDatamodelEntryfields}[2][]{\blx@warn@dm{DeclareDatamodelEntryfields}}
+ \renewcommand*{\DeclareDatamodelConstraints}[2][]{\blx@warn@dm{DeclareDatamodelConstraints}}
+ \renewcommand*{\DeclareDatamodelConstant}[3][]{\blx@warn@dm{DeclareDatamodelConstant}}
+ \AtBeginDocument{%
+ \let\do\undef
+ \blx@dopreamblecmds
+ \let\do\noexpand}}
+
+\def\BiblatexHungarianWarningOff{\global\let\lbx@hu@loadinfo\@empty}
+\def\BiblatexLatvianWarningOff{\global\let\lbx@lv@loadinfo\@empty}
+\def\BiblatexSplitbibDefernumbersWarningOff{%
+ \global\let\blx@printbibchecks@suppresswarn\@empty}
+
+\endinput