1\ProvidesPackage{listings}
2\RequirePackage{keyval}
3\@primitives{listings}
4%%%%%%%%%%% interface keyval
5\def\lst@define@key#1#2{\define@key{lst}{#1}{\@funcall{#2}{##1}}}
6\newenvironment{lst@protect}
7  {\@clearstyle\def\%{\@print{\%}}%
8   \def\#{\@print{\#}}%
9   \def\${\@print{\$}}%
10   \def\{{\@print{\{}}%
11   \def\}{\@print{\}}}%
12   \def\_{\@print{\_}}%
13   \def\&{\@print{\&}}%
14   \def\ref{\@print{\ref}}}
15  {}
16\def\lst@define@key@opt#1#2#3{\define@key{lst}{#1}[#3]
17  {\@callopt{#2}{\begin{lst@protect}##1\end{lst@protect}}}}
18\def\ignore@key#1{\define@key{lst}{#1}{}}
19%%%%%%%%%%%
20% Helpers %
21%%%%%%%%%%%
22\def\lstinfo#1{\typeout{LST, #1}}
23\def\lst@iter#1#2{%\hva@warn{\lst@iter '#1' '#2'}%
24\@iter#1,{#2}}
25%For getting rid of two (optional) levels of braces
26\def\lst@eat@again#1XXX#2{\@callsubst{#2}{#1\@empty\@empty\@empty\@empty\@empty}}
27\def\lst@eat@key#1XXX#2{\@callsubst{\lst@eat@again}{#1XXX#2}}
28%%%%%%%% Interface with keyval
29\def\lstset#1{\@setkeys{lst}{#1}}
30%%%%%%%% Def if not empty
31\newcommand{\lst@defne}[2]{\ifx#1\@empty\def#1{#2}\fi}
32%%%%%%%%%%%%%
33% Toks regs %
34%%%%%%%%%%%%%
35\newcommand{\lst@Empty}[1]{\let#1\@empty}
36%%%%%%%%%%%%
37% Hooks    %
38%%%%%%%%%%%%
39\newcommand{\lst@Hook}[1]
40  {\newtokens{\csname lsthk@#1\endcsname}}
41\newcommand{\lst@ResetHook}[1]
42  {\resettokens{\csname lsthk@#1\endcsname}}
43\newcommand{\lst@UseHook}[1]
44  {\csname lsthk@#1\endcsname}
45\newcommand{\lst@AddToHook}[2]
46  {\addtokens{\csname lsthk@#1\endcsname}{#2}}
47\newcommand{\lst@AddToHookExe}[2]
48  {\lst@AddToHook{#1}{#2}#2}
49\lst@Hook{EOL}\lst@Hook{InitVarEOL}
50\lst@Hook{InitVarBOL}\lst@Hook{EveryLine}\lst@Hook{LastLine}
51\lst@Hook{PreSet}
52\lst@Hook{InitVar}
53\lst@Hook{Init}
54\lst@Hook{DeInit}
55\lst@Hook{SelectCharTable}
56\lst@Hook{SetLanguage}
57\lst@Hook{AfterSetLanguage}
58\lst@AddToHook{SetLanguage}{\lst@ResetHook{AfterSetLanguage}}
59\lst@Hook{SetStyle}
60\def\lststy@{\lsthk@EmptyStyle}
61\lst@Hook{EmptyStyle}
62\lst@Hook{EmptyLanguage}
63\lst@Hook{InlineUnsave}
64%%Avoid explicit TT in listings, they are useless with style sheets
65\lst@AddToHook{Init}{\let\tt\@empty}
66%%%%%%%%%%%%
67% Keywords %
68%%%%%%%%%%%%
69\newtokens{\lst@delete@all@kwd@class}%
70\def\lst@record@kwd@class#1#2{%
71%\hva@warn{RECORD '#1' '#2'}%
72\ifu\csname lst@allkwd@#1\endcsname%
73\addtokens{\lst@delete@all@kwd@class}{\lst@delete@kwd@class{#1}}\fi%
74\providecommand{\csname lst@allkwd@#1\endcsname}{}%
75\lst@AddTo,{\csname lst@allkwd@#1\endcsname}{\lst@normalize{#2}}}
76\def\lst@delete@kwd@class#1{%
77%\hva@warn{DELETE '#1'}%
78\ifu\csname lst@allkwd@#1\endcsname\else
79\@callprim{\lst@delete@kwds}{\{\csname lst@allkwd@#1\endcsname\}}%
80\lst@Empty{\csname lst@allkwd@#1\endcsname}\fi}
81\newcommand{\lst@allotherkeywords}{}
82\def\lst@record@okwds#1{\lst@AddTo,{\lst@allotherkeywords}{\lst@normalize{#1}}}
83\newcommand{\lst@alldirectives}{}
84\def\lst@record@directives#1{\lst@AddTo,{\lst@alldirectives}{\lst@normalize{#1}}}
85\lst@AddToHook{SetLanguage}
86  {\lst@delete@all@kwd@class%
87  \@callprim{\lst@delete@okwds}{\{\@rawchars{\lst@allotherkeywords}\}}%
88  \@callprim{\lst@delete@directives}{\{\lst@alldirectives\}}}
89\def\lst@install@kwd#1#2{%
90%\hva@warn{INSTALL: #2 -> #1}%
91\def\csname lstk@\lst@normalize{#2}\endcsname{#1}}
92\def\lst@install@kwds#1#2{%
93%     \hva@warn{RESET: �#1�}%
94    \lst@delete@kwd@class{#1}%
95    \lst@record@kwd@class{#1}{#2}%
96    \lst@iter{\lst@install@kwd{\csname lst@keywordstyle#1\endcsname}}{#2}}
97\def\lst@more@kwds#1#2{%
98%    \hva@warn{MORE: �#1�}%
99    \lst@record@kwd@class{#1}{#2}%
100    \lst@iter{\lst@install@kwd{\csname lst@keywordstyle#1\endcsname}}{#2}}
101\def\lst@install@directive#1#2{\def\csname lstd@\lst@normalize{#2}\endcsname{#1}}
102\def\lst@install@directives
103  #1#2{%
104    \lst@directivestrue%
105    \lst@record@directives{#2}%
106    \lst@iter{\lst@install@directive{#1}}{#2}}
107\def\lst@install@okwds
108  #1#2{%
109    \lst@record@okwds{#2}%
110    \lst@iter{\lst@install@kwd{#1}}{#2}}
111\def\lst@delete@kwd#1{%
112%\hva@warn{DELETE #1}%
113\def\csname lstk@\@rawchars{#1}\endcsname{\lst@identifierstyle}}
114\def\lst@delete@directive
115  #1{\def\csname lstd@\@rawchars{#1}\endcsname{}}
116\def\lst@delete@okwds#1{\lst@iter{\lst@delete@okwd}{#1}}
117\def\lst@delete@kwds#1{%\hva@warn{\lst@delete@kwds '#1'}%
118\lst@iter{\lst@delete@kwd}{#1}}
119\def\lst@delete@directives#1{\lst@iter{\lst@delete@directive}{#1}}
120\def\lst@delete@okwd
121  #1{\def\csname lstk@\@rawchars{#1}\endcsname{}}
122\def\lst@delay@install#1#2{\lst@AddToHook{AfterSetLanguage}
123{\lst@install@kwds{#1}{#2}}}
124\def\lst@delay@more#1#2{\lst@AddToHook{AfterSetLanguage}
125{\lst@more@kwds{#1}{#2}}}
126\def\lst@delay@delete#1#2{\lst@AddToHook{AfterSetLanguage}{\lst@delete@kwds{#2}}}
127\def\lst@keywords@key#1#2\@empty{\lst@install@kwds{#1}{#2}}
128\def\lst@morekeywords@key#1#2\@empty{\lst@more@kwds{#1}{#2}}
129\def\lst@deletekeywords@key#1#2\@empty{\lst@delete@kwds{#2}}
130\define@key{lst}{keywords}[]{\@callsubstopt{\lst@keywords@key}{1}{#1\@empty}}
131\define@key{lst}{morekeywords}[]
132  {\@callsubstopt{\lst@morekeywords@key}{1}{#1\@empty}}
133\define@key{lst}{deletekeywords}[]
134  {\@callsubstopt{\lst@deletekeywords@key}{1}{#1\@empty}}
135%%2nd
136\define@key{lst}{ndkeywords}[]
137  {\@funcall{\lst@keywords@key}{{2}#1\@empty}}
138\define@key{lst}{morendkeywords}[]
139  {\@funcall{\lst@morekeywords@key}{{2}#1\@empty}}
140\define@key{lst}{deletendkeywords}[]
141  {\@funcall{\lst@deletekeywords@key}{{2}#1\@empty}}
142%%3rd
143\define@key{lst}{rdkeywords}[]{\@callsubstopt{\lst@keywords@key}{3}{#1\@empty}}
144\define@key{lst}{morerdkeywords}[]
145  {\@funcall{\lst@morekeywords@key}{{3}#1\@empty}}
146\define@key{lst}{deleterdkeywords}[]
147  {\@funcall{\lst@deletekeywords@key}{{3}#1\@empty}}
148%%% Directives
149\def\lst@delay@dinstall#1#2{\lst@AddToHook{AfterSetLanguage}{\lst@install@directives{#1}{#2}}}
150\def\lst@delay@ddelete#1{\lst@AddToHook{AfterSetLanguage}{\lst@delete@directives{#1}}}
151\define@key{lst}{directives}{\lst@delay@dinstall\lst@directivestyle#1}
152\define@key{lst}{moredirectives}{\lst@delay@dinstall\lst@directivestyle#1}
153%%%%%%% Styles applied to keywords, strings etc %%%%%%
154\newcommand{\lst@keywordstyle@key}[2][1]
155{\def\csname lst@keywordstyle#1\endcsname##1{#2{##1}}}
156\def\lst@keywordstyle{\csname lst@keywordstyle1\endcsname}
157\define@key{lst}{keywordstyle}{\@calloptsimple{\lst@keywordstyle@key}{#1}}
158%\define@key{lst}{keywordstyle}{\def\lst@kwdstyle##1{#1{##1}}}
159\define@key{lst}{ndkeywordstyle}{\@calloptsimple{\lst@keywordstyle@key}{[2]#1}}
160\define@key{lst}{rdkeywordstyle}{\@calloptsimple{\lst@keywordstyle@key}{[3]#1}}
161\define@key{lst}{otherkeywordstyle}{\def\lst@okwdstyle##1{#1{##1}}}
162\define@key{lst}{directivestyle}{\def\lst@directivestyle##1{#1{##1}}}
163\define@key{lst}{identifierstyle}[]{\def\lst@identifierstyle##1{#1{##1}}}
164\define@key{lst}{basicstyle}{\def\lst@basicstyle{#1}}
165\define@key{lst}{commentstyle}{\def\lst@commentstyle{#1}}
166\define@key{lst}{stringstyle}{\def\lst@stringstyle{#1}}
167\lst@AddToHook{EmptyStyle}{\let\lst@stringstyle\@empty}
168\lst@AddToHook{EmptyStyle}{\let\lst@commentstyle\em}
169\lst@AddToHook{EmptyStyle}{\let\lst@identifierstyle\@empty}
170\lst@AddToHook{EmptyStyle}{\let\lst@basicstyle\@empty}
171\lst@AddToHook{EmptyStyle}{\lst@keywordstyle@key[1]{\bfseries}}
172\lst@AddToHook{EmptyStyle}
173{\lst@keywordstyle@key[2]{\csname lst@keywordstyle1\endcsname}}
174\lst@AddToHook{EmptyStyle}
175{\lst@keywordstyle@key[3]{\csname lst@keywordstyle1\endcsname}}
176\lst@AddToHook{EmptyStyle}{\def\lst@okwdstyle{\lst@keywordstyle}}
177\lst@AddToHook{EmptyStyle}{\def\lst@directivestyle{\lst@keywordstyle}}
178\lst@AddToHook{EmptyStyle}{\def\lst@directivestyle{\lst@keywordstyle}}
179%%%%%% Emph identifiers, classes seems to be implemented properly
180\def\lst@defall#1#2{\def\csname #1\endcsname{#2}}
181\def\lst@emphstyle@key#1#2\@empty{\lst@defall{lst@emphstyle#1}{#2}}
182\def\lst@emphstyle{\csname lst@emphstyle1\endcsname}
183\lst@AddToHook{EmptyStyle}{\let\csname lst@emphstyle1\endcsname\@empty}
184\define@key{lst}{emphstyle}{\@callsubstopt{\lst@emphstyle@key}{1}{#1\@empty}}
185\def\lst@record@class#1#2{%
186  \providecommand{\csname lst@allemph@#1\endcsname}{}%
187  \lst@AddTo,{\csname lst@allemph@#1\endcsname}{\lst@normalize{#2}}}
188\def\lst@delete@class#1{%
189  \ifu\csname lst@allemph@#1\endcsname\else
190  \@callprim{\lst@delete@kwds}{\{\csname lst@allemph@#1\endcsname\}}%
191  \lst@Empty{\csname lst@allemph@#1\endcsname}\fi}
192\def\lst@moreemph@key#1#2\@empty{%
193  \lst@record@class{#1}{#2}%
194  \lst@iter{\lst@install@kwd{\csname lst@emphstyle#1\endcsname}}{#2}}
195\define@key{lst}{moreemph}{\@callsubstopt{\lst@moreemph@key}{1}{#1\@empty}}
196%%%Class number is not checked...
197\def\lst@deleteemph@key#1#2\@empty{\lst@iter{\lst@delete@kwd}{#2}}
198\define@key{lst}{deleteemph}{\@callsubstopt{\lst@deleteemph@key}{1}{#1\@empty}}
199\def\lst@emph@key#1#2\@empty{%
200  \lst@delete@class{#1}%
201  \lst@record@class{#1}{#2}%
202  \lst@iter{\lst@install@kwd{\csname lst@emphstyle#1\endcsname}}{#2}}
203\define@key{lst}{emph}[]{\@callsubstopt\lst@emph@key{1}{#1\@empty}}
204%%%%%% Style definitions
205\define@key{lst}{style}[{}]{\lsthk@SetStyle\csname lst@sty#1\endcsname}
206\newcommand{\lstdefinestyle}[2]
207  {\def\csname lst@sty#1\endcsname{\lstset{#2}}}
208%%%%%% Language definitions
209\newcommand{\lst@define@dd}[2][]
210  {\newcommand{\csname lstdd@\MakeLowercase{#2}\endcsname}{\MakeLowercase{#1}}}
211\newcommand{\lst@mklang}[2][]
212  {\ifthenelse{\equal{#1}{}}
213    {lstlang@\MakeLowercase{#2}@\csname lstdd@\MakeLowercase{#2}\endcsname}
214    {lstlang@\MakeLowercase{#2}@\MakeLowercase{#1}}}
215\newcommand{\lst@language@key}[2][]
216  {\lst@UseHook{SetLanguage}%
217  \csname\lst@mklang[#1]{#2}\endcsname%
218  \lst@UseHook{AfterSetLanguage}}
219%  \lst@UseHook{AfterSetLanguage}}
220\lst@define@key@opt{language}{\lst@language@key}{}
221\newcommand{\lst@checkdd}[2]
222  {\@ifundefined{lstdd@\MakeLowercase{#1}}{\lst@define@dd[#2]{#1}}{}}
223%Awfull hack to avoid defining XML language (hevea crash)
224\def\lst@XML{XML}
225\newcommand{\lst@definelanguage@}[3]
226  {\def\@tmp{#1}\ifx\@tmp\lst@XML\else
227  \lst@checkdd{#1}{#2}\def\csname\lst@mklang[#2]{#1}\endcsname{\lstset{#3}}\fi}
228\newcommand{\lst@derivelanguage@}[5]
229  {\lst@checkdd{#1}{#2}%
230  \def\csname\lst@mklang[#2]{#1}\endcsname{\csname\lst@mklang[#4]{#3}\endcsname
231%    \lst@UseHook{AfterSetLanguage}\lst@ResetHook{AfterSetLanguage}%
232    \lstset{#5}}}
233\lst@define@key@opt{defaultdialect}{\lst@define@dd}{}
234%%%%%%% Frames
235\newstyle{.lstlisting}{font-family:monospace;white-space:pre;margin-right:auto;margin-left:0pt;text-align:left}
236\setenvclass{lstlisting}{lstlisting}
237\setenvclass{lstframe}{lstframe}
238\def\lst@bgcolor@in@temp{%
239   \let\old@color\color%
240   \renewcommand{\color}[2][!*!]{\@getstylecolor[##1]{##2}}%
241   \prim@def\lst@temp@bgcolor{background-color:\lst@bgcolor;}%
242   \let\color\old@color}
243\def\lst@rulecolor@in@temp{%
244   \let\old@color\color%
245   \renewcommand{\color}[2][!*!]{\@getstylecolor[##1]{##2}}%
246   \prim@def\lst@temp@rulecolor{border-color:\lst@rulecolor;}%
247   \let\color\old@color}
248\def\lst@border@none{border-style:none;}
249\def\lst@border@leftline{border-left-style:solid;}
250\def\lst@border@topline{border-top-style:solid;}
251\def\lst@border@bottomline{border-bottom-style:solid;}
252\def\lst@border@lines{border-style:solid none;}
253\def\lst@border@single{border-style:solid;}
254\def\lst@border@shadowbox{border-style:outset;}
255\def\lst@frame@in@temp{%
256   \ifu\csname lst@border@\lst@frame\endcsname
257   \prim@def\lst@temp@frame{\lst@see@frame{\lst@frame}}%
258   \else
259   \let\lst@temp@frame\csname lst@border@\lst@frame\endcsname
260   \fi
261}
262\let\lst@whitepre\whitepretrue
263\lst@AddToHook{InitVar}
264  {\ifu\lst@cell@needed
265   \def\@@open@lstbox{\@open{DIV}{\envclass@attr{lstlisting}}}%
266   \def\@close@lstbox{\@close{DIV}}%
267   \else
268   \ifu\lst@bgcolor\def\lst@temp@bgcolor{}\else\lst@bgcolor@in@temp\fi%
269   \ifu\lst@rulecolor\def\lst@temp@rulecolor{}\else\lst@rulecolor@in@temp\fi%
270   \ifu\lst@frame\def\lst@temp@frame{}\else\lst@frame@in@temp\fi%
271   \def\@@open@lstbox{\@opencell{\envclass@attr[ ]{lstframe}style="padding:1ex;\lst@temp@bgcolor\lst@temp@frame\lst@temp@rulecolor"}{}{\envclass@attr{lstlisting}}}%
272   \def\@close@lstbox{\@closecell}%
273   \fi
274   \def\@open@lstbox{\@@open@lstbox\lst@whitepre}}
275\def\colorwarning{\hva@warn{Colors in listings and 'color' package not loaded}}
276\define@key{lst}{backgroundcolor}
277{\ifu\color\colorwarning\else\def\lst@cell@needed{}\def\lst@bgcolor{#1}\fi}
278\define@key{lst}{frame}{\def\lst@cell@needed{}\def\lst@frame{#1}}
279\define@key{lst}{rulecolor}
280{\ifu\color\colorwarning\else\def\lst@cell@needed{}\def\lst@rulecolor{#1}\fi}
281\lst@iter{\ignore@key}
282   {framexleftmargin,framexrightmargin,framextopmargin,framexbottommargin}
283\lst@iter{\ignore@key}{fillcolor,rulesepcolor}
284\lst@iter{\ignore@key}{framesep,rulesep,framerule}
285\lst@iter{\ignore@key}{frameround,captionpos}
286%%%%%%% Margins and line shape
287\def\lst@doindent#1{}
288\define@key{lst}{indent}{\def\lst@doindent{\hspace{#1}}}
289\define@key{lst}{xleftmargin}{\def\lst@doindent{\hspace{#1}}}
290\lst@iter{\ignore@key}
291  {linewitdh,xrightmargin,resetmargin,prebreak,postbreak,%
292breakindent,breakautoindent}
293%%%%%%% Lines
294%%% Those two I don't care
295\define@key{lst}{numbersep}{}
296\define@key{lst}{numberblanklines}{}
297\newcounter{lstlabel}\newcounter{lstlastline}
298\lst@AddToHook{InitVar}{\let\@currentlabel\thelstlabel}
299\newcommand{\lst@saved@lastline}
300  {\@ifundefined{lst@intname}{}
301    {\@ifundefined{thelst@saved@\lst@intname}
302      {0}
303      {\value{lst@saved@\lst@intname}}}}
304\def\@lst@compute@firstline{%
305\@ifundefined{lst@intname}{\def\lst@firstline{1}}
306   {\@ifundefined{thelst@saved@\lst@intname}{\def\lst@firstline{1}}
307   {\def\lst@firstline{\csname thelst@saved@\lst@intname\endcsname+1}}}}
308\def\@auto{auto}\def\@last{last}
309\lst@AddToHook{Init}
310  {\@ifundefined{lst@firstline}
311    {\@lst@compute@firstline}
312    {\ifx\lst@firstline\@auto\@lst@compute@firstline\fi
313     \ifx\lst@firstline\@last\def\lst@firstline{\thelstlastline+1}\fi}}
314\define@key{lst}{name}{\def\lst@intname{#1}}
315\define@key{lst}{firstlabel}{\def\lst@firstline{#1}}
316\define@key{lst}{firstnumber}{\def\lst@firstline{#1}}
317\define@key{lst}{advancelabel}{\def\lst@firstline{\lst@saved@lastline+#1+1}}
318\lst@AddToHook{Init}{\setcounter{lstlabel}{\lst@firstline-1}}
319\lst@AddToHook{DeInit}
320  {\setcounter{lstlastline}{\value{lstlabel}}%
321   \@ifundefined{lst@intname}{}
322     {\@ifundefined{thelst@saved@\lst@intname}
323       {\newcounter{lst@saved@\lst@intname}%
324       \gdef\csname thelst@saved@\lst@intname\endcsname{\arabic{lst@saved@\lst@intname}}}
325       {}%
326     \setcounter{lst@saved@\lst@intname}{\value{lstlabel}}}}
327\define@key{lst}{labelstyle}{\def\lst@labelstyle##1{{#1{##1}}}}
328\define@key{lst}{numberstyle}{\def\lst@labelstyle##1{{#1{##1}}}}
329\newcommand{\lst@labelstyle}[1]{#1}
330\define@key{lst}{labelstep}{\def\lst@labelstep{#1}}
331\define@key{lst}{stepnumber}{\def\lst@labelstep{#1}}
332\lst@AddToHook{InlineUnsave}{\def\lst@labelstep{1}}
333\lst@AddToHookExe{EmptyStyle}{\def\lst@labelstep{1}}
334\define@key{lst}{labelsep}{\def{\lst@labelsep}{\hspace{#1}}}
335\newcommand{\lst@labelsep}{\hspace{1ex}}
336\newcommand{\lst@pad}[1]{\@pad{\@print{ }}{4}{#1}}
337\newcommand{\lst@linenumber@}[1]
338  {\lst@labelstyle{\lst@pad{#1}}\lst@labelsep}
339\newboolean{lst@numbers}
340\newcommand{\lst@linenumber}
341  {\ifthenelse{\boolean{lst@numbers}}
342     {\ifthenelse{\lst@labelstep=0}
343       {}
344       {\ifthenelse
345         {0=\value{lstlabel}-\(\value{lstlabel}/\lst@labelstep\)*\lst@labelstep}
346         {\lst@linenumber@{\thelstlabel}}
347         {\lst@linenumber@{}}}}
348     {}}
349\lst@AddToHook{InitVarEOL}{\stepcounter{lstlabel}}
350\newsavebox{\@prevlines}
351\newsavebox{\@curline}
352\ifhtml
353\ifu\lst@@br\def\lst@@br{
354}\fi
355\def\lst@@@br{\global\let\lst@br\lst@@br}%To avoid output of first line skip
356\else
357\ifu\lst@@br\let\lst@@br\@br\fi
358\let\lst@@@br\lst@@br
359\fi
360\lst@AddToHook{Init}
361{\def\lst@br{}}
362\newcommand{\lst@forget@lastline}
363{\sbox{\@curline}{}\setcounter{lst@spaces}{0}\addtocounter{lstlabel}{-1}}
364\newcommand{\@NewLine@}
365{\usebox{\@prevlines}\usebox{\@curline}\lst@spaces%
366\sbox{\@prevlines}{}\sbox{\@curline}{}\global\let\@NewLine\lst@spaces}
367\lst@AddToHook{EveryLine}{\setcounter{lst@spaces}{0}%
368\sbox{\@prevlines}{\usebox{\@prevlines}\usebox{\@curline}}%
369\sbox{\@curline}{\lst@br\@rawchars{\lst@doindent}\lst@linenumber}%
370\global\let\@NewLine\@NewLine@}
371\lst@AddToHook{LastLine}{\setcounter{lst@spaces}{0}%
372\sbox{\@prevlines}{\usebox{\@prevlines}\usebox{\@curline}}%
373\iflst@showlines\usebox{\@prevlines}\fi\sbox{\@prevlines}{}\sbox{\@curline}{}%
374\global\let\@NewLine\@NewLine@}
375\lst@AddToHook{Init}{\sbox{\@prevlines}{}\sbox{\@curline}{}\global\let\@NewLine\lst@spaces}
376\def\lst@numbers@none{\setboolean{lst@numbers}{false}}
377\def\lst@numbers@left{\setboolean{lst@numbers}{true}}
378\let\lst@numbers@right\lst@numbers@left
379\def\lst@numbers#1{\csname lst@numbers@#1\endcsname}
380\define@key{lst}{numbers}{\lst@numbers{#1}}
381\lst@AddToHookExe{EmptyStyle}{\lst@numbers{none}}
382%%%%%% TeX escapes
383\define@key{lst}{texcl}[true]{\def\lst@texcl{#1}}
384\setboolean{lst@texcl}{false}
385\lst@AddToHook{Init}
386  {\@ifundefined{lst@texcl}{}
387     {\setboolean{lst@texcl}{\lst@boolean{\lst@texcl}}}}
388\lst@AddToHook{DeInit}{\setboolean{lst@texcl}{false}}
389\define@key{lst}{mathescape}[true]{\def\lst@mathescape{#1}}
390\setboolean{lst@mathescape}{false}
391\lst@AddToHook{Init}
392  {\@ifundefined{lst@mathescape}{}
393     {\setboolean{lst@mathescape}{\lst@boolean{\lst@mathescape}}}}
394\lst@AddToHook{DeInit}{\setboolean{lst@mathescape}{false}}
395\def\lst@BET{}\def\lst@EET{}
396\newcommand{\lst@Esc@key}[2]
397  {\def\lst@BET{\@rawchars{#1}}\def\lst@EET{\@rawchars{#2}}}
398\define@key{lst}{escapeinside}{\@callsubst{\lst@Esc@key}{#1{}}}
399\define@key{lst}{escapechar}[{}]{\lst@Esc@key#1#1}
400\def\lst@escapebegin{}
401\define@key{lst}{escapebegin}[]{\def\lst@escapebegin{#1}}
402\def\lst@escapeend{}
403\define@key{lst}{escapeend}[]{\def\lst@escapeend{#1}}
404%%%%%% Ignore input
405\newcommand{\lst@gobble}{0}
406\define@key{lst}{gobble}{\def\lst@gobble{#1}}
407\define@key{lst}{first}{\def\lst@first{#1}}
408\define@key{lst}{firstline}{\def\lst@first{#1}}
409\define@key{lst}{last}{\def\lst@last{#1}}
410\define@key{lst}{lastline}{\def\lst@last{#1}}
411\define@key{lst}{linerange}{\def\lst@linerange{#1}}
412\lst@AddToHook{PreSet}
413{\newcommand{\lst@first}{1}\newcommand{\lst@last}{99999}%
414\let\lst@linerange\@empty}
415\lst@AddToHook{Init}
416{\ifx\lst@linerange\@empty
417\prim@def\lst@linerange{{\lst@first}-{\lst@last}}\fi}
418% boolean includerangemarker key
419\define@key{lst}{includerangemarker}[true]{\def\lst@includerangemarker{#1}}
420\lst@AddToHook{Init}
421{\@ifundefined{lst@includerangemarker}
422  {\setboolean{lst@includerangemarker}{true}}
423  {\setboolean{lst@includerangemarker}{\lst@boolean{\lst@includerangemarker}}}}
424%prefix/suffix of markers, one prefix/suffix only
425\newtokens{\lst@rangebeginprefix}\newtokens{\lst@rangeendprefix}%
426\newtokens{\lst@rangebeginsuffix}\newtokens{\lst@rangeendsuffix}%
427\addtokens{\lst@rangebeginprefix}{}\addtokens{\lst@rangeendprefix}{}%
428\addtokens{\lst@rangebeginsuffix}{}\addtokens{\lst@rangeendsuffix}{}%
429\define@key{lst}{rangebeginprefix}{\addtokens{\lst@rangebeginprefix}{#1}}
430\define@key{lst}{rangebeginsuffix}{\addtokens{\lst@rangebeginsuffix}{#1}}
431\define@key{lst}{rangeendprefix}{\addtokens{\lst@rangeendprefix}{#1}}
432\define@key{lst}{rangeendsuffix}{\addtokens{\lst@rangeendbeginsuffix}{#1}}
433\define@key{lst}{rangeprefix}
434  {\addtokens{\lst@rangebeginprefix}{#1}\addtokens{\lst@rangeendprefix}{#1}}
435\define@key{lst}{rangesuffix}
436  {\addtokens{\lst@rangebeginsuffix}{#1}\addtokens{\lst@rangeendsuffix}{#1}}
437% boolean print key
438\define@key{lst}{print}[true]{\def\lst@print{#1}}
439\lst@AddToHook{Init}
440  {\@ifundefined{lst@print}{\setboolean{lst@print}{true}}
441     {\setboolean{lst@print}{\lst@boolean{\lst@print}}}}
442% showlines
443\define@key{lst}{showlines}[true]{\def\lst@showlines{#1}}
444\lst@AddToHook{Init}
445{\@ifundefined{lst@showlines}
446  {\setboolean{lst@showlines}{false}}
447  {\setboolean{lst@showlines}{\lst@boolean{\lst@showlines}}}}
448%%%%%%% Strings
449\newcommand{\lst@inactivate}[1]{\let#1\@empty}
450\newcommand{\lst@activate}[1]{#1}
451\lst@Hook{String}
452\lst@AddToHook{Init}{\let\lst@do\lst@activate\lst@UseHook{String}}
453\lst@AddToHook{SetLanguage}
454{\let\lst@do\lst@inactivate\lst@UseHook{String}}
455%\newcommand{\lst@stringizer@key@add}[2][]
456%  {\lst@AddToHook{String}{\lst@def@stringizer{#1}{#2}}}
457%\newcommand{\lst@stringizer@key}[2][]
458%  {\lst@ResetHook{String}\lst@AddToHook{String}{\lst@def@stringizer{#1}{#2}}}
459%\newcommand{\lst@stringizer@key@delete}[2][]{\lst@ResetHook{String}}
460%\lst@define@key@opt{stringizer}{\lst@stringizer@key}{}
461%\lst@define@key@opt{string}{\lst@stringizer@key}{}
462%\lst@define@key@opt{morestring}{\lst@stringizer@key@add}{}
463%\lst@define@key@opt{deletestring}{\lst@stringizer@key@delete}{}
464%%Real keys, that take all three arguments
465\newcommand{\lst@DS@key}[3]
466{\def\csname @is@string@#3\endcsname{}}%
467\newcommand{\lst@SS@key}[3]
468{\let\lst@do\lst@inactivate\lst@UseHook{String}%
469\lst@MS@key{#1}{#2}{#3}}%
470\newcommand{\lst@MS@key}[3]
471{\ifu\csname @recorded@string@#3\endcsname
472\let\csname @recorded@string@#3\endcsname\@empty
473\lst@AddToHook{String}
474{\lst@do{\csname @is@string@#3\endcsname}}\fi
475\def\csname @is@string@#3\endcsname{\lst@def@stringizer{#1}{#2}{#3}}}%
476%%Parse the  [][]{} arguments
477\newcommand{\lst@stringarg@one}[1][b]{\def\lst@arg@one{#1}\lst@stringarg@two}
478\newcommand{\lst@stringarg@two}[1][stringstyle]
479{\def\lst@arg@two{#1}\lst@stringarg@three}
480\newcommand{\lst@stringarg@three}[1]
481{\lst@cmd{\lst@arg@one}{\lst@arg@two}{#1}}
482%%%Real key handlers
483\newcommand{\lst@deletetring@key}{\let\lst@cmd\lst@DS@key\lst@stringarg@one}
484\newcommand{\lst@string@key}{\let\lst@cmd\lst@SS@key\lst@stringarg@one}
485\newcommand{\lst@morestring@key}{\let\lst@cmd\lst@MS@key\lst@stringarg@one}
486\define@key{lst}{deletestring}{\@callsubst{\lst@deletestring@key}{#1}}
487\define@key{lst}{stringizer}{\@callsubst{\lst@string@key}{#1}}
488\define@key{lst}{string}{\@callsubst{\lst@string@key}{#1}}
489\define@key{lst}{morestring}{\@callsubst{\lst@morestring@key}{#1}}
490% stringspaces
491\define@key{lst}{stringspaces}[true]{\def\lst@stringspaces{#1}}
492\define@key{lst}{showstringspaces}[false]{\def\lst@stringspaces{#1}}
493\setboolean{lst@stringspaces}{false}
494\lst@AddToHook{Init}
495  {\@ifundefined{lst@stringspaces}{}
496     {\setboolean{lst@stringspaces}{\lst@boolean{\lst@stringspaces}}}}
497\lst@AddToHook{DeInit}{\setboolean{lst@stringspaces}{false}}
498%%%%%% Comments
499% Line comments
500\newcommand{\lst@LC@key}[3]
501  {\lst@lExtend\lst@DefineComments@LC
502    {\lst@line@comment{#1}{#2}{\@rawchars{#3}}}}
503\define@key{lst}{commentline}{\lst@LC@key{commentstyle}{#1}}
504\lst@AddToHookExe{SetLanguage}{\let\lst@DefineComments@LC\@empty}
505\lst@AddToHook{SelectCharTable}{\lst@DefineComments@LC}
506% Nested comments
507\newcommand{\lst@NC@key}[3]
508  {\lst@lExtend\lst@DefineComments@NC
509     {\lst@nested@comment{#1}{\@rawchars{#2}}{\@rawchars{#3}}}}
510\define@key[2]{lst}{nestedcomment}{\lst@NC@key{commentstyle}{#1}{#2}}
511\lst@AddToHookExe{SetLanguage}{\let\lst@DefineComments@NC\@empty}
512\lst@AddToHook{SelectCharTable}{\lst@DefineComments@NC}
513% Balanced comments
514\newcommand{\lst@SC@key}[3]
515   {\lst@lExtend\lst@DefineComments@SC
516     {\lst@balanced@comment{#1}{\@rawchars{#2}}{\@rawchars{#3}}}}
517\define@key[2]{lst}{singlecomment}{\lst@SC@key{commentstyle}{#1}{#2}}
518\lst@AddToHookExe{SetLanguage}{\let\lst@DefineComments@SC\@empty}
519\lst@AddToHook{SelectCharTable}{\lst@DefineComments@SC}
520% Double comments: more or less single comment twice
521\newcommand{\lst@DC@key}[5]
522   {\lst@lExtend\lst@DefineComments@DC
523      {\lst@balanced@comment{#1}{\@rawchars{#2}}{\@rawchars{#3}}}%
524   \lst@lExtend\lst@DefineComments@DC
525      {\lst@balanced@comment{#1}{\@rawchars{#4}}{\@rawchars{#5}}}}
526\define@key[4]{lst}{doublecomment}{\lst@DC@key{commentstyle}{#1}{#2}{#3}{#4}}
527\lst@AddToHookExe{SetLanguage}{\let\lst@DefineComments@DC\@empty}
528\lst@AddToHook{SelectCharTable}{\lst@DefineComments@DC}
529%%%%%% New interface for comments grr...
530\newcommand{\lst@morecomment@d}[5][commentstyle]
531{\lst@DC@key{#1}{#2}{#3}{#4}{#5}}
532\newcommand{\lst@morecomment@s}[3][commentstyle]{\lst@SC@key{#1}{#2}{#3}}
533\newcommand{\lst@morecomment@is}[3][commentstyle]
534{\hva@warn{Invisible comments not implemented}%
535\lst@SC@key{#1}{#2}{#3}}
536\newcommand{\lst@morecomment@n}[3][commentstyle]{\lst@NC@key{#1}{#2}{#3}}
537%Notice the horible trick to parse morecomment=[l]\\
538\def\lst@LC@parse#1#2#3\@empty{\lst@LC@key{#1}{#2}{#3}}
539\newcommand{\lst@morecomment@l}[1][commentstyle]{\lst@LC@parse{visible}{#1}}
540\newcommand{\lst@morecomment@il}[1][commentstyle]
541{\hva@warn{Invisible comments not implemented}%
542\lst@LC@parse{visible}{#1}}
543%%%
544\def\lst@deletecomment@d{\let\lst@DefineComments@DC\@empty}
545\def\lst@deletecomment@s{\let\lst@DefineComments@SC\@empty}
546\def\lst@deletecomment@n{\let\lst@DefineComments@NC\@empty}
547\def\lst@deletecomment@l{\let\lst@DefineComments@LC\@empty}
548\def\lst@deletecomment@all{%
549\lst@deletecomment@d\lst@deletecomment@s%
550\lst@deletecomment@n\lst@deletecomment@l}
551\def\lst@till@empty#1\@empty{}
552\newcommand{\lst@morecomment@key}[1][]
553  {\ifu\csname lst@morecomment@#1\endcsname
554    \hva@warn{Unknown comment type '#1'}%
555    \let\lst@next\lst@till@empty\else
556    \let\lst@next\csname lst@morecomment@#1\endcsname\fi
557    \lst@next}
558\newcommand{\lst@deletecomment@key}[1][]
559  {\ifu\csname lst@deletecomment@#1\endcsname
560   \hva@warn{Unknown comment type '#1'}\else
561   \csname lst@deletecomment@#1\endcsname\fi
562   \lst@till@empty}
563\newcommand{\lst@comment@key}[1][]
564  {\ifu\csname lst@morecomment@#1\endcsname
565    \hva@warn{Unknown comment type '#1'}%
566    \let\lst@next\lst@till@empty\else
567    \csname lst@deletecomment@all\endcsname
568    \let\lst@next\csname lst@morecomment@#1\endcsname\fi
569    \lst@next}
570\define@key{lst}{deletecomment}{\@callsubst{\lst@deletecomment@key}{#1\@empty}}
571\define@key{lst}{comment}{\@callsubst{\lst@comment@key}{#1\@empty}}
572\define@key{lst}{morecomment}{\@callsubst{\lst@morecomment@key}{#1\@empty}}
573%%%%%%% General delimiters
574%Line delimiters
575\newcommand{\lst@LD@key}[3]{
576\lst@lExtend\lst@Define@LD{\lst@line@delim{#1}{#2}{\@rawchars{#3}}}}
577\lst@AddToHookExe{SetLanguage}{\let\lst@Define@LD\@empty}
578\lst@AddToHook{SelectCharTable}{\lst@Define@LD}
579%Single delimiters
580\newcommand{\lst@SD@key}[4]
581{\lst@lExtend\lst@Define@SD
582{\lst@single@delim{#1}{#2}{\@rawchars{#3}}{\@rawchars{#4}}}}
583\lst@AddToHookExe{SetLanguage}{\let\lst@Define@SD\@empty}
584\lst@AddToHook{SelectCharTable}{\lst@Define@SD}
585%%General interface
586\def\lst@deletedelim@l{\let\lst@Define@LC\@empty}
587\def\lst@deletedelim@s{\let\lst@Define@SD\@empty}
588\def\lst@deletedelim@all{\lst@deletedelim@l\lst@deletedelim@s}
589\newcommand{\lst@deletedelim@key}[1][]
590{\ifu\csname lst@deletedelim@#1\endcsname
591\hva@warn{Unknown delimiter type '#1'}\else
592\csname lst@deletedelim@#1\endcsname\fi
593\lst@till@empty}
594%Trick to parse delim=[l]\\
595\def\lst@LD@parse#1#2#3\@empty{\lst@LD@key{#1}{#2}{#3}}
596\newcommand{\lst@moredelim@l}[1][\@empty]{\lst@LD@parse{visible}{#1}}
597\newcommand{\lst@moredelim@il}[1][\@empty]{\lst@LD@parse{invisible}{#1}}
598\newcommand{\lst@moredelim@s}[3][\@empty]{\lst@SD@key{visible}{#1}{#2}{#3}}
599\newcommand{\lst@moredelim@is}[3][\@empty]{\lst@SD@key{invisible}{#1}{#2}{#3}}
600%Awfull hack to ignore moredelim=*[directive]\# present in lstlang?.sty files
601%In that case the argument of \lst@moredelim@key is empty
602%and \lst@moredelim@ is called to eat all arguments up to the final \@empty
603\newcommand{\lst@moredelim@}{\let\lst@next\lst@till@empty\lst@next}
604\newcommand{\lst@moredelim@key}[1][]
605{\ifu\csname lst@moredelim@#1\endcsname
606\hva@warn{Unknown delimiter type '#1'}%
607\let\lst@next\lst@till@empty\else
608\let\lst@next\csname lst@moredelim@#1\endcsname\fi
609\lst@next}
610\newcommand{\lst@delim@key}[1][]
611{\ifu\csname lst@moredelim@#1\endcsname
612\hva@warn{Unknown delimiter type '#1'}%
613\let\lst@next\lst@till@empty\else
614\csname lst@deletedelim@all\endcsname
615\let\lst@next\csname lst@moredelim@#1\endcsname\fi
616\lst@next}
617\define@key{lst}{deletedelim}{\@callsubst{\lst@deletedelim@key}{#1\@empty}}
618\define@key{lst}{delim}{\@callsubst{\lst@delim@key}{#1\@empty}}
619\define@key{lst}{moredelim}{\@callsubst{\lst@moredelim@key}{#1\@empty}}
620%%%%%%% Extended chars and others
621\def\lst@extendedchars{true}
622\lst@AddToHook{DeInit}{\setboolean{lst@extendedchars}{true}}
623\lst@AddToHookExe{SetLanguage}{\setboolean{lst@extendedchars}{true}}
624\lst@AddToHook{SelectCharTable}
625{\setboolean{lst@extendedchars}{\lst@boolean{\lst@extendedchars}}}
626\define@key{lst}{extendedchars}[true]{\def\lst@extendedchars{#1}}
627\define@key{lst}{showspaces}[true]{\def\lst@showspaces{#1}}
628\setboolean{lst@showspaces}{false}
629\lst@AddToHook{Init}
630  {\@ifundefined{lst@showspaces}{}
631     {\setboolean{lst@showspaces}{\lst@boolean{\lst@showspaces}}}}
632%Tabs...
633\define@key{lst}{showtabs}[true]{\def\lst@showtabs{#1}}
634\setboolean{lst@showtabs}{false}
635\lst@AddToHook{Init}
636  {\@ifundefined{lst@showtabs}{}
637     {\setboolean{lst@showtabs}{\lst@boolean{\lst@showtabs}}}}
638\lst@AddToHook{DeInit}{\setboolean{lst@showtabs}{false}}
639\newcommand{\lst@tabsize}{8}
640\define@key{lst}{tabsize}[8]{\def\lst@tabsize{#1}}
641\define@key{lst}{tab}{\def\lst@tab{#1}}
642\lst@iter{\ignore@key}{inputencoding,formfeed}
643%%%%%%% Alter char categories
644\def\lst@alsoletter{}
645\define@key{lst}{alsoletter}{\def\lst@alsoletter{#1}}
646%%%%%%% Sensitive keywords
647\lst@AddToHookExe{DeInit}{\setboolean{lst@sensitive}{true}}
648\lst@AddToHook{SetLanguage}{\setboolean{lst@sensitive}{true}}
649\define@key{lst}{sensitive}[true]{\setboolean{lst@sensitive}{\lst@boolean{#1}}}
650%%%%%%% Captions
651%\lst@AddToHookExe{InlineUnsave}
652%{\let\lst@caption\@empty%
653%\let\lst@title\@empty\let\lst@label\@empty}
654%listing counter
655\@ifundefined{thechapter}
656{\newcounter{lstlisting}}
657{\newcounter{lstlisting}[chapter]
658\renewcommand\thelstlisting
659{\ifthenelse{\value{chapter} > 0}{\thechapter.}{}\arabic{lstlisting}}}
660\lst@AddToHook{InitVar}{\ifu\lst@caption\else\refstepcounter{lstlisting}\fi}
661%%Keys
662\define@key{lst}{label}{\def\lst@label{#1}}
663\define@key{lst}{title}{\def\lst@title{#1}}
664%\lst@define@key@opt{caption}{\lst@caption@key}{}
665\define@key{lst}{caption}{\@calloptsimple{\lst@caption@key}{#1}}
666\newcommand{\lst@caption@key}[2][]{\def\lst@caption{#2}}
667%%% Output Caption
668\def\listingname{Listing}
669\def\@lst@caption
670{\ifu\lst@caption%
671\ifu\lst@title\else\begin{center}\lst@title\end{center}\fi\else
672\begin{center}\listingname~\thelstlisting: %
673\ifu\lst@label\else\label{\lst@label}\fi\lst@caption\end{center}\\\fi}
674%%%%%%% Output
675% Treating spaces with a counter (and not with boxes) enables
676% optimized style managment
677\newcounter{lst@spaces}
678\def\lst@output@space{\stepcounter{lst@spaces}}
679\lst@AddToHook{Init}{\setcounter{lst@spaces}{0}}
680\newsavebox{\normalize@box}
681\def\lst@normalize#1{%
682  \sbox{\normalize@box}
683  {\iflst@sensitive\@rawchars{#1}\else\@rawchars{\MakeLowercase{#1}}\fi}%
684  \usebox{\normalize@box}}
685\def\lst@output#1#2{%
686\@NewLine%\lstinfo{OUT: '#1' '#2'}%
687{\ifu\csname lstk@\lst@normalize{#1}\endcsname
688  \lst@identifierstyle{#2}\else
689  \csname lstk@\lst@normalize{#1}\endcsname{#2}\fi}}
690\def\lst@output@other#1#2{%
691\@NewLine%\lstinfo{OTHER: '#1' '#2'}%
692\ifu\csname lstk@\lst@normalize{#1}\endcsname
693  #2\else
694  {\csname lstk@\lst@normalize{#1}\endcsname{#2}}\fi}
695\newcounter{lst@save@spaces}
696\def\save@spaces
697  {\setcounter{lst@save@spaces}{\value{lst@spaces}}\setcounter{lst@spaces}{0}}
698\def\restore@spaces
699  {\setcounter{lst@spaces}{\value{lst@save@spaces}}}
700\def\lst@output@directive#1#2{%
701%\lstinfo{DIRECTIVE: '#1' '#2' '\thelst@spaces'}%
702\save@spaces\@NewLine\restore@spaces%
703\ifu\csname lstd@\lst@normalize{#1}\endcsname
704  {\lst@directivestyle{\@print{#}}}%
705  \lst@spaces\lst@output{#1}{#2}\else
706  {\csname lstd@\lst@normalize{#1}\endcsname{\@print{#}\lst@spaces#2}}\fi}
707%%%%%% Pre and post (already obsolete)
708\let\lst@pre\@empty
709\let\lst@post\@empty
710\define@key{lst}{pre}{\def\lst@pre{#1}}
711\define@key{lst}{post}{\def\lst@post{#1}}
712%%% inputencodings (for compatibility only ?)
713\def\lst@inputencoding@key#1{\inputencoding{#1}}
714\define@key{lst}{inputencoding}{\lst@inputencoding@key{#1}}
715%%%%% Column allignement None !
716\lst@iter{\ignore@key}
717  {columns,flexiblecolumns,keepspaces,basewidth,fontadjust,aboveskip,belowskip,lineskip,emptylines}
718%%%%%%% User interface
719\newcommand{\lstinputlisting}[2][]
720  {\@scaninput{\begin{lstlisting}[#1]{}
721}{#2}{\end{lstlisting}}}
722\let\lstdefinelanguage\lst@definelanguage
723\newcommand{\lstloadlanguage}[1]{}
724%%%%%% Driver files are loaded directly!
725\lstset{defaultdialect=[95]Ada,
726        defaultdialect=[68]Algol,
727        defaultdialect=[ANSI]C,
728        defaultdialect=[Objective]Caml,
729        defaultdialect=[1985]Cobol,
730        defaultdialect=[ANSI]C++,
731        defaultdialect=[95]Fortran,
732        defaultdialect=[3.0]Mathematica,
733        defaultdialect=[Standard]Pascal,
734        defaultdialect=[67]Simula,
735        defaultdialect=[plain]TeX}
736\input{lstlang1.hva}
737\input{lstlang2.hva}
738\input{lstlang3.hva}
739%%%%%%%%%%% Inits
740\lst@UseHook{SetStyle}\lst@UseHook{EmptyStyle}
741\lst@UseHook{SetLanguage}\lst@UseHook{EmptyLanguage}
742\newsavebox{\lst@box}
743%%%%%% Alternative style, with explicit <BR> (for copy/paste)
744\newcommand{\lstavoidwhitepre}
745{\let\lst@@br\@br%
746\newstyle{.mouselstlisting}{font-family:monospace;margin-right:auto;margin-left:0pt;text-align:left}%
747\setenvclass{lstlisting}{mouselstlisting}%
748\let\lst@whitepre\@empty%
749\renewcommand{\lst@pad}[1]{\@pad{~}{4}{##1}}}
750